diff --git a/.gitignore b/.gitignore index b18058e0..34617920 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ out/ +tmp/ .DS_Store coverage.out diff --git a/Makefile b/Makefile index 87c51f9f..1cced855 100644 --- a/Makefile +++ b/Makefile @@ -91,6 +91,11 @@ gen-go-bindings: ## Generate go bindings for smart contracts. $(call gen_go_binding,contracts/tokens/ERC20,ERC20,tokens,contracts/tokens) $(call gen_go_binding,contracts/tokens/ERC721,ERC721,tokens,contracts/tokens) $(call gen_go_binding,contracts/loadtester,LoadTester,contracts,contracts) + $(call gen_go_binding,contracts/conformancetester,ConformanceTester,conformancetester,contracts/conformancetester) + +.PHONY: gen-json-rpctypes +gen-json-rpctypes: ## Generate go bindings for smart contracts. + ./scripts/rpctypes.sh rpctypes/jsonschemas/ # Generate go binding. # - $1: input_dir diff --git a/cmd/loadtest/loadtest.go b/cmd/loadtest/loadtest.go index 0ad9a70c..326029df 100644 --- a/cmd/loadtest/loadtest.go +++ b/cmd/loadtest/loadtest.go @@ -23,7 +23,6 @@ import ( "github.com/maticnetwork/polygon-cli/rpctypes" "github.com/maticnetwork/polygon-cli/util" - "github.com/cenkalti/backoff/v4" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" @@ -110,7 +109,9 @@ func modeRequiresLoadTestContract(m loadTestMode) bool { m == loadTestModeFunction || m == loadTestModeInc || m == loadTestModeRandom || - m == loadTestModeStore { + m == loadTestModeStore || + m == loadTestModePrecompiledContract || + m == loadTestModePrecompiledContracts { return true } return false @@ -773,9 +774,7 @@ func getERC721Contract(ctx context.Context, c *ethclient.Client, tops *bind.Tran } func blockUntilSuccessful(ctx context.Context, c *ethclient.Client, retryable func() error) error { - // this function use to be very complicated (and not work). I'm dumbing this down to a basic time based retryable which should work 99% of the time - b := backoff.WithContext(backoff.WithMaxRetries(backoff.NewConstantBackOff(5*time.Second), 24), ctx) - return backoff.Retry(retryable, b) + return contracts.BlockUntilSuccessful(ctx, c, retryable) } func loadTestTransaction(ctx context.Context, c *ethclient.Client, nonce uint64) (t1 time.Time, t2 time.Time, err error) { diff --git a/cmd/loadtest/uniswapv3/deploy.go b/cmd/loadtest/uniswapv3/deploy.go index 5c950cf1..77185ab0 100644 --- a/cmd/loadtest/uniswapv3/deploy.go +++ b/cmd/loadtest/uniswapv3/deploy.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts" "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) @@ -70,7 +71,7 @@ type ( // Deploy the full UniswapV3 contract suite in 15 different steps. // Source: https://github.com/Uniswap/deploy-v3 -func DeployUniswapV3(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, knownAddresses UniswapV3Addresses, ownerAddress common.Address, blockblockUntilSuccessful blockUntilSuccessfulFn) (config UniswapV3Config, err error) { +func DeployUniswapV3(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, knownAddresses UniswapV3Addresses, ownerAddress common.Address, blockblockUntilSuccessful contracts.BlockUntilSuccessfulFn) (config UniswapV3Config, err error) { log.Debug().Msg("Step 0: WETH9 deployment") config.WETH9.Address, config.WETH9.Contract, err = deployOrInstantiateContract( ctx, c, tops, cops, @@ -343,7 +344,7 @@ func deployOrInstantiateContract[T Contract]( deploy func(*bind.TransactOpts, bind.ContractBackend) (common.Address, *types.Transaction, *T, error), instantiate func(common.Address, bind.ContractBackend) (*T, error), call func(*T) error, - blockUntilSuccessful blockUntilSuccessfulFn, + blockUntilSuccessful contracts.BlockUntilSuccessfulFn, ) (address common.Address, contract *T, err error) { if knownAddress == (common.Address{}) { // Deploy the contract if known address is empty. diff --git a/cmd/loadtest/uniswapv3/pool.go b/cmd/loadtest/uniswapv3/pool.go index e34fcc8c..d77c756c 100644 --- a/cmd/loadtest/uniswapv3/pool.go +++ b/cmd/loadtest/uniswapv3/pool.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts" "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) @@ -89,7 +90,7 @@ type slot struct { // SetupLiquidityPool sets up a UniswapV3 liquidity pool, creating and initializing it if needed, // and providing liquidity in case none exists. -func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, recipient common.Address, blockUntilSuccessful blockUntilSuccessfulFn) error { +func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, recipient common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { // Create and initialise pool. poolContract, err := createPool(ctx, c, tops, cops, uniswapV3Config, poolConfig, blockUntilSuccessful) if err != nil { @@ -118,7 +119,7 @@ func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.Tra } // createPool creates and initialises the UniswapV3 liquidity pool if needed. -func createPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, blockUntilSuccessful blockUntilSuccessfulFn) (*uniswapv3.IUniswapV3Pool, error) { +func createPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) (*uniswapv3.IUniswapV3Pool, error) { // Create and initialize the pool. sqrtPriceX96 := computeSqrtPriceX96(poolConfig.ReserveA, poolConfig.ReserveB) if _, err := uniswapV3Config.NonfungiblePositionManager.Contract.CreateAndInitializePoolIfNecessary(tops, poolConfig.Token0.Address, poolConfig.Token1.Address, poolConfig.Fees, sqrtPriceX96); err != nil { @@ -185,7 +186,7 @@ func getPoolState(cops *bind.CallOpts, contract *uniswapv3.IUniswapV3Pool) (slot } // provideLiquidity provides liquidity to the UniswapV3 pool. -func provideLiquidity(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, poolContract *uniswapv3.IUniswapV3Pool, poolConfig PoolConfig, recipient common.Address, nftPositionManagerContract *uniswapv3.NonfungiblePositionManager, blockUntilSuccessful blockUntilSuccessfulFn) error { +func provideLiquidity(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, poolContract *uniswapv3.IUniswapV3Pool, poolConfig PoolConfig, recipient common.Address, nftPositionManagerContract *uniswapv3.NonfungiblePositionManager, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { // Compute the tick lower and upper for providing liquidity. // The default tick spacing is set to 60 for the 0.3% fee tier and unfortunately, `MIN_TICK` and // `MAX_TICK` are not divisible by this amount. The solution is to use a multiple of 60 instead. diff --git a/cmd/loadtest/uniswapv3/swapper.go b/cmd/loadtest/uniswapv3/swapper.go index 0200073c..c5d9e8ed 100644 --- a/cmd/loadtest/uniswapv3/swapper.go +++ b/cmd/loadtest/uniswapv3/swapper.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts" "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) @@ -24,7 +25,7 @@ var ( ) // Deploy an ERC20 token. -func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, tokenName, tokenSymbol string, amount *big.Int, recipient common.Address, tokenKnownAddress common.Address, blockUntilSuccessful blockUntilSuccessfulFn) (tokenConfig ContractConfig[uniswapv3.Swapper], err error) { +func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, tokenName, tokenSymbol string, amount *big.Int, recipient common.Address, tokenKnownAddress common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) (tokenConfig ContractConfig[uniswapv3.Swapper], err error) { tokenConfig.Address, tokenConfig.Contract, err = deployOrInstantiateContract( ctx, c, tops, cops, tokenKnownAddress, @@ -58,7 +59,7 @@ func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOp } // Approve some UniswapV3 addresses to spend tokens on behalf of the token owner. -func setUniswapV3Allowances(ctx context.Context, c *ethclient.Client, contract *uniswapv3.Swapper, tops *bind.TransactOpts, cops *bind.CallOpts, tokenName string, addresses map[string]common.Address, owner common.Address, blockUntilSuccessful blockUntilSuccessfulFn) error { +func setUniswapV3Allowances(ctx context.Context, c *ethclient.Client, contract *uniswapv3.Swapper, tops *bind.TransactOpts, cops *bind.CallOpts, tokenName string, addresses map[string]common.Address, owner common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { // Get the ERC20 contract name. erc20Name, err := contract.Name(cops) if err != nil { diff --git a/cmd/rpcfuzz/cmd.go b/cmd/rpcfuzz/cmd.go index 38e3a12c..99ee3f57 100644 --- a/cmd/rpcfuzz/cmd.go +++ b/cmd/rpcfuzz/cmd.go @@ -51,7 +51,7 @@ func init() { rpcUrl = flagSet.StringP("rpc-url", "r", "http://localhost:8545", "The RPC endpoint url") testPrivateHexKey = flagSet.String("private-key", codeQualityPrivateKey, "The hex encoded private key that we'll use to sending transactions") - testContractAddress = flagSet.String("contract-address", "0x6fda56c57b0acadb96ed5624ac500c0429d59429", "The address of a contract that can be used for testing") + testContractAddress = flagSet.String("contract-address", "", "The address of a contract that can be used for testing. If not specified, a contract will be deployed automatically.") testNamespaces = flagSet.String("namespaces", fmt.Sprintf("eth,web3,net,debug,%s", rpcTestRawHTTPNamespace), "Comma separated list of rpc namespaces to test") testFuzz = flagSet.Bool("fuzz", false, "Flag to indicate whether to fuzz input or not.") testFuzzNum = flagSet.Int("fuzzn", 100, "Number of times to run the fuzzer per test.") diff --git a/cmd/rpcfuzz/rpcfuzz.go b/cmd/rpcfuzz/rpcfuzz.go index 142f205d..d622a409 100644 --- a/cmd/rpcfuzz/rpcfuzz.go +++ b/cmd/rpcfuzz/rpcfuzz.go @@ -29,6 +29,7 @@ import ( "sync" "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -36,6 +37,8 @@ import ( "github.com/ethereum/go-ethereum/rpc" fuzz "github.com/google/gofuzz" "github.com/maticnetwork/polygon-cli/cmd/rpcfuzz/testreporter" + "github.com/maticnetwork/polygon-cli/contracts" + "github.com/maticnetwork/polygon-cli/contracts/conformancetester" "github.com/maticnetwork/polygon-cli/rpctypes" "github.com/rs/zerolog/log" "github.com/xeipuuv/gojsonschema" @@ -157,11 +160,15 @@ const ( // JSON-RPC error codes. // https://eips.ethereum.org/EIPS/eip-1474 + invalidInputErr = -32000 parseErr = -32700 invalidRequestErr = -32600 methodNotFoundErr = -32601 invalidParamsErr = -32602 internalErr = -32603 + + // contracts/conformancetester/ConformanceTester.sol + revertErrorMessage = "Test Revert Error Message" ) var ( @@ -184,6 +191,24 @@ var ( testResultMutex sync.Mutex ) +func getConformanceContract(ctx context.Context, rpc *rpc.Client, chainID *big.Int) (conformanceContractAddrStr string, conformanceContract *conformancetester.ConformanceTester, err error) { + log.Trace().Msg("Deploying Conformance contract...") + var conformanceContractAddr ethcommon.Address + ec := ethclient.NewClient(rpc) + tops, err := bind.NewKeyedTransactorWithChainID(testPrivateKey, chainID) + if err != nil { + log.Error().Err(err).Msg("Error creating transaction") + return + } + + cops := new(bind.CallOpts) + conformanceContractAddr, conformanceContract, err = contracts.DeployConformanceContract(ctx, ec, tops, cops) + conformanceContractAddrStr = conformanceContractAddr.String() + log.Trace().Msg("Finished Deploying Conformance contract...") + + return +} + func runRpcFuzz(ctx context.Context) error { if *testOutputExportPath != "" && !*testExportJson && !*testExportCSV && !*testExportMarkdown && !*testExportHTML { log.Warn().Msg("Setting --export-path must pair with a export type: --json, --csv, --md, or --html") @@ -193,18 +218,29 @@ func runRpcFuzz(ctx context.Context) error { if err != nil { return err } - nonce, err := GetTestAccountNonce(ctx, rpcClient) + chainId, err := GetCurrentChainID(ctx, rpcClient) if err != nil { return err } - chainId, err := GetCurrentChainID(ctx, rpcClient) + currentChainID = chainId + + if *testContractAddress == "" { + conformanceContractAddr, _, deploymentErr := getConformanceContract(ctx, rpcClient, currentChainID) + if deploymentErr != nil { + log.Error().Err(deploymentErr).Msg("Load test contract deployment error") + return deploymentErr + } + testContractAddress = &conformanceContractAddr + } + log.Info().Str("testContractAddress", *testContractAddress).Msg("Conformance test contract address") + + nonce, err := GetTestAccountNonce(ctx, rpcClient) if err != nil { return err } testAccountNonce = nonce - currentChainID = chainId - log.Trace().Uint64("nonce", nonce).Uint64("chainid", chainId.Uint64()).Msg("Doing test setup") + log.Trace().Uint64("nonce", nonce).Uint64("chainId", chainId.Uint64()).Msg("Doing test setup") setupTests(ctx, rpcClient) httpClient := &http.Client{} @@ -424,31 +460,32 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateRegexString(`^0x0$`), }) - // cast storage --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 3 + // cast storage --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 0 --block latest allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtLatest", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "latest"}, + Args: []interface{}{*testContractAddress, "0x0", "latest"}, Flags: FlagStrictValidation, - Validator: ValidateRegexString(`^0x536f6c6964697479206279204578616d706c6500000000000000000000000026$`), + Validator: ValidateRegexString(`^0x436f6e666f726d616e6365546573746572436f6e74726163744e616d6500003a$`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtEarliest", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "earliest"}, + Args: []interface{}{*testContractAddress, "0x0", "earliest"}, Validator: ValidateRegexString(`^0x0{64}`), }) + // cast storage --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 0 --block pending allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtPending", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "pending"}, + Args: []interface{}{*testContractAddress, "0x0", "pending"}, Flags: FlagStrictValidation, - Validator: ValidateRegexString(`^0x536f6c6964697479206279204578616d706c6500000000000000000000000026$`), + Validator: ValidateRegexString(`^0x436f6e666f726d616e6365546573746572436f6e74726163744e616d6500003a$`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtZero", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "0x0"}, + Args: []interface{}{*testContractAddress, "0x0", "0x0"}, Flags: FlagStrictValidation, Validator: ValidateRegexString(`^0x0{64}`), }) @@ -561,20 +598,20 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateRegexString(`^0x([1-9a-f]+[0-9a-f]*|0)$`), }) - // cast code --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_getCode","params":["0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","latest"],"id":48,"jsonrpc":"2.0"}' | jq -r ".result | tojson" | tr -d '\n' | sha1sum allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetCodeLatest", Method: "eth_getCode", Args: []interface{}{*testContractAddress, "latest"}, Flags: FlagStrictValidation, - Validator: ValidateHashedResponse("53fd13ceac858ba82dff299cb4ad45db720a6fc9"), + Validator: ValidateHashedResponse("b9689c32bf9284029715ff8375f8996129898db9"), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetCodePending", Method: "eth_getCode", Args: []interface{}{*testContractAddress, "pending"}, Flags: FlagStrictValidation, - Validator: ValidateHashedResponse("53fd13ceac858ba82dff299cb4ad45db720a6fc9"), + Validator: ValidateHashedResponse("b9689c32bf9284029715ff8375f8996129898db9"), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetCodeEarliest", @@ -596,11 +633,14 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Name: "RPCTestEthSignFail", Method: "eth_sign", Args: []interface{}{testEthAddress.String(), "0xdeadbeef"}, - Validator: ValidateError(invalidRequestErr, `unknown account`), + Validator: ValidateError(invalidInputErr, `unknown account`), Flags: FlagErrorValidation | FlagStrictValidation | FlagRequiresUnlock, }) // cast rpc --rpc-url localhost:8545 eth_signTransaction '{"from": "0xb9b1cf51a65b50f74ed8bcb258413c02cba2ec57", "to": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", "data": "0x", "gas": "0x5208", "gasPrice": "0x1", "nonce": "0x1"}' + // Weirdly, the response eth_signTransaction from geth doesn't "conform" to the spec of: https://ethereum.github.io/execution-apis/api-documentation/ + // This is the actual response with cast and curl of the above input: + // {"raw":"0xf8...85","tx":{"type":"0x0","chainId":"0x539","nonce":"0x1","to":"0x85da99c8a7c2c95964c8efd687e95e632fc533d6","gas":"0x5208","gasPrice":"0x1","maxPriorityFeePerGas":null,"maxFeePerGas":null,"value":"0x0","input":"0x","v":"0xa95","r":"0x82..fe","s":"0x78..85","hash":"0xa9b..5a"}} allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthSignTransaction", Method: "eth_signTransaction", @@ -648,7 +688,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Name: "RPCTestEthSendRawTransactionNonceTooLow", Method: "eth_sendRawTransaction", Args: ArgsSignTransactionWithNonce(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}, 0), - Validator: ValidateError(invalidRequestErr, `nonce too low`), + Validator: ValidateError(invalidInputErr, `nonce too low`), Flags: FlagErrorValidation | FlagStrictValidation, }) allTests = append(allTests, &RPCTestDynamicArgs{ @@ -662,31 +702,30 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Name: "RPCTestEthSendRawTransactionNonceKnown", Method: "eth_sendRawTransaction", Args: ArgsSignTransactionWithNonce(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}, testAccountNonce|defaultNonceTestOffset), - Validator: ValidateError(invalidRequestErr, `already known`), + Validator: ValidateError(invalidInputErr, `already known`), Flags: FlagErrorValidation | FlagStrictValidation | FlagOrderDependent, }) allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthSendRawTransactionNonceUnderpriced", Method: "eth_sendRawTransaction", Args: ArgsSignTransactionWithNonce(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x1234", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}, testAccountNonce|defaultNonceTestOffset), - Validator: ValidateError(invalidRequestErr, `replacement`), + Validator: ValidateError(invalidInputErr, `replacement`), Flags: FlagErrorValidation | FlagStrictValidation | FlagOrderDependent, }) - // cat contracts/ERC20.abi| go run main.go abi - // cast call --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 'function name() view returns(string)' + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_call","params":[{"to":"0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","data":"0x06fdde03"},"latest"],"id":1,"jsonrpc":"2.0"}' allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthCallLatest", Method: "eth_call", Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "latest"}, - Validator: ValidateRegexString(`536f6c6964697479206279204578616d706c65`), + Validator: ValidateRegexString(`0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d436f6e666f726d616e6365546573746572436f6e74726163744e616d65000000`), Flags: FlagStrictValidation, }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthCallPending", Method: "eth_call", Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "pending"}, - Validator: ValidateRegexString(`536f6c6964697479206279204578616d706c65`), + Validator: ValidateRegexString(`0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d436f6e666f726d616e6365546573746572436f6e74726163744e616d65000000`), Flags: FlagStrictValidation, }) allTests = append(allTests, &RPCTestGeneric{ @@ -703,19 +742,22 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateRegexString(`^0x$`), Flags: FlagStrictValidation, }) + allTests = append(allTests, &RPCTestGeneric{ + Name: "RPCTestEthCallRevertMessage", + Method: "eth_call", + Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Data: "0xa26388bb"}, "latest"}, + Validator: ValidateErrorMsgString(revertErrorMessage), + Flags: FlagErrorValidation, + }) - // cat contracts/ERC20.abi| go run main.go abi - // cast estimate --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 'function mint(uint256 amount) returns()' 10000 - // cast abi-encode 'function mint(uint256 amount) returns()' 10000 + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_estimateGas","params":[{"to":"0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","data":"0x06fdde03"},"latest"],"id":1,"jsonrpc":"2.0"}' + // This just validates that the estimated gas response conforms to an expected hex allTests = append(allTests, &RPCTestGeneric{ - Name: "RPCTestEthEstimateGas", - Method: "eth_estimateGas", - Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710"}, "latest"}, - Validator: RequireAny( - ValidateRegexString(`^0x10b0d$`), // first run - ValidateRegexString(`^0xc841$`), // subsequent run - ), - Flags: FlagStrictValidation, + Name: "RPCTestEthEstimateGas", + Method: "eth_estimateGas", + Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "latest"}, + Validator: ValidateRegexString(`^0x`), + Flags: FlagStrictValidation, }) // $ curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_estimateGas", "params": [], "id":1}' localhost:8545 @@ -770,12 +812,11 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { ), }) - // cast send --from 0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6 --rpc-url localhost:8545 --private-key 0x42b6e34dc21598a807dc19d7784c71b2a7a01f6480dc6f58258f78e539f1a1fa 0x6fda56c57b0acadb96ed5624ac500c0429d59429 'function mint(uint256 amount) returns()' 10000 // cast rpc --rpc-url localhost:8545 eth_getTransactionByHash 0xb27bd60d706c08a80d698b951b9ec4284b342a34b885ff5ebe567b41dab16f69 allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthGetTransactionByHash", Method: "eth_getTransactionByHash", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: RequireAll( ValidateJSONSchema(rpctypes.RPCSchemaEthTransaction), ValidateTransactionHash(), @@ -786,7 +827,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthGetTransactionByBlockHashAndIndex", Method: "eth_getTransactionByBlockHashAndIndex", - Args: ArgsTransactionBlockHashAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionBlockHashAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: RequireAll( ValidateJSONSchema(rpctypes.RPCSchemaEthTransaction), ValidateTransactionHash(), @@ -797,7 +838,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthGetTransactionByBlockNumberAndIndex", Method: "eth_getTransactionByBlockNumberAndIndex", - Args: ArgsTransactionBlockNumberAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionBlockNumberAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: RequireAll( ValidateJSONSchema(rpctypes.RPCSchemaEthTransaction), ValidateTransactionHash(), @@ -808,7 +849,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestGetTransactionReceipt", Method: "eth_getTransactionReceipt", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthReceipt), }) @@ -956,7 +997,10 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Address: *testContractAddress, Topics: []interface{}{nil, nil, "0x000000000000000000000000" + testEthAddress.String()[2:]}, }), - Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + Validator: RequireAny( + ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + ValidateExactJSON("[]"), + ), }) // cast rpc --rpc-url localhost:8545 eth_getLogs '{"fromBlock": "earliest", "toBlock": "latest", "address": "0x6fda56c57b0acadb96ed5624ac500c0429d59429", "topics": [null, null, "0x00000000000000000000000085da99c8a7c2c95964c8efd687e95e632fc533d6"]}' allTests = append(allTests, &RPCTestGeneric{ @@ -968,7 +1012,10 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Address: *testContractAddress, Topics: []interface{}{nil, nil, "0x000000000000000000000000" + testEthAddress.String()[2:]}, }}, - Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + Validator: RequireAny( + ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + ValidateExactJSON("[]"), + ), }) // cast rpc --rpc-url localhost:8545 eth_getWork @@ -1031,9 +1078,8 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthProof), }) - // cat contracts/ERC20.abi| go run main.go abi - // cast abi-encode 'function mint(uint256 amount) returns()' 1000000000000000000000000 - // cast rpc --rpc-url localhost:8545 debug_traceCall '{"to": "0x6fda56c57b0acadb96ed5624ac500c0429d59429", "data":"0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000"}' latest | jq '.' + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_call","params":[{"to":"0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","data":"0x06fdde03"},"latest"],"id":1,"jsonrpc":"2.0"}' + // cast rpc --rpc-url localhost:8545 debug_traceCall '{"to": "0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429", "data":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d436f6e666f726d616e6365546573746572436f6e74726163744e616d65000000"}' latest | jq '.' allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugTraceCallSimple", Method: "debug_traceCall", @@ -1041,9 +1087,9 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) allTests = append(allTests, &RPCTestGeneric{ - Name: "RPCTestDebugTraceCallMint", + Name: "RPCTestDebugTraceCallName", Method: "debug_traceCall", - Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000"}, "latest"}, + Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "latest"}, Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) allTests = append(allTests, &RPCTestDynamicArgs{ @@ -1052,10 +1098,12 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) + // cast calldata "deposit(uint256)" 1 + // 0xb6b55f250000000000000000000000000000000000000000000000000000000000000001 allTests = append(allTests, &RPCTestDynamicArgs{ - Name: "RPCTestDebugTraceTransactionMint", + Name: "RPCTestDebugTraceTransactionDeposit", Method: "debug_traceTransaction", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xb6b55f250000000000000000000000000000000000000000000000000000000000000001", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) @@ -1071,7 +1119,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_getRawBlock", Args: []interface{}{"pending"}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `not found`), + Validator: ValidateError(invalidInputErr, `not found`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugGetRawBlockEarliest", @@ -1106,7 +1154,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_getRawHeader", Args: []interface{}{"pending"}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `not found`), + Validator: ValidateError(invalidInputErr, `not found`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugGetRawHeaderEarliest", @@ -1151,13 +1199,15 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestDebugGetRawTransactionSimple", Method: "debug_getRawTransaction", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: ValidateRegexString(`^0x[0-9a-f]*`), }) + // cast calldata "deposit(uint256)" 1 + // 0xb6b55f250000000000000000000000000000000000000000000000000000000000000001 allTests = append(allTests, &RPCTestDynamicArgs{ - Name: "RPCTestDebugGetRawTransactionMint", + Name: "RPCTestDebugGetRawTransactionDeposit", Method: "debug_getRawTransaction", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xb6b55f250000000000000000000000000000000000000000000000000000000000000001", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), Validator: ValidateRegexString(`^0x[0-9a-f]*`), }) @@ -1168,7 +1218,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_traceBlockByNumber", Args: []interface{}{"0x0", nil}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `genesis is not traceable`), + Validator: ValidateError(invalidInputErr, `genesis is not traceable`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugTraceBlockByNumberOne", @@ -1187,7 +1237,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_traceBlockByNumber", Args: []interface{}{"earliest", nil}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `genesis is not traceable`), + Validator: ValidateError(invalidInputErr, `genesis is not traceable`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugTraceBlockByNumberPending", @@ -1216,7 +1266,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_traceBlock", Args: ArgsRawBlock(ctx, rpcClient, "0x0", nil), Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `genesis is not traceable`), + Validator: ValidateError(invalidInputErr, `genesis is not traceable`), }) // $ curl -X POST -H "Content-Type: application/json" --data '[]' http://localhost:8545 @@ -1354,7 +1404,23 @@ func ValidateRegexString(regEx string) func(result interface{}) error { } } -// ValidateError will check the error message text against the provide regular expression +// ValidateErrorMsgString will check the error message text against the provide regular expression +func ValidateErrorMsgString(errorMessageRegex string) func(result interface{}) error { + r := regexp.MustCompile(errorMessageRegex) + return func(result interface{}) error { + fullError, err := genericResultToError(result) + if err != nil { + return err + } + if !r.MatchString(fullError.Error()) { + return fmt.Errorf("the regex %s failed to match result %s", errorMessageRegex, fullError.Error()) + } + + return nil + } +} + +// ValidateError will check the status code and error message text against the provide regular expression func ValidateError(code int, errorMessageRegex string) func(result interface{}) error { r := regexp.MustCompile(errorMessageRegex) return func(result interface{}) error { @@ -1672,7 +1738,7 @@ func ArgsTransactionHash(ctx context.Context, rpcClient *rpc.Client, tx *RPCTest return func() []interface{} { resultHash, _, err := prepareAndSendTransaction(ctx, rpcClient, tx) if err != nil { - log.Fatal().Err(err).Msg("Unable to execute transaction") + log.Error().Err(err).Msg("Unable to execute transaction") } log.Info().Str("resultHash", resultHash).Msg("Successfully executed transaction") @@ -1686,7 +1752,7 @@ func ArgsTransactionBlockHashAndIndex(ctx context.Context, rpcClient *rpc.Client return func() []interface{} { resultHash, receipt, err := prepareAndSendTransaction(ctx, rpcClient, tx) if err != nil { - log.Fatal().Err(err).Msg("Unable to execute transaction") + log.Error().Err(err).Msg("Unable to execute transaction") } log.Info().Str("resultHash", resultHash).Msg("Successfully executed transaction") @@ -1700,7 +1766,7 @@ func ArgsTransactionBlockNumberAndIndex(ctx context.Context, rpcClient *rpc.Clie return func() []interface{} { resultHash, receipt, err := prepareAndSendTransaction(ctx, rpcClient, tx) if err != nil { - log.Fatal().Err(err).Msg("Unable to execute transaction") + log.Error().Err(err).Msg("Unable to execute transaction") } log.Info().Str("resultHash", resultHash).Msg("Successfully executed transaction") diff --git a/contracts/conformancetester/ConformanceTester.abi b/contracts/conformancetester/ConformanceTester.abi new file mode 100644 index 00000000..18173589 --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"RevertErrorMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testRevert","outputs":[],"stateMutability":"pure","type":"function"}] \ No newline at end of file diff --git a/contracts/conformancetester/ConformanceTester.bin b/contracts/conformancetester/ConformanceTester.bin new file mode 100644 index 00000000..5e5d6e91 --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162000ad638038062000ad68339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b61056080620005766000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e314610098578063a26388bb146100c8578063b6b55f25146100d2575b600080fd5b6100646100ee565b6040516100719190610328565b60405180910390f35b61008261017c565b60405161008f9190610328565b60405180910390f35b6100b260048036038101906100ad91906103ad565b6101b5565b6040516100bf91906103f3565b60405180910390f35b6100d06101cd565b005b6100ec60048036038101906100e7919061043a565b61023f565b005b600080546100fb90610496565b80601f016020809104026020016040519081016040528092919081815260200182805461012790610496565b80156101745780601f1061014957610100808354040283529160200191610174565b820191906000526020600020905b81548152906001019060200180831161015757829003601f168201915b505050505081565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d6573736167650000000000000081525081565b60016020528060005260406000206000915090505481565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d657373616765000000000000008152506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102369190610328565b60405180910390fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461028e91906104f6565b9250508190555050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102d25780820151818401526020810190506102b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006102fa82610298565b61030481856102a3565b93506103148185602086016102b4565b61031d816102de565b840191505092915050565b6000602082019050818103600083015261034281846102ef565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061037a8261034f565b9050919050565b61038a8161036f565b811461039557600080fd5b50565b6000813590506103a781610381565b92915050565b6000602082840312156103c3576103c261034a565b5b60006103d184828501610398565b91505092915050565b6000819050919050565b6103ed816103da565b82525050565b600060208201905061040860008301846103e4565b92915050565b610417816103da565b811461042257600080fd5b50565b6000813590506104348161040e565b92915050565b6000602082840312156104505761044f61034a565b5b600061045e84828501610425565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806104ae57607f821691505b6020821081036104c1576104c0610467565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610501826103da565b915061050c836103da565b9250828201905080821115610524576105236104c7565b5b9291505056fea264697066735822122097c56af386cdc27f1819acc9acc5fd56d14a42aeb926a842f69be51b4dc250ad64736f6c63430008150033 \ No newline at end of file diff --git a/contracts/conformancetester/ConformanceTester.go b/contracts/conformancetester/ConformanceTester.go new file mode 100644 index 00000000..4668a15a --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.go @@ -0,0 +1,346 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package conformancetester + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ConformanceTesterMetaData contains all meta data concerning the ConformanceTester contract. +var ConformanceTesterMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"RevertErrorMessage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRevert\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162000ad638038062000ad68339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b61056080620005766000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e314610098578063a26388bb146100c8578063b6b55f25146100d2575b600080fd5b6100646100ee565b6040516100719190610328565b60405180910390f35b61008261017c565b60405161008f9190610328565b60405180910390f35b6100b260048036038101906100ad91906103ad565b6101b5565b6040516100bf91906103f3565b60405180910390f35b6100d06101cd565b005b6100ec60048036038101906100e7919061043a565b61023f565b005b600080546100fb90610496565b80601f016020809104026020016040519081016040528092919081815260200182805461012790610496565b80156101745780601f1061014957610100808354040283529160200191610174565b820191906000526020600020905b81548152906001019060200180831161015757829003601f168201915b505050505081565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d6573736167650000000000000081525081565b60016020528060005260406000206000915090505481565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d657373616765000000000000008152506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102369190610328565b60405180910390fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461028e91906104f6565b9250508190555050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102d25780820151818401526020810190506102b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006102fa82610298565b61030481856102a3565b93506103148185602086016102b4565b61031d816102de565b840191505092915050565b6000602082019050818103600083015261034281846102ef565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061037a8261034f565b9050919050565b61038a8161036f565b811461039557600080fd5b50565b6000813590506103a781610381565b92915050565b6000602082840312156103c3576103c261034a565b5b60006103d184828501610398565b91505092915050565b6000819050919050565b6103ed816103da565b82525050565b600060208201905061040860008301846103e4565b92915050565b610417816103da565b811461042257600080fd5b50565b6000813590506104348161040e565b92915050565b6000602082840312156104505761044f61034a565b5b600061045e84828501610425565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806104ae57607f821691505b6020821081036104c1576104c0610467565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610501826103da565b915061050c836103da565b9250828201905080821115610524576105236104c7565b5b9291505056fea264697066735822122097c56af386cdc27f1819acc9acc5fd56d14a42aeb926a842f69be51b4dc250ad64736f6c63430008150033", +} + +// ConformanceTesterABI is the input ABI used to generate the binding from. +// Deprecated: Use ConformanceTesterMetaData.ABI instead. +var ConformanceTesterABI = ConformanceTesterMetaData.ABI + +// ConformanceTesterBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ConformanceTesterMetaData.Bin instead. +var ConformanceTesterBin = ConformanceTesterMetaData.Bin + +// DeployConformanceTester deploys a new Ethereum contract, binding an instance of ConformanceTester to it. +func DeployConformanceTester(auth *bind.TransactOpts, backend bind.ContractBackend, _name string) (common.Address, *types.Transaction, *ConformanceTester, error) { + parsed, err := ConformanceTesterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ConformanceTesterBin), backend, _name) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ConformanceTester{ConformanceTesterCaller: ConformanceTesterCaller{contract: contract}, ConformanceTesterTransactor: ConformanceTesterTransactor{contract: contract}, ConformanceTesterFilterer: ConformanceTesterFilterer{contract: contract}}, nil +} + +// ConformanceTester is an auto generated Go binding around an Ethereum contract. +type ConformanceTester struct { + ConformanceTesterCaller // Read-only binding to the contract + ConformanceTesterTransactor // Write-only binding to the contract + ConformanceTesterFilterer // Log filterer for contract events +} + +// ConformanceTesterCaller is an auto generated read-only Go binding around an Ethereum contract. +type ConformanceTesterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConformanceTesterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ConformanceTesterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConformanceTesterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ConformanceTesterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConformanceTesterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ConformanceTesterSession struct { + Contract *ConformanceTester // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ConformanceTesterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ConformanceTesterCallerSession struct { + Contract *ConformanceTesterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ConformanceTesterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ConformanceTesterTransactorSession struct { + Contract *ConformanceTesterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ConformanceTesterRaw is an auto generated low-level Go binding around an Ethereum contract. +type ConformanceTesterRaw struct { + Contract *ConformanceTester // Generic contract binding to access the raw methods on +} + +// ConformanceTesterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ConformanceTesterCallerRaw struct { + Contract *ConformanceTesterCaller // Generic read-only contract binding to access the raw methods on +} + +// ConformanceTesterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ConformanceTesterTransactorRaw struct { + Contract *ConformanceTesterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewConformanceTester creates a new instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTester(address common.Address, backend bind.ContractBackend) (*ConformanceTester, error) { + contract, err := bindConformanceTester(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ConformanceTester{ConformanceTesterCaller: ConformanceTesterCaller{contract: contract}, ConformanceTesterTransactor: ConformanceTesterTransactor{contract: contract}, ConformanceTesterFilterer: ConformanceTesterFilterer{contract: contract}}, nil +} + +// NewConformanceTesterCaller creates a new read-only instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTesterCaller(address common.Address, caller bind.ContractCaller) (*ConformanceTesterCaller, error) { + contract, err := bindConformanceTester(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ConformanceTesterCaller{contract: contract}, nil +} + +// NewConformanceTesterTransactor creates a new write-only instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTesterTransactor(address common.Address, transactor bind.ContractTransactor) (*ConformanceTesterTransactor, error) { + contract, err := bindConformanceTester(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ConformanceTesterTransactor{contract: contract}, nil +} + +// NewConformanceTesterFilterer creates a new log filterer instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTesterFilterer(address common.Address, filterer bind.ContractFilterer) (*ConformanceTesterFilterer, error) { + contract, err := bindConformanceTester(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ConformanceTesterFilterer{contract: contract}, nil +} + +// bindConformanceTester binds a generic wrapper to an already deployed contract. +func bindConformanceTester(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ConformanceTesterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ConformanceTester *ConformanceTesterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ConformanceTester.Contract.ConformanceTesterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ConformanceTester *ConformanceTesterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ConformanceTester.Contract.ConformanceTesterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ConformanceTester *ConformanceTesterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ConformanceTester.Contract.ConformanceTesterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ConformanceTester *ConformanceTesterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ConformanceTester.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ConformanceTester *ConformanceTesterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ConformanceTester.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ConformanceTester *ConformanceTesterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ConformanceTester.Contract.contract.Transact(opts, method, params...) +} + +// RevertErrorMessage is a free data retrieval call binding the contract method 0x242e7fa1. +// +// Solidity: function RevertErrorMessage() view returns(string) +func (_ConformanceTester *ConformanceTesterCaller) RevertErrorMessage(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "RevertErrorMessage") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// RevertErrorMessage is a free data retrieval call binding the contract method 0x242e7fa1. +// +// Solidity: function RevertErrorMessage() view returns(string) +func (_ConformanceTester *ConformanceTesterSession) RevertErrorMessage() (string, error) { + return _ConformanceTester.Contract.RevertErrorMessage(&_ConformanceTester.CallOpts) +} + +// RevertErrorMessage is a free data retrieval call binding the contract method 0x242e7fa1. +// +// Solidity: function RevertErrorMessage() view returns(string) +func (_ConformanceTester *ConformanceTesterCallerSession) RevertErrorMessage() (string, error) { + return _ConformanceTester.Contract.RevertErrorMessage(&_ConformanceTester.CallOpts) +} + +// Balances is a free data retrieval call binding the contract method 0x27e235e3. +// +// Solidity: function balances(address ) view returns(uint256) +func (_ConformanceTester *ConformanceTesterCaller) Balances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "balances", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Balances is a free data retrieval call binding the contract method 0x27e235e3. +// +// Solidity: function balances(address ) view returns(uint256) +func (_ConformanceTester *ConformanceTesterSession) Balances(arg0 common.Address) (*big.Int, error) { + return _ConformanceTester.Contract.Balances(&_ConformanceTester.CallOpts, arg0) +} + +// Balances is a free data retrieval call binding the contract method 0x27e235e3. +// +// Solidity: function balances(address ) view returns(uint256) +func (_ConformanceTester *ConformanceTesterCallerSession) Balances(arg0 common.Address) (*big.Int, error) { + return _ConformanceTester.Contract.Balances(&_ConformanceTester.CallOpts, arg0) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConformanceTester *ConformanceTesterCaller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConformanceTester *ConformanceTesterSession) Name() (string, error) { + return _ConformanceTester.Contract.Name(&_ConformanceTester.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConformanceTester *ConformanceTesterCallerSession) Name() (string, error) { + return _ConformanceTester.Contract.Name(&_ConformanceTester.CallOpts) +} + +// TestRevert is a free data retrieval call binding the contract method 0xa26388bb. +// +// Solidity: function testRevert() pure returns() +func (_ConformanceTester *ConformanceTesterCaller) TestRevert(opts *bind.CallOpts) error { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "testRevert") + + if err != nil { + return err + } + + return err + +} + +// TestRevert is a free data retrieval call binding the contract method 0xa26388bb. +// +// Solidity: function testRevert() pure returns() +func (_ConformanceTester *ConformanceTesterSession) TestRevert() error { + return _ConformanceTester.Contract.TestRevert(&_ConformanceTester.CallOpts) +} + +// TestRevert is a free data retrieval call binding the contract method 0xa26388bb. +// +// Solidity: function testRevert() pure returns() +func (_ConformanceTester *ConformanceTesterCallerSession) TestRevert() error { + return _ConformanceTester.Contract.TestRevert(&_ConformanceTester.CallOpts) +} + +// Deposit is a paid mutator transaction binding the contract method 0xb6b55f25. +// +// Solidity: function deposit(uint256 amount) returns() +func (_ConformanceTester *ConformanceTesterTransactor) Deposit(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _ConformanceTester.contract.Transact(opts, "deposit", amount) +} + +// Deposit is a paid mutator transaction binding the contract method 0xb6b55f25. +// +// Solidity: function deposit(uint256 amount) returns() +func (_ConformanceTester *ConformanceTesterSession) Deposit(amount *big.Int) (*types.Transaction, error) { + return _ConformanceTester.Contract.Deposit(&_ConformanceTester.TransactOpts, amount) +} + +// Deposit is a paid mutator transaction binding the contract method 0xb6b55f25. +// +// Solidity: function deposit(uint256 amount) returns() +func (_ConformanceTester *ConformanceTesterTransactorSession) Deposit(amount *big.Int) (*types.Transaction, error) { + return _ConformanceTester.Contract.Deposit(&_ConformanceTester.TransactOpts, amount) +} diff --git a/contracts/conformancetester/ConformanceTester.sol b/contracts/conformancetester/ConformanceTester.sol new file mode 100644 index 00000000..19a9075c --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.21; + +contract ConformanceTester { + string public name; + mapping(address => uint) public balances; + string public constant RevertErrorMessage = "Test Revert Error Message"; + + constructor(string memory _name) { + name = _name; + } + + function deposit(uint amount) external { + balances[msg.sender] += amount; + } + + function testRevert() public pure{ + revert(RevertErrorMessage); + } +} diff --git a/contracts/contracts.go b/contracts/contracts.go index 86a08802..d6162d63 100644 --- a/contracts/contracts.go +++ b/contracts/contracts.go @@ -1,6 +1,7 @@ package contracts import ( + "context" _ "embed" "encoding/hex" "fmt" @@ -9,15 +10,21 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" + ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts/conformancetester" "github.com/rs/zerolog/log" + + "github.com/cenkalti/backoff/v4" ) // solc --version // solc, the solidity compiler commandline interface // Version: 0.8.15+commit.e14f2714.Darwin.appleclang // solc LoadTester.sol --bin --abi -o . --overwrite -// ~/code/go-ethereum/build/bin/abigen --abi LoadTester.abi --pkg contracts --type LoadTester --bin LoadTester.bin --out loadtester.go +// From within `polygon-cli/contracts/loadtester` directory: +// ~/code/go-ethereum/build/bin/abigen --abi LoadTester.abi --pkg contracts --type LoadTester --bin LoadTester.bin --out ../loadtester.go //go:embed loadtester/LoadTester.bin var RawLoadTesterBin string @@ -31,6 +38,35 @@ func GetLoadTesterBytes() ([]byte, error) { return hex.DecodeString(RawLoadTesterBin) } +func BlockUntilSuccessful(ctx context.Context, c *ethclient.Client, retryable func() error) error { + // this function use to be very complicated (and not work). I'm dumbing this down to a basic time based retryable which should work 99% of the time + b := backoff.WithContext(backoff.WithMaxRetries(backoff.NewConstantBackOff(5*time.Second), 24), ctx) + return backoff.Retry(retryable, b) +} + +func DeployConformanceContract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (conformanceContractAddr ethcommon.Address, conformanceContract *conformancetester.ConformanceTester, err error) { + conformanceContractAddr, _, _, err = conformancetester.DeployConformanceTester(tops, c, "ConformanceTesterContractName") + if err != nil { + log.Error().Err(err).Msg("Unable to deploy ConformanceTester contract") + return + } + log.Info().Interface("conformanceContractAddr", conformanceContractAddr).Msg("Conformance contract deployed") + + conformanceContract, err = conformancetester.NewConformanceTester(conformanceContractAddr, c) + if err != nil { + log.Error().Err(err).Msg("Unable to instantiate new conformance contract") + return + } + log.Trace().Msg("Conformance contract instantiated") + + err = BlockUntilSuccessful(ctx, c, func() error { + _, err := conformanceContract.Name(cops) + return err + }) + + return +} + func CallLoadTestFunctionByOpCode(shortCode uint64, lt *LoadTester, opts *bind.TransactOpts, iterations uint64) (*ethtypes.Transaction, error) { x := new(big.Int).SetUint64(iterations) var longCode = 0xDEADBEEF0000 | shortCode diff --git a/contracts/loadtester/LoadTester.go b/contracts/loadtester/LoadTester.go deleted file mode 100644 index e63d3051..00000000 --- a/contracts/loadtester/LoadTester.go +++ /dev/null @@ -1,1819 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package loadtester - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// LoadTesterMetaData contains all meta data concerning the LoadTester contract. -var LoadTesterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dumpster\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCallCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"loopBlockHashUntilLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"loopUntilLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"trash\",\"type\":\"bytes\"}],\"name\":\"store\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADDMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADDRESS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBALANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBASEFEE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBLOCKHASH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBYTE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testBlake2f\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATACOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATALOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATASIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLVALUE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCODECOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCOINBASE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testDIFFICULTY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testDIV\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECAdd\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECMul\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECPairing\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECRecover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"result\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEQ\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEXP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGASPRICE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testISZERO\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testIdentity\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG0\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG1\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG2\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG3\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG4\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMLOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSTORE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSTORE8\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMUL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMULMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testModExp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testNOT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testORIGIN\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testRETURNDATACOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testRETURNDATASIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testRipemd160\",\"outputs\":[{\"internalType\":\"bytes20\",\"name\":\"result\",\"type\":\"bytes20\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSAR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSDIV\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSELFBALANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSGT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testSHA256\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHA3\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSIGNEXTEND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSLOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSLT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSSTORE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSUB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testXOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50612d9f8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610452575f3560e01c806380947f801161023f578063bf529ca111610139578063dd9bef60116100c1578063f279ca8111610085578063f279ca811461115e578063f4d1fc611461118e578063f58fc36a146111be578063f6b0bbf7146111ee578063fde7721c1461121e57610452565b8063dd9bef601461106e578063de97a3631461109e578063e9f9b3f2146110ce578063ea5141e6146110fe578063edf003cf1461112e57610452565b8063ce3cf4ef11610108578063ce3cf4ef14610f7e578063d117320b14610fae578063d51e7b5b14610fde578063d53ff3fd1461100e578063d93cd5581461103e57610452565b8063bf529ca114610ebe578063c360aba614610eee578063c420eb6114610f1e578063c4bd65d514610f4e57610452565b8063a18683cb116101c7578063b374012b1161018b578063b374012b14610dce578063b3d847f214610dfe578063b7b8620714610e2e578063b81c148414610e5e578063bdc875fc14610e8e57610452565b8063a18683cb14610cf0578063a271b72114610d20578063a60a108714610d3e578063a645c9c214610d6e578063acaebdf614610d9e57610452565b8063962e4dc21161020e578063962e4dc214610c0057806398456f3e14610c305780639a2b7c8114610c605780639cce7cf914610c90578063a040aec614610cc057610452565b806380947f8014610b40578063880eff3914610b70578063918a5fcd14610ba057806391e7b27714610bd057610452565b80633430ec061161035057806360e13cde116102d85780636f099c8d1161029c5780636f099c8d14610a5057806371d91d2814610a805780637b6e0b0e14610ab05780637c191d2014610ae05780637de8c6f814610b1057610452565b806360e13cde14610972578063613d0a82146109a257806363138d4f146109d2578063659bbb4f14610a025780636e7f1fe714610a2057610452565b806340fe26621161031f57806340fe26621461088257806344cf3bc7146108b25780634a61af1f146108e25780634d2c74b3146109125780635590c2d91461094257610452565b80633430ec06146107d4578063371303c0146108045780633a411f12146108225780633a425dfc1461085257610452565b806318093b46116103de578063219cddeb116103a2578063219cddeb146106e45780632294fc7f146107145780632871ef85146107445780632b21ef44146107745780632d34e798146107a457610452565b806318093b46146105f457806319b621d6146106245780631aba07ea146106545780631de2f343146106845780632007332e146106b457610452565b80630ba8a73b116104255780630ba8a73b146105165780631287a68c14610546578063135d52f7146105645780631581cf191461059457806316582150146105c457610452565b8063034aef7114610456578063050082f814610486578063087b4e84146104b65780630b3b996a146104e6575b5f80fd5b610470600480360381019061046b9190612507565b61124e565b60405161047d9190612541565b60405180910390f35b6104a0600480360381019061049b9190612507565b611286565b6040516104ad9190612541565b60405180910390f35b6104d060048036038101906104cb9190612507565b6112be565b6040516104dd9190612541565b60405180910390f35b61050060048036038101906104fb9190612696565b6112f4565b60405161050d9190612757565b60405180910390f35b610530600480360381019061052b9190612507565b611318565b60405161053d9190612541565b60405180910390f35b61054e611350565b60405161055b9190612541565b60405180910390f35b61057e60048036038101906105799190612507565b611358565b60405161058b9190612541565b60405180910390f35b6105ae60048036038101906105a99190612507565b611390565b6040516105bb9190612541565b60405180910390f35b6105de60048036038101906105d99190612507565b6113c8565b6040516105eb9190612541565b60405180910390f35b61060e60048036038101906106099190612507565b611420565b60405161061b9190612541565b60405180910390f35b61063e60048036038101906106399190612507565b61145b565b60405161064b9190612541565b60405180910390f35b61066e60048036038101906106699190612507565b6114e4565b60405161067b9190612541565b60405180910390f35b61069e60048036038101906106999190612507565b611527565b6040516106ab9190612541565b60405180910390f35b6106ce60048036038101906106c99190612507565b611561565b6040516106db9190612541565b60405180910390f35b6106fe60048036038101906106f99190612507565b611599565b60405161070b9190612541565b60405180910390f35b61072e60048036038101906107299190612507565b6115d1565b60405161073b9190612541565b60405180910390f35b61075e60048036038101906107599190612507565b61160c565b60405161076b9190612541565b60405180910390f35b61078e60048036038101906107899190612507565b611644565b60405161079b9190612541565b60405180910390f35b6107be60048036038101906107b99190612507565b61167c565b6040516107cb9190612541565b60405180910390f35b6107ee60048036038101906107e99190612507565b6116b4565b6040516107fb9190612757565b60405180910390f35b61080c61175a565b6040516108199190612541565b60405180910390f35b61083c60048036038101906108379190612507565b611775565b6040516108499190612541565b60405180910390f35b61086c60048036038101906108679190612507565b6117ae565b6040516108799190612541565b60405180910390f35b61089c60048036038101906108979190612507565b6117e6565b6040516108a99190612541565b60405180910390f35b6108cc60048036038101906108c79190612507565b611822565b6040516108d99190612541565b60405180910390f35b6108fc60048036038101906108f79190612507565b61185a565b6040516109099190612541565b60405180910390f35b61092c60048036038101906109279190612507565b611894565b6040516109399190612541565b60405180910390f35b61095c60048036038101906109579190612507565b6118cc565b6040516109699190612541565b60405180910390f35b61098c60048036038101906109879190612507565b61190b565b6040516109999190612541565b60405180910390f35b6109bc60048036038101906109b79190612696565b611943565b6040516109c99190612757565b60405180910390f35b6109ec60048036038101906109e79190612696565b611972565b6040516109f9919061278f565b60405180910390f35b610a0a61199b565b604051610a179190612541565b60405180910390f35b610a3a6004803603810190610a359190612507565b6119d5565b604051610a479190612541565b60405180910390f35b610a6a6004803603810190610a659190612507565b611a10565b604051610a779190612541565b60405180910390f35b610a9a6004803603810190610a959190612507565b611a48565b604051610aa79190612541565b60405180910390f35b610aca6004803603810190610ac59190612507565b611a83565b604051610ad79190612541565b60405180910390f35b610afa6004803603810190610af59190612507565b611abb565b604051610b079190612541565b60405180910390f35b610b2a6004803603810190610b259190612507565b611af3565b604051610b379190612541565b60405180910390f35b610b5a6004803603810190610b559190612507565b611b2c565b604051610b679190612541565b60405180910390f35b610b8a6004803603810190610b859190612507565b611b85565b604051610b979190612541565b60405180910390f35b610bba6004803603810190610bb59190612507565b611bbf565b604051610bc79190612541565b60405180910390f35b610bea6004803603810190610be59190612507565b611bf7565b604051610bf79190612541565b60405180910390f35b610c1a6004803603810190610c159190612696565b611c40565b604051610c279190612757565b60405180910390f35b610c4a6004803603810190610c459190612507565b611cab565b604051610c579190612541565b60405180910390f35b610c7a6004803603810190610c759190612507565b611ce8565b604051610c879190612541565b60405180910390f35b610caa6004803603810190610ca59190612696565b611d20565b604051610cb79190612757565b60405180910390f35b610cda6004803603810190610cd59190612696565b611d4e565b604051610ce79190612757565b60405180910390f35b610d0a6004803603810190610d059190612696565b611d72565b604051610d1791906127e7565b60405180910390f35b610d28611df0565b604051610d359190612541565b60405180910390f35b610d586004803603810190610d539190612507565b611e39565b604051610d659190612541565b60405180910390f35b610d886004803603810190610d839190612507565b611e71565b604051610d959190612541565b60405180910390f35b610db86004803603810190610db39190612507565b611eaa565b604051610dc59190612541565b60405180910390f35b610de86004803603810190610de3919061285d565b611ee2565b604051610df59190612541565b60405180910390f35b610e186004803603810190610e139190612507565b611f2c565b604051610e259190612541565b60405180910390f35b610e486004803603810190610e439190612507565b611f64565b604051610e559190612541565b60405180910390f35b610e786004803603810190610e739190612507565b611f9c565b604051610e859190612541565b60405180910390f35b610ea86004803603810190610ea39190612507565b611fd4565b604051610eb59190612541565b60405180910390f35b610ed86004803603810190610ed39190612507565b61200c565b604051610ee59190612541565b60405180910390f35b610f086004803603810190610f039190612507565b61204d565b604051610f159190612541565b60405180910390f35b610f386004803603810190610f339190612507565b612086565b604051610f459190612541565b60405180910390f35b610f686004803603810190610f639190612507565b6120be565b604051610f759190612541565b60405180910390f35b610f986004803603810190610f939190612507565b6120f8565b604051610fa59190612541565b60405180910390f35b610fc86004803603810190610fc39190612507565b612131565b604051610fd59190612541565b60405180910390f35b610ff86004803603810190610ff39190612507565b612167565b6040516110059190612541565b60405180910390f35b61102860048036038101906110239190612507565b61219f565b6040516110359190612541565b60405180910390f35b61105860048036038101906110539190612507565b6121d7565b6040516110659190612541565b60405180910390f35b61108860048036038101906110839190612507565b61222f565b6040516110959190612541565b60405180910390f35b6110b860048036038101906110b39190612507565b61226e565b6040516110c59190612541565b60405180910390f35b6110e860048036038101906110e39190612507565b6122a7565b6040516110f59190612541565b60405180910390f35b61111860048036038101906111139190612507565b6122e1565b6040516111259190612541565b60405180910390f35b61114860048036038101906111439190612696565b61231f565b6040516111559190612757565b60405180910390f35b61117860048036038101906111739190612507565b61238b565b6040516111859190612541565b60405180910390f35b6111a860048036038101906111a39190612507565b6123c4565b6040516111b59190612541565b60405180910390f35b6111d860048036038101906111d39190612507565b6123ff565b6040516111e59190612541565b60405180910390f35b61120860048036038101906112039190612696565b61243a565b60405161121591906128e2565b60405180910390f35b61123860048036038101906112339190612507565b612469565b6040516112459190612541565b60405180910390f35b5f61125761175a565b505f65deadbeef003690505f805b8481101561127b57369150600181019050611265565b505080915050919050565b5f61128f61175a565b505f65deadbeef003290505f805b848110156112b35732915060018101905061129d565b505080915050919050565b5f6112c761175a565b505f65deadbeef005290505f5b838110156112ea57815f526001810190506112d4565b5080915050919050565b60605f600890506040828451602086015f855af180611311575f80fd5b5050919050565b5f61132161175a565b505f65deadbeef000190505f5b83811015611346575f8201915060018101905061132e565b5080915050919050565b5f8054905090565b5f61136161175a565b505f65deadbeef001790505f5b83811015611386575f8217915060018101905061136e565b5080915050919050565b5f61139961175a565b505f65deadbeef003490505f805b848110156113bd573491506001810190506113a7565b505080915050919050565b5f6113d161175a565b505f65deadbeef000690505f5b83811015611416577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820691506001810190506113de565b5080915050919050565b5f61142961175a565b505f65deadbeef001390505f805b8481101561145057600183139150600181019050611437565b505080915050919050565b5f61146461175a565b505f65deadbeef002090507fffffffff000000000000000000000000000000000000000000000000000000005f525f805b848110156114ae5760045f209150600181019050611495565b507f29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c23881146114da575f91505b5080915050919050565b5f6114ed61175a565b505f65deadbeef00a49050806010525f5b8381101561151d576004600360028360066010a46001810190506114fe565b5080915050919050565b5f61153061175a565b505f65deadbeef001a90505f805b8481101561155657825f1a915060018101905061153e565b505080915050919050565b5f61156a61175a565b505f65deadbeef001b90505f5b8381101561158f57815f1b9150600181019050611577565b5080915050919050565b5f6115a261175a565b505f65deadbeef004290505f805b848110156115c6574291506001810190506115b0565b505080915050919050565b5f6115da61175a565b505f65deadbeef003190505f305f5b8581101561160057813192506001810190506115e9565b50505080915050919050565b5f61161561175a565b505f65deadbeef004890505f805b8481101561163957489150600181019050611623565b505080915050919050565b5f61164d61175a565b505f65deadbeef003d90505f805b84811015611671573d915060018101905061165b565b505080915050919050565b5f61168561175a565b505f65deadbeef004390505f805b848110156116a957439150600181019050611693565b505080915050919050565b600281815481106116c3575f80fd5b905f5260205f20015f9150905080546116db90612928565b80601f016020809104026020016040519081016040528092919081815260200182805461170790612928565b80156117525780601f1061172957610100808354040283529160200191611752565b820191905f5260205f20905b81548152906001019060200180831161173557829003601f168201915b505050505081565b5f60015f546117699190612985565b5f819055505f54905090565b5f61177e61175a565b505f65deadbeef000490505f5b838110156117a45760018204915060018101905061178b565b5080915050919050565b5f6117b761175a565b505f65deadbeef003790505f5b838110156117dc5760205f80376001810190506117c4565b5080915050919050565b5f6117ef61175a565b505f65deadbeef00a09050806010525f5b838110156118185760066010a0600181019050611800565b5080915050919050565b5f61182b61175a565b505f65deadbeef003390505f805b8481101561184f57339150600181019050611839565b505080915050919050565b5f61186361175a565b505f65deadbeef005390505f5b8381101561188a5763deadbeef5f52600181019050611870565b5080915050919050565b5f61189d61175a565b505f65deadbeef003a90505f805b848110156118c1573a91506001810190506118ab565b505080915050919050565b5f6118d561175a565b505f65deadbeef005190505f815f525f5b848110156118fd575f5191506001810190506118e6565b508091505080915050919050565b5f61191461175a565b505f65deadbeef001d90505f5b8381101561193957815f1d9150600181019050611921565b5080915050919050565b60605f6005905060208301835160405160208183855f885af180611965575f80fd5b8195505050505050919050565b5f80600290506020830183518360208183855f885af180611991575f80fd5b5050505050919050565b5f6119a461175a565b505b6103e85a11156119cd576001805f8282546119c19190612985565b925050819055506119a6565b600154905090565b5f6119de61175a565b505f65deadbeef001090505f805b84811015611a05578260011091506001810190506119ec565b505080915050919050565b5f611a1961175a565b505f65deadbeef004490505f805b84811015611a3d57449150600181019050611a27565b505080915050919050565b5f611a5161175a565b505f65deadbeef001190505f805b84811015611a7857600183119150600181019050611a5f565b505080915050919050565b5f611a8c61175a565b505f65deadbeef003e90505f5b83811015611ab15760205f803e600181019050611a99565b5080915050919050565b5f611ac461175a565b505f65deadbeef004590505f805b84811015611ae857459150600181019050611ad2565b505080915050919050565b5f611afc61175a565b505f65deadbeef000290505f5b83811015611b2257600182029150600181019050611b09565b5080915050919050565b5f611b3561175a565b505f65deadbeef000890505f5b83811015611b7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f83089150600181019050611b42565b5080915050919050565b5f611b8e61175a565b505f65deadbeef00549050805f555f5b83811015611bb5575f549150600181019050611b9e565b5080915050919050565b5f611bc861175a565b505f65deadbeef005a90505f805b84811015611bec575a9150600181019050611bd6565b505080915050919050565b5f611c0061175a565b505f65deadbeef001990505f5b83811015611c245781199150600181019050611c0d565b5065deadbeef00198114611c3757801990505b80915050919050565b606080825114611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90612a12565b60405180910390fd5b5f6007905060208301835160408482845f875af180611ca2575f80fd5b50505050919050565b5f611cb461175a565b505f65deadbeef00a19050806010525f5b83811015611cde578060066010a1600181019050611cc5565b5080915050919050565b5f611cf161175a565b505f65deadbeef001690505f5b83811015611d16578182169150600181019050611cfe565b5080915050919050565b60605f60049050602083018351604051818183855f885af180611d41575f80fd5b8195505050505050919050565b60605f600890506040828451602086015f855af180611d6b575f80fd5b5050919050565b5f6080825114611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90612a7a565b60405180910390fd5b5f60019050602083016020810151601f1a602082015260206040516080835f865af180611de2575f80fd5b604051519350505050919050565b5f611df961175a565b505b6103e85a1115611e31576001805f828254611e169190612985565b9250508190555043600154611e2b9190612ac5565b50611dfb565b600154905090565b5f611e4261175a565b505f65deadbeef004690505f805b84811015611e6657469150600181019050611e50565b505080915050919050565b5f611e7a61175a565b505f65deadbeef000590505f5b83811015611ea057600182059150600181019050611e87565b5080915050919050565b5f611eb361175a565b505f65deadbeef003990505f5b83811015611ed85760205f8039600181019050611ec0565b5080915050919050565b5f6002838390918060018154018082558091505060019003905f5260205f20015f909192909192909192909192509182611f1d929190612c9c565b50600280549050905092915050565b5f611f3561175a565b505f65deadbeef005990505f805b84811015611f5957599150600181019050611f43565b505080915050919050565b5f611f6d61175a565b505f65deadbeef003890505f805b84811015611f9157389150600181019050611f7b565b505080915050919050565b5f611fa561175a565b505f65deadbeef004190505f805b84811015611fc957419150600181019050611fb3565b505080915050919050565b5f611fdd61175a565b505f65deadbeef003090505f805b8481101561200157309150600181019050611feb565b505080915050919050565b5f61201561175a565b505f65deadbeef00a39050806010525f5b8381101561204357600360028260066010a3600181019050612026565b5080915050919050565b5f61205661175a565b505f65deadbeef000b90505f5b8381101561207c578160200b9150600181019050612063565b5080915050919050565b5f61208f61175a565b505f65deadbeef004790505f805b848110156120b35747915060018101905061209d565b505080915050919050565b5f6120c761175a565b505f65deadbeef001c90505f805b848110156120ed57825f1c92506001810190506120d5565b505080915050919050565b5f61210161175a565b505f65deadbeef003590505f805b84811015612126575f35915060018101905061210f565b505080915050919050565b5f61213a61175a565b505f65deadbeef005590505f5b8381101561215d57815f55600181019050612147565b5080915050919050565b5f61217061175a565b505f65deadbeef001890505f5b83811015612195575f8218915060018101905061217d565b5080915050919050565b5f6121a861175a565b505f65deadbeef000390505f5b838110156121cd575f820391506001810190506121b5565b5080915050919050565b5f6121e061175a565b505f65deadbeef000790505f5b83811015612225577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820791506001810190506121ed565b5080915050919050565b5f61223861175a565b505f65deadbeef00a29050806010525f5b838110156122645760028160066010a2600181019050612249565b5080915050919050565b5f61227761175a565b505f65deadbeef000a90505f5b8381101561229d576001820a9150600181019050612284565b5080915050919050565b5f6122b061175a565b505f65deadbeef001490505f805b848110156122d65782831491506001810190506122be565b505080915050919050565b5f6122ea61175a565b505f65deadbeef004090505f600143035f5b8581101561231357814092506001810190506122fc565b50505080915050919050565b60606080825114612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90612a12565b60405180910390fd5b5f6006905060208301835160408482845f875af180612382575f80fd5b50505050919050565b5f61239461175a565b505f65deadbeef001590505f805b848110156123b957821591506001810190506123a2565b505080915050919050565b5f6123cd61175a565b505f65deadbeef001290505f805b848110156123f4578260011291506001810190506123db565b505080915050919050565b5f61240861175a565b505f65deadbeef003b90505f305f5b8581101561242e57813b9250600181019050612417565b50505080915050919050565b5f806003905060208301835160405160148183855f885af18061245b575f80fd5b815195505050505050919050565b5f61247261175a565b505f65deadbeef000990505f5b838110156124b9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018309915060018101905061247f565b5080915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6124e6816124d4565b81146124f0575f80fd5b50565b5f81359050612501816124dd565b92915050565b5f6020828403121561251c5761251b6124cc565b5b5f612529848285016124f3565b91505092915050565b61253b816124d4565b82525050565b5f6020820190506125545f830184612532565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6125a882612562565b810181811067ffffffffffffffff821117156125c7576125c6612572565b5b80604052505050565b5f6125d96124c3565b90506125e5828261259f565b919050565b5f67ffffffffffffffff82111561260457612603612572565b5b61260d82612562565b9050602081019050919050565b828183375f83830152505050565b5f61263a612635846125ea565b6125d0565b9050828152602081018484840111156126565761265561255e565b5b61266184828561261a565b509392505050565b5f82601f83011261267d5761267c61255a565b5b813561268d848260208601612628565b91505092915050565b5f602082840312156126ab576126aa6124cc565b5b5f82013567ffffffffffffffff8111156126c8576126c76124d0565b5b6126d484828501612669565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156127145780820151818401526020810190506126f9565b5f8484015250505050565b5f612729826126dd565b61273381856126e7565b93506127438185602086016126f7565b61274c81612562565b840191505092915050565b5f6020820190508181035f83015261276f818461271f565b905092915050565b5f819050919050565b61278981612777565b82525050565b5f6020820190506127a25f830184612780565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127d1826127a8565b9050919050565b6127e1816127c7565b82525050565b5f6020820190506127fa5f8301846127d8565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261281d5761281c61255a565b5b8235905067ffffffffffffffff81111561283a57612839612800565b5b60208301915083600182028301111561285657612855612804565b5b9250929050565b5f8060208385031215612873576128726124cc565b5b5f83013567ffffffffffffffff8111156128905761288f6124d0565b5b61289c85828601612808565b92509250509250929050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b6128dc816128a8565b82525050565b5f6020820190506128f55f8301846128d3565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061293f57607f821691505b602082108103612952576129516128fb565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61298f826124d4565b915061299a836124d4565b92508282019050808211156129b2576129b1612958565b5b92915050565b5f82825260208201905092915050565b7f496e76616c696420696e707574206c656e6774680000000000000000000000005f82015250565b5f6129fc6014836129b8565b9150612a07826129c8565b602082019050919050565b5f6020820190508181035f830152612a29816129f0565b9050919050565b7f496e76616c696420696e7075742064617461206c656e6774682e0000000000005f82015250565b5f612a64601a836129b8565b9150612a6f82612a30565b602082019050919050565b5f6020820190508181035f830152612a9181612a58565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612acf826124d4565b9150612ada836124d4565b925082612aea57612ae9612a98565b5b828206905092915050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612b5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612b20565b612b658683612b20565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612ba0612b9b612b96846124d4565b612b7d565b6124d4565b9050919050565b5f819050919050565b612bb983612b86565b612bcd612bc582612ba7565b848454612b2c565b825550505050565b5f90565b612be1612bd5565b612bec818484612bb0565b505050565b5b81811015612c0f57612c045f82612bd9565b600181019050612bf2565b5050565b601f821115612c5457612c2581612aff565b612c2e84612b11565b81016020851015612c3d578190505b612c51612c4985612b11565b830182612bf1565b50505b505050565b5f82821c905092915050565b5f612c745f1984600802612c59565b1980831691505092915050565b5f612c8c8383612c65565b9150826002028217905092915050565b612ca68383612af5565b67ffffffffffffffff811115612cbf57612cbe612572565b5b612cc98254612928565b612cd4828285612c13565b5f601f831160018114612d01575f8415612cef578287013590505b612cf98582612c81565b865550612d60565b601f198416612d0f86612aff565b5f5b82811015612d3657848901358255600182019150602085019450602081019050612d11565b86831015612d535784890135612d4f601f891682612c65565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212203c57a6b96f48cb24258b084af1375fb6fc2d63da2324c357edaf799dddc79fb664736f6c63430008150033", -} - -// LoadTesterABI is the input ABI used to generate the binding from. -// Deprecated: Use LoadTesterMetaData.ABI instead. -var LoadTesterABI = LoadTesterMetaData.ABI - -// LoadTesterBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use LoadTesterMetaData.Bin instead. -var LoadTesterBin = LoadTesterMetaData.Bin - -// DeployLoadTester deploys a new Ethereum contract, binding an instance of LoadTester to it. -func DeployLoadTester(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *LoadTester, error) { - parsed, err := LoadTesterMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LoadTesterBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &LoadTester{LoadTesterCaller: LoadTesterCaller{contract: contract}, LoadTesterTransactor: LoadTesterTransactor{contract: contract}, LoadTesterFilterer: LoadTesterFilterer{contract: contract}}, nil -} - -// LoadTester is an auto generated Go binding around an Ethereum contract. -type LoadTester struct { - LoadTesterCaller // Read-only binding to the contract - LoadTesterTransactor // Write-only binding to the contract - LoadTesterFilterer // Log filterer for contract events -} - -// LoadTesterCaller is an auto generated read-only Go binding around an Ethereum contract. -type LoadTesterCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LoadTesterTransactor is an auto generated write-only Go binding around an Ethereum contract. -type LoadTesterTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LoadTesterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type LoadTesterFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LoadTesterSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type LoadTesterSession struct { - Contract *LoadTester // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LoadTesterCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type LoadTesterCallerSession struct { - Contract *LoadTesterCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// LoadTesterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type LoadTesterTransactorSession struct { - Contract *LoadTesterTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LoadTesterRaw is an auto generated low-level Go binding around an Ethereum contract. -type LoadTesterRaw struct { - Contract *LoadTester // Generic contract binding to access the raw methods on -} - -// LoadTesterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type LoadTesterCallerRaw struct { - Contract *LoadTesterCaller // Generic read-only contract binding to access the raw methods on -} - -// LoadTesterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type LoadTesterTransactorRaw struct { - Contract *LoadTesterTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewLoadTester creates a new instance of LoadTester, bound to a specific deployed contract. -func NewLoadTester(address common.Address, backend bind.ContractBackend) (*LoadTester, error) { - contract, err := bindLoadTester(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &LoadTester{LoadTesterCaller: LoadTesterCaller{contract: contract}, LoadTesterTransactor: LoadTesterTransactor{contract: contract}, LoadTesterFilterer: LoadTesterFilterer{contract: contract}}, nil -} - -// NewLoadTesterCaller creates a new read-only instance of LoadTester, bound to a specific deployed contract. -func NewLoadTesterCaller(address common.Address, caller bind.ContractCaller) (*LoadTesterCaller, error) { - contract, err := bindLoadTester(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &LoadTesterCaller{contract: contract}, nil -} - -// NewLoadTesterTransactor creates a new write-only instance of LoadTester, bound to a specific deployed contract. -func NewLoadTesterTransactor(address common.Address, transactor bind.ContractTransactor) (*LoadTesterTransactor, error) { - contract, err := bindLoadTester(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &LoadTesterTransactor{contract: contract}, nil -} - -// NewLoadTesterFilterer creates a new log filterer instance of LoadTester, bound to a specific deployed contract. -func NewLoadTesterFilterer(address common.Address, filterer bind.ContractFilterer) (*LoadTesterFilterer, error) { - contract, err := bindLoadTester(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &LoadTesterFilterer{contract: contract}, nil -} - -// bindLoadTester binds a generic wrapper to an already deployed contract. -func bindLoadTester(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := LoadTesterMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LoadTester *LoadTesterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LoadTester.Contract.LoadTesterCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LoadTester *LoadTesterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.Contract.LoadTesterTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LoadTester *LoadTesterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LoadTester.Contract.LoadTesterTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LoadTester *LoadTesterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LoadTester.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LoadTester *LoadTesterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LoadTester *LoadTesterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LoadTester.Contract.contract.Transact(opts, method, params...) -} - -// Dumpster is a free data retrieval call binding the contract method 0x3430ec06. -// -// Solidity: function dumpster(uint256 ) view returns(bytes) -func (_LoadTester *LoadTesterCaller) Dumpster(opts *bind.CallOpts, arg0 *big.Int) ([]byte, error) { - var out []interface{} - err := _LoadTester.contract.Call(opts, &out, "dumpster", arg0) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// Dumpster is a free data retrieval call binding the contract method 0x3430ec06. -// -// Solidity: function dumpster(uint256 ) view returns(bytes) -func (_LoadTester *LoadTesterSession) Dumpster(arg0 *big.Int) ([]byte, error) { - return _LoadTester.Contract.Dumpster(&_LoadTester.CallOpts, arg0) -} - -// Dumpster is a free data retrieval call binding the contract method 0x3430ec06. -// -// Solidity: function dumpster(uint256 ) view returns(bytes) -func (_LoadTester *LoadTesterCallerSession) Dumpster(arg0 *big.Int) ([]byte, error) { - return _LoadTester.Contract.Dumpster(&_LoadTester.CallOpts, arg0) -} - -// GetCallCounter is a free data retrieval call binding the contract method 0x1287a68c. -// -// Solidity: function getCallCounter() view returns(uint256) -func (_LoadTester *LoadTesterCaller) GetCallCounter(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LoadTester.contract.Call(opts, &out, "getCallCounter") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetCallCounter is a free data retrieval call binding the contract method 0x1287a68c. -// -// Solidity: function getCallCounter() view returns(uint256) -func (_LoadTester *LoadTesterSession) GetCallCounter() (*big.Int, error) { - return _LoadTester.Contract.GetCallCounter(&_LoadTester.CallOpts) -} - -// GetCallCounter is a free data retrieval call binding the contract method 0x1287a68c. -// -// Solidity: function getCallCounter() view returns(uint256) -func (_LoadTester *LoadTesterCallerSession) GetCallCounter() (*big.Int, error) { - return _LoadTester.Contract.GetCallCounter(&_LoadTester.CallOpts) -} - -// Inc is a paid mutator transaction binding the contract method 0x371303c0. -// -// Solidity: function inc() returns(uint256) -func (_LoadTester *LoadTesterTransactor) Inc(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "inc") -} - -// Inc is a paid mutator transaction binding the contract method 0x371303c0. -// -// Solidity: function inc() returns(uint256) -func (_LoadTester *LoadTesterSession) Inc() (*types.Transaction, error) { - return _LoadTester.Contract.Inc(&_LoadTester.TransactOpts) -} - -// Inc is a paid mutator transaction binding the contract method 0x371303c0. -// -// Solidity: function inc() returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) Inc() (*types.Transaction, error) { - return _LoadTester.Contract.Inc(&_LoadTester.TransactOpts) -} - -// LoopBlockHashUntilLimit is a paid mutator transaction binding the contract method 0xa271b721. -// -// Solidity: function loopBlockHashUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactor) LoopBlockHashUntilLimit(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "loopBlockHashUntilLimit") -} - -// LoopBlockHashUntilLimit is a paid mutator transaction binding the contract method 0xa271b721. -// -// Solidity: function loopBlockHashUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterSession) LoopBlockHashUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopBlockHashUntilLimit(&_LoadTester.TransactOpts) -} - -// LoopBlockHashUntilLimit is a paid mutator transaction binding the contract method 0xa271b721. -// -// Solidity: function loopBlockHashUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) LoopBlockHashUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopBlockHashUntilLimit(&_LoadTester.TransactOpts) -} - -// LoopUntilLimit is a paid mutator transaction binding the contract method 0x659bbb4f. -// -// Solidity: function loopUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactor) LoopUntilLimit(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "loopUntilLimit") -} - -// LoopUntilLimit is a paid mutator transaction binding the contract method 0x659bbb4f. -// -// Solidity: function loopUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterSession) LoopUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopUntilLimit(&_LoadTester.TransactOpts) -} - -// LoopUntilLimit is a paid mutator transaction binding the contract method 0x659bbb4f. -// -// Solidity: function loopUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) LoopUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopUntilLimit(&_LoadTester.TransactOpts) -} - -// Store is a paid mutator transaction binding the contract method 0xb374012b. -// -// Solidity: function store(bytes trash) returns(uint256) -func (_LoadTester *LoadTesterTransactor) Store(opts *bind.TransactOpts, trash []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "store", trash) -} - -// Store is a paid mutator transaction binding the contract method 0xb374012b. -// -// Solidity: function store(bytes trash) returns(uint256) -func (_LoadTester *LoadTesterSession) Store(trash []byte) (*types.Transaction, error) { - return _LoadTester.Contract.Store(&_LoadTester.TransactOpts, trash) -} - -// Store is a paid mutator transaction binding the contract method 0xb374012b. -// -// Solidity: function store(bytes trash) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) Store(trash []byte) (*types.Transaction, error) { - return _LoadTester.Contract.Store(&_LoadTester.TransactOpts, trash) -} - -// TestADD is a paid mutator transaction binding the contract method 0x0ba8a73b. -// -// Solidity: function testADD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestADD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testADD", x) -} - -// TestADD is a paid mutator transaction binding the contract method 0x0ba8a73b. -// -// Solidity: function testADD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestADD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADD(&_LoadTester.TransactOpts, x) -} - -// TestADD is a paid mutator transaction binding the contract method 0x0ba8a73b. -// -// Solidity: function testADD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestADD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADD(&_LoadTester.TransactOpts, x) -} - -// TestADDMOD is a paid mutator transaction binding the contract method 0x80947f80. -// -// Solidity: function testADDMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestADDMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testADDMOD", x) -} - -// TestADDMOD is a paid mutator transaction binding the contract method 0x80947f80. -// -// Solidity: function testADDMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestADDMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDMOD(&_LoadTester.TransactOpts, x) -} - -// TestADDMOD is a paid mutator transaction binding the contract method 0x80947f80. -// -// Solidity: function testADDMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestADDMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDMOD(&_LoadTester.TransactOpts, x) -} - -// TestADDRESS is a paid mutator transaction binding the contract method 0xbdc875fc. -// -// Solidity: function testADDRESS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestADDRESS(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testADDRESS", x) -} - -// TestADDRESS is a paid mutator transaction binding the contract method 0xbdc875fc. -// -// Solidity: function testADDRESS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestADDRESS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDRESS(&_LoadTester.TransactOpts, x) -} - -// TestADDRESS is a paid mutator transaction binding the contract method 0xbdc875fc. -// -// Solidity: function testADDRESS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestADDRESS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDRESS(&_LoadTester.TransactOpts, x) -} - -// TestAND is a paid mutator transaction binding the contract method 0x9a2b7c81. -// -// Solidity: function testAND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestAND(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testAND", x) -} - -// TestAND is a paid mutator transaction binding the contract method 0x9a2b7c81. -// -// Solidity: function testAND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestAND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestAND(&_LoadTester.TransactOpts, x) -} - -// TestAND is a paid mutator transaction binding the contract method 0x9a2b7c81. -// -// Solidity: function testAND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestAND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestAND(&_LoadTester.TransactOpts, x) -} - -// TestBALANCE is a paid mutator transaction binding the contract method 0x2294fc7f. -// -// Solidity: function testBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBALANCE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBALANCE", x) -} - -// TestBALANCE is a paid mutator transaction binding the contract method 0x2294fc7f. -// -// Solidity: function testBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestBALANCE is a paid mutator transaction binding the contract method 0x2294fc7f. -// -// Solidity: function testBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestBASEFEE is a paid mutator transaction binding the contract method 0x2871ef85. -// -// Solidity: function testBASEFEE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBASEFEE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBASEFEE", x) -} - -// TestBASEFEE is a paid mutator transaction binding the contract method 0x2871ef85. -// -// Solidity: function testBASEFEE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBASEFEE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBASEFEE(&_LoadTester.TransactOpts, x) -} - -// TestBASEFEE is a paid mutator transaction binding the contract method 0x2871ef85. -// -// Solidity: function testBASEFEE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBASEFEE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBASEFEE(&_LoadTester.TransactOpts, x) -} - -// TestBLOCKHASH is a paid mutator transaction binding the contract method 0xea5141e6. -// -// Solidity: function testBLOCKHASH(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBLOCKHASH(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBLOCKHASH", x) -} - -// TestBLOCKHASH is a paid mutator transaction binding the contract method 0xea5141e6. -// -// Solidity: function testBLOCKHASH(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBLOCKHASH(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBLOCKHASH(&_LoadTester.TransactOpts, x) -} - -// TestBLOCKHASH is a paid mutator transaction binding the contract method 0xea5141e6. -// -// Solidity: function testBLOCKHASH(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBLOCKHASH(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBLOCKHASH(&_LoadTester.TransactOpts, x) -} - -// TestBYTE is a paid mutator transaction binding the contract method 0x1de2f343. -// -// Solidity: function testBYTE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBYTE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBYTE", x) -} - -// TestBYTE is a paid mutator transaction binding the contract method 0x1de2f343. -// -// Solidity: function testBYTE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBYTE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBYTE(&_LoadTester.TransactOpts, x) -} - -// TestBYTE is a paid mutator transaction binding the contract method 0x1de2f343. -// -// Solidity: function testBYTE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBYTE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBYTE(&_LoadTester.TransactOpts, x) -} - -// TestBlake2f is a paid mutator transaction binding the contract method 0xa040aec6. -// -// Solidity: function testBlake2f(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestBlake2f(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBlake2f", inputData) -} - -// TestBlake2f is a paid mutator transaction binding the contract method 0xa040aec6. -// -// Solidity: function testBlake2f(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestBlake2f(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestBlake2f(&_LoadTester.TransactOpts, inputData) -} - -// TestBlake2f is a paid mutator transaction binding the contract method 0xa040aec6. -// -// Solidity: function testBlake2f(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestBlake2f(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestBlake2f(&_LoadTester.TransactOpts, inputData) -} - -// TestCALLDATACOPY is a paid mutator transaction binding the contract method 0x3a425dfc. -// -// Solidity: function testCALLDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLDATACOPY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLDATACOPY", x) -} - -// TestCALLDATACOPY is a paid mutator transaction binding the contract method 0x3a425dfc. -// -// Solidity: function testCALLDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATACOPY is a paid mutator transaction binding the contract method 0x3a425dfc. -// -// Solidity: function testCALLDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATALOAD is a paid mutator transaction binding the contract method 0xce3cf4ef. -// -// Solidity: function testCALLDATALOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLDATALOAD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLDATALOAD", x) -} - -// TestCALLDATALOAD is a paid mutator transaction binding the contract method 0xce3cf4ef. -// -// Solidity: function testCALLDATALOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLDATALOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATALOAD(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATALOAD is a paid mutator transaction binding the contract method 0xce3cf4ef. -// -// Solidity: function testCALLDATALOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLDATALOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATALOAD(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATASIZE is a paid mutator transaction binding the contract method 0x034aef71. -// -// Solidity: function testCALLDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLDATASIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLDATASIZE", x) -} - -// TestCALLDATASIZE is a paid mutator transaction binding the contract method 0x034aef71. -// -// Solidity: function testCALLDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATASIZE is a paid mutator transaction binding the contract method 0x034aef71. -// -// Solidity: function testCALLDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestCALLER is a paid mutator transaction binding the contract method 0x44cf3bc7. -// -// Solidity: function testCALLER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLER(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLER", x) -} - -// TestCALLER is a paid mutator transaction binding the contract method 0x44cf3bc7. -// -// Solidity: function testCALLER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLER(&_LoadTester.TransactOpts, x) -} - -// TestCALLER is a paid mutator transaction binding the contract method 0x44cf3bc7. -// -// Solidity: function testCALLER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLER(&_LoadTester.TransactOpts, x) -} - -// TestCALLVALUE is a paid mutator transaction binding the contract method 0x1581cf19. -// -// Solidity: function testCALLVALUE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLVALUE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLVALUE", x) -} - -// TestCALLVALUE is a paid mutator transaction binding the contract method 0x1581cf19. -// -// Solidity: function testCALLVALUE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLVALUE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLVALUE(&_LoadTester.TransactOpts, x) -} - -// TestCALLVALUE is a paid mutator transaction binding the contract method 0x1581cf19. -// -// Solidity: function testCALLVALUE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLVALUE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLVALUE(&_LoadTester.TransactOpts, x) -} - -// TestCHAINID is a paid mutator transaction binding the contract method 0xa60a1087. -// -// Solidity: function testCHAINID(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCHAINID(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCHAINID", x) -} - -// TestCHAINID is a paid mutator transaction binding the contract method 0xa60a1087. -// -// Solidity: function testCHAINID(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCHAINID(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCHAINID(&_LoadTester.TransactOpts, x) -} - -// TestCHAINID is a paid mutator transaction binding the contract method 0xa60a1087. -// -// Solidity: function testCHAINID(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCHAINID(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCHAINID(&_LoadTester.TransactOpts, x) -} - -// TestCODECOPY is a paid mutator transaction binding the contract method 0xacaebdf6. -// -// Solidity: function testCODECOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCODECOPY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCODECOPY", x) -} - -// TestCODECOPY is a paid mutator transaction binding the contract method 0xacaebdf6. -// -// Solidity: function testCODECOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCODECOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODECOPY(&_LoadTester.TransactOpts, x) -} - -// TestCODECOPY is a paid mutator transaction binding the contract method 0xacaebdf6. -// -// Solidity: function testCODECOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCODECOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODECOPY(&_LoadTester.TransactOpts, x) -} - -// TestCODESIZE is a paid mutator transaction binding the contract method 0xb7b86207. -// -// Solidity: function testCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCODESIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCODESIZE", x) -} - -// TestCODESIZE is a paid mutator transaction binding the contract method 0xb7b86207. -// -// Solidity: function testCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestCODESIZE is a paid mutator transaction binding the contract method 0xb7b86207. -// -// Solidity: function testCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestCOINBASE is a paid mutator transaction binding the contract method 0xb81c1484. -// -// Solidity: function testCOINBASE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCOINBASE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCOINBASE", x) -} - -// TestCOINBASE is a paid mutator transaction binding the contract method 0xb81c1484. -// -// Solidity: function testCOINBASE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCOINBASE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCOINBASE(&_LoadTester.TransactOpts, x) -} - -// TestCOINBASE is a paid mutator transaction binding the contract method 0xb81c1484. -// -// Solidity: function testCOINBASE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCOINBASE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCOINBASE(&_LoadTester.TransactOpts, x) -} - -// TestDIFFICULTY is a paid mutator transaction binding the contract method 0x6f099c8d. -// -// Solidity: function testDIFFICULTY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestDIFFICULTY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testDIFFICULTY", x) -} - -// TestDIFFICULTY is a paid mutator transaction binding the contract method 0x6f099c8d. -// -// Solidity: function testDIFFICULTY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestDIFFICULTY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIFFICULTY(&_LoadTester.TransactOpts, x) -} - -// TestDIFFICULTY is a paid mutator transaction binding the contract method 0x6f099c8d. -// -// Solidity: function testDIFFICULTY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestDIFFICULTY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIFFICULTY(&_LoadTester.TransactOpts, x) -} - -// TestDIV is a paid mutator transaction binding the contract method 0x3a411f12. -// -// Solidity: function testDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestDIV(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testDIV", x) -} - -// TestDIV is a paid mutator transaction binding the contract method 0x3a411f12. -// -// Solidity: function testDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIV(&_LoadTester.TransactOpts, x) -} - -// TestDIV is a paid mutator transaction binding the contract method 0x3a411f12. -// -// Solidity: function testDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIV(&_LoadTester.TransactOpts, x) -} - -// TestECAdd is a paid mutator transaction binding the contract method 0xedf003cf. -// -// Solidity: function testECAdd(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestECAdd(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECAdd", inputData) -} - -// TestECAdd is a paid mutator transaction binding the contract method 0xedf003cf. -// -// Solidity: function testECAdd(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestECAdd(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECAdd(&_LoadTester.TransactOpts, inputData) -} - -// TestECAdd is a paid mutator transaction binding the contract method 0xedf003cf. -// -// Solidity: function testECAdd(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestECAdd(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECAdd(&_LoadTester.TransactOpts, inputData) -} - -// TestECMul is a paid mutator transaction binding the contract method 0x962e4dc2. -// -// Solidity: function testECMul(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestECMul(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECMul", inputData) -} - -// TestECMul is a paid mutator transaction binding the contract method 0x962e4dc2. -// -// Solidity: function testECMul(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestECMul(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECMul(&_LoadTester.TransactOpts, inputData) -} - -// TestECMul is a paid mutator transaction binding the contract method 0x962e4dc2. -// -// Solidity: function testECMul(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestECMul(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECMul(&_LoadTester.TransactOpts, inputData) -} - -// TestECPairing is a paid mutator transaction binding the contract method 0x0b3b996a. -// -// Solidity: function testECPairing(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestECPairing(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECPairing", inputData) -} - -// TestECPairing is a paid mutator transaction binding the contract method 0x0b3b996a. -// -// Solidity: function testECPairing(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestECPairing(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECPairing(&_LoadTester.TransactOpts, inputData) -} - -// TestECPairing is a paid mutator transaction binding the contract method 0x0b3b996a. -// -// Solidity: function testECPairing(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestECPairing(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECPairing(&_LoadTester.TransactOpts, inputData) -} - -// TestECRecover is a paid mutator transaction binding the contract method 0xa18683cb. -// -// Solidity: function testECRecover(bytes inputData) returns(address result) -func (_LoadTester *LoadTesterTransactor) TestECRecover(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECRecover", inputData) -} - -// TestECRecover is a paid mutator transaction binding the contract method 0xa18683cb. -// -// Solidity: function testECRecover(bytes inputData) returns(address result) -func (_LoadTester *LoadTesterSession) TestECRecover(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECRecover(&_LoadTester.TransactOpts, inputData) -} - -// TestECRecover is a paid mutator transaction binding the contract method 0xa18683cb. -// -// Solidity: function testECRecover(bytes inputData) returns(address result) -func (_LoadTester *LoadTesterTransactorSession) TestECRecover(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECRecover(&_LoadTester.TransactOpts, inputData) -} - -// TestEQ is a paid mutator transaction binding the contract method 0xe9f9b3f2. -// -// Solidity: function testEQ(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestEQ(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testEQ", x) -} - -// TestEQ is a paid mutator transaction binding the contract method 0xe9f9b3f2. -// -// Solidity: function testEQ(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestEQ(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEQ(&_LoadTester.TransactOpts, x) -} - -// TestEQ is a paid mutator transaction binding the contract method 0xe9f9b3f2. -// -// Solidity: function testEQ(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestEQ(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEQ(&_LoadTester.TransactOpts, x) -} - -// TestEXP is a paid mutator transaction binding the contract method 0xde97a363. -// -// Solidity: function testEXP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestEXP(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testEXP", x) -} - -// TestEXP is a paid mutator transaction binding the contract method 0xde97a363. -// -// Solidity: function testEXP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestEXP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXP(&_LoadTester.TransactOpts, x) -} - -// TestEXP is a paid mutator transaction binding the contract method 0xde97a363. -// -// Solidity: function testEXP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestEXP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXP(&_LoadTester.TransactOpts, x) -} - -// TestEXTCODESIZE is a paid mutator transaction binding the contract method 0xf58fc36a. -// -// Solidity: function testEXTCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestEXTCODESIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testEXTCODESIZE", x) -} - -// TestEXTCODESIZE is a paid mutator transaction binding the contract method 0xf58fc36a. -// -// Solidity: function testEXTCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestEXTCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXTCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestEXTCODESIZE is a paid mutator transaction binding the contract method 0xf58fc36a. -// -// Solidity: function testEXTCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestEXTCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXTCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestGAS is a paid mutator transaction binding the contract method 0x918a5fcd. -// -// Solidity: function testGAS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGAS(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGAS", x) -} - -// TestGAS is a paid mutator transaction binding the contract method 0x918a5fcd. -// -// Solidity: function testGAS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGAS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGAS(&_LoadTester.TransactOpts, x) -} - -// TestGAS is a paid mutator transaction binding the contract method 0x918a5fcd. -// -// Solidity: function testGAS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGAS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGAS(&_LoadTester.TransactOpts, x) -} - -// TestGASLIMIT is a paid mutator transaction binding the contract method 0x7c191d20. -// -// Solidity: function testGASLIMIT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGASLIMIT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGASLIMIT", x) -} - -// TestGASLIMIT is a paid mutator transaction binding the contract method 0x7c191d20. -// -// Solidity: function testGASLIMIT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGASLIMIT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASLIMIT(&_LoadTester.TransactOpts, x) -} - -// TestGASLIMIT is a paid mutator transaction binding the contract method 0x7c191d20. -// -// Solidity: function testGASLIMIT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGASLIMIT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASLIMIT(&_LoadTester.TransactOpts, x) -} - -// TestGASPRICE is a paid mutator transaction binding the contract method 0x4d2c74b3. -// -// Solidity: function testGASPRICE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGASPRICE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGASPRICE", x) -} - -// TestGASPRICE is a paid mutator transaction binding the contract method 0x4d2c74b3. -// -// Solidity: function testGASPRICE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGASPRICE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASPRICE(&_LoadTester.TransactOpts, x) -} - -// TestGASPRICE is a paid mutator transaction binding the contract method 0x4d2c74b3. -// -// Solidity: function testGASPRICE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGASPRICE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASPRICE(&_LoadTester.TransactOpts, x) -} - -// TestGT is a paid mutator transaction binding the contract method 0x71d91d28. -// -// Solidity: function testGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGT", x) -} - -// TestGT is a paid mutator transaction binding the contract method 0x71d91d28. -// -// Solidity: function testGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGT(&_LoadTester.TransactOpts, x) -} - -// TestGT is a paid mutator transaction binding the contract method 0x71d91d28. -// -// Solidity: function testGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGT(&_LoadTester.TransactOpts, x) -} - -// TestISZERO is a paid mutator transaction binding the contract method 0xf279ca81. -// -// Solidity: function testISZERO(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestISZERO(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testISZERO", x) -} - -// TestISZERO is a paid mutator transaction binding the contract method 0xf279ca81. -// -// Solidity: function testISZERO(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestISZERO(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestISZERO(&_LoadTester.TransactOpts, x) -} - -// TestISZERO is a paid mutator transaction binding the contract method 0xf279ca81. -// -// Solidity: function testISZERO(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestISZERO(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestISZERO(&_LoadTester.TransactOpts, x) -} - -// TestIdentity is a paid mutator transaction binding the contract method 0x9cce7cf9. -// -// Solidity: function testIdentity(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestIdentity(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testIdentity", inputData) -} - -// TestIdentity is a paid mutator transaction binding the contract method 0x9cce7cf9. -// -// Solidity: function testIdentity(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestIdentity(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestIdentity(&_LoadTester.TransactOpts, inputData) -} - -// TestIdentity is a paid mutator transaction binding the contract method 0x9cce7cf9. -// -// Solidity: function testIdentity(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestIdentity(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestIdentity(&_LoadTester.TransactOpts, inputData) -} - -// TestLOG0 is a paid mutator transaction binding the contract method 0x40fe2662. -// -// Solidity: function testLOG0(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG0(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG0", x) -} - -// TestLOG0 is a paid mutator transaction binding the contract method 0x40fe2662. -// -// Solidity: function testLOG0(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG0(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG0(&_LoadTester.TransactOpts, x) -} - -// TestLOG0 is a paid mutator transaction binding the contract method 0x40fe2662. -// -// Solidity: function testLOG0(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG0(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG0(&_LoadTester.TransactOpts, x) -} - -// TestLOG1 is a paid mutator transaction binding the contract method 0x98456f3e. -// -// Solidity: function testLOG1(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG1(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG1", x) -} - -// TestLOG1 is a paid mutator transaction binding the contract method 0x98456f3e. -// -// Solidity: function testLOG1(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG1(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG1(&_LoadTester.TransactOpts, x) -} - -// TestLOG1 is a paid mutator transaction binding the contract method 0x98456f3e. -// -// Solidity: function testLOG1(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG1(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG1(&_LoadTester.TransactOpts, x) -} - -// TestLOG2 is a paid mutator transaction binding the contract method 0xdd9bef60. -// -// Solidity: function testLOG2(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG2(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG2", x) -} - -// TestLOG2 is a paid mutator transaction binding the contract method 0xdd9bef60. -// -// Solidity: function testLOG2(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG2(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG2(&_LoadTester.TransactOpts, x) -} - -// TestLOG2 is a paid mutator transaction binding the contract method 0xdd9bef60. -// -// Solidity: function testLOG2(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG2(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG2(&_LoadTester.TransactOpts, x) -} - -// TestLOG3 is a paid mutator transaction binding the contract method 0xbf529ca1. -// -// Solidity: function testLOG3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG3(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG3", x) -} - -// TestLOG3 is a paid mutator transaction binding the contract method 0xbf529ca1. -// -// Solidity: function testLOG3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG3(&_LoadTester.TransactOpts, x) -} - -// TestLOG3 is a paid mutator transaction binding the contract method 0xbf529ca1. -// -// Solidity: function testLOG3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG3(&_LoadTester.TransactOpts, x) -} - -// TestLOG4 is a paid mutator transaction binding the contract method 0x1aba07ea. -// -// Solidity: function testLOG4(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG4(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG4", x) -} - -// TestLOG4 is a paid mutator transaction binding the contract method 0x1aba07ea. -// -// Solidity: function testLOG4(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG4(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG4(&_LoadTester.TransactOpts, x) -} - -// TestLOG4 is a paid mutator transaction binding the contract method 0x1aba07ea. -// -// Solidity: function testLOG4(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG4(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG4(&_LoadTester.TransactOpts, x) -} - -// TestLT is a paid mutator transaction binding the contract method 0x6e7f1fe7. -// -// Solidity: function testLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLT", x) -} - -// TestLT is a paid mutator transaction binding the contract method 0x6e7f1fe7. -// -// Solidity: function testLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLT(&_LoadTester.TransactOpts, x) -} - -// TestLT is a paid mutator transaction binding the contract method 0x6e7f1fe7. -// -// Solidity: function testLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLT(&_LoadTester.TransactOpts, x) -} - -// TestMLOAD is a paid mutator transaction binding the contract method 0x5590c2d9. -// -// Solidity: function testMLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMLOAD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMLOAD", x) -} - -// TestMLOAD is a paid mutator transaction binding the contract method 0x5590c2d9. -// -// Solidity: function testMLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMLOAD(&_LoadTester.TransactOpts, x) -} - -// TestMLOAD is a paid mutator transaction binding the contract method 0x5590c2d9. -// -// Solidity: function testMLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMLOAD(&_LoadTester.TransactOpts, x) -} - -// TestMOD is a paid mutator transaction binding the contract method 0x16582150. -// -// Solidity: function testMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMOD", x) -} - -// TestMOD is a paid mutator transaction binding the contract method 0x16582150. -// -// Solidity: function testMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMOD(&_LoadTester.TransactOpts, x) -} - -// TestMOD is a paid mutator transaction binding the contract method 0x16582150. -// -// Solidity: function testMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMOD(&_LoadTester.TransactOpts, x) -} - -// TestMSIZE is a paid mutator transaction binding the contract method 0xb3d847f2. -// -// Solidity: function testMSIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMSIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMSIZE", x) -} - -// TestMSIZE is a paid mutator transaction binding the contract method 0xb3d847f2. -// -// Solidity: function testMSIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMSIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSIZE(&_LoadTester.TransactOpts, x) -} - -// TestMSIZE is a paid mutator transaction binding the contract method 0xb3d847f2. -// -// Solidity: function testMSIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMSIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSIZE(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE is a paid mutator transaction binding the contract method 0x087b4e84. -// -// Solidity: function testMSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMSTORE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMSTORE", x) -} - -// TestMSTORE is a paid mutator transaction binding the contract method 0x087b4e84. -// -// Solidity: function testMSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE is a paid mutator transaction binding the contract method 0x087b4e84. -// -// Solidity: function testMSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE8 is a paid mutator transaction binding the contract method 0x4a61af1f. -// -// Solidity: function testMSTORE8(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMSTORE8(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMSTORE8", x) -} - -// TestMSTORE8 is a paid mutator transaction binding the contract method 0x4a61af1f. -// -// Solidity: function testMSTORE8(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMSTORE8(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE8(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE8 is a paid mutator transaction binding the contract method 0x4a61af1f. -// -// Solidity: function testMSTORE8(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMSTORE8(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE8(&_LoadTester.TransactOpts, x) -} - -// TestMUL is a paid mutator transaction binding the contract method 0x7de8c6f8. -// -// Solidity: function testMUL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMUL(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMUL", x) -} - -// TestMUL is a paid mutator transaction binding the contract method 0x7de8c6f8. -// -// Solidity: function testMUL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMUL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMUL(&_LoadTester.TransactOpts, x) -} - -// TestMUL is a paid mutator transaction binding the contract method 0x7de8c6f8. -// -// Solidity: function testMUL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMUL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMUL(&_LoadTester.TransactOpts, x) -} - -// TestMULMOD is a paid mutator transaction binding the contract method 0xfde7721c. -// -// Solidity: function testMULMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMULMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMULMOD", x) -} - -// TestMULMOD is a paid mutator transaction binding the contract method 0xfde7721c. -// -// Solidity: function testMULMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMULMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMULMOD(&_LoadTester.TransactOpts, x) -} - -// TestMULMOD is a paid mutator transaction binding the contract method 0xfde7721c. -// -// Solidity: function testMULMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMULMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMULMOD(&_LoadTester.TransactOpts, x) -} - -// TestModExp is a paid mutator transaction binding the contract method 0x613d0a82. -// -// Solidity: function testModExp(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestModExp(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testModExp", inputData) -} - -// TestModExp is a paid mutator transaction binding the contract method 0x613d0a82. -// -// Solidity: function testModExp(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestModExp(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestModExp(&_LoadTester.TransactOpts, inputData) -} - -// TestModExp is a paid mutator transaction binding the contract method 0x613d0a82. -// -// Solidity: function testModExp(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestModExp(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestModExp(&_LoadTester.TransactOpts, inputData) -} - -// TestNOT is a paid mutator transaction binding the contract method 0x91e7b277. -// -// Solidity: function testNOT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestNOT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testNOT", x) -} - -// TestNOT is a paid mutator transaction binding the contract method 0x91e7b277. -// -// Solidity: function testNOT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestNOT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNOT(&_LoadTester.TransactOpts, x) -} - -// TestNOT is a paid mutator transaction binding the contract method 0x91e7b277. -// -// Solidity: function testNOT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestNOT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNOT(&_LoadTester.TransactOpts, x) -} - -// TestNUMBER is a paid mutator transaction binding the contract method 0x2d34e798. -// -// Solidity: function testNUMBER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestNUMBER(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testNUMBER", x) -} - -// TestNUMBER is a paid mutator transaction binding the contract method 0x2d34e798. -// -// Solidity: function testNUMBER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestNUMBER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNUMBER(&_LoadTester.TransactOpts, x) -} - -// TestNUMBER is a paid mutator transaction binding the contract method 0x2d34e798. -// -// Solidity: function testNUMBER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestNUMBER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNUMBER(&_LoadTester.TransactOpts, x) -} - -// TestOR is a paid mutator transaction binding the contract method 0x135d52f7. -// -// Solidity: function testOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestOR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testOR", x) -} - -// TestOR is a paid mutator transaction binding the contract method 0x135d52f7. -// -// Solidity: function testOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestOR(&_LoadTester.TransactOpts, x) -} - -// TestOR is a paid mutator transaction binding the contract method 0x135d52f7. -// -// Solidity: function testOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestOR(&_LoadTester.TransactOpts, x) -} - -// TestORIGIN is a paid mutator transaction binding the contract method 0x050082f8. -// -// Solidity: function testORIGIN(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestORIGIN(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testORIGIN", x) -} - -// TestORIGIN is a paid mutator transaction binding the contract method 0x050082f8. -// -// Solidity: function testORIGIN(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestORIGIN(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestORIGIN(&_LoadTester.TransactOpts, x) -} - -// TestORIGIN is a paid mutator transaction binding the contract method 0x050082f8. -// -// Solidity: function testORIGIN(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestORIGIN(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestORIGIN(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATACOPY is a paid mutator transaction binding the contract method 0x7b6e0b0e. -// -// Solidity: function testRETURNDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestRETURNDATACOPY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testRETURNDATACOPY", x) -} - -// TestRETURNDATACOPY is a paid mutator transaction binding the contract method 0x7b6e0b0e. -// -// Solidity: function testRETURNDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestRETURNDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATACOPY is a paid mutator transaction binding the contract method 0x7b6e0b0e. -// -// Solidity: function testRETURNDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestRETURNDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATASIZE is a paid mutator transaction binding the contract method 0x2b21ef44. -// -// Solidity: function testRETURNDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestRETURNDATASIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testRETURNDATASIZE", x) -} - -// TestRETURNDATASIZE is a paid mutator transaction binding the contract method 0x2b21ef44. -// -// Solidity: function testRETURNDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestRETURNDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATASIZE is a paid mutator transaction binding the contract method 0x2b21ef44. -// -// Solidity: function testRETURNDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestRETURNDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestRipemd160 is a paid mutator transaction binding the contract method 0xf6b0bbf7. -// -// Solidity: function testRipemd160(bytes inputData) returns(bytes20 result) -func (_LoadTester *LoadTesterTransactor) TestRipemd160(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testRipemd160", inputData) -} - -// TestRipemd160 is a paid mutator transaction binding the contract method 0xf6b0bbf7. -// -// Solidity: function testRipemd160(bytes inputData) returns(bytes20 result) -func (_LoadTester *LoadTesterSession) TestRipemd160(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestRipemd160(&_LoadTester.TransactOpts, inputData) -} - -// TestRipemd160 is a paid mutator transaction binding the contract method 0xf6b0bbf7. -// -// Solidity: function testRipemd160(bytes inputData) returns(bytes20 result) -func (_LoadTester *LoadTesterTransactorSession) TestRipemd160(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestRipemd160(&_LoadTester.TransactOpts, inputData) -} - -// TestSAR is a paid mutator transaction binding the contract method 0x60e13cde. -// -// Solidity: function testSAR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSAR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSAR", x) -} - -// TestSAR is a paid mutator transaction binding the contract method 0x60e13cde. -// -// Solidity: function testSAR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSAR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSAR(&_LoadTester.TransactOpts, x) -} - -// TestSAR is a paid mutator transaction binding the contract method 0x60e13cde. -// -// Solidity: function testSAR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSAR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSAR(&_LoadTester.TransactOpts, x) -} - -// TestSDIV is a paid mutator transaction binding the contract method 0xa645c9c2. -// -// Solidity: function testSDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSDIV(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSDIV", x) -} - -// TestSDIV is a paid mutator transaction binding the contract method 0xa645c9c2. -// -// Solidity: function testSDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSDIV(&_LoadTester.TransactOpts, x) -} - -// TestSDIV is a paid mutator transaction binding the contract method 0xa645c9c2. -// -// Solidity: function testSDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSDIV(&_LoadTester.TransactOpts, x) -} - -// TestSELFBALANCE is a paid mutator transaction binding the contract method 0xc420eb61. -// -// Solidity: function testSELFBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSELFBALANCE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSELFBALANCE", x) -} - -// TestSELFBALANCE is a paid mutator transaction binding the contract method 0xc420eb61. -// -// Solidity: function testSELFBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSELFBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSELFBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestSELFBALANCE is a paid mutator transaction binding the contract method 0xc420eb61. -// -// Solidity: function testSELFBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSELFBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSELFBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestSGT is a paid mutator transaction binding the contract method 0x18093b46. -// -// Solidity: function testSGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSGT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSGT", x) -} - -// TestSGT is a paid mutator transaction binding the contract method 0x18093b46. -// -// Solidity: function testSGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSGT(&_LoadTester.TransactOpts, x) -} - -// TestSGT is a paid mutator transaction binding the contract method 0x18093b46. -// -// Solidity: function testSGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSGT(&_LoadTester.TransactOpts, x) -} - -// TestSHA256 is a paid mutator transaction binding the contract method 0x63138d4f. -// -// Solidity: function testSHA256(bytes inputData) returns(bytes32 result) -func (_LoadTester *LoadTesterTransactor) TestSHA256(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHA256", inputData) -} - -// TestSHA256 is a paid mutator transaction binding the contract method 0x63138d4f. -// -// Solidity: function testSHA256(bytes inputData) returns(bytes32 result) -func (_LoadTester *LoadTesterSession) TestSHA256(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA256(&_LoadTester.TransactOpts, inputData) -} - -// TestSHA256 is a paid mutator transaction binding the contract method 0x63138d4f. -// -// Solidity: function testSHA256(bytes inputData) returns(bytes32 result) -func (_LoadTester *LoadTesterTransactorSession) TestSHA256(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA256(&_LoadTester.TransactOpts, inputData) -} - -// TestSHA3 is a paid mutator transaction binding the contract method 0x19b621d6. -// -// Solidity: function testSHA3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSHA3(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHA3", x) -} - -// TestSHA3 is a paid mutator transaction binding the contract method 0x19b621d6. -// -// Solidity: function testSHA3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSHA3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA3(&_LoadTester.TransactOpts, x) -} - -// TestSHA3 is a paid mutator transaction binding the contract method 0x19b621d6. -// -// Solidity: function testSHA3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSHA3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA3(&_LoadTester.TransactOpts, x) -} - -// TestSHL is a paid mutator transaction binding the contract method 0x2007332e. -// -// Solidity: function testSHL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSHL(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHL", x) -} - -// TestSHL is a paid mutator transaction binding the contract method 0x2007332e. -// -// Solidity: function testSHL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSHL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHL(&_LoadTester.TransactOpts, x) -} - -// TestSHL is a paid mutator transaction binding the contract method 0x2007332e. -// -// Solidity: function testSHL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSHL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHL(&_LoadTester.TransactOpts, x) -} - -// TestSHR is a paid mutator transaction binding the contract method 0xc4bd65d5. -// -// Solidity: function testSHR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSHR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHR", x) -} - -// TestSHR is a paid mutator transaction binding the contract method 0xc4bd65d5. -// -// Solidity: function testSHR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSHR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHR(&_LoadTester.TransactOpts, x) -} - -// TestSHR is a paid mutator transaction binding the contract method 0xc4bd65d5. -// -// Solidity: function testSHR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSHR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHR(&_LoadTester.TransactOpts, x) -} - -// TestSIGNEXTEND is a paid mutator transaction binding the contract method 0xc360aba6. -// -// Solidity: function testSIGNEXTEND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSIGNEXTEND(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSIGNEXTEND", x) -} - -// TestSIGNEXTEND is a paid mutator transaction binding the contract method 0xc360aba6. -// -// Solidity: function testSIGNEXTEND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSIGNEXTEND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSIGNEXTEND(&_LoadTester.TransactOpts, x) -} - -// TestSIGNEXTEND is a paid mutator transaction binding the contract method 0xc360aba6. -// -// Solidity: function testSIGNEXTEND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSIGNEXTEND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSIGNEXTEND(&_LoadTester.TransactOpts, x) -} - -// TestSLOAD is a paid mutator transaction binding the contract method 0x880eff39. -// -// Solidity: function testSLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSLOAD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSLOAD", x) -} - -// TestSLOAD is a paid mutator transaction binding the contract method 0x880eff39. -// -// Solidity: function testSLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLOAD(&_LoadTester.TransactOpts, x) -} - -// TestSLOAD is a paid mutator transaction binding the contract method 0x880eff39. -// -// Solidity: function testSLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLOAD(&_LoadTester.TransactOpts, x) -} - -// TestSLT is a paid mutator transaction binding the contract method 0xf4d1fc61. -// -// Solidity: function testSLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSLT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSLT", x) -} - -// TestSLT is a paid mutator transaction binding the contract method 0xf4d1fc61. -// -// Solidity: function testSLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLT(&_LoadTester.TransactOpts, x) -} - -// TestSLT is a paid mutator transaction binding the contract method 0xf4d1fc61. -// -// Solidity: function testSLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLT(&_LoadTester.TransactOpts, x) -} - -// TestSMOD is a paid mutator transaction binding the contract method 0xd93cd558. -// -// Solidity: function testSMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSMOD", x) -} - -// TestSMOD is a paid mutator transaction binding the contract method 0xd93cd558. -// -// Solidity: function testSMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSMOD(&_LoadTester.TransactOpts, x) -} - -// TestSMOD is a paid mutator transaction binding the contract method 0xd93cd558. -// -// Solidity: function testSMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSMOD(&_LoadTester.TransactOpts, x) -} - -// TestSSTORE is a paid mutator transaction binding the contract method 0xd117320b. -// -// Solidity: function testSSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSSTORE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSSTORE", x) -} - -// TestSSTORE is a paid mutator transaction binding the contract method 0xd117320b. -// -// Solidity: function testSSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSSTORE(&_LoadTester.TransactOpts, x) -} - -// TestSSTORE is a paid mutator transaction binding the contract method 0xd117320b. -// -// Solidity: function testSSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSSTORE(&_LoadTester.TransactOpts, x) -} - -// TestSUB is a paid mutator transaction binding the contract method 0xd53ff3fd. -// -// Solidity: function testSUB(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSUB(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSUB", x) -} - -// TestSUB is a paid mutator transaction binding the contract method 0xd53ff3fd. -// -// Solidity: function testSUB(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSUB(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSUB(&_LoadTester.TransactOpts, x) -} - -// TestSUB is a paid mutator transaction binding the contract method 0xd53ff3fd. -// -// Solidity: function testSUB(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSUB(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSUB(&_LoadTester.TransactOpts, x) -} - -// TestTIMESTAMP is a paid mutator transaction binding the contract method 0x219cddeb. -// -// Solidity: function testTIMESTAMP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestTIMESTAMP(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testTIMESTAMP", x) -} - -// TestTIMESTAMP is a paid mutator transaction binding the contract method 0x219cddeb. -// -// Solidity: function testTIMESTAMP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestTIMESTAMP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestTIMESTAMP(&_LoadTester.TransactOpts, x) -} - -// TestTIMESTAMP is a paid mutator transaction binding the contract method 0x219cddeb. -// -// Solidity: function testTIMESTAMP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestTIMESTAMP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestTIMESTAMP(&_LoadTester.TransactOpts, x) -} - -// TestXOR is a paid mutator transaction binding the contract method 0xd51e7b5b. -// -// Solidity: function testXOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestXOR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testXOR", x) -} - -// TestXOR is a paid mutator transaction binding the contract method 0xd51e7b5b. -// -// Solidity: function testXOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestXOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestXOR(&_LoadTester.TransactOpts, x) -} - -// TestXOR is a paid mutator transaction binding the contract method 0xd51e7b5b. -// -// Solidity: function testXOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestXOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestXOR(&_LoadTester.TransactOpts, x) -} diff --git a/cmd/loadtest/uniswapv3/types.go b/contracts/types.go similarity index 60% rename from cmd/loadtest/uniswapv3/types.go rename to contracts/types.go index a6e6e62b..a95ff55d 100644 --- a/cmd/loadtest/uniswapv3/types.go +++ b/contracts/types.go @@ -1,4 +1,4 @@ -package uniswapv3loadtest +package contracts import ( "context" @@ -6,6 +6,6 @@ import ( "github.com/ethereum/go-ethereum/ethclient" ) -// blockUntilSuccessfulFn is designed to wait until a specified number of Ethereum blocks have been +// BlockUntilSuccessfulFn is designed to wait until a specified number of Ethereum blocks have been // mined, periodically checking for the completion of a given function within each block interval. -type blockUntilSuccessfulFn func(ctx context.Context, c *ethclient.Client, f func() error) error +type BlockUntilSuccessfulFn func(ctx context.Context, c *ethclient.Client, f func() error) error diff --git a/doc/polycli_rpcfuzz.md b/doc/polycli_rpcfuzz.md index da2c9bb3..3bba32f8 100644 --- a/doc/polycli_rpcfuzz.md +++ b/doc/polycli_rpcfuzz.md @@ -103,7 +103,7 @@ $ docker run -v $PWD/contracts:/contracts ethereum/solc:stable --storage-layout ## Flags ```bash - --contract-address string The address of a contract that can be used for testing (default "0x6fda56c57b0acadb96ed5624ac500c0429d59429") + --contract-address string The address of a contract that can be used for testing. If not specified, a contract will be deployed automatically. --csv Flag to indicate that output will be exported as a CSV. --export-path string The directory export path of the output of the tests. Must pair this with either --json, --csv, --md, or --html --fuzz Flag to indicate whether to fuzz input or not. diff --git a/rpctypes/schemas/README.org b/rpctypes/jsonschemas/README.org similarity index 80% rename from rpctypes/schemas/README.org rename to rpctypes/jsonschemas/README.org index b5e5dfb5..c4e3cb9b 100644 --- a/rpctypes/schemas/README.org +++ b/rpctypes/jsonschemas/README.org @@ -15,3 +15,10 @@ into unique schemas for simplicity. cat openrpc.json | jq '.methods[].name' | sort cat openrpc.json | jq '.methods[] | select(.name == "eth_syncing") | .result.schema' #+END_SRC + +Or you can run the following from project root folder: + +#+BEGIN_SRC bash +make gen-json-rpctypes +#+END_SRC + diff --git a/rpctypes/jsonschemas/debug_getBadBlocks.json b/rpctypes/jsonschemas/debug_getBadBlocks.json new file mode 100644 index 00000000..03b6a9e2 --- /dev/null +++ b/rpctypes/jsonschemas/debug_getBadBlocks.json @@ -0,0 +1,731 @@ +{ + "title": "Bad block array", + "type": "array", + "items": { + "title": "Bad block", + "type": "object", + "required": [ + "block", + "hash", + "rlp" + ], + "additionalProperties": false, + "properties": { + "block": { + "title": "Block", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "rlp": { + "title": "RLP", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } +} diff --git a/rpctypes/jsonschemas/debug_getRawBlock.json b/rpctypes/jsonschemas/debug_getRawBlock.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/debug_getRawBlock.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/debug_getRawHeader.json b/rpctypes/jsonschemas/debug_getRawHeader.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/debug_getRawHeader.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/schemas/rpcschemahexarray.json b/rpctypes/jsonschemas/debug_getRawReceipts.json similarity index 100% rename from rpctypes/schemas/rpcschemahexarray.json rename to rpctypes/jsonschemas/debug_getRawReceipts.json diff --git a/rpctypes/jsonschemas/debug_getRawTransaction.json b/rpctypes/jsonschemas/debug_getRawTransaction.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/debug_getRawTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/engine_exchangeCapabilities.json b/rpctypes/jsonschemas/engine_exchangeCapabilities.json new file mode 100644 index 00000000..53b04f82 --- /dev/null +++ b/rpctypes/jsonschemas/engine_exchangeCapabilities.json @@ -0,0 +1,6 @@ +{ + "type": "array", + "items": { + "type": "string" + } +} diff --git a/rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json b/rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json new file mode 100644 index 00000000..809fac5c --- /dev/null +++ b/rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json @@ -0,0 +1,26 @@ +{ + "title": "Transition configuration object", + "type": "object", + "required": [ + "terminalTotalDifficulty", + "terminalBlockHash", + "terminalBlockNumber" + ], + "properties": { + "terminalTotalDifficulty": { + "title": "Terminal total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "terminalBlockHash": { + "title": "Terminal block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "terminalBlockNumber": { + "title": "Terminal block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json new file mode 100644 index 00000000..f45103b7 --- /dev/null +++ b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json @@ -0,0 +1,42 @@ +{ + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json new file mode 100644 index 00000000..f45103b7 --- /dev/null +++ b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json @@ -0,0 +1,42 @@ +{ + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json new file mode 100644 index 00000000..f45103b7 --- /dev/null +++ b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json @@ -0,0 +1,42 @@ +{ + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json b/rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json new file mode 100644 index 00000000..7738d7d9 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json @@ -0,0 +1,60 @@ +{ + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json b/rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json new file mode 100644 index 00000000..7738d7d9 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json @@ -0,0 +1,60 @@ +{ + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadV1.json b/rpctypes/jsonschemas/engine_getPayloadV1.json new file mode 100644 index 00000000..11c5b1f2 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadV1.json @@ -0,0 +1,96 @@ +{ + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadV2.json b/rpctypes/jsonschemas/engine_getPayloadV2.json new file mode 100644 index 00000000..b52a5186 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadV2.json @@ -0,0 +1,248 @@ +{ + "type": "object", + "required": [ + "executionPayload", + "blockValue" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "oneOf": [ + { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + { + "title": "Execution payload object V2", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + ] + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadV3.json b/rpctypes/jsonschemas/engine_getPayloadV3.json new file mode 100644 index 00000000..9d3a8e89 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadV3.json @@ -0,0 +1,203 @@ +{ + "type": "object", + "required": [ + "executionPayload", + "blockValue", + "blobsBundle", + "shouldOverrideBuilder" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals", + "blobGasUsed", + "excessBlobGas" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blobsBundle": { + "title": "Blobs bundle", + "type": "object", + "required": [ + "commitments", + "proofs", + "blobs" + ], + "properties": { + "commitments": { + "title": "Commitments", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "proofs": { + "title": "Proofs", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "blobs": { + "title": "Blobs", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + "shouldOverrideBuilder": { + "title": "Should override builder flag", + "type": "boolean" + } + } +} diff --git a/rpctypes/jsonschemas/engine_newPayloadV1.json b/rpctypes/jsonschemas/engine_newPayloadV1.json new file mode 100644 index 00000000..a088aa2a --- /dev/null +++ b/rpctypes/jsonschemas/engine_newPayloadV1.json @@ -0,0 +1,29 @@ +{ + "title": "Payload status object V1", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED", + "INVALID_BLOCK_HASH" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } +} diff --git a/rpctypes/jsonschemas/engine_newPayloadV2.json b/rpctypes/jsonschemas/engine_newPayloadV2.json new file mode 100644 index 00000000..31a8a13f --- /dev/null +++ b/rpctypes/jsonschemas/engine_newPayloadV2.json @@ -0,0 +1,28 @@ +{ + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } +} diff --git a/rpctypes/jsonschemas/engine_newPayloadV3.json b/rpctypes/jsonschemas/engine_newPayloadV3.json new file mode 100644 index 00000000..31a8a13f --- /dev/null +++ b/rpctypes/jsonschemas/engine_newPayloadV3.json @@ -0,0 +1,28 @@ +{ + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } +} diff --git a/rpctypes/schemas/rpcschemaaccountlist.json b/rpctypes/jsonschemas/eth_accounts.json similarity index 100% rename from rpctypes/schemas/rpcschemaaccountlist.json rename to rpctypes/jsonschemas/eth_accounts.json diff --git a/rpctypes/jsonschemas/eth_blockNumber.json b/rpctypes/jsonschemas/eth_blockNumber.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_blockNumber.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_call.json b/rpctypes/jsonschemas/eth_call.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_call.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/eth_chainId.json b/rpctypes/jsonschemas/eth_chainId.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_chainId.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_coinbase.json b/rpctypes/jsonschemas/eth_coinbase.json new file mode 100644 index 00000000..b551ac82 --- /dev/null +++ b/rpctypes/jsonschemas/eth_coinbase.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" +} diff --git a/rpctypes/schemas/rpcschemaethaccesslist.json b/rpctypes/jsonschemas/eth_createAccessList.json similarity index 92% rename from rpctypes/schemas/rpcschemaethaccesslist.json rename to rpctypes/jsonschemas/eth_createAccessList.json index 7532d398..eed03d51 100644 --- a/rpctypes/schemas/rpcschemaethaccesslist.json +++ b/rpctypes/jsonschemas/eth_createAccessList.json @@ -1,6 +1,7 @@ { "title": "Access list result", "type": "object", + "additionalProperties": false, "properties": { "accessList": { "title": "accessList", @@ -8,6 +9,7 @@ "items": { "title": "Access list entry", "type": "object", + "additionalProperties": false, "properties": { "address": { "title": "hex encoded address", diff --git a/rpctypes/jsonschemas/eth_estimateGas.json b/rpctypes/jsonschemas/eth_estimateGas.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_estimateGas.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/schemas/rpcschemaethfeehistory.json b/rpctypes/jsonschemas/eth_feeHistory.json similarity index 81% rename from rpctypes/schemas/rpcschemaethfeehistory.json rename to rpctypes/jsonschemas/eth_feeHistory.json index d77f6437..db3061f0 100644 --- a/rpctypes/schemas/rpcschemaethfeehistory.json +++ b/rpctypes/jsonschemas/eth_feeHistory.json @@ -7,6 +7,7 @@ "baseFeePerGas", "gasUsedRatio" ], + "additionalProperties": false, "properties": { "oldestBlock": { "title": "oldestBlock", @@ -24,6 +25,17 @@ "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" } }, + "gasUsedRatio": { + "title": "gasUsedRatio", + "description": "An array of block gas used ratios. These are calculated as the ratio of gasUsed and gasLimit.", + "type": "array", + "items": { + "title": "normalized ratio", + "type": "number", + "minimum": 0, + "maximum": 1 + } + }, "reward": { "title": "rewardArray", "description": "A two-dimensional array of effective priority fees per gas at the requested block percentiles.", diff --git a/rpctypes/jsonschemas/eth_gasPrice.json b/rpctypes/jsonschemas/eth_gasPrice.json new file mode 100644 index 00000000..289c0810 --- /dev/null +++ b/rpctypes/jsonschemas/eth_gasPrice.json @@ -0,0 +1,5 @@ +{ + "title": "Gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_getBalance.json b/rpctypes/jsonschemas/eth_getBalance.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBalance.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_getBlockByHash.json b/rpctypes/jsonschemas/eth_getBlockByHash.json new file mode 100644 index 00000000..7298d4c3 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockByHash.json @@ -0,0 +1,713 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockByNumber.json b/rpctypes/jsonschemas/eth_getBlockByNumber.json new file mode 100644 index 00000000..7298d4c3 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockByNumber.json @@ -0,0 +1,713 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockReceipts.json b/rpctypes/jsonschemas/eth_getBlockReceipts.json new file mode 100644 index 00000000..8090542e --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockReceipts.json @@ -0,0 +1,200 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Receipts information", + "type": "array", + "items": { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json b/rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json new file mode 100644 index 00000000..b894ff02 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json b/rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json new file mode 100644 index 00000000..b894ff02 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getCode.json b/rpctypes/jsonschemas/eth_getCode.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getCode.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/schemas/rpcschemafilterchanges.json b/rpctypes/jsonschemas/eth_getFilterChanges.json similarity index 98% rename from rpctypes/schemas/rpcschemafilterchanges.json rename to rpctypes/jsonschemas/eth_getFilterChanges.json index a19d0bad..d99dfae6 100644 --- a/rpctypes/schemas/rpcschemafilterchanges.json +++ b/rpctypes/jsonschemas/eth_getFilterChanges.json @@ -28,6 +28,7 @@ "required": [ "transactionHash" ], + "additionalProperties": false, "properties": { "removed": { "title": "removed", diff --git a/rpctypes/jsonschemas/eth_getFilterLogs.json b/rpctypes/jsonschemas/eth_getFilterLogs.json new file mode 100644 index 00000000..d99dfae6 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getFilterLogs.json @@ -0,0 +1,85 @@ +{ + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getLogs.json b/rpctypes/jsonschemas/eth_getLogs.json new file mode 100644 index 00000000..d99dfae6 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getLogs.json @@ -0,0 +1,85 @@ +{ + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] +} diff --git a/rpctypes/schemas/rpcschemaethproof.json b/rpctypes/jsonschemas/eth_getProof.json similarity index 96% rename from rpctypes/schemas/rpcschemaethproof.json rename to rpctypes/jsonschemas/eth_getProof.json index 61021867..4828969c 100644 --- a/rpctypes/schemas/rpcschemaethproof.json +++ b/rpctypes/jsonschemas/eth_getProof.json @@ -10,6 +10,7 @@ "storageHash", "storageProof" ], + "additionalProperties": false, "properties": { "address": { "title": "address", @@ -56,6 +57,7 @@ "value", "proof" ], + "additionalProperties": false, "properties": { "key": { "title": "key", diff --git a/rpctypes/jsonschemas/eth_getStorageAt.json b/rpctypes/jsonschemas/eth_getStorageAt.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getStorageAt.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json b/rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json new file mode 100644 index 00000000..5d1b9916 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json @@ -0,0 +1,508 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json b/rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json new file mode 100644 index 00000000..5d1b9916 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json @@ -0,0 +1,508 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getTransactionByHash.json b/rpctypes/jsonschemas/eth_getTransactionByHash.json new file mode 100644 index 00000000..5d1b9916 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionByHash.json @@ -0,0 +1,508 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getTransactionCount.json b/rpctypes/jsonschemas/eth_getTransactionCount.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionCount.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_getTransactionReceipt.json b/rpctypes/jsonschemas/eth_getTransactionReceipt.json new file mode 100644 index 00000000..f92ffee5 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionReceipt.json @@ -0,0 +1,196 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json b/rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json new file mode 100644 index 00000000..4558d3de --- /dev/null +++ b/rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json b/rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json new file mode 100644 index 00000000..4558d3de --- /dev/null +++ b/rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json b/rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json new file mode 100644 index 00000000..7313b519 --- /dev/null +++ b/rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json @@ -0,0 +1,5 @@ +{ + "title": "Max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_newBlockFilter.json b/rpctypes/jsonschemas/eth_newBlockFilter.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_newBlockFilter.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_newFilter.json b/rpctypes/jsonschemas/eth_newFilter.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_newFilter.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_newPendingTransactionFilter.json b/rpctypes/jsonschemas/eth_newPendingTransactionFilter.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_newPendingTransactionFilter.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_sendRawTransaction.json b/rpctypes/jsonschemas/eth_sendRawTransaction.json new file mode 100644 index 00000000..ba347e08 --- /dev/null +++ b/rpctypes/jsonschemas/eth_sendRawTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" +} diff --git a/rpctypes/jsonschemas/eth_sendTransaction.json b/rpctypes/jsonschemas/eth_sendTransaction.json new file mode 100644 index 00000000..ba347e08 --- /dev/null +++ b/rpctypes/jsonschemas/eth_sendTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" +} diff --git a/rpctypes/jsonschemas/eth_sign.json b/rpctypes/jsonschemas/eth_sign.json new file mode 100644 index 00000000..a8ba4b7a --- /dev/null +++ b/rpctypes/jsonschemas/eth_sign.json @@ -0,0 +1,5 @@ +{ + "title": "65 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{130}$" +} diff --git a/rpctypes/jsonschemas/eth_signTransaction.json b/rpctypes/jsonschemas/eth_signTransaction.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_signTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/schemas/rpcschemaethsyncing.json b/rpctypes/jsonschemas/eth_syncing.json similarity index 95% rename from rpctypes/schemas/rpcschemaethsyncing.json rename to rpctypes/jsonschemas/eth_syncing.json index c6a3a17b..cafaaaa9 100644 --- a/rpctypes/schemas/rpcschemaethsyncing.json +++ b/rpctypes/jsonschemas/eth_syncing.json @@ -4,6 +4,7 @@ { "title": "Syncing progress", "type": "object", + "additionalProperties": false, "properties": { "startingBlock": { "title": "Starting block", diff --git a/rpctypes/jsonschemas/eth_uninstallFilter.json b/rpctypes/jsonschemas/eth_uninstallFilter.json new file mode 100644 index 00000000..dd97725d --- /dev/null +++ b/rpctypes/jsonschemas/eth_uninstallFilter.json @@ -0,0 +1,3 @@ +{ + "type": "boolean" +} diff --git a/rpctypes/jsonschemas/openrpc.json b/rpctypes/jsonschemas/openrpc.json new file mode 100644 index 00000000..8dbdb117 --- /dev/null +++ b/rpctypes/jsonschemas/openrpc.json @@ -0,0 +1,9443 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Ethereum JSON-RPC Specification", + "description": "A specification of the standard interface for Ethereum clients.", + "license": { + "name": "CC0-1.0", + "url": "https://creativecommons.org/publicdomain/zero/1.0/legalcode" + }, + "version": "0.0.0" + }, + "methods": [ + { + "name": "debug_getBadBlocks", + "summary": "Returns an array of recent bad blocks that the client has seen on the network.", + "params": [], + "result": { + "name": "Blocks", + "schema": { + "title": "Bad block array", + "type": "array", + "items": { + "title": "Bad block", + "type": "object", + "required": [ + "block", + "hash", + "rlp" + ], + "additionalProperties": false, + "properties": { + "block": { + "title": "Block", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "rlp": { + "title": "RLP", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + }, + "examples": [ + { + "name": "debug_getBadBlocks example", + "params": [], + "result": { + "name": "Bad block array", + "value": [ + { + "block": { + "number": "0xd", + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", + "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", + "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a488", + "timestamp": "0x5f5b6824", + "uncles": [], + "transactions": [ + { + "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "blockNumber": "0xd", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a49e", + "gasPrice": "0x3e8", + "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", + "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" + } + ] + }, + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" + }, + { + "block": { + "number": "0x8", + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", + "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", + "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x2", + "totalDifficulty": "0x2", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a4c9", + "timestamp": "0x5f5b6b80", + "uncles": [], + "transactions": [ + { + "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "blockNumber": "0x8", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a4c9", + "gasPrice": "0x3e8", + "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", + "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" + } + ] + }, + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" + } + ] + } + } + ] + }, + { + "name": "debug_getRawBlock", + "summary": "Returns an RLP-encoded block.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Block RLP", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "examples": [ + { + "name": "debug_getRawBlock example", + "params": [ + { + "name": "Block", + "value": "0x32026E" + } + ], + "result": { + "name": "Block RLP", + "value": "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" + } + } + ] + }, + { + "name": "debug_getRawHeader", + "summary": "Returns an RLP-encoded header.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Header RLP", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "examples": [ + { + "name": "debug_getRawHeader example", + "params": [ + { + "name": "Block", + "value": "0x32026E" + } + ], + "result": { + "name": "Header RLP", + "value": "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" + } + } + ] + }, + { + "name": "debug_getRawReceipts", + "summary": "Returns an array of EIP-2718 binary-encoded receipts.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Receipts", + "schema": { + "title": "Receipt array", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + "examples": [ + { + "name": "debug_getRawReceipts example", + "params": [ + { + "name": "Block", + "value": "0x32026E" + } + ], + "result": { + "name": "Receipts", + "value": [ + "0xf901a60182c70eb9010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000002000000000000000000000008000000000000000000000000000000000040000000001000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000100000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000002000000000100000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000020000000000000000f89df89b947753cfad258efbc52a9a1452e42ffbce9be486cbf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000828d0386c1122e565f07dd28c7d1340ed5b3315a000000000000000000000000021849e99c31e3113a489d7eb0fd4d8c0edbe47afa00000000000000000000000000000000000000000000000000000000029b92700", + "0xf901a70183018e1cb9010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000002000000000000000000000008000000000000000000000000000000000040000000001000000000000000000000000000000000000000000000000010000000000000000000000000000000008000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000002000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000000f89df89b947753cfad258efbc52a9a1452e42ffbce9be486cbf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000828d0386c1122e565f07dd28c7d1340ed5b3315a000000000000000000000000069cda9d6cc6ce05982d0b4fdf9480f2991f39b5aa00000000000000000000000000000000000000000000000000000000029b92700" + ] + } + } + ] + }, + { + "name": "debug_getRawTransaction", + "summary": "Returns an array of EIP-2718 binary-encoded transactions.", + "params": [ + { + "name": "Transaction hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "EIP-2718 binary-encoded transaction", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "examples": [ + { + "name": "debug_getRawTransaction example", + "params": [ + { + "name": "Transaction hash", + "value": "0x3a2fd1a5ea9ffee477f449be53a49398533d2c006a5815023920d1c397298df3" + } + ], + "result": { + "name": "EIP-2718 binary-encoded transaction", + "value": "0xf8678084342770c182520894658bdf435d810c91414ec09147daa6db624063798203e880820a95a0af5fc351b9e457a31f37c84e5cd99dd3c5de60af3de33c6f4160177a2c786a60a0201da7a21046af55837330a2c52fc1543cd4d9ead00ddf178dd96935b607ff9b" + } + } + ] + }, + { + "name": "engine_exchangeCapabilities", + "summary": "Exchanges list of supported Engine API methods", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine_exchangecapabilities" + }, + "params": [ + { + "name": "Consensus client methods", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "result": { + "name": "Execution client methods", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "examples": [ + { + "name": "engine_exchangeCapabilities example", + "params": [ + { + "name": "Consensus client methods", + "value": [ + "engine_exchangeTransitionConfigurationV1", + "engine_forkchoiceUpdatedV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1", + "engine_getPayloadV1", + "engine_newPayloadV1" + ] + } + ], + "result": { + "name": "Execution client methods", + "value": [ + "engine_getPayloadV1", + "engine_getPayloadV2", + "engine_executePayloadV1", + "engine_newPayloadV1", + "engine_newPayloadV2", + "engine_forkchoiceUpdatedV1", + "engine_forkchoiceUpdatedV2", + "engine_exchangeTransitionConfigurationV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1" + ] + } + } + ] + }, + { + "name": "engine_exchangeTransitionConfigurationV1", + "summary": "Exchanges transition configuration", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_exchangetransitionconfigurationv1" + }, + "params": [ + { + "name": "Consensus client configuration", + "required": true, + "schema": { + "title": "Transition configuration object", + "type": "object", + "required": [ + "terminalTotalDifficulty", + "terminalBlockHash", + "terminalBlockNumber" + ], + "properties": { + "terminalTotalDifficulty": { + "title": "Terminal total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "terminalBlockHash": { + "title": "Terminal block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "terminalBlockNumber": { + "title": "Terminal block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + ], + "result": { + "name": "Execution client configuration", + "schema": { + "title": "Transition configuration object", + "type": "object", + "required": [ + "terminalTotalDifficulty", + "terminalBlockHash", + "terminalBlockNumber" + ], + "properties": { + "terminalTotalDifficulty": { + "title": "Terminal total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "terminalBlockHash": { + "title": "Terminal block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "terminalBlockNumber": { + "title": "Terminal block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "examples": [ + { + "name": "engine_exchangeTransitionConfigurationV1 example", + "params": [ + { + "name": "Consensus client configuration", + "value": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + } + ], + "result": { + "name": "Execution client configuration", + "value": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + } + } + ] + }, + { + "name": "engine_forkchoiceUpdatedV1", + "summary": "Updates the forkchoice state", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_forkchoiceupdatedv1" + }, + "params": [ + { + "name": "Forkchoice state", + "required": true, + "schema": { + "title": "Forkchoice state object V1", + "type": "object", + "required": [ + "headBlockHash", + "safeBlockHash", + "finalizedBlockHash" + ], + "properties": { + "headBlockHash": { + "title": "Head block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "safeBlockHash": { + "title": "Safe block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "finalizedBlockHash": { + "title": "Finalized block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + { + "name": "Payload attributes", + "required": false, + "schema": { + "title": "Payload attributes object V1", + "type": "object", + "required": [ + "timestamp", + "prevRandao", + "suggestedFeeRecipient" + ], + "properties": { + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "suggestedFeeRecipient": { + "title": "Suggested fee recipient", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + } + } + ], + "result": { + "name": "Response object", + "schema": { + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + } + }, + "errors": [ + { + "code": -38002, + "message": "Invalid forkchoice state" + }, + { + "code": -38003, + "message": "Invalid payload attributes" + } + ], + "examples": [ + { + "name": "engine_forkchoiceUpdatedV1 example", + "params": [ + { + "name": "Forkchoice state", + "value": { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + } + }, + { + "name": "Payload attributes", + "value": { + "timestamp": "0x5", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" + } + } + ], + "result": { + "name": "Response object", + "value": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } + } + } + ] + }, + { + "name": "engine_forkchoiceUpdatedV2", + "summary": "Updates the forkchoice state", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_forkchoiceupdatedv2" + }, + "params": [ + { + "name": "Forkchoice state", + "required": true, + "schema": { + "title": "Forkchoice state object V1", + "type": "object", + "required": [ + "headBlockHash", + "safeBlockHash", + "finalizedBlockHash" + ], + "properties": { + "headBlockHash": { + "title": "Head block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "safeBlockHash": { + "title": "Safe block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "finalizedBlockHash": { + "title": "Finalized block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + { + "name": "Payload attributes", + "required": false, + "schema": { + "title": "Payload attributes object V2", + "type": "object", + "required": [ + "timestamp", + "prevRandao", + "suggestedFeeRecipient", + "withdrawals" + ], + "properties": { + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "suggestedFeeRecipient": { + "title": "Suggested fee recipient", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + } + ], + "result": { + "name": "Response object", + "schema": { + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + } + }, + "errors": [ + { + "code": -38002, + "message": "Invalid forkchoice state" + }, + { + "code": -38003, + "message": "Invalid payload attributes" + } + ], + "examples": [ + { + "name": "engine_forkchoiceUpdatedV2 example", + "params": [ + { + "name": "Forkchoice state", + "value": { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + } + }, + { + "name": "Payload attributes", + "value": { + "timestamp": "0x64e7785b", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + } + } + ], + "result": { + "name": "Response object", + "value": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } + } + } + ] + }, + { + "name": "engine_forkchoiceUpdatedV3", + "summary": "Updates the forkchoice state", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_forkchoiceupdatedv3" + }, + "params": [ + { + "name": "Forkchoice state", + "required": true, + "schema": { + "title": "Forkchoice state object V1", + "type": "object", + "required": [ + "headBlockHash", + "safeBlockHash", + "finalizedBlockHash" + ], + "properties": { + "headBlockHash": { + "title": "Head block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "safeBlockHash": { + "title": "Safe block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "finalizedBlockHash": { + "title": "Finalized block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + { + "name": "Payload attributes", + "required": false, + "schema": { + "title": "Payload attributes object V3", + "type": "object", + "required": [ + "timestamp", + "prevRandao", + "suggestedFeeRecipient", + "withdrawals", + "parentBeaconBlockRoot" + ], + "properties": { + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "suggestedFeeRecipient": { + "title": "Suggested fee recipient", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "parentBeaconBlockRoot": { + "title": "Parent beacon block root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ], + "result": { + "name": "Response object", + "schema": { + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + } + }, + "errors": [ + { + "code": -38002, + "message": "Invalid forkchoice state" + }, + { + "code": -38003, + "message": "Invalid payload attributes" + }, + { + "code": -32602, + "message": "Invalid params" + }, + { + "code": -38005, + "message": "Unsupported fork" + } + ], + "examples": [ + { + "name": "engine_forkchoiceUpdatedV3 example", + "params": [ + { + "name": "Forkchoice state", + "value": { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + } + }, + { + "name": "Payload attributes", + "value": { + "timestamp": "0x64e7785b", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ], + "parentBeaconBlockRoot": "0x11f780a954bcba8889998e4e61deaae6388dd2391e9c810bd9c94962cc1eadc1" + } + } + ], + "result": { + "name": "Response object", + "value": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } + } + } + ] + }, + { + "name": "engine_getPayloadBodiesByHashV1", + "summary": "Given block hashes returns bodies of the corresponding execution payloads", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyhashv1" + }, + "params": [ + { + "name": "Array of block hashes", + "required": true, + "schema": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + ], + "result": { + "name": "Execution payload bodies", + "schema": { + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + } + }, + "errors": [ + { + "code": -38004, + "message": "Too large request" + } + ], + "examples": [ + { + "name": "engine_getPayloadBodiesByHashV1 example", + "params": [ + { + "name": "Array of block hashes", + "value": [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553" + ] + } + ], + "result": { + "name": "Execution payload bodies", + "value": [ + { + "transactions": [ + "0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", + "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + }, + { + "transactions": [ + "0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", + "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29" + ], + "withdrawals": [ + { + "index": "0xf2", + "validatorIndex": "0xf2", + "address": "0x00000000000000000000000000000000000010f2", + "amount": "0x1" + }, + { + "index": "0xf3", + "validatorIndex": "0xf3", + "address": "0x00000000000000000000000000000000000010f3", + "amount": "0x1" + } + ] + } + ] + } + } + ] + }, + { + "name": "engine_getPayloadBodiesByRangeV1", + "summary": "Given a range of block numbers returns bodies of the corresponding execution payloads", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyrangev1" + }, + "params": [ + { + "name": "Starting block number", + "required": true, + "schema": { + "title": "hex encoded 64 bit unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + }, + { + "name": "Number of blocks to return", + "required": true, + "schema": { + "title": "hex encoded 64 bit unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + ], + "result": { + "name": "Execution payload bodies", + "schema": { + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + } + }, + "errors": [ + { + "code": -38004, + "message": "Too large request" + } + ], + "examples": [ + { + "name": "engine_getPayloadBodiesByRangeV1 example", + "params": [ + { + "name": "Starting block number", + "value": "0x20" + }, + { + "name": "Number of blocks to return", + "value": "0x2" + } + ], + "result": { + "name": "Execution payload bodies", + "value": [ + { + "transactions": [ + "0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", + "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + }, + { + "transactions": [ + "0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", + "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29" + ], + "withdrawals": [ + { + "index": "0xf2", + "validatorIndex": "0xf2", + "address": "0x00000000000000000000000000000000000010f2", + "amount": "0x1" + }, + { + "index": "0xf3", + "validatorIndex": "0xf3", + "address": "0x00000000000000000000000000000000000010f3", + "amount": "0x1" + } + ] + } + ] + } + } + ] + }, + { + "name": "engine_getPayloadV1", + "summary": "Obtains execution payload from payload build process", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_getpayloadv1" + }, + "params": [ + { + "name": "Payload id", + "required": true, + "schema": { + "title": "8 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + ], + "result": { + "name": "Execution payload", + "schema": { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + }, + "errors": [ + { + "code": -38001, + "message": "Unknown payload" + } + ], + "examples": [ + { + "name": "engine_getPayloadV1 example", + "params": [ + { + "name": "Payload id", + "value": "0x0000000021f32cc1" + } + ], + "result": { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + } + } + ] + }, + { + "name": "engine_getPayloadV2", + "summary": "Obtains execution payload from payload build process", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadv2" + }, + "params": [ + { + "name": "Payload id", + "required": true, + "schema": { + "title": "8 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + ], + "result": { + "name": "Response object", + "schema": { + "type": "object", + "required": [ + "executionPayload", + "blockValue" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "oneOf": [ + { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + { + "title": "Execution payload object V2", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + ] + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "errors": [ + { + "code": -38001, + "message": "Unknown payload" + } + ], + "examples": [ + { + "name": "engine_getPayloadV2 example", + "params": [ + { + "name": "Payload id", + "value": "0x0000000038fa5dd" + } + ], + "result": { + "name": "Response object", + "value": { + "executionPayload": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x1256f99fb899c2de0aeac0c5aa6aad69de188b6a0f4ac29f2d075a53aa3ed0e4", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + }, + "blockValue": "0x10a741a46278014d" + } + } + } + ] + }, + { + "name": "engine_getPayloadV3", + "summary": "Obtains execution payload from payload build process", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_getpayloadv3" + }, + "params": [ + { + "name": "Payload id", + "required": true, + "schema": { + "title": "8 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + ], + "result": { + "name": "Response object", + "schema": { + "type": "object", + "required": [ + "executionPayload", + "blockValue", + "blobsBundle", + "shouldOverrideBuilder" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals", + "blobGasUsed", + "excessBlobGas" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blobsBundle": { + "title": "Blobs bundle", + "type": "object", + "required": [ + "commitments", + "proofs", + "blobs" + ], + "properties": { + "commitments": { + "title": "Commitments", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "proofs": { + "title": "Proofs", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "blobs": { + "title": "Blobs", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + "shouldOverrideBuilder": { + "title": "Should override builder flag", + "type": "boolean" + } + } + } + }, + "errors": [ + { + "code": -38001, + "message": "Unknown payload" + }, + { + "code": -38005, + "message": "Unsupported fork" + } + ], + "examples": [ + { + "name": "engine_getPayloadV3 example", + "params": [ + { + "name": "Payload id", + "value": "0x0000000038fa5dd" + } + ], + "result": { + "name": "Response object", + "value": { + "executionPayload": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x1256f99fb899c2de0aeac0c5aa6aad69de188b6a0f4ac29f2d075a53aa3ed0e4", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ], + "blobGasUsed": "0x60000", + "excessBlobGas": "0x0" + }, + "blockValue": "0x10a741a46278014d", + "blobsBundle": { + "commitments": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d0", + "0xabc07739e8026f10eeb9a014f804934b7b8179be4d0cc36be461163862f6a575c564a3acd27de42dc50aaf4cf214ef7c" + ], + "proofs": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x80c5f2e1eb23939cf3600f61872e3e9964d0acafb440634e530d6139a193b889c56a0c07d737729dbe0626706fc9f25f", + "0x98daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a7553" + ], + "blobs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x722662154e6d76b2b2b92e70c0cac3ccf534f9b74eb5b89819ec509083d00a503ae5c198d17634e79059c2cd735491553d22c4e09d1d9fea3ecf214565df22847267ddd7c47030f8667b61a9860b085c060c07eb215a4de991a8fed0cae3821f0ee8de64d25d2de4a710ea9fd89f8f4666fcc7451e6d69a02098bbe5d5b87c60720f6db75bcbad49fc11512930d9d97bef3f2b4bf6c8fcbc414bf61c98d6bff23ba6ab1d76e044908135e6c8720d3d8ca18be1e013c275ba9f2a5d7eef5c2b5f3868df470b4e7848f79d98cfd7381c8e38e9ddbdf213af8d3eacbdd1b7d0fea5724fa5aee5f5b819f35f8fdaffbddc2a2bb2fd21f07f24fbe11f98ebcdbf6e327257389fb0bcb43108092945312d767d4485358fd543215807db5e5e3cb3741c722f2581d15ec8d6eea7c0e7db2ab6f9b5a774be8341d32a3739d103929ce0547208b324b7b29a85552d2fc90b40f9e510680ace1447720c98002f7ef7b7fe09308ff3a8f75036c48afbb09daf42f1f36f477e64606c3322f987fb05603bc62d2171de0fcfe3090c32234a712d7f2483806f192771cd0e2ab1472efdf428f5fa72c2c5a5ca73e3f095ad763054ed2a4a8fa6a05bf3b029646c5f8b61033ed851727e7aa4d120f9817ab2420a7cbdefb67d6d1666cc00a1a37b564ceacd14c37c72e0ae06fa1a09bf6307e226d29942db1ef31c65de6a49922f8f4860ec2d8a71726f74cc29496a85a775bb29103f75247b2b34718a89010dd9371557c1ed466772087bfe3148d17f8279de1fe8387104d0e25bb36e0187b2e1d4df9df3efc52d72f896e5aae4e5371bde4571421bdd1e47b1ece2a8fadbf27f27b87d1689f4453d87d4bdc1f411bfa13789478f4b2f6203af19c7c24063e3d2663dc7a3c97d1255862ec5121e4cc733e7e6929847f32353a4bcf6897f1ff52dcc66d8c9923f0d525a22699ebbebcc80fb1f158beb8c61511698ee9fe9b40a2ddea746c7a921e8532281b46bf4ef7183597e208aff1784d79436cc69ef5bddc0db29fe2da84bce72c78b23dc94c1e76598dcd6ce8c24c0bd72cb581605c4d8a4e711efb957952f7266f9faaad1e0258462eb68de681032d3dcc3047bbf1c7f1f3337bb67d9563a7212a42a90dc93647b636540c774a680e8ae8958f386d4639fa9d61e02fa5293540f6f733de496a0548eaec3d510ee6e1ae2822d348793693e1dc38dd3e69394720adba55b6792fad47817a9ba0881572b4ecb1a91cc7fed3e2dfc51569419777270437988bb74e5eeb888d5850f9de432ebc6a201546325df68f10049d54c9672b3f5271eb5cb37a995d9ff04162a5320a480c457409b28a663ed71b2b40ad22b541b5ffddc62d08b8d4c8da62d21fa429a6d658b35432a73651ad9f9c2121e72e172dcb51ae6ee4f2bbb50c51a97ce7c742fad786e465de42cf569f543c4cc2a37942bf3455a31fcecaa6c1e2718d00478871dc9d0ddb6e984701196f49ac972a3fdd50e631e828c823a3546198efe5f8ca312e31fb2a6baf148cabd595ab8720657f8dd99b792976e6e087b711977ef17efd4e0d28d9cee48ec113c5092567248b25bcfd5bbada813642323a7fd7a76356cde8dabbbea44cde6ce1fcc1e667280e5932f0cd08b3d2399a574629e1eba98b0a0db467a6649945f8e271cfef1223006baff8511b554b9c1181d74c499e3516c03103cb6ccb1e549e9e57be80f72e392508bc624d9af47d2da2ba898fc32608a4df1a5ac4954d819e17ba938a57237c699abbde80e4a73aa42a4ca855c8108d4658b0293f09a94fe192a5c040472b56dfeeb18c3563c86f325b8305e9ab84b276811af6e07bc15aa3ed3e4781931452258d387e284a4dd23b7884b8e9f0a3ae41779a20b18607d692283a413bc4338ad9312499fcf8b17a6f28eab8ddc3151ae89805400a1096164063653267f724c8b712452cbe999386c45e54d94916e0a8017e0dadb21ad27c8059214d97d32c76fc47dbbdf528745ae9e55cc5da5ff0f9aeb46d1b79654600fa3c7df49ac723c0fc457440862b4c6138d577fb8d74ada728be3c5438f5c2c1da853305efe72a917c4dfd89735e8fa5c07c9cc4452b6844463a18781bd9accdda74b1e958e1ca7de9f49c900079ab6108670cc5519b6744ad2d105f6b0d4ec5b5ee88cee9b4e3148da1dbc9c813ad96e911faad349151d6843954d89572c17f63b83cd2def722859980a43cb112480a70af211617d8e346e961abf2f5df65136da1619e0f07247b1a8589f00e9deef61970a23edd6b96b330e54c98e0df0e602724d00368c729f09a21d1b52932276b1aff4e63d00acb3a341f16999d5a013c2454f95ced30f0d22f6c88f672ffc3e61d5223da39266f62ebae5dd75a489efeb6df0862d1172cddf0e365f75c18dbc848f6746a3ccae1684752a217409b8b57a91aa05eea272f8c96a09594956c3e5d917cd6156c096c26dbd93f9a4fa5c8a411092c0c1c63be9403f19d6c6a9a052fc4a6acf46c9fdaaf8a662591f754c309c2d5f6275e92f64b6f81649fbf5e8f05c7e72842ea62acc9b8ab8c82e49b8e96af2219b2b92722cd5a628ab14f7483f8f56261aac17e7b8bd1016a4a9616075829c20eb540672ca8d829470c0050d8f08417cdf4eb417ea0c5864e9e7cb8caca88832cb245f726d60a46004f4bf71f107330d634b86d9fa89051573ed947e7e095d8cfd677d72396912aa12b9fb8dd7d4f21dc0bb28f2d1e290476787f63fa3e4eed2469cf772cfa7451fdf19674a0100d60ffc535cda86c248de1f17c60cde104b974105ec6edc9b7e40822a96b3c7e6018e60db2493d3e53aa0cb9ca9e359940644347ae23fe53c98062e74cb991ad7e03342614f8696bbfc097b1ba768e04449dcb3298d72e50a0733a644a6c06d06e8274d90e3d9994ed7b928ae7c7efad145e2306ebf3a2f258223afe8f1d4219bf37da3670026264d4dc1d2928c1b7865bf99b036de7289286ec6abd1235ada7c4efb349d21f79ca0562ce3e931eb50d4116a4af7bf72bcf2f390341412c77cbdeba26cabab50d0576a00b313fec424ba03d4de19a372326b171e251700a72121d7fa0009e4e8c94e186a7be365ba1568d993ac16b9720764806197b2eeac2d7565783b938a6fbaba57cb60062b53c1e8ce226983a972deea93ced7b88c2e87920a0156c1b94a4bec0e47fcfb30e1972f047b56252b69df22f121758a49b08d8e5147a761143e6ec5e2a4322f9feda4dee59b268c4872550a76c5bc0c07232a77c7d04c47b30ef6965840756e007cc872f71e9faf194a62b69787e017762fd4f9148f7a43b9d50d8abe4290fb986864ccf24f9f52f8483c87e5e4e45c4e935f4f337b7d88baa38b9039fdf03ce40a9ffdc6e111fe692f38c650752019db283668560fd31349c5849183f0d91de0d2b88931ed393a3172624649937fb1afb04a92ff2c4469041679057762ddd15a4c8a4501b6116c9a72a2260b2e8588948fae691303c5a7041027ce4a5827c39edc6a8714434b537d724884fbb9a39bfbf887e945157ca2ee990fded68e30604af9942f8e39195c5972a532333ef4d5eacbc9be8534273854503a0eb94eb6007d4f7ef386c6aa37a866e1c12c0f34f5db2a92b1e3ad467c7e1f75bdad36e05474e15816bd1df4ec85259262d3ff7a5184f80122b13de208e87bd9b2c607e6efae864569a2d8b464fc0473dea65351f4e3d52a497452c79740c458450914eda689474367217d18d62042e63487cdab70eef512f6681a2aef4d2359783936cae2a5c3df843c93c7f35f7208b386b9822f79d21154a1edf2568b4b355ed7da3cf7e5e7954ca7582217a2728bc1c427610a3831d67b931f296b3c30b372d19fcb4d60b3c0b8bfe0f667503dc7cd70d41df629ff139d0f66952901f42795c4babc68f653ed080bc895f56f4053aecb97f6603926a2ae285df8cf20c57e34e56965eaadd4f7bd1b20308f8072508390724cae5611f0574d1e83c0dbdfbc61ab06fdcc0e65be32bf272ead8672545a8145bb1179511c8822c63ff1e7bfbb3b8527c48ba5be283078ebfcaa2f72eaf0a362ff747e226c4f228281fe5e3606eb826f4161828ee1a501d48c6a362749ba4302b8941d81be751f23cd27b040c2d890c9a6a2047b3a1f7a33fce612725e7d8319decc545803a420099ad5a7ca52b41b0f51e588d3583e71244d75027237107713dda0803055314c1fae8fcd8993632a7ed91bb0fdcc791cfb3d720372d2f506986989051a6d32777c2d1aa025246788f30f54c144c0535989333d57723f9ff54a691d043f2c2d84ae95272807860d6c576a0c6dfd90c4bae6b650327225078ac2bd96dc5d646a873a6d7543c2e1265b71f99d3c9f1e2a06a3059c06727c0f5196419afc19a455bc3adb4ae23e69ea0073e7c600fc5dfd7050bbab8850ba35b25de6dbbd8f7f7b395acb6b6d460e7b7883e93508c42d7f2afa4c8f9a26f769f1a0d31fe888ca7ca2771e1c1287314d2833ebd53726af856e4658a0bb6ed55c41ac04b434a3e6736cd9261300b9315ad364c467238487ba0108aceedd1c8814f7fa9e14b82243164e84760887a2419e1559123e9d5f941bd41c8833ca72390d33a27d45b6e73ab4ee02f23b3b01ee0f94b4a98304671f1aab423feecd2879fb6196503b6eb499f20144c56836c3cef788d0ae530e8aeacaf9c01ae40172297c5f46f70b085417bb1c4217ef6b0f3400b4994e57cef7116feeac37c929392ab6bb95ffe92f643f64ec7e036af2656f84727cc308354091c1cd7eaf4df17244b1a04514d4f8e1629881c84cb6f5be182b40b498c3faa55b28a786436929728da528e60150034e1466b60a7ebcf37958455eb09686965c81b585bdcaaadc725ace191deda3b0d0fb3e6363f28b626c14e45918bc314684682b68c51fdd127235c1dfaa021dd9625ce84ad3dc3acb7978f57825a6faae9e704b9ab51772da6119e184ae1bc99ee29bfadf8abc83ab6805488e89ce22a201400c1d9def057462da34cefd8ff96ab767dfb7d2df3b9d2f137fc400338fe88a6c18f8577507f1188dcd5bc975f0412396b1bd5c11f6f6065e058af459835ff942ae4f80ae4c117239828b98b3b34d092cc8cd53a7f7e804d2e337c9fd857228e52c6370eed766729553fd9dcdb643a0127ae1cfca8fe8b3811380b3327c3128db4b6695a6b4a572af57ce3e5e9af156f3c384becabb58717849f493aca027b6f69d6062ccdb3a2fb8230770b229b0ad7098273521675654dc773ff906463e1f3ad49bcb6a418f4d5fac59377fcb804e3961475b38a25e3763c699eb40f33aee021e41d443f1017256cb851ca61b1370239f4b03a34ca4f37c74f6f6c22512debef1be3f4f9bad72f8afe5e15b43685b128d3572a72a4fc33d32aeda6083f2653c7929dd49b5b52c9a686c0d981cd7ad501f137cb66af04bd05188d937c4d6fc0444e119a50f07721a297dd9eb1973d530f9b38715555d91c1eec6225c64b1f9093c903a0ba2b9723b644ce3d551a6ff5f9321ba199b3aae1fa76d478024308ddd8f13c8e177bd725efce52fe97dc5675c7b6916e8589d5e4ec332893e5182a539099c9401b7eb724ea77c823e92465de46d8506c47eba0855bd20f44b0481c4e5aac4dffeaa9e72c236b9021a4f3e40d87d7458be37200b9d53fff411464c3ca836fe28e228cc1ba779f1389f2e71054227bfbfdb43b609e097153ab9e6261468406b34c79688726a4aaa9d768dd5908f762792c833d95d8e194b2fad756aee5c37de5f4e2ed44170d1f80080a562e7a107f0ff741707efdcdcfc116f5d623aacd314b91438ca72f46a4000c0427eeff855d6531c8bd33cafbe7431778b7314519a30712901e0023b24aa992fdd04d537cb0d100761a09977b374209d78ee4a7167f8f36c0ccd7282fc96317f9a1ae0999a71b0291b4fb3cd9bd5f6ed6e78d25f3532394cd167135732b24157d0ac1fc33576ad1823ae1d194a204ded34dfe469ffebe7dc990b72482e9be7351717592fe2f2bec5ecdc91129927b221ad24011c6d11bf3a35f3727f9343726101841a1897aec82d3cd3b08cb95ff74115b202b036373a72416b72c16e4ffdb612a659ceaf00c477078be9cb4a744b45230b8e8269d23c2276ef488825fe04954d85fecee29d72ed7174f8369b7c7a92cd0a1146b8b01b292aa44556d3f4f0ebcd7c551de21462c37e2fb248a5944fee3b730b4bad7c98a095c6726b053c55a55939e08338025cfb41d2397c919aa9ca24e99aad7e262e04f307720ca07ff1216adfe9768c95ea2f31268b15e554968e0de7698d920e6b3c885a7289df3c060501d14822eba963db261b7ac90bc04b1153069580963acb0a7eaa35023bc710d5cf4b5795f6735fa0c8fe7b5b8c82a9b25b9902b2beae749c305a3f7350a85d3913d50cf277e3a0cb2b4c97abe7f6b751c7a541e20ae8b95c112f72a57aa2a793d96b7344fcfa8f2ae7dca3c77b0002489b2bc9986b08c93bf13f72fbccd659056a078da51fad2b3e9374fe1fbfb5fa2c1b5d929e806ff19c23ff30a34c17fb42fe2c9758b0b6b9ad11b63c70a906357b954568e1f67a86180c8b727a6d6153aa544e1f8825f67d8d3e34a5b2de4881bb8fa6120d3817eabbf8dd720012d82975f3343bb2214c138beb912ba8c823b945e89b87c3777f300ea40172b2f5c6e92d1f084e485fd7310408a7ddac1152e1ae7a2a1842121db65dfe8f7205f5bc346a35d3f8feb1f12bf63773417479f8d77b91b5d08ca33c5fc448726a9e874a18aca01384468788d1c76a375960707e27a96f414d56e75d301609c172cf73f8674b44fc19889d02764727b3f00b72b19cfb011821985bf5b6c404a87238b6b4f5b5aeec031af043e0ad241b75f2217d39e388c8194c81e1865707b166e8d3305ddaaba522984c2f16adc97a0e5b03803748f4407c6d4458d3ef4d4324fe24df2ab497000f70e0950c6d9d15bc9e6244e6114b7164d9f9785ee7003172b381284a9a047e78ff4f24700a96cbc204c4fd2551db3053e39ed9b40ae5f7721942dca9e69da31ee7b525010f1b05e574fa2bd0accc49c332fef85c4a62b934c23be43dc5d57d7616d315b8872fa25c565b42da8aac84419f89d8914099bc721e8aa67fa922570c8ebbcf32062db11e2564024707dcff5f9f1c442f7f4062729e5a2154d190d98bf30e60c9716905da3c6cd526b44d8424e17e26b20843704a8b8757130f18c89f533118a4894f0ad2df09c5bd5f8f9f6913a5e67d2b2ef215576dc32227618136e680c1088c5f14cff5cbc717a963fc387d8bb19e01e7fd7256d0695995ca54363328194a5f1650fa13b594ece69a133fa545bdafc26f93725a87ccf2f60072a8135b94f50bdd6bf525b2e584f2923b8ee8c2b583286d9928115e91e0bbc097e5c15853e39f1b07a5709db8d67e19d7ebe86feb74fdabcc65f0abdac0c18bf865851639950680a44a2dbafc3b82e5d901518734d81063c6728442089150aeeeb6e1fde66966456570bfea301cf9f231d4d9d85a7f50a9647248b26d930dc67bb301a4ee15db3c73bccc7c3430f5587bcf5544a7d3dc16994ad88ada2e1f86c08cd13aa9bf59740c3d53b56729137eaf274e3b211cbe09ef72c70d2e975a79bdc7ac33b65d913af0bad759097dc689509a6ec3eae7de87d6720484f7d3dff6671c4c34f8c154467c6ab82234556ca835507f9c01b29c624f498a2a1a4220128f9fb94e0aba663ae81f8538db88b9637a507d7e160ec07e0e0de58869281fc25e6d523bc095868f3e86902095dacbe62da72c5cfca8a4634067e7fd8c932fd65cad326f5054a5ca19e658cf16e8d389d2b67d0ed89a959d30727c804844cb0f7091d18f5a727cfc58207e3156a0edb3d7934fd1b040a3e74072545b77dbf3430ee883a713917c82a721773935ae3e4167b272c1c6b2a911e872e95804e3ee667c63c1cd44b7be371eb5206558f92eedc6362e793d5d6164d745fe1e6447a33636639c46db25865707ba137c57d2aa40931da57d603f5b2681728ed29c9e33fa0a20c2c7738974f4010262b29dd80a16d89c5b6f647bc740f44925be33d0fe2745f1f851d33354252f678c48a125ad6dfe6e415488c6cf5e5472a8eddabf37db4f3083766fe31072c68867122086d05f5f4a7ca181620ded5b20907cb6675e3923e9bc930cddbc38a35f1e5c45fddd75447d6887242b0c69ed72e2f5d57bf97f5ecb94ef2a99870963d7f2ed3d5c682cddb2e12075200b762072031eafae33b40b88fb871d2fb0c9599ea598beb4be4268991c47218488133e7299ee4f43ffb7f3c144c8b0984dfb74448696ac72f37b678aef102845c27b951c0ec031f25c192176b9262a2c81bb5adfbf52c461767e8a63d80a80b0d51491521214b845ca333059f174daeb9879952344dff8eeb7c35b3a1d4d426fbbc8b772a1ff091577f031413cb2f19e96d04dd4b53bea75723105746248ef6f91d80f4f2009ec370debad1fd2f646cd5dfb0c2c162ca8a92535b35bc526161d3643561fe3abd951a4f00fa8abb19ce7c8d9733b2629fb9ff8c7f5cc6037c70c228dc625606104e01f93c81e9bcdc07e2378a8d79bbba35e7a5fad47279932ca03e00472d36e66f55491c860b3a2b0ac3b8863dd453e2f62ebab7288f9ea395e7c165b72139c9b5c5da1ff9f3204bb05a9df069ff12a9908b752d3de38c17c865790ce6da43ce01beb565ab3d18c6220d2c433552f431e536158f4bc38cc4d6dca18d172c1475db6dd16ba788373bb0193094208bf5de4da76d68026448fe1625325ca72d511aed2f0c5c58918cc0207106858a804de142eca9883504449c950479e7f725903aaa55c5fc3ce0e77e9be43de16f636e9e3352aa9c0f3f3cfecaf95b159724faecff96b575143ab2c42489f3c34daf215b85d64f8bc41ff4ddf065c605872ede24be716bf588fa2b8c04162baeda5e2d204efd5b838842507b7b06f68e4721eaf34be7b1f657ceebd981622df84d536ea6f4838b3643b40304664673ec64fb9174f38547d2481e3e851f9b3cedf71310a9832d1cadb9c63cb8c81516eee72fda00b7bda35301844c0c026a166ef8716608e57bd04013e7a8aa93b23c70272bf2c145d66851d25783ae26da22fe9a756d79ac42c82fb0df0e150c1f9ee8d72b219046c462b1abe8a2ac1773efe1134b6c6cba637a6cfe5359c5d853777d139a662a4c19d014d515f00d024609ba54b1e1ec845cb414824dfd3aee1381eac65cbed7d0768f94e1024796397f2fec000e18deaba42e7e27f62fdc0213fcb15720214a51a1ae0e3aa0ef5d723b01d63b8cea2324549b1cf15336d331a9cfb2c727504947db5aaa1af52a6fa1225b9e2031b48fe5267a4407d07874b5b1471504d495f51d6ee6c87624672f8ff8d10fdc20ff538b518fee6286e460dfe861eeb72d31fad3edae3bbffd723153935b054a709f3cd48f9400d7ca9458beb67acd544406ffae187de4e17480994c97775a2ff137834282a250104254076bcf502084c35c24b223f69b2d510829c852a09facc27da5cb47fa027eb2f358b66e389085df181ffdd4a957382ebce4a10c2a2f272aab7f451ad89e9fb12a8823267d6eb62662caf594ab3ab196c7d6c8c757491b41f278619c3fa0bb3badd91f58be36a2efef3dad05317dc01852b04209d4420b5c2a6161b94a9ee5e6f55cafc79660572e02f2d41358004c75f56448bd7016c87a590d2bee38b2cf4d7c302c2c9430972ab03d07a8098b16c046d04c14cc80e5b59e16ffd870a55277a074840aa28c9727f6e77997f2617005616d79c2dd03e7019078917d5e0e5d2e638ea3d214a391670c4512818a4cb8040dfc25fd0264fac6abed2f131ccee0ad7f8caa26957d6498a3f23015ef4da19e915dce6e40f0de5be101857a843d6d60dcd2a12e1dad659c4ac3ae494e382a73b2b3c8cec58e0f35f768521ee89ee39f155ffd74ceb50262bc86dfc3b00e3bfcbca32694d20e1f4167959206e12864921c76f8ad7f46272397428bf84beb8b86e4417086fa2905a744bcfc9d9d32a3c9b9eb92dac9cfb283ac49f4dc172e8c1b05c6597dbe6afd9260d63317143d962e56023e343671b725f28a3a2a2d482b40a919b8271443a6089d28732b999e359ebdfb02024061e1c33f383a8fbf4bfc083885812c4761ced88489465792651b0fee9e208d0e04172abd728a5b9d4c75c221ad4aea8792384f6a6184c1027ab30e6b94322751adf724930aa77c8fccfd7f27d5dfa8bb2afa100d008864adf087165c40f7480614172304686e694796669a4f8a1195b96a7a55583c87c97bbdfd3f38679bf1430b8724a7f29fc23b36fb8ac4dc421bb848bdab1823d4003a3973d4ecae8894cdeb67222e70e36a3d5ab9be292b8c78878cf2b61210724d5cc1a2d8466e6526b7e325834635d6ef11a243c1af025164ea104051aff08fd713c1fd38c3c07d5c8e6bb1618c7638d7a58412fae59db6ee9dac6ff70f90b3ae6b5322153663ab5b724b7727e6c79cd9cdeb3e047c35bd3db80594567050d5e0974df7df04a1e474c17a35e8ba2708d7579bae959f0c0ad5c255132b0cd6701ae0453c097bea87d4dfb310ece09c086e2b1a375a79f6f181f16a2c35742e09edd7b003298e4b805d983a0725e825b36d027c6ac0aae07962dc20c9b39989bfab054fab17139d05ce14e3363c20367883626231f7e602d5c7bf8afbe07a0b8c90854e6f6ec3d8afea616340267e3b757d0facd4b70131233232e91a74a8f93539bc7dbd66ee49bd2c85946661b3a1b6b1b2229e223d59ec7eb742e9c68abad97a7c1b968e7e7b555dd42b56c8ff9d7803ef77b1368e798a984babd1bbe488366f5a8bc1cea0b687b84fef77224dabf4fafa99fa0a53b95e5bc5d804fc80b237b1b941a70921fae76a4e10e6468fef9e04e46ca16c00087aa356aa90cb0dab4bc7ccddeb1af7744d461a8b672ee3321a71f62bfe3cdd21d32f185ba5c2701f9efb32f28063c42925751ea8f3f3d6a4469f94e004cf2b21738bb206f410529a846d6765adf4a22a9179774e245e242d13c2be27c631410a16e754ac18699b6fc8530ce72967bb14327ab286372b65d740ce8d25d5fdd2c4030ce7d20d67d945fb8558149ece75006274e5adf72d078522e81a2623aaacd45a5eced756ea6c0aef163871e514686ab742c000d726eb2dd6a127a3f5aafa8e0ce6ed49d3aa96526eaaf619f940824a341c5c445072fc345ca71f77a2fe313e11f281419136b764fa5130825b2c5109dfe3fe3891a71a181a7a05ea1cd6c098edba4d1b049fd5626eddb35f0d8214424d9ed6c0f7202ec32519a49c9cb435f7a80986b65469f8b5b8c2cb21d00ba499de6160b3d1ff5c4b94dd917da88fef2a11492da8c9ec1020debb4b74f0ff920f62f99705f726c6b74b97b617de69d4330e72f3859f0250b81c6dfb45eec737769cc2af88956d1205523a954ccff10e5c6455c3ac53da19e2ee5ea05418b4aaa9d87014b9e723074c30e5dc326977f3351c88dd3d5c930bdb9cc592a08bc3267d255dba18172809c96b83b88feeb86619abd15fbe4f33d8bcc68b0ae41977513151d6237b1720230507aa59e4535ca1c433dca37d7aff430e545659a5ed458f33efc8f8e4c342ff8e0e8dd8cf19503d7127ca1c011231fe9945c86ce702463f15641f066e26d10e74173f9d374e9f20d268211487113568170772205d2ee9eaae88671a52972411d5910c7e2ba4f5689d9dc76a43c33bd3e542d8c72db08b3b16e2cba009e7212c800b0292f526b61ed350bcd531c5a61cdd462405a5438a214986298582472731ad982f9c8ea1e089ab33d7a105e824139261fc40468870a7a6a5b910f2c29fea513d73966e3b8ea3062af73f61199266f6683e0d7c99981a150b205d20f7223c194bfe90714cf529bd28f8086d387bfac2bea03cf625eff5129183443752b4b823f03fd1188fc5e92bb2bf2fa153a5ae95cddcd422d6008d5243762007b077897a27e2d0834c0a46ed0b5d090b51747696e30911fd88453eb002e1c0c892bb0a0e19864b7e604ea03578b5420b937cfde1b41fbfce4ed40f51d481a468e7238077637e010d4c4ab122a5b2d5736c9dbbf287dde274216d311f24586093572fabfa4f019ae4c2d7db60744d49deaf5f320d1abaddf0e11b2d1727385198e70fce6e6a9c7ff29cee07e39cd1efd20efef866e8064e745984133e39e26a71c0b8eb3ea21a89c2440ccfb44de8dd748962b0ebd3c942e82f65e05f076902e7572809e88fb1aabc5fd39afd427379bf132da8b887c8b53870c6d42f326f37e543ea86a21b9b8a6eae5ba1d0ed7f416f70eaf328b0166b03cbad0fc01a751bd0a729f1e3994795bbd0e251606a57aeea7a99de5f08bbc09a486767e28658091d4687a45f5d31c62a340e92f289f59ef8a16f84ba5e94f2bf12981bc1c6cb883af7283d9e25e31089b51af39b85f1e3c10d8dece04b7df8021d009dd47483928f07260acbc359dc8abe54699d8e4ab1dd208e164ae9685e141a567e3c08daa02b77215d7c8eaf12a791d5af5a3cc79de8b3e40e7348f1f35b7c8498cafd2d1320b720d84e6f38abb8248c5755a922d4423eb639303624a6ebc93d2ae7710c8e1ad5bf1e1fc55c543a2a6016c2f4c9e44ac1a11710ba2a9b0c41edf53adb33c08ae729891ac4483ae648942b14b8516d80968411068a3fb69808be7d2889da2a9633b2680006f5f8f35dc8b44a739c065b5d32d7ed78f3c75b6b5914888a6e6b89972baca4c4b04f48f9dc42f539d694bc72fe6adf4b855b4cc90e922d3967e17997230ce42ac72989c2e575cd5b69c1bc9541617964a919e80a2ac3f353f1541257225860231a656d71408184fea81e017b4c380bd9197c43ff2011f966d83c5f072b3091988a8e087a604c0837a32a03bc6d0050e521cca1b3cafcb90731dab417228c5df9760777edbfb20e134301e6e9965fb289c2a85a25552b2ecc0e0a1707271e61920650d1a0dbf7841363e67292cf2dfea06ee6fefc38aa53afc96d5ea72fd30514591efb45991000e0f9465a30fb90ec68b98026b0252aee1adc3ccd772734aa3f566bb3ca235634dc25ce78e2d119ffd6d44434641e6bac9170e97397207c67c577a6a56df0737b6d9a524e020c15a6943da192dfe32932ab26f3fab4d8d47cdc0c1e1ffcb22b348ac5f3156d4f6dc6ef8c0f349e834ed9a0a9ac44f2c1c51ac98fdd718ec79ec66172fdf2e67ebd6c505ac55d378e4219925725c8872dfacf149c3435a7199b6a62bdcd316da8c467e4e0e3167577388dc8199c61572ae4f01d8c2f8a98740d44d3a584c8ca4591efd905275e0ee2b9b98e61cf4f96d3da3e7c8a63687bb4c1edf636df23e91fc71c3ce7a2fe38416bb31a9744e3953cc7fac6c91199798906bb5b56dcc36d74472257afc0e41ccce2dccd5da16ba0474a453fe076a16e5afa6aee9a5f447bfc466be01127a4ae01f1039349a5d33723045539a87c7898d3f5cc15ba8f38c75a949010a2a7ee0e30eac3882f0673c72abff2479f600869e98d67cdf47d76e0735b8d41fc038999b93d5741a46e36b724eadcb569bcd5c4bdd50ca8db6790583317f6b36f3e67a5838718325dc8584723f7d2b5ef0a12a66ec11d3a2bc9c9383f34fc0a7ea360c5207e62b43997f446dff11934554b523de562aa3fb2751e70248ce16c85c31a61292c08f424c4c5872b41231a942d88989d66feb3c1070c3bb0005b4e5095d6269438d24a5723dfe72e1e2fbf7dd00a589be04414cb2b60f6d41a228aea9511ec261ea544a4e5aa14c609f2ca5551761c1ee4fe4bceea21a7e226349d74eff8c420d1de8a79c418e5b3692f948058d2d0caec220cd500244e259d9993e3b053fa9d7258bf396992872f716113ab2a5dbf6c7608e716c1d2f35d5d7de24bff3e9420c095370f384c8721676a8f252d20294e1ad468c6136b9cb872fe98f8588e9de476845997fa2236a6beaffb983b4dca1b2a928f44c354bc01e65cd1a34b4f58f400a407862338b5fd3fb1585f9648bf9f4040a3b6c73212896a748b58589de1a594613fe6852b92bca1eedbfd29e4fd9fdffe890ffda7ca471be5d0e07493df9e241eb68723a9e727282757fde6c9faffbac375feba511db1848bc824b333424189d79b5db0cba56f8d85c72a154e90579db7e6315143a4ff09aa0418227ef0f38375fbcfe28d03e8ad70198bed5c3d024a8c8f121d66431ae2e544d50bbdd3012541db70399152133ebfb0283771ada32cfb00401324ae7505095dd33915230eb4bd9ea96d69c72880e28dabe5208ce685b82ab6ce0e0170e25e2da97ff2a49f6aa37f6ee0d9537bc2f858eaeaa1acf4bfb6a8ddf08943cf7636cea95d131e09e71579d07c189724eef62f9c94cbbfc4766403d3b5fdfb07ac0969006012806c1ceda3a4e99ec72eb43d2e69babdf311760b775473598b45e7dd623dbee17ddc0ba99a32be72c7254060174044b9e943283133e326eda4b06600a692f8a4db67fb3f560ee1ef572ee97e15024640c66370970e999bbe09e2c3d5c154245be4fa6023a3cb2561072b96797ee106ed99bdd4ea0f6f7d55106fd6ad15605c35e165d1ce0838056e74a66a0280abf186eeeb1148d83f5c8a178b9523754505a35082cb70c95e92d4b0907e89be23def17d608b0ebedf89df7bf134db2a882cc327353f33df031010372139f9335914eaa548b63cc9cecd3d1eea88f9eb1d1dfbe28025b41a92554701992f6aca9ee6d3fb398eb36d95636fc72be095d731ff2f0d7a53c5bbe190fdd72692031a5147f61b8e1b1717207559ef397ac4e2901f30bbb8d76f341f263fb72b181452db6a7feedaa53d0db3596fbcb8dc600d2581d6d3d3783296c14acfe72f340a6db51d18c468eb97ced177958b7143b8ca652917073ed5d30a64ba2f130d0cb06a62998d8b015862f6064aaca062cc3b84cbb1e1b499500d6138c4cc42a7551534f74cabe3b68fea2cbdc6035cd671e475803a88a42c6991ba27ac30e72c7482b003febe8be6db0fe0964a949a18639c0dd30b0061b5dfd7bc6b2ce34726748981a30500603dc04b2ca64fa91ef4fdfea170aff48507ec9d63ca811a45c4d2013af2cc2adb0fc7d234d3bc48bd7b4b823401b62db51b6d401e742711d72f11224f2a0e7468faafbcd1a10301ec7e68785265ed6e928dde68ad05e6e617214e0907d854a92fb476493e5ae75706284fe793c7b9abcbd16b4daa8c0a68369be6b1da8a8c4b343d5acc7116b456aeac5f35b2cbf9e3477f6cab9c3b6bf49728ac76725fe392dca164797b176531d5b889838e32c49d3b1cefd4e8494f15872298ada7fa5fcf547988b8e6d6351820b7b390fc0ed1b7caafcfc7d342d1df5727ae55b194d6a130162279ddce9befd0dc192a51c58dc73a83288e758e573b0723f9138905a2eb44c6b9933354934167d9ac693be5a0b3df0d48bd45030e24c720b45a1a2ac964fe819917ffa70437f710d6bd69dbd8d90da5df5f1b00f5310724b17db433d3b9ae113d4e319514cdb25298e032f288bf582f6b79dcb68f5d34be9178a6617dd548239c54f04450c1b7cd74ff97a2e88afc9b2fe4c6b2ed60a43dc982b11088b60b0068e4b1fa0ba086ae7ec7bf8c3ad3606178a92245b48fa722e8158cf169ee94b1e939c2cd4714b8656214aa7fe295b1f0db7f01a5fef6503f33466706f9a54d2051062aca1670652cb48fca2df283eeb60116843a8f7367200369a00f2d78017a1c2a3ca94666c2e7530a26058867c725098dc40dd6f201e94c3aafdaae10302efb7d7a0c11617ce42d4d6e9e3e6911ea3c5fb4311ba5f1fe4fec9dc933341655dc8afa2695c888daafb64c02b8d16a3d8f1f1743e00f14092cb650800dcd075c7a1e6a6910f09b426991c1d6aa15e309d697b46d752047264e854f9b92e2d34ccc0d019d8db60bb497d3b749c91524bdb5dff84b617727250b51840308455ccedb2313b1650aaa415ffa2ec27c12010d24508d156f6ad720bdae52f4893ad6731ad5dd1e9365652efa148bc212be0531ef35e246f8258722572d80165c4b1e5f02563a344e058291d1e57d54de3edaf2c1da4f2b702d572741d3a5f982f538fba10bf0bbcad7cb283eec6375cc5a142b9033b17b987ac72a71b13b21a27fe343c7249339d82ecd270dbc7ebab0648fb08945a312f63b072ac3d16e5b7058433b624510873e9020583925e66656ea4f6264b6f6a6e129405841dbacb36e9a3ea99792137fbae02b8fcd55fc7bf3b1bee8375d4cc4ce2ed72fcff87f903770e53b5073eb56c0e1a3dd289b2881cc0e0c9ef73ca6b025a785561cb40d42018647e573fe5063b1a631166eef44393b1ff87f5ea5b2505aee7726c3ad8e0751ceb1c1102a829fe18376fe1599c936a58ed939ca7fc0cb9f467585e594a3022b341fc217af72f8cb0be6cdad983e9960806360087cd26069fd40db67d60b5e2483e0a9c479f3001efa93c87b7afa26ec293758029c79239c9a64a48d3fe60d6ead94389ca2255ded5580742caa566a29cba00697ebfd1f76d2472cde0788a881888070c408e613d5646632c0422ba8b6943c042c1e801e18a995342380f0c18639fa603fad98b0c1046881f6e420190ca7896e2874c727ec570035bda71cd0e4a8e9cc3aecc659edf03a474233d8a9bcdce920e2bceeda14b5a72c2f1b465c4b2bae891ab11601d158f1eca5abce00ea8b3f153b8ffe00532bc72ce45b0c118bbdfa24c19a8c3a13442768e3a9540d6950e4019a8332bee6a317251670ffab978afe466d12533eb1b2ebaf65a95301461fe969fdf6f0c9f8be572b377f7627fca97ab9c5f47410b4923504133a6660e4316fc2c6c591f1656664ce33b1b79304b9e7f56e0d5c5ce2080e57a4d3290dc435698c1fbfb39cbe2db4d8b0f4b814e265506531ee0830689139b13e003c5a691e54d0edd667c8fccd31d35112b7cb10bdafe1c512d8b7a5134c6e1113710f56a6f16953dd40913f2c072e4a80ca938d425a3cde7b9aa307064e383744a54830216e87264adbb894fe058f6e10ef940c8e599946053b29ef7543eca6323513a815a83a83ca57037ca130647aebed529d380fdaaeea06e1108846d39539674e36619e132acf6a4f51d75722b193221add90165e1aa332be800da81be7218dc5a698cebd9300c3e5cf89d53ed1a45ee087aea3c139d0d996a791c821b63b9b17ea71071f3e632f5e5bd9b722aa5cf085555e421d44889ac5ec1f8540caddd2618ef7bff8b758d7e48816e57adbc11ee335c908210b634d7482d2495733fe9bb3b89ceea8010c5e53214705b60d1827a106c0f483782d97d7ed52587e6117b0dba2af7fe8d6db8c564064c1a28820eacbf4f30dec793577eef3f906848904d6774f5c7c9550951e9e60b7e5d820394795257fea64a92cb79d266376b6ef1c600c425a57506f39a916588d3315cc2a8e65a6ee3952b15f139a8e90f3ee54cc9fb85af716ce4f400aa6af33c525fb0f55ed44dd14b13e1c8a0575c947092500bb40b54e45ad99a1a83ba4d4f3dec0ebaa780837b025f9db0c9c916101b7abdbd916a6e614585599aa24a30b86aa27456254d1928f63813d2c9bc96e7c747fe9aa4555e7417f1d41d18884f4a063373b6e34eaa805431fa315a10add6b34c5afd4c5b6f85454d36abe410eee42f9f628ea164ba636e0ebb7ed7ce788f0e8d7aa406fec43c9509ae0e4ea16a4972bd27c5e7eca65a66735d782a35834ce8e4114da1d47abad1aa5f25620b7ed672a761752a7d547ea36e896e2ed5d34a92937119eb2b2059cd86862a92bd5bc4489d91bf2e602896bb11ad46a98715c4e6448d363472b5c3448fdf393254124d72585d705d1c3379133f9f62ffe2095e0d977fecbc3673208eb061e3fa12fb205832313bb8503e0cbcdd45081f75738204b6551a07aa2f86dc49bf638a99e8334ab3bfe5dd54e9e408fb633c55372d6182245198b054196ba2ad28fb5528db1a0865ab1f6984e5db4a0c421df59ff4c6be6f792a115ca0d221bcf3f27a42e52d43efcbd12827e519f49a376f4ffcd59cfac80bd15e147b2f9c9d3dc84d9f816b59fa7ed6e6e4cad051e348df73177bdb64a368e3d7669f9da72d7ed5a445f851493b7214bad8650d1e341f39556c5661e3144e0a34ac6d57739f075edfb1af0072af66e76bbbd3b2f59192d7176364beec1d70a79e974c1a6ea34f4860ac403112c1ed6aeaac9f05ebf3138d34aed1094eff04b549a048f62f2f967386c9b96f5bebf9282577c11a551da3a48339433407bbb3f5df4f4a8a33253f5d325c3f0401c90aaba8cd0ea5f8736ba680f1d33cfdd8a2aa305acb831e315c361a86fbf372b4e2b89971613f1bc25074e39b4d1f3a0abfe2acb13309f345c6ab685b7653721e8359d1e2baf4ae14813b4e3a227a5f4a3def6fe7ca65f2aeef10aceafbd972e0005a451a7c3052e08a04c6d0514f3e7e54e060ffbd99642fe0fd7e7a259572c2b6f40596105c64f7355b1913bc37d8745daf4e68d42aafa875f6d0ecc5882ba965099162fb424304b7942da870d130a4b97b6c0dc3fc20b792a4936872cd6b1614f375e1c29b1429ad2193ef58b4a85a057f4578d4a6959f2b14c74d8f253ec7065a2f8e21efc2fffccc87b00eaa383e411f6901fa8278db6fa6a0e1ae6a0a392e840bcc4933dc5b693242e13089992d16c494bde0363a935f8da22b7ee972561fc50cff7de1a683c1ccba90d96f86aac76466e0cb0558331f224d991405722512f2ff8f9f460de7de53abd164e8bd886da57d5bc626328a65a24b49277a33085a0bee09695e4a513ce899d1bf92634db6d12a4a17230ff056b7a66f341f3ca6870e3745b48205077537f6d24a75328036dd0a783f2f27c4077dfdd5c3ba236773c221f7a9ca4ff8772566dfd871ba8569376d136ea244fee0c50c6d01142fd206ea3cfd63eb2b40657e7021225f8d020697aab95a3c21789caed87738a85e560be75bf2bf65ac3d7f343215b1f00ecd6ece839d009c5ace15ca033aabc572ae45c8c2c01c031e7a0fe5e8e8e620f745c898207dc5f307304ca5b92141507253d3a4c1c6b62f3b651e0aa5ca1d99294b40e377ce687ad7c4169e2cfd0846585a14ab6a451703268fa794325d001ec7804adc93ef1be1446f50bc9eaad7ab7241f65cf6a042935221b6a82fa76500a7c82729064ac269ec15b76014fd55c7721a3f9b48acfabb9b65e89ab4d358f1367d69bb051db5d4623695d444be2838370a00932d9fe8653db12bb50a8a55975bd69dd9a714e591cf804432ea87b06a265d4bf4b3272c8442c028e9cd384259a73777eca4b937fc769409db9221654b729d20663b7517677c314e9045e78e72fcf6998c08267692e804cecd117a8f1c727bbacc8b99880520700b0c6744b244e0c9b2a1c9b8300c59fea757a9f1781f56ff93e1d12c98e4b64d7677febea24df4517e5b48c3a0754d9770c9bba3fa2972525758859ba08b6552db038c75bfb2e170a244b9b88f73dcf83de76f2e38de204990d6aa381ce7de435515a79bf495046f92cdb2cfc1cdb46aa66e702deef65565f6d900099137cb942869d577a846420874ed931ac066f4f81bd46230c2e67291d8a8678921944774a44069c2628456b6091ee32920ec9fb3bf0708f1967f43e2cf2ccd0b755142ff659fd77050d477bb3b406952c467557e942a243cf6ff726b74fc939c901b3f92d1819da7a3970bda996bfabf8334735818675721f3ef72ce83555743ab97c53ab63264d64ed722270074bae43b401d05a4e9b4ffe09535e6bc30ebb8c374966fdb62012a2ff79078658fad90f1e2cb6c3c563c3b42bb72fc69024ef54439ebc346c39684002305249c8ca1388432f29955b4796266bf1e4c89ac2f64ef0387941e7422237783fe68d78be9b7440676f1467b5a6fde1a59dcd11b802695739a65603986258ff4980c147110621da3f210d4edf1609bba723441904bb47ca79e2291ad73d07ebc94cdd71d5ef3b09b44ab6bb2500c365a7280068949f72ca5e9d69d1d5d523e23e0ca758a779b7062dfb8ce8d2e7903b972986c2f008a47bf3a882965ec5d89bc2df8f5163544475857e674825605b13f727432ae470ec0c4173c4f36c8c3b5c46829842e9ba5d8bf6f34dc407359f363721694e333d3eb9a24ab218624b582f3428987022dfce70a6b4b169915463a0572267db40594966c96d4ba14eb8c7e18a24b78e6b04dbb65874a4e315e00470572a556f291b7e5495f9130222185ac92aff25dc65091a79aef537e957733c39a72699181fab4452ee419aadfd9b4a939970d0f5985f7ef7cea6efc4ecd4265f972512df8051698ecc69363bcc1d1a7e77a9db62f6bf365dc26ee40cc99dd8091729846874157a6aaabaefcc43bee6fff09734e24479165a1daaef603bde4cd5572f3a17914f3cfc253a14571cf27a883874d001c70611525631adf0afddc81363e229216a685eb936c182dd4b20ca2f361d12a4661635d1305a55e840877fcd158bd7b2b6bf78626fe9b3dea42ba464fa8f4a43715c512a2e39f72dcd69c1f5c7200f2bbe67928dd3932bdfeada35fd7bbb80fe41fcba9b074383d4c0989c97c72c2a7e5d37805ba9c326fd7a033e744100c9905b364ff8a86f1ea1f7e7c42f772b2fa5a1102359de32db2031f9148cc7fc32fd19ada004bf0116c665e3ab1115d1a65063df396b1d77e21b6e721bfe4c6ee9679a61b522c80d67955dade4bd7725bdce69b8d24758b3a9b4c9201dad196b57296abb29cfaaf34485fa1c12b7969850813ea19d14ae1cca6f894c838d3038680ff78f2986b6b17206f39a552d17292c40ba879e511dbe466b4920083b5dd3ecee967878be930871139937663f61a6e4d9831feb0565692fc9dd8b5abaf3db20d6bf087c8dd8e58b054094c137a004ffdbef218947ccce5ac106810a5008d76284b59dd729e7460e759b1963723722ff1b47e288d9c67531e5e9d9ce0eda9820b6122fb09948826410cfa0d22e3729b700b4db3f6da3c994de573315a45f0285ecfe164d8442821abd3ca12471d72ca3e8058333fb70be2948fae9befbcccab4ad3e2fb3b99fc832aabce9a67ef72ea892873a6757fe37e74e64f91e4c0f11721f8b295f5ee0b44ef0b47bee6614153ad39c9d38a1df2af2fb51b7837757ead7bb2b9ddf959fc8fba6e07f8a0bf724a52e3cc6f4366652f0ec1c3753108ae6acf9c7fecdb441e3b01ea376ed2dc6bb707f85ea04986fc90dea4d57d3da1d7d159439c43dbcee383c6d99206c5725e5415d548332226472741056dba769a865eb95822a24c79e36f33e924406b96720e2b469eb556f28629b0f03c7eea5e03296159e6f0730be1bf534448e71e6d72ce06a6f0f30b279318a3edc80e594713feb504127920ef9de64127a8a2623271b0b3f4b1cf20a79e620fd82da716f4de6be46f76a4dd592b18bde8631428f572d0a598b3e168208adb94bf51593c9902d43cbbf5f179f0d0b3dfdbe220807b082141902b2c399b95172bbccb6ecfde5a86e01e6f1eed272c75b675f810b88b72f56f4dadd8d900fbc322f603ac1ed52ccb824ae96338cadef4a6cf980bbcbc059675ae1f1ec3a869081b4d0d21def9cd1b0f7d22f901a1bd4fabc85a70b94b7229ccd17fbf84f858c69379c270df7dd4ebc49e29909bab97ebbe52d42a0d2f070319c92530f3265458ce399abeec5e1941834f4386784887be2b35055b949d7208a2871ec0f31177bc4c255d25b1a2303d01055f8785fcea1209a3046af5c5725fcf2e6462da7cdf83427bb45ea994ec55b53ad02472387a99bc8500b51b72725f8576373f92aa81472f915ba89d7531b202889bbab57bbc655e3ad9c0350e3a075de14c7d6b671024723a1159ce5c962bfdfffec58136a68a070985f87dc209b4755fdfef06d76546686d7b89d85c5fe1936c57e54bdd272f7a42981e802e727368feb41051e48790e0f3da5500a4138392c5acd2fc0ec3c73bfaa6f6f2927230ac48e7f3d8773ca338bf8a9c0d997b1071a3eba23d5bb092fc8fa2368d3272e1be0e886d1b3c95ecaeb44bb1a6afe9464a805c0dc8ac0a5fa170f09dfa2154b80b07093016ce40785092a36ee6ee74862c227faf3f85f0fbca4cad7414ba04f03c16b6325b4842e308c5b1b18852fe8964804758a945daf7c7e8545ae29c72d1b6d015b8ef38d9bd88fa43725e19f06960e27a18531ad028a63b896ebbda20fc9a06a3aa43a0ac2b018e7395e5608b88cfe357fca746838513120adc03d263bd7dcef941b3fd8aa7f757aa799c55ad5fd31c1c3d97516fbee0ddf9cd03451162744bd18b6f155c912863602003af96600d0620ccd951d9eb10632d821eaa72f49a68a878f3c949976b00dea3e8b20917a6b2e856eee4ae0f0f57ab3112cb50761c1ba7d56ab3c2dedf9c941975aab7ecaead89dcbd907f412b5fdb0a7f9a729f0e175c293845a1d63f4048440f1133368850bad5e160b4a827fda2c298f204c27b290e284af8837cc66c794db221fa9b4e59a28cbf9202d704bccdbf221f4c5fefe8f0e0c462926a0400789449e425a1f21d7180a487c8b01c82ddb660a4359d5dfc9f53fcd6be462c8b298968643b944072a8ee299fb9ec6f7fd615806e6e9505f0e6f66e19e8e0064f836096d82aab3bf57bca3555f04907fcc1de597157827112fa3ae6cc3a0ab1e7ddd8235f3892496a596aa1b98826ad91b345459d70f959fba3de3ce29ae187a7016b92c8f3a6fbe2e6295f634c91eb69ac681a2472f44cb340d38c201ff03b96d3f43ce0c61e75e95032c2c1094c169f00e50c6a6b421a56120e687302b828396faf9cc868f3027e92f3448574189348909a6b4a723a10c49ce64ecd660cbbdb54d76a55519ce762243f626de1d390b18b5a0ae272e862eb9be3e1eb161f3d84c6fb0f641f95d1ba8668bc78394262d006bc1b257291be0669aba497ece5dab749f68b642c83d1ed765d5e45385fdb8effed84757251eeea5eac8648fd8a97d2a9d9a63c6a6bc708b65a390dbeb2a33cc41779f721af23634b91b89faa49853cf32a1beba0078821361c8c2c9c4d305cddb91aff67e8f120d4258733d95eeffb778208ea08f4c9b0893ed1166d6a4daea561a28472127635a8afcf28037dca162353c4d325c22f4dcc30b28ae90e84d884d1817d7224c0ee05bc638d54b05a3024e6244a6b5f94e7783f1104e32a845a43df4f7f32d2cfa716d1cc4bf726cdf80c6e0e164dd2de202cbb527762d6dcf6d2c0ff722eb201e83a49fc68e283bb76c6d5c43903d1b8a78fc17fe6eb766119e722762636410928e07cde3c60f17c6829ae435184e8f34c8ac414163fba05dcf0bffad5691590128fbcc3a00f7a183b5e031e093b6b37571a1decb68ae334c2d65daa850ba296110f7f774d620ebe9248ee90b3b2332459dc80bd8f2dca2862b5344fd863a931c0bc8d6d4c2d32d193b918c7f247b37642c820a505bbdae63f4cd1315e6edd507a746b91d14430e4a0a3c167abb7ebd71f3a015602b27c3be51efb8cf93be0f87a83be40eb861d5a37185c45d97e4a09d703d02e30341d975f101382e0727f9c0ef874b41e2d58a5238a36b0d37f63bfff63abcbf4ecee8e7fe3019eb8401ca5cddf8c8e09d898209a39d8e61a309939630169b32dc14e4a6f6a5e20dc72bce71bbb0a9b520106f88ad586399f39400ee6e608d215562c487e708a1b0a41da933941d31dbe70d6393ed9040964ff8d943ec0df6a524d771f7c8d471a6a72d4b29fcbe1ff1070b285f214e477f2c58072516a3a0bf60a2fb4eaf79eb06e722dc1d43ecb8271e91d76fff745b96404c3bea176d0b43870fe350b22e2b17972f8dc5a76305d66508809336d415312dea502791f367bd7ddcd0ea8910d3c7f6cf2b4c53a850aa142f9fbf22a79be43fb0ab014a8d6ba7005e959a81e1f02bf726dfc7fb85d43448405a2432acdc42e416a65a35c8a16c56fb107ec2604873a3f3a28295aef873fbe24c80e79c38211814245f25b0a4b47f91b35c5dc40aaea7289a53ab3d35ffa3f55dfd70a8203a11857bef424094952d26fd364346388da3071457eae0cdf977f79b5bbf9cc3d0db63f6c509d90a81b94f1a67ff1d9d98572279252b801ba9829e80e3aa8ed2bbdb3a9f295dd97998c4c3da96b9a537c7172f84a1d1852a2058b8f01bd5a15fc6d33b8c6ede0e33180cd16dd1711011d8f4d141b656dc279dc9dc88a991bd307895dc856328953820c4d63a0c93ca8ebe1723ef723456172cac55e147391af19b2a601aad86db34782d46054bac591ad97621e83b8472dd975e40081027e7f83bd98e8d0c017e03a3b9f818e7434ef55135ae71477a1ac78a91f851071baacb175b82e2239c25a79da625e4a76f04225ae723991f78d679fe45318de8d3227f36e553e928fa6ae6a897df84e310b693fbc0039687abc8e1f46d35dd5937a317c434abec126352089b916cd64ed8d99728c7252f44c8bb062e422c8b00d15c1023079e0bbb6e87561e0f4af83bfbf6013383014bf608bbfe3f740b8390dcb62deba134d73173e3578848dabc5ffcdc6002172d95d3ee452b11af3fe0e78b52d82150e84043764529ba2fa03a0e93d08235b72f03857c3a9eb22267ffcc6cca49f49d46243e6a155561f408ba6f214be2f5572beb17d68b20e0f8dc2da19a5a8526087970a147999e99dbc34681f0ada8cd4728e2699e964088b16b837a78b29131ddf9017a42bc24077babf9984c03af06272198812b2ba6e4efcdaa557c3058edd3ee041bbb7f2141ae05f73105b0546b372c6213a9fa593cf9bea2706d092824dcdeac11f9d23c3b4e5422e5679ff5c2072ffc7fddcf2fcaeefd2f0738029043718c098ebd1aaf9727b21c5e38784f7d25c6d33fd7d966c690620cf676e57bd2ee37ffdfb9bf391a616d755a6bdea920772997d1c879bc611898e5207b70ef7d22b151ce5a379f13fe49788e5480367fa3af5dd391e50cc6983eca45c11b030a6e4f03d1417f0d551adddea63d61bf912725a7d35719bf7b0edaaf92e80e65e035ae50f1d7a7c28541ad0a1b7f4a9b64b724ca323e91d4eb673c617c3391861aeb5f6303ee86bd2b42479dde16a1c47df729eb4b22b087cfaa1bb310b8c681d69845efc50e066e5e98ee2645d26d72b2972db1981d17b6e8febf58fc471d46462063864eca9666cf126cfa3ac3c091c3e5eeb8199458f303852aafffec95b1fbd3d5bcc1b3632fd05f3fd8dbcc44a566c14285af3dfde8560404d4178d0adc5dc1576c6411a23f585e3c39f563a7636000fc4052878db562df145c9d2f41168e21ed5591fbd2ddadd4337376fc46dfd8327a7b64c0cd0795883bb739a59d2afea4ff1d189242164d25cfbdaca878a67b572090a760ab0cff7adfb1d293027b1539d891681624b8b2d8eb6a003d8dba6bd25b48ce53f114602357a366fe19102bbcb28ffba7a85de6087808701bf2a310e2e2a460d618896cda777fb067e8c733e8d9ff1f888a0534df3cb161475188062722fcb7e1fd27f041eead3299e8b0b0fdb3fceace3811f24c9ab6a7f3c9d89d90daec694492cb3f5aafbd70a5bd8d1622b338f20349fcbb7a40c284feee4feb272cbaafd7c2e8ccaee0e5e6dec1c2b55c0f49c72db370e7aa289a0184435458a72e4f1032e0f8ac247075cb44e0c17d640ed2b6a612c16c39ee5fb159f1bf5fc72263b00fb7c8958524e4eacad8806cf7a09d9ae868b61ba95869557b7f48aa80f7ec7d72d184ba6a8c2f378e31ebe2599ea707769c2ec9d84629a6da9c1046c012454436679a888eb24cad806b720f012e1735710ff48c5c131e21b2decc6be27ac0a17e010586407efe120b7ebd66cbe486a0ffa506fb15150c474bcbcd4c172942bb643f60434b80a3f6e4ff900ac44a0b11f5647e8d95628c59068cf8fff524183f15eb99810e6dd3e6f13dba213cb2703b7f0131bef7cf75164c59eceb1277532227169114559a031b57adba788adf2139d5c33102d36831c6510a77e5c72f5d6f02c8b600ec866ba1a57c509235c177b9fd91f7a147e3c451331b1c2c2724f262f93790db580303f9cc07bcd16857db221212b2fc5301df5d0aa338d7b72fd1c8f753efc8da5d5a2aff2042d9185de8099a51eb1ba2a780b2e04dfeafb32deb66e9c5f81b998039fd815e2462175976ffd59a8aa9200bf1d0878fa7f9e3e8ec1bb6d7f5786644db73104af296c5795201a307134004a90b44bfbafbd1228f92e9b366b98fdfda1183ba7cfe300daea8a858352fa5559069d0129e896de7282f1ed090bf1a8ab75f2f4082e7cc3c743602d18323f3563df1886bf7fabaa273c686e2c8ee77e7a3ccdc1bae6ef376f74125ddc001e0ad55659b664059a65729558a1853bc09d200ef41cc9086ab87c02008695c43c972d68be385d247d5f72e47785a25314e46b8a8d1595eba4267f90e16b97d9d292005442cade29d8c75d34d93e1138280d443617092432bd060628c0e67464f59d5c87544f51e760f00b100df3ca1ff2b88878416ee21d981d376351af9bb05633ce3c6f64d7acda2041ce564ac1df2a0cca16ee9c2664d3134050b692c7f8c5712fb04b70d9e6a71f20c81130de76369b79e0d98cef5197c54e329eb1c346e1bcca281460a3469e5c72884bdcefc8e16b4c8a0a97b6eea1e9776e62083e4b56523e6aa069f3f978a372df20e6f3eab1737ea647855b79076e784e3946c9493be8c85cd6fe2e64a250720256f295e8aee61805b43b547c0f14804e0aa11ad78254d42bc54d8e1a92e9722bb3b0822cf3165329e34d60d9ac2af2490cbe4367d619f44aebe64e2bc52831a52db28d52932131b6abc5c8714ce0c7d1137a494852fafe3f458f4c7499245d62135db829a653e6dae9823311d382ebabda1dff5cf5948bc960360db7a787248de3d2ca26a67dfa062b93d437c2f5fa71c688a51375b27237308180d987f372a19896e6dbe3912455114dd108435197c378237b36a5a0a6175bb0023408ad72f4a9510e735bed5ce1320e6b705ab5d9306ecd9a935e62dad769910b2a74a4720d2b9da7ace4f8fd188c7032c6f2b9f1b50c3a697ec6192fbe98716569748a6bf3e914722f58dddfd4a820d12fa9ef85edb18d074163f342f95b6fb806b58872b65d67214889284806411cd34fb11d1dc0991afc46b5f5307666f35432774072edf56421b14a0155403fda89b6d2fd903268dec22904b2f8dab6802bab0588725dc3ec248d97e6277d8d6989ec1204723500c4240f63ba45f258c95cb236b97268c5aac952447959209f40aff68b14c152e34ffffc6c25f99da57901191bf95a74bbb067fb356ffefcbf7d27bfedd983aac6790726f9a5bd6ccb495cb42f86722067a2744c556102d98838734742935ed55b8fd03a0485d02b293227b8fc4672a9a2710b699493f566d85f16a4ee8654cb626c386ff185ca00e51cd8e985f363aec3dca392e6bb4116742fb7b1a3fa7763a3eeaefcf6612b53d09edfc98455721d803498e3243843fbb87c62642519745f3688f1e1821cedf2b589ac2a5d2e6866e32de731582ecef5f2ca83345e4e68447fedf253c1759e70af456f5dacb672bf7af369061f65dbdf550d6f41e0c32e2c6a466bb62daa7dabf6581505c3ac7249680e1d4d78de4c527b510e8053c43c4b991c776d880fd1833df883e05cb372c7e61af2262a1403cc8ee8708218f22219e996c4cb237e2a3a31e13b9d92f872d230b901db4521982ec892a31075726664b7d89431014f29dc96dbffab16c67215ea9ffd1715456839436148aa1b5166a2ce7d5a5389d3027c071ac9b355147214ed06ae1d57b58843303de750e1f831d006b07b9ee96147bbe59d56c4d8187246761e999ca61e655807a6990999066a2165f5265abd9bde8a8a719fd02f3c7252c24539e7a934a927045f3cd70837e2e86ebcec7be959fef06a0f3279f5ef0e03cbe36707cc3679fdfc024c02ee210a4039a952714c9275ade176ab91da4d72d42871852a1034d67fc7ad68ee3c7095ca72cc0da217bed53306965cfb1fa9310a989a4720fd7934be7999020d41b213e2f125cb69dd28064ea4a1d0fc9b624b57a21641f7d643b2390e73486fcda1c6adc0f387d74b3c5c80323d7f116f2f72aa76efec1e12167249840e5a988521fa733f45b9f1f029736f13507c34d1927221cc96302779a3c3c726b7691625be2f5fc58c1834c72695b9f7e89883e9d67221dbd359108d0f2717a0bc6f85c1702025f2c4450716bbb7cd64fc123b02e641443d4885e84a635faae0c304165c32268ca91d10a49f46eedc807c45dffedb729915056cfd0c7257b531d8bc83e7b320815b7ba5633d27181f1ea4f6bd321b7264caa1110321632d48ddab5f716d8486e4da48257fc37b4b88568a6241d86d46d45c19e032647e76f30b62442357a4b05c9161f6a8591d6e4a74e4f7f17b95684960f7dabec9d7bb3eeb71f2ff96d05204c5b88d9b0d9d2ceee61a061184662516912282c650e8c35723aa4d89a0b44d4063bffddb50e87d1966fc05ae679c3409d8279cd9411364f8bc3313ccf40b8231cd290fba7c88342f945f77cf0151726441c58fd8105cb8ad9761da8a53af5ac27be88936cbee1e2fe3f8150455566aa6e6ab7b1c568f686ce0babbfc54e49fed8766c4e0fba7d79831921ab0b03b7224cf509baaa9d780cca1ab68e91312fcd2f6af778ed9040d6ee144463b899a63327c3fd4d577d771561f195b120f4eb4434da9d458879736f5fdca40538c0214115947a09cc2b00501841a576ac84e5eb71c3793ec0f7c9d95a6627d5a159372588ae6c46c58152220f6e0b4b6ea00980d34132e768e2b5ac306dbc437c355720839d2fdb49a828e1def70dd4246a8eb65f9227f404358fe0abe0effe7cda8635c919f3f4476b0c61be50eea8c2e8b7c30d4dbecc30687df93ee08642f0d607207725e0d59bc3bffdc8bd715047add1eedeaacfc79707ba83d8326783d933b72303642a3af52cdf7a574dac13f07949a6456cbfbfbc4db9e4f39f0b9913d7f6cf5ed633a6fb60c1d14775101232a6f61057de905f725cf7df2665b53012c6172ef507a6e9cb21947d48a908568b56f10abd27eaf1ff846eb7ad05f853f8f9e59e82b865e62d350b02fbfff52dc8679e856efe8f291fe874852a5d9717c9efc01ab17ea8eb5d10e8987813bb48cdcd8aa1e1ca44ad6059409b0156c66b425ab0f141c050a8c24c19f5ba98f90a22a96aa266c74a26a55ef2f5136e58573671e72be8414ea329eb71d8544af044c1c89fe8d2878588251433de99f2821359f806e7b68454a4eaf6ca227069fa88307e5a7a130defb1b1817ef69638b3c6ab34c47c47a060872377bf94e7e94acbd57a124712177a6060c51b05bde14434c0a7e6688704e63cc6a8714e6127b7032a8e4ddec84a8cbafdbf610023e2324ea504c7295227f6b390a1e460a69af7ca2631dd3c2ad38214194c210eed928faec0cd31e43b252f254cb05847daaf66ce38aa524baa613042734d10e7bb13a34bda1841c97d05b0fc8a2497d5abcb28e83d1bc074cfb434f7a37bdfb9ad4032a1d483c2e8112292cf030f2158b2d615297cc98f8806ebdd46ce2ceee19947a4b147b2b2066b3b47f8e63fabd8c73193fc77e0b0e9f1d14e807e2d3c89d5ada0610ddc2161a63f7dcb5bd83a396aedc64d8be3475fc41472511f9f234ea0bdfbb1c154e7276cba627d9337e45bcf453d77167461a7430ba8dc1f680a9e84377bbd827831c57f5ecbeaa13917182f09fe83c64f4f3a84ab8686752c3cae190f8f0ef64230e92215b9ae8527045e329f89cd7276606ef3035eaaaf01412f52e85697a111462362448291cf8701caae52693af551139a9a831601340e5202e05150b09d5c37202952aa656697ce2b72f07625861ce7a300298622df29ac8dfdf83e71a8bcf241eda292df5e8adfcbf7ca54ccf2d4bb670cc09ccab5f984e614264fadbd10072fa27fdb092e98987e388110b53ac6f538f8ac4cee213917253bebd6af2726772c825cbf3635114e3a8e591f5a0e1d02ce8babb3d3337b0723d1c1bde79bc305f0e3a50c137bea8f3fd7a6c17eda287e1e04e43050085c2b0a5684a8282fd7a72fb90fc97535478b9073cef8bed8449d2fa18036d4b1f9c6e41c9bd49cef11e72d0f335eacd762347d285875091451192329ef586d398b5b3b045a5d8eb97607288b9da6bbd2b06b7a898a96948d048611ff058abbb7b820b76ee81e4ab856e72bbcc1adaa9f862c4bbac0e7a176a47ed967dc733e2db7437f6f5a5cbb0470772bf6c611209a40a92ed0e086624dfd2f1666d54965ad0b61aad6142b2468e3e4f20a074f641538d74bd5a4ecfaffd3fce7df438bfb797bb94e25a029f399b06727600ec2362c2f8e1d5d5c1f0c74aac8bd46a138cd4df21743c79cc64c7de2d72e8d4b580b1367c3d759c123daa9caf77e2d8f1cf9dcb250f6e4af1652b6e5e36396d3d5db01f5f476c1318d7a97e5b591e4cd709cb412e13f241d353a795aa1f73893d53d9f7ad538544021b57189e33002d0ec54d37f57c716ed83d4cd5317293257517799ad152b42da428a6dbbee5a34442330143fc887c02b0e997901c7229c892f960d7d4a1764abea7927bf72a808c3774d263bd67664e9b139902987227343ba6611fccc82128127c91689e953ee6be1629737da5f1ddabdd448dcf7264c18eb95d711d4d4f71b6daeb765ecce9c60ba28b29f44f74e600ec1d52092598d43d2724d04a221c7ca0159104383da2de746a7006023b537260490fb0c672c06f872192eb4ed18cb93025b9a11fc23d907f7cafb9a7eeb9c1215b767feb33dbf23278b9aaa0025072151bccc1b84f6a4254818b8455709811d89ac5fb4e522cdc0e47d11d575cf3875ee6e0a1d837915380ebf1b7b8ba48df6fdac58d9772c28fd63193e4db5e0b7136512877137f83051a1f8f3e9ae07389000053ecc2724ceab3387cfaeb9437e461631c7aec2583d90c63e0b5b33531e0e32f39865670b63e0a670c34a1dcdcc052886b494fcec50931cc433049d2d282c64e195921728def7e60b1bb38312fcc0fa85e1b9e50ede1444713188e840d72ef110db7b6727c8a783611385c2cfd65c4769818ad877a50c75f06eb3f7a7b444a04f946177214d6eb9026e3f326154514145c1e7ed4ed31ce3ed9b2fde9b7c8675196f90e72eb453a764d01977c602d4d0dd3970214b59b48f4bd18057d867065b39da192725a7aca010fcce4c27b4bf931a7ed000930a0c57a3abf65687005d86620e40c72716b2fc54d367514df9f88159dcd302d2b41228ec0f71ad659ab56c65d1f69723318a1c9df0e27e8b649fd5bc7701e94f54438528e56cedeef2471f1c1b5f10a540a2b84007150f01788ca78ecbd9bddbd82145197b62c010198981de2f100725aeb480e6e0a6a863f0e495896a3220f4fb5b0e4de9861cdd93786920c9e25328853777047f8b17db92e432941efc55818f542b5974d1ced27b69e0c40af55728c1f20a798fe2f072669e90d48b9601f5784340d3d88aabd0568ce44977eaa4f31381ee09ce3ebfe226e7009be19905da2c42faff8b3c438d792a487c06981729feac8809c1e04b82dde68869b53ec52c10019f2127c3533b8a98775ebc2eb72d8e82de6e5b3c29632318469a89bd59f871c164f09f936f91528097c902ab448df926b0f5be65a56152b38ef3ac6f13d5bbe99a8d508987ab8996519272c022fc30b05dc128b0d78b48615edd05dfc599f575806395c8ff49bf7f55fc9c6927235d7a447504a80058b350df70a8f5c11b290f66008330b69075869a7488d1f002c9dee70251037aa899b36cdf89bfa92549169a93b1be2da50b10961f2eeb972b138d9ff26a10fd2a2ffda4a3ab34c55633e5243bf5af0127d45fa8459aa1b7231df22105ae3d57814372069f6a080218e1f5bb953028631782ec54e48f774727adcb84178e9b4e114d4d725bb8bcda7152d04d1f93c86179143a4c22e9e2a7206f2f05f54a1eb64f1682251e9ccd4087fd08fc2918462469a30c631366049727592c494e5bcdb21245cddf7de9b0a0b2fa7451080e7de9724a4ded677078b7296309c545901efd3d878f3533f8713869960b140a2feba1ae5e9d0db5378537209cc17516fa2b881afc960ba79cf0d21c591be9ce3fcb43c429c99a35068db72b251252b0b377144822e7b43bc99f44c6cadd501eda9b7de1b93a72cc6b682729b666e8f817cf16bd023719d42ce387380ac87d2362c4f330e4393d4e8ace372d93f0f6f3a60b204844160b33aa064551203d17d52eb759676b66b4c9ac5a272ffd7ba87a49293094b706c77b137fbb39bde5f51513d8fe98267b96aff8d011123f72b7871743f690ebad75d668a80f8a8903b9ece9eaa7f3f51b4f53c6e505e3a4a29ea6f959a90e8d2b35525627d75066bb5cb804273e2f11c9b396e979e53cb3a1ecbdf48bac967d5bd13c8f519f0fa71bf52921256aae09feb50f66dd772bb147844f187acba7500bd53340cc37248e98b95fff5a04f1797a9f2a2537072bb220695f4ff8d58afb7467960e8cd9a6b2e8c164e624129ce574f42d283c072813d284fee66ed9967ec06d266d24861416112491be50207d144d7ec67ecfd728db4c18d85292c6cb1bd3c77a39b5c81e2fbc2e534f43ccad2396b9109365972a9807c78a0213ebc085081ec358652a4ffe0e6f92cd03429a9127fcc8c2fc4728317122ec30d5977a989b93bcade56f9bb8ff3900cbd1fb20a09f3d2209e353c0ffa335064d866ffc23e5d7e696bcdc34fd77607d42b3f93b714fc7882ee776f736fdc8b66be03331ba4a872bcdfcff0a0cc53822f497dd3509e38a3d340f37285206ef2d8de9ed26d2e7e818766bdd0176f62aac9bf2f802939425ed7775c72f0197c9752f8bc6620a85801c895e3304408f87a2ba43ef14513a3b98f1adb4ccdb4c1021f5e2c46c3d53b32e3e44fa27293f885d6ceae98b993be05968de972d0edcaededeb1b57bcdf0fd1f1a20679ffe668a7db111062540b306e84ec0f65e54c7c649a4c716b6b9e522107f37185177d64b8a5bb172e6b8a06a3779d187233b8369a2a6102b1438305922f9c4888a85b7ed79794d89e600c4e62d64deb0c8d6a467db1aa0dd3405841d6980dbc98ea33ae8ef2d15e4513e730c1faccb87210b3be463b1b07a6ea2b88f7de107532f8a4b3b6ecd11b03a935c5c410a58d7214b8c331ea7b54684a800a934772ec45be5fb726c094c85536f7c15cf3042e12a3719cb25767f76ca4ea7d5c7db9c427036e6848055459b56fa6ef021de78b518b68c634ca0769799a9dcf3f327d43569523dff23001b36229716a7678b08072d51473ef5a3c0646d473b28d4b81bb946f2ca8f8e1ea353793eb59690d169572a0c012ced19cd4bca26e241f4a1a4c097fa9a16e503851c90471b64d49d77472270793d1188a1be316baeed5d412f86f925a8248e3540c527a9619e06061eb3ecb63343eb7f6b28a41091e6178220ed2f981b6509dbce58aaf6ba6d6159b31724c85e2740a563e980c657e46bc76b982f73e9d8dd2c5f34bc851829c8cbb3372706b37c14526cf4300482b3aaf8bc613c3bbe805285e952295e4fc143a802872943ff2a089f053014dbfb0656360157b7444f6b77815708276c1a365e69eba03a917a35fe1e85c24d1b16c2aaa52288107286852863109d34abab3e64b047c4f14d0521c0d87d75d40d58b10867a156060c14b9299c672a39187116312ae02019cb580274d54df6288c34ce38350fa5bde109bb3c213441e15ad4ab6aa736445aa337eeadf4b1e9dde3087b37be6257582babe33ffe1b1fff6cca05cf1f9ae72b2a78299851476697f4f56fe4e36da8685783dc954c9f001a56f716925def12df41935248c72b356a0f05c28f89c61a4a66995d04b1001c7a48c0a3e3258a76d63e13a5ce522870af41c72d7ba4c639e5821d5e20779202e4051ab08b55c3172ef7b7d73a9053b494eced42de77ae6ca1e581f8f3d7a52902239082173c9236cc56646923d558e73f7ade82516d90be6cae69b27676d3c935bd850a13632aa72a3b621c5111cec897f7a6ffcb7dde04bd1329b3a127167378c2b80b0830c5a72f9592652cc826a6b709798a6c2ce3f288d07de6c8ec813f657cbaf933c1a3b7248679e2d6c9ad5b8b4bb9a85168553078bcb4b7eb0ba8a7c4a617ef6c9f74072b7dbab0cbb6668e62048fd6f83ad87fa803a8d8935b3ca323f9a7ad32995f360b0e269207e3124653c4ca6400c993d4420622eccbec416e158b3512255fea47253a8fc56f7dbedd731a3b29e06fd307a66bee4bde9a51d10d4436f7404aa58475685a94640a110c547439d0ce7afed7d3f434bff9a87eef59d1297117b9d33723670f86ff9d508897a89c6c861184f3ebf8ea163581ae7465be28ae9176a5e4ec4a426d644a38b995b3c96acdca4c7d9a6387edd4df4c251fac85102f62a1d72511dd1582ef0a095db2491761e2d1b152ebf8ccab442f4896165a4cec2cada72badd3824e9851a61c94b153a4e76d8351f1fe90680043c752bbf2153495c3172ccdde16310ebffd7b237bb59fc779daee97b3e20540133a4aa7384e3618b6e4912e663e6805e58364e1f3a420e2640f297ce388815f06f0eaa3e7edb5b6f3c72803b8f97d426a09a5762bb64b21f4540cfc2613f875080bcf113e193b2339072166b88250b866edf632bed75d7e3e4c0c32768fbd6646e2bba1d1f18923586727fa5f29405aef9e6a18416a17d4c3a6fd5bc9ee19a4a220f6c8803ee93901f22d5e6fa378d02c8aaa4b75b333051000bec6706bda5795e43505339326e7eb63fc833540c75c2606d4768bbd480b3f1971159e1114cabe632a183d66c5626f103667929b055b9320924e748cdd97b9c21d5a7ecb82cac8dbcaebf521681803d7259368a004f053a9ea380b412dc1acb24ccdd9d6c7dae2071eb59d00555af527220d2afdc1a04c58c311132dc6c2fa93a89c8687cb76c0d53e5659afeb2df3c39c3a79578c93d50b755967b879e1ec19f4ff86d1c438edd3b780e1e9b4f017c023e011c209511df601b7d379b74d819d5264680200a09ea8bbf6bd8b92c1c3e72706e3572de2ddd183f33a8299c1de72bf2769fa9a9836a913554072633b1a172b48dfb61d70419b07517cb6d8f3c7f42e2f808de61a6db1486cc88000b1a270d9807644876a53d9cbf558cf8ada377bae16b81138ae1344642e87801c333b802ea05ec2f9c6aad6b0c29fa1101841d8a68672e9e47632651d479bde033e549360b968436362503bd0468458d4548388ef515e1d62846a51f86ac532b649aa3572a08ddf9106a1ab4edfe3b43bf2f7d8d1f42e73671d2fe23293d48ce20cb6c663fa47c281ebb7bc199939b3eadf38cd1b88d4ab1ace13f314e7dee4be862e072238301bd3ffec1cdddec6caf1b165f2c6d5fe257dc2afa262376c1c39b8e5f2bb97c6e030df1c458dc7aded123c0143adcbe6e64bbab20669c7d8b9dbf93016ca16566eb4fef98101fd16576255c41244cf08063381af32a7ff4cb63cf4e2772e9d630a3ef93c578886548e80053946826186a252cacc11acafe2685f4ccbc72a133391ba64aa52724686d2d2e319268c8f5df11c25a6346a2e40ea891c81f3376c112f933b79f5a81f01c97729bbd05a0d6c315e73e8f1a36ead77cc53f3633c28a9af155cc4f5d4d12abcc1120f5589d99ffba30cec4174d5fed868299b872899325f84df0dcafde694e3b16b103f25e1a36afe2f793c3e5000f3c689c6f72d78eff552e5dca3cb6bc218d3f2fe2f3c7ef117ab10f69a655d951f4d5c5b65a0d225ba27326cf00252ffff19c0e13f60db447f43c57e408ba30f2ed8dce5b720f9e3184a053b841f23fe74b015f0906c641f7284965fff46dc6da23cf3ae131f39c406dfdeb690d207df3a82d68f673eef5aedb25563bcfb212bf16d9e30f06cf73c7b392068c9e335ec51e6fc0ea4c4a1cafaacb8a8fd22b0c2dd3d02e30722d47c80e00f2b4271a02d7ccd51d7082493a7dfae21b67cc1971df903969e672cc427f5afd8dcf4b232e223b325074d6c76c2c4262f9833831ee90b34765c755182a3d5cab9aad4a5a9d5b28e92bd2e5154d5506a74d17a2ec31dd5b3538a22f6f66efc15737508d097bb836abc1c598ba3b5a26f3406dab42ba9380feb50f3a17d8ca28fa4ce317642e6176c466842c134036d15e062a7e14d6f4293f1b2472dad48c7c09d5ca3220a305af1931d216fdf69495c28b34208e849753f41a4a72ff483015636778f1590422b783497539f619e37bb35b8af95a6d1151b1557d720d01ee690347d902b15c24337cd07362fc9175fc0e8af7d8d359507f239656063537b000b404832daacf9f52223411b7c5cd85e040e1983c1c20506b48ae82724c6cf329db983c215c055a0d79685d7825e1cee7a14002b57be819be2083167221599731ce1484378a080054b9744a8ecf9e16a56c803b76d0f1d9dc6e039a60c07dbe31a4761e33e8a41b4ee0677536cc5fc8c6ffabbcf58e7076ad82f2c34123b428bdb2f416e278d95474dac5049bc358614f05365d605162f371a6cb9972effe1104b2e87352af8a41805e0a227c556cdc2838d3187574d78bcf6e03fc729bfc0a800de7b915dae7a9f3d359536e631729f2e9454a35778a141d86661443f5b3bf4f402b6bd082fc83f897938a269795c80d4bfe342b46bedafe361bea725e99c8f2fa1d00c8a4e04a38edad9eab6267de459fd8635ce205bc92b2e488037d23559c007cc75be45e8cdab2c8a7d261a3ed32dbb47bd052466452d60d1c72b86379a3fe62051388567b339cff455a276e7d6ee5075af64bf527469a616049786070eef366f739e4787ac52429dea53a215362b0ffa72c94093df7f751a4000d3df81ea4114ae64f93011a12f52f8a876bd43ceddbc6304cd5d5d9a9360d48d17fbe8fc814b97ea1ddbbb4040bbafd486852760bd15c285206276c6f0764729ce8869d2403c188b4d42174a4e1061bbd10bdaa07082ee64fff0c5fdceddf72017c41bdfcd4f6249fec93b65ca7c16df5ae74b785702b1fced08b6275c2d3720f1869bd31760ce1070bcadba0d63e784d8392b50d58fe1623fb1f1168a51109fdda4f64fe875f1ae75e3cc847f38c5650d751be17c4d7ddf81dfa64909c9e08ace438acae3077aa42d17bb71f158579efd0cf95f9f7db79e3c73dcd85e27023c9f11a44e5d9d17f23b7db24e51cea9de52a571dc097d1d611bce41a94e66672054b00b76bdd9f794749de5d6234bd995800222aebf8272b60847bd4190bc852c12a3eec79cce9c1e5dcc61ac2b3b6102aaa261bd5c84152bbb132ea2e64fc564622f7792183b4fe11458488151def5b087d824f368a18802ee6223a2bda76596759423e20797e0c5d2442cdce175725cfd3363836f8e2271d6b3d0c4622c4726c42dc39f1565577bf99b8ed9f8a269d6c23e1b174bb5768795049d11e901d72f46a90f1faa4fdd1ac9229a6fc62a846cb407a173c643037f75776f8cc54e24e079728309cbcec6a2c2c94bc2db6f1b58a83e8e2eaf986a3b21c6ca14348df31d1f47911090f9a5cad687f1afd0300ad927b89799d0e2b5f621ecd74bf5d9645771da8eb42a6462914b2e2792ecc0358f7bd1dc4c9c12fb1ec87d5b834e30472e736470b3c2753f9f73bd2b4bbd2406faf19aecb0474869ec0966a4affc13572e99dc019a17f89cb5853f92fae0ac041829db1bff1901ae1949532d7247c3a5a29c6ac8307805f55f66febf28210f2f6196063f8e7d32fcbe4a23aab66043f5137d91844c7548a69c523db29c76f40a6e5ea71a7a26a7185cbd60670001c460aead27e4a11f0de74b6652ec0ccb079c459c53ad71d6f7a4fe786f7d99911b572dd7bc7429462ca01cfa5b331fa4af7e6ad787463d5fdf5406555d0f4321f7020d9847e1d9a4faa12eb32c08297668056cd20af424c6dae0b07b0e4bc24e1334cbffd3f11d948ef27ca33cadb3280c8364392394652a378371c3d129559f7b041af70b7cc30aa21aec0d6ce8bcc955f8887a952f6980622d4595f0c5a55e159723b4d6559bf6f98141741a8d707185ea416fb6bcc04a05d0a1847cf78d056183b428443df6a1b539bb9b1eaf0ea2a6dad5a4361e4fd024301703ad399f8f5227248f888828d0f9175298cfa2b265c69cb7b809d402ab11f3ed6212c24fccd2572c8e414a8993da435c641cc8027d2f9786353f15982dfd6cbc98fd18076885972f67c7e3ec28fdd232c0b34ae10ce126453a29f4d6f97696aa1c6945fd443bc72d8486291733e003d358841ae741efaab045f2e7b1c22789b40a3cf0c989b8c72feb645b5861ab9cd33c6fcf70ff05509b0d44fcb68bcddc7ac0895a4cd5e127286e586fa2599694c13f02c50dc3259a62b3a52592b942fc07a3ac31818292672294364f398958c6b313c769176c44fea9c42e982035442fe50ca479038a1bb53b2dab11df120b59ab23f5a20e3f90cb01553a92abe947da1190ef2b1046204029799f162c9e9b28957644897605d8b73b7eff73bbb875289c7d9d4b8d1b1856e30e0e1b1d4b070025f7ce9cabc613c6b49fd44f16f6120e71df433d0064d3572b24a2d020a4e92d5eb77461cb829a3abc3e58f53c36da273597b9670bf413172eb80bcdc1111b7d56751f25cf5164ffb65bc8a8aa4211a98c82199c486734f2632defae9840f38ffd9ddda0605b42c14d3807ed9dd4b764cdfea87e7024939727f34a6ae0d784b5c9b2fb92b76dc95c60c43894d80e876791b1f9aa70bb0c072557e41d7b878edbcd8d4ffb87347e6d3e30a4c2f8f3bfdb4a6563ab62f238a726fbdf2973cf8a8377500db30e37639417071e74476ed82894b87e30df398936804db3801975d70c6225b13774cbc1e265d39a23bdd39866cd1a4c99a4251c246f68fd10a005ec0f6a54d236ae592ff2d630ac0a481c639b853b488764d10474bd753f33ebf055e856b46c7c7201ed107409417bd4c2cd9c7493ce62444ea8f724cf5614d762566568ece39e03385d7046390b38e19e27b23cb5d8888b5bac2721afa2738bf86ee712bfce6e481c49acb29c50eb3da81f7ad389a1a07e68fc8727bad8552e022b4a645cd4725df5f27d6331f256b93208933afec74911ca1a372a8ddc668e756cdb026917a6b6672096f3a5ac5fc4bb9470183d8c3ff40f41155c8bdf1d1951a66052ee7853ace7accba79183922c3c3dd809eed4e44856aeb72eefb9bede73f747e5ab4ea0703cbb46977bfb2e7c896f9b1614a7bf569abde1382d3094640e49d17315283b177a8b1554af5199d74cdcd52155fc05acc535a7242350861273127357c52e4bb381782cd6e829451154c33ce5911e2bc6be00d72fc4875943def905d2142e276776d49b5d8566508af78494d1a47662f93949e42606d1d31041be81a8f52da476d2381033e1f856a23cbc22b6975d0a8906ad672dd273167eb101334a1cc47ab93c8b7db17479f509ae4cce4ea450c63a1ee3b7284629e8775afd2b2dbc68bd6167f33e2775091c0658ba8322067fad8fbac5272bfea75ad8218aece5025354fe9f72c8234ae116397ce080c281d387b288ac372db103cdff16da23fa15a2f1d737d2c9e429f2661ed54a4fed211f40d754cd27249e7950fbd3c34aa40d24c0b9bf5435524720c8c4235767243d5381b8c767872295e1f485f69174ddf1f81b8283081607d64c75ba3c5aaec52206a764de24e72fa1203ce8b9b271623c342acec6de5c66c965e8f9f6f1611ab608cdcca4ea451122f445c99fcce41eeda8f825ce895799fe7075ce78670ce11ad69ba98ff20729b4613884cad6d68e4c081241f5d7ce3cf3f29ae43d1095f8e9d2acfbead1753c5fe4b74900a8c77ba94d823be338d1824c0b269453b99a651952cbb1dd38b72c093de802e2ff351f5dcfbb6c218761e634cbf3398337399af57d6bbecda661b19a5f203c559a3a509771b96d55853c4eb08d492ea42bc3ed6dfb6c097ec530bf664898b5b32cf8e2138dd6dbadfed82aa65a0abd03e9b23c76b4ebba339bd72970e0d0ceb71f2c529ed91d5067d3b9fc0e78ebd91d1ac60e00c63a412a8e5729b8846c936718e3906f345d5c3f1aea89fc4f4bab5297e884be20ea3aac83f7269a5bf744c6b805c2aa5a5287af900cca645596377e2a9aff33c621b34846771a064041d0e455e8e4f7e14c5a671f9d2937a18b1eeeb656c53ef2f164c0f2a7212e7cf7e51b2d6816f5ebac08d2e8d681fcbbc372a20e169d54d51796aa79c129d38944cf3489ff352179d39b713e2c221baf14fe0c5baf785ec10bc5503f152428ed3e6c3e7ffbbc8cb883b3101e6f06640891406ecff39a8e0047c14243a729a4e9cf317d202018c8df01ec1fd7df5869022516ec0d54217efd915a9f8d072a5f1e8a093d3010b8eb68dd6b73530feb132c74e48314fe34597bce0a1148448ce2df6022f2378f7abbdae39ceafec662168c712cfbf12c020dd31a29e140e309da4e9af85045730fc063d9bbf502f65244f0f23cfce6b36da183974d9f6e15acc8664961e2e4756c4353992492c83db54b28911431c9730ab359bc32d72b672243641fe378e35d714286f36d1be1de9c9ab5c3a261e817f3faf419f14fa931f4ef08200b3c3a25bc0fe06750fbaa1d4a8bdff64a10a826f166e5e5a3ad12e72f808f4706fb6a178ff4b3a070bcc2ed0fdc7ed6f9b9ad4782c5a75aeccb0c57276b88d2ea5562a948dd6ade5c02510c36e072fbc9d87eccc9c693a2e465a1c72db6ae77293f116966647d8ee14aa0aec3f6e70727073540e30dab69baf6a9572e1bd6e67aff554a04e0ef02fa81bf701569569d275e987fc37b503a133975c2c7a57c1cc9c4136320ecce49473fd143eda54810f78a08f906a276523dd30c770fcabcf8d372c5b5b0cfaa3812d5db216a0538ad7c842cc6912cc04bf36b07f4945a83e5ef9970fc2e598ef25a8fcea251ea07c1c6a911ecf1ad6255e1e87a409109faa5965c9f2da232d84b3c33bec2558f8a1cd0b8a76b2fdab0b090d2e4216bfe4974423eb1eb4059c25cbfe6baf270006d21ec411319a7a0b17d89a329b62e1b6cb638c546581e9e3bdb535dc15b41f9567a648401877b7b7225c92151123ca19e2c0fe4f4ce4c1cb251814f130d42c2743a6fb2f15dc2e06be8dc0d7cf2a0ae8d30d89226603840fb4f0803bda88a6695737d6b54118178c08bf7b804172f55841a3c53267f04e64e3c63a9a558192b4dc3b2389d103374d41f01941682f88fbd8030203a77828d188bec622eee8f61e0c1c10f8620179ca55f84c940672e0a41e7b8b0fa1f6d35d405b5c923d57d747a9f494fd0644470a1b8fbde10272aa9fea3ae35b9e187e665316737a854aa53735d5b19f220076634b03d7a58b72012215568cc6ddecf5b94c00c7788fea75b18ee29b7ff4c538638a580327dc1b6c7b965fc4f3f053e5deb843d603938c73069ca6e664d00afe62f382c8516f72e4026f712fe490ad7dab82492008a676f4d065ee7604594f1da1bfafc2b60023fa1db27c661576e320dde24a2f6d13d4590c3e53784663d7507dc2920513585dbd92777340673444e2fef6d5a2bdbc2f8005557ec05e843851f849b253cfc23ff4a23eaec86d438f15d4fb84cf7596294b57e9ea6386d0cf89f2ee96e79b94726567f16199c6659311058bb760eddbaf84d42bf458d7f9a2af81b2b085f9fb7245f78ceb3e32d7b046948916c84de8bc1bab2b96e7d3fbeb11af05d07ec89c7233dac13fa20c62fbe9031a51f45cb1c85747d88d7ecd7284257466268863c8106553480adc1919a8950b92506fbcd3bb82202dc3a91a8c74cd70d78cd338f14a4d6084a354624d382618ea347d81d6edc4a12f65c7d049c26a1ae63b62b0cf2f7dfc2a016e64fa1e34a6673877c578697e28a574076f13f5a5772e74dddde263f39589e7bdec156f9151b09ef1c413c1d49b50d1d4cbc2b0a92c5adf392fae723d7d84e7dc4406061e2fd9be043f7aeb733bca49ab5420a98404b547fa66764a4481cfc6c003191c5828aae266ad34681cf491fecd7c78d309ec757b9206ec721179416566eaeb3f1a70d0462f5d45c10b263feb3a7692da6cd3d777744ce13ae0b0b21dff48c3e3301bcfa90666af1eb6b2ce558eaa69930a963dfa07db484015954e35382af49a2fc15a6a841c306cf64e837c282c6b699cccf8751e58fe2a12bf8d8cd532a16da686d4bac0c6ed1c2d4f7b7f09055c1d02196fc8a45b5c72211c470fd4a826dcf595eaf4fdb2abe548d64f24c9f86d0018fd2d41ddcbb0501ce8d17815fc99ed29adc6983ea5f29a99492d2cc3f421eb4b69999484d51f57a1c442fe2f1c6b2ad82098d87495abe388e9e58fb57d7f778ea8610c4946fd587fc6a66adb8764dfe9a497b5e34d6bc32da8f96800d75b3fca87c7624bd5d072c3cfd4dbf5ebd875dbc58168c5a0801fa0691b925af6b30475d64a29b8fbed72abed18106f8ed82d08f3c090c05c6b492e28c2a7641e6a2d3997df4ee7ed4135fb376934c33b5b30916c8fd785d3b9ccd7a4e5523843b72acaab5eca70abb5721c41eef68e58bf6b69b1d275a6442494d98b9cd195f1bbc2eba70dea05a7e50745861af3223f22091e31d027447d2ed2422a30dcb71a864cfa161707b091d772167452c8f76189925beb22f0f7db8728a456c4319c1f0e1f7fc51474f3f8d807339572d0f53477f5ab333701800a561c2a9e1ef46068fca0c5d40010bfc9d0729f192554f9e7ba1a07d05b498b7dbef6453c6ce7eefaca86cc0ce0a8a11eb5408aa4ea08804eb68fa760615fefdf718750beeb68a2535175f720cfd46f554922195e3c435529aa8b970478e635cb3e8751fb037f039dc253a5b7fd2b2389c15a588c2ba60504840d6681a925b8754c35fbb7b06824acf6ad8d02fce17a424a72d81b50a3b70e67e0cc1c0410b803f655dbb3c4de7ec96bf57bc3551ceca900222e5c42ef5b73358400bf1f536712f063a1894112980456ab3c1ce9bb754aba72cbd4522c46507281448ee8b7702cf2a78122e26ca4c013effaf6f2253748d72f70eacf9c5076f9e4e1c687b853e6a93aa361b2ceb49298050de427af8f425772aa6957d09dc6d6c46154b0fe351e3daa4104460d41991fc5fd87df2456d6e87296da62086be4f739715ccd45a2056053ef2881c4c5344f2c05c4b8c86df2e072fb385ea6b7f6a2de65cf8a33d7779b80fbda8b92e8374ea5775829a65d0c0a725571b6272ca5f215c83e47eec66129a3b7ad67ef15e0a30a8b97bab3caa5c801732ec32fbf1b72aeb4a4d1ec8edc43ca014fe8ee5e0377d366f7e10249229a5d83053a4d60834e15ba87bb7ee26d649e8679b00a138704c28442023e1148bf72d8c52de42f320b341c377a139f7b1c26bb92236ada2eeeb612e5df0d5618434027835f364ad3931f699a4851e6e1936b4e1e5e5f27e0c00d06d92ed440c9c6108ee7910345f97e1b5cc63648b3416664bb7e0a6920d30c55ed555ce239beae41f76fc21f609d78583b131788edc6a4ea45b1b8049dd72614b7c6c17b4d357972b52f2ca13e262af1ad6f8bea337e7d4a23d30a04d3e6fc4176bd9d3adff2aa312938298baaba41706fb6ea1fd2afd76d92d198580aa8acce4b409b9ee5fbf07214abe34195d335c16ae3e1c6d428f451fe42e2becf111e05115c25c4e4b3d9728de6b5c4fb80cfdaff23f6a07c50040b443edb5e0d8a6dd95bae02a6e15f635e549e8a8812f47aa3173f13e26fa06572a22b3b50fdb27c08c419a237d58baf7277d089be3c3c74609eeb5e8d754ade7d4b23f06b039329119bed7afd79231447cb692f53642854acfbf5be8e8157737129253b5d20f93b45da9b6dafbcc80f2961743ca1aa564749a215294ff53f55a6769da6355571b75ca9eb1f57da3e085027fdadba71a57a312fd983772e07b8cc745a49073c7ad9b0ac0014af71c49061fa86892c12444b119b1a2d03507aed642babf37e5ac9eb28dfbf22d650e8857205722e53092d556acbcb7eec3c172e9e4a985d0e45ece6c38bca021805f45e155856c690ad7b620be78f959647c6b8c640794cb9a22c25a8abe545a13866f63113b4cfaacef50e249973538d9f342ce98b66c1c0d6ec26b4fa7fa684185096510e9db1190b663c96fc5bf4d1d4c0448729adfea68179c4fd6e65df5804344a72969c536b46e8152a6798ea2c6ef56f94f1804d85d9ff4f7f1860a021ae11ee05134200e3f3410e7cf804260f15109649b376368e7250164fa697e601f897ad72fd9d77edce2ad36c5d061837eb958fe3bba5ba677dcf53eb5c2b2f693173bf72abcfb428839d43d4e4c0815d27edc8d77f66170f27800c7e8f985ab7f3468572d0d01cf077f92a4294c099b603b63cc3abbea18cc5f7456f4fce71488569b92585d22152ad221007cf2356229e393a83150acf90d26e35f3750a2f51191ae30f44254fdcda4e2ce1829aacac076a4fb2633951ee11ab32b3f9a809871a5582728bcd15054e9b243037907480f0ecc4dc417ed61dc240becfa5c188e4f119e4469c9a81888b368e80a04c5314399a8988160f1f400c64eccc0a343ed737938701622bec649e568961ca192939b87d10117aa97eaccc94ef3a7979380dcaa120569ca06975da51536b181dc35cb68c30c090f7ef2078c2fe0212ea720a21b00a724a12962ec0b9b4454e78d8a7ec328eaac8915682a95c862ac4d70e44edc0fa72e46335d4a10b824ee8c2a0b5c037ecd9a62000298bee8debe59b0e2ae3282372e1c764eb884eeaa86f3212f68207bb1013bc774aa88209930e533808c95ab07264eb900f733c576f76029dcc518bb78e0ed1d239527c226453627df97698f9727cd08aa83345cce9b0b8540a1e362bb4c8b31aeb25887ed8fb7ff22af92e497235b5587102ca69404a3623ac7ce85a802fbac8fa3da92bebc9f3f304fccff372ffd4074410bef7091f51ec0a8faee2f587a308034b69079dfc12b883c63f7e7288250802e3dd9feaefc55ff4b37eafd0bfd8591bcebbf0100eca941d9a74f8007fb2fd472309eb488c4d7c4ebeb5edc5cf2f24f7a4513f87c9e2120f54bb113805ac8e23c695a93d0892fca98fb65759a01df1db6fb7f53e574cafa8b1b12e72a35a0e67f75bda44044504e41c0f6f6cb77a03fd12761a7d54441c309f93927212ca45e54b7769a7946aa34cdf819a1bfd7530abdc662340195a861813b1f70fb0fc1597b53a9da3a8addcf231fab399240bc37707e4152e40305b4d6058ee728ad546099e70dd68ff0a2016a5726b7304011c7708e1ce40b1ce8cd152bf3c72f940e6b85b2971ecdfcbba485759dff6ab51ba5341fd684ec6bb8deffab742097560c7fab6c57d42f66027fc031062ca388d653e4335ec4bdcde322cf4f748620631ad7deb0426b868a099a8a57c3e24925506fdcb6065a54cc31f856c4ae872a0ee420acd2e7a85bfce496724b1dca19f5d2c7623bbc120e425745d3e75aa72666bac82768588da5d8bee788e7cfe58d6d05d5967f4c53e5b5671c32112ff72f169c72f051c8a41d4866154a15773b9b2be853e57941e37c6c5d817f2e18d48f6714e58f87de19b5369cf5d29f21c956ff67aecaee552c9ce986e3ee851093eba2349db456c54eb65beb3ecc1d333970d6b5bcae84a89519add56e6755d7a3200dad3705e68e67286b7a7cebf06b281e41fafb74112f389776fa4a7920fa1729a744edd179c9f0d30ed4611050f77055ef223b3c459e6b61e4d984b757a7b6dcd81f649166a4c20726e09ab4ea12952e41225780f5aa1f1b522f75176a25506401ec8a8c376861e720035b859d12968a69a44f22c60bc440cacc59860f5ad72f6c9e6d3249c001dc81d124acfdcb150d170aab7352d3a632120cb3c4da9d972ba7f75350d7c3af693ef2944512553596400fab6fba62d5677e7752ac4ce49726ba4d9f4239806ddc2bfb1d325b6db2acbb90ba598d7a1d4e0b80691c5ef1671286fd4b4f24a6b0f95a3cdccb5dea1d6a3bbcbbbd77495cbb4c152cde7d8c372507783164813423d66d5a882f2e2194502179ea6af8f89b7df326549437e3c3ca6f708e2452997be1b9ba785e987c404bcfdd699e96e98b7d5aca5347fee9e727d75c712ac4aaaa33061c5caf9c2a5c31be705f397a298353909fa9bba82db7227eca0374eb00bb7d958624909333819f3c7f93f2546dfa2486733575415f772638ae00100e996c796f9ab6ab4b5b5680c174d6a55539b54121cf098d286dc2de4fc9087594689cd0070eb6e94c4ac0c4c0245ed39ea95911f2c378ef091d65d553e9e022af009bf6fc377fa49d6392f53f7e63830c7dbca5374e624836dec724f6d77cd43faf246834b91d76163d86192e8010cc21cfe558e69f5b1bd04cf72f8695249ac7c26ebb493c77df0b8a1d295a503a9c04237f126f22c1fd9215472388815d9ee350b4f0e4996e004e06a474ae348415d7dc5b6a97bae686d237f4134c9e62b5ef410d3e8f64422d2f51d9f0ef832b4d3c198bc5791424ca0248b7255ab7a59abef63847c0769b78909870334f68a762f3f8e6d417028dc8445595960c292f5eea0d9c652d61f38bb3364e972c3d946dfa100e8f59cdf98323a0d19301b679fd2096d5577a626b167668fb8632ab709574a8b98151d055d66651f10239649757773cd2b4423738ec6929326e451e4db92485fd86efca2d5a2fde91b793da324200244b7b544fa1659d3969b10cf80988e36584d514727de2442027231f0e6e5913f272385864b45fd47b1d2dd30c7d050bbbd91e3526cbd86f1ad72a9867bda1acc3b13482b3d67ea31a1b2917555133b1a7e73c40bd995f88e89721703dd410ad3acef2c7c2561c1deaae4418922fc4a64a18e02283b838280ae415b6066d55c44b99609bbc7389409e432c62ec06242a0aa1fb6e74066ffc8267267ff0fd6d15b5f6271824ba6daf54401d4fb6e486b7b7d4889973094c51ca84ac781b04aa953f4b469bc8e3b75d3faaecf82e7b082af0e662112500a85c746725592872b15f4b55c975498292de10278a50ee90e8184444d27517073daa9a472409094ab7f448142bd7cc9c953d10fffa92cb5fa5186b307029d5eae6e75cc5d63a52d20d779537f49e78678359fa5b9d850433058020130ece64e54be006c4a8ffe5723d326831c94150d93097cc3234e53877aae5899bd65d648ca113b7746cba1da844042adcd539732f8affe382fbe82ce9702cfb72cca55416a136b06680dbd1af6b33596e26fee0216ddd34c47390a7a8040cef900febff7d9298b2b723333e9649262d53a4a4719fd58cb68e62643717ca2f1a1e6481807e0f52e8417c9a8e7709fad26b326b873a39a24ae6f0450d8e3c9fb69a0471171c87ffe3e726f0ca856c991f93ebc40958e41f064fe266b6bc03190412ae3e95bef80833172705e1b6a4e6f48246a47fa427ed4926824c55b7e6ad287a5775d44393d47537237395fa77a41901977d0a48027de9645c969fbc2144829da8bd868d92808b472da924b757c86ea96d69c17c20bd85ec6ce34652189d41604f9398dc555ce7b725def373e9ba3abbbc8f6a6337bd273309206973979dcd8e765e0171432f32305b3a1b000f2dc899b29a3a2195dd3a8ade9e3b962010d12409bea4111c58c33721fef34bc4007a4d8340be1c151d0a05fe78c1cf884baae8d29452e2dd651b621521a5ab4cfc4e5653d6ce87091fe5e02429275b458c7670490bf1abde0ebd05983bc1de1f01e46feb4892ba016c3ca8d72f833a7b1a95f85a042f39c296f6e72a4b02270a47067582d04e62a143c05b8c070e11285c870a250a2d85b6e4c7572716d9b3af44ef4d97e13d276e0eb33eef07f602e3352f0b601955d5a7b6cad722f62de8a492f08e45768d5e5106f78afd921def8a29b440ffd53bc14211b3052bde336ce78d83c875d1c117696d2297ee13982e935d93f319379f1281007a172363e3d331f9a2995d6f90581e936293213e80757799642a7e9a2e60df014f772029a91a7a9a8b3af48c5939a552af5f5ea71a729b556edb67cc23611105da70017937c5b6ce839dc6ccf8463f67c3ffc44e0d8143b8847220034b7c52a243a7294a47f9197dd1bea6d0b2fac260b1a83b4bf35130b7391ab56702ec4aa919172f203ea12f8d8bff5cfc9df7124c0d10435b462bb1ff0b5c953eea82a1d3f0c43f335947fef7fccdefe0829c013194816a1ada41217482d1d18561888ff7c3c15b27e123f7d2b44cf79e34ab0bc240f8db8dd9c1f153ad60a7f093d51a2a1f7103721d743a420304e5f9d036cfdf79e480157cbac44a02a01d4aca68870a5297218eb3c85231593b3cdd72b31585be369cfe27b23a1d0d856e220061911d38a5851a4e51839ab9d20cd953453f61019d340dc33f140399d441ddb81b3e77015729ae38e44361538d652e885b58e9e1f90a4d146968267f0540ff86fd9e36f0a72752f4df93a917366260b122f77d9e10e8058c281aec6b4012e6c2065bbe635720181579b40140be0062bbcf28333eb556c8635808dcb5a44ef1419d84296874cce7b3d213b753e45d17b76fdf8ed7bf9187264128ddabb77309b41d06b350672e9380355ab44e8d617c5992202f524031b4bcf22c96b6dbe3886f6b5cf15cf236c6de0aeca04add6b70b81b02569a98ac3ed2c6ffb6c58371daee1db1e06496b2b57460cee6c0b5526b7d48e27c3cf7fe02faafbd99ec66607d8eb9bd69ece4155b96d6f6cf740c0353d38fe5dc7ea4eb74f9cc2e59482e5c39a9aacd6a8893df708839288a643ef0ed17b52330880f8e7cf0744acd9254eacbd644e4c1c2372437ad46631f1e5f24d400dddb6f04204f6a273d103a98032b40b58ffc7a7e83ac960d2ed489212caad674ff8ceecc74c58db5f5b75c308e829f184c409ed1865e3f964c1b06bb889cdf6183c23ad5535a2329c4752b16721c1a9935eb2b9df29a7741fad819bfa12d2ee3b995461997bdff9286d430e3985c2c02c55ac663255a45dac83dcec781750229dcf94c1d8f9a90bafecbde03a4d0fa6c82315066b72c3133d807447986ef7f44c2fd5bcb7e4d6f2f3e821f2a2b4b310f4ad184e40507fd8533416eee6afd95a7542bc4bf90ea5e76769def06cf1303eb72bcc72a73c1231ab11fa168eb0e95d12846daaa5913ace49e670fd82a6a81540239b8c3d723eaf74c72a2ab2ee34df45e3fb4572c406db2d97261357b514509fd04e6932643e6d064ca72e7ffb6b1606cb5b40af661b8f32d7066e6809b43b7cdaad272b726b3714e52755b4ad40270080a57ee5849d23db87ac239e79fa751090cb21ae1a810ee73180a34cc376a00ba1c219157886a62fd22160a8b2e0a977dd45579463a4ed3d1496f98cfa1c5439a85fea1feae10a601b1131c808e108892e5f85d1729198cb1c9952965473bf733e754ba60505ae5833993e96012cf9b195293106725f8d9a4934d8b7d43345a677e6622593fe60f3a2226fd1a702c7b96505a5f320c114b5ae33889a3db886a4e17e690e413b3f32f19c14aeb33ae67852bc895823168815c4660352a1774a8f5378c8b6d6c3fe89f76dfccd784557f645dece1946168af9fed15a301a2b1c4c9b7f3090215f5fd98ee35fc2c63e2da69d4c63bb7226a646062ab94efc8452791ebeca190cfae9563502f8974f015ea542027ceb7256e273b2caefab6c0388f39f7ebecd8754681d7e07b168f76e3ae82d494782727a7bb155283d1dcfa861773ab32a17e99a255f0934df6cd0647f937ddd228572c209c9c60f04a56ba919fb56c38d71d85e8a28f4ea9265a96b839c4f23219572bede1bcd1b508afb70860ff2a12da8a51ef97de0c759d04ae0042938b255197278ff7185532ecc1460873e2398c6cbfc86a4d456c956aff49a203a8c20b54e564eb4e2ef533d65012f08c96f45091e71fc5e8331f193b72c50797ef4126648727d9c162df445fe81e537f0c75b936e3c9de28f2ea58083b4bcca544812902072246671f321e6b8536495905fec1879e9da027c9bf12de21c8ab67b02eec3ab72802257d1d7807509db48fe60a670e689c3634c7426db7947cfcc37be95b14229921f3425d5f8123372b9f5418029d04832af975625883c79018d77bcc5309672ebd3d00d851bac257ff4e2ef477b542030d4b2a5265cea0cc94c44cdceb06e335d8f2f7dc504a5e201bacc7589a4b991716d5e9c55cccf8a021e308cd2d64c72ff4e8afa4e2a8c753de2dbacf9a0c08b6dd5ff2d57ded55db53560fbaafeb57278d036cbe58a2ea17b363e32d392d3b808859c0fb50b9aa805057859c9d6aa72a08ff8a11105483b20edfa006ea85a9d57646abdf1ec8efb5cea1676cb927e27378579ff65878e544cb3414f02dab8a2def123a3b33adbb7d792ec90b9cf5a02b8709ca828c82c8a5212dc65257ac17ec7d8b3a4794d6b041b19e312f36298654299492c95a11e0e1ccfd978280c7f50177fc5d8af4b4e6a7441f485f1985272e6421060f9f520f259c776cc09501df4d84794885fe7bdd6d9c14cefb5c8941d6b714743bb08c0b23f197d479e9aa1bf190e6dbdab50d0d2ad2699365752625d439b1e038ec1e800cb2d6b6d6e42e35316de1e2c8cf39f6586d8e8ab8d0c8772d109046c23fb12e7a7076da9abc2bd290dd0893a5444e5425d726d7544fc7c23656e50e0332e5a844979fdf77d4ed7137aa5e40541451746163a203ba1482e5c112fccbaec2588c1d5139d8e4ba53c83a8b016182c833948b5c577ef4266206151084cbbb7c26a428b2b28a404bf9efe0dfb12f5087da232e05a34a18851a972637b75613065c82b051a54b173a56a46f3f5ee299f931294d963187ebaed8b72e8a22e33570870fa06a33b6d570829b80b1b1a90b77a99aa1a83af91d938f372017cc1b5b6c81fde08f4d6bd5423ffd298cd6f4b11377ea216c802849d6d4046a05c9f7b43fbf4b079dd663963d89e8d2c1fd86c41c64627735d24aac7c99c729a5934f504304f7de9a906dc95983bbd813243f6e98e8e85a3f880da4a57a272508528176c4bb29fbfc6fed99ef935122e7023252178bcc540b6020522be6e727fe0d197a0a28a6d5c10af3cb3df85b49d23397c225219a63627b5d4f1adfc04e8073cd60bfb09125bb7943d3a667172bb3345a6c2eb9225246a09872f0704519aba2b3424b93f53fbb498ef21cb76433412525ae1408dc50539df6e808c8e72a6f89a4d70d15f1b44fb1710b66d683cc4587741b0826a313c6a11474c8fe800237f65d45e81a9cf30b114880a9b15f1fc43bce904cb5b894bc99d9bcda1d572070e9e7a3252084076f6d98b518e39a4ce98446a8e0319b5f34d08c824fb0332b4745233b0c0f3c417e0963fc33079435d1464219b4c8a214b104297ac5e273dfb8a051b8ce5c78903efd5c9b26fac4bd03d726e512e2002ffdbeca83f922d724dac9329e1300f70a9bcfbd53dff429dd4117fa87d8530741c4df985986ba572afde32629649d306e1cbaf594f1c82e329f824517827f0d74b50de427f4fe07227e48b3ac64a78c237d10432ee82f4854b05b88ceeba05873e8fcebc1406a672e7670794c4f843146b668acdfc940c2cfb617eaee1f2408f50c01fab28869139232ee72df2a3874068c2bae3dd2c6949cdc4417623170d54cbca23a7c655364d12ae2cdd3f7b8f0bbc796d7246874e0ce7148ab5dff46fddc8dc7e02e6c96a72f30143f7f44e29e8986dc8a05b70ea51f205b5bf651de1386913d4997bff931121a1563a46e7f439390a54fd2f91b378db0d917512e9deac4af727d172d220722daa65efafce48c28cf484925f1e9e0be4c8a739b2124f060dff9f1d5e34a72655f365cf009dbbfacf0d565ca5804b750880f8088f4ec074cccb06037a7bbd728e0e402cb857517815b6c31ccf0973199791fb1afe96e74597ca50d5535930258b8ef0f30eca264bae7d908e3f258741a9f4e11cb0b6562f30d4a19a7d5d24729f4928753651970135f83ee49befbb950d89da18834ba65b3807723eded244726517ab9716af0c413e4083da5e189cf59fbdf2d02c9ebfaa09af02b297bed4726ceacda23cb31ecb1547eef8d8430c3b79df3141b44df9521af86a6dbfe162152d96a37548ae81ba3925d996cdaa956f7df9817295d382aeb8d64851adaf6172f1b0eba3d0efbd32c3acc60dc4d9e405913770556ee631a926d14851e9454564cb657ffb736d1233f0d3ad7187234a0ee84f31435dea7b27377e17c3e95466723ef2e52a47a15526346c3e3553a17ebc73cdf311dc5cf184380101a8bed6ba7249de7b85357a14a81a80e917f8430d3bea08e8b097591ebee0cf472838c5a954b1a56f03af4c8f902539a81a69eba4a2f71bbf5fd75f4db98416669a96c68e720eb2206336447860966d4f4deef3737a33162173cd919dd82b121a21f5b3c04fd8c1100f4781ec2fb34afaf78ebabc6b3de1861db694b8488ea9d8d9a7d42372b214ab5617e97d11c3079a655d25abd20e383966adb11326c1bcaac1f580a6724608bddcf72d6487e3ddb491cb99a7bd734e835be339c3a9db56c19f16275b6c3a8287da78f9e0703150b8a194d12915687a8cbd523ff90f9b04a0115d6b45722604d867cac5be2554cb8a8293e7e4b86f8b0868993a77d4fc5b1b88b24a85728940003a013d0ae96ea72ff04427b1d2ad0603160a12394b18dbe1035c041672a002d6160ef50be1c04d471e6c9e6ad56f690c4ce429d651c62eb096f6ca8e3d78ef64d0bb1f36dfba9c9082423c80e35998c7ca8d84aeb9d196be27e3cd577274b73d9dbbe52f1105bdd0a6f8243a8ec53da6585cc1958d4d0f50b4a7ec692872135a2e9acbca62ff943fed5e2734cd0f7b5c984068d8c7089df46a28ccf372f3a178f4bdbce58136757f50b3d0d86e7ece0ce7dea903baf14c8c4737ec50721494d86836503b686cf152b63a5160b723cf523084ae277087b36f406779227218e8948927d5a04609f82b548c056339cfe523558db220de404ccd2e6bce8a7267fd158bcc939b4024f5e3a1c6c0c6066b1266dde768a3add2163cd2e6bed33296442c7c74deba64941a6b3d5aad2f66e9d78e4a9ccecd80d4db35a99784a872b07a305e64cc7ad49d7b60fdebb9b5e0c7dd80f4e68e15964b998aee2335be24b84a36583be03d8acae2c546f7122a089641e2d3c1104b8592860dea4336b7722bdd8234268326a454c9aebf618bedff95a46f6d40be16c2a749822a536438728df00d103321238ebc0054202a003216edfe1454c059faba619fecc2aedcef727c50222f531ea437c5025e526c5d6a0356dbb286e4923a2f98f19919758bde23795d8322990d5ce217f49dfba69d1246338efedbe0b1cbf14d50dbb55a5dc44bf4fb3614690f0d174e43ed734cf1efca3e245cb417d61455447476438a63df4c67930520c293f71c3811fff0f9072c51685905d87d8237c9d4311aa3aa379a722ae4da132b95891b1e4f47e6b6158cb62a58bf016c97ca0f7700af0aa0f6c7729b074c3676bbc75fc71bd52da76b1ac08343ef10f0013dd05551ec0d232c5072bc0763178c5247fe1aa63d7641a1443dd0d4f28abbdb1445628f791e43772c72c10d153b6c1b872d07497b51de0d1c7455438fa77c2548b50f12b7a9b339855d7c55ca6930434e71510b6e3f179cbd064fe8443ce5bb2d177365995d89a12a72388b7d3dee27f33cfe4617582fdcdd4b2ef9d558a61d65ae45b543f7c62ae44d40a0fb652c49f3c5bfce2984ab3820d64187591d2f77b06e61d0716cefea1e72a008d1936a7a6cd57c0f99ad92858900306e99c4c8f11937d450c8861bbfad72dd2a2fdd6890f1088050d34381999b886fd6f01dfed4f331e410dd845cf8a672971346b6976fdfe36bb5e5e92663d91b5a5a57d269eaf0ad86b5cffeb001880d08ee83866fe651554f8de389d7bff4ddbd76fc561489216223ad536d82e7ca2e18261eb659013602bc4de430487ecf9d777bdaf23eed3d63405b5f4875f96a1d2e181111315b3e012693f7572d5b25a6e5ec8afdbca02205a1d1571afb7a2f72fa24bde9616365069b230a744009269cde1d5c8f60d01b64c7eb1d11c468f065cb70d072136ad534bc123f0699c3d7d96c21811280b14d0c628c20d2e8414f72dde839d6f16ac6f84bf1a702a6ca6f165d51afd6c63ab9349478ec5a469abf721f89b28d4e238581ec3a56ff142698f6d0dcc7896a7789751c0977c02a12db722725505975d6ed2cc4a652e39e8b3ca4ccc3d65e6055c2d32b418eedfaa17a72082680503ce888876e1bd73c27429c55a8a715b3d6ee39edfee99854c644da352ba94faebfafe3412236dbcb1e0afec478047f35ce50da6f5c6d794f36c86f7298554c1bc5f87db1b6c8ed0de14e5dda7c200bef34513ef77d794142c4242772a149f9f34bbab5e9980c32d4ec8d8e2f0f220a300ddc14ce50ad335c8cf526578a89087b74b921ecb84cc5c16c035dfb084fd3df44db0ed7542510f8b56ff9728408178067bc717a1577da961c6f658943241a69c8299bd98e087831b64ca77225d67b09ada4337be58913bc3512c537df72e1f5141c4943e2b4fcad2f61b0721f58ea6229b7d1df92be55668bfe39ce6b1b2636efdc340232932b68a9a98c72b803ff522360913dca623999d860171fb3ee45942b26a4b6a66364fa3571ea722789f16875279150c2dc30fe84de94e428c4d7dba6ba9c1ff7ab7b8a300f54172f283075b3f84a63200a7168d57d3a9458fe065385cfc0a0b3a9d6e7f7e83b728fc6da6cbf62f43e700e5865b7ef42009c9fe44df623414757d4852e5d1aa4727f7766b26175e3102905396d6b0c5e0f14b1535840eac3acf16f9c7be2c1c120e0933323ce6e9ccd0d6ffc23c070704f89e77a6ca753e97729cee153215aeb72f5672b7821539c38339b4a4fbef9f320cd96d934fdd1ac33838d5ac76da057373471db491729e4fd7b8976468f550b0b7791c058e4745f3d9da3d6f714e91f7250cfaf5294accf737cb3e46ed2a32d0aff4fb251ba316a30e2ce6ab8097f19721c95b5707bd2673d02b01841f3624a39432af3b8301f7756e75c62dfc2382a2c31915a3c09de4154cda2ab26e1419b7f9363a98fd6764a0836f9ad96dfa69272b2574ef41d19351c5725165b70d6d7dfcc2882993143f6a14f0e4606065a3234923a3e76443768be78c9957e1cf7ebc8d7681b5d7743b348432dab4a37c66472c8aeedf777c6b31ca6fde929c645ae0d3704691b3de494ca3e845913701a767254200f3fef88170a8511fb6d691a4d7073a2ee753d6afb3dcf3e1bcd5679ac01a8acd9a0c9bca87204bc72f398d6f7a0a3bf938dc33c413f33cd709988aeee369d7a2820c14f0c87777b8d52ca3485fa8e5c25c9ba09d7b43184fa8cae3114729d917bf003c84f3b1a5f146f1070d6f1460bfdf1e1eb084215d268a5ab5f027278ffec38e5e71a45850e553da2076d1a0f9f19483b490d3eda803daa60039472b1b78ade2eedf7088654ae732ba958dff0681b046a86652e00100bda1cd7b008b5ae6f4935b6797d870c50789297114e6b853760f63603113d3a71abb9f8477229715f49f7b5b471a8bf2ef27aeb52a752d411387907574631a831635cb29f7263d7c7f0a3c31df38335f8435e065bbc4ccb2821d513307638c022c8f26b406d3d742a081f5075300a1976fb1cfcc4ea8af1570ef39c0c7fb985f9ded2d7f2723446af8cfbc6a2c2a1252710532838f70b67a5b35443a7891b02b4159c69e272ad4f549278fa1ce5b93093ed973693e315fc64cbfbfff5ffe22f617733e5fe6f200e74ca0759bd1828cf2415f8e44ddeba302f9525ef427eedfd6a09f962a2577f28d672a4b4d421b2fc7de36a7f2dca77c5b2d9e29f71fbf022d82b6d0eac33ac30245d7ec218bc42200112e0b879499573d12d4e05af8a9959a32be0817f72ab3d5f986a19373b05ce19253eb5aeec473b9241b2a662a14b9c59f8af007a5b7313793a735734b0830ee116a327bb4be42169ad66be9f5d77924ced35be16721e5124ebefff5f94b2786d1ec7822e19e816450da53cb704b89fa73705c32155176137e65906d361a8ad049e3496cd9dcf95c89ab4ab80f1ba24711ac415bf724b733316316cc0009c8b8378db700e157007406871b40fed71641b8e4e3dc2729552706d9aa405ee4f27ef10c00f54ccfb4e3a06fc71f90244587efa6c72627281410c9bb4ae8869e57d139e052026df6f3f34a5528279fb59b9c31982fd737203ac742a61d463819dedbc56b6bc3d65c4571e86aa5d757c374a399f3a80305ccc112bb4d01f915770b9a56f9ce883cb3d48d085e1db6a74fb6fc230dd223e72615cff7c32c2c703adafd59cca271afa56438cb710d198ca58738a346a96f1722f32e363a7e41b2285424f717968116d6e881445209498b19db9b960c274d60b8d4e3aa64cec80023adf5524fbcbf35ab6486148daffedfeb66d055b0d44541556db89b7569a41acc6e0b805c15aa44ddea7e19eb0eebce59da9e86eb11ae472b4f592dd027ec451d4a72b4526a516813c59dd7aa8739681d4c791d725965072fd225616a9a0f3c0e1956880362dbf43d92b32e353417a3757ffafda2ee0a5729feb5ce3c5a3cb186b15585312c40cee7b6c1fa422e2bfb74088062705825472b1f0ab33e7f0c25efe0daf6498addce6f0f0ca671a31f2f996672ed1a63b7d72282f01e8e9899551942ab005d502d93f7db4127efe8d9c9ed5a9a8832796b47269881f4758c34222d2d8c8de0948a24c8ae8daf11d3f5f8a0e77efffa2cdde72e4e4e3c75c6034acddaaca447cb4f19c1da26b762cdc6489790a1360cc23ca588dbddf1458771ce520bd2792832b96bd8635679df8817e9df719766203ef637258eb0475b93a452c07b86ef77ac661b26bd4392de61a637f9782d5ecd39091720554bf0830421d981c2fc8b8ca43436139914cf24154c2e2f649aeaf8f0d0c721b4ddfc64dad60706ab102d501f5c35325c984754e0ea8253b3f99f52fbe7f7247f708efc16d23ebee9d06c55bad3d2679156f181c33974a92dcb4ab48cb5e72e51952e0a270c6e62987d6554851f4375f3bb912b00b76e60091dc9535a00a2bb2ccd1e0674a6326660f9302d9ba5628b50f5c6841f03086acb5d8fbc8a9b972c9bd049ef26851490add12d0fe9137d36bdc5cf366d09360113046c8c5b51267caba3abd1a3f05eed140815c06d07b3647467675ad6e599e4c6b8c855cb8373fd9c32a5a41888b2d1f42ca8c4fb7e1299c3dbc5ff12e23f00f90ffc5cf5ecb72ec363f509f17b0f23746fe8f1cf95e3049ca917d148c8e6e5d5f81c58cc6a472502cea01dc4a6a1f7436ce5c1549a28a9f1f20e3b182fdd4ec995646eda68b72ba1510f4991b62f53a16fb77cae0f1d32d88990131f4d6fed0ed51108b1e506d92730ca3b096c50fc09316605f456dce696904bf7f081686dffb601a249a681d45b3375595b3d7c6fc55c08e29f0f1274fb88529b19d1fb2b067db797b62717225bdfbdfd026f4c0603d58d67e25cf6dc3ae87416542c2f39460e9186a3318723282ce5a3007e75f88bfd4d621acd782f8e891f642e729ac07c69f2a90823672a3db8146e92e9f97ed40dc4029d45fe440d4c697a7078edaf1469788c6b1754f2494c5448dffb913d70170ca81f61ffc8a255f8fca3b85dc61c3a0db50ddbf7241b832c264aa0eb17cace0edd4c9da22516f6113152212a5af6d795db576a729d27d0c379654dfd8a75097c679f1ecbc261816464c2b172894f4978aae0646378977db467b0055779ac00c8368edfa42a019cf945f0b3d18e621d66920cf207220b9d5959f5c9d7303a6d07fed5fbb9402ec4c6128d6ca36019c88f5396af272fc482dc46276f8ecd05ab29556205146d1b8983e8bdd63b71d1bb6d1b12ead52dbc269d011da5c3b04fd8e8792b9eb8019be1d460c2d1ae27919917b311b8d722dc70c93a0bbeb83976387a1570da3c27f3465be54dd33526cdcc2f11ea76f727bb7ebf88dcd7e80868c0e0f2eeae2e78645b2258e780b103ba6de9e19864172e840ef400efa913752ae4e7bdd63dd4daa0fac3b6dc02756491b37ea4f8e181a81d4bb9838092a4308082f59a17b6925cf4871ccc992812d9f1139d9bb2e317218062d0cefbc36b5e92c60d5d774627953fc69fe5c3da57bd26cb0597c2f8516ff509ae3447fcbef1d0a0444cc4b82bdf954259cfd344728783fe7b45fe32772a6447d74cf4371b4a4e696000256599101b18298b52d3be62b8c163652a9c63c2989e62469dbbe64ff492088bdf7ad2ae18bc53003a91751f2fd35158da21d25674101e0e0d02689349d1e2cb724b5258bb4ce830db9f92969bbdf76db65ea1c1fc518825b3b11e8579a1d133034aa12e32979cc41ab8d8cbaf4c299edd535442ef142b282fe2617015207b44fd51ef7c8116e6cd99fd3fad53d55e7c3f2ff3df734db271170ec1eff15612db185a4ac2e8ec00acd0a28348608aa4af0b39f03c51ab2c6e501f7c291096ca230bdcf42b9feb3aed5a4bde52820a186f207166635018a36d7605f77532f6abad6ea0d2405c294b936273d7623a676a48983a26ac92ef8b589095dd82d0885d53e154e74e0abd00fd37c6dca8d5809a538803d46fdeedaa2b9b6905edf2b4dae7c3623692e0fadd090593657b8474b89a630a0720cc6c1099bf82786fba3693a3ce19f38d045e8af0bc60a2f3fc869ef7153b072999474e71db7b922b772cfbf6afb25c8c1183f37447db479807846ba844b706d54e913a788a4f2062e0b05579b7f56d932a542d4819d37427d95fb2ef078f4720c933988b13f90eeede0c7e8a729d13ddb5ad9bc5e1291617788ef10ba732e7206ad2706b6db2a72ca70daeaba5373eccfeea218cf510d42b18874dfc2f54f07fbf530d89088dc3b18f088609d384a111c3b44dddab5bf603f8a8f7309014d4644ab30886e8f9f5f0865c4cef9afa67af3605038fba11c9590897196c96e1372f01e349d78ea0bd35d7b6a57a0f7f954871869c37bc5926750aad87748b8aa61b8f96da7c83ec3b6768de75920eb858238c08aef41fa7e7910a2681dac51db16934d681aa43c1239426d352f0b6694fb7a370dedbf63b7ade105243d9535c85459c494eea794eb1c399e6b795c7a5e7cbe5783ea7325bb9a5e2e537739e55872fd3511071c79f08b7fdd3af793f2e8f6709132b98c92b00beb9788d291d9e67238e0ecacc603cca68b7c6272c6e93f8da0cc0a3bdf0e4fa4c58661ed22ea20720751b247ce875fb74cdea3e0db5ef363869faf67c5d1601bab85e8e8a4f7e872f3db425afc1f7f20ecb9a56858a9a1d34013b2e9a457037972a2aacba56f5b35a97baffe6e5c47bdfd3671ee0124503c10556a0a1076b06cce40a00b585312720ddf5a35d2fd04ef11716832971ae1d64e0747a5ea1bea9f6d0617e4f5dc9a391a4a7f57fd5817a782cb5ffd05aa99cce7e9a5ca08d34e371236e0743517d9721b6df50cfff6ef424c0ac734b66f3dfdf75931858f873c7b1b9beb7a056f58729a8116a87fef3ecbf4b7521d6ffc8aac78be3cdb54059f56f7d401d2d9decd7250fdb51b547f52023f30d2de904c9bd36cd2edb8c46b0edbed60ce9e5045e503bcd2d08eaa88ea950bb48543b1becfe980b298c162949e679cd66c07e7999b72e0d3cf943e4756c4f92c5bbe5d87b5e5c96e338f52c4a9105ddfcd90a3f12872c1d6b50fd632d0ddfaaf05c56c9ade85f8da9db171ffcc44a24c4320e9285c6fb81cfa92a0bfc0a12d21f30c588af8b9f2b22db5fec274f3b82a8ba1a2a6687289371809577d0a104fc3bf1fe132ae8bd078527014540a50ace6104675cb2e61e8d292effee08d2c97f144a4759adb9cae491a36960e82ce2604f312bde68672a2aacc599681d3833878f879fdfbfc4b70747701f738a387273ce9129fc2de1a9f2d8d91d44aea8853d4b58d1e34c54262c4fe84a73469b3c35603855d08d8427929d8d0c806b28f87a938bb9bb26442a7cac5f5ac5f2eda7c8880394658887214d998595ceaae720dd56312eed614ec206f408fe3ddea9ee1dc7376cc798655d657370b4fe8751901b096661fc31dd587317a6316252646817407e0a4cfe9259f0d4b4bfd5b0fd61532ae1f206082b9c1f789f6ed83a3b9ec3c724cd6579172234ad955a9590a589eb6c5754ef04b4952ce8aa70748271c71845ed6e453ff5d3eb3bbe52f8673bb721592e4c5f98c59981942815cdc8961df3d787430f1197238b38f023372e7dfaf15975fa8a4c4a15a7b0ee64653ba7a5dac3b40c3d3ad722ce9bbac990f142053b67c290d3eed55fa1386f3d31cdf6f51581ef942a18854ff8d5551879a4a5b8f21fbc5a322d21564ecdb6bf70b90035387084e659a462288d56b1617345756e07399f4fe31ac9e5604dcb3b3f70474536146ee959a5b65f806c402d43d5f52d4bc3e80a84e60a0d84c0debe4a409f5fe4453151a0c2b105f45e3ec6219b0ce860643a73337ebd8275e8d9fcf57b4607c6a483994ab323bcd0e9970d98919de28a5cde390311aca81298ddc5955217480df7e7c5430837263094467ca2c0cbcc7e9e7666239f0cf5564f705d2ea8eda509b776587a6f340f704fe439aceac7bbae948061411eab112306399574798eae8a19c157fa7275909fa0b8af6a00fa2944651e45ff6b56fbbad5e27e62e10e09e368650f65d99723a4d43ec746300bde94e0a5b01a20dd8cd78f61fa9eec27ac0c6b0015595ea31f8630fe26154a9fe615c59525385e18be3202fffc367bed594639c9bcd18c625d434e4ac04a8742bc94ea770e82dbc669d24e9263dcc1085fbeaa99afda90d722fc10275d0524198446c7f72506c4fe7f989ad351f975bc572c5582fe8f4f64713f83f656d745bbace2f25ed6529a5c848f39836df3531f1d62819f9d7698206e188012719dbe5131f503c1b8d7b9472658ebb680fb6d2fc2f1ea9d5331e3572397d7c00342cf20ed32d3c9c4e1b205dd31a5dab86d73a2a5967d3eaca71f972dd13249576072edf686614e44a27b7e5c900d3aab703799eef847a5eeac3ac721bba543b8a42c7f6db20fd1e5234748948c2c7cf203b464a5055772e946cbc4b83bdf5ad227e516b4fe8b2ea1017f11b43ded503523c407b521fc68e5626e772464853fc499d0f6765f8bc2bdd455b8fe373a53a8be89e428b0e0fdd0692fa721b19aed5cd7853c58c0df881c88c06afb4299388b1fb886a9c1b781576de5544bbe47bdb343ee7677f84977eb7e19786f483aa3aceb4f539517b6a17341ed47230a410ddfd797b63881ea3f5d8ef8b255f71dd3d667ee77d4a3ca8795063c572e29a928f3ec321a839c581fa66c58eaaec2102dab3df2265617e10881356ea722c04b1e0d663979b3d6d2094cfe7a284ee160c7da2057dfc5c43e0438f19c072a55ff1c758a6d6392ea58d45615f8c7adffcabdf305e8e63bccd5a35df7a192c73a24e3c14d9f93ec2ea21ccdd3e2f8f33303d36b79cdf69caa4ac9d2c71dc58972f9c7fa747d34337c95e491c571d86cdad94958a9a710612c3d5ac3ed577724887af29da95615910dd50f6dcd0fa24b838517b7e47e2ea1535b314d6c18f72eeed5ef85a48390c97d612024da8a82ab078cb939deb33c12d02df1143b5bc65ccc9ae9a6bb5b933aba8403886ccf6ce2c990261fb43047b0af7ce20cc6e8e478376e1b39ffff0ac6c2258e9b874f3054c0c0d71b2a2c8e926406354dc7c862305fc63b65368c5da1eeb18e18003e71e567f3a49fbb8cb85697ea9dd30c55452ab5804474041e2d44d3d2e6f77714ce863712230fe626400ae4328f1fa17a754edbcd2b4e38139833094bafdbbd580288de1b71c9b091ecf4fc40d487e85d872015f8f308c4e383d9ce57980c31363ca70e5cc90713c6cfb9693a6ab7ed501728c6d3dd666fd0eca8801c8fedaa7d93ccd2f6600e1e77c7e389b897f54cc07723fa7eecc9e21ca61b67d064972bb19d7fcd703a2247adb92c17567e297b3857205b4b3f8d467e2fb3a1e802cfb077a8555e1570aa6f1b4ba472f994d84e322241475f178f3914a1dac1704411e0ce1a454539915492826c3c0f42449c0db783c62a85e6c0fe766f10d2541f4886b65656d8a32e927783896577ba41e03464d5a45d3896de184d34ea39583a1b67be3038b38c42eaa3bf77d40f3b2127765167203956a06291638a04379a272c476f574a9ad0a29af518e165666381dc5030228180f86082a60c38aea4a506384db343533f2f015f134725cd6fb878b23f8f805f7e66b6a563b528da6f13cbc52032cd30cb2be4f77eab5ce5903f64349fa237295cd43fdb75cf7c6c087af1bf1009931363b7f6e44637753db61daf6fe2d8a4e895b33113a47e6c72d33a9091de58d57aeff3e2ef9a9eae81ea9d8b2c17a571f4b105797c0a352961415a9aa457761c8fa9097f3747e9259e398cc4a1e1bf272c3af8f9c67e4943b66ddd26c25b40a80f0c484bd1724947741ada96a86cc1f720fb84479e823fe0a1b4ef100330f4547b5a53a9d84449a9c61ec25ec2aa4ca7221972b123ee2999121378f1c92a5b3dbaf6aafd549f22e3e7f9ebaabcfb77f72d5221dd2a2798cb60bf7772e41b5310d5126a25030226c04f69e65894777097271d43e2dd18ac1c48db90f4e844f21ad17be66b97e8a395f38a100ba2faf353fb55ad60c6be344b0aba8c369abdb4d9a4cb7cedf830623a2799bcfda2435256f7f8f96c34bff28914947f9ee9a799b78241282f2af3ad1d273fe1e5c97d1e4722b567ed142f36713c3121079af0ff868c22fa37e177d005dd1b6ac56dcb9f372a2cbf2956d17f722ea9040854ab97123bc9291d1eeadcd7a32a72c3c7988cd729bc185210b26658a7e7169458dfd3f4f1d55f3158df8745693685f912a9c1c2ff4a89dc9b53c4f428fd16fbe8bcc42b88f6140c2862dfcbc252c50db98a5e872e6f9160b189e86f46dcd6c247c1d5153b5e91ac904877dec207577df281ba01c54f7cf45e4b224c8c0d2cbcde3e1fb7b23e89a53bc1ad4f7f225eb0251eee12cc01de151ab21bb03bf450ff01b8b3c22403a760d1f192a231a1198b610155668ab7317b4c44791013cb827dc5549e3735cd3e2bec7d2fe9a5efa4445a2dd6f2a5ac8c25f427e6426249ae7374125e74873861550954a838687a52ca447724e72beb4f7357f455fa2b521ac272308562489c7d2c0e3ba2662d468af0ad6a9137219ca330511b0540e3c3d01d9e2064934f5f253046a2cc7b1ce7f86c727fb5c5e8829cd06cc937c43c371672434e0f353e0bc688fe3a5c298ef6905660119797271da6cfe90bffd8d27703c39a85718c49be0311e789a202badc2291974e33b028d539ecd6c4347cb87b968d33365729fc29d96a2fa892ec3841382d817065c584873dd56bbef3bb2faa632c4b53127a60ef213ae4e5ae4b65ac3df163054685e63eec64d3062e87f9a5b801331896aa6b054a9f3f70c8ea014024469ad59c9723607044965d2e3f733f8daf779f134a0f874966e249696a869987d3be21c43722c8786c56eea1fdf36ac53ec5b276dc3c7f85e9af747acbb408d7375a302b343f24ef60cf71a830e8387d3246fa3a742883a1d9b9f6e48dffe618d3cc8216929b1c52a32e109333c07fda16d1169ca8de8f1673fe8dd1612cec71a4d0510f56326d2deebb18ead26712f975febd23a456905f09b917bf7841ad72ac0f36af30ff1fb1e0cbabe018a3346b46513900021230b7783b6e37e1edcc55e207820e843813b7f0bd51e513597995f03b45884886fe60fa8ec924e8144dd6a60c476ff0c0a09781783ab5e522283077cc58981d5315f3d3f538d521296a55d6e22a8cc72d437e1a9f5fd1bf054313bee524c2b46e884fd9db77fdc004a68092344b42531dce6d2cb8e36d760c8942ebea4f902cda1079bec48fa65b3afb019a5f047755d3a30a808a4af173eeeae8c4b4c05848ddc0373c605c8777ea86c4db4e2c6617259bfa0e1e436291f0388af1c5df51b585dcb9ada63b779905ec6854cc37b7c7285fcffef459caaeae81b562f9ce8948279d41fcd79541aa7ae7dbf51810c8d720e3b1dd11920b269b0caf356f9a020e07e8cc5f46beff0d5be5b3b582a537772a4a4098514ae23eff9e13291cd73047db9e3406ebe04d77ad3f3b2d158253741ee48308de14b6d4936b6f0b24b0e7c36b470cc2faccea7d48053a35334634872412e06720f76d86324bdc0f7ef1246477d61ce1449fa821f39a86e3a006f5a72ed4320b0f1ece5d0444feacbd06de55d23ee9636d5774ab2bacf295752b7943884b531599720e3f2ef99919a44b13bb38c277771db75582fafe6691af2126872e24cb98e0e3bb2632a9c126e7d84ef0ffb530cd09c6eeb4192eaea9a777eee476ee6f2bccdc99e19dd4b180f28a98684e455a0c81b1113ce560eb83b02bb3030794c326acae0ebe15587adcafa4d6ed27478530a7ebf03d05947c5309e9e266c1943c303780955050902a98331066ca1676deaf436d8ae0ab6cdcf8b4882a9725c8b34b37dbc062cfc580007eed59793f011af08709395a5a9bf41a8bac66819961a6790d1076ac0c7a76ff95bb3f914b341db0ca0b52f824c12cde1ee3f16727be47bb9b90fae7e5463f3aef9a329a4529637facb7b037c6e31275c57de2072b19d37d5d353356b2377254ba3e238be56b0806db2fa1e01c3dbbcd2f336007216a61e0754e4dca0d41a6f69988679c2c159cc8d10231f35d3e137b5dcbd8a72a1b0989c4293a00736890e9a0b748be8868b40c1e69964ace50a72c12adca0729842fc5db7cbe14dd495b5fe9b9171752f47abdf55fd02fbc3c56e5a1f87057202ace04e7c3c49b3a77acb6ea64cdfd1b146b0e33967b6106ed1a25d11720772462a86ba6e5124ead81f3f9f3ba4c10af4fad40b62799deaa484bb7141c5216b8bbdc966d1c5aca25cdcfdd2d26e7734bea1d249cfb56ae9c882366dd133af7211df738961de4cd69dbd1a8f459d6abcebf41d23a4226eea4715074fdb555772b15fb24a8d1446b0832a43327a26045d4e95805aa38d745b0ea519c46656510f1b2279c016cc8faf08e84bed8dd0f6c1623e53f9fd284391e84de8e14bd1bf3e0f490547fa461ce340a6f4103b1f6a920d5d45b0cf77c1dcd6eeccb5f1152a61072550c1beb692e2bc405787f711f1a49a84f4122aaf86ab85d9579b3ce55d720c3c7d99fcca531d9be1732d4bbe401146cd295bd5d3e25cf125db1429806c72ade140c2fd63a88a887d59463b50723cafff3d75e0058d5780e0d290275a9e70188be3223794dcf4556d039ff2247802a4b5bf950b55b7122d3459351239322a69e83b43a2ce244b47d96214c897fb0c22e30000fba795df50c1c601a2d4667234ed49ee61684a2448f47ee708ee25a621f70b10346bdee41403c3c817b55b086ec4ab1da91c80eb6197705c7eb1c28ec07f82a42eda9093331bc413fef69572002dcb458eb394ed874d561ea9311394dca7d1450d069057b32f21edf80bef6251a9123a43fbc76fcab7142ec36b5006a5531a1658a822f54f03142b65acb73e8ee1b06ab472628f1dc635621c3f15951b78bad01192b210e76d0282beb3356e840cee20a4dc5c5fe7cafb24db1cd39ce5b4ee1ce03266172811f1371203315a0c414ef8c1587bf165ef26be0eb64f7b74500fe9a386e0ca561cdacadba94d5a20f223d3db01d47b9e591d1eb72d541991904225e4404d35507f9858fe76c4727ea525e67a741c8d0642b0fb7fda04092b8e1d8ad07d542278878172198c6d03dc46d2729f3a3b5e9adf25e82e32ac29ea2a11b96980b1624aa7162718ac677295097f8861cbf6f0555b6c9220462d023d4e6fc4f3b11703177f904abc5f7f72f9ea37934181640e6c9ff6ee8d325589998a66fb0d2038b5c863c8cf1d990a10d4c7962f8a50315e4cadd30ef69480c0f83e29a220321a52171d81780a5e1c49edb9132eff5854d71188db63357e24c7cceb1d6a032ba0c2772835cd1e201953f6883d16d7c4f73a9626fbdbfd9b4dcb858d8f284c9aa9394541ff5ecab9bd72f4e39d209904ae9e657a3db17b7c834849413c98ff97aa9168e52daef39dbd609d4e875bcd8f85ab528ac6232285e33b8966e34dfa8e4da363042db893f6a5725baa98258d9888b400a72b9ae73b4e10fce47c990bcdba65879802d5d43fc7628612b7c487cbd19569ee738974555ac3ef1dccca4edca5615b98524ec4913d726cd2b42cd0794eacf185dd876fd3cdd71bb4e77e1462e2ab310f696174ba6f72632d0461651c20fc04d2b4f35d53e16867820ed458c15f566cc8a03e9971fa5ed7b05ad3af8f69d0f3f896e555e8a3a376d9672fff68e2555d93c535106d8f723f4d752044b36d689fb8f99709e979b5ddab53cdb9646100d717e19c90c21372f9f53c4dcd7adf63998057274a27119e018c2288a748c3ee8af682e6c9886118abeb16d230a42e0a01384c7dfaccfde4d04e367dd7e49d3aa7fc82621d8cfb7209150fe58aa70da4068ec2545c53d98d0aeb9838d92f018585f6404766d0ea0e4bdd24ee25da469acf1218abd04b496f2d5e8eaf02a9201daaa3509a2b0ff372fc358a1af4079c4cf04c6172ac2d9f9ce8d264516cb8e5efa8a8d18481ebf301aebc7de81aa52dd3af11e68387055f34e0058a4fa4c2eb35f7e4416c03d42a0ac9df2df685842fb9e78b6be939f2be8469d28e128bc7a29ac9913064163b5f72003229f3b6643bc5ae036c4432739a6eac726dd2e3060a7722b53ee7c4345f5593228c1ce1cce2282083cb8dd94647b8338eafcc64e0e2bb6591ffedf16beb2e9c4ea8de8ab9e9491f879d0631c93328fed216f8cf24bf2961d5962acba4e972ee31320e4cd2dccf120465c365be2f249177f0b5c7b89c235461453ffa7d577276f9b050f4fec9252cd1fe0f738ca5ce76208e4499b7aa216f56b76ae587667245c18e9a71cde1bb4152cbd22a9fb5aea480feeb185f8b4b8f2f7a78cae6837237772c51a90ca44fa60ebda79c96b15231612c03c4d4ebfde4ac95bde1b1d772ba6c05d00f8a08021abfb20514c9d76a8c804f5fd677f72282c734461a4179061e0a3b7f0949ecd88413639719ae9b630d135646b7576da101d6a965e5f043589427dd2e507fd96685d0fb36cd5d2c5bab438d34f618f76aa30e8407edcfe12d4f3ee4dd9495ca6a832d1a6e01eb7f2d4683f42ea4aee82d0d2d74cc4dfbd426dce258e6b0a82424b2a36265bb90824e23a6b07d32e672f12a33096a8d3e4e7243197f5bd2a36366ba3ab40f1587610f4416065b3532539e0edf35f73d51ce4c69909ecf159790076f19189ff4223c4b304bc1223a94dda4ada3635441f0ee727acf09b12485d3888bd77da82979fbd96adbb2f77908e213cbfd488cea89ee728e7ee59300111a62f8580294283b522189ad090c067bbb0ffecf81cae4351809b65af8a2f402313fe649a06b0aaf0d8f867802b3cf80266809c8ead5a4fb0d140b66bd1ee7386d682984e94433c81fa244a3829a35ba47893fd36267cbc9dc72f2e4521b0a26ae07d20334a9da8fb98239782d08362e006616fbc7c8638a9572d81b78d9b4560f9cf92cdb1a547be5a3d8971d2b87980d595f0e75eb092b472eb65b8ff0b2cdb594dfe47c82105c643aac0cc84e4b4fc6a567b6eabbbbc4a24aeb673437a29d44e0adf9f8b838abb81620138310bff24241ecb04f988c384e33408a937b9ec9e342a3b8ce9f2489f76383194165a77edf97fad0844b371828726b3c56cee9ae870d63c7585ee2e1787e88ab403af24e29052a21f34fe952a53ee8e17a0d55904637f1a848dd0f709caaafbf9345138cd8daf059d950d1f37472575fe0b4b30b01c8bc87162ce0bbaf72781cde8e085bd2835ff09dd667e0ef723faee1e0bf636ae20d77ce42a193ac9d7f9b331624aa5d42fc767bb338d6c672b705e2300fee92b3cdc1f31ad9f5158a8d8083e53cee1693618234ecaf3c4a61647deea91d18740173090c0e35745436e90f2c61d531685fadf86251cc252a723707bf037dabba29dc5d604b1e704c878ca6970ed80f1141fe35def5b02cbf483954f5e638bc988ac1cb2a6efdb80cc57535695e4488a7bd3f73f815f485b82d58109910226b388528e9a9804e1fd3325a629563760d52c85675c8f1c9426e11027ed677ff65ee643f90ca7538560813aff34b26d9036c3c299258214c0fd92dc470b9116f021f2c68aafe68d9c27f47af364ba84dddecad77562cbf2b502b646be8ff3555a63c427021fbf5a65f22c2cf5d5ba2ff37067738c84a96761c8b44ae29cb4beb8ce0b7c1e575e336db69eea71897d5666778a6fc8bee4490e00868425713252e3e25d19d8fdbaf29e8627c9ad51aa0113f190ab06b1279637023270f5549da774a596857ba97995e9132ce813c118eecb8c6ff4e3e2afe34eb5c727b99218c830a7ad8b09a4d28ba61ec61aab6826f66bf07dfd611f856cc165d720ca0d52dcb56bcd7b4bc048a01c52553d17aeff55f050a5533e7b09bb88a3e7213d60bbf2c29a09b5a556c16e407eb07f33101b29e44ec68b3abe6e1cbcf18271744568284de404074341573b5f7a4c3e40e619ea37d6986c24fdfc47c73422601d33ed4266651318da55149e1fe860ff12df900d0e09d7f9882636353713928ab2c3a634b5fcefee2c3948862f47e9df87c98ae1d0c80dd9e390954f79d9a197605697f96ed78c53c7aff0107b1c231bb0e3b736f08a95c25561e09743041727a636d586eb45c8db89dd71f83879448fcd946aa9eb14146f65b06d7ed2afd72baf24d77650e22ccfadd695af6b7bca93ced601c3728d9e12e8d75115fa45b7260765e469e8993885ff0201e001c1dfae463068c81724b87ec9bc741fbbef467f45b1ba43521ec122d0f7c2effb92af4677ee07b1ace8a8a174eaad7b9f8ec728a55f2671360845834ddca7ed8a020493f17e4f17255e0fd70c9d645ef0cc04006e308a760f046bba10745b3b2491845bbdb18b6147b0879d5e914820291601e7594c14e40ba33a20dc5dc29a13622b113591316f659d60d1b80c04c567dd37272e86043457d5a5bb438ed52ebe975ca1479da77ebcf35fa3feb1994be8c107204b4f00b62eec32ecae0d59835e968b6b4ec009f558d74dd937e0308b13b1672330749f3889354db8da18d6350ba921aefb4e5c75293f00fafdfd455f0d20b72be610a26eecd1566642bdec37b2d9f8e7c7fdd4740f7350295c3c207f569c008470a1813a321e8509c3a097600a7c28fc5adbc2b1cd2b3df4a8fed5733c18034b882619185242544e162cc7edea0ba448e95681e83878a78a8dff9a755e2ff726bc3439304f11f9dc424c1b8f00f7e1231d3e0ee9ac3ed2a5e7866712c4b4d4adfc90f7c41142603c6c006c4e76c382be8c0b06ded0f0293f0b9b346b244011778884dc4fbc3a42b08bd7c8dab7e310955696a74a01ef71360c71f2593a87772960dc79af2f465e82a393798a44eb9c9f5dfc2ea112f348ca8958d4a7258fe728d78c19da6957fc75ddaa1accd43d995dee69c3cba9c8d03c5916dd85c0d577251714ffe285a64c7681deab74fb71dc473992592e7d9680bc6522a600168c772e69b0244dfee9e8875d02f35616e69bbe00016d60c8d69fb272adaca17a8ad72191e3dbdb71b3f75c7c506f0d0a8be0e970505260ac258ef18d0f88137274d2656e3693c25d02db2d6dae6324db52373261bbf18fa5fbe917d9d9ef74e46910ba475de44654ddd27f300c9cba5e5688725b243e999cb9cfebe81d449dd1e8a1fcbd2a7ad2c605b1187d005e4cede57e0eb72d1e9065ce648340c19dfc53a184aef53cedda31a1f651e4875ef63957da549bfd369732f9f3a492520152c7a876e0f8dafa7fc450d92377196e87791658ddbaef3ba774410c25eab6b224778e072ffe3797b7ab41df75e87d1867d405f4e7bea031aea096cf62202c50bbb2a945df98022c44452f629d508f43624642a5439f153780718812ec9b5b0d10287ad72c74a63e9ca5a944ac6a532fea427f22e1c872384a52b80735329d92fcef23d72ec1d9c67d7fd45a79041987d7f5544937259c350b6d915b6a87031381089637224402125a5e9ed2af35528b056d46338cf65868ef3611ccd4f3efd896c8926162e1d3aba9bf1539fd834817e6b4d996738eea98ced293ccbdb4211f009911d1d06b28464a3f75c56908316c20f7af092f34b9fe452bfbb07205e4a058a7e254b5c946d58f5595c92f0672c424e4ba30c3b50fc21550a7de71536bdbb93143b72a192000ba8e99d61fd0a42d53066d9850617a51fb6bef3633273cd9203c4ae71a458a6beb5abf25628bd026433890ad1b28eaeb914b943edb66023faf6e5316823e3df5daefbe7bed434de50e0915b9f4e441c364fe8c4d549c3afbfc6548972ded29428776f0bbbeb112db3a01a6cce2ce1b8b0b688d9c29d39a2ab0c3c8a2638ff4065d8ffd9852600221d43090774470095a85dd4a1377769efb113eece02a08791d27e537446efd30b52e9d561d2edbf15297bbcf0e4ba2380cc0aa1da722be0e9f752b5587d9a2eeb846bdb2de6474debbbce2f51fa9a7e5bdb47375f7272e390eeb00145a3719145a04256f3e308edce3e6478be0e7a426d3983b8d1724e221e355a8000a621fc2d7cba83f59068d0dd887862c00b5d18eb8ac8a35772f11afd3498e912c813419a55a8589f412d7fba095335d4e7456b4a8885b88b72f6da9ddc721e26981736454e0724e8f089ea6ea13cd6aa90da4439d2f2b7936c8b90f0ab1db33fbdf4f835d02d3f5627dfaebc78b51e848cd40bde89a11710721c6a4413e4ed830993630aff7b567a96dc2c0260c32e1b5a47eaa23b1533b37224a4b1982da9463ca4d7790ecd852b3854d8595ce2c6660994212567089d5972c8e718a3cdc67405ab629d22aebc44e40fbaea0835e809f924604e7ca9cc2b7254818e9ea5bdf09e5a92960e45779ed360ed5fa031fdeec56f88f75cb56561664bda0ae5ca3e5a74c80ad8239ccc5e71d27f551eb10bb9ddd838052f8d32cf57209bac4b6836dc5aac4cbba87c88f78f6a24260f77a21a348e3c452d85ffe9725804c1bc835e4768a5460cefc9bde565f7faa819a8ad48c962ea79a885b55a724a216a2ed04da3c805cb607d933bf36349c9ebb25d6a949d41f81c31a7af28722aaa5dfaa3aa5cfdfaa0c378b3b8dbd2d7bcbe603b2f122e17897a5e4d5a24726ab6cb2c6e77509a26e2f88182c3cb1deff29bf34278684904d452fb05439372e0fb4b52bbde510729119bb5319c754acdf24bd5b28811999d9cb1884fc1f6725b0c578893354d2acb8261a22f9d5bfb23dd3dd2f2a31096d10fca71b307a03d665a57f865d21b87edf6f7dadd2b98918514e31d21ccb0f649ddb4765a581a0dc88f68ea104a01481970c6c2d8290bcbcde1d59c8642575db0aa882e1fee737206e2e28cfe605aa898463929666cfbc1ee2e04a7c5b10fdd37ed83d3c801e27282a066517c07bf2eb04a820e905d9bf861d6b2e181175ed58f6615d2735a2072fe3bba85ec8819bf13ba2f8c640383194db7a6c51f959c978418b69c1bec5b3e55df7979e9eb0431a4eae2ef80d794d9ce879ed189bcec91336afca24946bd722e6bd5928ae7d0fc4bec31ab697003628c6923cbbd7bec571861a25da51379611640101493c518692f00d5495d91e2c07437463b577c052b747a77349732d872695d93088c8d8ea5ac981b0b5df0c1309f0bbfbb3a9a095465550b7e764c2464c4d894d3ae8fe075d3c7dc32fb444caf360ca837025fcefe4c0b0c0bc68ce5350a3737220dd8ed0bd30b6bad3056dff9da84456d42c7d6132e71addec5312b72362423b318c6f3197fbab6a4760ff48368bff2688f36687b1d79a0b355e36372c454ec27def1e5f545d5cac50768c8a0e56eeb90ed319332b3971ffd2b63e072273d954ce03d8f0a036e21a6c3b4417e1fb5fcd4af782f369538f8e7e2946f72bd05c76bdff04dcb0fc614091a0fb237829fa93ed71cfc646f25507dbf207f6f7b6fa538aeb773a7acbe1a77dccf2ebe0c9d2f118012a1631fa154d0e1c4c672955bbd97e1e406319de551d718c8a6a32e7f14f95dc1b17c67eb9a2e01aef45dc0707e966b12969b55294a2cbfb5666fba91c3926817927a61c4ee769c439672cecb3cf4bf5eecc5badf31c29bc40344d4ac261588213e0767a1a6053c8838724c8a8ecef767d9330a57530acb8c9fd1e6f5b3cbaa90089afb45520c2224262988c34275a56783e1cbc42079b07abf414e59219368643f1c2bd6ad97463b1839b1febc578459ba55a01f9140682fa55e0aaf5f28a47e6832ccab11869d5f463e42508fef9230d0cdc2f2e4c8d00a05b7b4157fe076eaee1faa4049fdd92da572e2442632d7c6619891a81ad1689ee354e4b8e8d17f22d6b274b950d466d73f2415e31ded3512e315d03eaf49b7a05b135fcea92ee93cffb24f78034ef715de3869089eb7b2e24663f1b6dca30a8bca955d90b5c159d4327896d02723618d05729e98d4d7b704064a0a1bdedaf9ef107353cbd5b2632116f834c4dd0d466076720fe42c0b05d605ca7a507a7bcfd282c59b48ae45f95d3b447b2e863a23735872bf175469b1b3e485302c8cb62f5f2d93c2841eb8c402e4f3961d2c06dc111b7214ca695ae1ee8ff24a2f26dd58b6ee775567c454dbea7943dd27ebb4571a376381ad554fe275a7c3ce8848eb9b85c333650d124af4428309f0fb158bd9f77772563892eeb6516f25d9d1e655dc735597a26f2df5fc696a52b804e09b5d904b724ac5e5d6ef37c6eebc53a85473219d41418a4811df8a433601715a9bf5f65d721b486f673152e5d9ef2017496532bc16a3e5fefead1628bf5bb1279b36972a54d1f21b8b12554238303115d44fb36d27311e43f30e6bc39d8c0cb3fa10ee5b729620843c448899a08989a5a80882a85a7e69f934efb2b97e26922a4e51e72f729c68e2aea686748829e4eb2a277cc946a161b48c2a4da0b1d4c50065222afc27ac0047cd1192fe7f60620d100a67f125387207d8c4351623161fcc8f4afc45725a6f2038fef1c5ce89fe4ca59a193e20bdc95aa8e873b0f294758eeab302156ba294c8a8ffef4c5034dfcd814ff706a95be8e1cd1a2b7d0f7522bb7ba639f972002683384c3b16d2b919f8cf66d487c34e9c8525f9105eaf18c07f0513d5505dda521f6ab4f6bb8da03a4857950e43033195c8c82c04f9a7ca3846745ca6de729bf124f952653cc6416aef1477a221388943bd8270f9e0359f32af907dea3c721106d593069ed074f5fa01256c85da90831c487aac1f945afb624e2690961568803e24185da328dcec75434249e4529010014bdeb85e0aaef3470d5ec409f672601a8934f9524030e15c3cc5983b62ef215be3d54029e1a2e9f520b542879756a3fd7a07ec1c16fd5607d9d123eb15252a59e435ff3275774679ffcc2e7172729d13a581f37a5993855aee87781a235a0807b193df297690d7820c9c7f445a720bb7e20fd1a13ece1a778a74ff04bac7a847633fa76eaf0cedf3e994fd33c52250e69c5c7d503b93bbb3ebe83f2635d028d1447ca237a64bbedc121f0f79917211c5809d16d3efac9f5cac94086ff7164f1579ccf9d8780b63598d738956ab726c58b3b3e101da29db85d3be91a09da6ca6b6a2395d2dbd07e093edc84813572b66cc8a0c3f2e132e2a4ee64a7f19f3d804d6c56be3ff7b6280b84e5a20b335499757c08e2912bfc82e8f605d5f31d309faa7d5b71dc323ca030ba8ed82af246aaf89aab4ba47b74837171b71da2097c2dca43b8193b3a61a1d7d063b0f19c7273e205afd84cfd90ba092af7963ef78ecd3c06baaf18233dcdd519392b88135fa4a6290888060936050628a25fd658eeceb4f5d9c2c522842a28faa9cbf3ac72f0e4541201f4221faf16bfd7ccd222fb017cde3216b63fb521e79a378d91e155a22a7750eafacad6f14f546501628d401d8f6d5823cac9e7a7f0affbab231e726eb94faec17d25030d304a1da9e43d0056c6bb34f451c1df5546c93536a1d472fadbb9630342732fae1b27cb2fa41472a4886cf7e685b5e7a47845f3a6d7b43babdb0f7baea989f169ef1c32b4b32b658ccac227358a7e6853aa6dc848f81372777059edec4a7954e9a13e3af7419e5c0b8abbaad3233fca255d88b49a0efd72a192554b1eaa3c06c258762ce11610f23a59d5ed48e19988dfca757e4879265980cb1dc5b00490aa0a5b23a76781cbce4b30734b5e1ffdf90569266ae5c12872b9c2fc50938cce71e89d7fa028a15034181d47fe6f6ee2e313c3d1881846e31b277e77562de13fe7733a28cf70ca2d08221141d7b7732a1e661358de73359f720bb307276b168c33501375934ccc5140d5e83ceaf570b556ef844ae6cc417b724e6ffee0035f3487800107346c069d119511ab1a03c1f8db2ee736fabed4c9727f88927d45f56f7be5088240fe8a0ecb21fa03f313f8de0db5e2349f146df2729b8963a780783113ea13f632cebae9f6b5f3efe83bb5b198075fa1d7bab9205c563673272dc5c156f5aa45a16dd7692f20070505b929599566133f953353ef72fda78463789e522be43fb087da7cfc9d714b07c3f89ec963ad83bedcb276e852bb355dc797a5601a95bd257fcb2ef8ee46a1343423d3a476cc7446074de6f0723f48008be04ceb7dba12787cdb84edb706a204b170b7856250c4b81b3f7aef728103593bf4b37b5a73d8991029699fa7c6f0c00880880a61cc8ab4f614f5d369a1c76fb38013c3dfe10e51d348055d3d602220a7e8ad350431ec2a5e6fbbb6728636d4872f635646308851233085d2d6ec294e3a1971855d1a13ba3cc14fab72d3e90e677699528242b2c44807456d7a5a0f273eb4a506cb4fef3c2a64b3567225cd041ace1289d6b1dee2e4bc1edba69aec2f87e04e2aa5f7131f991c2a3472f9af6bf1f17fe41260d8ff33c83c100d15f4921640fb0b067ce81db62465635d906aaee619d70e1dcbabb918358125269508b605d79080c2f42b50e56c211d7274d2a866e9b5e1e5b8ac8218cb623139f6d5007fc581f5592062143982f2647230c4a00503c50e5dccac79396dadfac019628def6aa52e64bb4b39c86e04a94107bfe6401ca111143dd8fb548e1dfdd177482f1dd7ac5253e45c2a917966e272deb84c36a6c6cb194229cf0e2e3dc3edd6d268160fcb4c927a3702ae2b8274709b8b95ef7af90f7ebe1608b39eaaaf1bce0ec57205cba5202c33c89ddae44b46e2197b3fcf35383e0f70628d72fef441a41356818e1068c9feab8ce1825d3a724d6f7981cfb707a3b4fcf9fa11f134efc14b26bd7c141859cda192061bdcc9726bdad6a030b46ac844017d6344f0174c56ca8590d77c04e070770c0abb82d672e690d24e10cc6281df48fc297a5f569e9bf75e583f90ab9257824e140fcc4b7258afb1f107681b7a1a824654894d6e07da18b00ee93ef545a3b8bbf777fed254e87887ab4c514cb6a67a3b0b31609b68ead81912d59e4b4847b0990a523fd1729544b226f4c3efa7ada70d0edd4b4f1432b0a2ce97666c9d2b3ba32d9355f96dd0e8a596150923cc670d729df35e3bff9dd01823997fe745f2ead07c85ab137228d723a4c830d34e9cd4de2dc3deea81807c64a542e456a3f4b12f51802604723a3f30d70f2e5f547dc2263f2df925a5a6699e1aff143d2a7b29d1bd59f712466f45798a457a4e07d58892ab2b53916e8f951fe746f21dff8015fbf1aec29b7262944e2fa59227b0f6669b2e902daf4e237e1e04ff211521becc9af5a6077d72c912add0fb9a54c8d62eaa8ab699781629d5253a1b92efe8240ba664c0e4cc72da8603b1d2eb02b6156dd209867cfd985edb0a35a3bc94891a8233ab5eaa2c3089912581748f79bc9ee8e07ac509114429ecf6b6911771861299cb3c1d91e472cc232cc7a416b0f33e7b4e988a3501eaab41d3cca886b13686e11190c9b5787223bb5e7f36987570c8ab7f2e8f712151408f8fcfdaa941bcf245ca19a6aa8272e1bdfebb3db3f846c7cbeea74135f3d73d9b598386e81f801441f563c2be7e72d3d44c05a18f63fc7f4e5857880d6c14483d02a5c5dbcfa1f35a9eba80e7ef4b3925bdec91bc5527405833bfb6b336b448cd637c2fb89c68e2594058aac3e57296800afe1ed29daec75dadacedd7e67660d0aef9ab6c561623039d0e33a69272e482f68a2263727fafcdc034fb8fdfa8866ba613aaa9f1455d0446d1382aa07299bd4947737f0d1af82d85f7aa32bdb997b67975df852061ba309a34b67ed972241110843eb7b172718449be3ed20b30f50c30c4c059638022e602a21f28633e0eac19e1b693d47c0db3f6bac09aefcb2e24dbb1acaec21652c7f1f21ca5c1722cbdf76d1329a774e28da9e266f60dbfc52b0d2d28bd85947f334a275a433672ca6faef105171e110de0dbde0fa9c3f4fb367af223d77fb16f1f8274e860367224e4011737a176efd6db9554fbdd8dadcd6c877cab05357b9dd6c8ba23d65c6f83baa24c129e9bc56964ce0bd59aac848b65f708d5ca5bc47a645a39aa59892e06fa2fa9f147d7d24cbc6b0970c71222a36481c94549b010ed0133a7c1e91e72428b0c761c3ad5b6137543bb8f13fe31a6f3dbc3f7d9c90597ac406deaa10572bc39640e72466cfc0cca849f29ba0e971587898b5c4e7d91e5855da1ccedc572cff1d4723565d1b9cce424424cdb7b021ce8c6dcb931c6d3cbc3e4871207971adb6c93ba9015ae6601e1e3040703a5f380f57091d55b8378884ceb863515292ad15aa619673056e61970f97241393e39b1b8cde36af47642dbe0513b76bbb019c7299daf0d6fe1b14bc9e1fa6fbd693c867ec0f89eb1f7648f5e9a9a032ce31e51b7d832e4a79aabeca092865c26fb18a85bafac724519a330203f86c8586e3f575e269827cee14319c185d206f7cb982bcfc0c30ca3791992fd5d6f708e8464d3da134cee83b9d144f42efa77ed982bafd67b789f76621e4b7544cfe4388872fa0337ed44c9b41859227e3c8f69cdcc7935ac2998ff8e6708de6270d1f73a720081cdd60edfe6ff20e800272b9659d6980c75a739c454273bd8e6be836b3b72e51a64d2b84a3bd39d4bccb08abe37f7f8856630de6a0d07027db8b35ddecf21ce899d84f9b695e436c4c3753e3552a25e7f977d9ff8d04bd397fc510adae37241e3aa37f816a4607e41b4e38c0a83d7b2da56245222012b4c39f6935f394d33da40e46fa54887de76029fd994a4f1d2f65d5a4a2dccfd293b8f1e521559b17287aff20c39af4f2d079a50263ca0c3929045ec7d907d99290921a19d02f0282fc25a1dcbe2d33608c1196a536ad0913908e6b38ae3af4b5907b0422be5e55d72a0cb0af440ca6429f72e89bc0ea2750b85c9b9701ec4e43136d73d18db88265c10e9b22a4498ee947636c0a98c36cd1f78b9cf76a3bb62e2fdcf1d636ee0b664fc55ef808b0d29be1e696cd531f139f7a30c2fdfe9a5edead7063df1747cbb052b8120f55bd89e692dfafa039232d2be80a2d472278436c7025c1d9998aa1a72420e75e32a719a3409a3474e63012bccff4e116fad533d91580fc1f62e799c2c46282f53bbef46080c36762f6ead8ea9df9403afff560adb7daf897f382fca72107ab3a2dcb83929483c6bc88158fc6edd9fb1987d0967149e0f28dd3985c072acce972702f30a631b2968a322b8d3bebed14bd60ec1c505e23899790788aa7214b500c659424f87574978e72bba08f8e2bf7a1777af86c251e6852c3001d37251817325fd87c8281064faa517029d363f8b1c3caeeedbc6c56b63c9318b143723ec5c9503af2f022f1a8fd729f3e9f54339341576b67a1a81f10b67c63caa2d1b2ae2f6340421a71b618c60e6eee73ee044fce64c335714e2c9b24391ed81688adc4cdb2ee2b3b5738d62168458fcc93a0936eba5bd0d1ecc7dcc94d93e09156b3a39ab8ede977fcfa229e9ec7f66f80286520914601cd19f62e37ab53edf28edb4e5eb8dcb04e51f7f8bed34ea86b0b4f691db385d892ed8a95ca39c1de77225ae437b26b7c14653f53ec17dd006d669c9485bd053fafffe620552ab207072b9873fbb82e36a2ed00bb3e58edb7d0c78144dda96575c1ca99b891af8cf6a1e239fd5459cb5f19bfaa3feed60cd2ae3bdbbc55b1ed01f62591ad31c28f99d72acf1c313c8a119189d07513e8e88e2dd05430c1978eea5bbcd65722a8aa2027254d61a89db0ff37566f7a17ef08914ea6bb664467b166a56456c54204aef4b72b379477375404e92eb6b7fa112f9d610fa9ae55d83edcf89d805fe05295d0200d8b6faf225ffab5cf5447c9a24baf3327f6347b4f778bc28f8b2a7f76341915fb73e68ac5cfccec0ce10fde844e0483f37a3cfe815506c33fe44cfaec1b40d72398e9b501d51b0ae7cdc0eca5074d87795a030a7537bb20e64abfb1836751972ef5642908c3fce5f7209359a37c093edec1bbc1a8c942b54c8f796c70bf9d97290ac54239fb39e24f9ce2f0d12d9f6fa87fdcd5f1bf1652bc11c0cdbab30695538d71fd784f90e60f9a90ef7cd02a7a76203822771ca4a087d6bc81897e70272d96d3dd8006ecf36ce3fe255c39b60f76d13316fa7dbb33a3e99339594358c72f3e145a14d7f05a56e14230d77618335b3246f89f58c3e90d39dbedcfe492672ee12148a09eac9ac3aaf670e2c67645712724550ade77db9a2094ba8d0aeb072a28a58a85409e2f6b9c78357e32d9b33347915ce3094cc50709af92ee7288872fe92fbccb571f46263cfaa6ed7e37e34f78464669b16f7ca73f9963132f4382a8ac45d02c17f734b4dedaf6a535fd4b49801a5a4a7e580d06ad3cac7d62b0540a4db72f22c73b4b58a4a6a102a4fc9784d99b1231b51d9c1be880b994142fe7251228cc20102b8a54cc9e1ae33e8d21d6555cd5b5ab960c7346eb33ae768c0729427666a3644c5028112b0f2d0fcfe4185fcf873dfde3aa3a9b64cb36d27df72b027ab744eb148fa24cfbd6bc43b8b08feaf289214603f85e06a0f3aeae92372519c78274eb393c694e222942c482182c19e257fb0ba2940b87041d64d0eec4e04dc33246eb6ae3a62afa8fbb22f2ea4e734616cb5bbcfd3b817a172cb401c72a8c3d93e1a15efd8a6b6903626b4b3eae2ddafc6425cc1d14bd41e30eecd7672086a7f8bf95dc9d4c970eb6b1f20ff64027435cc19f3a0764e958c4c44e6cd4fa67026fb937bf0b2ca239772ec5235ecc6891e093a116736588073ab8b12c3727067f26fa63d9c03dc862c0aeef76bdf2aa196d05da75b67b4fbab7d4855f972bf9c833b1d08accba4eb3c0863804c1b38c423af551bf5f2977204215ea660567a45fb05a7f86298ea052de76b64e21fe04faa0015a905c7155154731b2fb472008671e14eae47c21b16e5b40f91f1704bff8088f62b5bca22b030bb1fab61727b8a9a78566d818812717ff123be9c4dd693ffa1a6f056e26ab271af9a8ebe72dacb8e095cdfe2a5b1fc14eb01935c72ab7a7d0eef22667e4344b11b46aa3d721f4e6f59ac99b03799b5c1a9e164d24d226f03428d99c43c4e4d277946a4c515d160a022ed66bcd79284d5bb06fb65f2e2b2df11af7ebb77e82e726fc640534250fb37bca1b0de6401c8919ed45364dfd0a712fafdae65866ff737d6c06ae969421c0086a41a459c45fd67406e046fe63effce3d6b6059088d18e7a626ec3972dcdb55bd916cbfccf487328e6abb724cd369ae409addb98b28a1786bc77e971708c7986cc5fafc7090972d070bdfb4be3f160febe267f7c847681c9cfa070e7268a9e8914a888158f3599e430daee704dfbe6ae00a3b1450b92da8b418e09515fae7502d364bdf343890628686d0bcdd17ce577ddba3c91984f1e7bd98d4ef72966471280d9f77d6658627030782684e27f86fb16b0cce4611a4567e43095b41673e0d05bdbbf33bb35a1e742defe1932feeda1042fa4bd6086d2bb447673e3d2134fa328ee50608d5439f657ff045c93d30474a61f3d422a684a71d4a1ef0727b24213a5f181d75dce2b103208f7cb6a7dbf38b7daecec534d195b484f5e61847cabdb9c6a2e3127d8d1e01d00b42e10f42242d8fedb3e80aad3d652948694267468b0d9e8561862cc335e778885d651716de2d9436c83e66d319d08bfc500192169a47f82a01457260fb18758eacaccdb5ba75c35441cbd5990bddc3ca92563c7c461c2efc379a79455420b482a9b6aa355f250114ef23ace8b2a3afbfa57210157dd86f32ed7210f2753d7ec0c7100991da27343f1b86c32426330fdb9c4131ef3c1915cec9329f0cc5cb9132d02dc2b241cb5c46d974cc4452f5a2a6c212e1df9703ecc3438726e67b692b863ccf6b9fabebb10dbac41305dddf00434572f4af6d5fc0706f73849f16aabffc8c3d2a94036e9ed88c8da0f367bda2131f72652ddb3e71fc9ad7eaafeda0f9c73736facc190a1fc9b40ea9e33e30389dc3723212708d7463d0c441fe7c111d370264bf73b7ae7049791141ea22e38948727239d7d6cd0456bfcc21324ae3380f1756418c740cf45b0ad3f5a38f3cba144d722e35bc9a29d8b00c5dc9d45e70f88d3e3a37209c2b67fd8b5b93d0f7ca143b49d33b1e23645947220105d33e8dd089e9e5e16a657b73ef842b6970b3da023c2cb505ee8155aa0caefe03ad8f36106e1bf657c415198b74939a8e4892cada2a7226abde496befd2754d66e4e4213c4b2d9e54bd85064b828ba7df26c585d7391ff18e3af51601dadb3d0072036d26ca11276f3eeb0eff04cb8ba5dbc418321972d6520a80dfa7c856699010f65f970a9258ffb0b00a4973ff693fde2300a72170f3c7693a90b8294b445b92c91ee87a5e9b5718996c1dd8adbc30337aaa2a8241e8c159b4e5b8f4beb2338b3bda1576905f8fe7b09e81ae8e7c0b2f90bfa1cd72324aec32dbfbb01292acfa760f47cbf7d80089841fd7268b46164ef1cb7729725df409959732d911f4d3a7c4efd7d285067c57d30c6cbc98f4ddd26d70d1fd72a6feadb80159f28eeabaed725029029f4388a1a3e0f75a5be253d524c45724723e25d3fb65286c9f6d43f6adb6ffe2666ef1687d9b9c0f1df36bcb25f2859072af1c68ac2c867f3f3ec2d36b26fe5290d6890ae8b2340ec73c019445adca5c72ae1d918c726603c04a22f9199a5919d64fa867579592bfd4b77035122a9ce1724d164eb8575a8feca668e8816a021e91789767fc84ac33d340d25ff0fb81ae13d5487ae158d4eb2852f006424f1e85329efe8823cedd0c55b4b427ba603fd7405b46458c0c2a28e49cd3205a84816a73c1ae106fe9c94ff0a669020e4a8405263cd838ea3da8d1f508151977bec7feb939e2fa84aedd40fe45e622cdc204935490d5b2900232957a943763621d10e5bf850702018a27a3714f1efff917063472927e885f0011bd90859cbcb153af4e3a842965eca67f35455d5c37c9cc49f072235e273020156ccfce1e94646d1b420fc360c621a37796707a0822bcb2c85d2c6b1de240464214a33c41253b25a6c604c2e33e48dc9c0cf3002a4c853d83e47284dd4ca76a28d1b9ac06faaf8351495867b64f29e56413b418f422c0f3d370722b3142b78be1cb73ff3f2680240aab480de992ab480699cd547935d158872e30db83e536cfcd4f084b79080eeb50e2d15470a77e06c1e2d78d27ade665aca9722ce7785c20b77e797413fbe2137178bcf13f8c9f59d8a903461ddb16f7793472a74e0993c1ea1eb2c4b4df2069cc2f1107750f18c5c4a5a1d65cd315acd56872049a05fbb592b04bcf052864f4a896a0137262b9e5f41612298d25f1221ccb7290524478ebd5ad8b71071dc80666b13c7965f0119a3c8436bbc11ff78b45da406a7195a794d87404b3ae55efd95265fcdf3857c57a801091ed38b4cebd04f23fa501494f18f549a367d465abec69d9ce4ba45a8d39bad591f5f065fc4a626a727ffbca0feaff8ae72a88b30f212fa688e199ceecfdbf6dd7cde0077d0f955e72bacf2a7db9fb95b7ba7323e12eee634c87dd093b2add95eefb0dee4e9762847202c0195cee0f5318e8e83b7424b720abc7da89db79c6c47a847ed86768184c72703b462b41dcc5193856d426ba0231a407e98a6174352a9a3ae044d2f65e082a5d01775fd0b834b4ffab54adfea2deb5b0120ce16821902b277a3372d50b3f7226d122d31a9c353aedbd347456323e9bb332802b9f3651324db85533d8bbf87282709508a11d10c5011a7c2d3f15f67ab6472ff7eb252843761d174aa21e42729e5560daddfd4f7aa1be8e93ab2c0078a8783c35c75b7c8ef75f81e768e11172b6a48bc0b0e6ea9e6ce5b74a7316d14d04792b7328b8a10987ac8b05b5127e7242980a7489269dbdf866521738b4129e03a554621e997dac108e7d7165c8e834d5f0109485bc8d1495ade3f1239d3f24e757201c9acd693f37f6767305299b723a5157eae97c7571e6a43b94bb201d07cc5bda5bb2acaa4f208a0a93f9cd4d6d8199b100b02fdded8b36540550fb8dae3ee1d743dcac43494a6d0abf0ff98572c7f7445f4e1beb048730a5372c4ee917fc7106e504b02aee44e0a55a5550c072d66607a5faeffb0450129f2136cf1d256a1a5387127756954ec7f305a4ee45722477b7bb90e9e8c8689034b15f742e347ddf2c5db1b3520983c3b106195010463d53245db79e849eaee70c1289aa7105b5c9c223cf51a055197fa88df6aaf072ea03f575394e64a2dea01086d5604f66f1428f6eb2c610c92fccfce7af585e72d2f2cf3e32ff94987b5e916e01cb04f7c1067d992b61fecae11f6e733a293072d1bdf47490befdc33de9d21e4d895c0b905766a7e75c17c682cadf52f91244722690a2e335ebba4bb65d070935dbea6b36115fe014bed4f919af43f9adc67c66680e0f1d36ca81d4d3f4be5bfd4fc58f935a46222d82e268abc6cf3d41f15172858dbabab4b4330303065d3d598dea52243a9a7920ff3c6c3ce246a70997d31095823e745bc5ab9d8b9066588567f988b17c4f39052b9626d93cb999916bb137e47e24f4e2c0b1fa131c5de30f33af7025a467a4002068bb500f3ecc137a7e727e8a60001d9489f9ce180c4d9b3cdc0b9f0421401baedde920fd97c9a4a6e72c406f165c2167ed79a91d6dff3b895637c4c055428d81ac55f62e5d32e3d24769d238be8d6cc44497024477381aced561a5c4847c178aeb7ff2ab283ef0ec1b3b1ee727cbe06d860bc519a989e1b6f4eb2e7f2cf3837be161999a31268838a2727e96e7eef608e36592950159535e04857f3acb5a7d7d6685ffaab2d26dd11972b39e5ace82d0ca7c62e902e09a395bb2ec9a153b45343e7976661f2fadcc3c7236e8b0305cd75806840176b46b58fa57cac129fb9b2f46dcc8f47411bd64e872e4877157fe509a87a1058fc5942ab4d95a3d2359bd087819a18e810e1b4a2718a933fb613d6ffcdd8ee2658354a89fbe7eb5002e1f7499cd6c75e59edf9a1972248522ca7e4da05195af522991dcbab94bec51035295e0cc26880fa1ad138872c3687cf343c8134f027ceb6d07cccee2ba8d75cc529d3de165e220af1eee5557cead641f59d4840e905114a333651449441cbe4b137b5d8d36b4441bc914a248d2b3b5948144c02b6919580c2b72836cd716b1c59afd0f898132184376933e6965f4d7362940f16f7b176d4146165c565e07049112644099a29ceb05e296337234829174784756c93fc1ad73ff36a7421ea038afaf88cf786c5673d15a2cb763c87e3b73ee9efea78daa7c00da124a2339602e4a239ddb03b04fe0afaa89ac5f6237f6f11b9d7be55ae8c91c2e03206797012e81483f09f3d2b986b45f5afb721d7360b174973f9c032833a94698edb476f7eae65974ac50144361a21409ea72592705e25a575c0d1505a64bc7d295843dcd54960bfefaf0613e30ec749e707297d38b5cc905eb8aced3bd3b0067f09b9e4482cfd4ec782b780e60a509f0e74aad4a6005ea11d114bdda3e9ee996197f12ce014d0cf473a415e4f0afbeb127726118ebff2caf0423a02e80ea2a261c2a73af2eae99ffa9f4ecc6710ba89b4956318bf4d9beda744d5015dbebaabba1ff1d0cbcfd9ed1836324cbdbc7352b4429335fa2a62029d87b414c80394a75ad19a9144e857e9ed553b4fd126411df3d14c4c9d28343f46c49d1278d31df6c09f88c9b56a287bb1a8fbb7d96abbb675a727c911069fd3707cd5cbf55283cde2851d52edf8a04868566f7388133f5950672be7b985dfc3c0981c7769067152b9cbc15f23f74f8da2df9105cbd6a0132cd0bc919dc0dd8488915e52f76e69b119b47099e9077b70f5ec51b2ff4fb3bf99272c78f76c3bde861541a04a482593b400c0bc861a40b457cdacb20e4f9ab11af728b5983f3d7bd6fffa0bf218f8354cd960c5c02b48fe580d8b36b88c8c071f9148d073e3fa4b0a7eff9898744a31ebc74d29855c92db892d113d6e533e5034e72b6a19e7b6d0bca707fe1ebeef216aa7147330c3527ece4eb015f965b61b93b7254de1f1aa1a5a687a1170e59ba6680358e221e16e81013a4cbfe2140d04b92021d795052f3531efe2f00048b8ebfca69976ff853700b4cd5f7cd6e23c698b372494b436b6e8703da569be311916cfe4d51502dc2c949e50ee9cd31de5fd7e372cd9369e26a57b392e3f1237781e551f574df15c351c0a0af42286877a58d397265ff51e1cc2b4cda99e2014de5cb4dbffa21c9d549a8ca12b494ceea3cb088569ea5c243d3d1221f9a2feee89341cddeedc85f48cc1186121c2dffbf335d6d72145111e5128c0f0f0f9d13240414ff4ccaffa72d3270258d49f2866543b31b725b1d29c24c7a5dd2d47d10c5ef15d78e9d4092973bf6c8505cafc2ad1cf1a73ba14efba0f1c3eee5f6102384c3e3548f38dd3350e067c47a32a4f7df59551672240e18f02acee1a3c4bb954d88b929f26863ee84e52c5e6825198d51f15efd724b4268a30ae59e198c6906de7bb2045813046d3f7ddd2673fe02f3f38023a2726483ee17b0a9121d4938177bdf1fef4bba888c19c316c010e3723a63d02b8d7282fcd5290ae4e104fcf6646866a81dcd51e86ec79bbb5416f3b224cc5eb58d5fae40ce684a7328bc078551b2b2007ade81b199ee5573a854577e2c1a8b18e872a5c214917bbd585ca55f8608e8f2bfbd7c7adcf3345d53ce0f708870e968fd72b74cce148a3a96007190bb8a089304e3d576b582a1049de7f3289472ad52b45f9492b52acdc2bcb3c235a15b1eadf76865372491861a8b7e6127e3c122515572a11804de6cb35cfee2caab2b0b76ecf5208cfdde6946e0e48b74fa8e5a5f15253c17a23b9024507f20f6d628cba51c5db51dcc1a5f1b012ce72c1f0b3f900272ce5fc88f8a5475796a84faf4d92b0ad8b16d46b6985773c6306b722ab571a972cb336a01aba8a68d9ea27c21a3ac9fafbefccb6784633bee18aac48640ffbd41ba90e4905c9aa078257fdca793e3be812097151127e0ed613fa50cad4f9b2155da4d6d554b806655a157ffe9b18757623a1d8ce86da76605099263fa7c13e672ea74c2e4aac2715403bd4d74590380f98d751d19e176da963826b7a5501026722648097dbdefee90ba0a9649d2062e336a83a44b12dbb0820f944d2646c2a76d3fc915cab6e5fc5bf57ee997313ec9d814cd1a179f795d49d1eaf0070cc3270caf9f5f32d0c76108696051ace3977a02074712fd2032794d4044f494f8e9d25e96ef9c983204bf985188acae6d0fa22ab638fac5e46cee100a6eec65cd47520ad21732c9bf4552462fda28346dd438504678ebffd150711fde15ba5713391c727f2e4c85edc6e795ff5299474ab35d33f6dc40479cd41c678ce179abc9247c3b09932ae482a48840a0abb0a1b94fce6b6d5454a1cdd2b3fe02dcb656ac8eab5473cb315dbdca8bebfa42ae5129c6ebf500a37bceee1f1fd7711c80ca66676750cc264911a4f656e8f480ae31beafb4482dee8dc59190c154b9cd8944c2291429d8b7e226e94df91da25b8c747463515e140313b98d11a9539eab52738d08111a3f181278b67f370adabc586209a770d22dbaa852146334996a9c6765f5356172c47277133ff77a641105288d1233b835f13d428d487ee23404139a30bd41224571ba576d84c79b7bbf810969dd3bc6a0fb2d1be4b339d3e74e54a76f948bbe50c264caafc5f16a47dc16452b4a3c95c6c6e72debeac353c71bdc36167277c048646ef5eb312db9b22dfcf58d8b843abe77477199451c37b1328b4efa5f6fee56a1d1dfa0e9e655258c6ad7bfb09906f4bf6b9cb5c86e125115e90370a57ce072b485657ed587606f0f003ec6bb77f118167ded341a641b611561f40a34cd7172afdbdb52ee919da38038190612d52b79be27004fbd4234af362c2e6372113f234f8181fc0e6db093822eedf13bf24fe5b9e4d4a43ac6a5ec8f03ea21482acb720ee0284071f98b647fe6f1c25582f047c7b4dad59051aa7c7cef5e2f7ecbbd691b44a2a8cb36fcab1df9c9047a28d277841f5c64b427776468c0028877710472de6d2520e0531bd2394b5a121911740a3c3283893b619e7dd41c191dd0d8ed727ad6a4246717817fe6333456be6c0ff0852c623b43f2cdfba6d3fdffba91381c48b41797250743dbb93feb8bd18bdd0b016c34bb495356da2fc13610bf7f5a7270c3fff3adb373f963119b3b01deb08f52bf0c6f66d818f52f6ff2bac27bb026e84f38a44173dd486f41ef124384c65de25e0c15223b43ee14d4b4cabba9647239d5848623e6a6e81b21099282813cc5c057e73f1d989873e982daf7454e67727044c2877258248a81b8abd41019d0092c793c11e3f9eb36ddcc5ad91c522f6d1365f5ac914d1e6cc31dc7d18d26fd0f8113ceaf1c8e75f1525f3ffae5c2612fc3d0b6ab106c6a87e10260ae59f79688ed3971db359166f0eda51596d4dfc7591421dca3e7fe4524bd51da204f0abf5a3a396fe41cb6400057ec1ac8a1a02a56205ee73acb926f4e0b0864d36dcb8b859104c6e52551b2957c1367aaccbe491f9eb186a5e42bf8adec3ff04eee477e43f1f7bb9ed6c48053c26fb4958d8581725b6ceeb3e2e4cb5644c10c28549efabb0455e8b207c5547a9a4c213b061fd9727a2684fd0bef937d8064df5c616b0d29600f3279ffb21e262f864824c84ef906a2dbdb027913fa739e250a9071243330f69aa2d20e71899d59fd7f8240b5da72cb002015cfc76e6bd326e8399f185c6392c717e26864df57f5f0b590df172672b8384b7f6c2f1695e10d1cff0aaac02ec77f7bf0f30e807e6074b9192e2ffe724c48dad36dcb342222ad4140bb4e6640b69513b017711efa12285f4ae955a13e99c6055b0eb444c7db62fa8a56097018af08faa1581b9dc212437b894c56b80860ca967ea4bdc30a58b47ee50687967a2a3c4f1b012d896fc376a306247ba6722d01bca9c29095b6c7d68d9e0b3cb378142b0938960a7eb28fd79ec1b29a2872fc2b236816c69afec4ff22b8b8d2d969f0b82b0af2d599ce0e92a73baeece572828fb257e58ac2649b051e6e539de3676f5745a7c87a28a307dec243179c956507d274ab91aab1833118e2b419358329c2fa7bcf766a8448fef15269b1175072b08253877e8d3be58f79913997d07e5d88eed7455ea312706d0259ec43fb5372d15698def71eec8f8b2114b967a0c35321a204dee5cf0dfdac8c8fa202298e3ad37bfdb1c24e8d0282c282e4738a3a37e1a85221d64f1b9c8c57fd0067357e72ce017929d6c0c8d16ce6dcd3ef8fa10822a2330a3256a816f970ae4bce46ae72e5231d70369dc6632f717563327a36e1a98c58351b74e633c9e10f32790d1772e3ff58e1414ee45b5f6a87a59544e867f64dbf0491e8a36c071d6aa25922d472617157e1a3871d7c95b2e8d10884009f9e707b18daeee2f3bca6f36f26455d72ef44bb7699c00f8797bd0536cc924dac6eef888c76ad672a71f33df6b3cc1f72188c5c6741d58629432b85a8dc0896bfca1d2122332c4355ba07279a208164728d8bc195144fa48c5f93716acbb4e89a1a28deb0f99fa229520f1626082e641d1e4a12c0f6a8f5c2df3059e666381ce05ba711fbdf6edba1f25e7d5cd6b05372530957868c77949e818b452c8e5d77df2c7cf82f90f23128bd473f2dc7e2d072ff0409e2550b3a6905823e1bcc6fa90cec9da45f29064392a84d9b86dbf9c94caec2a693e1ff15e3b7f688ce470f5c53b02b460059b5192d4c99ee1feabd3a4129930de2aa97859919f76542e14e1f69c1a851d3422ea5efec7181de61511c7201d957b01ec286f5b1746e04fcff19d4996d054af49b4d6d37288beb7aed19567594c181f1d94b8ab40e32c0920e4a520d522ca1311adba319c0632f12ec7218524e9d8db536376b28cd309aa4a3377ceab391330040ac6d0462746c38358f6cf06a050e63c8952974d4cef608c956c90c57595b03ed8218b46c25041574fc5f40f0a6dc3073206f603aaf882cd313cd09a25af45fde90c5e5b6990ef17472722942cba53b0af041e7e545056771ace1219b04a6d49b0ef5d996645cd65eb87222dd70a70810eb25c0b8fe3d1a346e2785ce2a1c38f1847d42ad3c9e0d8e8672210998ad1b5867fc19620c91a860bc2046a73a766c0ad5ca2586c2959d0d66378a561dc9f5e7ad37035e40157302da04cd56a0f7373edfe590a34317c2b5ff6ac088e702cd95aec266da459d1c188f4716859eb7ea003b5433a71fea11831e722e83e351a1791ba97cc2ebf165300a9632aafb355389c9c011d01b81f7c16a72476497f2b094f481f5f6f393d61b99d60d3cd6d0cf4b24df4d7157779ba5ba72468955f6e76d15d429d176dc8be431f371bfb9944f9311dde55a3d2578fefb72a4a2234203b1557d77a9191016f442a1aa79776e26ab252d414f0561846ea4343b3ecf85cb71d0b414ebe9cb9d6d24501d60536d944fa61483a1bae92e9d3272074951b44936dfe83102963b0b4a1c20fe3ac3034e9cc7e2c2baba29480f106451ecd483e548f1a86b3f57a431cbd0b86104ced0757a4e88d667b441a76516724d198ba7b7cd7603f7f32a0e2cfbee55ae07835711dd575410ade8a8d305167287b173d594eb3e68c25a4d4e063904a3a1d24e2a2d89586f96a33379234ab772c3e4991c041420001728e4602a273148a9162eb56bd36dc582aae6eadd272572a8ad7d8f9d4b5e603c5044e8c97f5172c08daf7e4e0c95b38a8118f10e227462d1061adc0355044c2142fafcff14bd632b9fa9726e711f3b3a52e2eae225a236cd2cd276644c3d1387239e49e04bb065d07d51db8331223cf7a5af8d867c124bc2c1635dc3705ceb1fafa3cb1466a0d34408fd60d2b69f8ebc3b825d6bdf6a727d0cf868477584364c14690a00c2e2793a81d373451461a40548570156b2992d41ee6c8f6d5e2c383e7d4ecb54bee8de72a3cfc2fcac85be6b00470b884162722731f096376fbe1199d86e7cf1f351566bd73d78ffb072586cebff6c31c8c372a51ac607627d1351f22ca989322d3e61190506495fdcc958f69764efd2a1f74eaea5b869a4fe0b44f6c67c2ab5d8dceaeee015edb1018811efbe8a735f73154783520ea3759a6acb6671111c956e75c15c94f187306eeb09a8c344fd17b2bb72b8dc1575b45e7022cc444699e6c8d36c02017c627862166ca4b546476eb9c872e86bbda79b3fa1b9e2921fa8451f2b22b7a600f89e0507b3010f8e19720aa772672b44dc78dcc5c775107b831e9988336da3d5221489f45432590b21d5119c5c27a7b0517169db747ad4080cf144e4016eb17029ca7861d9ee3aae593fcb2e7264979c33529b66475f43c0e650572f53f05e5cff1ed04ce18f23a6ba2d01b472bfd37ee926ac2d3784ad377b68c33be90a21c4d71018fd76bb792f30e1799472d43cebf97bd822e4756f4ce4e5ea36e86bff8371779fe9dd7c8e056a83917172b29fe2c6490b5993160dc7d3e4318e9383e51c791d67311f031f0c730556035aed371e69448693912f13464138f1c4ec1502b201bcd2170b7da53a13dea0196bff1c869d818fd5495bfc6403a43d2e7599cea7a85d6f2523ada860906be11a72913d6495dc47b3c671edcff0c46d5cdbc777ffcc97c1978ba5e9f4fdf3366c4960366ffcc4cc23713245bac3af09168c0abc75a7e04a61e793591d974fcf1025671d9b61a9d60b70f8758f8f9724281e53ad9b01986d3f4aa768ef87d871f854e92d88ad6eba9434bc79019d1ed4520adf9b670753031f0fa9eddcc36ecb7c72e49e41485bd61c11333a1d33013250f3caf76da8b2b67d46c747d26a0df75a53ac53d58f1a91b1e77c568caec53b88ac3bf39660ac89de6ce4fff7d393b6aa72424242abcc40b5308753ffdc6511ee51abe7d1e53b5e99cd79ba3767b35f8172a3698587ee35bcfe71131c62b31c373aae4a7a5904ef415bc2fec19ae8ad507262570aad69e989073b331c6b1309df213754ba1872de6a62d3cb2262a8459c7280b174f95567a8b06c59369c97bb172b7144878acc0095884fcf00c07e811249ea87bcc41db3e74474227691e90ec1e86501e4adeafb43f51e5713eaf1947072430cadb0f6bad0fa29e852c098d042acadc70bb241474236ef41f41311602172d31ee329741f233277bbdc49ac424040258b8e82dcfdc7ec8daa799c8aae847232bdf4c54ead1cab53810ebd5cc7ea2a2e7dff847de5a16b63f5b4f6b74ad20baa0cdae25dcc13c0a573a01bb3fc24d18b5e6c40df680ced1dd097434bc2d6165fe288b0e9ca2a59befd9109d482847c99be3f98c1468e2d4f7b0741ab2d9f5cf084407654cc975d552d9a83bf8f31bdaea1c36d913886595b61207ba15b204b210d633ec46a1a6d91a47bb4c62dc69808c1b49dd8e26aa172d0e8d520e08472cb99ff7ac6111f4bb7a1fb7a33b5a3fb635897276e49b2f0f57a95a917f7b272de7f2969025abce969af4ae9f4752f1bc8653b0af158c18d95b3279f158f51724b3a7660c9c84cb8dfe41fd1d62c7d0f5f63c5bd2d5f0f30a6987698f95a6d721f65db54f2b42a4fdafbf39f35743b7ee845f02e9d4c302fba05788d0fe97f72b74e9d66d58b5a3858f09bcaf321b2a2dc3d5c4cbae0f335a9e941b2c7b98372677a45974f65795e4c0e03208857c75f081f563f5074a5bd1c5ee1200167b8725c9984cd1ad442c32d9ff4ffb4fee47dda2394a7a764c0188be9b2b2e4800d658e491667461a31b6c7979a8db7e87aec8552a40b6f876a52933ba43b75a1c94a10b0fa23767f04a8ae24d89a56c6c32f2e502dc025206d58674f9ed940506172c8e78a9385d78f6aa4eb192adcf497c9b879019d40edc2baef5eb01baf112172d2a28c3bbf992e40d4f09ef32e47d71b5426bdb267312b141e450222461e59726614a8436cc5bc7c085d689d5d23b371732a4875898628c9acf339b44d87127248e307725d3465bcb7616551e7baef2f43b06afbca32df787c80782fbc768b15ea6b9858ac2e868c5e4ce832fb6067b5f1dd87480ac5cefad0ad4beb66e7cb14d577e9bc4dcd1819517caa682af575392fd08e2050116cfa7ad95a162b38255cae39f142c03e2ae3bdec840ac4abbc8cc922babc3eee1a8cb4878aa111a6457295bd56f3e57701d33f164416da0ee897530f207c2fc5e8911275bf158448b506e4d57db2885b8b4474d95775fe3fe32fadbe29d5b1473247441ab2c2d5f3270c04e1b1af265d4ea583cd9137050ab08c6d7cfec5aa13f514dd80171e2a48bd720436037073a793f1d6e61678532296d76ae3b2b5b30fc13c01a1f730ee6ca517d75c1dff3c2e48cae5b88c3254afb71d091e2b2680791d5e6dfa3270713290723333f5e373d1452b44a37635298905214caa9cf809834fc6e69a1197345ed2725320442e779a083a3010ace7b6a5038adf15c01d5f1578ea317982c3aa5e960bd82ea490628c45a6c483f1d2d957a96bc6936f95a981569ee55769fc4b37a3720b1c5e024c3657f31ccf107cf5e7b5ef458a0978e469c7033582dee104c47b724c8ec264c5e694088df7854d3843d3a0162d98fea3c76acf7668b9bf4eb98f1920150a8553af1b4523834a2be5b7b51bacb800b3edbdfb585fd0adc575abf872833c58e266c59f4a7ab54f862de913986f65c846af4f3f7c99b53c22dae8e1255700bb43b933a82025a1d53ed07a992286c39c429d37dd000f7eef1c86d5e772218979bf16399d4a2ac50bfe234545d07d0be2390e79b9b9e8d315f330da4c72481dbcfc9f5f46542a45a5e281ed6707096c939ce5bf4539740a7df039926872d7867416793d10ab1ea161a3c819798f02c4e4a497f348d81a3484625f434672c00a72597215c50039ab361026b97b88afa9925487576b047bcf7216c2935872be9a8bd33b0b646efe1865985b9dc12bfc0db0c43b63a2a5f0df7b37f31d56726b4e125a1fb84887195eb4591a3b88d3822072293996102514f315b6d1ded825f7f06f9421978d5981faf4f5f4d52488d21ffcff6b14b04870642bbf50eccf5fd824a648027251f94bc6b20d396f5092c44f22c41bf081c9b8b253a7e39a7972db6aba7bfe5faa14311a003ded27e6a501c99b7f137c364562e4d5b4e4090d7290a94f4afb3559997e4676c214f47c42cec8f1ed539817b076934cc050037c7294034435aa47678fff9f156675a845ef3bb50e5cf63946d6b0e53c09cace007214dfcf0ef0625e1af43926752b7720279749748f36e8409abc729bd1a1b9ae06daec9ea564e4ed301a77ed7c33911ec044d82e9c4296cc173c0f01298506c972ecc790eb0a63faba74adb1f77fa64068ebab8e3c9840be74274374af0250f3728dcd4f350b571306278c7fbecc95c6a98d7a16faee8598801d101bf0ce90471c113e12223604e4cd0d324d796ea5c52a87184da4aaa490c5fe08a00dbfcff302f0c4a94ff94f98ee3b0da425b136fbee8040cbc0670a6f421504b2205cff6d4797124d33603770a2d1d9e79cfe90ff43df98cb43e0ad0858e1b39c2bd1713d721b2222f71a91e26c0c722aba90a22ed5eff33601874d7be60cc6bdf5b98e045b274496d955af3db9196011fe0bc73d7ad077a43368d92e1f20e7e23a4f60eb5cc7f42fb126b659e141ece5c2bc3c984f2777c8ccf7ac55cfe85bed19d15c0458212b30417a74bfe19949bcc3ff2bf70bd0cfb2b92df88b627c086d814ece4a72c47b041bbc0740a255d984e729cb6db1551cbefed7b31e2fd5a673401bc24e53e59433bcddb4fd669f056d437d1c3a2644c75d3fc7bfe1511c43cf9b5c6b5d454fc7f6ec3852dc4c2f38b742f94598c9267b8d52434f34d88d6639b6f8584c5c4f3cc00a01fccb31efe09134bb2ecf20ae6d35a5c09bb076ea78c1802434bb72ce7a7ee0aff4d58b4494d9273614fe054af5cbb3edcdce10c3df402209fd0f42364a2acef9ab633ce4befc6fce152443e36c92f853db5583f9a273de97685a7251b94b7c3a6476a1a063e801d34df7f43823150cd2c433803b8c104d88690a72159a2cd07cbc935f0ac6c3d3213bfe91981808c2c92240bff40221587b1cf472f85e32ce6d093117672e4fc41dfad6e79e413d3f0780478dfc766665d93e9c72f76447f6bc323fffbaa7983ecc07a6e614c0a1b180ee41dfcb5ec1fbce2ce40bae968300561a1f13fb5ecd51b9ab30f7de45ed561e78f2a20f1e1543e72f25723de87b3d39480c5590ebf7fa21f494915766726748333512ca532dd89a15fb09f62d624e95eae3720656a79eb814ac96bbb79c3909251205d427542b0d3f9b1ae39d711c1243412bd4948dbe264cfdbbfe0fc03b725582fed462b386ceac8d729be4ebb8f92c7d4f94279f8f46e2fc0a1c76712bfb9ec4eda7891b6bec250d7204dc32fa43012219740faa71987b0e391346fc6377cd1ce5de8e843deb4a0d5d600eb164c24fd6639a1665145ba3a31d531c05ac1eeeacdebfb9c7c58a3afc2b736e54ba5204d7f8d946db3ad89bcc8b0e4c00f8037cc4b977c00f94b2b60c723618f3f1c33c121b28520fe5fab7fbceea38e7a8c3432958c8a311aa8901506752e7a1bad17c577ae8591eb26c33bea778aec65167334bfd0891906646baf2725f03b83c3e1f19f47f96b7b9c459fa70687434e199d213968086d4d9d414900927138b1a2af36e3873157cce1cbcea1f0afc8e07691f71dad53f660d7cee8172167348a11b6b71a9bb281702526cf82fde7041bbe108c934c25cd237c5d9d311a6c54a24f4a659e0dcf0e299581d23bcb727274d4be19df0dcc536b097d92521565b6b40db6bc877e86de879af614eee0dcbfe4509a95366c8b0f3264467cd72ebd813ca1d9401e6c7cc52a46810babe4b7d4a0eaa5af503633bf73331a1e57200ed85a4339afbd44bd91cac01f22e63b873e36313375b72b2897912127a1b5c33ea866ae8d61ef0653e47673f15db268882e0ce3ec6e6ce7d0da6e1a9b91725e21582d6a092d83c3e841b78a0bf639fc83d3aa081835c96519e9deb6cd11b726c3cc29a12f7fb7265e30fbe3e963d5c53a048a385f0bd702b5ef51f1f59f47260c2fc9871f66848e6c2a8221134fdc8fb39bfed94a11ba4645feab0da53a572df3a5c3b95f7a7ec30a4303474c21dcf11249b6eb0682fb492592d16eb561a726547dfea86695cf53a7e55c582a11a2dd74350f2ef34e88f39e55d4321f088317f56cf5c87eeac3de4980602e69dd3bb55cd71d5f574a681bc099d6b1c939272537710956fee24aa4b33bb98e12eefec0ada917fbe5322dd085ec2d3b9a77972c0e3c7598f346ca4e9d173440ae1b36c01f212cf88520ff53cffe8c45feb7972ac33d4b0bf1579bc6f874e5c8766814c9359f17706bb6f3b8bfeb66edf4fc172ac2e55382f6da2e319e81479b476426ff403c01ecdd565edcc13e49e2428be72ddd5efbf2d7ff8346e9bcd4d5b91ae8e88607ac4b6bf5b8c1918cd0f314dad3daf77d2196c92a26b00e9b616da6c04d49a160a776dcc30d642b4c973f092e2720290af94fa5e5919f6acca66223c40163c35ff7bd48268603ff10d42337f26605f2bc2d0866eb27eee0a77a2a6178cc914e77f5c41ee1692b915b9ba9407ef6e9a12cb95495358a383e589125a4b6a96cbc414caccd59f86e9e69ae8b730471a42e44a6361ddb0232f16b6beca3087c660116d72e7d95a91c6676dcc9ee4f872f9b1c344e0b4937519ec56a07d58897749f8f2f253931e3109689d14beafa71d0fa4d38d7b45443a238a485d4ceab7358543663b590e26d40c92c342c8a97d1962cb6dba0411d2b586c30114daba6ef395cdaff3f8ea4850cfce2050f4972b43d1be8e39e759065024a5d2c78baca3f51bdb5fc956758ed617c7457c32d3b8700257dca038eae810d95b44ad82fc673b87c8e33f5540cdca11d36fb9609169729495629e956b75dab12b06160fd3e3d9949b1e73290bf15683f2d5270c9bf372949864969d508832a2de22d29fdf97651e21e2c32918e7ecc9b4036d41f2334745d4219ca717b8dc249d3a9ceac59b5008ec62760f5184461eaefe13a4c5fa721890933282796174416b7a440d74ea93e136ad026610dcce8b1ed17708cd915d17a6ba5dc9c2dbb88057749efc9dfe932c93002c9513d1a8c39a359dee829c7235173c04e0bf1c615c84a7e6d042e5fb3770064083b862e9e9547b257e75f30b3de32d0be5d08aefca1733d695e82f3d5c22028ad3f2d03fa9dabd26abbfa57286a5a33859ff90bdd170a089c1071aa5fd50862ac15e68e947ca726758b2cd72cd7d5234d54dc3256abcdf10ddbb9e96e4cd03797654fd25a22502497259d0727a2c5e9f458285ade166e5530bde1401cebd7ff5db93723684ad6471c012df728b4ddb24bf151cb7d1bb910ca05bcf291985199d929cac2cb778e8ebe8014e72264e4c1d9ff51153e07c7e228a22a821bc9f27159a4d74da6e259ea3fbf97772b672ca205c63c6937a09927f52678e56e4a6fb7aed2c61074825b6e9a0c29b48c82bd1f3ce8f8fa7937aeae2c4ae7eafbe3c24d425355b071ac61f7acf17b672434a9904f03141948a903a2fbf93ee3fc23fca361413c7cedfd28226d02b4863cc70056f55ca00b8a7ec95f16e2e47b190dedb83a5116d28b3b75598954086690a3b73a596563a79668a764453eb8adad772a98a0eeb97928f17d958ca511a7235b50e36c918e3344732c8e99a986ed16c6693050ba20c871361f01efd6cc7132790065fb271c96c971ee3ecfd9a6b7a103399db2a9d24137707bcfc2d0b07727da884fd501810d718ea5f1440410b222b33b959e25f3d99e083433e38160572c95c510490a5b188b92e8fa0931db56367b2cf7421760b0ea4c0cb196a08a572ae3a263673b4fdeb0d1a1bfd7af8cf163d065e1e3917189fb9fd06c2ce382f6abcb80f65385f8325c2014faf50d5600574bc0916a7ae170e6da5f4924bf34b097751b71a74730e0336174d456066c1bf33d12609840477a08cb4acf8dd5f66721a6f1948bb0317de2ff3107decb9066da999e0454b730c525b57fbd3d4d2ff0a976202f63770c6f7a44f334ce91015350ae5fefb42b93f219fd9e86366eb9e10c5c200583d8bb616c83415e9dfc876d86df0025923f19f53a5f66dafa9bfad72b65422edd2a02a69b296f8a3bb648053c7da85206453e899a38bd6e14e49f0132ba2f5a5435266a8cfb5c338c192e3c7eac5143cb1d838ecaf3b5b5ee5b49150c0a2251e5051542232fe7f6a0b066254f8af1901004c0b8d93419e4d5b480a0c76e0bce7031cdc23fcb5f4c361fe1c7bd518c5cb332d8b0c4377e0c3cf914b726a6bb7c97f6e2a63866ae89867aa11c79a9c5456b4a71af39f9ca96234ed0f72a3df4380d1f9668698ee713ff6f9bc6bb8fb4add652b57e34badbf13e0c95868dfc367a3afc19cd603089b425d7fcc76dedff2efa990e18bc4ddecd90d12eb72f53983765e33d968d42d755092b05d3c0ab466f1b5889733a3240c6a8e468b391251d70d2f8bd56d5c2de3f1763aa4b9ec56ce04a3ca42f96c6d0515fbee5453616588049e8ec5eac44f800166777bddf33744d1baf6a94368b5db547dc7ff134f80664c0d005c732a0cf54995c9574ac4b4aee13132bd3a0616a94b51d49a2153fa656da99755fe55f5f1c24dd14efeb20aaf3adb739637031d032ce203c0660d7d6df97b85c15ddd228af2058f55088c23f423bf0296a099dabc19fb51f0722456260450861bb281efb2042039cc69242aec7edfd25875c7fa57a7d7331e4f3f98daac72e6cd552b779dc1374ea799129fba42e5abf11b51eaf431da9f9111600e855e703f7409d198f9135b03c8e40b9cad93deda81e263e58a49c58441728a618e11734eb7183883af6ac917e113e5c65115deebc7ff305d61b27c551662f27c84b4deddc5e4095b3d10ed53151051f1a8289cbdf1ffd7942e55a5f23b72f3afa3fd9706f8d909096cdb3519157d2492f2a67a45e195b1709f651b78cf72fca4b41e6a11886f479999a37f3d82769102f46e4e9dda09339145a2006d4072a9de63b10c6dd5d4047b8ceab6bdb6c5b79f5052e5b8836c1c55b8493fc87572bfa8a6d8f7216561dc8d05e1177e56ce8265f45bcd1b5392ae4c3e4af590ab362838fa44e4bcd237504574dcc6a534516d167f424b3cc7af8165a3d718c11972b75f561c11fd187133db4c9dd4c6fb365a181951c10c4098acc38873c97d7915e53f32f7261aecc18f0ff20da53c2ad9865fd50a677be21d20bb90aebd02a47202e5c746b77abc67d6673b5257bf7f49d875ea999b44d6de771f3cb9c96873728c62e2df50d89eff1e2c67a9e539ff181a7ddc0ffcf2b7f4610251acc8cf5a72f8a275110dc82f9bf1190602706dca33023d0b33197391d77a320ef9244551725d586318a891eec713f460f20ff550897ae3fc74e237ba54b9957d3605009d72683afd2db8da0d9d37e9252632d2c2f52e0bb5084604fdeb484405ce2f34b91c8b83bfca3d03e3056a3167bc93feadb44635435ad959d8784c4352e1f8d25868e4eccc716dbd8377ceb939933a43e50f533c8c0bddd3959a8e162163ea3b2c2f7551a93920aeb65e3555bd35e4977cb0635cbfa3e7adae47ad16faa8b7aa8e7250e6ecc47bb15a108b0afcef1c24622bcefa939bb02c05e0af6f6055c8505b72b5997360b253298ec3c93113c01de8e3336a999448f0f35382ddf80c9ea4e35a1c1cd03bb7a0103ee7304ac1b4f8e63fba97ff1f09ae7162d5629fc804348472ead799a9822bc42d11e8ef4c54261a1c53fb6b4c2d74ba2ebd78717cfb24d372fd6633ce5bbfbc3a0635df18c9932b230cc547d0da9004ec2ce26c06ef95c628067cd0082a06f7cef4eed9970c2d8c7cc60ab4fb5d6ec7bb08ade6cbf5ceab4697f75db0ab58d6585b8e5732963d58c37b6904bf7d3cd57215725111fbd23120214ac83c3c810c9f3d4a9a1e43286ffb3835972bb6fb0521c107a6a67696f0449095f504ff1c75d0669052c6a45ed2c67d1c59a792ed2b9bdfa09d6fbf856772960633fff9399c0f86b02e16025b7176ac7451b3ebf384792e98e96660a9d872b4ca5aca54681d6c47f1db218a588341df779fc202f8a9726a567d0ea1a7b23af7d14bae90e86d5c2798e7e0207c6a63d99e0f698e19e8fd2f876b5505c3fb72ed4b49e323b26f4cd4b42080f513eebbeb2fb8e39c31ea34730873989c461200f99d1fd3dc40cacb6e48a523a53d0c6806ab66423da93de23e503f4e94d24423f801e788987a9ec45987ac3ca0695dd535375c28025891286e5aaf80c995ee2ea0cd81d13c282b8a29b6acd11e6aebf231135ce0673536e48dae37928439ab72b10e60b470cf8d66dcd9d3422ad47d0c95f6a25f17e49633dcb0a52a209ef2482ee2467ccbbc8a97e665b0ad7a29a811f1bd4dc76af662ecc6d824a39d58b50f3a54e29d144a1d47bf4e88a672af073596bf0681d4aae55b504307b48fa7d572d2db25c39554e83366b745e4a0e25d24f95a63731804647fec26d6b9047e6772c76c01b287c2bc98a9de0af5ad0564df6b7d21c431464888849e645b916da972da4ce24af386ddcf9811edc09eadfb16713ca16ccf95cda4fc56206e84906f1aac30b31716bf035ad564b9dfc5bbe9bfc85095554d28852149f712135d036d7282206d4819f89701a7ce41aa3dd434d198494409311f4f05431ab2124e789d15aa7a5a93d8973dbad29eed903bea29ba233c20641da427f231c0bf12c1ac4254dc1a9d4d9a2cf228653bd386f9dc0c283f04a4e91ee3a2d6c03aab50c0abf9647d0721b4718d54db43324a944812b96b6f844a9a656fd3d9c4acc8f0f21d867241ae8bce70fc98fd1f577d7bd7da2f309ed7c45f6eb889f1a68bf25f3ce1d13871eb3f31ba977f20cc7196cf4fd2e2bb055f9a779e0034ed56592601b7e91510702e3058767b95debed35917a334dab2e14ff9b0a834daf2bc2d5a27f51d3272f86d7cc7001aced755f07090af7765eb2b77e66b5bc95b36aa02878d8156c32895fcfdfbaf9c69e5409e48884d6774f32489b9bbda65f581e3601bce5c950a727f276b356821fba8c41ecb536b36b2e632fbb4e998d01d5c109a1ad1d7792672cf731cbda5f13a30f913e4e2dbda5245d21f09878222ab1bc37efa3738f652471797e333e6f53651e6623bf8ba61aa03fe190fa96d5d1290854ddc60b6ed38721e184f0fbbebcc5bf50871e5ad826ee9f5a198f071a57dfe21fb8eba2083e71c9c49d9d4e0bca26882ed3c2b2b757696c07a16b7342bd8b3b11e10d339ece82367c71a0fc255dee764a5457cd534d43090c87750ead34211d2d47fc84dc2cf7207cffc77b0e890803e1cd26bf20a0f2d22acef7646b5f9bf090c4bd6d15d6c72da14938b6a7b63818f2a173e679a5624d56588e6ab5e608e9c931cf36343f26ac06c4c6a8d18039c69c20d4ac72e4881512ea1afab9d3601b66c5c14116f401749df77a9551c70b4bd9de38b751030eb7ebace01a304df92e78397e2cacc4368f5b2bf3827a569b3ef07c5ffe1396d7e9fbdca0b841570d302c05c142bd1fc72c759fcddd767c263aa79384a7ce664c3c31942ff9645937d54ec8e7efb61410c79f7eb640ab67f9b33755e6af5e6f8d2900fe08c16d885f162daba609842e94776c0822e5035145fb0026ddb7a15082c5fdfcee19d24bb220704a5dd136aea7237e3fcdc73c00ceaeb7e13375033f63b8c28baf463d2e8e54e809ed7b24ad2728a486d4601d2c044d4188fba8cf2ca1c21b33289ec0770e0f4fce25af0f5fb72669a55c77668bc03a16b80c718c5fb8fdaa59b8adeace3a72cea905aea099c623b607435b5cc364c5ccce75d667ea04bdc4a4adc35acb18ed099ca848c0c6772a4ff596d4320a50a545b6de93efbd86df6830e06fac47ac95555deaa4d2a3672465a6cde8bdcebd9621d66d39aeceb032aae7900ef256c5fdcdc2f47db12a072270e9fe137680d3016be3ea505327c1e1bd0941425bea1bf1c5cf72648870a72d213d99ce1461c1db59a253ee8b6920560ea9b7ea5ab1670078cba2b75c54d309b41a850ae492ff3c95c2758474d5d9a54e05987febe31118637ee8ef5f1d972636cecbecf9c48ff99473fb8773c162c2a2907dbbb5cb459878ec81e23673672df4ff58741ad55832c5a47735f45ba88c7e94d9aa675b4c7412819878730bb43112669439c974c075aa62813c29efdc9bda0c73329ba1c271025920c61105872e8cde3718dd0b7a78bb51773c67af74e0a3042528ec5044258700bd49061d32c2cba0af1b7771781ea550075716741815f67ed0ebd4532ae36623f2613ad607201d6e8155f0f84432f5fc4811e98cab603c40bceb6091abdfe6b8c313f8ec85fa16be66ac97177c734d5e7e08ff3f54a970a49505d6689632bef6e92a2149a0eec28400e79de33193d2a9be1736e904951790850635492609b936f0760c6ab7293af98be574946a5a12855a01816a90f162200e80c44ede6443db33c4a3ffd72bca7a4c985317870e22a5e3d4b9e2997e08301446a934d59baacba23af44f472b42774e9aa2c23aabc96dc6b9c28996874d6e942b08fb3263a2a223a61f0637204da842fc163b69ec063c5d07390461c80d0c55c2fc453ca5ee74253ef26cc72f7d39ef2fd871aed09859c6fbea86d7cae656d549e13bed802b9b252b2eb6f0a2488d03fbc7956aa7062f770c699971a99107c9f6dba87ae334d2bf16a057035475d28660671620b82f921ba273f973d45ca75707867630da9491d0b0a9e3a1959432d4474265065ce454d4d9f285bdd12d98c258bb17a3754e028b80a4276722b45e45654f21dd6847976d9b4c9fdb589c34f83426a15922013cfac24d7e972e1b87895ffcadc766d66e4d9399af176a747c7e216fc46112b81504874fc086f3d2c56677b0e0bcd87c54e1ed20a3dd999d08bc91a6c44e84f1025406a302d724befac85b43e515606ff6e52c36b94d352b7de45ef23ddbe07c5d41db2d793634d9b860761e00459d96cb70b9981368171072e945ddf12551f45fca54ee9cb72eb6e540eb90f4e08221a51da175283498f8ed374419b905238b49e4e0d946e72ad31ee54b4c9069acea5ffc990851e40150f46f4793924e77a0cb58b4fdb6950bb37742de32c3e2401467e29513a2ea1741cd1128d41d3a815128e4ae0b30e7262668a96fe2756ee6293436690d2c9d87deca0b66aedb083388f9159751a1a72c4748c1450e8e32ef382f0433a607c1e3d69c542d771acdc744e92d5d9484f01cbdf1a7b8248f4643be7c82abce45165899d70f277b08459a7842083a8c284729ee783389319dbae76806fcb6dbe69b61809b563f60edf5dbd1f83e059ab3d42f3f74726841abe055926f483d7c6ce901ef672839f20e6bc553df0ed79c0d072bf81025ad5ffa537c6363db04a106dfa01a4b0951b296b5ceacaf1034e323e00d53d5802d326102f95f53b4257436c5a76aacaa4ef708645e282191c9ff039396e930ebea6036b3cdd4b8b70b98d2d9e51586dca8ff41b4ae214cac7bf7cad7232a28a6077cf9b37217e943b4f02f5ddc7f89106ccd834d9f9fd4604c39d9472b1dfc20735fb987bbdf8a359c1c64c6df3effb3cf3d6583f9feb0bf7dbd03972cdd4b7e076660ebaea608edc673680153d61c5963d078f7a20e706c98465b272c771ba07d922197fb85641509f6e6e9f0cdf25115e8c9fb682a397ab80214348c99bc2548f321b25b0cb47b7b0e1a75fee1f973da5a900d15df967d0bc34c97231875e09b0ed64016c5ce9d77d0cbc7915c5817987938827465a4def801c3a3bbb0bcfbe385dbaad3d9054198913e945883a9a577c5f1cdee3849247c9a6d4667b4c563340ab6bc49d1013af1224f890bec160e27977a2032a3b5045e3e1fc722ce2f8cda5adeb1208afe9af694771a59ef78afc2ea0bccab5624a431b2496720c46d801935bc70139e44d2efdc8465f95e23695617f256db8f38657e65ef3727f33d8635517e1f64393c44637e7abbcb394794878dedb3c1bafaf72bda6547232989d6857ad2e931d5145d72de05ed7e490b6fc0fbee3615542634cd0acce501b9e9a6558af001d4d44e8f15e33c8bb51392cb02d436800226e3ec61f81fa72de0c5140534951296511ee7d4332ca95e7bba0cd6c0f8fab01a0a227985b8c72df0e16b50dba872f971b10a3a7819bb2a405aa9bde16185591b44c854fcd417266bdc077495d825459b6d5e08d3183d85dc41f58371ca76c38544c81c995f02f229c0afdbbd2ecb2fff2b5b81df219d273310dff4713ccbfb40cf234b1587a680e3b46a6ad4d0dd8274054e8637c31cef05918a27e2b1b67c24777676a71456ae93f7fb982c62b9e2c2ecc54634d5e8d47dc7126ede6efaef07287e7ad403127543944df66e4d942bbd7beb4b4c100f578d26e4f03cda2ea52bf5353dc97d35acba32c5b38f684b4cb7c43f60b437475c7e9fcce7105b7894726b374bb6ae172c6b09b58a58aeb2fd85295bbcc263132f9a8c46a7d697f6d57e5a18c16bbde58cdd1ce4dda021eb17447c9ffae857d40d87f347468e1dfacc2799b3a69c2a01329b423b9b8ee8c2a079abda0d6f0bcbe69a44a03195fb1503a73d210a9f8076968484eaf87fba403a956609ec3a86c3f7b63df238e2396586f10f260fca9ba5a734272cd5444bdbaa55c88858c0e473062976ffaae23ebc14d29729332538172e94629f9a6879c117ab33c04e819a4395ec70c76602bd6bc36c9f9e1e3c80e72b9aebf9732fc3bcd025d596006796b712077785e7d0e87b737f0a3e5c4380e3aeb67e664eeced5b3039f631b8099323539f5c9c864a2b4f8102c2bd38ef9d37216d1662d043f59f025d9379d6c420f2794579fcab003abf83a216aede37ed472de917483d7dcb1fd67184c602aec2822d727ecdbe996dbfff674ab0ace391b17be6fd182799c86f1812fcf591c703fce0360a5eb4d7582d1322c38b222fca572927f6b5cdc86169642fc73a0273f2a52d0abc507db75507fda4c78757899d615dc73de4ad111e9cddf77ae7dcb4af6d4c27bf87b8461fc8a485417bdc86dbe721718541bcac6a24ee2540f4fb9e82bfbc42b5e2a5c7619f4d0951c667cd13140b599487cba1465106a10c0a850e5c5ef4ff0d6b1f31847cd6b75abb3408ca772438425ab823f2619f23f1e0608fbd509afb873ae07ab34e6b4bff579f7b73418692aecd4f96daa442e9107cbf03f5655e380b3c9d58afefea984c04adf41835d3c11b4a8046a9fddd94a322577cb359601ed329fee2f8a7b43ca8fce524ffc4230af1c1fe54d55bba943ca4f5e2d7bb75e46f64b470a12c3a60b2c5e6e2b3a24d2c46f05e1614793a08ce4d055483c1e2178b1b4ad1a3b49c8e7c141a2212c72e8236562bfc53e8bb0d945ed505d9d40d3b902a53cf17b3e0687a647b015c0723c66b20c32726f371b891684cb9b0a9576151a5f5b91b48b3bf6ac288ccfe372e978c5b33c55e2ce582eeb6c566a5b06cc57cb0a8e3bf8b19e3194366c18ab72c527533f76375f2c6f29fad5187b1be3be926a299cb64e71c9bba094b1aafd27dcb34d4036bc2b0439a76fcfa3962b57d92c43f422394ecb841ccd8ab21e73149c564c4d93453ba75b6f43fb5d3cdac73ea511725336472eac3f28dd7836807242592388887eac273321a8f3ff244674b99dfe294e9bace67422fb46d7a1ba7231df200f9c30be66de9ace4cf62154b228e8f23d3f86331905cd7136b54fc772a08d1a581989b702bef9facd5f013ba77d2fe9d59302f633d497862d1adfb949c0957fd48c8e7e02beacac8b7a060b47689568c5c6d916c0dcdb8daa5ff8d41114831072077d2e5062262f96c82220578ec0821278e00046447a38fc92a0fa7280d9ec7f7df7c1a4662147c8e31b9d2c8ea5605ae84a7396438c030aec790f727cd66d246a1192b34134c891c9fbccf43fa7a3eb76c2a947e73ef878bbe0ed3e29ea7bb6b1081351f40c31c9c3c45fe6ea9c9f8e962d3226a411369650953a7296d81988f4e0eb1eab0287ddb614caf623a74c917d7560900935ed403762051975d503b24a0c89584a456d9fc3f90fecff8c2b993ff56d53f2e124346f44ac44978b8ae94aa42a7acb9bf0a3ce9e39207accea19bab902ed9ab4c6d3aab6c0728db3b105019239ad5395e325f3c77367c45b3703c888c4d2d9652db9c431ba7299a810a8977499001fe3cf37e602ed938eb5042c8fd37df12da1182ed1ea012e9c0864a4f6c1a0d512e2ce3947fba644020968d8483bdb5d828a58aa69b5da10e85af4049b4424a769c7006e13067a4ed492f625eaaabae8c834b7e8baf1fd3bdb8e8c2be5a71ef36e9bd5c3ecc46eb31ca4179201ebe4af8c33b299831d235da81b0cbaaad0dac73500eb8b4b0c4ac84b90bc5caddfd72810ae6692ca87b072ce9db328ffbdf074d4cba6b8537d3556a12d5344dafaad03b44254751adc1610de71f5f358f4f37040bfc6400fccad4da96665427fefd41c36addd1acf0626342910d851ef2bba8b2819b0025e868034201660448ddae3e5c6e1ad4b75cdda421202ba913d69060ce34c575ec6ebb41d03df08a5cbc0c88034b6a3fe74b8407295f34efd50f9c289ed936ed202c0726f0ecb157f4a1002e0054b671e14259924ea076f2652f6f75d049cc5084fd4e94162e3b91c5db200f98ffe691aa096440acc819b03fbfc57000c93767af64b824a6a959691fbc8804188126afd7af7a90484332944e1e3764775acb9207139ab7180bd6764226fc962d5eaf16aa3ae463072a817df5dbd9369a69765507d79996afdac87c74cf0e12ba73c34bfd88f440a3510f6fecc4f9e1bbd28d14591ea07f83447fb31417a8c6c585a339e3ab423553acd4cf18819ea18f8e894ce319902285023c7367acf23e2d0e26f0569df0d7248eac4d7800d9695091f6364797f6c3c0d287889a75f62a530a60f8d8de8c172880a329aebdafbc46aa82589a85bf0a82434e9b51420466d05662f2ad45e4f7264076382222d67c560e93f86f0bcdb1358531149eeaf4d291ee286df74e991421de5da730396e5e604f4202312720b080acd901fbdef8cd463d3706159e1fb7294b36c7d19375848a2776876bdb21d433bd234d019a9bdd978691541b89bb80edd89ed2f30856921f1807fc8b0a3c06ebfe1871f8c958d9e626b3b797d3d8a7279ea9d19a96b690c3af531eb5dd6538116c8d11d96bdd6edff1538a8fdaeb46cdcc1bb3c9fa8bd0498d74cf418d1b50860359619f310f38baac5ff0ebde6b1727d53e221ad813cbe7db5b64677576fdb74d878b6a34eaa6577c1ea86f679ad727c2efd3bd25e780d45f7aa3c447b49f8b65e77a5174e788c3642390b2e25dd7284039c7feccb12197f7abbaf1a9bd533385bf7b537dab1c7bda6df89350299726abe3aacad8cbbb7c149afc7a767032c06c5284d25a0b04fc89e26002c01eb7242ccefab2a8fd7368cf7e138834819d500a3e829a715175d1bf047b8505ad114ba428bf4ebac01fb00f0134a0fe9b1e7289e752ccaf17d3d32beca715ed8a172d2233bc4aa6a470e900b703c31725fbbaa129b7a77748cb5f78f78ff9a88bd72160f353831073969a7b641c2d657aa31be159faf01013f26d72c2edace3f1965fed315e3e7c7cafb0b8e793f488256d799325744e508a5d80a0201fd606be91b1a15824e51e846791c93a98682e745aabdfda70fffb054ebcd573e64e0c51e721678e69936e991c1bc71bdf75196e1810870eec179050a30cbcc0dc35490757230f6f9eb3b0debccc27e117c070c4fb01a7096baeb3a56d6f4140d97a72f2b2d624fdef92c81a063ca9480cb7a1ceaa7eaf8a57507f53b25ce85167213f87f1abb4a671f5d68acbc99df9b750b4c0a5025a8059c2617b62a5deface7d7a6a87214b150b9e48cbea231bd9c800fb96f3bc6036b033883eb9e41c00775bc1a597215db895bd5101238e866f2363d61a0e2f799c65fb3c889acce1959121453e668e93cbac71829244add1f46d3ee3f39549ded62bad7a10789bf073645d510887290b83790e6bc46f5832dc49de90ab1f19d1bb13fed8d582e5bfb51430197de72ed7133b7a5adeb561cf4b9a27bf028635d7569ba5266628f9bfcb7b253eb7572734b17d0d4cbc63e42c68853cfd8d25b0669615802f2d92f8c35a93eb2ff967267ae65f2be58be929de8dcbf3ae76390768fa59cc2a5884db01a58e435ee9c72e1933a3b805052fcb27ccc1d0d3e788a504979759472fbcda554eb91455e473f00f95265c4908555a8e892af0f31ce2a90e61cc96b6741d936deb569ff98b0594729a3a2b665931a39ace2a0dac24bfeca60e1ced52e12d0473927faa2d1021fd180c86908c0c5d28e9d8a8ed4e12341c61dfbe525ea623920d88d4d80b1ea728c540b86f744931d92a8558215d372496e0846cec06c410e86bdebcb9881d02acc24803272fd3bde274704fbbef95d9121a7f332aedd20d95a17b65ea1e22572c2db8c347b7b41757feed0d6612c89f8849c334d95a96d2f3cccf1c1ccf85a2ce21735e234b0d7d0c5d73a68619389398de5b68aec85e25c84c5943c719e0772087dfe8f9578abd49caac46c3f064635e639828f6584daef97fe422932226572bab44920f1775581f3a4fb78aa362918f256eca6a58ca5b06ef21c0299c9f258d3482a460d18177e1528165d7c577e90789b5a07af4eadcdf776ea34e87cf90820d217b16aec87c89c24988d413553350175808f8096be1d519a3b8d289084728ab7bdd063fc7a3485b51436e871fe07a5bd6cbf7aa39d19f3ae15a63a2edf72489b6377d0c7d0c2aca3a729d8a1c0f0575be285799fa97de0c4858ca7d835729192ca6a97426764b45858975bf484fc3cf7db7218bee001cba6d4fddca2f95b692f95f2a64d5fe79e802b9a98b19a9cee6da80287c61f6f4a1754f408bc691ac084931c4cac1b37a5fbfacf65281869759535bc138e678ad35c6b649a2613335fd6bce2ac8074043024599bdc438d6f12ff7c5a29f0c5c66df419edd480b81dc59d858a8ee0f57ce617bcce0da81d814f11f0cc05e98c0f599a5617ca59c572b4b84681575383f19a24c9aad05180f0a5da8a82d9d95f861d30ce9a4d7d8a71613f75706c3a9685e291a09b5ccd441fab2d666d9d8b4c4da0febd13b7be5b722d6cefad9779fb1e9acbbc4a347b3c702e08f6f55447fc24af8da49f5fcbe472f71361723f03005a9a21b4df8c2b939dcf05a50015bd7a3f10ce482ac3b32472b970abdc41300c71b040b79ee3a30b8ca75193687a76cdfb4fc49218ca72fd724dee15aa9a24bc78ad7a971933ce87f3735051bd10330452db784f83ff70bf103a0bd6e63659d210c370955a54c4acd3017fc98b0d3ae8c56b30267198f6797263ea6624cfa015c4f9d28e5032746d9383360cc509381ddcda8b462671d369480e529b8ef4f6e94cfe1a0486d4ae3a88712e9385d7e858089635137309fb7b726e51f180ab098c7c2bb2f676af6c2cbf401760d452f8fec0e30d890c7ced3206d70ffce8a05600a1f50fda35ad3400f8154e4eedbaa3c08bcdedc240d2c676720400cdfded54a85c0aac8fc0861183209084f733bafb5c5de75b6d002d79a572c3cabe5a88785bb44f94daaa07457b14c44c18e34132df572a898c0682a17372dc2be664bfdb0f19a090a91114abd9b895ff1d36e7b70a1717b20a09cdf582728362ddcafd703f6653b57755ad5b6985dd5639eb46c947c9151d5e97aab1cf720af2fc14d9d764adeae58f5c08065f21dd4cd4e6e49d3831426a938fa2231f4d00b57655a5669d0897cec95df0e8aa6ab65bfc78e7f49157b342bc2a4ba78f72f1c4f13945cbcce962989d0f1b3d0f2e1b4f4cc6e071975814f4b5a988d7077223a96da8a2bc20b6073750f6429711c50f59b4af36ed600f2cc9103c16d78909fed95234ca8d188a1ba4a702338b2a52e4548ad5645afa290a604528d10be872e551677a0b72c21372fc99330e310f4090dc7e092e707856db44730733257272913dfeffb698e154b32ba88fb94b5e0edfc5efa3511778aa3cb59a469a6c7c727c6d303d73c6a6d0dc91b0a29639da07ab6a29e10d4bf9ecf32f7644e6fde37230304ab2a229c5234d6392b9a4db2aae34dfbdbed5c9b89aac4a5df57805487255c8b30bb1fbee7dc0ab459b2608be48d832b4323d17fb0f4eddeac8acabbc3024fd6731b8ffe2619f258012ae73fa6b202def3546207bcbbe7a6c43589366570ea1b87860de604555d13a6ac9c4e34b82970060573930c6896403668aad01721fdd0b98e3fbdfe9cec3a2bdb0c3dc4ae525952b67349570fe7898558d11ed72c1441e85d594c5527883d675028222c3cd6c51b5426365e4b80a684fddd0e8721be41b5a0dad80063ad6f34c4d3416ffb0cc13b8bd045e99f5777258a5078132bdd62180b70b8d3c640756e923d838a741e0df9affc85b984ab88e39be0edf2f53b0da1e632a2fdb880d8d347b9da4c336d225acf973e1fab57df8da8beafc72129add80a7205985f120c1c4f1ef4a8cb4d9f95aa7ec666fabd91462a790262be3663e422731347eb58c2f29f5dad3c21e0b9e2d3a12d93cb2a50d19f2755b01e3d818f3473dcd38f404d70b875343e382fe1208619ee2c767ab97c34c94cb72b2f390afb9a98d85ca9d30d05b006e9bc90dc434e40ca5f855814e5899b50820f78b16ada83b6a8f1f80058b6d5e37ddd3a4bfe99e3786fc2742c2474273542534e0fc54e0bb63ac09a0396455fdb5e526922cf4163514d3a178eebee1734972921f092b592357021c88442107fa19d5cc15b61d473f29c3832a49d52bebfa7245353a5f58d77ba18b77724f02f076e5ccd3cc8a9adfdb0b20df44ba8165aa725c6707d4821838ef50849625be414b0b115ddea76b0fb2f640e055faad57064ee32727acaefe3986dae01a3fd5c16f0a3082542722a77e734f7e039bc48670729711d248a587a508cc6565b1707c97eb3b8ecebcc3cf3500a3f22be74603c87242a8e68ad5e6cb31af9029e61f6580ec83ec426521cec57b6f6d324155a8be15f5109ed64c6e0f45ba065370a0d11687e261d044ae14a5e8f74ebdc7be879d72478bad8bde488da57583a84440d08378f29b0b596729c4435ef2eafd47dfe347ba22d5e04d8c8a31aed7883076e168ccc28d0636a8ffecf9c40885a72037927246491f086b138ccb04f01c7095d4f49f61a3eb9d391c5faa304392c5b6401372bfa8a24fc6a089a8baf908951ab9c365e3caad80f5a5be0cbdb884f14d6877722b611b87389334af8a1476f2cab7b25e9ca2242bb113d77d82bcd604201c472452f9148663ffb34a8ead13cda98ea821557686185450dcb796987f6110cdb872faa6172ab401c51e3ff5bb46581534966d43e07733f47cc945f0ac86c536c062fb7bca7f867739e21cedb8f5a2e708143c4eb8ed8a2e04196e1b8feb4506975eb8205ef635e8faafbd5cef830bfff80ca43cc846730d35e35ad2a914e572e172c739e181ab9c6abec51c033f7bdbb7cc7cc0009c3539fe544260eed992190372c772ec3dec01ee71844407502e80fc93759d6d97f53ecd12108819886e60a972267edaa1309d1d38b38910f15b1c5e3875b80ee322d79c5fa44459012f9181722c4bff07da53f9f77e50154e64ac1d199eff8db4d8d0f950e043c65fcc7b15728fe8ad6d20a0dabd3798edce1a066081133cfed57837866dc3916c3c2856a7721e45c275522202d446f29b45f7423aee214c14f60f0c8bfede0bf24551a58372e639401c6df4679d21fca52eef24e0ddf380642f1cc3656f110e787a26ed5636a4e0fa52597315621a3c2539d37b2b68b9c146e5295c60da03d7a0b1f243726ad26730a058f87c2e9b93d1b3728cd2117ed8f5cac3fcfd31dea3f8463efdf7729244b691c7cc8d1e93497a5c07f90bdb36e997c16cb083517ad10ef272caa91157114583d30558bfbf9fd5f2c5b5bc033a0fd6ff752c822cbf929d1e5b9bf3662980da2a5c4b80f2dbb999514d03e63c992538c42da631c26c966e98f7372a727b1fe7104e5956bd653b6a4152895c5b46aef8faf7406ceddeceea786806ce05530fbfcb0f18f2e98897fd6200e819f865e910c11f7f6bf936b96b0d7f171972fe23d4951df0d1968940e988ef4c51d8608ff59c07362ac1d82e586dbae8817272901a5acb906a827ea5f205078c754b5c9c6b0c5d93fb8fa7e01f69d3fcf9627dd3e2e445db32ef5bb5dbd607821b2f866e53b8c119cb5097387729267f2422f2bf8c592291c7e87135d9e41c25a0c0196d517e4f171b25bbc6ba26f89328724abc2e7a9c091170b1f0ab9a305f1c2c856bfed7ef1dc684f57de4ac4f434472bdd745525bdebb0f7fbecbfcaa7083e28615a36a3f31148ccd1cda31665cd4728bf537638772fd8f6e8edf2fdc20c6c3c02caf166c0e62fa561b45067376924671cba255642cc06131d4030955361b89ebddcbb1d4250b5a5c51a72ccd1393723d4ec32b881441bff3fd975eb52e61e77d7ce841c0049ef703c9dcc2a827d972532ba66d64919779613e9879c8275cb6fbef29f1b90e59fc2785bccf87ebb8725fbae3af4f3b60dc232b122eb22f7fc1e2d841a4e988f947117ff1f766617d7232de233b76478070e344bf008f46a3c733c54c3b12f06130d184ba894e97f26deab123d42bbb6430fe0a115010d6a94fbe99d95db2263fc9f42f22b5236446729fc77f02d91e0850251d59fc204852efd264ca0e0dbcf0abb6922ca1b82bc27244915aeb3dd5eba656dcf54682d7ec2eac4d122ce32bb2630145e59a1457f35877fc9b2374419152f70d559a5f919f8ba58f8e459e3814eedd90028e615f682a059266cb90f49473b1957403d5c4b65663021412ea46e1d1ada060bbfd09bf724b2350e53cf2dd12bca43adb3e79868178d05721d2725bbc8e05339c31380372840ac8f1cd9d4446d8416d59e0ffcd98bee88cc79097294b48772b4b6aea236b38b6abba99837847a9bc9db5e4ef439c8a0a1c6267f3929379d7b71d939dca729a5e54233721c6c9a7057e00f391a3e0e84626e5079872f3571b8789e34af1722944260b6cde5447115bcf24ff60a7677303048326bd4ca93a0d78198eeb6172266fafc29ef7f462ff7d53a24faa11a231d723d8f67ba988b1d75953b958787270255a2b3cb50a6174df2e7f81480f37daed01d9f91852bcede8a4019b9c2872d086915221fc7b9e3a591b0291d876163a9160305faad828c236cfd90e17f36211c43368884207f97fe33cbbfea2f7578c87589951e7bb9cb316721ba7531653d54b3b8d5ebc95a5e70f41a1129d1084002f385cc24e5cb8bcbea13b46b8e1325ca722b12796d5ad86a3a438415a2964c239f43484829773c1962123fb725772517ddaec206967acd2c2548110c59ddebdbc220ab26e3f4d6f420bea037de1266af1da4b52da0e0f8857f239221f35e341a9bcb141e7c537501e3c693a110e1041d287ad2fd22fe5c71e8b033122f10890b8bb4c7b3345bb915e51ffb6f2e8560ab0b1ef0a552158feb3937049ae6cad4486d2d2ca2f1d010ab2f89cee28b50f45e438553f3fc3b097700dc749781a70212dfef686e489c7fefb8414db32c772d273940b64aea827cce32603af30e581c4513d05ae38443bcd289cd954234072be02f1184dd16b871f031053123ebd9465aed2a15a6e0c03986d12ee573008017921512b023c7f0fc266bf643970893c39e411a50ebf063c955c69386f728c72306e3027707246ef6cfbe283f7861786f58a9a494aaefca6a04d1a0f9f19c0727b718a92a73e8314575d760ad2e0891e98216725d341bccfe2330e7a0252b100d77d8c4f6755391ae5fdffc6ee47757271df036d9eb73b57dbf410103c820772991c4d43c94107c06973e32060dbe90699c66aced1df7e933a75691faab696723814eafce4796d5996816b427eff779afa686db04bc3146b11beb2306c48fe0cc29439f8cc8204fc193542501ffcd4d01036bf4e1c54c9cf45143dbf4b5d53725d8af727bd52663ac21c16a3cacf0afcc7d10671b6c8c0f15c0c2537d714017253f497e42ee3eb599dc663617c7f9b76e8a98ea9570299cb435f415023571a727ecfad5337949f4e411c988e337320e49491bd74500a42cc8ee219599624cb35fc0d6278dc51a789c073a3ffb1f6ecdaebca82af486ff792ea07a7ff50acd472c0b94f0c726e5832042baa2c7a0ec707ebc8d4fb7f1f0bdcfd0d88cb4ac21559e340231639f72a20b3e8159ad06f2b10352484053b5e5d3ad321393c9392fa7259751eb8078ab0849b61270cb5ecdd561d0db386d1362981516cab8305ff582ee39a6d22dbe5c0fae0c44bf3f2048307c17bd149fceef340b377e7be4d88c30afd23d1d95f5474c9f1afbeff1d0ac68b596a95cc545e895b28610f63cb461b72bc387cb0e592125c856bf525b49b367fa8c0f9ab150eda2963b9cdd4cb32be72b906f9b609ba3e07625df72a06d02e36805f7059cc1679c1789545f893da06728af3115f4a2ab6a9381440ed395b0ad7a04f874a8413020f03acf4bb98476c7207f5d267ccbfd35b0961d655ec64ddb4f7c31d7a18ba8ffa4b11b8c329148d3a019735492b98b94eab926492c05018cc67e8996e538b2cf6f82dd7ad30fc974da3566465c9c1ba7316aad69f74b0aea56e605ea2fa3a1678e2e59ba997fc5d07c3e115a1765d800cf1a953f088d6db301c78ead71434ea3b7dea4a4746bbc07206a3065aca5f3d1fadeddd1e7e1c77b88cb0124fafbd32f25562b2fa95a495518589ddd4e044e79cc8d8d4ac7f40f30e465b2545634a1db60d79a1b2f47ba3722cf1c04dcd28ad570d71e01b5780059841d76bbf687e5515794c4d52f3ee2219e3978c98e1103f15ce36c46e4a63ffab9aaf408ef00ffd69932bdb5283ec9303cb810d275eeb8ac4da46e9920ba198460676bb4de2a3aa997d4d6de3854b89728bd65eae717689fcff07d4555bb02025c5613d93203427ef6531004a2b723d1c83ee1eb72524a190068a621dc5d34b3ba86c5a6d1bfa8aabec76a2257db4f73b0eb6e71191bd227141fd61f0f55abe2a77e200efc576aa86cab4944560dbf072944253b5210df46256227191e6a151550731dc946d967bd41458748caaaed272f7aa9e6854ebe598b829ae3ec4197f01d606a3ba4ad7bacc4d876082feddaf50a336833f864ee20a35dd5172d842d9f830cf57db92806e8b16ca4b57a755000b01225146d4c73f6e8edea86888cde7802868931efb3899a75fb74d3a3b8b7672b6da864bfa9806dd2521309d39cb485861743fc1bfb28f8b7c77e588c88f4b5c59c03fea5d6b4d52e93b59ecc586a032c374500f821115bd279f5a17b152f603099674462191d8838d2a9749ea26be5efdae8fe8e2531880045ea1ca4d193d725942d0574dbae61010928b3d4c46529a193026ee7ab92cf566186acd1f42af722e7b049713c6572f87a0c6fae6247485a1d168e0ad6f2e264ee188e87086f02efa881d71b159d7f17750e9d2196d11229779ec6e63a61c4d94283c104e6a905e91fef0cd5ba64d76a993461488bb6132c9d3c0dfd8ae3b5573703290b782e915ca2381ffed25adb755a2deea4df095865b1c34699201972ac5266c3c384d5a72cfb0fb4271a45e01d10dcf77e2e015aeec50849f7fecf3af9dc57d7fc7df302f4955b8c230a9a98c1b8821efebe8f7c2f252e52889996f788d00bfe4ddb1b931af25ae0ba65654dd33e326542cac9b4613511bb6002fc471dd57085f678e47342a16d7d650eb260c673a41e54291ef0b6ae24340a6897c7d70f9efae705f6a72a0c5c62af5bb312a988d5509a64bdd4ddc943f825247a812601ddf2cc337db72e6f5579d52114dad473da364a2d1854f144f4fea8e45c738bf0e901ece11f07294999b2098461320d43a455f98f7fdb50a877dfeb376535ee3855cd248bbcd714a0e30c13c40c9d1a9323db6dc307162eabaf9967754b280a31e33c95de6037280ac620f731022e0d9b7b3af4dc8b7d674fdb7eeeb7a3a36d0ce9fbf5a9a426ddd614d3f6bee1cd4518672cd7c01f708da75fdf56d54f1a6709c5298f128a272ae190e0b0644e0410654d49e1b4fbe6c2460c12b5a1ef9cec730211871a4d5720cb8e9c72b91096cee9685bcd0c34b4c9e2695dcddc925e087cd446371aec056fca963ef52a460476c422f648a19eb9765391b8946ee9c347486745d8c07a77209433ca42605e396598e3c7f5b173a0852f26b3bebde16e82449934738a2c772f003318177fe822d1eb022be178a0ea70dc336151c1b0885bb9f2a29009fe0728d167d752dd56892408ce7e2e9ed8df2b7d8e70fde403b375d0d84cfdbf4d33965d479be0b0f9149f8ddddbd6678c7b0068d02ce073461e9a599906bf07cff2842f0d9d291b748a47fb383c531759e65f923d3d5b1303f264b45ad619c13677287781a45bda7342cc48136bcf3665d8cbd818050d5e42a1c210c2ae900dd95725daaa0b2388efceda53a97dd29cc22b603419b6a0d1179e4d61e97bb9a16ea72edea88b0a59e2f598b28369270d04918d90b3aafb8115a535b3028996aed5f374a80eee63726eefbd970c1bf08e73246ca059e02a8850efedc4764d131fd3872e1416b5450ed0f2461ae5c4fef66e1fbc069c5567f52c7e567defa403e3e0b722b33d4cb1e59850ac95e30e54bb5614372601464abc9a6aede0136cd85b75272c1717ecaea520715f0b5a27511e66e24bb47ab5c1c0a0df3002c278685c80b48e59f94d30f508ed3edbef11820ba253e03db27bfecc5e8e26d1a2d7d21c7737284926d97be1d70b6ba98d809ae1dea0164d55d03be87f28b355027845a6010723bd1d55ce9f448acad9a11b169074ed8914daffad679492216c2d258691781724d421bac9d270ca9b1f6bbcc0904f2e21f9dd1ee95ad94dfbab2b4e63e53ba30ef8d512980b64e5eb645d147b558a86f05bd36dbaaf66533960b683bd9b823622f3a65ac6d6b7d389b78e81a2db26577320f37e759b5d3e464719a0f390813180c86ceef8310df69f0ecd86e61c2deda83b00643bf8805218701c559ff59b8715dd9351d000f352b393fe43b5789a45bb06c1cf6dfe4b3b722f29bddc2ca926b03780737b30cea026b80288d63ac4290794083bc2adc85562ed57dfbe6a08b7257fc7aa7018525c71e06e895e653f7182abe8ccd9868330f43362939d02ef3241768cbb193f59be2bd55deb2f76a4bd7f9338f4d26bfe0c87cef4c6e02113363cc4c7d44aec9f9a4ad0f748db86a93fc043e9ea87e42f3bdaaae12066d8aab721f973cf7c831bcd42023a56ed8abca2dceccfefeb502fb049fbe15c816fe5c726169cf70c80f46776d86600e4aaf1eb48d82757885d20ffd6fdd46808f76de4f985382adeded768f4bdd07304d3461bb9ff9d9b42cbca0cdca6dace4ac475c0379470a9ce59b9020f1103989ca34259bf72dc648eddf01e22cfcc000b1d5a6228cba51519edc2b1d7e05059a9787119eaf40c97d74ab7d60fa63d75b9f4c8d0ba6fb8152c80b698382a29007cf1c0e75efb70b4040879a920b3f1284cd9c392f9932b68bb9e3f2a71625d03943fdc8c278699ec2c4bac03fd2dddbbb8aa61b725958d9f57fa64270197c5653f47428fd52656323566756e172960f7b2acda87240731df471fa15b83b894f8b88ab8dbfc0d09f4b05c6e5e377f65ba4903bc072843375f93c35ec98a8c7c8a901e62e9bb08a237428070919d0899cbba5cf455c4ff3a39fe8d48bb64221f8107a42e4250c650e3aa7f76d0a706d406a9de415727faf05539d7f7ba860e0b929b752973c29053888193fbd829bf165c753435c7246ae8585b6da6c4334f38608d41ca8654afece11caf9dd063fc7319ea5d47c7215d1e4db49d7bfdd93725ddd089c97aab4f690dda4fe666fde8bed370056c57285917af79caa998021f93fb4fc385983177fb13292b97a263eb108b9d0493a25271e5183a81ae25297a267cd426928754a2f69d2da8a36bef842773b978b99260f4b8d8018484e95b63825799e416ae87217e08fdf296aff96ba0de9eccb6f72e4abccd093595694f7000e2b517b157f3a0d4d98cfa84166957cde309ebaf87266afac050ed490d141379a1c2c0bec61451b799ecf875d749d0fa5f5ba178872a179ff7763156af531053795702ac2d4b01ef5ae7990ce157d132a78e377e9187059d5b0d58d3789aa1067bcf74743075c1b47bc47b981f5d8c58047c984b90b32c7ac25ee445fb6cbdc8830178e962d12d3524d398ef4780a9f759440635b57e6e95c663f9585ed1ae37998ea0ec0fc4a1708641dce7098dc7a1d42196ac7727d02d86b3f8127349d3fc470d782bffb62d1f0e426b11d810855af1479a1e104dde3bcc38c10ca9377f44543e8df2caff0c5980083a83a9499d5ef6c89fd350715397b157bfc36b83e01455794e3401a7a895cfecf3512d77d3f8e5178c1d8723112d5bc0f516d371db647db82e2c0d25f661fe21ca17eb442cc65719fe1bb1aaa008ac8f61777ebb1f8a441a6b217bc0bbce419fb9f4de46e74b9e10d3bd50ed35bde3f610b8a708963ca9241b702f265006a77a04120d14f2d68d76f4fe0720d5676d6dad39d8336c450e04c1ee8717b7f3907c0bb58d4a6f84bd79597a9722fcd3c17f6132b4d96dee424e1daa230ece74bae466970b055d96df49b775272b2c2bb9f36c44849554f18922d7e32387dc29e929a1ab7b04b8aa658551c7272832ed1465faa974fa47fee464a6439c1c3896f63e98ffa89fd031848365481721b2c546c5e0906f24101f639c649a88de40dbd0da3a3e3a65e49bce281b05153961aff413cbfd28fce9ca410f1439e5d6ad141038f6d4c15c9a9a4baaa8e0972502d83dd921b3a6d3b84979e3a6aa8fd205887c7570d18ee6802eb452709f41ce798a71265eba5817f983ca0b4556d1445ed5ca5ba472296ef14cb58fe9d0722fbe67519f61edf190350abf184a15cf11f1561e8689d503f1c5f9e3f0bc10972ecdaaf2e9057b2f0f8b6e61d5aa40095d8fc0cb60ef13ca3aaeef844f228d54ab143046ad59f6a66fa6a5fa57509a4a05e7b4928d84507ae6ecc27d6fb6ebd4632d35ff5a7ef43d53ad7096da8dc1da96bdd94e056577d131a825055abf64e724041ebbc34a84e8345580f70057d17747c0ebf4205f76367a3263de2de604c61a659c72662211cffc5a0bfc693f5322466f3dfaadf2f09650b1a77705e083a72fde415c3689b3ec82afa1d757222e8627a077d070b9b3db8647759bbb2918b160c9e058bb57863bb6debb1ca260dcc22bf822b7dd708aa13fa70635501f7750c0fc2cf618b4fe7afe64ede551c7dc0d74b9c1a34b0e5a06bec4935b9a15b25723d5f7b681337cc15873724540d52244f41dcad676592493cf292647455466a5de1d90f40afd2a583dd841f039552d1c65f7473f04f3e59491b25342808911872f9fc0aad626c53569c4efc93e88a0ca4eda9ce4887e9334ebd65e24317cfa77225fc0e7038bc06d3bbfb1f4cb670c3de7d57c62578bdd8e56efce88ae3b90872b0c02ce4a0914e3f9386d86874fa9f0ba101bcb925605acb1c22011d6025ac72885da4d31712530433cd6f88c69b5284f4d6f59c936a8cbfeb55a5d2fd73b817af76b22bc50eba6f05e4dc8469f24ae780300716a963bffcc16b44ec001d447202166c3cac24095af91ab0caebde97cabe103cf206d14ecdc2104a519dfeb22181330539cf17301f54ffeb7a420e6affbef817fa017d20cb0cf35bf90faf694a547131d6f9e644c275bf0abc3574a32845558abb3c89ea45fdded08ab23b76725ba0d36eb5b8ae2a3ab0cc0a07ac4c2ccd74779798b19061fa51180ef44ef472492a6791cb7620e80ade4b6d10503f87ba2642b0ce5bd453a45b586d9506c3727529fe514028b30ab2e5e17e2d4aec0e33d8009c74995fff8baf540138881f72d37fbcf5611fc0389fce11e1bcd3f1885ff5280a11508e4fa47a993d3706067264ca3482b02c8692cf98acc8821051677a668818d5be7a2888dd7196630a095d30de324390e554a1db5141235e55bbfb5751fddf70a8fae23d758117f71a35728774cd26093927199dcc9ae2e5ca12dca96d81764ad3f3cc7493239ed927ae72f515a3fc0938cc3c2682133e58aae3ab38f0bdb50f9eb2d7605d304776f53e72c5f3ad63c27d38acc03c452141acc363c17cfe7290da9fc3baba62b2cf301d6dcfc4626014ae8f5e30694f604412faeba685f19a44b7db4c036c3c6c0540be7200a02ce0d34154fb1a5ae890b2bc2d5b6cddbacfa47a4898c35bb1920bc57b72eee32c48e68673fa54d93c5d22bb85a1a4e957601b8ecdd35b0427d2311706039d910344561b615406e7c790d4f50e37d95c0e15fce5e484861114fa88abc62e446cfb6d682a6ba236e30972f3aa8c76d39da31ed6a24a60d3244e3d3476224580c9fa86f7a9adc2f237785ffe656a74a791b45c486d833695d68eb45dd80a7254b22996aee8bc1d6cde15142d925b3ca1a36d8f48034505f8ea88c38963eb72debeae0f7644044484b7187e38dc0366d15d1badfcaa75febe6603620db6487261375de9000951632fe62e52fee48215f960128db6b7fcaa6c06e4b080d2ec72d1eb4e69d012f0feb858dc72a9ca0c208973c655c63c7cce9f97012c4a0c0a7205367779e959305a653262d5d375a7b13226f0b22df8da5cc00795a40a01cf72f7d1632be1a5ee101b7e7ed7abd22655c8d00b49457c6e18d30f4425efa7e9725a6bf4becf0e4fb4580fa7f33bb63d7513ba7ce013c6f8773459e164b98d0463ce18c168e1381d8a75ddf4b78d6cf334c620b61be353dcd23343a03cf50750720ba77c380ec4c9d1e99f80642c244f75bb28e9f12e0b154aca0c8041198d873b6b759cd3f0b00d14de5633def16da25d09eb25bd1ab79f8ada2b9be4f3e0fb72a1b7c23b78000f3301d91b5def969e849963bf9888c56a50f5f4df62bc73cc723e6254c90302d17f4e8bf8afde70698ea75449bb6ee6e3488982d219d6974a666ce77dafcb7a1ae0a50bba46e09de37c9f00bce24835e92a026a9a46cdee2c724eba973c407ae9b4b9aaa0c9ecb7d9fe694b1399d48e397781dc8b06d6b78172522f3d00e4a3a33be11c6746de23c7cf7e5c8bcf4381d5ac8ff2643eeca6487281d876b61c01f314c375af87b83e6db54ac6e7d7ded504af8debf62bf575f76511e13377009a6cca6a642bbda096f1ce4cda5117361426b13a77c745027a78202a77daf65cf82cbb1938b0d2abddbd9dc2db6dc133c4b9c966da1e103cb101236cb0a086ad499f0eca9a944acecd8dbb620e4cb5379bc23761c67293193e02720744cbab1bfeb91de044c82912045efe92f3858515c74d7c1df08f457e9d4c72b40969b231c62d4f1a7ba97af160e3e9cad772f9f1297ae15e2388f559cdd926fb26149a0546b3555f9e31d174184fe47e60a5d1e9adc9e81ab3910c2cd7b8727330f94ad99583d06e63f0d7e9a2cb5b9b7d1420950b78216230992e9d261472ef5c73a8c61822c87a59d78b6f1df6899fdc95933a94b5ed5fedd3a45a33e372f7eeffb10a077f24f29f16d6e2a7eafd865618e104f3fa310c980969464f8a6610c7de9f7c54da10f939fd9eebfba6b6578531b3654f86690055548beebfe7721f951cb335bf496b437ddfe3ba1fedc95dda90c9b2885b22bfaef60e08b10c72ee7e179d8bf1777637eaf0fb1bdb462919cc7221656d44c8ae696378ef15cf7237a0201b585b1943cce1ad04e4991f832fe7bc2c5ca6f0fe0ab5813ef99b7f722761f4a4979d1d778d66c1de075a3fa6a3de771b714e6f9fb8dd862e4e68d672cd8d75e7a3e419e7cd0c6b4893b939feb5d48f95f8e69eb0a5cb4b38cead5b2a59cc0bd9bbd93ef1f60bde61c3a7565d727f34c0fbcbacca72986809008b795116175cc95fe483c8b39de763a66ee517d155faad2aa6129bf9e2aa7a9456e2729936a07e52c53a7a3688aa7bad1944e41ba23da32e6d68037d75cf80a45124728cfe5e8716200cabfb3c67945b32e6ab802ea5213ef8c8d29763de59f27cde253396eb85834c0ac6d7b729f51e9fb5fa0731670f83f71d6988937fa10940f272f27ba35406d40103473977c44dcaac323af7129f3decf32c9e56a24766580c08b6de7967ebde1b2d9aec2d2f1ca27949f89d39b13dcdf0437dcd313fe7bd4663b4b88a82334ed279d7ad5ed89a2bb9354c02f3524f5f90d7cfe7aae569e1d661acdcd74fdc749831e6b089f1502465d9228b195ad02816310db4fafed4f2f3721706ce21f614379a2362027da2528f0c6274837189bcd261584d6c03fc496c6a8e0d2d2777486550496a1d1547cc7bc6001e24c346041331c899e29214f88872f3a420f40d13f21d71fa3926d19b14870524afed4381bcf67ad048e4028a4b7226d0e833ebd884d410c18a1111d72933fe33a628c1aebf3d593cbbca7108d33d2ab5d1ad718dccb92528ca240bf86b5b0f094fa5c956356b4d56b6f8dd4ec747ff85841cbbb080547db92faf1adbdb0907fa65c2e7c6c30b57c9ab8f7b09677037051387b17c6caebf25f27b58ed19f8818e99965adfc975fb0fa14c1583a643c5adea20df03f06f741e7f19f08dcf7811b11f8bfa947ccc4fd0c3987ce4ce72c526604a0defe4e0ba4eaa57c5b6ee0b9a889ba66265d20ce4abe9062d1a65726be4c7b631196a2db343bc14b8d3364054b93281bca8bd3c3dd29b1a8db9b1064ba57aac56550b81b015e20cefac545b92f3e473e7571a7356309bb75fc2974f62bf79e5169fcd82aec25fe862035e244dbc74f330408d9471a4aea8b6333972f49df54c2108951b761fc8f81bd6a18c6e076e1a45d9446c8ee9a37367e4de72ef70e12ae922bea4d3464e5b464b9326eff530316f0d12730361e275982954399e3ab2e13f211aeefd04379b68d3806fad62fc527eba1ff6527c74e4fd18db4e00dbec2548f7cb4d736e98b76d48c2c9cc325df55b8dc9968e476f080f362e72886edaf606d21c4587c69ba11db770d9127a8f0302e6f95c9d97922dbd43377249ede682bf8f1e38dd2f1eb35daa29ceedecec72d3a3cb4e651c69090482085252c240500dec31eb627edadee076aed3cb50a135b7d22a8b58cd43f1ac99a672b98b834cad6051dafd1c8ffb2003636d21e8dc64b50cc2ea7a76041c0feb557294bf2042e909855b4f74750bcc98c3bcccb232cdc16d4816d82217f561239d0ebebe3e278fc918660da15745bc04c5ac354688d3635c2dd74311789cdb25984bc9e99a57e590c555fbbc56acf5202d9acc42b4eca9de53289a9559f85571b53d0bce7f0da63269a5ade91fbc965f97d5edcee085251beaa301f3da07b2cc070e7a03d6fb3903b36d4de720df7eb570b6030082ad68a4473a5fd38be9215533727040b2c0b644aa09cbd5f1fe751cc9852ad4c667d2644e53a7953f4052b7fe72585e1bb01cf41221d9648db5e81fee886d880e267b55d660efe65c6ff0bb210d2af8278d43ce63ec4fe828d0ecbeda48c252335649a2a3495e89c9fa017cf17231f8845b2e0b4510f7c608da2e483186b24374b8ed51d31c59e993b1ba6a7172e9446080b699c8fdaa5b57223ddebec7c806dffa9b0074cbe7efd831bd1ddb0ff0acf1a7caedd9ec68cef0895939ec4093c53752b23debd1c27a486140f45c72078d5a1ac0096cf80e33893d93173a31410dae309bab8d89eeb269d316d30d70d577a16c1f34a5e6e247d9736a06b46ea7f89f692ab3e8d581e7b1a0017dd465289f653ea930666a4908380b97b1d8907bd961050e9c12db7bd89dcfe825343082f888711d6ce82b38db66d9c1d7b52c9ffa55cd1e5c23a8fa92caa2fc33191468ff3773f5e56383b96fea593f5c571be2fec4391b644f3347687fbc7c13760268efcca9b53de8a4fec7c718af87879822866ce0c25966e535cca6ec57240061554b5cdb04ad7673269acd082e3cb42f5eb423af2292889def8ca90ee51eeb7247a253cbed81a20a12882f31a01b1a814e25bcde1f509de887f5577621cca5728bf4273746528aa32e47171f84d774df2ae1a981f2155ca624a3cf0a50913f056b7cb2f2a382e241398574deb5da083995a0c0a44f90b2ee4ea25e17e500f83d3743aa078164c8e7fdf7947451798191293796f77afeaebffbeeaead9c81d03d37e91e72534741146d4bf8be769df2142aa7997573abd67d37f77cb3a935302154a9198bc2efd923582f07e1c9c634c11b6a601f75f4cb9a50d5df767a84f944e3c21f21f5234ac53cf6a14cfeac7e46b1dadce034ebec6679e0634f52a3f55c2d577e050a8735d169213e3468cbec76ee2a435900c6232631598d8d9a441d3b2542faece96dcce5d0a2ccb03422fa2c5af4a7f67a050f3fcb9a1d7488d8e2612d348856aa0e3ceb06bd4d35af798eb6911637f279ff0e20758bbe4cce3f4f724db59c937fdeb0719486c938ed6511c472d27d53b27f6cd30c66f5f386fa4f7255990aeca498ed31f21f83442f07617a67aa4d8220e54d505c58d9fa0006d172e66a007338b7e668c9b78a40d4ac8c185d4bcab1933c9af41e415b47243cab72414cf001bbe3d63761b7e7626d758f27dde2acafc16fd506689fd4d6fc44147272eb00e91e271fc84b796726fe7bb8cc954c24da56be22de82fa3a0e8632d5724ea3d00d38a7ba49470f788c9b9c4a64de33164948d6376ef19e6fdaecbe4b698d66a005e11aa41d9c33cb945b9e45a84bf6e03db5bfaa7a13fab46fac52b302552866b6fcd89122858500b04f354d5ce5225575b0253394298d51621dcfc772fd04f07897535d98ba5e2bc4dda5f50244355fa2960d3c0f0db6c3533f0fbc728f5f718ec89539dd16d9218751d5826e86880daf44b016b31d7c6173479b767215a936301bee24db90aeaa2c7c8440d8ae394e2f9fc0d30e89b12f6cd482e272496ca48dbba94e010d5509cf08fb461d8334be246599bbf3945f3b8e76ccfd6896ca92711da145d1bc7fab8cbb43f6894c44b17d19098934166e50deabfebf722add78422226c79a1b44c934f4086f90532e9edd098ac7c4b29f33f5731d97729fce1a1232a9f0ac660b24706810f72e8a25ea09b30e0cabb4348e02565741724e5dcc56fef6bcf29ada458df597623523027403603449f8a2463330f0eb8b22005730641cad200146c33ebd7ea1bb5254360675bbc2edc01ae977ee141d14027f41d49abdcb993bcf15efb847a368d660924a70fd4777397a21b8823a22e11da7940aad657c969d55eb0dad6c55b93f588adbc450e779178874f7c61b92597222e4f14a14179bb0510554bcd86ab399568a90aeebb61cd99d0e6627417c8343570d20fee2e5718df460cea774d5987b74e1e8111b5e944f2a3f583be97a090d269345453f49a909ebd123450a9cf16487248d8efaa520433c7a56746cb8fa72594c6c4f444115255b3aa9d41f8ea974c714634884aaf829ba4038c8ed2f3d724b7251fe7b8e610034d7efa421fe0d63acff2a31185c79e064e7e85d79944372976901fda69aa44cca76f5ed0534b14b17952c67525ed9df9ba4b200adc8192e95ce2b3cc083533f81eb3da5d17711fa3cec85c44fdee5375dedb4ba2faf7543ac8ca83bab9e93b106821742664a417f51eb754979ec5ce70a50c6b9c8b80172b24932620656fea87ca331cb5841f43c1b568fadca708df32b4047fe6c1bd972cac8b6cacdf4d493839ae9c8e79fc23dfe63eef93872ee3f421967a2d372fc708ea3a6750fb24f80a6bf5c07a678757aa15ff48adaec1d287270c3ec0fa73a32ba0e6f643376d8fc3b2114b3db3a0d7dc0bf25fc7bd4b41b99e54f6c12cf7b35979a5c4abe038b9bee2d35d469227982e73f074dfb8e85a89d5ff1d72660962c3a6ca252acc6272087fdd57ac3e7328832c16bc7516724f36aba7a0a6a0db872a8e978b7f3d4d87e07f763c22961c85de8a556c8cfb670fe9569c021e2682d3a12b93a147c074aad070e234e1b4ac40cd96a5bb76edfd4cbb8afef8fa466d3612b6e07de0e2ae640da2da25ab273d0d38eb9401e54144e1dbe9d61f3407d1529c50c7090489326c211898200f4edb9aa50f72b92678afcb82108bee3f51cd1726c4b74d8fc7e82d6af65e037eb4945e7501049d9c5c5f12d36e93d6c1f491972e053822d36fd4c3c1989b904f10ffe38140ae3d9c9037bc7e91fbc34fe92e772fc3a1f79504a164486ccf4b2d7aeafcb9ae6f3b2f71fbcc6858a89a99e600e724a02b7ff480839ce03294f15a2d15533036e3c4b21b8ae107c6cd8274d429272eb80cd74f0c9d557ede286caa41a589bb3f1a6e6418b296c0253adc2b143fc728078cbe7a3b0526ae6610ced6aefdbef44f3d7e1030cb58f72d7655d52c88c72705a44acfd1dfb4e680d852ec6aa8657ace280614c47e0f8d6f9f7a6e94857722387a5f12c10c24e5bd2eccb3be7fd49e82d851094f3c5205718bcac443384456b22b4d88701763e7b40cded1ab3377ffa8be9f99c329d8abf61883043f08855b4cccf09e3509aead46dc7feaaeaf3937de1a6ff4c0540dec90df1c577477672ee83b0070c717c4e1b81550b8fcb57e7a39ab5e3c9812b4f42bc731091929f7217e72330a7cc76f30cbbe3f1ba950f9e6ea168d96a44257b98bf8bb16ec74772250376e9863e88f7c4719becf96da2afdb7c5745086f5fe9b7989e65c4057e72917164944118e4861ec74d3e220ce18f7e51e67479db420d9ab96b1072882e71ee537cef171c76250a81ebc5992d258fc19459ec2ef984809556e141b23cb244adc1da9bbeb174dca4bfa7213779450cd7eba5cdfb41342be9f630b4596cef3ef822df93a0db9a11d753ccd87c8ee329001c9ec8cf97e5fa9e7a76de3442f50320aa1896faebdfe452f1eba0aa3e5dabcff52688a219539db49c3adce059d4726fd9f31c26d0f27f6b8408da0d8c21317cd13b02554d0a9800f9b6737aa2c272cda4fff2968a0850f0fbef99bf6ee9d8c4e9f86a160cc48d5ff93a9ad829a66245f8fb39c34a3ca636105b53a853ec275164d56a09bb06e6f427a45437dbd0727000840f75cc0419be8caa345e8b369b69eda9aea2ba7d952c91d4a697a0fb2ded57ecd93ba6708eb36c6633749f8cdcfe84be538f8a85f92eeebe28a003c652d6d50e3b522b954213d50e0e7e5f3ac55cd38a9338d40874cc10fbd4ec8cd772f2fbc05797866bee79fe1b8773d440e5b5624f625c280ff34c594a8d8d52a20151bc342c89dbcbba446310ae7ab9cb8bf46b4cd547ac6ce40e5ea4d316718672ece16b5f348cee2eaa953f43e8836bc8c45d6f39b66d7b6beef073fc51062f50ffc4dab9e595312848cbf90c559b0b5c10e8173aedf1f1e05c4d608216edbe72c18136406a135c7bdafdd7e6e62421aa99ba97b7b014c6914ea3832662808d570bebe0860682c75abb3459eb5aa8491d0d28fdc8a4d56ba2c9f8e35236de41261792f8ed3904b2e7d97731c0d02107c1d6b2010918e96aa7d2d479694ff23f17f294940fbf21f04f1665cfa6f7e3ab64b0413525afbebf486ee8ce5d0ce3d319ca86c96efe869b01a1bacaf6d302cd6fc2bc04503da14cbad308b8caac9bf913dc095fcee4e00c2bb4ff6fc38afcb078f474666cc220479351e9fe949f153a729401f7b9b23f11806037d99ddfe2f4cbc83593649e932a1c7ceee584cd7a7072b5e7cbe90ea5866638cc1aa85ae7cd451e37e751ff500e5893629e2726578e727e2cd441677e5aa00338675994a9c64881b9da4e8a31d68ecad95ca8233f33727a508549c2d687a38c50ff9f639d2057acac8d8e95a2f1a6b767ec41c2c766293a1e3b0d02773ab22892a8a0924209b412d1594536b3a769f888f95954309e6e355a82084990a26670c815dd4b429f314f0fcadfc3b3dee35a1a0d1165de8109dcb47dfd9c75ca3b3b75fdaaba746790ee1bc8ce01d9276ca70f936cb5b3bb09432cfb25b0f3480b229e0a16df23c1a5b2778e6d8cde968c61a7bc2634f5da72fb4d04e9ffcff6c33776d8c288488e297adad8601fb916953c2f42c88f128a727fb67a3a3a2d38329548b8258e87a9373c4fc8f06b87058e7b55697721db2a7292a743563232eea2e65f3c44c015913f2564a6599a5f44e59fc0668b58857572d5679e387c65414eb123a305c04d737d0446007f3922d34c9b67023bae475c72f690b1e640d4a0a84d0814c2fe16e255327740ef2899fcd17f4370e638413072fbb1900f6e4b04bf135d7b1ee4bd032641d05537e13b1b2a3976401204af85725c835e65344e74505185725b125b432e253bcebde21727bc1b534bab8e3dab4a3d2d9183d8a4a6500ed2609753c2778e19abf21c4e77f016a0618ce4d483320a839ee89520e6c782229ba4da0fdd00122385f55e94d27e3a5e5430e69fe5e3293169435f0bda8fe4c445e11e2b3273b24cd15a12dd6706daccd0093133c3067241d2152771056c01ff87507e3da9742723236a434ad91e584afc0279e876752110411dd9ea2276a10217a2f901fcb6ffffb9f2108d9e0cb38d6fde7a4251a672f8bcd326d44d965d83d2e3b4bb4620f5a59dd0bd4004811f6b084356ae8c98729c90f0a49420cb815fa86b16e7183a216218dad980c5caebc31ee83d29283f72b0e50ed9fe952a3e1f68140a59669907dd8e78bf859a9e7e04a6a087c9485172a6428c67038b63a7f979cd65117e2775500f4d2909a4586030d5fac087bc0272ccedd50c5d74ebd267abd0cf84a1bc72d3ef023b310d846d74c88220545d84723e598cd550b20a9e26d02353d35fcf2762ccaa7c081a7d17d5fc7262a7a29e71cdd5454541110b7724346da3c198509aa88b03db1d3031c51aa02127c462690b505770058cd8b89d54a9e4a113873c121c6fc15ef5a1735029bfe125fb736072c078abd712b6700a16f66aba2cbb67ee711281cf35821180cc35a21d7d3f737292abbd93dd85bdad41dd5743307c56a2ed77d2fbf58a5dc2bfef72159a11b47267cc7147ec079080ba9bf0291ce96e706b1628e54cef87b2b944b672c2c3e172418ab2b150f852950136596e2a767576f2a3c82b5fb3f7daa6029f70c6a1df7203067cb836847c102a76dcff3d30f9c93ed55c4126004e6eb06d8240852e5c1a36323d2efde90c4488f6edbfe0c15f9f0eb865bc8c466b4684fe3add7c8b396fac99b53897bd57584902dc46e0f3065e569563775dba55727ca8134f4c69b872495e25e62d5d7995f6c9f7ae305498c62f1183946b9fb7410eea985810be807299b56d914c30c2b25f37fa81950bdff9a240f600966fda62337e9d2312ad9c4f41ee4b0274c0c6137343332af71062be72383637549e5bd4a2556fe30bd78972e170177df585d6871dcc9c5fe98c92037fa48bf900950ac9348bf6c3065ba8727bdd50ba06439e2a35b5dbff0a33b978aae0518269fdfac094928fa478010365ef7ce49d629195faa64eb64ea82686a4050e959d1ed60818644f2ad90cf21e72a7821cc5c9f6283c6a7ea77519a9cbb9f694ce623cca55e7d31fa87bbd1c13724fa656881deabdbd8f0ce8bdd4786d048a71249600256c7d1c08b943a4ea8d72e7831982e6de480d7e847c577d1ca94caf583c27ddeb862d9ad16265e85f824c53f64883b5a189c7c3a07f35f0d6511e73fd8adc4d661cf614643086f3d67072cf3dc41204724a58d00556792e3f8ca505630ac1007eb77d8279207300d7b9723021634fc61c5154e43b91514d0a284961d0beb175b25278aa0170447d89ea726136a63bab66a8b6886df800d7895db9540d5bb6531a9833e709b0d438843747e977d5e2ca19c833d3a6cc56fff1335c4b67cf6e8ae26b00a3671d93957f0672542ebbcb36b5c316cd76c3218c9b9c3ff4689e8a75396f8d401686c2132ed072fd293102c7eb9abced31e315d2e415c91f2d1e11f8731046dc9c2b5755524672e5c454268ccee055b44ccd59235e7730a992f3cc0c39397c6db1c4e8782b7e720f97c3783b991cb8172479c833e9886b15576fdd78d1b6418882b333d3c9d9729948f212e7be98e710b7659fce1000c5801c02b83e22223a6505b7b4dfd9b672e8cadb23d274610045a00bc828063b76c33d11b3aeb4880c484dda25d2ec876e0d67311ec76e8049b66e566bf90a192793a6f9695e4579b63627b4e5fb94d74edca244fc76e84ea0e9898d6d59690e4105770c8607ac9664eb493fd475c15772253bab8e920ffa817671179799b667ec4716629efa67742b22df92dc65282d6ed7b2743c044b717d0b0fdc0625b3719188c62fa97be0472248d12e039d2a4c729585095c42422c933fad88898b8673aeffadf06ce3c44755463f58fa18149b728512b52d317744a7a2429e63caf864d1820c4fc37f282f0dc99c8128ac6f1f729d529ff902b014ea9c8ef9fcf5f19f71fbcd85a5dc85bd56c8b78c0d065e8838725bba6d90e65ad151c8725742ea5abcc645a66e294b2d0309ee10304999e753d77841274413e8795817bfdf81ffa1d5521bdec89202510835b2d98c77a1130236b5b5e3294cbdd44e4b050916fa8855378430c72abbefe32fe26b960423ea72e294a3cb7b490566299ffef4411c11d83af9a497e39c6f8caafbead4b4e2d572eea9d3228357d3af5538e1459fdf3173bb678b43718d92329006177bb4ddc2727786e853b7b353e6014217cee136cbf9bfaf589aab77dd2a220698f17c929e727a2dfdff13e326229bfa76e018f5b6769018ac18e9b3efe4110750735f5a4d27d442cab514a6e0a4e3a6a6c8ab2f7dadac5a3728bd7582a592af8c2166c10672797f18d969c4e440e2d924a0e8edd649c90940b75da56f4601b2038344fac900ec29264df894dd0358ec9dcb8e33e07027fb0dc0b0ab4aede65ef2fb7168db40e32cb8969b073d8b495e43062f7a84e65f699c57719aff4414825dcec1ee7e7281a158f61ec76e90d0c16083e9b5b2486078b774f6d0b5f1dac20ddd3fcf190dcf35fefc0c9b6f0705fe2dba613256e65809baafb786cee4d15da812b5f4ea0fcfeb48298b50c1a9a40fc8e49583cca6a573ba4610aef7765fec5c85a228ba2c4b7e131016163e81a666a534729c731bb9bbba1d884ba114f7d55b759a05be72b9f9d99bf3d6b98dc702b9ca29370212a60f21807058370902ddbc6a73b9284c4fdf35e8dd177355013e54d2071694a88abd1ae79eb886980a7bb0193e7e4335286b248f2bf247ad1b310e7b05e9f6bfacaf5b92e37e56d613bd450c065c724a6fd7aacaf7561e80ba100c6f40a13096fbb47053cbd1787497df213af868cf720244ca3a73c4d9e7f901b77713fbc9834cc8dee01322c56f3a237ab74d431d72eb25177416c8ae575521432ca983919fa3543b029bf8042fb575406b1c84a0720fded20c1859d014b27f91305a8052cc7343e4766ee027af6a60a24f4b203636bb6f70c440b1af0153636ff2608d1e131e29d45aed04b8547749d628b6e3270ecb75a7acb36b119ad07821e7fb565c0cef7933b619ed04ba46eb4634c24da272dc59617e3e3723f7419457197953117077fa6c99ef334e1d3325f87f55952a72f116ec641a719c572daa2b4f82c6ce6989170cbabc9ff865295d532dd2ac8e719992dfe45972337360b517867354202aab254ee534a5615e9898172c94349172c29142f61d9331efd01c6592f1d38534794ff03dda5fd42bc49a3ae38416de72897116a8c991abe531a3489aafd990c0724950966d69f948a9cee3c59772a872229252bfd60117b4d7d11d670db57ac9a52a16c2543d3c6d4cd341e309dcb37204cc28e4e2f4f2071d9c1a6af74d886c8c797795ad8cd1b355a0336ea4282b72da1f752d0bce2631dbb0b9dacfdfce6bf10b4844c965e7930ac91485e810ac72fedf4e837c5dbc6dc8e61fdc02405ad500c38de0a3b0d99d9b9043addd59a772d4c89ef48fab8bf8e47f0102d0ac8de2e7cfee3724b2095958fdd570107a18729a8d5bd27592dc69292e73905514b2d222431159c27cf0d01d5c38c1064a3b7267a11cdaf12f2c355d9c7bdda11e19978ad52d0722ca44a95f72cb27d5e42a728c1dda49135086f51156571d28fba5e3c5e7096db4df107d1d6773a89a5aa37278bfc1c3740a10a1bf1a6c84df7445b7c65e93b41a1592fd05abeb832abc9472c6f8a478e2c66cf0ed291807f0e83bfe1b2daff541ecbecb8f992689bac6327278b158de25324207e4775ba7a4ae64a871db1c46a887f79fe4b69634292c15728b0f75bbac33de751ee25ce7d4800c0516bce374aa4eec3db89e0e1c8dedd02a414f5540a6ff949694b26b95e483ff17dc3b9b66723d1721675cb72e5a1ed972797006944ee27f3b97e7f4f5674ffaf79645e2aef461a70b6dcc0e34eecf64726b82e4250da2da6e2d686f9ba687bf2c1cb414f5c8b9333d1a4487441c88fa3e0bd0e5cb0e199d0fb9a93db2803610f35d9e27e6a92e9747687db539133430722e89ab11da9c60e8c1dcca221fa27869d0383dfebaa484d9994acf795857fe4e8a50dfb0b4c393bca85d0d792d1d7c8a774d0af89cc69315348fd0a2f3dc0e0223438688e0c3f7d724751173af5912c402ac77ca81faaeab6f441f17a3c77b72f1a46ff95192ebb6bb00e33509b201a827b6834211aba27e08425f72c3fdde724bc268fbe019c404c6611569fbe203c110e98c9f623d6951272dadddfe435772d0574af5a1ae0e1da5db73c4816a28ac6d0c233d99f46053d97e2a4b1c3e76729f7694e7fce923453a4d8bfcba2c60d179c5b8de01ea4ce1f136744ba096b57261066f6db3ca41fb248826bd930210e8a4a1cab656c9f71e82feb4417e044c727066dad28f46c2b8201d7b227aa34d6649381eaa4769f8f0059f5739913ecb5b92841eea47697e1f4c3943d9fad0427f81dc576cf918959e31ec027d1eac4b7274eff819a186e39bde9c1489fb036ffcf6a429cdff0f574ebd2808dc8839e5726e81ca2f8922f5d596dd91b7f219b9f5d4fd147002735bde0935551c934f03726c31b12063d5169a64677307928536f171bcbfc042e9180c62cbb25b45457029a2f50b51b062778b9c67cdaf948f6dbec5385e6c79d81843b3508f9cd12ed172f4d6a1ad90e501b1cdf2e1ac22c3da5004c39b1b1c55762c188fd29df1f06b34a6939ad70bebbb1705f5bf5763311304e781ac8c10fdf558b71f995923c22772655b430fcdf5dacb037d688c8d673e1d22055075368bfb10fd60adc83cc59c0351fa32f451b6ed25eb7a9fa7ffee2b6861b0f409b7b04ed23f7e4d4ee1cba47208b0d1c2f9d7b4cc5f13cea07f29c9d4b528964d9719faa3b3c8ca662a0d787278b586666907e39a55f9924d693d94c118e6dfa5444af30f0a3a2c58dcfe78720871743d16401ace91428cc68f8cce260cadd682a79f3c99748646f3a68c405a88490ca48b19e906bb27b6ea3331dd83215b722d4b6def02cd6b2f673695f81e8dc366784ef6c3e995d93766e41a0c492a9277b362f419331b8d0ef15576547245fb171939820d55b15227db70c3887001243a14444938f3ab5ffc74711533724388cbab0a3af28a78aafb98a5139c023565bc2e97e6a166f9cac551ed22347224f53e491e79d0eac6c08b5854a95758b328fbc07fd45f59a594ec3f32c5700d5e3f6582e5b750d5d5c27f5274923dd0bff76c6ab4a8d6b6c7fabc45298b7949795c42e299d66bfe4d6e42bf59a8d4990e265e2b1e478dcdf9d59337ff261b5e961939f4a90bfc425ed4f6fb4ae388782cdd30754bb68448f41a29c9e8cd5443d85e1b56b51d0c5d3b42835e858d963517e4ed0abe00b7998bf16d6aa1d19258c18bcff69c0fae235849d5d830c45b8be1887172f2f41d229aec33f7e13725724ee64cae0d2b157c1d12bd93ed2721394883d423e4ff317a38c893934afdab7205e9def197c9193de33e67dd2115bb3107d2c75a6050dcc6db08c01305f32c722b70114c12b06a47fbe3a198d4c5ed9769560ba9e3fa0182cc970bb2e21229721d11652150b4697587fe3190a3ca3da3ce6ad66df836f1bc49023992702b7572d6d154de3fb8632b8a93d619719443c040a6d38e135204dbd0fa2182aed34259e31b7134f46147e47ee42ca412026ec31b7c3cac2bb2316c9fbeb65aca3cfe72c9c50249e0fbde05489dee8924acead4902175828bfbd1255af5ed75661e705ee07d775ea1b37304c6c71b002f8e27b421e525c9843c3fa4d3ccfcd94cf84309580d5ed0ad14146440ad14460c68d8c626fcda8e9a81930209a500d8eab2805744dbdf4e803556e502d4c529f7d06f7186f19ff6e5cf11f8443d6439442610725de4ba9f462a4887430eab0564fc25f33659ef1c279f42f2f040021b288f2d5b98c399ad4dada7f4b7efcbe313d8bc83aa45ab95b699114b04480155b7dc80720edd90eff3401facf7d88ccb5958a24946e80937d1c65df8f6769c6daea1bc19ebf9266d8b3c2af0ac00f02c717b50f7075368762cc43ae292cd34299cebfb724e8a6d8c110cb5d595f8e8285fdb898a95013f9549bd31f303151a96bcc76e34e09ecfe16cf067395ee51b9d5f6a1afb09512cbc4249b4bd360fb0d0c789b105dedba8278d19daf1c2c39d595457d115b96b3981d72c328c2411e6a0c329a7105320cc39ed9b5d9a0a7fde2020fb02cae55525043a649a88c513f6bc23d5207276cf17dd58fd379beb260336fda1c19628bdad7df9c6fa56c8fd7ad64e2c297230d1e76a36528c25752b67ab973ea97816951b046c5b8aeb9265b4ceb4f6c31032991ce3d64bc12d6dcf8e7c731b3566dd9e58a1afe91d87dcaa7092909eb70135a0f90a28b45b15c1554256ae2a534bf10f33782d91c2b2cedfed596154e54d02d8779a700bb40a8edb8801920461bf7abccb441187f384d15a36f31ada045e62c940b60d80e7aff16db4993e0f15e43fed21ef5ba88ea52aa5fa70a4325028c33dc6702c0371bd75432573b6d7c7b3c625eee4ddbda7b861f88e2f6fbe1b59849fece06e37c6ab50f8d6ffecce2394c225ce70d345b326302694de9ffe3f2490252ed8dedbd97d1c6e6d868fa1a4f30095fce3f509fd6b17a27758ff53f0640cd548bb42242a525e03b47aa2f8e659376b797ca6bcb5da71c2a54f8e214e22ae0b1d50bd2afc7f0163f150efd8a47a38216325abedcd01ebfbf7784c2ec472e86b3462b52e3240afdb7348a0c82d38ca37bd6ce7e07c9596daf938f64c3e0f22b7a25e59920eda4793017c2243bba6f6445a670e5587dd3680cf07a597a672e81868b226b930d5f16cfaf11ee6114234fae483159b9a5ca4c1498058d2542f74322128afc2688d1316ebd00299d34442a3dab297ab7fd6adbfc5b55f174c10aaddf508630c006a923f17d84cb43707cdba51288a452c40ce99b14ad0349c72fb474396136024685688b74b32176047e35961cf8ff481ce80a2d32e06528c7246f1a0cea8a06a61582af2d1fa451ac173e081decb925345b8a1763a4fd671722d5f31128e030f5b25fbaa4ee36a223338a21e2459831c4375d0b572d49d9b727abd463640c9e2bb08c4fab6d1011515c05691490f225b3728426ee228ceee023c3dc8d17e70175d60b56a927375133cc69c45fa9522c56dc5dae20b5b8fbc4bb79674ad23c07c681a5e110e1b90143dd0e7ed5f275c3dbe02b51cf3ae302c50ddb6bf8a446b328c6bed19a4dce9d1871ab854219fb6ad8fd206f14bf2b38c7279ce3dd9ee007802e8f56421b2062f8bba062dab27f221d982b44464e5357815a72d0e279b3123e98ca4dcab47c70c2fc5af54787c5c41341556f190ded7807215ec53d141b21502353f141f90c414705cd6f073f704264f1cd4eeffcdc5ef72239cda58bca7a5287ea0aa6be38f191a31910b2c034e909c53df6163650cef65aee250138ac318989ff74345042fb38f9b67e74fcb46d7e8d6b3906226e670508384af25d54d2cc40ed72239578cbba05499bf6f583b403375f4ca8fb58e70609da521ff4e9cf9b3d24b78f1144696facfa6723dd82f963a05a282aeb0e62872c8c7d001b966b0b0cf95949c38096d7c7d1b6b9dc31291963a0b234509e9a972c74a2e1cfa6b1c3dd09ea0a61ded1c9c3286110a5a569d7b2e636c0b5bbb4b41cce62b93aa67034e59443d570de8a5cc733aa5474a210b464c45156488a32972b96275bb7bc50abb1163827eae19b4ae16a3ab433446d05e20f6b21fe08dd372acdf74880adfe8e8745f4b46da16eb0964d81bbf55c5827d6ba9486b453c9d7293cf5dfdd61d0259912f72133e5099f9ad7cb95adae007c9432a6d328905f1726569823dcee5b9c2042f79370d08a3e120c020c2d8f4c03dc5b290c1a7f9cc722b8c379d798e6e8dda693b44ff74e4f4ffc533d530c4deffb3f4b5736a8b3b4a1cd1b469b45570a04aa97ecc44745c7a0f46ed8e8869ad9e4384804c4b6f306e8482b99076a5332c674c310ad4238c9f22afb95f741dfd0f98be7be0b8675472cdf411baf013d0a01990c61d2f350991740cfc4037312eb39ff112e8f423d07217e86267b3978b8bbb25660366089110a37e898410ceebc57fa0aa620e0c4972bf1ab5351f4c228cdfc210c94754b424f192807117ba435029a64ff6b910fc72e6e8eae1df9eaef7da77a4fb41dc9f1c7ccd7b27275e9b353844b6c73712041cc092883a02f7beebc45d7b635854265d8b002e7723f0f12e96cee77fedc4632f49c4fa3c7c1ed8c0a7df8fbf07720627e8a0f99fbe425b3bb0a961c89d722372f385a4027fe24286e4bfae31dbf91510c3138d036d291f5c40a861d1d1ee47320c6a208122c91e2d85e32da77597202131cb3c0c218c6ea7acfa2780d9947e5e758060eb4e6be3f496ad0b5fdf8d657a21caabeeb84743036fa8e6fe4e7a1f502d8618f64aa47327cc8b88bb598157a61a4791f6941e8c76a081a7a895165a727a32e70726731620d52d1e91fad0b27c541f7a434e4cffa783d4b78e063aca7285df8891b465232f396e7c55b74e5d650e2fef6bbc86a4eec2390dfeb95bf272b6a965fb4d49cc4c1ec0ca40429aa2917c2a02b926bb59eeb221311434c5a1484c05ce5f306d15118ef7c982885ecfa385a2a13c71e7d578f22c4675d5e79772931ef771096ef23e02860f8206ea52fed6fe26965a3db14339eb6d94e233d27254d7113630b676faf80b5af84fdd6ba45b14699d43aa8092e6539e6924a3aa727fc00158ee73b8a040aeae2cf8ebb7def934db8b48f88873d327baca6b53df49f0a1499f6706cbda08848ffb9d2639e802c5252cd4dd49bdbf80798ee802ab2626e5629eb2fd364604358b8d38f0983a04a0cf5011ef037e24e70c7dfd55217232e08daafbd7f9c7a06af9369f2c106a008ec86d71203be5059ec0d9373966699ec748678b9b768dc4eaa757a8f7f2f31fbbc828ddbd4044d6ff348347aa0942d1417400166fae45553872357b9b58e921eb268710597433a02280a5623dca7235dd49b9fe6ea0cd869918f66d4df93b3a94dbaac00abbef42d0d3a377fe047256ceafdd8ec67a77b6df79b70a934583c8f2d87c54f350931da18c29be38797298774d22f8c6d101546d00a70a9beb98e90dc0b19ac722ea3eae535f7c65731cbaccf7f11662421b49312c9858ed2ffcaff00ea2a4ceef20e88e6316c5d41851226d575f7a3cdc92c612d54df27007403bb3fe685e0d70afe2a09504033f06709b15c0bbf968065ad65351060223f10cca7384ba3da2896d012aa8ae799d166f4f1f0800d2b2445ef1a8a71cbc41575d39c22b8c635c706e7911498dccf6e6723383a8e610b6d4b5009ec4e7e59dce87816b7a15e98df6110977f32a81f633727369ea60521bd1d69fbc9a70dcbcc6a2b919b540407ec8fd48afa635f3e6c01409760f6d4cf5af8266b3c4c12c359bb2fd55fbe61229b24c6b498577410b93054e11c4c5f2a99ff482ec5d8d1164e9a832c709339272720f05e687bc00d3bf725381dbd43d89ad84856fef2426f6d87790713b90184a01f2be37107c6e94d830839d93ffa2aad6ad1b4c687eca21999652e44494a4f6c3757a55ed2b3f5d6e183d35d0f9833dfb22a7b9662236d6be698a1ee4656fa10d372e61210855a64d356e4bac48620fb14f1ccc08eee1dd65d00d2240ab4106bd9b49b73f340df61c7235738bb97d254cd4f149bad3c3aa5cff78abc40f6b8fbabf4eba329f929c2472c15e7cbbecb62ebbc86df636094966cfba48091cef923bfbc84e81b741a57f5294abb26bb1136a79e837ce963f86bbda24ffbe3879da804da9cff71a519cd6729e12b2b38c3f569b13a4ef052828df21d8ed3139c28d501e43b03bea6d5b227268721f8e598fbbcfe39428ea037dcc295eb4a63b74aeb28538488856742dd03ffc2280ddee80d1e57c0a605e36f3ca4866b3afd68be94584f668deb087a4b20de3769dcf9f2c0ef438d01b1e5451f5f239476bafcf56eb64534be204a0766b61180e1935e004b30803e92e76ac358d8c76fb3be28ea67fb39d1fef34886f0e7286e6564e276c4be58e796a9907dc57a6ab38cafcca951e0672b9b0388b7f45729dd6f1c687a24865bdd08fcef080f00f122278cae88d30b3391a28c6c3bf24720e2862008f87580c3f50aa9ebdb95501f5baeda74e7f1cdf6ef766fe94efa26d71296f3b912f54c82272868c8b28c99e3f23257908f90286fee581b6d82ca8143f1a7f608cd6874016155a68d4747a8071acfb4aeeae866755d60d8d065236722e931589a25c8680104886d0f3b6caaa732c0d12dd6e1c0aeb30cf2ce86f4e72ac836415b8df074cd33d472e6276826f645321c34aa6396772a550d7863b3c72d0785d0f2f7dc22d70d3973265886831896523a00ff4ca845adb73352ae01c2e155e5a1909f8c31e63f4bb10a3d48efe7671eac9807eb86e2f8cd1ba26bf90184594bcaf222bcba75e7dc4b9277d8d18de9131b9c9c6b926e7ca82bf5fc8a44337766f6aee9446a7479d42e6757896e0f9d31acea681044402aae95e71e3243174d1d0c5747a8fdff4c8a3419b0247d0fc5cf512389d9224ebd50dec30c9936f82d9fef66423120044e79ca6445d0cc7189fcbe0706dbc004809a86154ec8772eaede7f4777905744319a9a4b1adcc95b0486c998ab81d5797b9c3fddf1d5501f5a7c23432c7bd37f5da5ad63f91506db8a1b58fb9f9ed8294461bb8d23d3a185de435e21d3076a7aff13630f93dc188a78de6979a5bac32be31975898e1335f5bbc8a802da5a03f5e9a946e00fd5f556df6a48871202abd66152e21c557c9729d701573c178495fb09f76ba8f898f84dd2ea88dbd63d298a4395e749db7bc726665e6a2800f9223cf7f3ee6aa0e0cc800f0ffe6ebb4ecad0f98be04db242a6ec23ecaa6a1c24dbca7766aa700f6eaf3f2e49a5176c3bee0df8b0025074a946e62e776f3174fdb1e925da2c629ba422c5348fb83c5b69050dadbe9bc5181e4203bc685e5f84db52e234582e889642177fec2b830a909f96b0ece6a251f757872c6cb3789cd47cba07d93fa70e33ac976df55726c1acd98e52f92cfed21e33e721bfdd81d4458cce9fad25e56557c763889d16b74fb0bdb1f918431c453d09c55eea3fffef8d00cb57ad6de4da48d55acff9449f2249de3dacf0e1e9ebd6fd272a3f9ad17506adf58366ca76416a0f5f59cb98fa5d6559594b3795401971b7e72f3d7b46aba19e31a7c3da455f1d918a4b1d4ab79e0e2f5d74c8220b0f6d8b071439238495c58d79b237321a5bf9cc67f0c6b3e368d63b039897a7d9f9d001359dc32dfe314892b7051aedd0cd3982d0874674a4b297d8379b96c55bf292b8072328865177fce715890c27c7ad4bd0089eda711ef2e0ff9716cb8f50dc5502972ee52d67f5e481396f3c13bd95b206279706beee72de0e2f3c5034a7e10174f0d65852a45a8dc42219544a8b7886970469f20635081fc5fd403da275cca4ccc5afd03cd053283ed99c56b659faabd2b529158be4c34aaf205ace79e2c808de30ce3bae0e73be538defd1337b8fe492761e6389c118536a9f56b1ecaae0a8dcf122ac93304faccea11a776b94c9c72c324931d8c24024a162c535bf9dba051ab725416301276557c302d8c1e157dcd04e16db9e3ec7a9ada40c9fe1d307b3b477241991b57a6580642ea1f831d7e39226bea57e6757e2323d977b552fd6ed8597231b6ac6adb70509b0d42ec3cebbf11dd2594b28c143a7939647af901c3f00772a6b165fb6f40e722a9c924aa04aadd449aafb513dbb5b63141ce6041f18f8f72387d9e445edc72b7b929c8ded6430760006f291697bf1dd278737b8ecc03100936ede73ca9a5920cc4a692928293936d3181b985024dd01a90027365546f6e64923ffa5ab470f1980f874780712ada800199286d6c779f3ff0fa50d7afcefd7202f1b0e13dbccd15ae5a29b5b64f37a00b7a48af9778173badaa9a231c6a8172e85c79197d67dc72bede6958a5ff6a0683bc18fe013bbae2c91cad53da55ed721fdff9b5e591f3ef8a192aac440ff4a3f18d10a164c647fd86fecba88c66b9727821206b37d833ff599597d1cfb3239995a7b6f15ce7beafbeaa76935a4d4e39fa114de14c62f49654c73f03e004de6732ee53c0387581f0c8691e159687ee2c6e7000d5572e7dfbd39555fda1b36c7e4126cbf6f622f648f2b21d81dfae687282188445f75aa35037022067b02c15e4373116d2ee9b1c01ecc5ae4967e41d17d0386d5ff7a03aaa2cfbb571a0bf3eaafb59f547a22e5b87fad504c152d272584a5e2a51f28102cb05dbfc75cb2c5701e1854b26ec39e49174d1b87aa3f2fe647d897f7c34a69d04926361e601210c5a127fc72a16ddf0225737c7aab0add0429754cc750b29bb3f3dd1f99813cd590dbfb12501b1bf9f8e3c78b884f19e5b72952daf32c8be259c475687a2d55287f18dd844d3cd895b864f07aad5d06c5072d5c584c1e8f32949ebe8582fa19e16e2e58215f5a6c225c7cd6c14c779d8d6723177731bcf439b59c5d0a67559dea8ffa02600f8b0f2f3824f436a22252f186f84cf8e2550624b2f1d322701a69f18fbb4b081b08afe090841711a4245cfa572256f6e586ece22ed30a67792a848b349158d8fc7ebc07c56c302cb6f76c65f23bd8f488ac0f74e575fbca3a21c6e715316a11a87b9e449c432146b44b3ec652d5b09709abaee725eb7971a64b73edea605960ef0ee0ee8870990745c019d91147079e302740364147e5c8cdcf1aa85431d209cd77787c6d2d91c1e998c8bbd721f74a24ba278db4cebdb6877ea010bcb30be2e8d85ef1030d2ebab5957f177727955bbcc46be2cd33b7ccb46a21e6a2668f977332e653c5d81c88db7e6b95e725264b59825d4a4130b0f4d5012cbc30df24745b2af089f955ce2259fd7566026b6e5ae63ce3d53128da7d015143fcdb20f51e0011610d5c0f7650a136f389d60e5aaaa459cb59218d205d0128cc0c16e08fe7f48f383dfbfa5a857fd3bf23a72d9ec2c13375799f81b455d15cdb66c0068eeb30eef2d1d7d97f11ba5210f7e72f0640d5f27900f3d86a6c0afe207553bfbc480d9e84e04edbf1f8c9fed7025314577f000399d6df0ff4f92cd918711778a1c1f93f44543ffc1319fb4bb5b0f30f26c246bf0bff5f51d5bc8a37055afe320f89ad579cfb473f1ded348640fd67214850f7dc039fd6be9ac7ad462fbfb2544086c273821f0c774a6de682ec330724264ab41711729bad7f4794d78b8693d2ef59a1d96336af3d498e68358866613498f59debf88fa36ea470c88967a6bccc291957162e4883e0fe173449a5ba13cc67afb04c0f26bdc71e239f7d6f127bbfa6369ee1bb46fd9d3cf81da5b060272e9bed9b77d964715b8106a02b02979f30b9509a7cc9bc615242c97c711dea73000b727ad7f74ee453224d01ad2e3b41818a6eec957d8de3fce42c69b0e720e72d5dc16579bca120f63ead8e420902b5dea49dd399a767e2a6984debce3160f7260ca9bf1592343f22b10ee2a69268791339421ec63b610681ed976628f98aa72427160a41ca08d8fc75272a6e11eac086dadde9ec5c4a4ce602562b7b1cecd61b454da8327ebb31f71025fa9d00669baa4fabc5766badd9622f7b7ee21c88d722fa26effde9bbc4f087e15b9d298a6e00a029237547d9d4fb403b8b682ce3872d509dce235aa4ada4f16feaa3b7f81b66461f361a7291a9ca0b752a364266d723862fd87c0161b215c6966f4ec1698db7f71910d6f61c80ab475823f265eb2725bb0f2d6c4b1b65716eab23b44450549a72422a5e1119f2392ac55d2b9379372d48fa5ec91c15bf7db2ec3f4795cd967e9da1cbc40836cb7ab5995b9a4ec01727f644173791ae1832db66510ee1271e19f48d945ab9b5ea78322faf8c31a5372328020512087a4508b5ea46ba7558eb0d3ed12fef4ccfcdfefd8bacef6d7a272ad3eaf296d6144a9403ab8e084d87de704b04f999fea2bc051679e1b406d73728b87db6bac300c1968163a8f037dcbae4ba1f4d5ce277ada1c7dde75f863f11760888b20db37e774748c3b0db91dabb8244743abc80c59f41a93360444e1fc72fb799a538a298e7404726a75d6b390068a0ac3f7986d7a54145303acb19dc57239fcb664eee4f8100dbdd02ef3a15900213f5c2365e6183eedb94d5a633ed9728456abaa7a548190874d5fdd4756dd313145afabaa8872ce38daca50bd88067272bb7b0f997a641530d09b23452f5176a342f3284b4377316324291db17b4b7240f7336fc63249b7ef09e1d0f4bf9878857847c8821efdf594c8d2cc8b8c9c72d94184cfe24e6a91efa7a6adcc6494d0a5083502c1dcc57483d1966ef0846f49f6c54dea6252f1728333405b8ff4e0414285e1ec5d7b6ef5470b4ce7e7ef2312df53c033ddf8a6a5767c30d7fa865c7688b203445398a4e0eeced76b51198172f263f1ee104ad505517e7cc0c37505c254032b7ba83bbd7cebb6b9eb9ab25372885c2fd6e346d257b3953b0c314e3fe455a0783f97bffd18eb55e948343f431022e4178ae4d6a1b289780d50bea933c011f7aa36cf8aa1b0b355fee5ec258a72fef9c5ac300e18ad50384be443f25936c35b1208b0baabb87afea98227088c172a6c8b41bb5d0de247610a2e8da89b7f3659034a1486b64e38daac3beff26b72846e4c5f70ad19bceb65a543df8b46a647a13ec67ef71672cc216924d224913864c5941a554cb8c277ab38d45f014520fe79253cb97014e36de85a517beea20da3994851f904a17556b84fda88813b6bd3d6c50ae3deec69d3ed711a29d17e1dd38d9e12f7b6e2f0da3f1223dc5abe5b72e797f493aadab08fd244df121b4d65cc1e52ef88f3380d8d15deea66ba719419a02fe010cffc3e7d51a4bdc4c14f1967429dd0bc4e07bf6c94ef5762fc783d7b4d3f3eb73e5bcd57cf5d92657315725cfd9c48222164c8b57bcaeab7dd0a10bc0818e48e6abf3283844ba13f6aca72c73cedcbabe099923c7799680a073fd9b71c1840d576ab4c7cc2badd6327f23b5d651be195a37e4da1a1e215ce7d4af9c0354b2cc1692a756b615d71a448327278c47900952459dd606a0f88425d2e7d5b61ab1506f136f6b194f7d1d4e3c07218ff7e74f8a4a7a84bb1ddcdcd66fc084c8437f94c967cb953429f3627b79e1e164089d5ded8308300d0cfeb751ff17e3156897d39e2f9df59aed3c417b55526c42b5d94ea6bf02e4c29afa393ab9cae3df012d5be87794b3d5e7a0fd5603d4d05ebb9d865118d560ce0eb76950c7ae87dbe9fb3c5823c6c80a93ed524c8da72b6927660629d2b7945f55ef62e46e230148511f55e2518a3034bc8dbc0ab491079b3a09a533688347216d0b9391aa1e03cd3a90222739a36b04c6356299adc6c16d2971e7cead60ce2d1b3040bbadaa4a0f18e08102544ca8db8e4629a2d1b72d2ba0bcb505a69d91ed763f454c56b8eb448202e9a3a21c787731c84005ee0024128a7f0cfdcad852eb531ecedfa9cf34bca75ef614d034f7c489fed44e12e724e1cc305bc9b7265b58f717797e5b03521f3013584a78f0106f5a3af3937160cc36e9fe94afd77908258331b0c51b578cb4eac9444facb4e51bd18d2ce97de5763e5a7f3a3dd5503d36c7537e484bea6242e86941ffd6ad52127fc7afd88d4726356183382da27172132ba01574d80a8ac7b1cc79963255b0407d00c612c7e727fb154101f00067b630370f3d5486b29e469c3b82dce3c3cb430a9bce7d0f372c7c8c512e14a58cf14cf9ef347b5e6faf5ea6da8b33ec02a9813d9455c3ad2727349d19ffd0d6937cb6228a2624d7c134fc522460248981d1c0636b2fcece51c752b075f5a1a8b318b52da65423c1edf7b1f37ba5285ced045b7cefd8c6ca839578f2e7cb2ba3014dd3700474e625b4f89158e97c2d3efdf13d98031d9217672f55c612d75d51ccc6ffdb5759a65816a05aae6b48005996799f4568cfc1a7c72b9c61124c9ef759561308ab16b2721aaf6f120096801205818a038c209766f2d94d054fc7328cb5f756ccfeae446657062843a944526138ed47d8787f13d137263ade9f53974f4ff12f0f19a72758d66d58428fad7a7ae499df0d398191bb77292a47294138264cfb0656ce4b013b24aab3c793d4425861618b2a347e204b324518fccb56a3acf628895d53f4111064ac68d366f3af385ccf03e55c5c8f0481aea69fb5c51ee86af0750b52fb4978c2e1109f52c50e2f41f4a92e357dbaf1e72d61f73e95fbefdd49a7477131f2edc0916a61fd407c23e1d660376e1495fa772564a5bcad66c44eca4aa9c23244a69545f8683d56d8ca305b93cc9f8256b0f5bd69a172e087af2ef66ca8398474f96ad6524b81c4266ee294f9c310e5a457c72571779df9608ca2d1f2a3dacda960b4c98188f914cf420cff469cb726d71256ac334615b862fab6c9603f7b3691dc0fa98ec7bf7f74b000a659aca0448556c72460532b72824936e5f1b9d01a24eafd6b28b2ec15f46cb9e1953bdd92b71e247156f1d04b88af6f9bd88530e7f43a118c6e1e347be7e9a7595879906bf6faa20d8d149fd9dd5a82294ecf4d3f75d90ca3cdded619f1442bbcd753b705ef39d2b0ad010cedfdb0bd7ae969e5b6925fc50d9176422bf76b0391f2eb626d54aa27250b74d7371a975b62212c6f2a17215076585d8e312ab4983be3c67dc9be9b9722808ca76b5cf4ed42f343c0628d7fb88d0523d68c4c81ffb78abe1c53b139472c52979a983f4d1f8dc4969683fbc7f66d9c69ffb17e8806585a9e543edffa32a5ed1e4b346a465dde0379cbb9323df4a64f749e9c260ca850f3fb424e8bfe22178a797eb7575882988586078d181b37fee1ab3438fc7849be27b1045fe44cd72907685c4a6ffe8ece1e2dedc31b1424e3236b3bc1e4051c89396538064eb4e696a0370bd67c2f73ede995e919d2cd904e0527537e5ac683dc5b697c70723c672aa8c102f0872c10eb23cf3051daf50452427a32e828eab29fd9a3560ab8529128b09f8ee4802ad69380e187238f9467cd68a744f59c9c5f95acf544cd3e96646c43dd83cd4f3d7399834b5481f2297535019f91343f0f395cb05ad09a311637254e275b34fdd8ed52a19773a48ce6a67e45a7e9ddc37bed60c28973e7379c63bdcd705c7eeeb58174fdd26088642c171ba0c27251ad0ca3054232898227cd27206f1e3a74652c0c85566201be9630704524b2868895da27693506b9b15c0550bb4889de5fdd2684ebb5d7d6f0eab8e14b49fd46371fe49bc3516ecbbf4a21e72dfdb9acea9921b11ed0c1b7c7219af132b7eecd291df78e6cacd9141fb234f72876a96b0cb94e0e2b2204474f1d719a30852662365dde0b5cadd3bbfd52610721cee96a76be1415529c7c7761d695dc52114a3c95579df1d0ad21c59f07a114bd83014721cba4464ae55f0a56d12234f1b979c5d5d1555d67ac07d40c4681d72942ffb2821a28af177301c9302cdd92433305e02a5fe9a19d776cd9dc4b8cd72eb9161442ea3bef696df6499cd06aeff982549f69c6adf984b7694f8eac30972e929d9b1cc4ccc196020ac203ed7a4ff27a7973ef8f8ab88dc9eb898638c56598a67143401031e3e9a4ba4105b27a43f55c1ac5d07dd2c8be6033a15fb277a65ba0113253ff8a8535e1b72e21fafde43815bf76bbe7196871693b1443d1efe7246b89c78a0d227d398ec79bb3ad77b8a187eb0f1a501a5997520b5635c3ada38378a414d48c848d5d604d435ac331e3ed4c2a01d08935601883c5eb5b83b8272bc84111259de84f3710a3ce674451eff686110c67b16fe5a6ed2a7391f73f3720ee12e37acdfa628154328de0858515a7a808c54e235058ebb57cd417c490d72338231910fc194079846e6d9adba1aed281855b6b299a5f88da662db0d9435725dfe93407e115fe5a048d179b1704485b839e6aa0b189a312422d89b3a94f02a0c4d734cd3f7151f3919ba4f4e6442a3b37ac829cf186fa59a5a6309655c3e164846b9ddae53007857f5ddc34c32d9351164ab08dd2bd883cc9cc88d6bf32f721d54f3e78f67d9448cf9005ed5fcd09ffd2ccb2c4aff523c8c5b9510f7936a72c76b1f9223c1729edf839eeb563b0d42dfb82ac4e9d42f46cd99d4b13eb38672adecc306be10942a6482c8249783f2bd96905bd2d2dcfdafbb066cf97d6a017256f0aaeb102617898af9dc29fdb794554a494f7f7d5efea208abdd7aef910d720f01d841c5f7d2f1e6b169a0d75f77c7b0b2cc2fdfccf3e30833dc6d43d4ee307a91bc2bf28248943565e81dbefda82098938afd38d9ac0f553f08ad2f221a72b20ec33ca67c7698c1860a9ed3771d4e164bdc6609c20f76238997464d456704831feea29dcc4880453ba718da96893fe39f7ce514276d2cf7d785fbafb0df72df95ed4bbeabd67c3e3610b6439e02342494ba875759a06a2b0f2bdb6b013972727353cc7fa4eb3dc2af8271e60585fcee32ac59e72d1257d59e945a12878b722602c291fa15c77747fe8f7777244f520dba56e0b01efbf1020e3127025f47727d460162904bdf9cb9af743f3ce62bd6e748ed995062f00b0f6ba65b2384b0720d0620970967f1a0bfc4684f9d119d455e9bd1e5f16d1de57a32c2c9d5460634501c4ac9d0b2f2976966b0f1b7ee9c755c7188d5e5e6779891854e290b37f3728d7680af4f92aaef8ab6aecab7de0b71efe4401251c7c9f3d41545caa5d97f70eeae269b9263e90dbffc9908c24d0821dc12ef9821dc0c6c8a9ec95967ac277238f67ad061fb677358fa0791e3e58cc3ae181009e5da54be3cedb9ebb965a6054fb3813cff486596f2f7a1049834a438017876fce81bb5d99409a2b33c873672ef230b1c241ee399a1929c6356743895983691b1d02df6b586a3882f654fd322d9d40a53147036078b04eda3d448ed3c4aee1af0202e2cbe10db25a3f7b59d7275388f5f99914febd3f8d5799724bef4727339a44672ab6f363372913fffd972e302651594ead782871c30e69d918545243f4399145777d2533414fdae1de12fd8553f2c599f2edfe2a4096ede36f49c45a99b27daf53c775e8516f3c7bb100c25995e7537383f12232c7d7735133558d19a5e6b478e662ab886b51cc0c00572b5d8f55812a203a73199d39a6838064c4c98e6c7f370fffd9968347546b368690784335dbfef0cdbd96163f1293440d688de552b73bdfbf7ad3abc2a8eefe872b25639de263aaa40cd78c3a42e1cf4bee52a498e7f4c82e363ebe7976fdccd72bc348335bdf27edbde8a5a11dc706dd90f68df8bcf1f0ae731edb97ad11889727baf60a9b7f048ed4b2c51562cc82b82c4f78a08fa8e2425818fd5d8dc297361a3595a0585e51f1a9ae78a5b7d0d82addd0937265d49e52755f56c6865395772611a189b4bd91ba7803cbdf074ede2170a6b9970271a18bcb29fe8695a95dd725c02c341f287a2cb5729a497ac3f5cc2fa0e2c5bae0a560d1cf19b9774f9fd6c3bb50292bb303a847fe3acc047078c029c83cd7d5683b8fbdbeae99237fee225c11e59adba666cf3b90f38ffed2c77e8676757fd98f7151163e45648eb182f207062c8d0b73fa5d0ec40d92879d6cec683c44443e7843ea0de6043c1ab2ff472f4a25a90b21ff8284defff482be6f37679fd723e18fa8fd5564579d7b1f029727064d6dc09a3d00ee30a404099ce1b34886ec76e50229e8291a7790c6b46fa5b9c09ed6a10b2637cbecb8ec82a07a82f73f1c154b97a14b1422c1d6ebfd20d711096eff24e5edb0553afdde83ed59b232df9269dce4bb17361008f7b731bb45f431de075f141596bfe4a08fc8f707a8b7e4fccac6f60489eb88008723d81d77261b7d2dd6cf4b26b1be471cc55f774c479efa629ffa580502964c61a89b99840ba36483cfc5f2af9cb1dc736f3989fdae223f45ab00fecff19a9c7c59a593372535edc9f0306e2ea85d37cfd662f63653cca658bfd677102b05dd5ea39a1f040ebf3717a4f74394a25cae57ca2e013d897ee107c80bebfcb80ced8add0b35523e6f98ad3a9df98b377a2412efad9f7c0aa8636765d7fa813c027fc590c0149723bde3ce8ec88cbd29177d7a38c23eaffde4781f3bd84adf5ec896b443220f67247fbc82daba2b5bc2b1edbc0d10d9c8de832b2165c93f12676923567fdcc4e72c9719f010d179aa959de4fe055e3ba50f1b79477e18c54de1b7fe3cb731ef3723d7439070a5bf96b58ec5979734a24bc2d95afef09c8bd791e0cd098a0aa5909e055ba65edaedf38126011ab9be3f97ce2e3df5bfdbe42f5a2fe5cca9a306a72c9d3e5fb295cd733fe581d8b842955fc594a381bbd785a6a3f1868d5886cc6722a0fb3451adeadd4aeb3240b110c38de84096625345eb0ff13536af5845c507274cb6004e2be37fa00bb073dab5626e0dca4ca72fa315fe85f8338b9911dea7003456f3b88b5bd92a227748aa235e81cc19ed598aea1ee1e15d550940d866172201e32639fae1673e84d552d758a248d20432a3b55cb8a4ce1efa4e8afc266292bf4685c19084c397c93fae4454d14ee2bfd44aa1cd35f119258a2b9e936ff7214ce7e7892ec6a52205a6b1a0d56a162cf981742ed87e4a6a27ce63dd3720c15cf8a987fd1b186cf231d98763bf5fc43004fd8d8785ead3b67aa4ad04a70c772d6289a551eb463089c2acdfea4c77fc7353e75cf07e69c53f85213c0fb4ae57270af2a9f70dd1105685eafc5ebcb8d8737d454cd4ea11c2045f6d22be85cc84d45e8de6dfde7cf4baea6db8f309ce8575facbad7ec3ab5c8cc95643101b3cd678d16a54e857cb7e27fe7256ba0755dd804d6aa6b97b686a0112ae62ac0633a1b62743e6c5667956f17e98ebdebf3e2e63f838431b01fe52878fdc82993edc43eea150de6427fa7cb4ad6b1c779ff03324e8a49690651cd581523dd7b4ceb936be4b00553af4837d667fee1b4cf73e1e56db5dacbf7524d68ea04d4d5ba530b408f16ea2e700c36746cf9b39d9673abf17df88cb0c6c99da4c6cb67eabcf3c357f816fd8bae9359f99b695b16be120b67815325715ca904e4f5a026e2e30f9227c35c1db52232adb37eb9d3856c77351d4e2545ba555b4935ccd548d7ad72c6640f47ae969356fad04f1742f0f4cfa62514013ff47bf133d885fe86872e8dbb52a28fbf048c00514e43aa1121f46850a4cb7fd23a88aabd175d5508dab43fea72fbc33da00cbc8e4713aef5055cc5389f8208206da9056be8808411916eb7d9723512e619238fcd4123931660dcf4ede867ba2d700dd095cb16b245e49d361d30e2ef2f993327c0fc98ffa4d5ceaff919ad743858a9b62c3537af4af8770dda722ee4ff67f8b733b22152ce7531dc898e213950c498ccc15c37474a77276a2b72e8f4a2ae69a0cf90e68fa50116e7539b45fcadf4a998f81831073a7fb8a31b2b8359692273db5e5e0b4eae8e5a33cbee65ed115102f82c6aa938d696bde0e5720c5db6944f7b474415e712e5d2000678874dc6ef14e24b887f9142e4a692df074f9eb6e9b78e78112ba3f9d0bb6ecbdae1b67a1b0a1cb54401e9cd2b2e6969726e40e1ea15a3f335617d0d3aba2756a419a7bb46b4efce5effac7d87e07ccf72887c8d62d9be98c0a736b8e92a69544ff41c0d3ae4d679d47398a763d79590528233c35631165862bb4c7626a4b61564b3516169559d9f94a4b9e5c373cca3320a3ebf9ef548e4ae101ffd155f193e5e8d5b5338447f4296b43864c75998eb72033bd2420af205aeba9fce548af6e968e3c093e11a14cc4fac88d997fbfc6d7299829b9b84a2336c44426e36ccbfc6a063cfce9229080bdadaead3a635073768d979976aa4a0c0413b8b936f9981ecec83bc537df037ee3f6adec697ca82c35a51a323fdde754522f8313a0d24d5c2b900eeffedbceb5edc6f81b47ee968f472a47a1c485cb6530289f0287deda19695f41d2875970ec9c5dac279099b424865cee46071fa38d7821f66354c87f90e73f0912a8b5777ad26ebb71e3377759472746c146b67262df3901be8dd35efe1b26bcaa0557d74a2153ff102bc7f0ba272db86df73704ec3856bb3991420088ab12e709c7b4ea7d9255cc05ac78ccb57724c0447f9df935867c8d81c5717da376a904723b43bd1274fb364019232416672d1ad082cc855aff84956cfc087ad2d6a278e9c396e17bb5dd32e9e4850764c01043f9d4b7f40abdfd2219d12d73e4982c84b6d3b87dc1a63a6f1822b893c2e72f37f832065816545c6b7b4aad57a41cd12c58985844f0cc971cf088233692c316cb3fd3dc55fde643d0686ca056387091aa8abcacfaba4570c08da407079b2720a143eeec3604a99373f0ad8707be24c3a7ce99e10be093bae5c54043e6448086950a012909794c042cdf8358c1ae15f3c57390debdc0798a9767a4b0df4251a8d61956e38fb43c73642565dd4068f94af216b4c17e7aaff6388efe58af224728e333cbdd138d5aa62664f8b9bfdcc2260e267472322000cde2205fa07d49b72e1c24fa92ea5469a2a10fddd0b7f7882cf95dd626cbf424b18e0b465d5988e2a5675c53c4e04f60c8e521c98b4fd0386a1d1444ab9906ee0ed68a86fb9cc4835b59e06c934c1431d9f5044b25d8b74b1352ef50139ce50be3dda465ce424c97289947882ab10c885abd3dbfe2db9bfe276fb297c52c07c739b1d914235ccd76b0bb06e85fa39bc8a2946a36aa5ebbe52db7b1c5f39d3a0016f75d329babf8300c89d64b55871b773c587dcc390774515d64e3cf659cab8737f3e684dcc8a4416a2d54878447007799aded77839739ff0b57f0daf387981c709d078ae8a7a7363163f01394053b3732436d3c3f0e8267d89994874293ca72f38514d1e8c4461720fd372ed9e45b62a71136ae690c3a60a0352b6ce53c521068b301b4cc19b9a612ef8452178a2dc86932cd7546feb8b8c3be12c24a4485308aa4375e50976c0104c1986c6da0e1ea364709311b5d954cc2cf0214fbf327ea56e82179625217072762b0992f07f0fc9d60d097845f5799a1d86a3f8ea8c30ba202f7ec2f636ab7267421f2a54995d0ae012c7b4f4d2da5079fa972e2309ac46743421dd28b23c6f6c5288ab05c186012a275e04d75c231f563a5dbc9b469c0e84793409c3cfd3727cbe7817bcba77b9280cf7e8ea738373cbb6b2fc169c8df8b2e45c0cdb8f453b245fbe9fd4048714ca95bc04da844294134a1fc3ffeb378a36b6281e9e7f6411406068f1f560bf26454d519c474104b60bb2d55c99087108cf457baeef5a5c38024734f97a7e5d0fb0cae7c5384ee126966a412e2f6b21a8da1897f655c32a72eda4b164dffed7f0b667b6d7fcb2246aeed7b46c740dabd4a6c71a0eac9cfd72416ae2e190b592e386b32632ec9ece046230a6f174ef844fe1bc2ba02c240f72cf726aff6802f70a2a3086986db08ff25b8105732164eff9a0cafba857c10f72d2981dcf7d052d3b4e269e2410508fbdba4a6bc056d9a2260e12f7a74e8e4f72b4377f37fb8b10ef8d63aa7576f25c052d2d99152d883b4b7a89c44bbefd4f721549b60f862222f53005f5ed08be602f59078c3643a38b4721d385b68d961959915628523cc2fd79fb3a03328e2d83e64c66694afab05bb4d7935227a98e03722aa8b8b04ded1252f8c9fdf4329d2130a216034f7061375813c47878a3d52b72beaae052fd39f15a5307a18a92775b60c85280744fc93326dc9b8bfc0a4c101ef1d17d173869963b9ecf5014c07308f9fdbd15e18d34402401693002012ac37249e03de4745f9e420b6fafa8bc67f221ac5fdf1fe2e57261cfdafcf02c6c113d921ab833d636d7f50891582a07c5ef90144b67902fa7f2e40d627165a3875e2a4b7fd381ea5dcf356fa42a70ef94d3189f081eb8c501ebc3afdf5ece748e0d721e78b6e70c3eb861d0dad7c0c5587658377c94dc558ba91aab56865ddebe834d002b68aa9e48367ae2aff6954f625e42c692ff9e54bba3400b321d91f7c5d772163dd747176c41c94e9ffed5ef4c2c3e33011d93280e92c8a4f588238e72735a6229031770ab8b6591cf3311d5ac54db00fe674f8f50a2bbd74e333d73786972db02722ff95025cdb2547e6bde061d153805a7ba70b0fe0efd2d1b6e27589101bace80ca22ee585924489ddca4bd2d3c99cbbb3e3eec07bf5f91f6270e239754f94e66a1449ea51588bc50c17fb877d5174e7e2eb2d0380f14efe815b77cc6721c28c55886e46fc7d2702a5246e44c048200d43392a4af8d244bd92b7e2ee3720f3606b048cb2811dba4b0db180c85b087821a0e4b9235b1ca9d6d2aeb308c72af1e84ba1c88d2c5c268785de59829e4e1888a1563b336d29c55a4f14af1820d705d9127331cf27252fceefda4e65bb9d608135df4786db7b7b6ba1666f0a8721e14916036e150ad50123c5d9db69fe3be1cefde11e121cdbadf0e0dfc2062724d72a4fc59aac14365bda857fa495a66235e7f685a55e80aa43743080a5765726dbd266ec06c4ee3e521353d9d65c7e2359f3ef3cb07a51ccd153a7a41decf6a96e5b4b0ff2089ae76942cdd6dddee9138f3b8f76087dfc2a1fc4fe6911d66727d3c2a5898ae14e6c3b0cc0ae70452981915f03716863f3a7640bf10916d392ec3082c7b9859aa49fa46f1cdb73acef339050835ccd32277368017219935f6729eb26ace2e79e34b51ebed1627fd594ccf43e8cb2910abe241bbe305efd7fc720099a88503a0bd081351c6d36e43196eafccfe265e937796d39cd3f18041457200b6639ff52ea09822d411d7ec8d1b0cec70b471769a402a41a90f236f2dbd723f5dbbcf5f7d9f37ea88b8350acfe8595d8dd4823750f7506817aa5779553072880b9872e96f1b1be386f536905057596f626ace6de5e42454a385fd3046650142e31927321c5893d020a7926ac0160e8315905dd460efbd246d6737cc8f41728911ad45b63ead29a8c4d229fb02dfc67ab04885751dfb06f7e7816098b086724b21784f0461646c41e0d35e978a1c3afc1c6aee7fad6653627e47a997134272ba46673da329f0a20bf19e904f89de8e80662d79a73467a9daf6020edb488a727b1ab391a0713a3d64ef4a41a9c889372ccfc179b9dc83364d4a360138ce3c282194748993a07f735d6d5e51f36a33bc7e3f542a03aa62d02782cce92992ce5953729527240c6891bf8542b6e0f34393dfa36650781742ff600fb5447d199411073183116edc5411d60c8ca5824a93c98f12f491dc96cfc0fb5269f4725708724e62abb4867b3a4e15bae1877a66424abe1eb0aa999b167a2507eed89a0e45480f5e8162bdf1bd1ef4c9d7f892976678990adee3f000499346ec02fbb97b6b07cec9e38405a6a7ae1aaec5862dfbb397094aa3c67ee4fd9f301df46e2cc61c72781aee2de8ddfeba3034c5b90599bbb18c0f4f67b75e1b21d63137928491d63645d9682eaf388dfcb99802323e92754d41c9ecf0d695fe13fef54705b34d0f4ac26c49ad5bb11b4a859d908cf038829394f1e7bc44051c97478be8a56361d072ce2543a9dfca288454da3bce9bb09d7e0ac1e546dd50a668a2fce4b6cd5ab73357e59144b32a84bbedf61fcfa78a817c0d459af430d4e482f82e2f194ee69e259404e3fc48cc8ab356f105869f9c16de6986c674462d24a0d5e911c126e6e4723b467fecb841d0cae567ea9cd85e1fcd2c3fba34e5e82203cbe35a53a4d87972cfeb42767245a7f0d0c937a959b4c20d388f516193d3ded646241728c4b8cf72c557f804f5b44c27fa3d88552a6f61241ea490187ab2eceeaa610e24353a6b72bc1b790161a4831e5932bacadc197aa78f50871f53a43c146b205b02bd765c72a13b0848d6c40b473429e9a76bd4931135967d5b0cdbf0f150b8c7af06ab2e61fb646882b07a453869a83f733a28337aa8671b99e5d02f5aa515af3a9b39527200a83b4505ac3a0c1c254d0a543dee275628aaced8200602ca4a9a23d78b8a04251058f12b9b7aaf9b95fbbe921f4e6726c6337c86038193f97db2a6c79e3f725c71a7cae5f3e97016abcb8b20f283b13f0deef704c45ebc56f8a39f25ded872070cc467a005a494b186b7eb830b091fe0532b8801bb0a05e5bb9cc9682d2d7284e7080cbc02b6d0fb914c274b3f6651ef459558af28ba2a8f4b6de98919b77220a6e5ea4b30bcf4a088bf3b27e7e3f721fb35dc40cf913efff1b892cf7b6c243920cbbf861624df5419b4442a839eb471642521b91ca01afe52272e390b6f63196513f566b39757fee670a7d683998d874f9ad047000652658de448f79a7d59888260eff835bba1e28b9f8accbfcd45c5e77731aab1c0e486156eba5761d567bfb92beb882134bef6df6af7f3ae3c08e372144b32b98d9f0e3ba7418454f672ef3f149c58084737832c331068bc92eac987ccfcde181db82f9d0205befb1b72078ad4987b790cdc7a776f83749275b8459bdb1cd010b6ec33df0d2594a782312b8720d23f59ddd41e2675962637111a717d3840be1426ddab1f410f7c37f145fa9785ae4f8072c786fb33252ecbc365e78d75b71123fbf44864d9a0782f74720ae7483025a1f28eec77dd86118dd3ffc6b39979eca42f5837a9e7d32d8ea60b81a78795a0179222da4818ee7e1c60a05368ba10d937a80ccef522aa2f74a92b90886766c9e018d5cb574922cf791ff3bb9704256b38132cd9d68cd1643cb772866b4af3ac9b5088c2914047226b1c098137f4bad8a18441751c2ef2cf902d601a2947a6fae1e7571dd8c2de11575c342c2b036967326a8eda0c0973b63d515f12be4d8386d5e993cca073058628cb438b6e945e88909a11e304efddcced360164c66f039a3f4a1e50ccd60876694b3fecc3c3d773202b8d415c0fe5fe749902fbc0a3fb39f1bd5cebe27e9c05543149ca72af4cb791d7108e2a400708de2272a1cfc25938c0588835b536c0e36f391cde9e800baf9b9288f4969f3a705a830382d20d701ccf14c87c40a1f82e0a8dadaadfe9affb629393081158592789ff729a8f440adbdfd1479467cc7f66dc43ff46837c57bd99b1405987ec7f52d99166426de46010fe345df14897ff12963b6a872da7970e6068fd25232d041d8328370da3a19cd85f1d3d77f6809846318926a4984db4ce6a2c5690cc5b8adbd28c72695c9146160ce84070ee9351c4f92f12c8b01fba3bd5bcbd8e56856cf9ec7e19377c10197310c9bfd1a9da771b86dd94570cf17f96cc02144ea1b95de9a6771b3dbd3b94cde104401c2b5a41c32393b4fbe21ad916626ad1620dc46b2b6bc60dac6f842486fea20d2f9bbf8541ee3d0b59c15a2cc8e99df47104960e292a0672e78c1c670dcfe7424632c199ec9d9882edb6ab84a14bfdbf2f063534014f1672e665ce9211ec0dd14563fe4a92ae0929e170e05c85687323ae6efaf02cbddf72c1648bb51554f19f65964074f54a6fb02e9656abdeaf7fded5e7715ca69e5c728400fb2acdfe5e8b49b355c9560ee90f3e616cb1cc97d84497287761a58c757204fa627f6e4c6bdb75e14d94b43f454c26c300f87796d9e0b33a4ce66c87317269bd7bdbb5d273b47bf7ed9522a7047e039affccce46b828a71d52a07f5830589b48675ebe5b06c24b87344c3dd58cfa9184c4012b4436c6e363d0b1aba5891acd6cf91ee14144b291802b9eaf76a3c936fecd004de2c38389a028247db3c772cd518c2c699f21a6ce87f6bf425f8ffde0c18d279c4b5c3e6b5a171d741a80724737afa9389a2a68de5a74becba471b8cb4f5cea6bdcbd6fcddcb28dc4ac3f7282d3e7b54fe4c24ea9457e9ba6f1eee2df228d414ece8b024910ee35230c0632fd8d6297dbb0161c7060a960e9020bb6db5cb84648deb729e1adc668269d2072b489c74c38eab1a99581c81ecf920432dfcf4ffc453f9eb1f024b03633eb3672066a7d51f6add16d58cc096517f91df2a1a24e0b6a9d2d9e556ff2898f93307275a59b6d692ab7b1a2d85eafbe099dd5ec3dedfa69880b5dfeef157079770d32fd01c6d808d0572b0deec1aa9aeb7503c20014d0d3c7940f22b3d3bd03b104728bedd32261dade7c4d5a35879233d1cb79aa729cf33f24deaac652736354547244bfb3504f9986ecb809811e4687e75d184abc27401ba60ed0206249c90a0772d61b8ab847a3e00a408ca56dddd3004c7ccfdfa58a307107ffc551c6cacc49724324d087729076e2dd8953e95adefa96fa4f669628c132897ffb0422666c8b008fd9606cfe2c7be96c2c17fb9a2cb4bb338c6c488cbe0a660d91bb6458a56f72af8d229fd246bf7a766b46f62c93c246aff8eec9a7c290d6f38a8fb3fb9c6f362a9d07cc5e8b3f9632235b8dda70a42d15ef97817197e33c3a5d434767e49a63d97778e77cb12d3c8fc6653933799a864ef41991b83f6f6cca299b3ba0e82a5f3870673afec780559ae675c37e906d8f22c47e715e97625e8738bfff511e32722c8d108ecbac2fd5033780d2ddf450cf2418f33905e10c03ccaa432a0c1f9a728f04ee204ee1d802c76dbf0e64c016572db36b2d77935702b8fbc2a5989dc5723d3e576f432a641ea733c5dfb0f52266cf318de2f52f45a79d23278119041c722e5d2ca0c0f17c915bbe7bebd691a7202fa5cdd5aa1a9b5ae82cbea72513ba72d50669f3f2a4830edab9768aaf7302e5885999de7153656cbbcbe6463e518a72e3d69174f15478ea6d80b01a3bf636fb48df8e06edda9cbce05ebad0464fec70dae90d75226f4558959ac43bd9725232238a9129eac481efabdada32d7e5b77280debaa6ac03444fedf830bc27f103d8a4a4133d381999d341d5acdad4e5ec0be922f2b7562d1dc3524db02a689ed0ce2c15aa701a1337144eff70304db82420005477b0b1fc6041f4ee534e75a786446aeeca2ff8ea00efb3c7a0c879756f72b351af7fe24516893a2f2d467e3f1da44002fce340050786e48a984a306aa17017569d7280b99f1936a24e6df79e352328a213bd2aa11993b769b282b4ae3161aab92de2a807a0ea8b1b0da7c218dd25d8c155ccb3f5b240db0b881f63487b1a372e5b24e11a536b8f3b04fb7906e9955ac22557a23db81880e67f018ce2cd7216b9d0733d2ff01d9c16c4567bba5affaf8024660469450ffbb58977a01d0a72c191f4b69fe615794c482b68c2968bcedf68c17b67dd8ef7d754582d85fd05723b8894a21ec6ae223ae9419335a27e0c9bc0728a5157dda08b7df996dcf7cc474117d52c2fb4d6b94187a892765bac87cc20f096aaf1dd88a17ed5b9c6030a729819e89c6263fb89c4b929384a0a2c244263e846a421be859ef38caf03867172d14a7ddbf1314ae0448119ac00f3a534719ed82ea85fd393494c1a9a55348b72a6b5226baa1e654cd2120801b65d4e7bab12932c95658faedb30880bbcde437292557a543933fd820b3776e451e382aa158970dfc35c79046984296411f21372fea508a745516f02c0ebaf31263003739dc656eb7dbc21970264e0b64b49e53ca19a85885125be2969f39d484631936f616d36a002e1054145676e5a53237a724c2b074e87ebebceaeb4f864e595d9ea4feb119e9f92f15d69fe27fd05d38b72e567552ccbccb1334cc17afc8fcb7289acd5b76135019df002c5788757acab728ddad716c299becc3c0c2fc14bb44706211675382b22f59cf79f5fab2b90c71efa6ae6a429bc496dbbd952d3c36f1e52751d87c445d9d3e9fa20eab094c78203281d25c88210c116aacc70d0bccffe89c31010b7b52033694788b5d4e2a68272a6ff8688d9b7ebc157701e867e37d58e5e035bd9a9807b7cb07ffe13a4dd8a18ac4b4ddb831995a25219e0148fcac14178c1cc146c17040e74a19a836c22d472b65a64459ab20747e6bb6623083f0ca3bdfadb3cca8e1597af321474c0526d6cbd1e7f3a3824516fed1de18dcd0f8dfe939a29402e8f8b42bebc218fa58a3172aa73e229dc20e73878e1aabe47f0e0f07caa00b22eb83a834b53c505f7ef2b72b539ab440a587ecc95cc7d8d56cd003843614ddb41abb54bc9608bcf11e09726c09f77fadaa3741b0ce214af0bd094cbe4c3df524fd96edb70702793decebf341a7f26a2ecf9520874d77c7270afdf0279180091679271347b031a54c8953d1f60eb4cd594cbd3729001fb0a81ad16a5c4702277543b2c6e4f9b32ff5123fb09de9b1eeda1f79dcfd2a838b0568c95605fb06cd435290a25861b1c6d458be34cd319dd508172e3f83212f02e6e8fcf61eaa66a09a3239fc13402802b110648725e9b7e63bcc88d4bc0e6f70af28ec3cc21b540f3efb6437388f4b59162b2a1728be7ef927523756b5a7556ba2e5d0b0d83ada110cacb2d6fa3e2792c5da37072f7715b83b8099cfe54174743a1798ef03d8816387ccecbc96edeb96f52b324723b7a73147e743228b02400cb069a2b89b9aaeeaf7d7c1ffb96717b2f599ccb729b8dfffd1fd3386c4179e3a90011874109b31106ae45587e35839777776b0c7266ee7c85665addbae21e848b484dce734721b124fe94c01785d5bbc619cf6672e945ac5303d555836e1ab59110df7eac4f5b74e3d8035ed6068902b4ac76eb72f9deef5c201937e202c3ca4dcc5f619a6e97d7e4cd736dbfa6b02b237c365e09bd79ba01f5abd046c52ed5a5d135582957b2d7d10a58935e9f02e128aff30c03580ea239682323e897fd320455b8c77e342014201617e4aed94504d94e62ff7286014c0d27acff137cbb7b88d2d1734c3b4a3786320f84b9dd93a1d6e13c3072465a478e4a9c3bcb5fc52cb214149600da9ad6148ad188892273735ac4a8266c2152ff8236478af0922a6e18968c7a192bfb640ae2c4eca704b751aa3bc9f13a5697b760a140530418b9f04deca1ff88800fa4c83b1d8e250df949a2d22c74183fffd54fe68e2b5b713c8f1752fe5184a46c191692ba77b6960b0be0099d5a720abe923a231962fe7b61889ca3e5ef0740046e37c6103b57eb4e24ea1de2dc72cd16c8a91f77b53875f812b12c22d2e1ca1d91b6a3322970637ea4d0c75ac3118de95069af8bea9e381be466d57a25cb2d2790b4e3d6d32c039a216e85468672bd1c10b8445ca8f938e6eb27519375712cb4e5ae322fd92cc8c3e10a8c652472ace731d733497ca3ab5fd1a281f5ad295008371eca20366b508b769495fec972fa4e4acb99191435b942abdf535554dbf746f8b766ed87a1e579997f66654d052a74ff117bf0364ee5aa1d2880fd0e1a2c8c17efefba215366f6d92e1c1cd172b63536b4aa513388855a0fce1ffde451e9d995db71746f3b393da3daf8a2d072f35a6b5e2592da6d404ea8bc8d1e7cbea52d044556269cb31677037d39144172dc568852d8a49a5abe91ab51bedaf02f60b8b980b3320f941534d42cbaafd86d15a2991151d71be634213e3dd257c1316a10e58c5c59c14f860d2a6d9cf22541d7578eff226ff338411e7b6d9a33da2e1d436a5ac51527cc7746815f172ada4e0c39923dc244c5a5164b4a4eae71f2d498643312dd9c86de22feaca591856872608dc10a43a5d055fc8e63e04f7291016227455c2a8ddb23d9fbeaf0d19c5c727d79eb16c2d4d4d650f2867749a5361e79a24c16c16a24a56725badc03a53872152e39e3788fbcdd8545ed7b9a1f8d5ddf4dc7b8fc611d1961da58a06706cf729e72301107a031ced62ebf78bfba23921361ad3f0418f1f7768256b488fe2c7272f5c6621447fe3f1fdfb60339df88009983311310b954125c7496a61c1e1b48fc99a7b6b9e00889810510efdf79d20473b468b2426ab1f063abd995f55916729acbbafc20ec5e091f8d3d7dfcf63be11220d5a604e898aa0967ea0ccb37bb72386b9cceb3105f79196269b47094da5295b2a675e936e01a9990da94bbd1f172c5b9492afc4c3dacec51ceceba6bb66ab2ba2c215397dfe99005ba1977715372194d53af3d133b4d9e5949306542ee7bbb3972de7e7f79859233b73726ce0972efbe103406814b74927c9561a07b96aca8ed158561062549295b8dc02a03ff1ab9a8e44c81edfe36978ee90216061dc618cb5beae39ddff2ccfbcc7f1a0af672f37b59fc1dad3d71270ceeda5fe83e35ecc67fb728f8569947d771efa229915ee2bee5406fddff79248bd184a888b8a9c49f36e89b0b4923ac62a106dab7b7725bf139c39ee2cb599f8fe74c3402301cd364d41d263590b38aa0f764d6974f673a65db665db87ff85bd3b5eef3f4aa10b3e23b3bca3f0e70994ae5e171108f72cd46adf71a5e794afa4324dc35e0237dabf0dccaec14d6d0efc7078c11965a2fc971c661f318cce32dc46ec3f5dacc394edc18d79f3d9ba8ad267b8d0410d37253512de03ab2c0aff26f2e9026a7bd634f0399ec56f38358b9ce696227a6f4362516a1b3a40e00807c8f7b0c2b48fa2e829b754f5774e1f0458f50f1e90c0b0b16af26d86b4e41ad877eb13311e54d9f3d4de527883da82739f88e1e79ce1f47458811df6bec0ceffddffc9ad30c6394e3e51eb5d8b33e72deb0d571eabb616fee54c3b8b0f6eb96bf9055cc0714ff375b66ad487cd846ac0c6d462b4d8012728710f5b3b00f6a7e4a503f5c661659e9f32beffa8052b4fb317d96702c6854722e6a3e742577e9c2594b3952873392eb549095cc5e9d81f0ce833f3112cde03125f656033b9fe36b5359792b9bc6efc6ad25f0007de4a6072407bfeeb1dea922635a9365b263bc18c532a432438e33e710932338d48766502d37e969422cb9723ac147f2af4bdbfb2ca9de000fdcd4c478b756a96669ea0c6e0869a28dfd6666f4671e16ca7127e346e235405c7f3392c6ebe428fbbac1dd55d562ebfad31b722fbdbe15790e415cf9ddef515b3e05bfdacd121b07159458a115b3429b597572388d90369916651da590fa231b26c1db1cb7456dc2a99fc6d1c139fabb4dd7722b708f4e1413d14e036774755265d167b4b7806c0618390b5c26d101ccc08a729147597c9c8ef58b2beed9b01039871133dbdaf1cf9166372033a1ca35ff3a3d950f43d4bb9fe3a354246f91a51d86b890fa29ea8074ff3bcce5f0d481fd4a723c46348e3948a5f5650d74ca66dca2e71b32caa73c2b53ad9d50b73054b1f97201aea877d11ce91f57a675f256373082fa1f5aa26bba155be9dbc2587b1b13231ce9716aaa2904dca28742834cae342a34783a045940185292cd005e2bf6a6721c2e0c1194dcd0c305f89f834c07f6fe30b1460fe81d654111ebaf9446cf0160903013f06ac239ea6ed0d0e15ac0e7a6b8c81345a28bed216f39aaade382e272ec72d0635fab25e1431a933d77f3cf52419da0572ad5d8dcc2efbb3a1a2e6c72800d834d11630f0778bbee7e591b4479433fb9f820f569b0b66e4f895d7dc64cd9113dc07cd7309b98acfed9a9e66778f041c5debfdaf14134e40b904bace0095b54ee0186934696f0936c1b20d1808d961e17aaeae4d9792e3e640a3660b701533306ce7cb6e24d77710186430138d2fb6c721bccb4d2f5643744d4b4465b72cf8ac53ca73113ca251d60375ec405361daf801399e1750b3ab0845256f5d87272b81614eb4401aa64837a607be4e2717e9dce8b1b674a91e79948d2c4e9601d6f4ff87030eab79d65ed710d7f81df7ac45770e7a1e9d77da283896a3ba9a372a518a1a0bbdbf34424713b7554f2959d29344b2b6e70d476ffff3205f4cf4d727da609fd3506140cc66d695733863d75a2b1e387f1bc3fde3d9781f2562aea5d2649499a7c8233f11b102a64cf9d28b8167893cac581bf1ab8a02dd0435a36726131fe50a97a44d57d3ee4c3934b2a8aef0ffdbfe9548d748b62773428bcec7237508a83dcd9a1b7bcb2ee512db1228d8ef54c60c0281c5814321c645256815b48fdbe1675ffd5bbef426f14dac6490aa14379bbfa58446086ad3a68e03a4472fa2153ca5c88a332cb4505546bad5a1f4b3c561f438b5f6b35c214bf9535d26eb4edf08f45388f9f42fb50f9b95f089c55c33dae8e682eec4650187ad896d6728edafa9c86ad9bfdd8314534250d8492cae341b2d4a32a5b8c053892dc510a1368ae2ed985fe0a532652cbc0192545cae6140839b1f7ff33898e025847b4ea17f6c372d292fecaed14a3b5d9db48d051e81d8b469535f14bc6d6cff2415b607222fcf22f190f236cba3d188fb0ecace2c4c9e551d66a817126eddcfded7e97269f176a7e91edaae4b904fd6238937a3b7792c6864df74cf12c59038be0a1c76d7cdbc818c4ae9ecdd05e0351b65865c401367eecf8b9804677a6a3536ff43f684aa829592851371cbccd1ed19f7617ef3aab89739e4b83a3e16aa2f8605e2a19f33e1aa64b8b33a7a989efb31c6d171c1a2bf734671dd06fa80e6bbb2a14dc64dc5607a506b79094ef48932da3ff53eb7d536b26ba88d097118483f504278a722f5f2c3812c2b28f19756ce02ed56965270f9b55c58bb003b5c6caa5e414b1723bcd0f5616269b1a8e8722ecb331f180b8dbe38b386f2aee92bc4c2568381572b8546702f0cfe7d54c92c4fa6765a3186ea3f951ea5e51808874185b576d7122230774f45b12ac0a7660d782805bcec1b8c8a1ee8858cd65ec61babcce627a14b03aa958ddb29af752510ef6146e6e393d4d6bb8f8cafe104d39f4de5e3816729a137d81fd4185fbd05b63d5bed116512817dc1cf8d8fad07378a5c6733dbc727b648ff222080d60d42ffede56ebd93d54420e2523bfdbb764c17f6edd308c72be2d51e61fc4b2c60f78352f59f4f0d060ecf8d21b5ef38e2182046371f3bc72c9b57417f935575090aa94863153266ed2069e8c2aa8374ca9f4a5922c4ff87260b9421a1afc7e0001e71db2cb028c5745274172a15cd6d0cb0062ed9396f2720659c0c640fce49f0ca4a05e32063664b727f4d8b71580ed55ad879b07b00572bfe970e0fc33b957a193b8e11f9bb522230ba8bb40d43f65b862d25774d7e40984ffe6e9ddcae2c2d861434a45f8e045d1fb3cbd6444aaed7c0cf2f3b5acae72d0a2f2c0da1d5750e49586e2aa71a97329c91cc1a17e39e430cea005e794f507c9ca18b5ad1fa47305bd513e7d9b9b30f85e8453c6c53029abe6ee259f85ed726bcc207f5abba68754575e74d92a679bc64a73b688b33acda9ae398466356d291af6d5656dedab13a17fffb2891a8f874a7485c00c3527dff20c4aabb77e0472d9a63f6189f6a667002917f36d01927ebfe9cd5744eaf9cb188aa1a1d9d925726f8e4cd803f41056e7b559bf7c472a7db4af34e5582145c2dbc13f2b25a1556b3a335bde2a4fa2388a56c1f984f83364bebda835847546603d9dd87d8c8d86679a1d5045dec2e6d4d8b933592b5cd397a78621b431fe8105f4fafd4519d16872fff549351bfb4854a5f91cc84dd860eed226158395c85c0d96ecf631586b7e7228329a64ff3dedb32aa9c73ca10fe5d029de2491fa22938b899f74e3901ce8729970ee9e2d63faabd876935caaace6fb954cc72fd6a05715d04c8265a417a820e3c51a8f69756f9c3b446f4ffc2159d11ef962720dc1d97c95ba38620ac224724006218bbfc18c4f2398541d0932c47cef7a1debc465c29d690a9aa55139403d8907f15f413b04616b753be6e71b5eca0cbf9b71e2049a679e7ed5488e13e072b20851c7e9121e3253c71eec9f3c6a37ac5d573939f2f511052288b8045ad5723442e4aa2e3dd9b3544ef18e6ba1f4a5d780b475a0a737abf7c55f44ec601f72e05519c0798a1d3fc11d27f4a55070471ee0b8381eb6eb4fce087bd2c02d1f34f8f24e01ff93d25545a0a66a85a0d1559b32ba174eaef1955a3f29b0c265d772f03a55685f8085d77161ed0bbf8ea09183f97732588124aea2d0342a417261724cb2f584b2d1e1d6180a3fb4d982207db4f29d4dcb16045b90463d3684df11722adad4edd29811e730935515a8a93a6a4c1f2c996b30cd021e16b5476cbf6d074c9807089d14ce1e2467d495745fc4c716c663902f6515603d69810768efe872c21a1993ff443969d6abf469bcd782e0f591ce011bcc7793aab8651be36d5e0999347d829419bd580c38a7457397340f254ea71836d20d04b23a8e8ba809d3167f4c9993cc55820019236be775540f34a730692d88f81ef2104a48df9747fd722fe16b2826c64f29b757865030444186aea303333b8280010b58f7cd5fad527238c6e1db058d26d327f60ad171c25a6861df8b7eb886e0c53f7c7c0c83eb0956ae15d3edb03c964015cc9b0fb2c045675e32ef4afc4ec9386ecccbc7c84ac5725f2dd8b5daafe09d62be8ab455fa778c91230767f99eab7453d327a0287f71720c0b04c063b37b3abecb530c39169bf9e403851e8d11524d5319fb3f5e3420725df03dcdd9f859d61f987bf436c12e93868b18fc8facdffea815dc49ebb27b4617ef3a281a7f1471ef4ac1f1d38eb4b7a0fd337532e60945cb580d22cb109b720ac9b95dc4126f119a1e8d1c3317ef9fbd4e460875998452110ed076704579724018424fc94ce9a9cc7ca11af1eacabbcd0c4b2f69457fe7b78cbbd70316a5443c63c18188d0990438f3bda762464cc560e3269fbbbfa054558c3c885d6e7272ada05a52ad008834b80b33716ea2eb375be70cb195e948e59f2b0c1435532d723bd4771226d91ed52034760f6bf8e0cad693324e543d6d125a9a1d88f9cef25c27fd42e9de59537a36e06abf3ce78101fbc0ce969450f327f666d246cb08ab5f0c83dabdae522174205dafc252b638eee2f506f099e3ce69fb26a9648822b772c3304f05967f980415b615366d80a54f53a363b815478e3c7418dbc5483446725d89cc7230a1675643c5d5c50cf62417a698268198b1dcd7a0701f7587e53e449ca6021fe9e9e031efd81c0b523d03274507f780384cc02ab9aa14e1576a9572e7d15440db7cf07b183d39786547f7eeda4a592aa16a73d7a0559737e985f310ea44610b2eebb943942e01803b10cb43702c371920179d393db2cc1e83e169729fdd0cd7a632196ba1cf68969a2b7fd413ce90623bed6b4206da90d67564d4727a8069ee8189a5b8e7afccb33d5dfd48396697aa40d0e550eb32d8f335899445283ebabf6f42d11bfe7176ad68e0fe58c88f08a0a28c655dd272af6bda1dde7243d7dd1b15d7e50a5a1a2a41be2581da28680adb27b094cd03d16df0fb275e021a076482af50c710c15ff93ab0c53ac69e4a71a3dd486eb9065cbf4b142e12729ab807a33f70999702cdc440f125a6a7151e414831ea24910707d6911a6c5729f540c9414d61658d812cd857f9e047f7916ebf2c7c0a05b6814f3c82cdfc2b184ba60845c93c31f1d346503745b084ca1f5151ea485fb67ea55c9b3194090872e5dcbf5667fbf7aff05f6032b60954dd07f3e5e094c28188e690e7333ee7d37279adc3a977cef66b4295fcad139b699cbcc937b7a3e7d7550993af7ee0aa7119d4d9c5d81e88f9eef789248bea42c0d73c370a0137edf6d05bfe6a873db6ec22e641a6caf1ba7ffe6cad9dc9c1466fdd4a0d94497680262adfcced88d61ef3666d1578fc85ebe8ba1e714d0032b2036e92b718050ae6a5aea08e495b7f9e61727a81d48f553d7fe6b9bfb8fe81d2c7826e23b23c1cadf3a72a0286eef50d4726e6a9a03d8e0eb4a46d465671374216c70983712426c6b447e1597017c69f0235e3ead2ab30e39567e3617d73b92f4a8bc46eb195a45159076eab204e09aa7972c682a72b67b033737c57a2634d8247be16d01adda6ca85a59ab03756f5c4486913522e47d6f67c2d1cd058c9404b1dc6322e1b6e3b190809f307ef53f18f5972468a6f671257344e10279f0655ef792722fbc213906c866b2b25fca2108fa572d2fa01d5786fcb15704bacc9d385936365430b3e54b4d87f78814092c2d0db725f36a8d1bc772a2b485c6f0430d9380b6620262bc3365726ef9115739339034de3d337510f74f0ebff3de5c9cb99f5247016a81348b31d0e70f9e975fb350d72b3e40566d305f8bffa626ca60dc8f5d60cf84664dcf1268b230b465bbae0a5723d8f3403d685afb7affab348984672b3e61a3a0517352d5c76a276f3be0f8a72287794424c17a1e63f703257785c777cb8b37448ea37736487d4b18ba4a47f656fa9b285630a8941e16771de56fe423ae3a395e87f0c6dd3cf01f3db96a77552f8168acd52d3a7289f1e6aa1ac7644b710edfad80d7dabec1c9ddb66e9cf9f2b32164b343eaaf5dc40d9098f9dee79e52fd7f9f37b8e8af1ad8083e291dce972c9c03cf3b0c31785c191446c05a6478874ff654ee1836d1df5f091aeb0f7ef4a8338eda99734d07fb054199cebf0267ec0f38b4395c8be2f5a01e821ba15ec6188d597dee246cd55d7cfa40e44997bf46775ba2cfb02293b31b6b5846a151d72a75f033ed286d8ec52e85e6e46cb05310c719cc52a830a376086eac95c018272846884c26a9ecf6256b10c6f3e28d752b710e7c44dc614ff3aec8c95e6be537280f4595fe0c6ebb51e96eabb1a479826cae2b39478ccaf6adbee1c897e255272966ec28def7531d17df63dee36154dcd41a39dde8a83c6b8705a87c7e24d64724c0e998c9cd81740097277dcff58c4d3b630b52cb97bb83f231e5a1416264472dacd55cf6515f3c198d144f806b7215a30ca754e04960adb032d12d5c66b3643f70d092a03c627ddcafb8d0a4f9410bf8918fc0ca495a3d4ab06c5d258e1517293edc760f4388e2fc509e7a07dc446f1130487a808536e9ae81eec132335f37254a3342f63172f4c1f0364e23507c1539ed0940db3cd7567569dc5a0dec1cf4668ac3f46edda25ee4a171f33d54b75e199ff1c5a163c4d966afb9080840595722c5d1462df4b89d1574cd019ad84a678b3e8cdbc090a38db46ef133dff657b72ef3d45298756635845a607661714e7a13872c6f9e3490e4bc0fef47d96d2d372eccc3abf1359b34877ba3b9dfad10dee9c7923e327d0f464f8f3f1cf92bef45ceb6ed4e80226bdf2713958cb11f5ba6ac29371fb0fba72ac1b303231ab7c0272924764c6d73e355c6493337bc1a1f70a9127e9dcb1366bc88480fa2e15fe7a72fc3262696037b282f09d9db6f75efb95eed8d5c9a2b24651d3152db0ccdef7726d9ab98400f1a6966af4c6b4f275f575ab0d7cf1900742082dc2c73b71128f278ba72446f0a253059e9192d5485d4f35856c179c911f931f5ed6621221f54a01b4ba8735532f8920492582b6e32174517c6239dac751e485b3b00125591ce2199624bf52b33f0d55c331b2ca2956908e249dcd374836ead3418c17b99f4a5a31dfad5b84911c653934f64fb0c2d44496b8d33c5bcdd43c9e65fa4b146a770a728e35ada4c81fe9abd0642f1911d09f1c35290bc6e99ec8c5a9ab4db662cf5d5f477a5812d8234fc45ed09b9b915d29f3c46b8d7d545836e009e2f33e0755973485f187e6c754e8a22db0549ded298e8c032ab8de38b920bf1947d921d62b794879f1d14fe9109fd45955fd2737e239ee10da56291136f6c604c8f648f418067237eac751e530a485fbfc43213591b5bdc5edb5219e326df74b269185da19a9494f3b2fc0846315ceb75b71e065286334e34b1e60dfb934b1486a23e75138c172d11b05dcd5747318ed432de5cedf316a0dabc16dbb8bd54975d3b00d2e914b0017e0bcba33c26a24eeebacf3dbde398ca1d92ee7b16f27bcc00c2c2adc1420729595140c48d7c68b92adf9e2aea8feca9416f83bc853abf6e849f354412379627d8166c3844bf60cc69cd71caeb85d2715708f386f5ad1fa0814d0734f7edb3b95ec8cbaf2173e7c4105a7a80af72bad55515de8518945e9b149e5306fffe572b26142b2985e55f487f018e2e6a2a0adb738dd3a372bae00ecd8c30036a8b00f6579f8fc72c7f8c2890e77a02b0484680af530ad5698051092cd8edc27aa9b723e367b37032c10f504f4e20778a6ef4edaae7348c68826dfe7b7eed957e1da58dcece523d2605b1752a22f2c665d33bd8c6f30b52b40a48e297cfaec3f1fc172a16b0b7e1ec334784171c945899cd28e42beb620e7be6ccac7817d29fd1c5f2ad485f8b4a44fe00948430c6604fffe52ffca8355ea4d4e32b0395ae843eaaa7205e0070d0ecaf6715cd4e4546ba0f85ca446f6c7ba958dd12d153f8f17d248724ae8d569f3c7c5d510e892519644f89d8fcd96c035268359cf54812c10de5872bef589c95edeed53dbe78a6ccd8542ecb154c6a38f392eaa62c60c6f19bf7272898be9d5a05628df5310b342ee9f1e5b247b73554b593856f74b2cbf257c4f0a45371dc03d4f41147db13fe91fa7ae56982b4b959199cd58065e276f598175239a72655ab52b4461a043da4033ebb8cd778a8538e54c8f856106cb05f25c7f5c8ce12d73aee7db524d16ae61c49c33520e42a22956150fbdc9c312ca40ce5e061ecd55540c8a227568d6eb51905e193bc6b20695adba9f9d3dfba84b52a5dd6d6c68148bac9d3a144e1277b0c546e30873394f51f8e4293da521a77465b87a0593787ddd71ccf9663d4463fae0dc8b58c6be2a9533cac53fae9712c68e9b5172b17a1eeb86beb19a4cca73e409e899662aa233f92aaa42006d6e0acb52953b3dcc20d77f46536e9742cf4c1881a69921c44a57f39d5b4e66fd9001545c6df50487391d183d9b77eefc715f421294e97962c6af99e542f43fb79d62fd15adc4562101ae74edffdf3cc4e905de989685d8140d8c2f19df75026105bfd3bf12da72ad0d6e5eb11b7fe49513bc26dd061a5032fb6951f91324d37867f0b70c70287242cceac68160fc1b073b94ef32f9f05e6ccaaa3873a0de6b79f1511be258021b320b7b399d2ebd6b1002433f3a48efcf1203db34f8068e35dc3233ef2df26972067896f3fe37de09e561ecbba5304c7aaf9dedb8c7195111fa10575f13add548d8b883b64ffdebc91969f8c85c03a90b99a6b11efa092eee83ff3a812c893f7255e22a0982aafacf4dded262092dada60c601dbafc91c4f406ee187edefa3072217f267ee97a5bc067a9bebb9ee760884daf314d8d5e15b8d3f3f3372bc4e260c5eebc5a36f572a73f54e283f0851e7836a505d8c0452595eed7fdec990ac864a62cb3ea97183d9d457ee78c7f747d1024609ff9190e7b38f582e5b39cbf75721223e3e1de8d44d8273c7e1f82911b823d19fc76ae8ca8b8dce28f6c20d48c72e72429ef36a7487680da95122944679fd14d3c6d28c81518795bbdc811f1ca6116dbcec24b26c708ae07d82b8f7284773f2334946f15bc23c95728110229553b2abe58924224ed0ddda47563a8b45ac805b8fed5584b7372bbfd3b5e6070f66cb48714f3b42da31cb0114831e4d194b869a540a65060622ea39e48b4b2b5397281dc7fed91f42d1c39c1ce86b43725748ca2eeed7171339245b201ed12c65c177ce4e9084d8ee6f412246fe5d058d2d3ae638db9117084b5cad196863eb9735c57231f9be1011183013c39e2d2d02bb6cf9aa4a765186a6804b6a893eec6bf724438eddc7c6196d4a139ebd6988a1bab0e41de685b1302480a9e0b964715df6d49e94b9b7eb3cc1711d780d13bb16311c6f67ec5421ec6b608dbd6f37d13dd2ac8fe5859c6b705d084534cca31cf08b2d0c786d1631b83197b23ecc6aa5300726994b2680004b531b600aeb208ce53546dc606907bc5e340195b6f8284341a720058cf3a644cb9c030c3be90b8b10c779edcf1ec0ae00e15245bf964d41ce772ce56e966fcdcd8cb6c7d040b1245af5d084d1892d7466d43d02fc2ed14bcb672ae14db8f2377ab216f24b519b9957e49a9ac022543a3c3630b1835a6650b51723ad4faf8c62cbe87b75246156696342cc7f6654750e226b2a38fb83287f50072030bdc6dff5bd7623c93aac277da9257d4a0e574d91e492c05b49ecaab3b6f66b12f911b81e4392b372a54ad567b11661d584598f0a407da3f68487f5a369a728b43a0650dafdcf58efe31db2e35d603d61d4b7c776c3821c9f3efb7ef6e3e720b267d3863e7a862dffd01b1c9320f4cf32759e22fa73b5f21361c63663bc3725a26679bf2deef3a9a56b90ebd844eefbccfc47f889944c1b91df982137b8172652ad984c9105787e6287423cf4237a11b5c5a65e8533e1611a80505f2a14872058be83d28d3bb1ad4eec67ba537e601da47435319d201e4e6e2706f8bbc3772a7ec76f570c2970761dd3676e22d0da8aaadfbe120b6efcb8f1e7d49c17d5b72f768b0996cab0cd136186645bed53d75a5238c90869a575cdab37b2ab1a0d77259ac6934b5a8f7dae100675bd24ed24d779aeb98daf1daadb34f10bb5ec22a66e432713c9b367ecd91298cbbbca4e27f03e332d93f721e0878efa9505b7a2660b64370d37bb7d0fdc444580608fa64baae9781ae018b0569ad3a238a55966b72b6acff803b69c15fba08ce425864a9d844dcb562999956eaa059e4cb98d36272ddb340c405c6206628bafe8c34a67c161f4c8d46459c610b08ba1bebc264ee672a9e65b3dc566899727d183804fe02224009a9b1708e364c8ef66767c7acf8049fdc6d20ba24c219e69b4958a2e0706128977fb1aad9a5ddee88f8d7cf3e890118263d92e669a44043b30734f5768050d40ac09cbe8d95cd9436619f5ef4185218564709cf92cf78f7f8a6f2b292c0ed08bee1c1f1f8037d222c76de1b8b5e721db60053801dd1e9d5808c84d82073d64588ad082ff2b20bd32f05e4e0404203836377b8d3b80cb57be27898839d4673a0b65c7b8ac8ffd16c1cda358c9b0a08d94f9a0dd1d8fe5cb9af5a1468f38f10518b21026e50a6cea7fafc7699754572e8df1990ede53f0c6f7af08e99240874bf1533bd3f597588843da30e3f37094ce562cba42e0edf05860089c09860a8e8ffd54ca587faa41f01c163d65bf92139a529752a350e16015c5a728bd814d42d9379e48d52e09294f6369336cbb32f721e1ae920e096171f25bbfa1f568dcaf9199a21c5fc1609c536f5080dbafb877250e4794fa19da950c9790e101b3ae69b92044024622f2e2d0f0b84efcc122b3760f3b778228c66ea7b2befc5184b9943c140473ed40ae3eda7d04711af25131363b8b559f9f6351d03591788532b6a42fa4e64677bc88573a033f59c4a636f7227a7332661869e77b7c6a79ed311f3d9f3f83ee1eef2a9de4c5724fc6633da32ff9673eba7ba25b4660814b100ec88a2db4884595b95a8f23ee5c8da2ae4be723e2bbe43d0bf691d2b460d9ef9e8163802278bb6b033b561d1f55c45b137fa1975cab9f8edee4e7ad1f8e517808e12a49ffb1374ebf75c980eaf5f42ea14a372fdbf62915deb5fab9a6b6d8f70f09ba9533799c8eb4ff41ad4d8e6c61a82307268d6212517e1689f1e5d49407d948d1aa71b3e55ac633d0eee0292f6646ccc2e56d4805ea1615b1c17a61307d611004b9340d3e17c86ef315fe7b804563ed172d33d7d1b3bd0dad38ff4648e3c7a5714992711069fcf4b09d360dcba14b93d72824fa9ce05f1cc284bb628c7cab64db8967728aea388d7d5b0438fcc0d87a57211cfc60b85c77bdf4cb3e9cd7c7a4ca1693058421c034d76c188e9fe10f83f47e82894f1446984873bb1522bccbdb1ed2111585b7b22d658ed18e272bf340d72fb9465591682bcaa71b4c0618f92b09041ff7609f4c3e6d0725c9bacad6e59721106539724d02fc9fbe325fd0361d9ccb0140c95589fdb29a5dc1cf21cde10718f5ddc6b32d73d97afbc66cebae652b5438a19239de89780da5d0f6946c3c372a590afa6fb1f0cd82904f2868cbee5b5ac6f2b2b6ef09de8cd9ca9f63e50ae0d0c6b1a21a1077da6816b78115e4de82ec86d63837f371e4ba533dd28db84a8727a49cacc0ac103cb98769c9739292bd651e000e818f079bc04484dd124f41d5470fcd8fd4f54e5d2f7047948bedb7df14a3b210fde93e29ed05d19c472467005ae561615d4f9b0503ad3023bb4c128c513a68ce6aa0a30cc5cbc1d8f956b594250e5141a1d73300bec80a43b595bdb2bcf7ca7bbd166cb045804c64b6124c972f358f5ec38c4cfd11e12ae6b44132bfb2854fd50ff2af59b38c17bd8ebfa667217d4e98bf89181370cce75300c290767bb3bbee37df8137b8f1156fba685ce720d611f24a8b018e848094936f5b15dd81825fded2d7d8b11abc508a26edcf872293d3a3652eed9a4c5322329efefad0f9bf41cc71f01c72010cf67af8a092c72db918c2cbf17f14dd59568d3d85d8435e73bb041084c607eed84489dec95d5631f552248b6f30e69ba2ee47909a8c6eab4754aa8bf650494831768c9ba837a66e500b92820a95e3e914ef649ae1f5eee896b28836c88643c9acd319a6280d672c6a2566909f4d1fa5783ea392ebac30dae34f86cf48a2289934fd953651619724520bdc7491a7002f7d06271484834d997c207885994c7b2f94db3676da69b7285966ee77b554ee85c7d69739f82d373ab18e3c796cd125d25f91efb897e455265cd23cce7d57a19474b9bf616100149b1abde999abc73ad51d67d62ec4ec8723788a0a8bbcc9ce2eeeb19e88ddccff540c7d76fddefee396760ffa6cbb08d5ee3247f80f8720cf9045bba660611483824429c6ca144061a0fc0cbcdff39d0723c8371691ccb6018ce659a10bd9ec650f3cde65a4dc38230e5e6e97f600ad772885b5f1fef7d8a88d03a4c09391895b7444153829c04853e55b31bbf43258b5f68557078c1a1ac6dcc29d3376f1a9cf454942ccac690cf8121b2ace6fbf4c472458e6869a9d6a4620ec6592cb14fcbe73f22e65b0afce4fedbd5c281337d9072cfa211e469ca50d40bd60f05d1681af61d8e07d3fb1c4839e6fdab310bcad6036c90d4d0bf1be5e822d3c429b57c73831efa69c62e733c9d925673e656879459a1fd278b93d8f2637634e7e000af8d1ef64c213ea376ebeed2c858d409a61e72ad90e49d6160b44244da2d0fbdb9578c5f6bc9bd891c7a8d2a56fa3d12d0903c0d839bc42f2d1a7e14b9c2b71a844f0ed3e2839109c0f7589902c390c2214a6a4fce3a2dc61975e769750d8059d394183824370b610db25cd2a5fd4c4bc295722fcd3dbb767d3bfbe6486e319768483d6bd23fd859c98837fc6106a512aee1559ff1166432fa859243cb2953675a24913c2fcad93e7a67020a5b9a07f992f0727587f3c1b36f14b1a1b217f481df250d85b1e9ff21bbcbfb628e450a6c3d946bc5317f906d52528820ba0d99ddf068a9405916a10633d76211e994b49a1a9172751075059336e77dc758a2d675e0d139d2f08829c8a31b842b3ba556cb6dd9304f998b749cf57e12f17fc64f69ebf28af68c39e4b7b1348cd658420b5e3b44724a0de7dd702517dd758f3c31326dc3e35edefee59502cde1d4ed0e0c9ab473721e1a25daf980c92c2d02f2e96af0506fbbfd898f26ad0469774080c16f009872a042a1b39045eb3f587f12ff6b158a44f4f66c2f0c80d27299406f4b77368172d119f7df082363cd9f298072757fea7f7217d60c9ba37e126c71e0c38fe6c472ec6303282d50d97b2c9cf4d50641a44181e86c3c4b5927bdce7480d8d300ab728d2aaa6baf70237550ca6bab1b3868197e805716d6d723873ed8ea2ff6e40172f22dd49abb90608812c45b6d8dc93ccb978ea75f4d039677873a5dc4218c111510be183972a4de1cb7aee152c556ff048f5b7c32efc33ca5dd48232b6afb4024b7a08f8a8f09d7144ede6dcc9a3debcacdeeba7f87294543c604ad2ffff59072840d1f63939b372666e8f3bbc7f5a684cea19ef7e5ee8fea8c9913a9d594126ef7aec9130271ecd1b37421f8f17c7918303130ffaff51551ed873ca255690d728942ed8e41cdcb7eced6667473fc2b570abf38f17f0cd6ffce9555de644feb7280dfbc530fe14c946c43c1f6e7b561e172f662dd62559df31b25addeae5908029f783e0db5c79acb59e4f9e6a602e7e58c666f0494710672fec76531963fb806a53a34c46bd9c4162f6944914865fccd1b1d13179bde6fc9de05cc020ebb42728cdfce4584dad35c901723d2cde49c9538ffa15feba89cb52e4d663f1efa4672c297434a90907d5df23d3ef93a2c6e4247976c635f96db6175e3023c7f024f72c5f206983d225bdb93cf99541afae81e18c476e4d5afb9b23deab3e1aaed3172fc0afbfaadabfa7ca8cab08820d9af6ff41a77796ca5d80c5b6dbb8ceef77f72923e0fc1857dfa62ccbe25de5d0bb124734e9a512abb7a70f138cd54ccc1e57256e5b7a86d37474029b885a8b786d790861d8563342f43a223613c33aed8cd72e1637cdaac83156b7040fb8ab6b1d9bca6a8afd407d73e9005dff4a6dc34b8104d556d9e86d885cb3cefd5e3d80e4888109246d5574ef1fc39e0133821ee1d72d2fd54492a7c644855d8730aafcd6dadecfdac64b5f6cde40003cdcab89b6772885230911605a81fb8821e77fc356439a694b65cac3ea1225d7802fd299cd36081673e27990d8b3df99fc19872d3e9b737003b6765ff7111018fac8ff28b420a247875505db29295c42bfcea59c32da72da540aaf0d224834083d097b7219772186f1543d94d6d87f5bd4297a9f95adcf9124309ad7d9887aa4437b552d217720d96f1f9456e5b1c32cdbc433f1992b2f16b008ca78e998c61d1f858600ecc7200572e824f7e933b2bc9decd7de34e9919aefc4f7991f71d8309afeaa3256b7280cbeec3d715c78e9587c8ada8537759e420fb3722797970a680fb9d00118a5b5f21cb730ea6bea3a0d88dc95f187a46ec15ff09dfbdbcc4c72322a6b10a23477a9b8cbaf685767bd9f24d27584d3a0b7f6bb153700142643460e2d61471a4651faa37cf1496ad2a5be1f8d9b01ebcf52b4967ed591d24d0024294ec235546725bb442d1f081ae7437c95f27a8efc376f8d35e3d4b9c45587a8714e772b3bd0f7bb3022320c61ab3751ed199bf84035a2bf00211d4d9c62437ec413ab4e9d0726964e8b3d8f2e912406febb55bc0e1776940eab17ad858da985f2ba94492ee4d41855be9a0319c9d5fd202cfa5d8306b6999a870f0bdb4e2694e3d562bb3225d3a6033b476b894f5ed8c762c8f376625846492395a8464eb4ef3f64ea0a30d729a4f129a538835fe6133f152a33d59b9062d6d94c1ceccc80f334f74b373327206ab6359da32effa92239f8de476045b40f54725484d6b133f60043a4b505172943ae341534552ba8febc8a95df1256d85640b8a0836ff92f32f9b3c825c1972143a7ee51111d87741a3b596cfe87f10c0e1bbf7f9abc641ad506fbffca64472f8bcd4de8f72a58f15073c36561d05abdde2b943e344d675afea188b7a3a007207670e78314cb93c27d88da3b55d0c69291fbaa8802c0672fc64d037edf6b462d0748da98462b26bf866aafb71aaff6881d90794c1ea333539cf7a0ab9e0d772a2b8c216e596920eec9269a93109b24e104a6455ffceec0bc1e47449e5554708f5445acce1f6d56eff99c2d830cb170bf79d012ecc65c8c3381bc6034be8e872d065f686067a3d154af9f22b0e34d27105e47bf2a2e8ed073b64505176107c727aeb1abd2272858acc47bb5535d559b14b91d84592ac13797c8340c22052fc198688061364b571e2a753ff520f1ce0ffa9262411be4a22a9eace4a55b50bbb1a246f51d3ca5ab52ece4bbe2003a34e20ca9a2dc7cf1e728932ba62aa9b4a0372254365ada967c9c82cb819117b545eb0090bf5bee3dec41515674796464ce472c1b0e5b04186cc3ca01715e567aaff5c72848af0aa441bae2a0eb160315d8e72e4b3f949e64048e001b4bda2f2b5e6bbe44b54e8059329cab14037e9d10f79721c1a1b363dbae06cc8311a68fc2d82e16892541815e80a0f864a150dde82cd7221f074f342f0c2bc556c1457e9271e13263f7b1e8de2998e4561c44e90c66360a62b7f7576d51d950a61f7fe240d446de165eb8add4ad6f858122ebf2b145a722325ba092234ff1ac3bd8ed3a99511a6fd0190f7653614e67c650a9c9d32320be2504aed2bd27d6a478e8143497879f8b982e4e9ec40ca193b320e8a13167b23288e52105f776a1f8ddae9fc44cd033c6ec57d3a88705081bdf59b08af63f57285b4ec7a451a7e9a8e16d38bd0e3bdb6e606c4fe08749b224b566c12328eeb72a137c10d4a83069991d7098f2b40dca66b5f5d244c9c7faf2a51fa9d3609ae72786db23ac629b1c7bdada96208029d6f2471725da23f84599cc2f6397009f131c3dfe3d9abe11251fc4367123a8ad6c2061fd02522d9be58845b5426a38f600803b9fd8c5d1570cca891199d1a810178e11994b95d182ce5b538d6f376e61672511453caeec266786f95914ae7b7fcc6f258898e42444b80ce2b3f960fbe37720540ea9f14fb17743c3fdba9aa00409a6d24344ae82885f7fb05e5218556c76e1c39345c5fe8af2e3b8b17ea0599bcad23d1489d7f202a343e50780dae6e7a1c6553574491c99d96c7ce0fe1bf28af881893ade044071bfac1ec6e9c338c1a1aacb6e089500ee541f31d984ad0df8b388c6f31b935043e715b0454b63d3fb472eb9fff083f749d866cd5163e8b5c895cabc0d33da2cdbf720dd78616fabbd072f4ba53b9e3e64e43efc592558af7998871569a220eb90a356dac155a6559ed20458d2ae9815861c52780859b7e984f9c3d0dbfe6f2f2f7a3c9d1ea78d268047292d97842521927aec0ba49e69cf54573d51cd9f9ff59883685fea4c40459336ab950225fd7caabeb4e442be288122de33d50846d5fb57b697e4a35563f6b3c20c9617688802687e508da6e143fef8763f8c82ef33a1106ab92915d609e6b2701aa9ce393fde84742befc0d18f91b25e2c67bb3634e850da103f54d7feb9872009ddd250501e384159dd9cb71e945ab30b5e45b9b8511fb60310be84c69b11972adcd32d2179809be3fde58fdf1799097b483e348455c1aa0ddc68a1f18dc2926e5f94d318adfbde181200423f5d33fa9315dbc002a6437903a07f5ee77e2de51e18502a46db9f5b15d0880cb8ff5919beddf6c4820237001f944d6ffa72c9b72ce0f50186cd91560e61979548def38396f1fc3d3e83d69dccba4e9f97fe71072245b309d2b2d1f12dc35b1c317c61f14f8fca27f5b23f142a77d847dbbd9ed3b7e16e3061358fbf8924aad62088cdaca924e541c22be7f8b315dcca33fe89b720d96bfd4a65df599c1e82436265663db6613e6a39804179515471e5f145909573f904c747c423e0c116ff1a0d1a4b75bddcca9282d245d22095babe004dffe6f5bb054c972ba2a861a6470298c21d8b08a571aa7e2f0fafabe89dd29499f1b72b55f7e1b7fbc33cd1bc8b84c567ed668c314c9a7c0811a6633a2fff999f4587206f542ec5bf8f2e47e2413e6887f2c6d6310699112ff51beec9fcd8a7098a772f627b1e06b480f83cfed52e05315b43925da8684085d409f179dfaf130593872b6a52bb195921720f71f8141a276b36aee3bcab8eb7926601a8857e74d1bf272052671f67fb5bc713d6d1ac2cf3d9148f8db7b266464bd53529e72d049caff4692acef9c832582392d486c5648c5b03f162e8d37dc76e6a0716c33cf83143372d1ae7c0a4d1f5c2b6236eddecd05411f9066e89132bb11bfe22f0948fbe32a72cb87d82a51164d19daa18c7f648eb83c97f5d5975b1cdf7d16de9233b6080c72695379157f23d7a55b489fcad23a1c1518d2e6357aa672be4877c13fb23b900b53327474be6d2a677f8d14a4baac6c47eecd9c7373cffcc1323547a1a7993a72ce105debb0ba9761ff8e68329965df274363547cc5a98d1971b38896ae4b797269ffa5998eff53c35cbdad337dd298d2c869709f58507a4ff5c53c4b4b10fd6a7db491a99caaa8fd248cfb980b7861dddd6ad5bff492e69b2c64c91cb555ce725bfdac0b1df812a83ee24f8abda2043bc29e767cb49031b1a0fe8ecaf2559d72775a3356403f9222ae864bb16d310e293a3ab56af5a86eb306ff6b459de62b72bd75eed546663e71634602cbeb43933620de330f5fdddcf7d2a54df15acd8972e40bde8e53c5ba3fcc54bd70c5735d9ee479dc80da366d38580db1fb3e1aa072e240bf3475664ab4fc31404ff7d27937a59ac49a62902853cc4c60131a386c062ee6a5de325e2d5a1fc48a15bddc8ace1bf533060a9a944729b3582b382e2c725488a5605cce2767ddf39237c813866f4ab0209cbe4f13982df3dfa67d551272360f1df0e227c30c19fd0232d685b1d3dfe2ebcb3331d173a18ef301b83c104eb44d4ff1d39ee5a4ad580652b700fe246015a1929f1c8f3a6284d9f905c84c72e0762eb8c671ebd50b9159c6f16453773f11eced58006c58c1c6d4375c185b1973725e4cd7a8804df1481af960f513188a7a744ddf363bc1c6d24c65746c3572325ba5492d1955524cd2f75b3baa5557e10cc10839f0e680179ca5ff3edcc9721eec830b348681f7d79b375f7c5c103edbd1b29941d7c2f969581cad9fe58072deb0c649d2177a0954e7c677f4c9df73b8ddefb02e95313d5a0dbaeea12dd8227f9b8462643d0df3a4b8782bf35ee6f3ad56292d245c6f39b16c0128636485006797a96f47802ece06700efed158c444696e2fe781ede23b24f412c5c66bdb05c9e0f2157cbcc691946935fc220a09f8812e040c8b9199f0744c8631c0078972479e2e64f3810b6f5d23d949a068f847133fdc6c0a67c7ffe7cc8beedd53fd43aad5e82869e4a421790e6be2f107946b65746696c4ba4f2b8961b0cea1ae2f6264052cc0e13311646709a5db9a88e6b44fcc87bd2da2fa2f9de83789ac511c7235c88f6d68c5b4cd7d03e7edbfae879031a05418cabb40de5415da99ca145964753c4e8b8f52c8dec61feb02f7bb9663f36d7eba8dfe4b685789c369db786b726fa859ac1023780c0d8ae2527402d92a9b2bd3d5de8d7ac7ba4af548d3c7497206054e84c8231976b102c9ee9513c8534c346fffeb04b3a22265b124d6482f56dea63f165301816c717971dc810ef5007a25ec41df034a6fdf1e597ef240ca13be37c807ac2b5d48d32caafdc3701b8a9df18fae2e518cf51db233c27dea377228156ca38ef261d6594b7a74d69909eddccd2b4dbae8a05d5c4b9050863e82195d85b9bdb3236fe86db10227f842e35522f5ea22bca2269dcb4cca9932ad1f72085c1bf92fd90cc6f9272099e45adaf8694986f29ed217a17ca031f78a49d2725911d8c2a7c62d2448ef22ccd8368b53cb96e7febfaf08cef94ef06d8176f57258b19bdb2ddac5d47bc37fde5ff95519d8128a605834cea8035f7f0c01642572a0c46051c6180ebca12687bdbf24985049c13d9dcbb461e795a0acd9f635855cf86c86a5a86eb0e5706311c3507938b829ca2e52b6836294eb43771479129e728240adc08bd08053d2186a6f68c1eab70e2f8070cd7758d8be916402ca62df7255ce09423e7e44c2f1a66773b9fb749edf9fea960e355edc1e0f18bfe22ef172bf7a8c7d2c9f61ca4ae490d096b7167a7e8094f64f6be9995e618f31e4bf6f72314b9e452244e8559589f9d4ce42f18fad41b90345115c3117812553a7a3c94a4c732ef225cecca5d9c6bb421df6058789c8cee9354a6d3354dcbd6e67cc912a68500ce20c9d296e62637aa9cc9aa2fa7185c1aebb35ca9abcdf968d2b2ac45fa016990cc15f7c94a0f1a5c488a1d08ad78ebfbf6528266e0e5ceb62cba29b72e34e4ae6b7a9b566c6d2a374606a8e890e7fab0a5d994f3a796c85bdf8d64b4b89a21511a6d7e607fd1aee007ed819c710335949e590b75e9d36c48aa273877245233a445a4d8a109338290abd3c8d2fe2411d268518023376320a29c618277216fa28a67da45db99e3d381cfa208f7c703997541aae19e5f7bbd4283187287219fc522e3c125047cd5db09b0a7b062699cd2c144ca6d430736f2e142cdceb223e9d154fe730da99e145a0f7bd808071c4e1d6fc14547b4670242115d169d472ccaa3973ce0ab886c27a5155755a6edf07aa8709a974ebf47b78c87a6768e31e8333e668c7affb5d0cad0dab2f9542612e5cae2c72c55c0d1f10102c7c666f2c379fd5ec1b909cf522bb47bad8de37dbfffd69101fe4b9a3750da2b9ec1527722068ebc7283787b1ed64ab398d80491531c31c57026637059f31d89b59d3b5721e7fef34dc82093d903c64b40d20ce2951e0b84bee5f21b4526f1eed63539a0be62d5f1faed587d6d7f6f160ca84f98a945d3052ac58e9b7a136d17ae323733b017a65d1d1bff08a5444d263a7241a2c0de299cadec3a895df7ed3c48f980c6e183554bdb0b42694339d7503e08e146301a5572fd5e4de5802d9e46a9654887281809aaf3b57875dce2c0fa0b8950d6f28a569c67d85d192c94bf8b7239ec172d547dff8658d3e4f237f906397c5419df40f2a3067c9a67fd93365a8b20dc3720a2a38646a5fba7452b22f6e29f8d7a8116eb48fa58d658794387f6515167821d68b1bb0602c01a1361db6f56987ef798262e7539e0f1bffe8adc5c10d26e672173a3280c2cbfa03869d2497679df47a3d930524a33787ce4b60be94cf657672ff19a2acdf42b1fdd5eaeb6dbf7de7587f7cdc45ed8bd3079151f80c073e5e72f75cfd64fa2b2af4ce86a3e74f91b1f161fddc640d80f01cc994c979adbac072111a52735999ac47cb5ff79cc286faac74af2d26dc185f1f0cd2b60a97ef6572008dc7a8fa82416c6e986f1f670a7fb51dc5341b7cd6ab29065320528c4b3572fbb00649ec63a7e5c1749d1765e00974de35191b7000d50032d08fd3534efb1646c9a6c0e491086e654e954e75b4cfccac7dcb8cf48803463e349c8592520a4547d4a5d56097395527fca6cdea13a14bfebfd1f1f269c3272ee7fb319273a868471cbf78180f4cec601ae91e3b0a260fbceef48256fdf337bbc234cda2c53572f1bba84a8b407e53397e51891961a32388d6380e36080ebdbeed05c4fb4a8c4b4afeea157646f4c00974d672f5e2b99838eee829421314f46576c2ebe3fed272621672e5a0b47ad08ed27c87659083686045b7f48e28bb2576c80c0b51895a72e529f30d6de464680ddcbf263b622fa16722ac5dcd8c747d70d82e9734c8637237e7fdcabfa2d81150327064d3a036f156f7cbff3ae446317a711f397023e972c72330acc6ea3120fb06d167e7ee9f00e8e06e75e3dbd30e550086dbff9aaf72bd2d4b8a0f7a0e88542f7597d178481573f2135f77efcbf12da58dc141a3f47245bb26b13615c13bd6e8ac3a76452e1c4e7be676daa3c44bf6d5f2fc242b2930e3605ccbd762c4ec1e7facc11fd5356ab436adbde61e31b77689fde11a936f2213dc53d498819c00fe83fc5ad3ab42adf8735ff26d7d8eae6728b19f5ea4237202015568f790801e29cbb28aad8106f51bdaf9422da47c6eba6fd82ea26f207229ee1fbc03ce639b1342adb91fec9555ddedf1dde1eef070226be286115975174c0ff058db722232b0099133346406a4e2ce9cb311c65461a8924588e94bf97049b8e6d36cc7a568704028275101bfee309dc3d78b0e4cf310bcf7a115df3b4449df616abfac742bc109fe76efecc9e19a7293951b3d798642cb53a827b50b7240c66bd71fdb488df0b3d678a0a3b6b08392b2b5b7a01367bd9cdc8b32c50746c2e45d75e5fadd3ec75bd727f1c3b58b53118b6a7b7907334e5e1a2b24d2b572253781b6b934264a5c4925c60143cf6b272d4de4282dba6f0d1581b2bc948a72f4cef4224f62ea32e67dcc17130dfb848076d7528739d5251af776e73a6e8623755a8591f0e187278a27c10427f400c6bbeebd8a9d1cbd132b15fbca953d9001d68999cd8b74cbd7d911fd8dc8cdf83d0cdfe5b7b1ed89cc435c73eeab38a272d90f7de4534ffcb507382b15b1861b2801ac14c12795d06cc148f3f15763c8724d2b3eff3ac4b192a9d4e4b0f700d38f791fe0fbe242c10197cb5bc32615f543d13f48dacb8ae1ed3891f5697039f820d521ac2578060373d18d3cb3768a9a724ec8666fdcf611497a9095375596af21e9d057c1c74266c961a2f0703b8a3d638edfde971e718057108fa5397e5d439ef33425418f5a86d2aa4d2ac874f19472917f041ec53e9c80de19aec9014cafcace6f3a7910233871ad912cd84f59da3b277ff3624ed9a54df8042a033565c43ed37eb48e01d7233211cdbc2343c598721d686d03b1532e5be1aa704833681cc003f8853008271c58f79aaa368e1cc51d6b8d5fcf6d265c0bc12a7c8736db5223356908eda710a6afda9f62b1242a5272be7890a9de2a3d5e859a945c60248667a07038e9f8b5a53c3dff468d582108725565665d395203b92ace207784c53934b0f9f278bff771ca6d420787fd037b7229b43d9aecafa2770f104c77a6c3899693c376c82d704f8d31925389f20c3304ff76de54225c2d6c4826249a617e8cd12275bdbbc38c0ed97c1f5512b34dca092d74c52c6ebd128874e2bde4604620a0106b87932bef30e5f70c5baff8229d37d77a173aaa056324faea24bc1e8c4d95f7d7acc94891f9453f21b8813d788b720ee60c335d61875b4e478482796e8daee6b91d6e9e2faf2c788fe6a8f76b5f72a14a390877ba0239e3f60965c9559ed95ff0668095f0b96fa12972b98194ee7211263a766cd0b3883b2436111cc1b01b200361a4be660e92804ef4a6b25e04723fd3a7c5a502e548d7f57cb76787870b7f5c02d66efee5182da3c8005ac3202621c744f74c8522c618f4ebc2216c1d0915ab06c44dd420455cc89e517d37df50b88bc3da61042c8dc8a30e89713fcdfa5dc30b8755dd5fffeab7c83f3dd3d5728a53d9a2586789570d1eec14dd6e5e72f76fbd33deef27ba97763277d8de00726d13ea28ad64a0500b0edda6e19f16d831692d8bad2bbd6077489a15e309ec53cf9251bdafabf991ac5ce7059116a78855015e4413da1e7d7667a017d9ba1c72ee6a60d91aa6d239b2dc1086aefa344b3755fc6b018a20ba1b56d144c2566c721f3fdd2686b55921ca7589543cb1ccbc83141d5aede3bd973cf83521ac72c32eb9e25c78567a0b0c3a04487d120af648d1a9c16b8017ecad66c7121f185eec7235c2896c50ef6d84dbf20a6dbd5e1be65685b0829ec24447ee9b0f91dd649825083602c1f9b38671230ac83eca9d5e4b339e982e90500cd4ba23a6435e2cb97222c1a4c82b26751c06362a29a16bb43c19b11d6bde8d23ca40edf65238d56472ceef319470f9fbc550a8e3267b01c4fae1b1a5f9546f447ff57ea24d6932b37220bef66c1c2c0e0d19f4df997e9a825b20c14c735b33c3b08eb00def1b26337271782bdbc4acef327d65ddfc9aef288aad517d4c5b244a7dfe2100f89b4d5c727486ddd829ffab487349bb8bc47b6b097dd2193e762feed26d1287b17934877253e2e495854326310ebd6f98d1264d6eae88935e2966aa9e9d24867d35b8aa38911b5f6fcfecb49c3a3b1d0256aa4f64d834a318c87e1f6c2e37696b6d4fa072b81a64c35824cbc5ba983e4850ab3adadef97b3dc8d843d58da31c666e57cd72fd65619b97d5881d817360a3995de611760e9df30b9a7f6baf7422cd0dffc0725bfeee514b67369f0c6ff75a6a179999053c5c9a23fe27be70be40cd2fb970723bb95eb67d15ab6d041d69068947ac3e644ef5ce11a3dd22777387b068a49312ebeb101c80b019703b9ffc02dbaa965c6c15d2a264524bfa35662e99b26fea45186577dd9d0a2351445b790ae300fd9db5cba1f1fb2bbce470fa1b1a7e9dd872f89468e00fb30793f19c49cce568efde2112fa1d83dc5916af373abedd1c93297b34ec5f735b485ed4888e09319a73eef86a687540d324465f9ea3815e9b3b720dbc9a0ba072a75c447e1623236a8b9823bb89e2c82d0ea6b6809384329ae07271cf5b6d4be58acb3857db4f4cfa663f6f736d43962cbb7230eb0a983b87480d00267c508540429f1dbac8bb6f0e5c1a06ab338c0c8a6e8200520ea647b28c45b57764611b57e2143aad3c2effa213963b7f7fb385a9ff005a578fe36c8b374f16718bdff64c56cd67c092be7f5748f94eb2170ef9ab4495d545785b5bb77e52722048b888ff3823b2a38bf9b3522875fc16483cf1e7877e827e094047c09172ff9bcdc161c3b4fc35d7e67cf9531d0fed9bc50f0914ff600283194715eb6b4c5f1ecea9bfcc61b7344832150e6cfc1c9c095424e23de92f1ba7e1cc03b3f672a06d3d07bd4e184f52206237400efe86b6b635ed40c4cf80ae03b520dcff1272d938e8f0c4b3658b9275ac47aa5d25e71f3839f92ddbf110b88a3eb54980cf72bf2b4902b1f4365fcbf735d920a76d3d7abce37699d62495c405c8b7fe23cf5e0977c47d462dc460d91834b4a0f9233229939c6f6bf18a98fcc535f6d283415e386d07fb73387bbfc0bee763a732c28aad821bd28e886ee1faa6301a578cce01ac1c84484f16a8f30fb59b7b820c7de23b33a3f47886851dad145bac2d808272bfb435a357815cdde16c12c4f9bbfd080bf9e712dd54bdbf0b76ddf133196372d196221f2d68840f09044d2b3dd8c450e0545f9c80a9a75a197e8afd0ba3c363e5eda7709ceb943441d7c871a1a61f2e140abb91f049513996457aa2cb132c6da6520ed22581a0490043a43953c9aed29eeff567447fe391caa83832850d004b820b087cb16d3d86136a8d3912c1d38a647a44e943cf208867919506e08e48722ecb399d4cf4a423ec7a287b267e6290257cd07967616e43505db585ae4c95724106c1ee2c240fc516050ec116bc3751ae9ed4cce442d04acbf9617f196c3f39882e204b076a13d8a96b3486134c41c5f8c96a7ed9522581f408d7c45fa6a2189ca8fca7b19849ad735464f772cabd59e27cd1edbb7579def96833f0c97a11720d55702e7a4ed987d8bbeed164c4ab56d95054457205708d8d52c82f120f517275383a99b5ce7504f0e3ff3b01baece26870c8451f8a63e9f125dd3b2f9dd766505583a464e4c689ee30f0c98df9fbb8691566df686d2fa665ce2ccd58f29559ec075584d0555d67a3e2d47019f084a062884adc1e75a05e8ad1bc17708f0072f34931991c1ec16b5a18a3913138e9da5729c3c639f7dfe3fc953d3a90596872cc9e674d539bba01689956f2eebc5c7ccd3ef97ab74e2e3e8a377d39d7d0465a9bd64fa7c218cd5fa1172c2065854ab7451333235d4c2625fdec842cd7af1762ddaba09802698476483725a35aa2f49cc35390254deda29e4e22865492a19272a465e84e74f8205f125d2ce40380479891f12ae9ae2c6e15190e63a300c10c43254fbea081633e501643d32a3808c3e28507ba0721dc3ac80ee27192f0bc54721029d9d0fac2387f66f2bb699084c661f6dbbfd1c3aebf7031f9b6d6152aad03c38f6ff8503ecb99a165d0d810e989ae8bb807ed270623c705bf4bed5242f872fcd90bce7a521760a76d6fdf3e1ed5bb3bf886a50f870376d69531ddc8db18", + "0x7204a4754498e06db5a13c5f371f1f04ff6d2470f24aa9bd886540e5dce77f701dc67b8108505c5bf675014ca41c819ef786c1de2a8099f6ba4c79bdb87da6055fdbabfce532894fef0c2db87a07ca982d1743be29a773b3bff5e6e59c2e298f72463dd5d53f5e059b0765cc9abd2b26a843952879df2bcb8fe88a2d09d5c612728079d9acfc46433269113e3858a4f22d7a92de1846678681669d38b1a5e2cb7266af98a66999923431cd5d53e797ff0fba6a0054c1496c3afb5564bcfd19de727bbc74ee6425cce0c1bbf296d913f6aabc7dbf6947fb984d01b8421ca684d87244a1d3b5d788838df7bf2d24afcc411db8ad3c2bc6b4ff3d964655a5d5e55e72c62dfe4bb029af1502597969500b93c0134f8cac9f66594aea7347e21e4eec4166541a03ccf0be5c7e24d33e3a57bfd0dbbefc8ce28714d78a369bb87f3d1447f26f9cfaeec65cb142cbc158484deb1b82e28545813459ffc10e6cbbf855dc72544c4df4205eec1b934b87518318c79e3abf9e706b80fb73b19081f344d7e272b1289104d30c3dadacd25ea8e28cbc6d1da0353f346e674b8feb4f1980d19b722e5b0c197590050d5c20bb2e3d5369763d3e7352486e0fa57f6c4dabf56f7a350dbf01e73b24c032c0469c6729c9fe210e2419ad65e4f6848017e18f5ba65d72f3733aceeadb4148267cbadfe7b21f12fcf95ae3584227128c74bbdb14040b720426e7e3d1ea6e7d23a4bb7bc973d46c867c53464e3b500333b03a4fda717857ad21acf7ecdbccb5c62f016db95b5bc9249650b696f69bc53ed6a41a20b00872d8fc88e52885b9b8856ab5f0868b21d36b6498801b70ca22f836ecd5713a5572e3f85ba611ef0d69d3ee322e4d82e9565d16b9944d80e8357b288a5ca9681f502900ea5181b7950b8b8f606688a7e32793d2695c49e6bd3cf7947465c0d8b172f6f7ab8c403af8356794055e8d3fdb41df400e8bfd0ec36886d6920df17fca5b89687c28a43d46e47c20c41f0e626fc71c848f3fac6fd8f6f6fcf4c328efae6a6d21212edc8b79170213d6eb89014e8cec02f869b1b735ea8054a872181009722405f9dafb4d7db5626803c1dbf3716957ac20bece27991f9110186290915c725516f6747d6687f4c748989f9bab899ee8e8c0e320574de9ce621252d7a98a6029042617dbda870fd147db91573f8b50e1d4465301e7d0d1e711dedec7a098491fdca3a66067d6fceb31ad36dbb2fd92c997f744fe7af340eef510ebf0dc72722fdb1354b9da81ef977a52843d1af8599776eb9bd6529b3153cfe8f727fbbc72c4b20539a45ae92f1101902c468e586254808560af368d2505bec1b22d9a4c5039b20ab25b5c8e17a4188d0073fa57b30c20da250b7d97c60a89b85f0aef6c308939a1192fee65a538e775bf8cd82fba17c144f6080bbf5bbb910dbbb8c4935d5fac68645ed58c7b226c3c275b6bc6f8a8f8f80282b13562dea35683d295a2393629379bb984c18b1166e42eeb264666b530bbfdd3449dd9758237cc517999568b57121751350ab7019a5feb8e959b967018250829783bce3d13452ea698377215048f10f786e606da085074a81121672faf05d8d706993e1bf12d0f6df5ae7234d690f93495bf1aa0c6b9c620358ca50848f157b13f016f297100c07f599e72b6485a7905d5b6077818be8711444b32c9873dffb587d5937bee071892ce9e72e9dd7536d4d9e5abd349ad6c4735964e7e68a8c6005f77078b7d21c0b8796872150fef2e9f5af0a62de63be673ce3919f794ec5f71144d25d0e0bb517c8abb723d72cb93f9aa2b7aa112b13218eb8f524b8db1bea060c730efe60029ac7494727d9b8ff27833f5b9b7c5a85e3a359736884cd6081f1461114d4a0a535da1810376c6cf106035d7e198c1428e42526d1adfc5e907fd1885d4dd63a23ee45d2213417e5d1e61635361945e8b81e124939a1028d500e15c2a4b33f056e4aa31da277b51d8573e44d147fff0003ab828de6613d54e47d63b03c87d2bb43749015961d4d15edf362a352810fb7e0ee848e6232097d557d1f70634d7e39ba61b06c872b860b33d8b718cdd28ccb8c8ca4c35100060e1fa94d4f48921f390ecb2f8c14a33c33c27bc7b75b78a3df72112be1390c2e494e282b6c4cc1bd12737012d3222d346c4ab3873ceb4900c611003ff2b55923f08b4ff72ec46a3bc192b6d777210a008db3649e9a9487ff8016c6d3e257bb759224f25d88a300e5e70509de54666ac5003e1afc51c9caf62dd1c78c9b26460263ed73a2f675a09c6427348d79a285246b1be213c2983814db5116a94419f2f91149ed9fc39f29ea2afb15486257201a68180eac98f4c38ecbae2d3b789d75ff049415bde9317125fec204f62bc72f22a92b2060e5a312181a33d55be8a9540021fba92d309fae96d248c2f4d15724788ab1b022591bdbac963149f0435f21dc5ef7eea783de58f3e1d7fe882b17276ccdae0ddc7565e79547515ad87b354c13f16b2534d3b2835489f76ee57a84d07dfef7423f608039889cec153de18d62b3bbb80d59cf73f669910af3d79077282c4e0e0ac792b3a51fd7d6b459f376bab1ecd63cfb9963c40a4dd416d37a503b226691f701b9c211cffbaeb23ac880e28b8c46eb0b40d34f01bd811868715723ac015fe0c90ba9665ff231040713c20afbce75b4e09e6812b0b102958f72f7215f07a19522e5465f5ba15babb6234281e8fc81c8dbb287201c19a560d5e2872acb1c440d4597edefc84713235f2985c699d7c82bde0bdbd21f475f72a694972191588900b853e16ebc8bc6ee04e4000c789b73792ae9f4963a96c4980c5a2531019bbbd951aa7dbae207d88a298be95c613d3024e4059d5cdc43b29bb66840ad854b6ccae894802f7c0a6b0e2ea3b9e6c37ffbefeabc3cdd749948689d5de45ff13aa24722979c3e2ac2c525efea7591431b21fa16158a142619116ba87b339cc0e4ea71612d2d6153cc1e2159ba31a3735d023e3b972ccba8eaab4077c1f1ea39dda1d3f22674f2f30554b9e3ba0ef8a5ec74c83db5cc3feccb6c1ede0c8169941ef30ba1bcbe5e515413c00e88d6b51966766b2ee3c64c1e43c061cc020246e5757adc61515534dbe30e90047b46a9da535bb40bf25c1a10b98a2c9826e721891f11d63bb0a144e719591ed3144da8b6c8169c96a09ef6d6b873320bf9f39a17b131bda4fe44c26afacb4c8e3010bc25347b331f39f0e1d7953eadff6e031f689760d7c04689315a37f517cfd363f0610ff5a45a1d3362e3d1c99aac8b3726aeea188811faa87ae78bc4465960a2e6cd3dc0d5ef87b7bfec7aef1bde05a6af6b8ef8714e9a15f55e6211472cb4baf423b6f512379d8da2227c311e323c272db7469d018290246f731f5a746683c601e96d3f1a51aa860e29d80b99daecd7286c105854a166624025543561d70a631760312a292dc82562d951ae89ea2b672c4d3b60a5d1e41161b19efe6b759add6b64c966d6d2e95822fe0b248dcafd15367fd7bd53c878a8b731dafb6d3fdd0a9fcb22c21b9ef5badb008c12613ce06726897d1272b9abe6cf0007fba825150dafb6de6854aab55a73a76d1b6fef42660fe96fb97eb87364b6ab7736c59f9f6e587cabc1fab98b3599f75c54f2294764ff82215efa63c0a69f8fe98681eed63e66074e028a0dfd5c86de20c2da94ef772b58dad140e17250d00a1e036001cd37226ae59adc4db8a4c476f0d684ecf02288ccdf2125e75800179ca4111743fade94e0819f8fa9e10c2a22195122c675e5c0f57c7912f8425747f59cae4be826e53428102f63208402c0fe2543c626ebd729da7be6de9f001e0e3020dd25253b9b894d1b3a7bd4b2831f2cb39229980b13a8d45a6d73f5d7460050e440b8425cba6fb550bd9a47f29e7efaa2368a70c9141f63adf227ae1a606072ac29f0cc200323fdf74569433a24d5d45d10bb60fbe72697f491b93b7fbda060f49464e98f6b7fd4a0c23b70cc942ea1ff40e3d9a54727c817e34c3189ec81e4e6c18e0de9cc97868f0edb0cb889f136c6a0f8e4c0e72202d056514dce7386abbc7d61085590fe07083e5a24660edb5445d492be8566860c2437f6660d8c6623b690556161e7f875d5ae2f947e065673492af7f0a2f721d2e19a8d199da272b266c5569e9140d925cc36e443041253af7b8dcfea50b72114601de8d643c62882dde792ddede7e6792966b2cbeafd5c86a6039a6e70872e8e6f4a2235a88017b7c4417b243ffb074a77e35168b7812bb8968cc903fb656758c9b1e74b7eceb56bc93b4deb0850f96b94543852107753ebcb32a8b187d1c24eb310f5fb422c12b750f8337ef911a46d41c6e41e830c0239e14e9aadc0f72246732a6f47079f3d48e3d209050f834fd4a7aa5b656d37ef937d962594d641a14139abb20c3627f5f992a40182dcaf4a25945c737cc634ec3db936ab2e21672a5fc807987742725dae8aaad6db48517b6b2eea8ad4fecdbbd00e5d4ae27c172e357a419bb96ac32d182ccc0006deb2a1ee833ed43e1bf06a2016c1928d72f72355098db30b4b590e5fc191b95a91f3e0db83d7bbe9dc74665cdc85495e63515adc66ebf8784cc56892b4a6c50d9a3a642f155e425dab61f2d57498e262e647207a65ce52b4f07038ee8e7627de8ab0f224e4dab081ae8ea0682675866ef4d729471050bf173fd0244bbe8b378fa528e2883b69d09c23969ea8ca5e91267a645d497c861b30e5c642d7c4dabb778928b68490e4a3d078fadda6553c17388e70bd104d6271459a2481fa12136f64547085aba6602b3e91aa811533c6ee835b168067f0240d1b6c546974f91aa2e45820b50a7c787ae2e362a1db1ca4e6a977e11eb5f71b3c24d220482377cec86848ad027199da7e6245ef69b6c233c83b82e701e2d8d91625fcb8cd80f970bef79c981593bb440886e310557412ecbf4a6046aa154e98384629de25e8b5d4418875c6e8a370ace778d263249813abc12ec0d7203e19845d3d3425fdb2a3f97c7881b83ede703719bbf1f0b36197429bb582040892c2553c140da68002bcb599e079567bf6875ca315e972ff16c0f9c7cc8aa72b0d8977a86f228175104427f09660ba35891d4e4407c95a37ba4275756a62672425c8307cd2ce249cdd8b8a0631605666a68041a2be2db57d81f3f9ad6f15472a593daa11309c58c25a0307f0afd4f7d0c13b756cb77446cd95c42c138c3b6724a58c4835d4fb55e2f0f9d1da59687f1da73c39139b50be37c36ada7fbb9b3722321da60cfbecb79847096825e97d3232bb91bcccd17e9ef30e613e583fe3472803faf4a75f4cc8bf7b5a5001c473120c557e3aaab176fb7041badfc774624720995f7eb955e84eaecc39048e37dbc16879719842d901dbc7d6683c7f450a9695b2f9dc41d37d9b4d4b1a4a8b1186f25c22f765187e6b3f1cbc38ee05103987230882ec5a82464f7dc95208ef6ee5be392aa24352ae2cfed5457e805a243395343e46663e8524712bb348238f95bc0723ff49d9b098b6904ce672bef6ba3147240db3adbdd543229261f74cd5846a650a66c55e0ad4bfa3abe6ce2b75cdd1931d0ba4e00e8479b50838a5883a9e322f3271536a1109b0ba219df866f2e0c5172fa5b2d3ef9ddd1daf4fac29cba9514e73948144dd161838d2c30b8d0aecd2872cb306c391cea16f261624f0339eaa1aa9706c77557756c3b257da4ed9cdb6b726b550fe5a38f305d420808976404ca27dddd95ccf233a6c54e9bdb76ffe09e72587a6f136e5ef8e8b519f2ca388ab9d3c52166fa73947833d3a80e1e8bbfe072dfa40f3c45ed7339cd709596899d56cf8e01c8ad37b96e8951979b36d6a8b872d2b9dcaf843607a32fc5c16fa9167cb18901608b13265368d4264ff49153c955511be1310f93c50f3faabc7e86fb096f4f6b6e50e56cc89752368036559ad272f56d9d84017256e025e3f590aed2a150033505ea449f19730973485fec7faf725346e3594abd07b4386a5e4a5339380a71981072ff41681f8afe9bc00704de7233419caad802710a4b781bdad09a27db8825d287af9d2a526cdb207b7a52166eef938e23bc9c3d1012802b18e73bd1d61ebc7e6ce87f88ffaa67500152752472a328160f3e30f548c6f9214d63e7fc2ec19a53cb0f7c37536743d66b6e4f9c72585697b05a0ab77da9841004c098b6c10e57d8e4de66276bbc7f2f7a21042472fca0bb8a3bd0befdf153403b6629832b90d366883468fbc75d8ea72b9f892448c74ac8bd1d8ffa853a77e3182aaf7fc93cc24c4dc76a77d12b49950f79cfb16e83ba4c826e9e7f215170f9d23bd9927ace9dd38f328334f6434d59a23cced972251cae5706d437929fcbf07544a861248589d084ab7c0d62d47b201e767605729bb3734d46f1a33f5ae1afcdbca268433633e4422036aaffca8fa0086c0530085ba5b28774cc823134ce83d7d8d329470f44ec7863a24dd6ee47c50b4771eb72fcdb0809b4ece5002adf7985ab4bf45ced13bbfb05df19ee123ec74cdf6d5f72c19a1eb8fa72eec5fa035dc15f88b87a576a3d22a66b9fbb48027286bde4d872c1e4d3558bff185000f57a4a876ce9a9f04e8b15e109d311f80c3095223bb5720f58faa968deb75f3cedbbd32742bfb6f06878f36cb088cee6503014dbd70453db21173c2f79d4751cdb7d0253543adde152d20a0cdacca47e9c80c2ba8a13728ba8495339419b97177de4dfe27ddc5d220c89019df8e698e1ca56f4acb8dc721bfc3d4166dc0037885ca4bf85bb1c36111c24811750ef44045cb3d82a380472374da760da2e61ab04aecd8521915c9b0109c18277ebea4b36b561ab10cc5e301586af7bd82ae1a471fe64c28950066f86166de67238281a2f10bb87e1ca67603ee10c2f42cace79d5808c1e082bd61755fb657c5de7652adfcdebe06d38530731da6ffccbe702ec595908a3a4e3fa58637791109b456a2f392df5c68188a41f3bb80448301e98ae55e319cb76f7d255c156ee02b37ef9f471f354977f270e72295fd7714b4e7257f446c7dad2709abb40c55d6fe0c865b3eea824705fb63b52ccd2663f22648a1c8a070ff213b9e56ab438594f19bcdb2256ee2f9f9ffe295ff6f9d36873d5f36e59e66f3e3f1ecb1902fdd4620dfc4bf998a88e748c3e790e1cd60cfdbe25cda5123c13b1296f82f9a29a3313437fe9b129d9b753250d385f3b565c85b5f1e46a8cdec2de2849e50a477b228985035fe30d6411161996ae00e0d06dd7a2139dd54d5451d907707d8aedc71b8fa5d39405ac95818edde0273ebd8d8b4e7468c00e74e1458c3b7ccd0d019d9da6557b441d903d76adc85f5d72a7bfe03ef84f0febd7e6e811662d2e8aed2f7f3943c4a9b1063d19b903ab33728294feb153435613ceb083f6a561d3bc8353ee6e5948e89b7e8a632babd41772c881250984c5cdf4529592a9f84d222ab1de62c600e48e5c53f77bc4627ac4722d0aca458c4de30e8ea28e6c574846211057614f501c2dc218a57d8891cb16205a5a8dc8fa045cacfb3b3a546dee1ccef24e0eedaec237dfce6ddcb034c73b72bc55f2b5a3d2959084cc990313fc095966bb48bdfad9c65eda6240d524e9e45b62fd66427b983929d6cef3e9f8647921c34e863a1bf2f400e163e49a65fe79088620e115698b496e623e0d46dde4f45a8af9e432e36107a8925e6948baf25c5fa04bb9110f163a7ba3c6cecce2ed269bb1318554166dbcebf3b4a48d024c113eb3fc7d5ca48aea3580b8da44d188a1d7d5e2043d7d566ed4b7df6e540668ca72a7125d7bcef42c7fa73322ba9e19ffd89340841f8055aa048ebadeb9eac9e32f13341244b42b0e12d88d93313c404f6020b3b1d6b5ed2a89a1d0738e4ea9ff721a078a001dc44fedd67fd652c562dde767f9800571c937f292fe43aa8b4e87724f108c504c2cc018f51dcdbaea3300444628aab60a1847872ed2fc790ac66a72f4b6d73d73239e4029c7d256c261f6aeb1233a105ae8f8df76ba40541e9966723ee1db46c2fec6f910049c4019fc8ea58edbf5b129e4137b94c471fd8859fd729641a0f06c293001e352b94937eed68b9224a97da1ab72a13b48f0b8c90de972fab8b8f5722be35c1a461fd5e4326f3526a99c86802b3c8a63a251009525413f91183514efd541c32f3e63580fdf6b09d83d7aec0d2a1acae76230ec47a8c872244f53455de02e784c05841cc1a86df5faa767115e63292489ab07604d5ff57216431efc65536a28db1e05bdb69d813f34957fb39e909781b8bde70ebd76f872689f8778e8c70481d092702c0a99b3187893d0fec6fa8c28c059d6e9760fd372024b217eb8c533acb2546fe2d1b9b667f570ea6eee699a304386264ebde49c44340654e17ff6716f1c1a2295bb2dc1018e549bcefd8a45df5e155d6dfb740439da79011b9609a8a97add48367913ef933596e020a64bc1f67c909cb620131372b82d5748c848cc904cb6da8d0c4d698887ade4ada931a7f9267e656394f4cd72977b35aafe623da9a27f19085eece273904a45f692879d19c2310240d6afd96ad3d79997ae448588dc3fb773e740c705b2aafa5077dfbedf9d900078810c7027c2b214e97d76d3667a04c5c55cd923c1e8589933a8b95444f049dcdac8b0d54bb11f908172f902625f1fbbce99aef67b0cfea8c50286fab192ad156bf0c6915cc715a4d179fae965f94a7d04452b5f16fd8e32b61fb5edae3fbfa5fdf049b6138798fa35f88e1f9d76e9cfd39fb23a9942a978b1c7dfc5a69e4b0ad2e3ec1a172ab5796e5feb9cccdf319df3dccf9d272c3f7ab6c23337ba8294e6589f983b72e7f52848bba42d19e4315e8fa6c70ab6287d0eb19550b71dba43ce28a5110a16e3b0b165393ccc66a850d65a074d96f87aca954e7244a6700308adefe3da0d72e4b95c660d495059b345958a5b90b58d287065b055d0e2b357062abb7ca335728dc3f402c6bcd0aa5a079509ada3fcc0a9b5ff2136c31f08939e662b36fe9e2a0ebb7e7f1ca365db0ec6a416fe81a950d0557c39b6c3f72df2fe1f48dd757138b212ffc504b7801d4414d5e48376db6d2aa89c0a27ffbc570e6d3eba599c06722f0fd6477fdb342f2cb238baf7eea3b6a6029a0332ce1096e877dc013f47f8725e94dfdaf24464af20df182b74986b3d62af70ba08237b567d0fb79fae57230ec210ec1cb7e256f5908c601284e0c4ff3202fcaf6cdcf5b5d60c21f4df0da9720765373f02b8c0e8fdc0ae2688432356443816a8e9a75028f64c487393673107d1516ac73ff50f5de3bd7a8d4059583b1a03bafae46ad8b6a6fbdc9d06d43872fd4b475ba61d42e59507d8627a12ed3d9a57e2fd5b220b385ba248707c2eab3e04002048a244c9ae072765656256a56c8dab2475796bf7b784eacf123ca2c372ed5a177b600308d3790ce4762397e76a86c07842d068261d48f028e05b6b0e7233d50cf38642f8b8ebe133740ed60975d08ecc9d1e6d1c93a10af064a69e98725394aaaa8147c2b6984d32dfb683b600ce3b51b72d8adbbf3f219713ab514a5a2214612cb9a5fa05e2e13bd27f795595b88d1d144fe9ddfa3324db15bdd964728ea03124000d7b23dfb6b6ba12d5fc375c59bb8f0d86e8b0fb3d7032d2b7a072ceb55fa4d238dce00913da3b19c862dff39ecc80173347f4e97536c62d2c67040e2250002ae61a863aeef3b9624075b61cd84620b09f004a62fefd6a24ba997204a0c9dc4314578eb5eddc076a5a94f4bd9f35ea948f1b64c123abf1b1547a2648bc29e128f0b7fa9c5971a98d7ca2190d0ed6787b3d3819c7b7a999e71960729def0e8f65f36002aa0ec69e92662d008420b6f821679ac43fb49912bdfc1d72706ec09ac0919ef07c1adbf89d20e6420d21f031850fe7b6470ef3af5a95147288f364f9b48e9d5c9d79650d0fabb45576f4414271c2d51bb7aba44acf5477481c3dd5836db486ef7e9d0a4904dfc1ee98975cd1600550b744545e65634be25b6a38a3abfc74795c45eb9a802df8fef1770e18751c516cfec333d01250c18316ee7dde13960ebdadb637344eac3ab18d6619965304af6df9dcc82b7c0e92e9723b42270d197b9b287d59e03940afdff0f263deb450a2013afbf0002308e5c9720a3b35544bddbbcca95a84d3086cd07d92754ba78334878f813c7bb2ef72e3722fbbe9e5736be9066948bebc415a9ff9c38e66336ad097c2a7120cab4b638d7238a9d684775037ed2b3be221bf7b2cb8c7f76ba21860ca0e11c8a5516973c572ca7bf51b2da201257ac810bede1b013a29e82a42ebca24ab1f56f4ce3de59d55aeeda2c778a3a501f86e862e8bdc6d5fef9c60525f1a63796f8c48b0a80020724227fe9d007efb1c55c8e2cc865bdcd932ce00a236e9bba7ee591818123887721bceda94531c7663750b2d3d7319f06e0c42f8c4c9b22942587aef109cbcfa0280b4bfa83e04666bc46e7b581259140fc7618a4b8dfe3e193992395814d8a17257e9d8f04186eca2662ddc46b96a1d64a8ac4650fdd6179adf686847cd420b3f4c5e436bdfa14edb2c8e19c765f816e02445ae8096d4bdcb51f117ccbec09939255345c10665356d499a3eeb2da242099d17a8a954087cbd1c8eb263bf7b5a45fcf1f9f8fd347cc9e21ba6cdc2f8b82d8a12b5a1b83cdfae2a22f31e9cce14181ce3ee7659ae3f947d4275e7142f2aa43abbaf44c73bb02cb801c727327a0e7279811568a6394858d4a638f43eee09c09cb6ce1c5e6473ef7ba724f70a35c4437c35267c181f461e6a0765e4ab8e71cf46777d9f4b5e2c4828488863005af6725144f9ed484b3cf3ea61914634bab51517d8ad9f55e03f15703484eb68227e726a506269581da5744f1b807c5b66aaae7abfaf2de1aed935499ac06b3ea98a6549b718e5a4e64f4c66a21a0cd6a236d06ae99aa2fd6aa617b422f6bdcd85e3720bbc6c66ee0b39f11a2a350b060739fa748a4bc6568f645363c11bcf3c6b3472c59d5c37cf24745110faf08b1008176cd46be0ce5666532b87e8eb45b184407245f0bcc574ad4a528c5010564463b7334786e31a0059ad6fc518262c0c5cc87289f6d1d95f43055d3c0c8ba79e97e88c594b653a37c2bdecffd88652d891043a57f287921aa58989cddcd1b087e35a15bbb468f35802ce379c1f9deb3e63a97225021458821e27a6ef1a2beaea86d638927de1f31c8620a90f17550812cbac58116768a7d5e0a55313e39f3378ff40d03bc8d747dca39242e4ba57376940dd728430833ff212b44a3c45b404d42a57b21189806f4eca8c9c69a3918f86640330840995bc4038abb01e12ba28ba47a1f931abfaa5a4a9c7fe161fb97cfbe24c704a7719bf75a2c99fa61d3b02c7c216b01bf1b3df4d40abf6673a994e1de2716e908a7d6de6e33fec8bfd0bf61c5c4e60b9728cafd5cddb2732c4977d31ea2972568cf9499dced170a1658b150c840c840e1afb133753710de3cb8cfaef087e72fd9151eecc90e32717013ada69cb6c4b9cc74cc51024cd31cf36a03590d89e1ebd3a37bd20546af0f13f9b44beba8e7e857bdc28c1f4877ff347dddd93f81762c59eac576963e0d58c9f0fc23b4d5af6c4acd466ba9c03218bd21d94acd3de7293cc9a4e500e80004c20f577b2ea8e2d84806d2666b0625d63f5ee87f43d96728c079309af6ef32481eed560c6b9cd2138ab3af3da7de63de34d1d0c44547c72d558475270ab41b1eb25524dff965632484d413407e84758ab45ecf4a4b84e7246c5f80dc39ea00033f393e4d174806f4e9a025023b128c39ecf34373f5ba8720354f02402724d6f9d6cac9df5cc67661eccdd9e66fe80ec505e8884b76203721d8314ef0488989d435623ea6ada3a5c7ae319ba6ec48adfb74f8e767739c2725ccbd44592c7e834f2405b93cd3397ce433c7f6cba938d673679479db52cb672b77a91c4d0fc3100dce72f2216c22f3a33283a17cde0439e4633133dda5e622077551b7f175d4db166ded407a6f6e0e0e59ac62fd805185f247b8b0210ba0b72da881f13928443aa5b1dcbd9372e363e1f021fce4b1faec829b195f4842e677294020e8b8bd32f2701929064b1926ecacb476db4c1fdb0d235ec0760a3012f53e45d69ad74a4d08b2d1247d301dbabfe0e96e5ecbc97f73c955969ddcbfc8b7284ac50e5a4e23a5285770c45c8fbd1ef93346982606066e674ec57aa1617951486de0c79c2c08bb2125b2844f0dc61669dfc11c4c190b2abbca865502419f0725d4e6919a415491fae19a7d4c86aa93e0ed5899701c0a8bee7998584dfc80b72bd3d53f6b8d86011a69172dc58eb2cb57f2806fa10e09968f182477dd04b0672623a9e6aa7b998d513b1e3f80b24e0632946e5f39a063b01a63fb99ae78a14433192c05294c28387392c63f1a175bc2236a506efbaeb620d76acb13239cad81846a3267dd56177dc17b2aa2c6615ec6627e06d5144ef83d5f1c236f0763ce30a8bc9cf2c222e2dbaa67cda4ed6e27ceb1440cab6a6deec45c2f73c06ba33a772002709f699be70fc848fe0c4524df710c9e9dc7b17b6785a525474a706e61b2a15e555052daa3c2a518d7ff32aa135faf43574270481ab3d5fc615fe72dd005c3010b0b310bcc1d12f0bc1cba0f1e7805915d8815024df1265575dc0b3310b1133b009cf688fe5e14b65be42b804dfbdb0af2daec673d0cc108ea663cf6f1d724e91e7b85d9adf658bddc04dca66222230a72c127b36d96ce5dc30edff8630119b9979464d66aed0537ea4eed654d9b54de8d339ab4c8bda101badcf6d344e37bed78013f8115bd2ddd714a02aac36f70f955dc2be2c716566fed33cefe2cd72a64ca092c87dfeed2279a31406fbcccbe8bf4c7e0eb6baf675806e0d0e9a487200aaa4c36a5ea439a7ba70aebfe71a8f4d6409514135d64060ba44640dbea372d4d57b7d73ed50275b78d98d29936dbacc0ed3e7dfa594f7b8393260c086d672266ec1dc63a4a476024971b717830a3e3e8f1938563f42d5aa6909e593bd2f727ef089a87b6cd29424d5d88e4e18aa94072fa920ae5076aa79ca5ae0ab177f725e0cebb8131a91df42d9a246e5276776a303e44ed5d94d68ffd90d7892b5ed724069da5a1d93fe7eefc891dd3d2bbc5c970857faffca94427cad04924ff8e672e2e84c9d076346937264e86c4bf4490637a598d20ff21beb9a98664306b8ee729f1ecd2cc10ee42b249d99641463d8992c9b327de1a5cb22304ebe2146519172ffee0496af4993bff7f98b992ee53ba73278a0ad4ea70481fff18b6db9aa0c72a93ba0484a3a4374d42d557d5ac0e7e27b8b15f8b46d19ef03cb1710ccb348253e776d61364840a496899c8c72608258433f7978a176dcadfcb02dd9c9cfcd1b73f716e45dfb755c0dd486cc1a6a5ff478d05098b4e4084b25d484642df9a77293fa916219247d4c24f3008357a48dedad6d37072afdcd9af874d5ad79accd7250ae6311a19c795d661193f23703844e6c28314a2a2e1c0ade59c96ddd16ac721dbf80e6ac0deee2e49afda99780a90603b382c60d0649ab3979ea3d3dfb83525f99d02ac15c938552ae300d213680fa5a722ce74caff8e6bc84bedb1a9f9a7298ce233eec2ad2dc792d3ac92bc9ee6410cb04a5c33802dbf3e3d70f3e8c045c46ec43dbd7ec7ed6d2d30886d2e53c9fae98a8ef24a9f212d996d84dce47831bfd430910c08738f9912b035b6e5222e533d67a4106532c593640a6840acb6572c0db975cb53f1e75c5b1a97af9e8d53cd253e1ef743167b4d1d5ee38285d2d23c14969a21f0f617a8240bcf7c3752d843887c5e3d3f359b42124d45dce5eaa72a71c866dec24017eaa188c26a89dceb5b121796be810a56df66f55ad25b93c72ca56d400909e324aa11d57b5758cce0730a47770bd6bbc7d14de71831f54ce72f5b0818c35477dace5245fc248f4da121f0d5092b1428ee26987a8103799363e027cb4bc40339092b548d7666ccbe32a469ab2fbe2bc9e5f022d2dda0da93f72d0f627b70d6233e260aef00e9384e7253574fc1ff82c48e44e26e182094f0a720d00dc3c42be6ace6a17caa453b80b0b5ac803a92899c62060c7fb9ded1958728afa283abeb2365d0d26d583fdf9a73a55494ca4bff555cadce915ad10d447159556044fe46cb8045dfcd9fd7f52e91908093d05ebbdf8a51ba5189e83b24d72d81d5e5e48947d8de21c859310a961c348b9e98150cbf11b03f20134328e75729ccb626afa5816dcffdbf29db637a0c68ad7d0fc81eaba5e9a4fa0a802ac4a575f976c07a919cfaa1fea12354a5ae2a9cb273de4579fe468faea48c0b6494572642e5d4334d3b32a03df5730ccb771ee063117d648be2b54541332f2184fea607883eb264be75bf95e7cfea2f916761ea7ffefe9785d2fbbe37355cf568e3072b8abeee95b52d5b533a2d1a374de4aefbf464d29772e4bfd68afd21de68feb1b01684987af0fddd7695cd2ee4eb48df0c3838684289493935d5acfa159c33350752770b674e1e4912ec73a0d0020bac8a3a4a4384a0ebe969ac33be0f449e030377fe1d1bd917ae5953cbdd866236c754c2aa370bb0acc418d0d39ed0edff157e1cef7b5d55c3a5364e5e593c08796ef5add7aad88dae196b63c5c69e8bdd272d521065831483ed98bef4e98ba11b125198c4b3bf15d914a8e17fe3e659a880025d6508287abf682cdb3519e5b869337d6da285f3a0b2b1795415d3eaccbd372011cbc6a0a2e5510f43302473bbd9b2c6b52bb8c4d7e96bb9ae46fa39527421221632cc8fd159ee9e1db2590352347f4ceb811fafb13ae4b0398f0f70dbf9f34bdf9307887f4279582b7946830aff473063859ac9e963cbed84417676421010de6e77d7b5241fddd21ca87e93beaeed1e2ad6f9ba17e2b4176afdd60c8746672d967b0eaff91fabb1cc62b18dff754b40131d456c10305d545333946df2d844aed6f93e94dade00e6a0716b9864cd3e14abde3bb6d2de51d64f156d76d5eb41f6ad2830facd54cbb123ce9ed1e75ab23de7b9535f85fcdeb632d609ce5d09d72b7741e504dcf08ca4281341f548bc5f591e1e385e06a76f059cb3c19a167e472870c1775f880e58ec1211604588ab6a0330e564223af237e4942b72d9d1cc85f66fc89e6f1e7236c863ff774fc7fad13b86abd31bf6bfd815e2a1ed36388d972cc4a23dae9bb91cabdbb2ec8544ebdfa807a54bcf31f665b8a826acc08149372f6da5810c990eb0fc3bba2abe88947529812b2f2f0fb391ea54e6e4c5c293c725b74933665c208e9e9661bd8ea14e66dfe1637db310f799b8973a92f6fb213727a9bff0accffc5d2d89a22f7d30a7390caba563100a21476df5ab8cd52835a72ad83205cdca65e3a49980a713c9d6767f7196db7e2283433076d88ad22747972b70846452042d402eb859782618b6f81f31ea71da447032624fdde8e1285ee017b4edaabcd18a71eb2e12e446934272263d487449aa1f558b67bad5c71a63241c8cb64a9879fa0212e44d4de761900ed506ab67394c6d30085529c6f3ec1a1724fd54ec0a9a40340b6c426dc828f923de216f6e680dd8e518cf2e11ce406e4720e2a56a0d1bac6cc2a93300f29ccfb756811f0e7339372112b04e46fccb2787204b7fbec7c0504fdc6488b8b7b55924f05ed6e63bf8ca92327ecbdfd3efe8e7261089ddd684063d777034ba3de7b82826f9cb42823efd17b48d5f32005295a728e4d21598ed504ef083ed305d31f60cea0caeb93135c6108bd4384bbf3afd042313bc212b3bdd193fdde193c4b57ff00a3e52418f5931282112f8bdc97659272eff1377492f3e2fd5e4eda7357b83aa81b908afdcd5fd9e7b69e53da900da8085649838ccc5d480435202d350a15a2240fb82d79700afdb74da1c41a93782b666fa36302c5d1beac16d243bf939758abc9a528bbd01badd9d90dcfa48ab57939c88b71b0e1a737f09aaa6d36ba7399914b6ef8d25a56dbb4b63d56d12de18472c315f978ed9b5612b965e4ee1c88e141868efa86fb673d1f442e4b99e7e20e210b5c5215b40b2546bfb0f6640594865303a3a544c1350a0c86a9753a34db2b1f1e932c00ac587b2e3005001ea53df95ac90d14e2852244f461dfbfee2c49f972e89df9c573dfd855d956a48ccab27e8eb3f2a916018966df534ec2412df9491b73aca0889cabc1ce4b8ea25c28949c0b3b59f77f3fb0014e56fccb6e9cda355296f7935a2b4e9454c471470cfe5adec083402e74121627ff32fbafba898f6672315cd55825cb7d508faf5c8cf2d9f6db650c2d702afd1d2ea9c0f92db7719b70cf26b61b6c0a56d653daf9d0a2ee7a59c0291959ed8f6851ed98b04730964029d2277f95ad79be694f76a7c2d4692929ad1079cad139e3dedd4128060efd44578c513473cc11aaae9f643e34c61ae1f310a9f13d6493715725e37041e43afe7263ea2e96c41db50a41a4db9a164e1f860a18cf155a7f77fa51ae17174da7ad11b2317bd3ea9b2723b009f82bb306363852a4c3475fe4cc3f2885a1a890a0953a26b03e2655b5c1fdd2226efecf4bead99f6c506de550ad6fc627151909e4096cc58b303530eac0197488a4ca5a174fb46cb250cc7f8d667672d0bbd2cd31ad5e3d07d46ba3ffc2ec697ca75f2d978d4cdb382db537424e51e4a60d4ee4da2a601fad62090e5e25a8698b60e4c4ade37d4edc9b714dfc2d7d77d59fbb60da065a679dacbbd9c0ac9590e27f51a836e0c090bab7f69c418e251eabb7c3da2be314229e28329eac8c952d88839f00ca59de05b17cf210a8d20528abce4c0554c8725e6374bd0b1e6d3b6713f89a41aa20e496d027cb259055534289ad7c44055e220f275e3735bd50f091bd49b565be7abe7cfde3fc34d6c2923e73a1c3a15c4a72f4044ecaa6206cbae0d647c5897f5e4fa1f1c6b918f5c198ea3421e54fefa0722c5b492f33f4acabf825bb84da1161d431fa4ccef7ec02c86db9f31a0f1d4b6669b086bd1eb16aea3ab301b34df45700da94f493df6a5ac1f12ddaf9cb9275718ccc9cbb7ddde8bb0ab49ff6f289b5fa0c638b8fb54adad36dc47f58e6b34c72473f911e7958aed99492ebe2c5f3f521df29618c05b941426b155ee1179ff072eac9147a532f95925d15de76a04742a11026d230ff3cdee15b2d34d622b5312ca73b65ae7452bea6152ecb6a5ba3d33e6a40c1583021e67250ac94e93b8d2872ff52c74a4d6b5a117e362e6dda746c6b12a8562c4a9a9fb373ad8f7e0803d5456922986b5fea33df79475344998aa5ce10b7c765b30b7b4c2e19b25cf196985aeaf8b217f7efb87dee1fc6ea51e146c52ef03e65c25b7aac5ceffffcd26b357206e2b52f8e14bf611a3d0a7de9da302f9d6e5b159a49dff4c1e700ede4527c7206b2ae59ae8416437d5496464259e56edd0a6a3427d0df5fd83b363d166cb33294e16ec2237b0a450a959389c44d990c5fde6a92b4083ab0bb8ff999ca7cd172c86a47ad4bb1ff586148729fa35e028179bf961973c2de9120aefec76e1073505c4af839d2d742807b6da67b4eeca129cccce1612dfc9bc45047de04a82568715fcbd1519f368296c2ddeb3f4bacb7d58519b4e80be853f00bca6ae0c3a49b52209e96ee4c02aa15a64583a255a8413f5dfd27e762d2a54189b5645585bff47226ef09a48ebf7c77d454e1b4b20a5044714c50a0028c96e8e839e5531c3a4d1073161ceecc02f176a19666f2ff46f2388472d36db9421dc924fdcae7ae88801154843616f8e63e0b5538c6d190bacf50f2f60d6ee67d74ceadc72c524257ca724813fea3457cb0a8c9fa44eb4a1cf4e0e9ac8f4a45c390e961590a6922ccfd7206fcb77f82a3ee494df42a2dc5cd05369d2a95fe9f05bc5a89444bb31790c12d679010937199b67398a998c5adc6cc37dc4cdd2958b0328a9e73cc1b79937c729c211c45ccfc970c433b0ca8f8b225533cbc8ee67b6af8b5c8d92e4684b5e77238937e2d03679e6b7b4a73d19b49f801cc097fc15e5b3ee1cb7d9b2520057a72e8e6d52ec19e063002f55641262a564cf8b609190ed590c48c954765b83baa724380a861955fb28de26f6e14ffb6fc507de32610397dc5de3952ba10e31f6f31aa9f8909b24aa0fcca49b0795f999402d38b1ffd50ceeddccd6383a52f3cf172fa0b8e4603042e77cb9c6a3bd8e30d387fcfd05e46e06d31abca18f2acaf8b6869d893664a2ce47589fe19bd413900d9131bedb364ee07ab42cfc8a4dc23f8151b4d66d80a7c6ee9b3ac5e449758e315e87ac6aa2bcd48d7a7ea61c0a5f6907298ea34cd83741f2820873d4614074c473a5163b7db4f84bde5a9d81a4b000472e332ea49f50a450d84a18120a1a76b430f1f50bc2714b4838d02e8182106a372ca5d5a387c45e737c5aa3c4005ac9e0911d8add51e77814862324e322d700d46eeefa4ed99b3cff2be369503a61b4be038a0259d97921fadd40afbf798139e079dd880f9e120f26c327b5c8e0ea91fb9e96fc7ad86c50587060864c3b53a386f2f537c44a2fe9731d113afb112d25502da12c244f4a5a537fc39e9e56c1cff20bd4c8c895acc42e843c855c83c47a9b45a9335db961e0a4dc5173ab442561f72675e060667bd9904d63a79e78332086e195707b1333c82cfbeaf4a6867970f72ee39235e503986940267d50436c46a738b485da0e6f5777f974e1271c9b6cb339d94f51123c43fbc1fad24ea4bbe4b5cb852c3580ef32a9c797a3f16d5f11312db501addc68ccc65c6f84fb6662bd89f2828ab145c2e1f6699e32886121dfc537edcf717c7d696568f0f22093680a49f54536cf7c87bbc959e2c8cac4fd60272bce65a4692685e0404118eb24470f4742163ebcbbb9d586c3de2b421546574151cfd25d7e424be81e43b1383bb02ca2a39d2dba341161c9978051d5186135b72096d7e6657303d4033e01bde8bc0db26fbb2fccf6896ce7862a33ac94f6e19119c3178b85927aaef0fab238e7dace76526c8377a2757bf03f05dcfc6eb74a643f208e27e756bb005fc88f3cb2b695d5ff5fdc30999a8357cd09c434b4e210d722efe435a4c908f7c3bde0c5c6a80d5fdaaf9623b9a3e024352770a1995ea867222b2570be2b651a434ddc14019932e16454a27616e06a23392c10506c70188044e237555447de78f0fc5a78ac7755dd540b9b05acea0cdb42ebbb3a7d7209a7257aabb0d82f796cb21b37e34596ea9a0fbc47314c132bf0611fb69bde7c00308c2a1033106749d2b1115a52efc63412da3f261159a58bfc373a856222afcc26fce3d156d5848a455e9da3fd8c740089e3295a46fa77529a3262bdea6fa558c729c09e7c81d4dd480d9f7038eab2bff7a9e0adcd4e9505d8793c665923e0c2157ce32fbb89b1364a602b37d95a35f0e9f7f942f8fe233a18a0f3456f42f5af92354dfc8aa4f7d16cc4e1a3e7e677c85b63d1008cf638f90968060f8dbf8a21a72ecc240edd5c00d8d6ad08d38925fcc38a181c6792c20ddbc809a2dc0b554f172d9d40fe15a75808e2452210475f0bcfb762f6145e3823bf8b505915e39935304261b030bb995662e3586333df1867df17d0be33996d31dcf47ca2c67fac2b65cdba632169469a261ae18c27a9a81d0452e821b9262bbc0376a3458b782066e727cd5bc4fd07db8b169dc19c52b74aaa7f37f5482f679666baedc7cc7fb07a172f805c63bc7f025473fbf63d1c8b5555855bfc0fda6442adf2cc0b4a7eb719872bd9e417a959fecad51d324a3047f995d22de1f0cf2c9c0f212b4dd2b7bbd6e72c0b82fa81660b20c92d5e8392b8e7f7d71e2237a09d9f97c0248bf3c28b9e072c996eda6bcdc8a7f4ae8643934d1c6141868df1cd287e80aa1e585e8a014367236ab8c4d7162fd894458f96e858248000a98ea9fe42e3ccf699aba721aa35553b812230dcf7e404b78671cd26a0940749048b7d906039855279f7a32cc3bc77231ce6c6793f89d71d3d6646d5f30eab475382aa75ef65f8f0f0f73023917b71160fae3564e1c6a261f28b4c31268021925e9313f7a2be2024d7c32a41bfd5e72b8237390d5a24c4dd91bbaf15509c40dd648184a4c85e3a128599f37ae845f72fe18fdf14d5cefbe8c5b2f77db658eb1373624ab9aa3673e19bdc2289926bd5c8e13c30c11318e9fb3c004053ce17ac3fd7f3405ed8b10c6031076c67cd59172a8f3c24cf0867bde69bd26e31ae15d1fe05681322ddc7d96d14161e31a718472264356fa73bad554c9d6dfff6f1887109b427c7707b16be6a35fd03a06370572001a4e6fe75b88d6fa63e15d7fc10895aab97e3b2a236da36fa76144e72da572c6bf331e2390eac9a64d1576131b61f6dc1fec3d4afe96aaacd0fd89ac4bd91649e3e2cc4caf1eceb264f54b2d14652836c0b0c2a3f28958a7c9563912abce72cee44477de40f007505975bcabc870cc94b1961c49ecd84725f8be155eaa0b526258a34997396f11a8564c8e62f4b4036409c6632cd8869f827f993d10085b7227c3f9226a4e10f12c4be2644607ed542c27e610bacb7117afa397301c0c07428ad93cbc78dd34da15382a7e6943ad6b60ccd1d763a901183028d341a50f096d299f5d4b840e084a59d6b2be17865e773fcc2033c2e4272998e0601409940a72daa7aa4b78c4e4f98c561074e6c1bc929a8499201fd5827f3cec34d04df56e72f6df9980743e4fe07758399898e8365f1c453f6dd8aa7c831b7c0cad52c23f6b11b1419c61adf49cc1836088c535dbdd4101b25d4ba1b8397dff2c038cee8f1122486c58304d7dc79343cad266d8a0fcd5b6989ff2a679f58ade4aad4cf75c721f35e6509af5e622cc0a86abf0883b3d23baa5e6e7e798e7cc857c5a54e57d724e36bf8f711219e36fc94cdc8f454e6e292096d9661696edc7bc889e67e32872246656b771d3750e2726781cb4c1d99b1acc2edf40a39dc679ee076f98c1c54b8a67f0783aac2127da5b3dcc30bc359c946b998c8a7ff933719b2a418846ed3fa1e8fb60e6987f855209a3c1b247fd2c936fb2d9ba14c0c060bdee580c765572e1ccdc224f940e7087f4d462f8e1a103f028c80a7789d3ceee78063c43a1747249494e38de8a54bda3c178df663844bb9093c3a4d2e58211df6409ecc76ae4722d8edf1d97d07530d9697d0c2f4790bbbc719bd334a2c616040773a33d8cf24e09e4c138a678bf67df11c2f0ba8a545b410d4ffc509117755d35f73a30135272547813ed4fab7d8ae2269dda92f46024c790f45bde60d1217b8f6cc1744cc27234d5da8b0fcefc3488b229f8445d62a0e09c6ad85485aeafa4f679d48cd5a85ddb90002979b41cfc49f03fa2611fd9031bbafa4ee06121983383cd5784ee0f68db537e5511c6874aa5c80b768b2952af57d4f985cf702068efdebbe442730772ee76dbe8639e331fa7507027b2109876521a2db2fca42e5f742f67b96649d0319e6fcf3f7589498fae13550152cfdb62d18326d93445145416f8ca03f7b3ab6d4047f5432091f1cbdd915b9d3591bd180d01e4fb259e5e1161b21df77287d1234a223c531cdea485dacdda58ad07bea24bf04e607ebafe03fb721ee5efca0e5e183d57ddd5cdcebff4e652cb00a2687e492795d39ae5edb84f3a0189ba1c1972e858416fa32c51a3ee0461bb6a6e8fc45daa12b5d51de981ce93a2ecf081e9728674b385e274e77ced08a6632eff5a9faa3032b186494e2e759a038c1eaf391178199a12f445ffa1bfda077eac310ab73b3413a792432e0c6fe28b45ea60f77271aee00dad6662601f4a77630a893a0b02acc15b042cdc0a4e962bfcfc08dc337ddb126856bf62f1a09feb5b679707e277b1f8a4b37b92f6818f619c6864c60999d935d4820e0ca0f73002b758a30c8fd2498b81b85902c6e7d3ec9b4c28ff1d54cb0f9fe2c7d25cbbfc8c46f715b99aebc41ecdcc66b960da7af2960ab0475b2296b973135376ce8c69486bb39e21513da3163c18079cb87a07607f26021372f035a701cd3fa1279099bb9a5f1a39f539fa82d4fd581919b7d062f3bdfb3072140218644b5e29c67efe5949c945f4fdfaa3451f1f5829d8b1b74ae03d448272754f3fa1a9305fad90d5b2f679e9360c6a36f92f6912c00ef9a759feb9ca037260354cc93a7ece42f9138912197ef93049beadd346d460310c18f9e22cb5c85f1f0ba1d5b0f398f5deb79654cdecca6711573fe54de543d3af00eec731d6b3722a4a325de0eb12176b8b973ad80ff2726983d7b914313bc0cd3457dc0501f87229ccf8a41bab38859558a50734a175aecb074be0d6d0b9f6c6bf9f2479c97001a1063415b3c6bc04b53d2125f419e5b15bc612732b94def50fe8f485467f7a7201c1ba50188569332434c5783445fa7b7e4f52631ede01a55c2bada0eb9a760a5bd15267817bb1c75be12391c9146a77821c1eaebca706f0b9c9cc39718e8132ad5feb600e722616e0bc4fea3393c6ff9dc4ce668c569cb4c3447916c076b5726a80902c45c876bb35f6c5ee2a5907be3694e3f282df0f5e96ebeca1146fbc22c348fd2bb2f847d7a4f3661eeb5003b4d2ee41173ce416bdfe90366356734f5c1a5d23d4b5948f2b20339efe1846813d45dda122b99031a9b6efdf2aef759d681f012c93ca079fae9410a3100dff2a3b51913b99c17bf5d8cd1d27367af9ff120e7ea8a8f1f3bd051bb50a0c01662c26343f1d6e6657d0b56fadf35755bed872449b413b05ac509e05bde80bd8d03e41c6ccc140bb4bb6b700721a682351b57213adb3eb43b1f3724d4b8cee4e1799d60b4de5bc000e50edd8cc2a54ef26090be5346d79ec6b616277c56ab7fa96042366e59de51985cc8a59ae8cabdc352772955dcba5cd5c9b2c5887091726a2ed801f1659c3d2ed06e0ceefec7ee403602ce2a41b5be1808aab5a215baf720efc49136651cdf324ebb8776cf7cb0f0a9f68fbb349b613e8c0325dc4bfb106ca4d7e8e9378d94ee34e0372a21bbdd3dc816f0c3693921d35ae2d722bd79339c25e58233a3e4327d63dce7830e14e490ea7727dc4c0a04372654fa1c08419ceb0130578d86f32d933bb62cd79071222a11d72a7f7fe0b24a76f996f9f744055850275569c3407c539276c6867a4b7d4a76972dab49873e41aab52e2614442fb822b2ccdbc7931fb3f386baa77f057ae7a3972ba81183bda16f7e450675b4f5cfdb8f74c53165d01e345ea086045ff6f7a9b72118233da963d0beb3ef92532291ccb57152e3131b1332cd8e6b222d3c1315e4babc2cd9445665faaf6d4a579ff6c29b0b5c577b9c814e37d4124433e8c42e3723d63cab0658d5f22d5921163ff796777b548f6e39354a058a26b9fbd40fc8c033d9c85acea68de2e16c5257f463c2de2655bfd89229dc428e4880a606921aa72ab362545fc535cb015e8f5fef6aa2e64327bfc606c19e7dbffd3256be7791c72fa7d4e4952818cb34c6c2fd8d1d631adbec4762568718d1970c7d5dd17029072083b0da089e24f10af94c35a761b90600a1bce434725f925ae17322e7914c072ad1a1b886f64e8cb0896dc0b1a71ec03b9f31875958c2bd2e3e041e733e20e059a0e7e356693509a778c472f508ca875ca664d52e0482958f857e0937268e5501e94319416fc311876dff57809dfaa3981013a04c983d940723a88c5d5b6180ef7936d1c1ac41e5f098453658c5d3670e7abcedf039d67946d9162e74b1fff2d0235c208e131c8103f03f5a1840b4e56255e4f257e4b7de4818858eb3983870f4a9b4ed7aa9042ca99388e7f778d986ab0330066dde1f319e8ca82d8c9c47972c774632d4c721251bbc4867202a935636011eac6caf3cc461692c0b1de5be2724ebbf7bc7ab81795910429a08ffd84a09f69ae74a46427ca0b86193d87a47e5e68dc995468ff6066bca5dd2e6043f5644b0d5f8d7cfe362f7f0609a29acf3472ca36e56bcd5e43aac1fbe3c253caeb6bd1556701840f84873efa6f84b2fab250c52ec87251838504b64d4f2d5b8da4749d5687b593f346f6f7cd5063a8e01972affe4668264823a95aaff98827d5469cb0f825c03a4b198520cefdc8a88ca37283044ded6d889e73df148b360fb99ffb77d0f00e9a51138042e44435e508da727924882babf7d596344c82f61cc46968f042d504f10be78bf284ababcf557655ffb7484e0eefbc13e7d02bd0a0c0bdefb596110ad531db4536938a81b9fbfe72544520e4e6c715c2b1591d66e2734ac8ca1431b5049b93ef035db267121f426dbaf8d33728b3bc019af2741a7fe3a3f2f120aca785a70b930690f22acbf0b5436b7316ea6cb42cfd4a4f2811bdd7ce1dfb006c3772948ae5b2c01478edff841f58cdb985f8d385e5f3e278e089d192d227e426808e6d8e7c24e60e3442c43972ee50bd2f35db795d5efb335d9d4ad5a75ca60cef0771b5ea379a9a2196d1ce6b09ee66e766fdb1d1bf2425747e7835ad770b7dc15937a4a2d7165b4d8a93ca0ba6e970c3184b37b59f42b50d2e2dcb67ecd71c2e0efa470801bddf651af47772c159bb97a3f481766a12fa29208bd900945f238dda4ee68815aa7eda4c9a00720a2ca8c11c77426ee45b0ff6fd870153e94292f18a8b445cd6f97530ff6d6372dfcee6597547e5702512bae063f6386f2ebb1799acfbdde8f988d91ffdf2c872a6bac4bb00aa380b1e88bc4cfe485f2874388900d201f6b0cf3f99d02d0cdb27401c5e01bfa89e19516512c321a03f6c88c06db503999557052b09f223aa6537b58b44b8a25688c21efae89f7c49bf6173b77016f8237a3ce235369064771a4da10d92bda331ce5314c8b32ca70e20089035e184a8f44c368ceb56d94d18b039a51edf1b789671b7f24cd08ecc63243b3e8c73a21a450d1a499d644c9d7a056d2e69544c3bccf01ebb8e31df22d325d9497a4c33b4bb34c9b21cae0fc97e8a2eb96e6d1ae35276ecb484eadbf44b4202c633ec67570f29f79a37488795015772560553e9c5058cb50fd4070a4ccfede415022c910409e9247357bc34b4a82e728162d9e18f062b9abc8e631b9075b7f3276e6c21f10eb504cbeba3e8e45e4d728614f26239d5fd6aa10b29a9f52cd8e022f6201d5db46988fdff16219940ba51dd08e571efae5dc5ee2056122696d28c16c85ea67147bd196ef1e0117402b44b9cad6c922a6a9469f0439dc1f613e3f554f966d810ff89f3343a7113c3967a0a4fe5d50d81e2042cbf754d434f2a49b968ef0656cac188a0b1165f0f2d62af72a90d8522e105591e47e67ad82c3ab1f5442ba06cac92d9c08796334cd0ad9203cd7c1a38f781d8cd8a810604b005312ab8ce66a620dae1bb9c25b162e21de655edb78ebd2ce4c165bdde6e110befac6b7fa69c9123e01933031e3a5ef5faf2726b6e59c8937f81cfef44a7ed09388f99f492495e8d24d938025ac3f614215472b50ba102ea1172288c35a76dcc68c8faf0df374c4f268fab2f2e054e19f0734fa48cab870585515ee52a138c68c8df4e0f98e2851dabed0ed9254041318ef764ca33ee7ba51cda63854d450ba0b6745f8f5e66523cc1ecbd84b47a621a590e72c4fe7e9a683acb8b0f884b18f78fe264f4b60935baa97a4859386f6269122772c013817cf6e4bfd2c3c39b4bfb9f4cc04e7a2dbbb8e6bb518fe754e30e9bce7228a2dfdef01822448016c8aec0f01b4fd3a7b78e72bd6166ec2e1d43b95e935a9eeec1cfaca08b8e6b18f8e227b3e5e5eacf315e67fd39ba52f899f482935f72589d757142a1de11f8ca394743e66c15421f93b13e3d061b8e209d85fd5e5267271acaedd8d9ae9b17ce58eaed9664606e8c0bb49ffacfd19a5e208d6278ac72cce8a36c39d3936b008a501152e733b2e81cce4af638b83f0bb97b93b369335f66da5cb3bf6d4c81946ef554a6bcc529a9ec34a8634f6e76a162365e61b214720c0e77d9ec3d2a0c4e8973765a5a65825017ec286728df2b81a9a56fd34e53728b548e554d4397ec4711630a09d53511b573081cbb3cf5584075dc70175ba80e45ed8a70df2ec101c569b136ebbdbe2bcf73accd2cc098b30e4f0d0929466472b3957ad19e09fff940c4811e2ec18b3e2c677141a7be5fc06dbb6c99ffae8e3098089f969431ed043ce4a6bc638fbe71d176e4c6c46a22bb2bac6168f852d172d861668caf08fb806da53b58c33f02291a45f083b01c8e5817b55b48d6c36072869046386ddf28bb31f4b59a2423357e2507e310dcaafccd2b7495dae05ba77297624c4750eaf5effefef72fc10ce389bba6961073520f1e226f3b4404a01372c2f08a9869175200a89954f06923ab576f40100a09e141d1b434bc77aab5e072eb7a19fe52423755259eaa44e0d1a091495da323d0cef89176af24cff3e90f72854365d4f6f2dea34bcf384a287544ca952f546f59ef6dee38a5812b3bbe264b33d54154cc5c7e101e418f5892189ed307b92da6b1b42d365857620105585828757b0d67120a519b7b31ee83ffa71ce1351561a36e76cb4ab729fea6e5e3e07287b03c198e446693eb73c6cb30deb831739a6699a0c78f114f3c7c743d45287252192815e28075e2eab91a07249d5a5b7da689bf2ffc67f6ccbe5733993c683981ae9649c5acea0666b3fff124583b6a93594b07bee8474ae38d92ff5c49b1727ad3ff79ab0795f520eff09920976019b1dc46d471ecafe77b9001dc86dd1672c62e7fb553d72f359a095c5aa08be9985d84089fd083834c467ab4c3820b5e64ac73247f0b20f68db30442ebc578f4145f06049f7e864e77449b909c9c6fa3721869382cb0756d97edd03dbdb503b1a705613b693d8826f20e76b37683085d72fe87aefca9bc1f7e2bd3757d999022d73dd6791222ef2e1885a8d8dd11a9c63e27fb1be4601385ba67429fdfccd3c0e0c85be9e98157aa32088735ecac6abc72ace2be312803f19ebeabece23e0ba014c57101a4eb03774ba2769e05017a7d64ccc1b61da4025cb3afeecca62b1a7ad4ec70c96364a444b8cd65f0b5befd3d72d748c44067ce6535dad690d2a5020400ffe6b6357a3409f532a1089750408070742bdbc92c2a9c936196829bbef1cd8adff014fc2b8fe99bccea4e40c394a0423f5e81f7cc7adebe56a8e8f45a24e3478b00f1fc53e5cc212e309be69ae3e12bafabbc9f52eaf5573efe2261735655e15600b3e8471b46345226d0dd013a6c5ecabc12c5e3c860e7b6f0433e59f92aaa44cf7eb7be224f645bfba27e61efdd72189f2b5277c16b5ad154c447a6a729f80495c11d288381bc347a4d7cfcdb336eb79af457338319763338b8adbd54659c17787ee67e4e44a3f89371909252b672afd86ca1f9a8fafde131617913799d3276e5769bad492983712e83fb5003da72a4f88694b3d540b79b7661e960745e456b6fd5c5ad75031042759a3b94f6d8729a84dda254388e48f8ff9ce570de8c02510b58aff588969f8f53e1e8cabfd7724c1f1787e71dff4323dbebcf8189ceb4d8c966f68f81f8a630d5b3f144dd13112feb3799dac404a5ba5a0dc4e36f420167b9726ab511180001b514952ad544423c606bfa49a176165e5c6958754a4e65793504ce4c29bdc5e6d684b213fa9e72d212e9524a0929261e7f5cf58aa3a3afa4737441534d119a8fcb1dd85c66bf72f5e59b863bc1436df6944eadb25e56bf0ac18ab25e98399e04a4e7b79d9c8172c590f46b829cafffa971a85c75a25f8f366e8d6a83654c587d2e18653e7f852f06cbfed0240a81bdc27d207c4ed2b1649b7040221f8c1fc83c8b0fcfad3e490ba896b4fbea874da3ad19eb992a8dcf6d9f32b620f4ef9699c8b7b7930ef07072a2d28bde5ad41d52fa807b94554d3bca35486b644a3b1aa66bcf5001e3c74209261a14a5367907be7f9d4ea8a59d3a31551d7072d482e9391d3618fa08395b6e72c29b7c746efdaf59f7f1a31455e54e4140c7b525a9662feac994ef4b43a3154503f7d5640027801b64d83741405f30fa3ff4657c48fa9252814fe11ec5035d81992899c8b409c7123b986f5d64f6daa6f5598fb185af544a0e2c25e35ef60be5e020f1d2f8728a8549a2600c8704f5a82e3dafb9f62af564b47a998ffb6e72ebd10acfe22363287f2ecd8fc97a8b89033bcb875d82e3945fc6b5f58eaf9f72546aae6d5b2a20d2169b5dbb999c12bbf88f283fe1108e0d8297cf80de49db0db002e9046e6f7bd73d8a76fd24db97f69b5284d2f3db7573a5b893424aa30272ca3ee6444f88c40f9b49551defb6c91e5a98b0d2aadcf97273cb6a2fac82567254e4b49a93b8e76410d434107021fe097c82b9ff0e0de888abb16d70d420ec14dee92994df6bed915641805ada4a52579e0f30c532d1109f7a12f257779bb1720ab2b169c7db0ee42b6b4735210431e8d6218515501c2c560cf36300fba5e1727235e23e51b9b032be61bb382e0a559d7195393c5b2e79e87fd6fe696944a809cda7f323540aff44138807a8fddb2c62927c7866bcdfa2c190ab20bd9f39de72e692457ce127f10d5246db2a0d3fb6766c04bbf4b4963d009d66a2aa73ff9822392c932852466ff284f1907b25ebdf34bbc77ac0867fd7c3f02db54a9730360c0ef6ff6a7792463e0d47d81d7fb20cffbfc833b9481e8fc68e056b860e0a517291f9b2261677484d4e3307f325d1bd797e010448f54fc9a4046f6f8e8083e459a03ba464cd868ef6d97d66b8045492db42b6d1488c5f87111ee242c66c65e6721f3657a082e697180222026bb9236279b0f5f50d5a881a1d692fa199d4e714726fbc2c10a998e3d8bd580d77049eb46d23c2dd232e8f2d4c8394146632b0a62a6fa0621b2d0104273fdc9d3a8024d8eaf2bc6cfc93f5c0a940434432da17d07247ebff11115c8ea4429397d5ffc50b9fb59d66e15370ad745721e98a0821f872b91d729220258a4970012647e04fc3c47de2a560864104b770bd5e2bfd639340bb03374722e78e03d202ba3e7631b5191e67748f7a09bc212811e674a8c11b1d72692510af70347ebf0552e2fdf964e7d0762d54339874ba8e08474efe2ba972f03339611378a3ba1933bf2a72f51368870e3adcd84ab81dd79cd7072da77c72fb1b76a6f20bb6fc57e4963fab47043ab8badba8cebd6ef330fbaec1c6fc8e72f988cc3f9194157036cdaecd812dbe6ca1481375dbcb9dab0031a00b45855772d211a3c4ac70978f0ca80eee2189d84ce29caf533c1071b042169c148dcccb726bf8727183e48d87b6b1a0aefc3cfe4bbac379d5e9e901a5a862cdae55cffd725d94cbec4bf82f7ab3c58b739d3ea8b5248a221c5298fca9c0f8019dbe5470727daa8fe38297621c49137d47d41f00154c787661f1c981fa958bcc8685437a72cbd3d76841d8bdb2f4d0b412fc181435dca4657c3abfa4e049176debc5826c72b5522c33300376a8f9ad1b353c37ef5215a9feec452f40d1ea26b21fda44e37294d497b3ab48b24ff3fb8210139b0984125411021c3826a7a1ed9550af6b4572f4bf62a4df2d5edd0a68a2782e7ecd9932b91eb8c4024ea762e33aa143cb71727225abd4ab37b01d483673708fcad4e7b8216701a02e6e1db2f81859a87fd372bf4400ef67758a073092fd9c0b27fbd97e7ed84e94e5abf3ded896c634589538cea0722e18009dd3e587bd6d3610d9ebca518848a04bf9631f38f385efafd0177ce49b0aa763ae25133310589be976f7479dee6fae06bf2b6038d956cf422323ea138ba5f6104cf61853f35e35068cbed751487ea12eb96341057c39525fee2b5c196b651d6b269a89cb88ea1004dac86fe90bd796feab18cecf194eea7ea1722a8fa63dcf411e343c93335d7846714342226f41c6b92d3391a4be91522ac92b40a1582164bb2819ac0aeb237a3fffaffed2bea4491efde8d360f8e4d2ada672d83c2fb0e72aeaaf11bc74fc4d7c6de32b8bb1aefc7ede9549d4ff8938b5d8059430cb3c4569decb95922c2da8ce96316ab4a60e7e3b18174834566d6eb2ce72d59b85eb44e2c77c73f9043141ef1766fe031bbcf6e7b6586f87a08272c4021618ca6b81d7eb21a7d0b98a20db0984a302da8d700cb73889dbe75e7261775b0151871b0692c57e4756b65ffda2cc96cb76d6c0502bc243b84b692355f2bbd211472b7274a2e16866b0d83c565ff2040dd41ad4965624f3e6f54e2d92118e1703a0024e614a463eacc0bd7e6a87fa2de993cb4fcdb78917c1d41543b816dd7317bc5b4d6f77c53a84acc35fba2488d152e12e14b1789ff9eb0d1e54642e6d8a6ababaa1660d32aa8ab8fcde8da657de943dfdbdc763b02ea0be19e340c94ef021b321b3594a30ff87b7663e589d30075f1ea874737cefcd643669d92693e51672cd7f783ff1b88271b7ed1a80ea64fa8284d7fd9512247138e8d44faba0a0f620671cb0fc8d43a18e46bfbd0f23ae4a4132891565b2ade0c782b3996db68415729987408a0402dbeecd71342530e54bd2de7cf4b0e7246197030a20c43cc31831966ea69d31bdaffed4c68cb115726565925c6fdd0a939354da5c263ce8d61c727c8750c9da800c66b4b468c918018e1c355ecf8d6732e3b1b212e3b2d4125a2113a8e5634a61ad02da52c690c83c95fc07b2f11e61868c047486ed8b14b9cc725b8499caf9bb13cfbdb47189fbef5af45dbd6a80ce77b138224e1a25d40c70680cf308c5b44f4f3ba965d6f9eb70611846b65554768a861de36c435917dee47226ea2f88ed409fbcc9e44420773404539c1999feef69c13470fca6996666834ee4c82fc23a133e73737d0c47284d80eb69f648730103aa385ef1ca2c72519d7263faabdb137826b9324d4479b38cee6b392a5695614defbf6de1c21a4d8cd94dcc55798893aeaa6ba3a0de952a931a2cffcae1dab287e1444b139476114c4d69a1f8a6b33de7780cc2d204804faf671f23edde9a55a0ff5a245eac92560805121735f6c3c5121c8f19bbf786876e205565736390ef442437ca0869bddae09372bd51731e97d271712b0c74ced671fa08a89313971c543ce674afe586dcbda6723915dea4186c3b36087bcdf835b254fdc3a06553077e42c9276d894aae61eb7269d8cb0d63d769ebd2771a94613aba3aed9c55a2399c7f0c8eebefe24953b3116d48491b4afedadec3b2d4915f84e553a2c8bd5e0e871c96cf8d172b145f70728275cf2deab6d54a55cc4202676414b8d802924b2ee7acee25b95eacf5eeba72c46d6c9026bf7f41b8c0baf5fa3dcda085bf816105c90c5ce683ed56cb07b672a365494b8e307f3338152f5a62c37cb75df7646d2a5b10c70014a1f034a768724cb09fa7857b34de9c61ee953828b51014b9d8b5a4a5654ff6cae6f13cc82f3cbd53003cafe534533ba276161571f09dac45385e1dee36740e7b52185df92772c10481bab47bd7df8359a68f0c37ecea4166c2f9dc0a2fdea8f5138837c157237a2f57817f818942adebd63a294b3d3921d538a61a2445349ab48219373150728d7bc1fb9da6fad10e3108e98b6e727a20ff0e656fbbea7b4cec2f9987f5fc72ba53f1f28596fd408c240c33752aee6697238bd64aaf141577d7eaffeebe607214dd85fc02f587b7e8feba4c0e4b8fa72e4e5f91fa43630322c7983d6572fa5cc9e80738bb79bd2a2d5033bc5426c80ea46ce5dc052456df6ac7403eac580572deb60331c2ca9c9afbcd7a40fc3c1c5f79c9a153aa1a4cfa89e767c57ae4da724482715fa25df7fa43078ebb1a32b263b1881af48b77616ed3e0d0cf83afc3728b9186eeeb55fa023a82031e03a5f329bdd2520e49fba7ef1f7870121bed827288c453ded215a96280f8c869d55588248a9d09c6890d3b22bb7ee0e46499e67224e927ba4c2af65843b75a70b65132603a457039d427a85b0a82408db22a2d722e28d1cc9a1b6929316eadbdfc060244aba7402520287dda21f5ed777fe8fa726504df10e9a2c48a3edc9de31a8c343a24039bea9f0fe0be31cf3a3d153c2e72a260eba454c0076e3f1f7d40259278e0d2d3f3cf54c38aaf848b5ff1b15ee525fd6b43f8bf525741d5b3f86c80d99def949ccae834b7aa9f7c06ab06c0e8c505466ad717d67430d1183957344d52f713f43989d03c7bee9e437239c269664d14a6ae3cb1082759c383f4a9f839af61912ed129917f689494acd67a5ed944cc3c7c13f66368864840f99fca626f48636a046cf1eab1dde8efb6cfca3316c68e72d3965b254c20c643e2aa2e0064cd1d3abe44638d2b4cf6a5374b61cbd8479a7253994ddd8d42855ae1ab19a7607f521596a0bbe98370a74b81ad501dde7d5f721f7ea0641b1ee21a8b27764f7ff6c9854e46996d3edb5883ef7ec4bf2c289137ccfc10a5c1d950f186e8077a68c4b0701aee39a2489fa4840cc3aacf2556c372f6c717220e002f7e3909e96c710a2f43643fd681bb201a6d38fe64a4df069d7297750d78d75e4cb35bac575ae1028d47425a3a3907c5cc3532d07bca997fc072ac5a2201aa3d5df53d43d3ed2daad5d14d84fe978d919f74ae99823d0b791435df29a4d9875014c971d89ec6d3eba13d4efdb5c11b0eb4a637db3d1668fa2472cb45d378ab2ea6971f6189129e888d63cea7f25a4e7c9f410beb426ccb191372cd39a8060fffddec0fd770589d96a35c7615a2318b0bd9e5024d83e50029b00ee6ad152989672d0f20d337c43dedfdf0dd1c70cc123f2dce908ab5a5aad81f32750dd0bf7f306729cdda89a80d09dc588addc73e98240bb28cb53c675dfee7729445b1925f42f23026dcdfb91597b47a6a0729f9e150d5ceb0974c2e1ea71d0756323138253b23052b3707e9f10cdae994783334050841dd6044d4d6c4a018728568adb537c659c56c00517a7af4e24637acc000d176dfa3a59b328fee313572dd2d70e700536ecfb437654b35fe18c3f909ee6608144c8de0e99f8d5a58dc7213385453234f3843d969e7fccc12562baccd1a0165504820e5fd2e4ad47f233941e3af645461db7c92deaf3ea4fc6e00086bb53f7f84f9fa1fca8e2ba359a2724d11c527224db5246a3ef899d0aaf19bbdcf4dc11cfc7f017761f4ed6521bf729146d572b268539b36a8481c0832044126fd595e18e1c8343cf434e5c7a0ed726a2e3ca99907b0242e46403bab48cd1528ea3377484f4b326e3ca1fd3c0b2a72c2769562f9a803fd5aa902441057969c2eb136cad87adc3d5bc3e3f8f5ba4741c607d0cf99d20ac318dfa7e9ef317f71a08ead3aedc8a6ac11656818f248925dfcceabd6818d822526dc477a1b61d2fbaedb282358b7ed42a95b538aa1d99c697f5c71777e0a8b36ac9566ab61f97782c812a24203eb54275694c2a382acf27250f4fcf4aa7d0c203d0dc525c401b210355c6910fb754d67e758b4db8c30bd581d4e97f2fae1fccda1c6c70b3348c73a91f23e38015308692a775499a89acc72f0268be3c97d697d3c63aec5d716569bd7498a47e8ad322d0323ebb3a5ac1949f88718179c63aa75738bc51c0cf93034b6f08f087ad18a5ec635768143e273727d08a6c220fbc5e48e441ae80baa245927c6538a8558f88d04e6ebba615fcc72e0dd6e86b531c3cc7ca6dc974fbf1b6842a449ed1d0236080579d4ee35a48e2ce8e2791b7ebdc20eb32d1ce3ab211dded99da847c3885e33335cb631a5acc2722778d0364331751352d7e6a9f4f3ab4ade75a3abd37cd98fc25e581eb103e77236c51f2665c8a33290f9442602307ccd8d4a9e577b676ccf03fb84991e25e172f8759924d52ce7c9c81ff19d2062e90ac6456a237d0c6215a16a1cceef4fb4283d8786967475a2b76bff166e8ac41ca00f09bebd0f6ec7b90bac0bdd5fcb885979e6aae6b2f6f61c6b9eb8bf9689682660c65ef82e8ef945210b5c9a9a9b8c16a9994b53d054591c4ce6b8dbd81f2f6ff59dc86f46282666a0c7226de1813872d3d28823cd05c9657fe9f9f458daed3f4b1d4ae276916ac289e588132f752572cda91f56f6bd3db2865e4ea82d470f20330303f43d9cbd3ea1e6952b7a706e72eb931879cffcf3d541035b988aca6d2378381387e9539b9b9cf0392d6bef98728bf33f80d6fb2cf01f29a970a3abd7d6ae2166150f215e6d661da7c69004630fd26d95b911f1c35d1abb39005ca9f446af0b9112e6858e5b6c7dd643caa27550c20f6e9bf6c20ff6c7811fc1477491669c884c578dc89f77ed8733a56f01f672917b98fc7cc930fbdd592d39360054977a2a43be2d7d38a06b1a3d2afbfd20723e42f7c7318f2717c4021df6ee58ebb5ca3addd11501925391307d6371734a7228c28b948877b77c02b76877c81b23518463a6c00925e576575a7abc829b8772b6e4736169c4b78700f0e4423021d06d59bc9f0baaa5aaf77f3291673e36e972e16b1f5843e748066454534dd49fd1e4132adffb54c8f7b44cc7704ba470be72a6bedc8fc76702282c051503423373524f1dc541d51e41bc068bdafdd7f02b2e3eaea0b04b80e9503af5f4989988a02e77f2efe62f7e13d2bcec474cf68e12721532ad41907cd8674730d9fb19c6abbd79f1707dbd2af23b742267f1c1f33872bb4dd5ca4fdcd3644a55e33ceccd74a1bc48ddb2f2aac75b004f990c4aea816e13f29be23af4d42f67fc7ed26f3bde431f0d34e8ae552975a0cc81cc90c57772f2ac224db2394f99a2e9ac5dda77988e4ae08cf56bb5d174cbcef142388e107291eeabac93a61e649651bdb7d5d38b5d11219fa32bd6c2b12398134f3bcdc1729784e1030f6f118ba5a31947e69a490ae9da4eb5017651e487b4f95913c374720d7a41de2ea0827ec9684ca4d6dca0a62eda73c2fc8da7d75fa2256a6c889b72657857027142c02004a34f70f23ce8a21597eb62e4dbe9f7ff8ff9d06ab84f4944da820223c392522dffe9a1b70c3f0b26e9f838c4a3f54668bfdd8c470c277258a430cf48e539de862375348934d066506a7f5e4f772fc3d33bc886de984f7272b3edf79c9960b300e05fa3fd70d758c249a376872fd84e37b9a3975988277280f66a21b556e3fae5b66c57bb2d9f78d514d7ba957ca450692e9d8abc094372864fe330a32e7183040b69943fd1c08c2be8aed7854a7924788855236a0f8a4e1b71a2243a0dee1eac82bdafaab1b5272ec5ca9ae392924b4bdb62230457df72ab64650f001da444a6315d07c47c5e4334edba3f7117bef228242dd8813dff2cf8cdbafc177fcc5460cc4f1f8471a4519cf434205b50f472f609f667166536729706f91e88c5aab0ee9114cf8b1b506620bc6f12f6689a7a168f2219fa6fd27271683bbb6edf75367437050f3d4e07b6d908b03f171c1d1982840fca34b68e29b4eac6d116755735ebc0eccd8eccfd2599a97c8e04d50e93206af3d65e2d7b10d284c0642f25e21ec1cb1fd259cfea99488dea0a2fc2ad7356abc33d71933172ddcacc4e6f2f91d2b9dc27be0324bafb902693929a0ec541614af4f703e6e5431eac6c2de28ba32c2da09e64d209932cc3c4a1ac0e53b8a760c9c1c4588eff72cc780805aa8c89e125796d0396a80098db48bfdc66678244f628161f09028272069c930cdf7f3ce1cb4cf1fed0baba6b988bf45159e25e8497a8af674aae6772819c60503c0fdf26986dcabcb9e301d985d5fd217307b7288cab45fb9ed2c86eb11695f095f71584aee02a8a9bdb89b208da450e80cff876a445ae0c6e3fc17282fe2fbd969d23dc94f2124ccec5f0b3e7aac3816ec3ffffe448a3bffd404b6aa18491cceb34d41a1e26c5989c0b6598a10446437d12de44b75ab89eaddd1a72f707a9d8f0df733e2b2ff4bc22df0ee021180fe030e7d3df3dad99cbf58bfe01914a1671e39b245c9bde05f106b26a023d2bf29d962db00d9f62c20fbe0efa7286ef03e7658c6eca21e930d01816f7dc9ee7996399823df2309f892a4ebb5e13531c5476c2fa5acc6e1eabf20081b6cc1d1adb74901883e82d9e6b636e80c672c360db123b2376cdff36f851a492ff5639c6d6be5265a6dca6cf2c461691917249c316f0b6cb8283a82bd309b844046f5b636b7f8dc936e32ff112564a169f72f0d13766a18fea726d1167b23822e5895ec5d5256f2bbbf4a1eed5f5a92ff2723389e906964ccc753d19b01a806c76267c6bca3b3514d1c191205d3158c33e727fafe2adfede0453680d252a359adf7afbf1366cca877d44a14b6e2578334972709d97d5a9f30014fd1fdd52919a91f3c995a3bce504aa9e795c63e8d1793c51ab9f03be32eda1aa0ff622b7be68eb87049f52e5738c593cf5a8f5ed7a91fb4fec0cb033c3326ab394a11e8fd748932d7219312987ee2c33a9a414461fc2be549d826e8ed39ea325c288e06a1ecc9de09c59d0f2f4d884fd8e69fe1ae2fb90055dbd334f21c47af51d0284b008707653a3ce78a1631ff00ecfc271f1a50a0e726803b7b5fb6c810ee0575ac1903760cbf9d35944522c9d0ba74c5ef7566327712eb0dc063de17b6b4da753c45f2edba3c30ad54e7b0cae1cc86a3797ca747d53ead4a5832a57ae7c1e9bc3f53f18f92932a546a141736de66d93eb537631de31c330c6fed92fbe5d446c4317fe41514857695df0c006dd40ef9023bfdd750172e22ea5483a31747bf97cf05bfdeb463a97dd25c29098d92acb60705383405972bebc8f2b82b8f46ced4dcd2f6bb1756e2193f5045397e78a8107e0e79524c525f47f5a952a9297efaa25953a0d1e04b425c6ff39492f832af4e242daacf24638eefa8bd09da2737120521297376767b0991e9883018537d7fa8117a9dd2bed72a3787c7fbbc5c2457d7744f2403ce779b67e831c62d8d3a40bc3e7531dae3f72101eb4f6241961d85c1d1035d8fdf174cfb9e70cbc8a0d1815048561c1cce7729f91e0987314eb0c2e59b3d6b453317989578e50cd78585d3601e559afee1744ac2efebaab0252a3e9f58191233177741da58042bdfc195fb00201170a191a723fbcba534287671f6a413663f19e16042b961687cd9d3f7a76bfead3425fd4723611dc876981f11c82017ab25b77d2ee9977a74c0f531e000d1f2a8595ffc33e6b99cae75c9f62c77f81c9ab63a1baab54588978595c9fa20f149d2b8a583f7225893caaa94b9bcbe77e45487cbf41c8717a05ca9688c3b0116e9596c412ff48176cf0c84c29a19fdae334e07a17bcfe96c39ed7693979e44d25e0c2f690462610ac7b5be9d19c74a1e2b1c32de8c45bd6e1f79f04d120a575f88b7077f5a614ab578e761d23c145b17ee601ad56367afbf47a258338d05ca89d6ff4e6c69a729b7370567fa7ad7e5ecd3cbd250cca07d6c92d957a31e3299b778b9909aa0918e1eef66cd01b7b2756be5dd1deedd939c3277497b63d2937d034e5232760927213d97defc00d5fcd7763028ca169e5068c33c4c7671ce0cb0216b70162b6da21059343bc5bda2aae11e6c48655a942ca5d506a955eda5d06eb28d637914a761d25fb044a63e79f4f9d76f8b049197e319be28b04614172d7f59cc1cde1a76e72a6fca80ec8c65a510130070b9aa910f5b638243578e62185f0f2d7495dfd432f5bc3cd748ff143178a6f0d2bfe9f82d2db7a3c26618cf85de6e385a12276394892bb6ff97e924add35a24378746fd1d970c077ee567c4e2291f3e389dd028272aeed3ae8efc1cb4d04b14533b96136c6d2bedc6770ee279b4d2c004f001c67723ebc5a734d390d1cbed0fb9c6ffd8fbadfc8268f91f0910a6fa871eadd78567291a166a0a0fce14115a652f2fae1b5cb59cd6bb8b42399dc62b9c8233b8d2272d164bdb8cf6672bb6373083195485f6c87584c85094fdbfa08cf761188ba3372490d6e2bd823454c9d2157e8b1103f9d40a2651c7096bf07d55c05c9e4379572499c9b1fa330c2d9a7e115fcb37b067e3aae051e55f4649fefa48028b74c0a72c4aa30a0fe63cc91642861656b841019249e718dfbed0155cfa6f20a33727f7284f81aaba2aec26cfc39040ef1b944619e2cc69ef903bdfb307253beb0080772d1e3921997aab19a5d62f82db245842cdfa5ebc1cb8ec178a2317c909cfac672d42f8d085c309a857e325871e3a8935e907ee6bcafbf6acafa0eaec82b8b5d05d45c7afe9c53931428325de100e45b36bb7a37c2a11e34fce7e6e185d03a6172f6491d15f9c122aa4c30ed284d9f2a09fc92ce82bbafa7f6109849461f688450c0043bbadc1e8e057d6b93cf3ad0a14271c2a4a5c4100c64c85f3d4b21a0ca6ef512af8e41140e24483f48d50c9b615f8b42ad90f0fcfb39ea67cebbc19dec72df98721965bd054cd81eac6172bf60d93f20c2ab66c5170b5bfa06cd0bd76a714449c2a08a9aadc50abf182ec708dfc70b2a66c998bccae682d44cc16e9685624df9631aa0eee3c115ab41c56862c3c07e1d3349ab652c96183682386c9efc219db4d567558563fdf43d1d0df6669cfee3fede270d59525dcdeb9d9644a0e12dbfab9b08c5a73a481ce31f8bbd90a2172a583821756a7aa94ad67ffd5c8dcd72b8adaaaaf9754411ad35aeb4c72217d527f4f07b56dedeaba9de8c02270f017245c0daa474c4d4bd433ffc3931298f0fe1902c227105d4335a7ecabbe088c672643071854354e050a38472f677a5a431ea805140523f980b673b0c8529c23472749ff182e18fd59744f1d3de0802816915780dc7eb8d83ffc59434eff011dd720632b228804f9c63175b6a7cbc50c86bf2f2ba3943e8bd7969f48d8f46556e7296195c0acdff3349bcc4f46e9c7b5a37b1d3697186d96e8cc6cabcca215e2c72590cd90efec3cc08085bffb4fa28e30292abdc0868bdd54310207ad12d6b2f607651898067f0954c3e524ad97419546be9eb59db69cac189fb2394729f66f93b9db1ce7e83829771fdfd6b3ed1e34e920c3b9f5ed889c1ea2e326fb3ae7f6b7252301f80165cb8623ca430e62125b4e1ea49a72465850ad8ef060485f65c775f713c002bde073a88876cbec9e448c60bac962ca644b3feea25122dfad71e61729613a92b80b933a09d55cdc0d89649ebb1fe9c9f9ae95b8838806d0b005a332d26092f56167c824c5f21c4046077d86d523a11fb3e7fcbc10a8a319612237f727e4a3087aea46f805017192eeed86af3c327a36b56e9fbbb72719b8cb020003552aa855c3a8c68f41516d9fc0e3171a970a61babc2f0022fdf396b90e84ec00804d3e9781f01edf24fe02d5f5addcf30bf7ab54c624326349f1201400adb5a72f0429baa32394b1b134591d934827020e591fe066e9b3e42313594099f5868725496e94fa6966e52f0110cff9b88254c11a2f484c56fb6c37b4232ae1582810622750b063770162299f0ab7703b17bd2dfd00e1f1d25e2cbd74557828b8b1272c019727aaeb4b000a5ba0a12a778f0b7157fc32d971dc7da4de7efc59ea5c4729bdfcb2d96a6b5565570225e6c70e572983a1e61f85d1f7c34158b13aff9c85fa4e70023bd99c516068e319004504e8f2ccce5d8b86ecdd692f062cac5bdcb72924804668b24a8ab49cdcbcc8ac7d9820b3d589ec13d881688c3c92d0e04b3492adb6b5ef627a33614898e23885d7162ac6afa01f83a82a1be496cd9bd4fe6657f4fe5903c09ace12dc52d28ebaf365fc469fff69cdd4c395821a0df2ef87c7259d87a27378c3465bded40269cb39dbb099332bd4268057f36b884cb0a9a8a72b5ba73da416120fa1962a95f651a0094f1baca2c7a3324bc0f01620704c1224c6f2c57fae3889802407c023781c710d7a507ea540b01614bc16a36ef092b856171d74cacc2ace517f77001e293b27e1635d7995b44c617baf794cfc3ee96cf526b10b239599fa16018c9e4c4ae6c1ff869a78e078118addf30995d9d16e648727539854e2ae2b5ed14558ffa93c274a6ae8c3e7a07bfe11a04ff6a881ee796727c697edb4feab665943948fff0526eada2b591aeb3783616bd92b18ddea86f72634d1c6a0b5e18c4129b8ab21d5ca07bba96a9eeafec855525b3a8ad1f475a724f368c5c35ed2b3f20fd124a1252a08350141a085da2880e32b97265a6ab4b4cd06054889c401ea0be16fcb9b645a4a2e39805cda20912e6c61ae567438695725f101f33043cea06dbe8336b11ad465cc1617314086212b7dc4d51ac19b23109cb62606c3e0f2d23d493169cd5fd23d40686d02362efc46fba77610892f47d72b3a796355a5496717c9242187f656d8108e33ae205d6d5faad16586e71a7d2722bff02e591e171cdc0c05e0e584faffcc025a198d42c61d0b7a82f3398833d729200eecd56da1e1572ff5d86be275992500cc7a7b5fdd65c689bf789630ab37296242d3d3027607bfc677de63769ea4022f217e29716aedce17bf32648e4fb382684d500fb5f53ef446cfd7e53c9e5026ef1369d08d9f050a3a3e8bdb1405f72494b847cbde3e92ed6ac5b002f46589d0a919d4209118d8b0656d7d8248f0172bad43d92b2d650ba352f8beb8264f8da3b8a3cf9b6b98bcc49ed9c96d429b272340f5558188597a329d97493a24798345903bc0799a8270fd10206ea021ef51e7a2eebf996720ff4e170340ac9e831600e28259dbc5432e6a392be8751cc7272ba0f0436e0faad86acffac7817c6f950bf7808164b5897a8115634fbdae7aa727ee2ecbef81409b3bf528b35c81e5fb8ff21a29f1c3a3357d698a7b3359c2d0bd819708d9c9be4b3fe3cf68c70abbce2ec257e0a8222b5bb8b47e3ed5df2dc62d80c099207de022c161b0e780d67dc24201d5c0d87ecb0e5b5f24befe22c0572b93b9cdfe752a16e36019556f338f76fac137ae12e0c30e39902cc88913b652f94f90e7a85601712a792eed1c4a26e8a996d723d9c0e518c1e5e2a8fb2171c4e6f6109ebcb0f0246e1f8e02aaae72e4f32eb9f9919d98425abf37eaa34b9163f87b17d6ec6de7073a9a05fe9ad497a85ea845a013192c34c1d523f62f7243a723d740aa5d618ffdc00c816a3a4f1938c816c0fcc440bf4ba8ae4b26355db4f7225e728325d11636e16fd46c0ccc26d16cff2ad5a57aab14a25d836d15223cc728fabe40f1ecf6f5676054a8e96d0cfd6da481e91ff90b61348350507c3f1357208126750d19ff227ef445047652c9d32d99ac089dec7f69a9a48be41a8137b368e39dee49013ead8ba192753423e83d0868c01dfa66f5c871ca8a3f0c68fa7725335a4495cbcfd602cf71aface6b0de876902d894b84f4b3ef2f2df49ad9045b308aa373ba8a78c6c41882b78480ad82768df7d5c64c05c8b801ef653766d572c190c1d231df30444796ebba3edf39c24f709e2f77aa5e52cdcd22944d63c64304c87e2a9144b03f1d57a40d0f3a852f8ee39a85c13b01e9a2700f7fa5361317abdd13a6174b6979935eba7082d9e57f24ddd02d5936b6c82b60008d95aa5d724f4e5a5bd4d938345ccbfb8c070b455bfd22349a068634e34856c2fa97effb6da884ed56a1c335d533d7ef14658ade1e7a9b2e823ef33b3ac526f48cdf25465da962c879cd1f0e7a51df3121228700ca6a043a7edefdc378f0d0822fda22cb3df47062dee7216f6eee92a373767085bebae2a69f3eb48ed431c48e11edf2c00b6cb96dd967357e51c51c24e043d0669689765e24e673855b1d4abbc267d3aa72191d91cb3ac3ef7f0dc3b120a746786c10d3f8f7072888f5f9c99fc484d82572cc85c110e4cbbef9d0f1d369550004be03741ddba89b08704ae987d407e4e572bbdc274afeaf29e38cd999c35fe32f28857d0bb920c6399326a295ad1273c5728cfdafb908634f6fc2ef9979a3556c71797bc3718fdce66a2f3f903d99831572d09bbf879ca0c2601f8826f356416ffe088b0c90b3d7dc2bee8f1b3ef87f6320c56af987f22b88d9322af52d10f7934b2cd70638b3e94a8122be1a125000d26a01189903235ec574527c23ac4b2ead798e97c80278d8fae4acebe9c0821cd372c434b306a36492f9db131f674cb033384ef1d781700e81e691f75048e1ead64a6e315e4e445ff0815a5bb17dc1806fc230ea47f15fb545eb816734d1820ea97287cb3dfe223de126987757d6f3b3b0ab64c899bd0a28317a59dd09b97a562672e3cbdec5a44dcd19834c5634535c42cec5a2a66faf18e73b2a999702d71ed5725693259c2b5534678923bb54e971c16362110f4494c95ea975d5ee8a486d6d07211added758c6bd1f34f0f27a621f15472956d7a07f28cc65d408a103a373372565e3c0eea273ad3e0adb60272ffbb4482c55859f556a5cfec4b96a0ccdcfa725fdc32b382d9c05ac9ad9ef65914298d47ebd9e8e4134a83d27011232ae2da72cda9ae84f94cc48d129b24a7274ef29e9e8bf336958969a5b153256dcfc45c72967d88a123a9a1a212712919802b390b3a44ac4c226d41310a0fee933785967204933713ed9f086b6788b70761432be92ece44fdaaa131763709d780402e5f72848813e93a1e24affc4f22f6e3f56ec9fdbc1e5a2cc4669b3949ebbbde18ad723c7b249a834895e4ceb6ecc6858ceb873f4f290b328c13b74120a29d9639a97214100665f7c58c601e16d68ae5ead76a4d3321d142ec074fdd5e074f997d724cb81fbfd45f3f33fc18438c33f01afad42e1f30084c1ef6ca747156a3569bc8559d12bab804442d496864a62fd7c09838515a71033a02572946fc4eb81b43616978a24fec01547dd612bf61e91de55fdc20c7f363819d453251e7972022b3a958bd87c79ed8bfaa8b455686a7258acbf0356c19722fb784b4ee4220bb42c4aa726e1cce5746e168564eb4edff47382e59f27f16ef9bf316d506cdbbbab57f387265d7fae124629c7e4e38fede7427b46053bf079b8a4ae89152d99bc3c43b9737b2b83586a48eb6c0e54e6b0c961f6d3e0193a86aaffe36dbf80e4fd0b27a176f2300797d4cc0dd3ff882d79f4769a195f2e6f7768f6a1ce45ba7f3d2e6217544209d3a67a09cd48a170e6231bcc4cba581b0b18986342c333f8e73155decec72140f80d45c7755b744f4d2962918c6320222b42c3ba9eb316fb5818dc525ae2f4f1308455cb2dc5e509244cf0b9ce963cc2a67703fa437b6b553fe2c5377536c4040aeb831e824b82d92d52b3563cb761d731c6b7ed2069f1a0f33a9ba97612a8709070e6144af26bb035123a6d2c2e1934bff1b0a2603f3d4244f582187724b3ef7d6e2fb188dd7c5b537784d9359f4c1d5ab651d0d26bc6f0b9915e914f5629476833beb4e3f49be059d0cdbee021aaf8f638903e81e12d9dea0d6ad8da82cb507e46c86384ff1f42c1f249c69dce4fbe697d6c07d9f18e240d5b8cfec5c12302de16079f0dd582867886fe1b220f1ce4ee2c3f6f87b1be1b710c243dfff72028681886e2b6de3b7efe173780f996c5642996c3401c563a43186f5437330721eb03e6842ba72e69beeb61836b7802d45c528eb3be22bc75528029a467b9e72c39773132c54f6b7b7b79fde1e98d88129d5107842dc82ce0d96b235d9fdf96d510811927175d21dc3a8c7b1670b509e15098ae50da5a05be150c60242d3647265f64ae6793411cde3fd6ff9dc3f8ee60cd83ab35445074a6ce87628fbac74725b401254700cac0c3cc6a3d09158c3e922359db0067a2ea9531daa9d242d1672160690b68eba17d471ad37bab5f23bff11bf529a62870b2f2b4c89632e042116ba862621f7b7c1a5fd2f2d6c33815f19d7876cfe0db6f8ac394302f6a9e88a72b6afbf862d6d86e2beb602eaabb5424a6d81fee6d3ae4d9708fd00a437fa7f352adb95f5ccc241bca42f18c6002224eab40cfd8950b045015184c2243bc1d33eb1351863ab42ce371b177c030827b8294fc71d5713154d9a0d2848ab2ee487728f4fccd1f520af16dd0907d355757e856190affbbbf70b455f3d682c0cc47509f30560c546517e84905ebffd6b170f3c10d67ae5e0b5be339fc90287971305727d2b2b2ef5ca8189dae4c7eae5567b826eb010ba48ac5cae4709860dcfcbb672828525c1a71168d3a0bbd7b113f2cfdf6e7323507bcc8944989c2e42639f1372b6f36510df08f9694623846d3c95a40b0544e26d11ecda78356b9766255ec858f0c6a6a144282430bfde455b857a29befcb4a801a443a5eebedfc97950491d37d4724ff50891cd3bbb4a073e67507b6f4e0ff29ad0110d803a933c74beb1a570de51bb94a37277f04f62f4d10910583addb7698e021d32d00de304f853b83800ad231b14894eb5a22718c8086aeb103059efcc6db116014c612b67abb4d80f0b0111e37ce47f22a2086d7f3b4db293ac2ec88fa2e533c8f4ffcb99b554b08f72d7ae9d7f52c47627406089536ea21f4ebccac03a0f662c9dacab5a587aa9b17299e06d68a355797bc518fc3584bd80dc484b6c3d0febe9abc24020ec13999472440fd99005cf683c6e129184960379bb437326881cd35984c9b88c1700e3b67269ecb9a1e43737d6bcfb5f06c3e78ad1926e6ae09ec827600381e87e5dd90f7262005ee8e71b7c8f1cf69b9b6eacc8b2343aa427ba5ca7939143c77e005b98577e7304f217368db1c4e9af1b39743b5b6013290dc164d6a093a39f033bbc26729589e705a4f2bde7ac48a268d923edba69dcf9858403857826ed3e4931ebf96ce6c1e6b1129807a998beabc98fc24025a95fe5dbe45d77345e6bb7d13a847972c461675c4969e526742832170e8baf48366949ba911c020902f6c0ebefe4ee5960d93334905de9fa2b20f647edfb372942fe17a67f4443c6e1afc563fa53153f3592fe218eb95a745c61404ccd899ba2cfe8425edf528ea9994af443ddc5ca076e4f381a7515a0391390051bf7b1145f22ee38937837d8d03107029b5559b02de5395fcd1146ccfff8f1291f6956381bb8643ea2931c6804e4a81ad109650a7201a827902f46babff4f5c20a5e6eee4c071a40172d6a5ee36703663164a55548517a15d0f4cb4f8a901d1d6b074a38588771634a8fb1b3a6119a6d25ca129069d8f1338de4ef664ac938da6a3e94d86fabf939aaa3a2b952dc65a23b4b8b9c65d6614fcca44689b9efb1152bc46682f4b2f02a99d5aa8d0131cfd56e368de61d03bcb7272211cdefd12cc4e973e74085ad3b60d9f89f9b9283bbefa9ad35d972a5a518585a293861823b878d673e2f8eb27276a8c50e222a3c9df39d37f255306aaa8f06922b75a0da614db8dcff10bc0a6816902d3c6c7910cbd52e1569a04112d22b19f857e15191e53ccc1f6b0e7412d863daee96e5996333442709cf8c72e30dd30849333ed62859d133f886699eb99c588e47dee2a6fd968fa14eb35a7284b4f97d4ee9e34d38f8df0147a616ba6b13708b3e64da0dd218b75ef9887472399044303e414e46f9338abf84db3e51b0962bce5c8818920815701766e8fa72792f9f7a21f67167749e9bffa1eb8e698bc28a848016712da5049c03fc095c4a813ee14f1248067a3647df1064abb72a59e92b83c72bf31532174cffcb926935e56f8f11af446b85256a72d7fac55a2cb6f958a8a00d7f41aef5024cd5980372686bccf3edeea1ec21c3768ca718424a15b743314f10a8679584d20d464f6c34f89324e3e27d8958d8cf7c6f91f95708a33d2c96ad167d5a1512c51c159cca7202490ad89321e9390ada3c9ebad8df0e71ddd21510de02bdd2943bfe571e75727f2ef5e489fdb8b57a8aa95a29c1d607143134a0218c0ab07fd3649de0523b7274297ea78b44297551c33da48d91df14733022f2a5e1ddddbc229573d2e0a172324350d776c93ea3c7b4511c42b5bf7ff431571e4d04df73b3560639031b84723af43dfcec32a93d8e8ccea38533af17693435abbfcbd137486ad325203e0c72b3062ce686767bb537aec3f44068d461518b793e853f3355b432cfcf2cdbd472e9ca67c0c62e7973fe7545d66aa57e34512a2aa387f6df0525bc242a73854a00eb57a1f010992f4ad24bba627aeb1b427390ffa11305610abca17b80f4903d6d61ac89eca8489847fee4d10beacd278d3a17e453a15cef6210f40c3ac36080729f63650569e3b83160ec7f61949bd53043a1b7d87a6b4412966c0b7c45737535b5214bbf5af84c934090fed4e7e6615dd0ac025bc15621ef7cb79f7e07c37f53a43a624465f14c7b09b7b46a36db1fc93eb070b36c11c2f764333c8f47359c728b26567c9b78b588a1c5b8582b9508679e7cb66e7afbab81cdef2bbae192c84c07baba11c3c814b40f3e45e90e407a783859ac7612b38a46ea406872e99e5b62ca2e28a2d6e42d7e022a8d4086879701e6b387a092d926f0e94ef0406c8d8b05b5a8ce8ebdb9c3040f9bd9b0ab6cace1eb7b3cacfcbf8b3203106894b346617288df732f90c572f78e890a83c1438aa9e83607bf665dfb9d5dc9e5e79921e172b31823dda26c6cac8808327672cfd97347867ab2875a48c0521d7380e7e3c810667453f4f466300c80e93d11190dfd1d3905428cccdad852b87b4eca09856a7225b90d025b62c372b695d786870764b0b35da02cecb88523a1fe4f71ebbe9c2e7e6c5de7aae55c953d6c65317962cf88f05f70fe6b8aca7101d214a979fb667204d50b6e93841d3b23b4d3fdf61cb58ee7ca8bfacc53cd3ed915e93ba33bd070c23b56bb484400f0afe1a19932879290870dad6925cf5b325e3100deeff6bd729f3dae9a8d36d49c04a3d32c412f69a391acfc748c749430efe74f4d3e410f72018a8ceca7ae6f644fa17a8e1f1bbe8979fe3501d2905cd71ce4f6aedb66f12d71b70846761a9be0dee773ee6365337e2f52f89e60dea99a5f8249130089b9728268ee4081eaa647905c3610f9e458357abc236da7d7e4ceeecef683f39a0472649d06e8d1b2b23bf91bff67172c4be833aca7eff43e20026aa6078eaa5e742ee99c37dfef24cb50aa80b7c35d81e83ce5c3c4c9f84c0c21d7c99da03960e61b87ecc1ed16270fdf8fd03516d06d8650ad26ec50fa8fb5977f5ab89a4453ef56b5286215f8de14f849d73892577ff3a9e89b9c4e3f663d5ab791a9bc8232697253ca178e962608b117633730619be3cb062c662e01758c15d05212284cb015728b7f456fd1d2f83d2f83df1e64bbb43699610f9961096c0cc9b3e5baa52a7472a336d43b2fcdb461d2ed867565a9e4c797fb73790cc1081226f64c2cf18012723e552373f0101ba1b4887887701e5c1ba24328fa276a7b9229ee99537a73be3c70a14b0f06c2ac3e2ea2b5a3ec1141a47eb7b12fbc65209f06726351fc037047e7ebc0c5ed85396eb14fee626d217f1eb9bf3edb2874df467401e07a7db52424169886c756e157a2cf68d0f1c6a2f4ecf35b596a0c5cab660d95c9b236d59572066e22f607946bb6cb8361e9c077570c8ae76051e7237b9849758922e6beab72ccd0626cc99ac9bf2b82df938b7427c072f9fa254aaa423b38527d17aadb0c6c4687850a9761e84053dafd28371c45e3ce32aa5f9555b5c1db688cadc7da4872756bfb8616eac6e90a01df3303186bae77418b2f4ac20ea8a86b10f85d73975ed7bd2b0696071b153aaed4d11f1ab42ed63c7e5ffaee47fd09d19c40294bd855baa334f10021f46fa66fb9783ecb5616b282bc167fc33e9b1b5321b7711a9b72fc1d0bfb5c8ea5f239734810394094526ae5af54aa17a44ef7f44a581d8afa7240287d7144b35c846dbfba57c7c785a2dcc8b6194e574d7528d65adbb490b77222ca91b93f5a725723e071736ac33974f60b5dd1bd1d4158ce6a7a705513b272d9bcf67800069d3c067dfa8a91018fe4ad871f884a54ac0ace27974a22d9e7586776e8aed2b0ab08ad1afd4c14dbbc65b3cb2bea86a120ed29c82ef60ff1eb6e502c675199f246ae80b422ad5be787ea5d35d83dad000ae8b7451b12e59fb368ccc6c34ed7d017d785a88c24595418eda1d66cf38fab61030bca60b2d4185372f2a0accfdd3a7b29500c0be907a80ee79dfc766c94b417b377c6c65cce19f4721d4f8197ac82696015ba04fab5d84c3737ba41b3568642315d4636c6d714fe72c04f2b010a367cacf319bb9f5670074b71620f5ac0c57ad26144ab89a0e5e572bb20bc717bd0c05a0c6bc2b343300cdc8c26c427349193c4b0e713126e68f54feb9827c5124f93fe9d923c76ed7b927997619d54ec65dc05b496093776278572adc57b6b543dd754131108d1465b5bd9bf3362a587d2e15bb1bf5e301b75be72a670df22adc71c24bbf158103f7c063166b7d869031cf9431cd231d15e58657246279706398d1c19a90ffb00f6f40c6fbca1252802c94206b7f8f22ee401610692b709100fc0fe13403339518f0ee1eb75cf8ba1c3318e54efd2ab8774f14a65fbf8d95aecef50816a1a62975e544c79355a8d09e1d4951c412fbc88b2cd6072ea2220e14566e73dec22a7aaf51b2753c2b5a812d2cf28c39e78279a13c7b27268b51cb678987ca3151310301b01d477d0d85f31beb177c67e2c3a42e5488d72fe946091db9a47176fdaed5183d93188df6d90fd2b186d9c8369a40faea62172eca61f2d8063f3348ea3909dbc5e29f41c4854130e790fbe87747d0f1fec7a72ba98ac257773e69ace8ce649562fb75eeaaa696e5387225d15c54c9adbdac807a90adf8bcbfa688c8042974c86dfcee606125c38a782becc976e2e15f1c59b725e8d1243008ef575d57c838511e34b38c5b573a9d24c8f228fd26715aedb0f4eb3ab5040cc7ec59e23e6d8a3e27ccd8416d067dde0d1d8ad0fa0ff43f24a177227aa8fc11ad98b85f2f1935ef15a8202954238ae0939452d543bdbfae970b727e1131e5c6293d54ee12f6082540ef8610c6502714e47bb759e3dce0337e44c7288dd0737ac2e1905e9cd349c79d21c3998d3c2dc9a214c63454dee69e1764772c1880c0b6caa495941a8de0e33189475dd0007f1785e3224b1621f434420e572a964d3142ee72e1d7c79b70b78508d18623601eca284b945696e8abb22eb5526b18014ae31de321ef3aaf5b559dd6b6324339911bddfd64d488978bf51880439f971e8684b7c6fc60a24279055087a300c748dec57cceeeae897b6adc3f45e72eb15e2714ce5437c7cb5a9b66416e70ebfed9aec828227dfeb6335bba8eddb4aa374180385851b9dd1dd6e3c64b5c174c973142be1c79d0abaef75afaf275172657f69f886c6c85bc171eb8901213c865de05bfcc403b8ab48b184540346006aad51c06d6e9ac06995fb11304c35a59c34ace7a1b70d5146dded899309696772d21b05dc0faeb86bb293c8a9fec5a1120a54f6ac9c7cebc371d526cae2e157722886744c191a3782ebfdc396eda6338266f3b36c0132901298f0ccba5e8d0f6d0a71e01b8a573a71712e8db5666897b04cc7ceb502b03e673533f26649bc7272c9fb825da1af6a0f66c43c73cd3ad89dfa0fda0fb732d74812954279ec06b4729fee0155a840de9f029655b8ff339ca1f78135c8be1847e2d9e98c0e2661277243eb292f525809a7b93fc1f6bdfe8db02688fe99507703475bf8a10df9654431b96466dedae4532c6511152f257e43f04feb0b5ede3a1a758ee1ba8fa86a9b727505bf42fac6dc4c4ea9c17fc809f4c3456fd276c7da6b32532fc249e66d927293ae89acffd99e5a465be7d12832b25591f0629007509244ded626a0f31e553915d499871c37907d074790d1f84a2638afbbe7bf8f4a3aad5c11caa2603aaa72e3432f7029ccabc9c177a721086b9a2e1f44b8fc25bbb68af1d1d85d2980d8723bf2a7cd88fc39c9d3a782b6776878ad88b39e6a711b456a9c9dcedf6cb9521d1cf92e652b4701248b4ebd6e7cb5afeaeba8da6832769ed5d4428e2853cff27290ee493c1de3d7d44ef08e3f66fd023fc1e5769a45992264773302618c12c73374634b807b526b73683031960610b5ecfd6bba816f25943efd9745ebb18e9f7248bd73e065f65dd2766b37410736f072c5325dd5784c764ce4af9190e3e9bc48d70da73537e694ead101522e3ea7c1872ffa5ff1b9829e9129758b46b677251844fc301fb93898cf70018a71affc1375fcd92d7c81ca99c2282d801c15b8381443af6b2f5633616da4222ff707b789a8a2d6f5ea5b5cc934afb3d143c2c1c115eb23989ddefc575c03138194edd049460eff765bfcd2e8055663fcdb73c1b45d9cbe6897847c964c91ec8047cbd206c560e419eaee625b82dee8cf3db8b2c272cd1cc1dfe9264eaf344114bfbba15c7d808f143e75f738334702495280dd5f725148561174696ffc8e6861d4f6ac6a9d59c43596abe6b884680803d2df6344721f7bdd0dd0b05d9135312272eee5dacf55e634f2d68409e956da751c980b58139fbbc56d6caec51848c2ba3a06bfe27d478ab9294f871261756086b029e8871dee34d746f30dd27255d842564af68e86bab7597a8090ec09adbcc29052fce07241a7166ea2021adfce872b1ba4f139d73fe9b63fcf81cadc72b32f3af024b5729d28359b7954456f95320bbc8b70d103669e49d33d512a841a3b0151087a37727d37c1ec8db096659b3b974b4c06f3dccd3f7ae1a61541e46d6c6b5d8854ec72c998e81ac7b5e6561c22ca9b1df0bfaa32070457481f19590084cc209c635c72b49cc21b7fd05dd78fc4578a051c19ee2532be14f26693b059db41f0d6d5f16083cf70f71a24bae55394d3aa07b0697e86d88d52e2201c6a2bda53376196160d34af08c36c3e09bfe5a820a2b008f3b463c0d14719754c91c0e1f0f0db1e99724c706a6870422599bdb3be69cf5dbaaff74ab1934618eb9b7cfc2d4e13a2432018a6ebe10c863c73ccc7e1283dad681d711d947e9e61a77dfe7ccb27708b4672d50c9d2a29287e880eca4538cbf2e046500e1fc5b29e7d98e60685e3ceeacc362c249338df0cd46b440c8623ca51f6ceccd0d65a368f675539e4994eea9e68728d35bf665337bc36762986b73e4d1d989c918dade8937f9707fa799c2f4e58724d2a059cebf5095f9888f61ab8b86bb0961bce36299e81bcf40cf15fd30a10726ef67825398dfe6cf702cdbfe997c6e017e1973d0f2e80051ec45c9a982c1c729df803935d2ced7ff60f220b5cb26e7bde68e4fc3b21b76a099e4e217b3f1872aa374eb5f0209b9a38437df664618a7db900b57d997626fa0f55f884f9dd1172c30f7d352f459eb7ee96194bf326df1e2de13e35f0a398fc07596fe522ecb072693d9992f30c66346ad7d74937be333040ced95475be35381462f34d97064b724dd8a11d2651e9fc5745aeeafb7e0d827eebc3bb68d199e3a445e6e66e2c5772c4042d46705d0a4c090bdf5e164d4a6b63d71e92d33b86455209b6309c1b4d1380f17f31b555144eef34e61b72d11c101d27ab0bcd04a7f47b22f039faa921725c876a60f3d1404f6d7715835f6133a9e03d0e7f0e49a0a49f9325bcda3cea17eeb3d12c5d3849ae45f71518ea8ab14066b926b8767f92ff507a53d58013891cfb969282f689bd54ed54d06ce29f7b0025f551ae777c95200cb22768dfef39721179d52e6d92dd86f218cd80df7dbe6d711def5a0b64f74a523742aa6dab91726e63c1d7c8be8835149b98419b5b7984189bc4776a9c6fd3307277bc8cefd0726ab95d86e5cb7905dd5b5b1abe0e10975cc8f0bd0258b86c05b7be400289c972b7e71c3e56342b1a222f6e68497268c8352ac33c589b9fa0bf34f58d10f708729224cfe0b5a0d39901681df122d5071554f8e91f714f92ab642552adcf937872aad0d5824c990f76e3117ac8a5ee6f88cf6c3956185c22da328eac8e39c37172ab81952e023bae173f2977073c01ac0e520f999141abe0d9c52b59be39f29b72b82599019855533d6ad8ce81e38d942210229fe27f2ae4393f4d67053416095715c18b93f99660c8a5efd28d8e6ff2098e3a9889b3217a556f626bb11682cc059f190a56d66a7f938b4a003592ce6560438e3a17d051251a523491a06a15ee722eb0ed6a22bfc34505b3a32458c4093e99b2fceafe1937c89fba340eed15572b9a5e1802346b2d9463bc81092f0ca194eb4bb1ca32760347b6102758fce7d655808b520b097d0bfb6ba20074e3c53b9febf7268c707724cb889993c81bd3035fb88aa5584f4cd08b51d38af9568d1e7b7a14683b5c27199098c0dc903668c41621a6dd8c1b27d5e0ad41e88c16e3777043436f6af889eca73970c82ec17a5072839be0231effa326d0a8dcf1664396e9acbe4fa9e76cf51f3c35758f38f27937a84020062270cd1e7518a40e2eb2032172d816fb55fde98ea1cda63172f54706d629f6f6a8b299ea9b127abe224a7f6599c93d6e745fa6149fb2d83156c90864794b1cb8f891d1a4b70df8128ef52c7dee4f9d1993578f88a8b673a507aaa77286264c3dba35eb531a40d2c49507fa65706bdef23a5aba23cb91e3aea5faf372a486cce307ea4148d5b4c010d58e0184b3c5463b1ccb71067e278ab5429b80563140eb59f86701f07d6ce2d6fb3efdc392eed5d5440aaa5d975aae526618290d6af8ef2e10ba11b0d65686f2f0866c1473481e84bb8a06c396cfd02b3d2ff37229aab21d2c3a5591b16c4a0350838ac3f1b98f586e993fdba799428b92a2f24f527f6958d922752f23b62704bae5190add8ad91dc43412a63a841d987bbd9a72cc1f7f41104405469ef2c95e5a9bfa0ff54085efea82d84b3e12ea03f20236118a97785f2a6ce23fb2261bae96683c6a82c291d5947d3c951cd72d75a2b5767281412494440c5a6b16876ad06292f06ab8e2be7100610dcfd6e82eee653ae76980863e3a64ebd8cf134b05f1cb0b5fd2177b516e1162e736ddafde91cf461b72bf26d0ae12928f5b379dba2feb622445083fa7114054422d6ac00bf1bb4f27726e1bc83f45fa16e5b191ca448677a1e7fce023d073fd53dd1b311b9c17729c7228ff896785819b3ce5d4248d9cc16cbbe232419bdea0d81b46181fdbfeefcb36b33f9f11ff5bbf926fa4195aafb0e7d09b1665686311427e98b0c65a4b10c4727801da694dde5d7f9b3d20f83f1e5fd2e732dfff3ec088590e2e6c6c84659c72c5319f1ad23f5c3efc7d0fb56bf0be1302b0a1cd7a172f3eb93ef39f75ea835335a6d2787d73c52e2924181445508418e27cfed782636ec3fcbfd436cc0b1372bf2b9ac919a24cf9ad4e5ec6e994d8dd12aace1a179856a79cc6612632d8f27227c35097d9076994d6135c2c0b96977c911195f35640eb08aed2f271eb9bfb2d9db7147e9cd6bdff3213791fccb91692d36f3755643677a25d15a5cfbf1ee9238cc6d4b046832b6de1ec68fe1a5932a71030bb07e91137e93f36d994b0a98c72ab7b843f8aa6fc0d29a0ed7fcb4e97f8393cd7d05537b05f684672be26f992720c45a87e69cf57fb56f0b8a10d1c1cc562a766e126dc6f2bec59dc8094e4e4151641f866594b161f450a5524e1e89d8fbfac54091d768de6bfce383025efc372b2d3ccbd80934a359a1202d918c66b2cf81be3216a0da569d518cea8c45af7725922c1922a5935a1d77f0e654fc0d24e75337a03bdbd25958dd45ba146cf4d118bcb11bdd4506810d37d28b8cdca26a05859412b1daf7933277ea6f8beb2ea7294fb1119988459c30e2a8f99cdd94ca238194ab8121e5ecc0196c2336774ad191505d9b3726ffacb01a0a6a47ba5be2c6aefcad38b9cf3e4b9322b08efbf73728bb09c19c62c8f69bae31d3c4af3302972b518e74678516d6d0b4ba65ebfb317c5d9a27409573d821e954db86390bcc512055734b739565a4fefcf02a8b149723dd6f52af7267520ee4f5991d98811a7d1e420d3ceb5135a7c4c3865b1b626726211a6ab97efd8926ed9281d6179bd2a6b245eb5e0e57723c9f87834fe4efa72eb3189d8cdbf09f6169068b86b6ef7917c5969d6a6beda7276660fd0156a4d272653055345f2557fa4b44957414abdab8dd56acca2f87cfe6614028de104741dd90219625e4b58f3b91759f80381855c6ccc6e8be9a8da214dfa76389bf7bf7212424bc8ef74853c62eec6600be191a059375b8fd038e82fad260a725f8e4d725394e00d35cee3e12bb6b83c4f0f8520419e6276aff300d56985b8f6bf77ad7200f45c389413aa36e1b42909edc3caeaa29c70ea6c57c8c4c5239ceff1799862862cc56f7d9aa5724c54278f49a9cc6fb0a7e7ebeebac8e72219718bb0617e08b12d8b8bb7b0690377f72798a95a32d0208374e205d2f430eb17417d57403b70eeb1cbfcf806110c5c157ddff86d46b0391e3c2868ee470e1e47549d02dad772df1534bfb83d48a30e859bd78cc436b12b9f479fcf6368bc85a30b4a0dd310727d6313e733de84998bdd2a20e8b344f7cca1ccf8eb5953bd45c7957e202c18725ccd14a4eed4275d443fc56b0cb2c1f58f66865b462c7294c8b76f2c6a3ce77245d5b9f218635843fff9047364bc4365dc7fa162ab46a63035128a1d043af1537b20404d12d8772851c84aa330e9f8a3b7b83de50c12dc776d564a3d9cc0ce72496edad59f4560d26ead98db159d974e174ea334a64901eeca3933b25ca179728feec09b53d4e1819f3b5017eb832fc3009eb52c9dba2277d925c27281636b7272041e11285560ca16b535a06d49b301351c1b4aabbf2f7420d4f86fe0e6c27281633f7a12ea043d0883464bc9ea6c65e674bed77a54f3d21539b7b0a3121a175215931ebc1d5831797ac80dc12f473566572526309744e5746d06def608e872733c5c0e902cdd4947d4611cb6e59a3fc64ba1502155f047f66ae246f61283727fc18f50aa8ec4a00a230423f2ff31afa72fcca7d4f483ba5257eb33b5ea36720919f8128d9cb82a20cdb0b1cf18abf076519ec643b38a6b615d652fd67efe64158778a3e3322ec7df17ddf76a9eeca0312d945c77b3164fc713c209c2bb1b723790cc0ca87ceae3012ee4c76c75c03d6520fda04d69d79b220f39d9f4e6a8724c962e5d48c416e661a9876cac31ab17e4bdb291960828f63e0d4c0f9d7762236ab43859ec9b4892819521a8b9fae040df2ecbc0c53e97afc6b730aaa2c2d17218a1db88353860f09fc12265b94d5dff6ac21efc205bb9cf06c6066a578f99724e75eb867319a3a44869e508a923916f9a6d5597452ca222d3e8c518d6a6e172056ca654a6014be366b36c91c464b513997a20a13d5f9a92c53b6f82f6de85728aacd0a8a60112b1f3feb094cdf3bfeaed6a83bb1af2eb8ac8c43cffa6afbe043ddabbe927b2f33d04bc07e3d80f91a5cf98c40985b267553d2d7ca3f52b9272d1794548072633b49f2243eef5044e1b00fd7f3943a161ae1aa55e3e080ff144eb57c4f8d6afa2917ff4afaa839304c0bb3d34d7ff57d47fc74410f3897e371eaf7e4de78d33e25ed7b15e7e8b0c991393cd271836d214c6b652b79effc47430fd598738231e2ed3729df4277d4f558bff49ba61fe4c107581c5cf41a3ad274de43af3dedf75ad76cdea4ca0b20bdf38860d918ae6c5d197026987b58365f672f004485f2ccbc59e6965ec11fd05d619fdb3e5e93ac1ec1194d45a614fcb63729019b4a0868ae2d30ac91209ffd8b9e8e2750842fe06ec9e036148140e903b72e8bcaaa1975d7ac494a5ddf1e2580602aa2bc12db55f212aa59ccce130069f72044c2869dfdb0e529bf01086807036e59adf7d5ca0bfabe9036f6da8c2214d2fee4887e2b6b01562d70e03dca24b3679f23047f1d2e6530239acf6bd686bc33f63524f7724f9b54680eb7a27de9938273a80d3ed87741f4207780ace6fee7d72c0f05ce098ceb497ecd4488af2b3f538c4dbe8e249331c06e244048625f05d47a0c2eb9ce76307495b32eed777adf398cce206a2e20062b0092c15c8c0ede672489fedbefa7049765d07c376f3ab1cb3a26b9840a3c250a0d47ae71a5273c972501d44cbf47a47ae657ff01095a9de2b04ae88b942629b40df849a5ad336780b08275bc210a0f2536d77dc7bde03acaab69dd5f4c70fde234311f45bf1fd7472a0150db03ce65a95243716757b5c510dd1005c1846fc615119bfc9636ba99543828bf0335f646f82ec60d8f53a21b827f4bb574a99875ecb05c5f00959980c0b2e627b82cfbada8b833e4345702d190e4eedbec4d211f7a28a9f637b17e36f39c4e1857b00180d14c068d31b619b6afb7305ea2f0af90692b120d166eeb9465e9fe1af21eb21a3ed7f3b9018e6ff6c4a991ca493cd7fd466672a1abd36b1da725cfa2ebf6335eb08febe09c17ea812e1468117457771233a7f30c629545992728a2d4a3ab51bbf6b2f5243b7a25bbbc92dc2d1970d95648854a5938511505172ba3a1b9ced94c703421b0766a0b6e4d1605ce406a39631aeba3b09f12e29a07222279dd6431ecb5852a6eb67ba01259210155b6696d027f15d728870aa02d927fcf64e8b7b7fe681fc5e286818b54ea216c9b85846c9548ac77b13e063d20c722481f351318216058d361d405f0ad3c40f7911a19199df44c88383ab8e009b72638cc4f4c078b9a1eedf74892fda303afcedd0353e01d19c8c7b442e5d985f19da673a62191290b408467e8f53329a8aaea4c83e3ef71ae9e45ed08c460374723cb4f63095609fd6db47a15343d8096f4eabbc31ffefff25988d007aa0666244b159e35042dd2b5b1aedc54b90172a02d337beaaa99890135f71bb26827685722b60d4e9b9c6885d3c10cc682e4858c7dd89968b4cf6a6ff7d8c719df4bd897297201272cb7fd87a2f13d69c826e831a625e2b9f4369ef1e34928adb46d11f724d05a76baf235b4cfb4d41ed7943d19ee60f6aaf549e0cb73b6ae03e1205880c584ebd1406a71f6e39f876babee95d3697a6e7704326bfcd0a4dd3a85cb2df335d66a9d6ae44925c72b0f49ca2ffd96fd3d9334d907b69b4d7970a2aead8a03ac11897d9f7ccdea94fc5a9c961351bf45a1c5f4076e97248bd3320b9997a7a3202754fc52df31ae2ba6bd2d5456939fc14c0c08ed2f8d77b0475d20a95be9c72d0afb2a5bd998e43339c09fc3bbb4b4b5318d09dac81adf8f48e47aef8b85f617676a08ee56ee4a27527131355a1c590a8841ed49ba60363cfddab9466770e2160f781c6788ceafad43bc988613508850486e76741f2367545af399205eece7261955e5353fd539abe155a9d111e3642d0b0ee076aaa7daa7a94bb4bb26ec14e4329b6fd03ec53e08a775f4d776abcd9253b100cf584d337ffc802fac12d1e72c387e507015eae206947e431ad536fca363df410904d2311a7333c6fadd1ee72aa47f46211ff32378fecd205199546f99b49e048cd9931c4cd6114f37771c80983783884407bdc8bdc91c6340f2c28f2729249525b649ec3cc1d49e42a3102102d30a7d5b9be0599b0d66bdbdc6b546eb5d7fa9ed56fe187952664647d04863568cabcc796d8e9642652298dd0b22ea7fa0264f96bec4a68de28c86b76a7e472ceef0ab3ff2949672377820f0412e08d98f8f45db3176fd3f19cd00d78fb6542a21ae6427bf51f3b2b656e719a0c31d39c0d4553581f2632c5d40336e3e37672e7a76c39aff2c6f879651dd419562ebbaf0a84e9bf7cbb95bb9ec4d45ca4f66644bd4a11965c3d674ffd1706a9a14b9c4e27ba4f9266edf39aef81fda759f9725da404b76fe6e3d51ea09623acb48cfef00e7c0ccf3117073aaee3aa2edf2272c4f75c606f4ebaa002c2ca7ada1450af7707416d2f30279b1f0672f3b1fa324068df1dd434cbe9c5d29665ae790a0824ae0b385d15741e6587aced07d2c37b72af8d8270e214791aa2c866223d1be62507fbda7e3a78f3878fbce378c68e5a72980571fbf4be6a2a895819e6256981a97fff243399afa73d1190886e72f08910d622e8b231feacc9eee12a7e30fa0117cbcf3e5922520371a9f348d67018d372b12eafde0b8a9e43cb41cfe6b92a70b56264b144ae3685cda90851409365ba4493355cc9d709e4a60978c8fdafe31e67d65bba9228c9e1a9598c995ec04cdf722e00d2c6af0f550134fb843d7086cf759f39b0957d3573807c55addaf9f77262eab185323c2299cb5a645511717caa1323e8058a53756ed38b443c4e1d02067228efc1f54210fc7d1e5f5c3b46ac224acc3ea3a3a9c9eae395e2a5ef7b275172c232ed33ce395745b89b5732e8e2412912276af51e7a1bdb14f60d2d20e1167292cbd51236d8455e2d3a3af09a06108b01d951916c8c2ab3f3cbec5995cfb272fa1ab13597fe475d9c63eb851c43a57bf3a00c17dccdb7775cb45224bf83ce1902335c4db424cf091944d77e432a8979f727bddb80b043ce34e2149b9d88c4317f78a630496ea438d3c9c202d86ec09a4325d19beca14dc47d663a707ff0b531518be9d78b3ca672b9eb877dd230c72d7f682135ee27bb2f1d4dd40343c1f06e6a16962abec6ec056fcd382a59a0ae63ba70c5d24b4c0ea80287df0f3d6005728e64dc49fcbb0d1f2f5d72e73367b80940654088f742d355a4ab8296f2afb43e40f473f851098e7159f2dd8bc84ddb01019a3e7d5e0c06020aad2266b0808f4c4d113a3e2601474635f10b620166ffbce8dae98639871f05cb0ce167b256e27225fee4b4648e08b80652d2551574b4b31fee70be3a28d2107593a3d976694a22d45e3a2700c14f791ae02926ca38487326742948651d78a1b6833d10b75faf72f083c6b6a4c73a222d36819e3bc7f3a3b87c11c1a4d257f343a2f7dae923be0bfd960d790e4fc06cce63839948ebf3392b20ea8e9619581a89fc190b4baf8d46137eed677d675826d5efa5d42a831bffa8707d16c1ecb24a984d4d96b729c572059c4237b2253586ba04888ef0d159530335e6b57b279c01cb9135741ce59a53ff3bdd9f1a93924df7f471293d28ec0d8f53c1c2c5fbbd2dd991961b4bdaf172bb2086e19c0cf3fb206e57e7aab1d4f5f01b21549019ea90796f2be2aef6d442bc407a72090df2797eb540799c018991596541c39179a9b0161e21b73363761854951097f1e1ca1c26ec9c6c3c0832fd0d2fce1dd9ac1b447ed8b1eda972a3117d358ff0d18abc76b1a54e27dc7c48258f620b1bb9394525a48e5376dfd9ce72490c8068abf79afa5df89afa66049b9643318337d967484f1389f2f683d0d6723e143e7a12b9aa08fa59cabb2b84ec29905f63bdd6ef97309a81b775f8ac2a720877dec6febbbcfece3ee5c2e6fbda53a3af96015c9f13dd3ae3cd46418157720b73828850514de17e4d99631a96cd6a6a0b273cef07c565b4554d17dd298972e207c90e92aed1a33e5fd44c19def847ffd2ef57165a6f457e8730c0b0720511fc83323e7e075e13eec250d901ebb06c059c383db365811c09f3fd0f48cee30240369db5a5948833a0ee0b14f303b74518e08431e2c5612a198644e4126f4d72b47e30d9ebfd7f284a46da6a3cd0b1e851a66d7ac56a4cd6d9244ea788a891724bd5e8f8ede0b9e9abd58af2e140cb6a200febd4b8aed7f84f17c3ad0eeaf6723eb47dbe98efcfbce01f06bc76983367cd83c9e4294e114ce5074514ddc45972e7cc7768d8f57a1b54ed3fa7f227d64af50204ad75fc637d74344c7bdbf3417206612762c3489216dabd4ca2174333b636b5fc4ed28f9bd4f190656cffb27272b3c1ee5c86698bd5d14f2aba746e52b926ee86791cfefcae1c794b5113c624648d66c5c3eec1850cce3314d46a0a79be500db437d86dbe2e8937f38c23c35c721b5b409c1588dbc738364d8d1ed417119468d5a1bb194ee6eda2caf5517a6d7206528c0d79268b921678b4b2cbef30f615871c1e381c52e476afbac930180b72dfcfc3db5b2765a0044d47da3c914237ec2d97d3b0bbc24e032788896e09763e029a21f65e5a0d9b15f60864137066fbb7e3370e0bb06c181cb62b1b37350a7207f5a898f0fcec0115d9b83cff6468e615e84e076360673051d690d6918baf72683e2c1882f76715426ac65c052f746c41d14acfc0eb31a1e01052a6e076d372fc8ed290bc3e44525fdac372bab12abef8f5dd7d2a542499cc23585a9902e572af2117dbd1235fdb1715c27f664b57d7b2c41f7850d6fdcb72d91e87e9dfd1724361e32d4edfd8502d1f1711c5e36a8b55364028a1ce797cb532614380596a7237b9a6cf01e31be158a9c6972185236903891fa515c21a88275c3cb5e05ec63c2d30c8fb9d0e9a6604440f5554024a0ad37325cc55ef782856983101fe3cca19b11f8639e4ef1193ffe8ab20fae8167da61c47040a116f081471dc63124e2e7221c95dcfdb9d8ddcc52d96033bc6075d1b6e8f3ebb7353d3b0ed59140b611d721739391715cb6bd0aa0813ea70d2deb9b7330ca77c47c5f115dc8c561761d9724c17af3308c1533d2f6400646b6488cde0330c4248a97229d6a9a202f445c83ea90b2f1858d9a1d3fd7d9e12cd53ecb685b5423474d46870acfd772b0a4fcd725b711c64b2ca2c4b6deb7c78808a79c22676749b214c068291cc4904f3a61c72c540c361d7d732332bb53ede719f07ba3b47aa6b9e79a629d8503d01a3a88372029643cc212752be7cb90fbab2eaa422e1ddafd93c1c4d85b7be17614d167e72aa00ffc254bb6238d712126114e8cbd5c83507c8d9b7b5f1cf924301b7beab7251c8ce8870c476c0b7a2f270308eb87c4472795be529da61edf9a2e07365a8729721f05046e841727465b717bfd51cd036222b97cff8a7d7e3dba6523fd50e53f04ce7ced37668e12eb3b21f4f38f373c1d1fecc2e6df36f1b53e6c0dceeab723b993c2bfd6e0355836f215703556edf9aa9314a87d397d893ade18d33738e72e2fdbd48b6055d310edfc51ba47a4e55c0e8acec04163a73522902de373daa72c8ee03200ec2afef92d45ee16a8ce44108481f4a0ad91349df4b7ba71350ee72ed92c505f493962e9999751df24bd1fcbf4768d1f35e075061dfce91e2bcd072be45f8a97e53adfb19d15f595be2acafc28424fb8e2121cde6a1bf145809607239b507a69ef295c2d55124e992bc23dc4f0f19cee1c69e19b43ed4f83e6575728dbb535c7521369cc3a3f6a53224907d36a2ed553c1912c44ed9c34a727fee72c23f977208008409f9fa158b21ca870a341e9c5dfcedb0c432a51e79c55df072ff6acc0da7e580bfb4d715479348e52016386203e54f891b2e71abeb160c505589a93bf6df21b847475c89ee8bbe38f290666e032eae2baad646b706b580c20896f7c31e24f3fb0f0b81086a872aaccf1f26925af9dc212c7a10dc99f6478572c4c304ab99f4461c6b119cc42746351ad6c19c21ebe719446073d33613ad0d72d8a5ace4644d9d3b071f1986d3ab84c917fbbbdc809aff3c0c577ba09b6c88728842198168cb7a2c2d275f61693e249230dde2d13199132995bb45db2fd3021b7e2cb6bff817681b4a474e02528f74c5e8fe850a91df113c140e8957cf42c3512e2dc16023e2f3e9b9f8295cb8ebd86e75bbbcd1332b65a5d85cb7aa4f1f70604e32fae669f6c1e182acbdbec9c636b9d8e1fcdbc69e56ad14fb680483227f72ac2c065c01ecadf1dffd2209c9f2f4ca657b595d0f6c51678efe7469a6b35a72303d85cc8510417a97395cfb453edc965b13d21f18724fa220d18f33f7549172e4ef2d3ef6618ef0c0c7f9cb9cde877606870ce0daa1bde9c66cb2f26154bb17d230bde7b19c8a89b7cb2e7b1c9b5f9a86d66c2035c8d6f6294ab13e1c22d76b602a69bcdc8d268cb40ffd57d2d888ea427d75cee97dfb867e32b1ed47989c0068bf82cf116204f1ac9f8c73bffe36208100bb65aa1f89050d4abcecfb6c3c7283ab178f2c25513b5e008c3ba67ccab6802f8d13dfb2a04733ce9e2980b8983a9ef99165563af696fd37fea1fe6a30af5da82b8c34cbb9673c4fa3287fc55f5e0140e7d46c428fef3664a9e83667281c249d849f4640685558c827a1881a3f13d3fbae79fbc1d7960ee67aa3d66fc00eb8bb6375db2668c9248c1397c7603b72206414c0a3cb47040d002ed52592cafd5f581b21322a379d224c67e9b4a0b43e0542b652e637aaeed59b2688d3e18a0c5dc10a3099ae11b5cd33099a17c055365fd3dfc1b59563a93ba588b67e46f48bdfb9a789c320dff51ef9514b5a6d404252848ed881e65e609a9a962517eb7a1c4549f3984b002dbadb27bf2164dab1401e7630d4fed45ed5a0a7e0ed24214fb1d00dc8350cb0c771c6c3bf5e92924372a9cb956a0db2e82c226f1ec1eb56433222fdc7860ca6c12c9666d9b2abb4837222c36132ab6c6a8927b8b1e8caf3696ad84d327f00b61cb2ce8d9f535d06061e10fefee216b7cfd9504eddc157c4b4a1c310ec8fd850aff457aab2fe9bddca72dd565fcc7561cd37492c14a0010910f4a2ddeacdd2c5e3843f9ccc28e668c372a45e5c9c835bbb8f790fa713fb2849601499848da69a3a9a49126b15ef509f7276f7bde4d1b272853369ae0306518e79e1358bc3b59a3d239d81024ce6efc72fc1b542a89a5e8e7e262b83825b560c0fcf743e0d97cc3d829fbcf0b860f84e6c48122f8c00a8d9d027d4c12e6d145939287b7b7a52e9245428b1011dab91d27205748c99c9cd254179904e7fc17278e8e7c52ed959281870153df23501c05742ad5ebd952ede4525867ddfc7e4dec008c68a6818a7a8a5a7acb9a3ff7e28d10d75cebdcccb7a6d9842920fc4640c0ac1b8edebc61ce11ca2b6d830056b870608bbb4eb8516be1f55f51ed7a49e50f2ec62810c47b68c9a1a1146b83542244e72abc2ce52cad25b87081856572caeb1f3618b1460d097096ff34d5837d7050172c790ebb4a5346bea0358b1bb2bac7a8c4bb30c4906e3cc380cd4e2997cdbdb72a200f1535766cf483dc26956ecd6bb7f24aaaea8ef62c1dd604fa3be500ce5531e1aa397436034aebf760a9a2b920b47c16e937184f6dc31b7c481257457ce72af9efbbf6767759e83ac7fa4bc59772a3032bf604844f6fa8b08ef800d41d1721ae747ce4e09bfc5b3753f845a20a1a4c2fbcd57a253195ff1c16a405a64f54a3ec97e2e2ccf8d37e14c6d64f2d38dd0626844667fef28ad0a67271217b7855a341df8cc24bad852445e65fd85c82c986c8185661b140e5d15125dd18963794ff36092f525e1016d7a38e76aabb1afeeb754d7001c0b92a1ec94a1d8adc35c728a83784118090b5a0aeae15304e38ef8c1ee7d022583def2bd288480eb0e0a0ce89b55bb272f3bbccb68aa3edc9779171fec6401c7eacd9972639ad6358034726277bc719488b3dc7a1d240a74d85dec5baa5f0f9a503a2cd992f23e85880b699b8c36c43a1df76a3952f7fbd48c8687eb956fe06ec271ba095f55d1e0d49472b83ce5baaac55eabbfcbc4d8a7204a598c5100ee2a9079dae7c3f221b6f1c66fec26bd48ce2c63cbbbf6e541dfaaa70ffeecc0aea475e5f75d33e6564502ba722a34a3ceafb2836e8fee7182e431573f533ab027740363c4282073957084af51309caaae9fdea6f622131849b945898314d5cb23f8da5c5b19a06743ce018239f0fa55c9aeb9303e3e502bf6545e6b39811d943fd150c99d8574103657e9fb6e579430723084ff4df8acd03c019985c69f36a83e6dd63457a80de4f3b7e30772610d8b429d549ea0c4af0888408426c3d7be883f282502a002d563a8cc8f3f6e0f378f5481c176c1fe8b44c4e0224b8377388b981b1cc5459e9df392be68aa725ed56c9f414f0980be198ae73bd84243558304499fd1702eaafca56b352ca52daa9c6541c01bfeee2b2f5b75bbc40255315e5bef73f1e268c1a65d29d3f5a43f5471e7f83284ad699823609f82d9b3ae538e5522653391105ca415fa90c92c584e4680111b64da283a064a2ca8c1a5f889163132d4beb19680d22d66cb1f2e727377a4059a9b66de2776b69ecaecd8dbeaa9c4f2e7c94511ddde1f9ce399015fb7a3cfdf4cbf6ef2aaddaa79851e810069c6647be2dc71b39cb19f5bcaccc55c65c020adb35366c199985a594f7a9b4dacce8cf248971ae862fc4ef00807682e14ab564d9e0fae043e8f9550ef1cad7d80f966744fda02cb352556a83806060af57c610f5afd84ee0be05e7c7df920c2c7b0c4f7520627107d502c601922bd3b21188c72d0313aa540ea83610265fabdf9616fc20b3a9eea0bc738c6d5aaf427273c92a2c553490f12fe7051951d0b84dee99b49183bcbe68cf9f60b04dc79728500457816eb70ac18c8fe7d8deaa2a66a9f42650a8ce22c39e82ea62f524535990dba8c53df8efb59ff1f17d36e9ee868f014e2eb325ade6a03a721791990724c1c333de48f69a5eac9b439d7a197c070fcbcf729e3412430477f77d38d1b720802c45dcc24b879e3c970ced3e7001f748e3d41f257137050245737f025be5c7d991220ffe045ba29cc1fd800657774f3dec7a64a5456c9b3116a7e4a97e272e1ce3ce520098d1a27aa87fad9890b64f10beb9753ae8ea0bbb885526e0d4672cda8b2b63b48d4a7bc710236f217e3294c27ff65bfc50fbcb23452930fc7026a0aa34f19ac4151c1fb381bcd5187be8952543a6cf4b90fa111c28ed8007e627223b16b8943948d3332bbfc9c5ad1e6d7430d0185338197cbd0f8a492ae1778726eb7ae7034af7f1f99a45746f3a5033f4ae1f852e057098a721224304c4c5922730fb2ff834814aef46bceabf72e359dba402b6252095f488dbb8c879cc7f972e087c6be2cfb21c9b46c290a8e1542d3af6517302bedb322ffdcd44c6d79f2727d9f98a191ed386aab8e1376a36b80a8e12841b746bdc98c1e1fe0b0e63b091715212154308590ef6f3250cc384657d229de1788b633279e2458800d511fea7269b330b15d69dea4eb17512b25218ec149068f7bb97e409c19fa1cc7cc8c4c72c68f1342700aa0b273cedea7028002277ec9a5e6987667cd2ea4abffa1c1ba6a82f31fb1eeefa66e3d5c995e1be46d276ac1a79aa7d7695b0f0a6d6079264872803dcbf2f210a7f1d8af90f7c4da0b1d40608d80b2eb2a2cf816fe48a9af1f72f09b5031386b9460a9d8c47372f039585cf7f0cb1729b06ab8b136d1d62b081e3b11cec4bc1efe924617eb4471ada1334e6b64c554a589a05d3ad6116cffcc34e329856153759ddb7f51365e34123f93e34672c57873fa5890079e05f8964250a10908a44eaa71cf189b519e0a2b66b820e414a5220e4105e99880e0de4dfe72e0f66e0957db4815423dda6e373259587ab6eb4577c8f2f5b331cbad783b8868dff1d6d691dcf7b198c7e0d9655d7370b0cbc242e7c7cbe199bf903d4979082d3320305a11effca90a05638e40e2e841a12140b38b38d091ac2b2663581b0b3a97d9cf5a4a8ca022314f171da5c6bc894a5f0781a3f1e11a9f8daeb43d47d572ce47795abdc37aee3d4c7933ed953f55c7ca5f642f29e6ccf3f728cf5796e47206f12a9feef033e9c35282d03349398c776f07b6f2f04f47de795a8ccb3f0b24e5a3885e4352487d70a18e8bdb35db935b8974e826735ed16463888baf1d506659d37e3a260738311259af6851efc2dc09c1c4eedb8e67a57b5281ca2a7c1072290b34b330b68f22bd2bdd1ae800405d8ee16a663a7ca26ef1f8749c01517672d5ca8883f9a849b452e00b37a33f94aeb5f861c6dc50f36c1bbb8cb26c2f967262cf421397f4aa8cc96fc1e8a1d0543dd112e1a8cec6f84645ba0b8ea6d9bc72317e41dc273fc82124597ba8f976a5241097a060c8085e5041bbfa04a00c6b646a0c3b3fc5dd956eb4be2a307432b204d7730cfc2fa54c8eb52f90b28805d71b359e06517676ef4222db69a82c84c20d72845e45635d276fd8c7db5d50ec00726b8eaa44c75516b175d39c4ae72f5a43b9ba28434348c59ffbccc9b4486096062e1305d468169636ec8911ab000d0efdc2a48b87323d9756cf9bb3290e6cd91be679be6e662481b33e7dd25a4acc99787efce63d3b80cfc0432d37c0a302f037c8b18a5bffc2ec9fa08c966e619dc3a91aef0a6b26d7c13adbcb6d230def70727934d6051c471ab03a2cc085939ffe0cbcd8f839dd619bd904700ab9f9391f729c2aeb32f5793cd4151bed26a726bed6188f32cceb3197df08e3b8c26c6b26722863b04c58bea52f33bb87ae057267b0da76549af7af1630226053dee65b784294c11931943187f14125888c4d52359b33256088893a4c78f2aa541a927dfb72f5cc77302ec0ef8bd76a6933bb0745f72150e61fb8c7cea27836419a1afa8b7220f6870b16cb0b2dbfbd2bc5a94d544039d4b173a8b8f8b728a26fd76f9c53729ac1a9422a4c6224d9de1189a7841c5c65f981b47a6fe458695b61f785ef0b728a9a6e3bec83db690a64b23415781e33b14aac945a54e0f88a48f2b49fc8ba721a8f73f217085f165d5d41637381ae80a6bb21f3c82a3f6c96697fe03da34f599408960c83c69938f1a1cff91d67c06dbfd63616983586b8ea734339d4dfa8720ed81d1a71902c50c10abfb64afadf0473bfb07e02b864d7012d9cbabde621464835bbe11328957fcd144b2c783cc2585dec7fe06ed0db88b2a0ef7645b1db5a33b218c897e157a68270f1439a14a47ff49dd4d421852e3197a654f6604fac72ab2c94862149a94976d99973daaa7533f70fdb1edd0812d7fd2dd96812336172ee1b2225517a1bbdbd60947e586d932e1a17a626b2e96af6bbf9cd742b66b3150234804f7674060369ebba46415de5582d00b2ac9dfebae67d9b363c3f8ff672f970a65d59213c8f4be9ef794d2318d9b721f8b7887f82918db3dd1f339aa55400672effa3a747dfa4f11ebbe23c709f0d5b9a8a67eb4908c30f766e5f032272ab5adb0afe4647927db8d0dbe319b91ecfc5f171207c2e0cbd95a46eec03b40bd6df31abc3d831c39c7785d8ec35c5ae09b3beef1ab13175feb86945e7830e72d0be10b0a0bbf983e5194c60c513d0fcbbc653760db6e6cee3a21eec3bc45250a997607ed2c0bc9ef20c915c5896a0c9e6aaca73bba96d80532119176decc9722ab557a11c6fb54ac32e933e8f268897d5e56af286a62e17e8cb04db6e1a7c3ebb3af0606a636f2a59d2d04579940961ced871d8dfa3b41247997b56878c201b3dac5492d5e505bc4350cca136542bc5a1474fed227e109207513706dabf5d5b3ac7bfb3cafb94f18755487e968f36c6cdd0590238088313859e1f535530762fa8b9906b5fa7bb4be71f24165faf0af863924281139a4b8d798bb558d8d8823b2db25190ad18d7e507449f1ad25a056f23065891f2af885c5b16802287048b270b3070d73583975d5db11c93fa2dca93f5507e1f8c07a083f02558d8430373724706a92e1fb648cb3960d337dda77337d382cd4f338df535f22479fbb4838672d6caa81ee921fdad59ef75eb48b4d03e278ecc2639a0dbbc44e886f5ac93ed72dc2e5a0446d7de370c19f37f5c7070d3ae49a408adc1df2b9f09d4a0a41a9472edd8ae938f6ffbc5f3eb30d69d565848be523201a7ee43b4ee4356ef35f74f72646f195e22e7875b20045e80925b02c7318f340b0d0cc137816052961fb65c547c4721935644ee13477b8dde987f0fc9c5129d5d5b1e9103eeb01da89cb66572d3d9b7d12f0b3e9a77d3bb5eaf01d64dc20ac5ca7859715e714a7bcb9ccd31723c6fadf4d358146244d52e3bcda665dccccf6df0773dbca1a96e8690472a38727a7b37a8bc7244e5658de076b442cdb29b5377ce591b1020eef95523206fe6048d6841ec968d0b42dede18bcf4fcecead470822297ad808c676ce2fab91e5e72bc819468c1c7131440235727a2ed421f9d3b20275c1c8928a2b1b3a0df77c41fc197cb88d307c1da4eb1e6c62065172b0d7da0eadaca13306dfb23d584a70272864a7f4a6e431defc2ea0b30c1d4216b58fd33427d2a0b296c26c6648cd7cd1162e644e03ebef0cf362ec98b1e88e191632c87f33cdb2eba1e66184243386a38685cc992bfe88a9af6a554c73e289c0a8178c7572c67f2633d511ae58baca117d8ffc00f90ad37981f97c654bd9e021c6b3a910ecec1e6ce5106a7b3b33d0a7276f20edbee8ec92804ee80120e622176d4581f887dc36de2fd110c29f7cca926c2dd016f22c8cbdc2cec026ca8a5942638f171fef1d44e5bb34293e0648dc63b3ac621bf10972118ac38388c14e2abf2fa479e6df6010f4e2df4795e79795c53295cffcb638804b352b33df132ac3645f930fa61a7a9757ae7d93b9222d26772e1709a94a578789fd99ffa8379d38d0b747bef0f8eee252628b8adaff0869b33464123ab758ab3a3f61a39aedcc3ea0307d18fc80c17a36cbe0eba80671629720274a83c675a105227b644ea340401431ea911342e90d878137ff03414bf3072822d9dfb5558cc76ca8d676d444679205ea12aabb89922bb983acd8001ed7272669fe7a6980759087de80730bdf001c156c4428eaaa51e009b8cfa30778e5112e349cbfdadccc360e2a65b2121c30a16ca5cec2500adcb98f8a2fc74ebf7461720f5dd5532f2fe64243cf751fc0ebd84207cb69ac300d788b04998bce5c4d1720399a73b2452a244a476be97a55718136735f484ef1895177b4546c67965687227c30b3c45253a4ae6e1fb3186d442859541a0e2db8a836b088e14fca0b6d47227630ac21f24dedc37d62a9e4848e4a2d8275e6b58726f8d2a50da07d0e280725cba412471e407a60d77c622043416a2a8fa2701a687d7b319ef249f1ed035729a34a12f461c4ae1c68345547def7fb0db65406e74d01b3f5ff43291ce88717297cbbee9e20e17332956ad19ee8d55ab7efa7827b1134bafcb58079ac9d23d36dd3cb8bfccde680f2676eba916d437aba323c939a58a6116a39f10b5105dd86048ec006bca0e5f157d5ab38f189510dd6cd5fa0227690132ef4aa240db014c625b6ef4ca31c24393e452a84fd3975c36b07671597f227aeed271563e90c45c7266fff8e5ea60a2a878c9a53f9ede8b0858ec4af0880931bb3f553a518f38b17219628eedc5aca3ca2211ddcbe1272c80a030837d64770b4463596a5dd40874721fb8f0af8f77556a43ed973c58e5cc6a66a347132b554c0cf710d7cee862f8728111c9080a2fedf003b6fdaa610e6550ac141e74f549dda188a3877f2b834513bafde168d59149d0adea36538db35b27cad23a747b0023c7b159d9fc2265b136aeb9c2f12a82b2f7e1f7e826b1845b8d38727b6cf544e2df9939a2045ebc55725237f7d32226211782d328081283c898893f4ab519e128e5a51247a2562b191de4054b8915b87c488b03d9ba28d526beaa153241e859bb013bf1153dcdb6326c98291d128e2c8cc454ee42462650770c4fed8e960d5ef5c1f329a54609e1266ff4d8b342491169f75cab353f99adc3475a90b1d57ac4926beee5bde3096dc0723b893d64935529444ce13b96a41b1c727ea0069a7171c51b2c99d72395629372d61041f4c25bcbfc99657e16897ef3dee585275cb1972e43e761cb1107b3fb30483b77551211b39b9f9a5f9c7d5c1167c4601a56e49177f322df8a8b731b75729ec326e8c6be8f220e8395b0bc06a1c89c50d821f939707f8d0b1831fc046b723db19abd935e1c46587c8aa8ec5a25a65bc46a34be9dc9f6eee68fc875930952bc14e5619aa9ce9ccaa7cb134af0861c22fd6df5be81bdcb3f9776eac1a33672b087643bc6f1766b00e066ff4665e33613159571d07b5d8c9595afdc9bdf30728201c66ad25514fc14f32d3edda5330da3e5cda0cb9170e0521eab2afbb91372db56302034678372bf296a9235debab9d55d81bd3681829faeebb5c4344d0e72116b7964731174423b6ff3cd62cc8c4df7a5904b7628291b9e2ff24ea044447216178530acc6fda234474303a970f6b0a9093af308d22692a7c89e6dfc7f1f0d01afe5748c38a79863a4a4815d3f0ced3852fe8e8d15bce374f5ee4aded8b60382f7d5ef7447439c26cac1dbd5799c5da7a2099908ed63f8795721be37bbe2720363d9a3bfd9923d62b8816cbaa0a576ddc850e9eee00371b6d167097bbbaf7244f0b0bdc42b7de08de8f4f72abeda4ab6c5d82f0b3cd9b834b603003efead45096f0bac0546988e3a3c3a44e8499027c697a38814ceffea6c9bef82fa07d372f4521eaa8ae9e28cbdc2b92af5195dc449fadfb9e1864d07f9b001b0cf2b1172f92cf6693692f048a14a276ca9b2783327f426ed86dc7d9dfc3318d60b5fc14daceebba7938e60c1b09f3b578acf318736c79d5ce6ba8d4291e8fb7fc5ffb472052441219bd351049c685a664fb305f80bf77e2a29ef96180ed63e6877b46372cf0dfd6641b786ddb5423315f98823b5df815d2fe670890cbbd0aa2b77dc1272a22cc39ab9c2cf557b9b983f13c9e9466688361b88aa9362d59779d4d0630f727c4be07c879c0f4c3fa127de0fd5c028095563f0db748c5f0f3a5c02f8cf4a22e5b643015f3a5b250f1de8f80eb3a9fb80983d5665ee4c84b5f384d31e0f1a1294fe8e4886d1cee8219c89661877c1a95b3b06226cebbd50c66beb8939e0ed723780283e317e93696aeec52e89cd2053666ea3334bcda0b2791228995bb75b725cb5da4c9bacdb836293a491a114cb6b4e1df2816dbe2682d17728a6254f3d253d5836a95417fc82b6ca00d99c08ccdb75d0c516d9eb0b5dbded166eb407fe727ff0ade8ba0bbc3f1d1b72680b9213c3a16351968241d43820574e12f8b14972f32e54f0b7a36335972c6e82df67727ad40aa8fa7b9b61a596ba036584741e721cb0008f5b1646fccb7b10c0c767fc5f63a6142ac0ccdc0af75adaae04cec97252899a05bab8bfa6228e839cfdeafbe1e92f8a16afc6b9e8b9f772abe472363434fbc5a3dcf1a55d12a55dd2f9e51f44e93fbc1dac993bb1f327001e13c4e405149115df83d9534afa448fbebfff0e6b823eb0ce4d27bc167db0b447768f8118be19bf2d0ebeb0bcd110499b73558a1dd4eb026ccf9bdfc8f72bdb2ec6df4b727e5caa7382cb55ea839fa38323177c3abf6bc1432e19c52a8bb1e554ee180e3ab0bbfb1617850906f48dc3e112c4f3702cef57875eee9b4d92962eeb0934f87288cb511e2d60f7fb5b260e9a9f8d74d8034ec58385dd85eaca1dee4f97ecdc4f16a05ed1dc1aaf0a2b9a31fda032fbf93d406b7e7f3805a09cce8f3847c9f7726345cff5118c6ff5380697ef033426ad15eabc87ea6fd5937f9ff9a7626fdc6add5199fe01412e8753612c9ced2417090ae27d0c948c9433fdddfda8808591647ea48cd5bb647dd861939407f383425072a1e84eb7505d6627e599a60d440803342e009a4c277b3da6749cf09767c0dde220c75c4d0a2a8b5df44786e8c6526c0243c34ce6cbde4b4cba3073c37585f7b34b11a6a03aa46165ea3961e889fc72be756148f2f5085cb307b17c7a45f5c447126d8bca006848a55de0f82d2f3372c8ee901b5087026042c94a0ca964f3390dd31e6e9a5df3a8e09cb64c1c2917721cdf8b1bb3a4c063d395b083983a501ff995b8d4c437dbc2a22d1656206be5726aacb91bc730c0f6d2b5655bc8e33cc733de3dc987c8a3594cec347bc1e36a517b3eb22e800fa849951fc9d577407a58ef4ecc3945c622f30cab9a279e0fa12205fa375b52b15ae8115b6c2d63c0815329e1c7631b3696bf68eec9c5a1feb0729d27bb386b38bf7eeb6bf8301fae44a1af0d7f31987ba97618b4c320061b43722f35978c4d8c0f7d13afcaf31a39e2a3b72031770644fa7e67be611ae9e3411a5b146b887b33030b29993ce82340c094a76562c7409bb6e737f6f0cc3c4bd672d4f9a384a0419701e390985bc0f4a924363341f290fedfb2d4a7e384c84f447258fe81d3d13d04480ca149a7d01ce5e8b10cc32834dfeacad0c3273d25a6f0721567b5ebb3b12f30619c4e80285473314a3f22605adc1e4eb0da0f3a6da56d5f42e9c4a47a886f636fc74ff09a049b4e1d273244a9ec3e5723b190ad9f43d82a6164ed612d28875db88e7ea1687cc64176f24a8302d438e2864d3e8d66589e0133bcfedf2fd1ef411516a06b8be7a724af7007f38641d68b852ec20ce2366e0b85a409ada581a962784bc8e205c8140d867a72a71bcf024b9b71f3ea76162b7221f8b9442a1466aac5a216af75fabda936b1f4be0cdcc14e2fe258adc379eb72e2960848c1ff9d457388cd9033d7c5819966c5fdc27a5fb61c6c01c4fbf57d72ec8f32d0128d97f3dc2ceb2ae744f7bb774943f73153014ae9d4ee2217885d7207e9150a6f22536437c52279b564b6ea9b13dd192cfb68a3839620fbf8677a531981b2a8869ea24607f74100242f09d3113712f5a713be85c96373a9be18843116a1dfd7945350568c74a5acbe129a42dc1aed468d708c356c5ffbb7a7f8525378560533e0ba71863841feff5d9787621bf193de2343571047fa6e3315cb5f071dd301b46dd59eb1856f92e20639ea85d7dab5235497beef3cbaa008f6f35e7226594fb4960bbb787319abcf57f3fe0999d9c475763ee977476584a2f9773872244122343e85ead9a862662c9dc16280094b5c65ae7bcfa4c96d8518e6990f22fdafe932e069ad8641c7a13393efe0a9cce1dd8757d9feb0e81ce9496504e5726327e731797158de994e6eabe6d9f78f849db720373b1c6f2472c2ce7af015444cc77fdc4330ab486ff16c319b1faf62419f80a547f4edb2a4ade27e2be8ce6d2bb8fce7d3f36043486c9d43ac52ad87f69d0d821d550494292accfbe252e572232d975aca75d9d4dcdda01660404ce83c734c507c36fe7c0b302563bc838b4a2ba2be0cae4ad5919cc9bc7e0d21ae4093abf3ed102010237d80cf7a9ef1715d160b10ac3e8a72a627ab690904596b3ddd98545f845f5737ee78764135f1431c45cc10c889a6fad3ac0dafab5988648a2c7bf900e0bc90c6a0dd77af4c3fc60d00e4338e3fa815789e4c42df87f7f092d9f22994af225c97a84ad7e6f1620f72e850b8a84501d0816e4b7ea0b24d6f659a49db3aa0dfeccc9c9c5b8e5c116e72790b5b7ff94bb974e8a8f074352e796828ed7dd49c8367a6040e759204e9d672237592be6f6089a65c9cb11ebca632747f72870b1f6fad532b5730a95de81e2f4fa105a5d95798720ec31263b8f4b2b297197bfbcb3864069f05e7a1639f691af3a5c94bfd998f8263f24266b9d86c91466e99a2e19f9ff61c5e1179837ba6728b37c78387617f2f0d5fb1611aa4bad650cbc7415afd25bc9b08fbb676188b72fb36d54bf2df02e4aa389d2bc242dae2fc8c585352971b37a7f6f6987c9aef3717224572f16562bee8ee6c8757d8da8a819c44fc49217a0ce6fe1e5d936061726aa64bb50241b7ac9729d8a05185d6c7541db17973bca681a0c917df6ce01572692366fe875673b03ae54f96d972441dc6bf40206179b9c598973d853ea5f30b4f9b5663e154a6173c83b1125eede4c96da8c3c171d75681ad801ebab2101b72cc6dde5d5cbd66a90a59348e8b1a57c9331e9e93195ca7258f4696bf84b3176b240be92fc8816009f5b3e61c81c0d59191d1416294c054e48185676559aa5272188a2171bd1531b64f1513accc866a5cd770b04e583d04ea96b4bb618651a959396a4f9e48a8023c73fa951c448b76e1100ada3a98d63ce71f9d56d100dfaf7251d789a58abb765dffc629d8f8c252886fba535d813915c726063517d3e87c4979fcba6f2e2a82ec174af2910cba44188bdbf3886c6ccdf87121b376194d8e1ed0ce19397e16efc9772b10dc177a2a6e05bcca2d98eca9842f8f344c218b7428244e8b5dc05d403d58beb937cb71bb0a73edc700391ba91821d59cbf481d09723b3041995b4d3b672ca2b04982fe420c9473c527a08d281436e6b781224642634c1298b6af99a790aada830ed3d2db80cfe318754cc31f1ceda4509e353d6772bcd73ca0083cb90c19052da77a98ee9a0ef980aa38ee33907971e476f6b2d14c624393d6aaab4044f4e0241d5c5aa9428eb7e7ca026db20b399a917eb525541083f9225eb50786433835b668f35a045498f98ba40c48fa8621997a5e07ffbc72f731a70478dd68f72f98b612e2a2942a2f7e27a42a84bd1d680c45b48e4e007283c1909473de6d33b62f861831382c1d59ccbe79e25012165abac273146ed426cba2b879030bbddaec73070d8c0ffed9780564d0ac6cddd5e99af4605517690cd9851eef912c477b8a85509784bd028d73f50612716dc3be5c1c0b03aaaf79726d962107b4e0967c8a5eded4426fa3441bb8ff81276a7d042a99543eb383330fcbccc26adc76ecff8820b70f5ed4c979f1413101e88b53b00269902c89358720fdbd173e4ca088a31f2a51b955e59fc5ceb9fc401260b62261e4bdcb19df3072d5e4ff90e12eddc4e3631d2b57cf5a774c17f5e346ed30b34d258e69642a1b0f3b61693e89dffc2b8584eb3c537ec6e10e376b2c5a8a53ff7ca55717d93d7072707c94b7736f506c69ce99a81f5699596d29aa1b48efc21732fca02b2c1a1f530cac04df11c6f0c25c73d3cb0bd12dc01693bb102ae94ba4ecc87efcdc40a55a0267eee5f00f777f018156b8ebafe499f513f0228d5762529fe3fa17bfb84c0a75de4f9ea352f4d04e3108f0306a193fb9d035f41cffa8acab1a51063bcf457206934e3e038c33c9abef1b3427ad09b09f8b62c7534f61bde789036325071138ac7ae91344e9b7e240946d964a05b7ed88a91e75c25145e868bfd0de72ec8572da5ad15bdac92a45c9a175bbd8e82fccc9be7b3f7ba5d8238ec0fea7493aef7292329cc365b07242e439d63421d4bbde486065a74ea6d3d19471fe61ffb13001468c6a4f0ee74f3eb90ecd18185a0988e059fd6e335c974348ef04a6472a3f4fb4f11d48396d89a275941df0f9ddb2ec9238ba80fea5805ad39cd1e3869a144aeffdb8b7f30791c568f106a997f8b7286419f5097b6deaf0880a1ff5194b6a71687c35a0f07744c321fb8cef6be00c54ad38a71ec447e6dc14c02d671b69f21c2d4382ed85a23fdaeff835a46d5d4e5f67300b1adf33753683546ae7e860655d677326ea89a184e4f2429ec38890ac6d2696406261d6d3268e0f61134a03476d5a183cad0b8b73d8575225b7237ce0d039e288fbc75edbc91f2716dd3d04f072e14cfe4cb7915622a3ac624aff1ddc6fac0446865bb3e27cab38de0ac359bf72d28daf66b62e53fc5be0f01911f46469ac1907d5a45894057c0ae5d95f8813722a3203595f0c2c350dcbdc3986b24df55939f7758a9edec0d785d6edbe896e22d451139d0e0e3156e1c2f6ba925bbb8dca98c344dbf93f6de93c5f085a1c2672a87925e16c3076647303ffa1b1b585684a3320f49587c148fbc75d6e0095a47226ce306b6f52f8b3f490cc2cf79d07bba7eaadea4850a1341035e48e14dc74694817f424cc1c67dc862299bdddf01433d5f6b1ad80998f13c46adb93405f3b72fa1c3a8b80147450b108b1be2d94ca25686bbea7bb5997cde091af117ed2e8124b60fd4bf5ce0064ed6db7cb1211a185e0efa7ca4b2029279d68a1fd77884a434a8f21e1078c25d0cda535bf77c3ed7fe8ee84a7a452c9f3b3f22582b46d59720935ba7188be8180304b8ef6459184989f1ac5774b6c4ab29c4da2bb038582275f91c5aada26a3171141a11b3ae5fa71a08c26fd031bb48dfc1c359f72aee765949301d1fa1160731663a77d8c28b081149cf57f9bd1c12db98a8619351966728bb7223f4febb272829e9ce8f87df15b844f4706dc15915322d39ddc2fd8a572b6edee5765cc9a67c3c0bc056a3e29715409187266f4ecb3429baa7fd5330f729c194b447ae45397790ad5d5f6575b2da1132572d1dee9bfecc8d7fc413277721ca63b5784bfe7344dccd4a837fd44c85463d0b3a877570ad27ece6641d21f72bb9df7e2c6eb072fcf7724d00c3821f0e3cc7ac03bf7e043f18a64380fe1a972001b3ef171abd80f6342f328e62018601eb17f8a067b1ea7736fc7548e15b6722a02a3d2cda8912defa108cb9c89b6763397a2ba082d0b99d0e69ca9c3e3de0c3dfc4262b7c1e3de79e10f643b1b17cd3c5f055ab39107bb84b3f296a842306965b1d1c099f2ea0a2993cc9669638034612746cfa861db684dd81f294cf8865124c6d6a1d7f86d874d5ba1060daa0270ed0fa7e3f56a4de6ee6852437d570372060fd149184b829187904950874d531a731d9c40e36c56b3b86ed90b4e578614b919be3bc943a6b8fa819ce74530327197e9e322cd6d57cf500582b63d4ec4494fb521e15bc9f721f78ef471e30f408118b771e8fa72b357f7c3c915ba5d17729d994b981645e8e432c1c7fe918f7bdc54156a77d82ea8ae35b9f764cc823b72b239d7664b4221525ac29ca4adf2029c99f405482c39028aea4afa9353be28722b61e519fcd5ac8f4ac8aea57f9af3747aac7ba344938bbc3cc24a29e0619d7224aa6fd65c62329036f266650207df325ba49f54981b8bfdb7a39d124cc2d972686f3e70bf2b380c84367638107ee69f9b5021f99c3dc0d85272066ef816ea72c26fdf4cf711af4c2f7262acc955090f191f8a14eeaa8f8ae0bddec4c85cfd725cceeb59092dc3410c2e4be39a7d61f5a90d2caf8bebd39bc69469f83766a06982ab6ba899ebd3369881dba6160aa438eb58f2f82aec8ddaecc386b44fea0e728ed59be4754e083a40bbc8d9cfce7c6a8788409c31c81e10d3de5accc7fa0272bd96e1f93850ed113bd1603d23fc67c95d5925d2e7a1b9517502f792c6609672aa6389fbf3abbca1b1919667f36f4491ab06251c343e4d993910dca086f67e72b45e922b48b84163b5445742b2770a4e5afe77a1b1deec8dfc02f27684af4b1b10d69c0fe2090983adf57a4302dee47818b6d5f0532e12f0fee95d1e802cc572b72205260a578d546362a853c8e088c60528d998b2d0f1559039353f4c6976725b0179f1784b9f13edf0cfdfab1365ef466449ae080b8998a10c22b157ddf772c7689100d21839c2745279f1bdf4545f8c6525a4c0a6925cbf6030885d877472bb605180cfae8669b9d636cd981a95dc8e50cb24df63bdcf36c7bbdcadd2c072511c65a117517f634629bb7c3d1d4e9dc8a74a5e54b2800dffc40e3ea3cf957267e24c0f2a539959e734b4fc3f5e70da57ad03d74b26202c05aba55b69c2960553e2431b4be568382eaefb2142340806352206eb200adeca512bba05273c1772406db48f135f419f01fe901a3c54be0fbcffaf46ff9fce1b88bc95da9aec487208b3cc1dc334328ba47caed31eec448b7563cf4caffd36cd27694818b87f32369c299541f6fa212140497ff62f44a4f0e686804061a8147c53b8d170330e2a7243c30aeb1de3848e310e19f4bde5890ea59de47fbffd0fa8cb917eb6bb0a59080a40229c16d176a159b1a38f5ffc97be9917a074489f7fe60a674821fbbff14b0f573dba5ad8b38f92789fcb4d31ae973a050fca0a491e48b44f6978b7066e0f178b395f78fcd622b38ea48968b1552350e5276ea7e97d2036ffe2c4d349672202582e05ec96d90a1bb253132424c51bb4eaa2219ac40bb82763193b50fa4b72e1a3f6a8aabe005d71eb4ea0655590ca5d54e5f3f9844fd8bb30c1a8f9ef41720f0ef4724181d4553cdbd48c564dacaf126266dec785fb1ca744bf7976636b72c35e46f71bb1ba909a7da44efafa2ce934c6b972ef1242b0a8cbe2f6c7cc8b075abc22848660b24da874a2e85c60793dd30ddf0da2b1d78fc9ecfd962c8b1c72632e49d49b0a78348ac0f8c5d5f6ffa8c1ec70d8b13a9ad0b3ee7abc522482612a321b9ed9027e71787795280604079919a4727bfb4d78778d14c3f0d4fbfd72d4e72552b89e97aedeab468a63bf91c9f38dfd025d921e627e00d64ea600c21ea32b0eeff6f55128afbc772bee8be9ebb6527e547548d76ebf818b7bac81a3556c546175c4fda21ab752ee0a14c3a8900eeee1d959657eaee213d0ca379594726c6b0ade3e050f8286e5a42f7e8cf869c2993ceac1ff920dfc2abba5a279e57245835c185b3da0f12c8840ebe5ea6cb00205c2d3d29783ac17fd85e3a5be9c6aa0e9cadeda04f5128a991e1bbc79beaf266912b31fa7328abae69e0cf4349c3e61b6c8ef66c18419f7cbf488f07ab8c6339eb77bc689b0566fabfb1d9db3fc72b27ed22cc2b20698fece3f60e9e9bb8ba646f2d8e635136d008a313efec23c724d66045044d15740a114ab8f532ae4f39330e1e188130c6d03e12cbbad24ef7220522ebc803be15983c71276d718e905c63b1f7dd8cda3ed3b46ed8bf18edd723ae90b9ceff10f56c68b202460ba413fa4037729780e86d1cc8981c98f9cbf720d60317dda05c4631db196020a7737cec524bd3b776f384e810524edf471e97245ffa7274d6be783fab20e757fc1cc5b0a78cdff1eac8017ce048b0e82c09644e85037d58dcc0893794a4cf18e8b6b3bc3ff619b5469f747af1d9385a7e74b7276f480140e9294dc5e97bb2dbec71a37b409f80cc0664fb4117e12d3e0f68a726e94a49b3fc13aad70f835daaddac7a566abfe3d8a26d47b5e8b616aab6bc172067fa1858787d216e6684b856e65638a0c24e65216315c7f6327922be3f0454954f0a6b552cf4e91ffa7f57e6fc495b607f72dd2ad86c1d1475a087c9e96d172db712e903875fc5cda67f7dcf68f95284283157f34faab07ad938c9f256bf472c14dd32e4f01bc579aabd2f08120655569e36cab0883f52d13065685a2b19672308c6e8b488b1c9ebebabcc24da00c779912aeb43e966113501b730c9e8dc75c8d915d75c98b5ce573b27995caa5bfc4a718ce72565816fa0e561288fb06e972fad859d2ec7bc2bcad12783f74000f5ee470a2f5414ac7dd9fad1b2a767bee72d7a485c200abe5f83067e034ab246b0976fe4dbc239850e2118df3a209fc086f94fa6d166a29a16ee324e1e25dd61f88341c5e43f3068c101f2c15e3e95988724e91f88d35ab03ffaa3732b745c9c3d52f6421ce0b3abe2e03b34171f08205726130f6d0a795d3ff2432a20f32b10a8e72fc20d43ca17c67151e1e3b68814c72086f80733275ee8e8fa99dc38d564fe651cfee4c420c4d1fe45fe99f3d17e01980ec2661b8a7f238f37593a6860c35c84a47020fa698d279e11a5e94f51b0d721b40b935dcda92acbd8c546570c0bde0ab2928d6266144c3a40b071b73ad9918e7dfada62e95c8663602e16831448886cb6409f481988287112a0c8ea765c72ddb71cc73be64109744fd06cea82391e436133b32d04558d73727d14143e95a726264537d6a1b4be54f4a94ea514182da515ca14f4bdc3bc0e832b625f61f78725a12ebc820db2ecbc38dda414b63927b9af0371dfa96c7791e264176f18c3f30d1bf566f46cb6095c8526f4a9b63d2442c4f2cf1b223d0aa7fe1b9d078057372c47e11942cf0a1281d8bedebb2ad74bcb72b695273618e00ef5b15ef7075c932e86451d0eeb820531ed58e53142582d36615ebaf8aa109bd1f73779e9fae71723a4ce44cdb1a739ab35c43939e8fee04faa77ab48afcd5d04d289886fd9a7a7274bac043df801a3389ee614c4014bf87bc2b3e5ddb6cd6e21bf9804bbae15431046cd92ad0907277814b0f17c29dcaba2534e3fa5a08c09a38a046d8e4ff4472398a99536175c58c5ef6aa8abb92a641054679ab5904f1e74b04e5c539349c72293d512a23622b027f823d06dd22a797bda4144c741827069f093dcb2d5ef272b84f9a12a6763899a30c2abe23daeed5680513bf350833d211cf74a86658293e27ab5bd078695e7ae2834fc64eed95007473c1e324cdcd533e655d61dc474e4bfa821875a98944806a009672bcee1dc4a9bb998f3eedb25aa32ccc8fb1523f729676b13de12139356b50d6f12e151306498cf3afbbf506638b397849ccdd15723eccd291b3f803aec29c06f121caf6c4b69f531ef8c5330298b92f6d70eeff0b65929233939b8e0550947d4baec8d508285f50e884418527c6712451e343d6663e4b09bf540002dbe02f1fca3f89480f44108e5b073098da8f4ae83510d0c61d5f5499ecc78f063358c63a2e9fb2daa4921538c254b687b14e81a03e64dc79580cb5ce239fcd7a0ad5bea49bc8a2d98aef94fb3f400c1c37ba9d0ba66b641672fbe1a26255e714756ea71b16c80c82b9fd2965795e83fd56273c2e1887670519b3af0ccd15e3116545c422f0940cc1e1283fb34416693eac9d1ec46b10f11472037dddcf23f89c3cec080fe14b435e3226b04a0d7d707bd2540237dd3abae37243755ea8cbbcd5b9ca4f1bc6c3b87711e0f7c80b4f7ef37900e51db9f9bf94277c30c28064d1e1bad05dfd120cbe4a016302a1286776e85994f9bb75c5532246d704c00b41cf701e320d45fa0fd2f6276d3e0f91b4269fd4598b4c20928d8672347aa4e7df38467cf2723765e94d6b2a9b3808e5e535b5635f4f2f58cee2ed722d90bea89001200329cde2e4bc1ae20edc659e0dd1acb3fc5eb30bbb346418726d76fb06a7599242737daa730aa5b853cafcdacdb51ad8eef18acdc26e0cae724663e52572690ae7535b9a3171f5002d7ff4e2373a413526b222ad993b33a66939a7d27de4ea434674de0b2dc9c036f57bc9774d4da6f55df7feb3126ed88d1efdc8098854746425043e0532c225ee3580cd75c0d0bfb9215d3dea13de447f415f69b57c6273c1e956fcc642482c7a6a9554cd6050cc6c70a2fe0493d9fd4e7270816e40af8eea3d2164a908e697e44aab71d4444fcba5495b891bbcd63f684042b7d955bb8c678d41ff3dce96c70f73ff93f998eb3ceaac9e67f01593da8b724a2a1cc5e87e1cfe31b0c5949558b422313485946ee505ed4a00ef19fa7c5872126b67a44a77d5d68cb755e27d4ae99a4495f23794f9502ece8a7b07d3e8277268b58e7587e1dbf0a9a098eb22b8d8c3f968056aa5d08bf64e74d59d90b59b72e30ef0628e376be51777473e720c8479de8c7a883ae650ffc3878cec293dba72a39535d8e7012e34117e2cfd2bc61db120166b52e9cc4bd4b9816c121e2aec03929093cf2fa204deb60c42ba5627d6a5d5ab8c7631d3816b0f9c4c108c3b9e728c3e9e40671b500d3c2c2e108a781f16b87ef50359bae4736bf3be40ef1579725587d7f61a6e1b3ed3aa06bfa94e61d96932f43a5b9177956995368cc8f9cc72dc80e33e9f0cbc676194d2d86ae83098aef92386fb5a9270195eeb33720a7a0f5c6963ae1efc8d39d7bb9a132dd7de1a49c9722859573f10cace351e81d379628b1647cb195c067208b0586d96777330000170112d043559ecbddd2056456641303a66c383afbfd044524a4dc94a827814c72e406a00f5b8d7fec1c7deb64272d9ac0a2a921db770076616a50e633d6f8ea54ee26fb15ea114dd37607d252c72b7edeeb32ecc899f84a66b94bc5f95b25b4390a237f1abd6da1c08ab1f08d038a20aaa627ee4de44103760100d7da3361de87869f721a4f64a32d753d07c8c724da4e9cf7c476f550b12b9deb2e545aa1394afcd6a3d5aa6d4d0ff2cc950972c35ec0ec55b5b9be1a3ecb1f1100392426d89123036283205de0c94120f048d68b9c537fe4b7ce6d9f7d56b89f94582fce6a3e219666e94b48663965f95140f14bd72011d2c4851a3ba7778f44f4cb8f50c80b4544b877629bd0f0f9cedd49a720069814a718fca658fccf2665578cd47bbadd498bb47282eb928f86b48adef3d640696317f992e3c42fe1944d7258585c4947296db662409f1c904c82e930032f6bbf41fb79c1fd8871a7d4d69c541f6969cd329e57a446d22ba238121791f72ab42dfcd8e90dd2116a4cd47de7208d8a0ec35dce9a2b59bf2da0ef46b4f370df1d66bc46404c8fd125e3b3203a2620623cf707eda1956f4f8130823e6041172597e2287743c73e969662cdd1caa06e9a94ec591ea7aebe95182cbada4c32a1a15229eb6cd768e63460052b23bc8d1c85412d2c19d1a9d3479b1653884578464256871f5406ad3110936177e5b5a2827010a37ea6bafe37d5e65a78c67f74e427474a7d244180160505593bc3230d22d4a24538b7ca4611e35f26a3ef1a39e72dd2d432cbc385ffff709aaece082ba3d466d90b2b330a3c80e07aeffba889f119b962a201fdc170c5ee87772c62882aea344f45937f4409ede82df5e6c953a31b7adc94a86870f0756886d684ce3ce888dcdac746dd3a02efa436243fe00a8728bf1c30cc62774659cace7f90ec3c5035a0f8ea9d61ae3f24ca5f18d04897d45dd367e3945771eae5891eb5c3407a7b86e0b27db66b7af1a9e88dbc8503d57728d97ae2f59f265f4ff208e16a711d9c3cbf4a787d5c4e5daa1cefdb93014aa727f8793538ff6ffb6de6bf8771132e8bac80438bfe0b5acc1920a8d5d5fdbd1720e9870081642795d9c6d64b5cdb2ce40182f037e41b438b3108091603a1a46725119cac46317d264c7c29a834622bc72ad28a753db49cc80d82ab5b8f29124720e7a01cd60c9f497571c707dadda4cbabb54f4725de6002d00340950346a845af055430a292417ffaa8ec48462bc61175f555d581130b7d61c1acc7ec9079f57c029b94c7aacb17c99ca7c96f6831202deb897ac1bd844f19f347d1871482d0ea573a4770313d0fbf68de5d936d5ae2d870f44a2aae945238fb2b70da0d04b70c2930b2478f8ce6905188212a2f205ccf2ca3c14209ea80ac055d7e452c838728bb76a9d8f622e296b88dc9cfe7bede2450e4b1e99ccf5dee7cb517382eae67230345488fe0e48efb4ff642ec2785adaacb8aca43b9d86b74e217ac5e01cd70121591a1056291d2a3ca426f502aff0171a9da5f458e600754680fd717b7302071abf87c89051afa171b4d54f05320d111304d3229aeae67e9348cfb5c73a34489df4151c0e432615b367086c438614d1148d4a895280e3c791d524e39efec25afd51e56a9cf2aa92c8cec9c36c11f3aa2b675e38b19f3f9a0969c0fd09a5fb477aee2befe2d1dc5055eb9d20efbfdfafd0e462c5cc99135125a1757aa877c872e2ce9146537e0648e234bf1965787d5fea336589e150fe79aa590a87cab6b52d6dccb101016fbe87249802a05fd30fbc6b7e36a64833610d49666710b8b79927620925a31e702777bad1a9dde0aaa593f0ea81cc568ff0932eb99ae67d0de572ab18bd953507f3d82fe7ce57d1c667e5252a46a0256270d6a2995e80103d02721d12d266f23bd6e75179ccc681c0abbf73bf4e989d98f7ddf2216ef695016549800acfd0d5085118113e231fd302ec34029479c15994078d052d1532de7fc070d97cc4b7540a06ea318bae93f3f0b8a0ce3f7ca52939a484ac3379ddbbafbe051757be13a62d63e85c755a2c73927c695fa6b18bc4b30f799b2b81dc2e9ae872495849f863fa51147692c2e612d154e801015853249dd71eb7f3b2205143e6629f9e8535b4432e6113970cdcc38b17180ba52bc3e22051e5d549fd4ff3429d7215448281e6ddc7743bad9649eb5380872c571f7f442f3e46c8bb8c400498a072313d57b685e8e395f163d23608ff8df711d24516b3bbcc01840de1838d9cac729db4806f610f99f76a8ad10702f5fd0d38a8be34fbfd60fc4e22516b7a6a91716d60c5c1393acac31564cb30ddfc0a75d1a17719dd19986c87104315cef37c60ba5fe21eff1d4fbfb3ebac48357786ad65727cb1eb4e95efebc84d90a7b3d71bb4746f4064a92f67ad666c50ac220dc48f72c32bfbcc2a626caf30853bf2bd26d9b5d08584b22bfcf15123acb6fa34e51601006a9d7ceed544527db05eb9b972fc3558652bd18ff910798b14ee26d614360d39a54d7cdca868b793bb0f27427271db77ffc800432b0b16aefec3176ec869ff8f4253e4ced7f59d1108d5a408726018c0ca61dd6e183e26a402ce80150b9a0b386a043bc305aa0aee590ca95d72f451b97a39344baa8ef6a22080c2b1cb374daeb063496814a5b9e2ac9b4a975ef4f775fef8941526dcd39ccb58802cd1fd12a73def3f9c4ce5152aa0f0a6997231e8a21fbfbecaaa5cf9654e0366d32269125afce1cc50abc32ff52479b3027257ad3abc4a3856abf6a79208db5ce6500bc1a7781e0319dbd6e9341b54f2d6413230018bfacbd1ce7d8b5552afa5d44a1553d953a351b835dfeb5a7147cdbe72b6b65088890970285f0469e294018241eb549f078bc0ea594941460c807d0072cb9cd2dec8df1f27ed9f83c463e85c5111ca7740c60838212e2ccb8dd57bc47242b0af70f9e0234aec5d0563f839f0d5b15a1d5bfbca70f4ba988049a6712e7272aad3ddd5d981271c53faf04e7b0e7470ab82876f3ee0b3a74c2d706ca4885814ab64abb4bcf8105a00dd303aae0abdc8ccb335b7a2bb4fdf9237a2d6fc9c7205c2ed652493e8e5e60751baa60f3279988932caf7d99859267fa6ae7e18a52360a7a9e1a97fb534047ea59a429f0025baec4721648f2e6295fa6709c3e31672ab7c825d67f84f9b5d7a3d71951514a50c26eac1bb6fc5be7aa42b27b117e72fde56141b24985d477f0f7e04eb15c72312d3ce1e75c72f80170b122ce36fee3df75b2ccb34b727f3f67bb41e1b561a5e7f3e0ff57a689d0f23102426a6bc2a518f6e698a407957ce3a2656974d8e2cb8014131daa378e7e9d4f11769f1dcb75bd771e730dcc29a5caec641a79cd9228eac9d78085d4b50850afa41bc84a1cc1ad573d42b8f273bad04113f72b14a187572741e1fca18d39247923c0791e11d5643774f08fd1306e1a213dbbc0034f4f28e6eb8a68e588f9e51e39b9ca9cbfe72ec6390c27056d21502e41b50605435b5e0942aed422cdc5433cfcc5fff70f6540d684de0b5f084a07d714cd9436eefd98289154d908993eebf9a48d20806df72fa51cbb0a427410a965103d80a685da72c76a8435ac61859a5f43434963f077240f826e4626a49c582f373ba8fd2c88e976bb87ce74c447aea3d72519252be6d9d36be48bffbf892b5e405d30f96684441548c329204723e2042595ac2b50c724a2f06024585f8989fb48f8d39e224f06a03cf3cc3f308f7280acebfee585b7242c5a23a0d5eec74dff63a5d4897e01e4b80f193aac3b25b0f2ab1ee3dc6a1721b25983b6448cacce22cb0a1146c87371ecaef67f1568f9c7323c33f5cd9ae72a858ce6a47114e05200d7c00b69d86dfb23b2b36a56d6cae0786a239becb8c7210ff9fe823d3cde8c9db9d10fddd61dcba075ce8eac6fda615ad69e600e57b345b51c1f199922c92c251ab402fbb45d9722b804cc8f582540888b46370850d72db92f72892942cd78473da9bd1b2893e840841b00b82591b431af8a38b57415e93d9db60800745f020664525f66ab38fc1ed875510eb089efda562a1862d4e7255ab2531263712a064132be98edaca298cf5dcd9d93b44e2f854511f99541472498f73117a6bf4e3f731d4aaed9f1af61b6bcafa68c2cf9c75a7a9931d306f72e853b6519551e5ef31a4436fc78b14389dac68d7c64cd2f1a9e3b18c3beb8a3c4aeb132a54f3d0fe006cef73968af4eb3de1bbf462d2f899a155672b443dd3723a48ffac70e9d163ec0f8f3d0749fe355748da8ccba02905b2eab40f19a6a1686c6d6b1cd96afe344714fb0c63348615799c4d0b0638ad72c26cfdff78f799723402e602cfebae1723783827080856c9783004afafddf195eb0ee6c8b83244728cd913513c227768a5a6ad2bb30b676cb09a0ae7517529637b7efd5fd458be3f8bd443481454bfe2e2739df983aa7b7a6f541c268dd1a0ec07a3e29e163b857241d25ba21e814613ffc919c03bf85849ce877cc36c52d008e9586a3449bc0072b78f10addcfd51f1913742ad6049376b3118691a97d0351bd98026e173cea56840e4860d1b49689a12779204e5b139f31a25a72eb4939f5a0e17bea986444a2d09d2a34c6119fda71201862e6b3c0af02b737766c9739c00a912f1a48944bc72ff386e2f51d677dcee0ad60df42b4fc1ded9b3ad1d4a34b30f61e1c0636c9846718e7cf08aa13a379ca419314cee473e6305dfc6408d1b6ff089258f7a7b05722cb69afdbb4aa1dacac97bbf38213a86393ee80a32d8914a5534a9d697d1bc7233de72727738e8c314450ef87b98f142204ab25a1910d28ee07ea3206c878c4f17b2006a579526cfa6e8eb18e349f9cde7964aeb4eb3eede2d1b4005b49b0f4247ec38c079752b268c52172a931bd01ebea7426f05fd466fab3a32c1c535f372b5930f8b6c183ba913e10650a881bf05725fc52a25cd5030478e40ca5ae6dc49376233d708ccb354b92526bb59d545bacca7d7a2bb6aa520c59d65892d15ad7208e9ed6ee8564e9a807f1e91cfaccd8706038e11152f45bed232680f728abc441824f33c7e876bbfe9578a12159643d6c8975cc9f987e305665c1757acc30272fbe75383c4c7764baa19d7bdf460e523ec12c87b8de95ce5fa57da58d89b6c5778604899d33c25d103563315fe7c0b30981231d226eb7e7a2465a5bdf24e7372ad7aa640c6dcf29fb8385a3d9589d22dad9d63a17b5cb51365a27e2fd21f6472cf3160ee742ccb7247e78b6b1c2628a51861cc8b034d06e6cccb40001f80e3729aaf47f2982f3fc8d9ceb8960d6af000f58a294b3c7371adc30f934fb011a7729bc184039399cd6b26367fd38bb38349267e4b22d9ffa806281e203c1872d4722644d81981772da6ee24e8733053f9e038c4ac25a390a9312fe35a3859e33d3f7a04477d4db59b837c15f02367633feec3d55209eecb053c26d1b2d136b4214b96c7db9dfb956b909eb0b6eae34edf53cbac07e634aa55776d99352d49b4a625456022b134e72cb6bf7d5e198a2d0ac6127fbe8f02500ec7bcc3d3ca67864d27ab7ec902a955a126fcb2189cd6bd5b7e0451accb2f948728f972e70a4e400c72bb44cd6a3402a06dcb851ecdff54843f144437724fbc6d2ad3f2547a18c2e272f67f9d2d91080d0212dd06a886968eaff8a456e6067c68c5dc7f261d24905f1fe52b38a6cfed7753acf0f432cb536e22e8aefb2ea5943abd589af8e5a71511729aa894b599567b75a30549ccea07d2410db14a0abc5d11fd229ec93664791172c497e257d9baf47ab12f365773061c406480075b8818afad40d4f01cdb9656723c23fd9bb69858041d1b42fd2a91d9703caaf25d5842cf8ecd692d382644e072c1082bb65359fe3f838f5aca19f5c4cdebfe404550756ab7916aa6588ec46504276c5a6cf8517fe6332c156a6cee4f3a749b1ce6451c0e88967911c3548c356947836bc79f83b94fbf07ad073e9eabc72c2ec3261b4af0f0f30198f829f9ac7226f465d6d76f80e59dc783c6ed778678a63a2b3699a154e7e55946c9795567098c9cbbc2ed72329262b4125d60ebbf480c5c5fbb496c6e71b2b385dd732b1a72403a444fdaf1104c5c63f0be3e73a02f0b3cad9fd5884cad291a1424e8ea9c5f472c3d972772b0edccc6966482f1a0162ba3e6226ef6fa57ea5c363d3fa42f727cfd9519798a5e417c2ca889d79ca637315cd317872012586c36a9e8836b57718f46f9d26e48537d0b36a1600e800443ae621c9036d7714a4fe7491e2406a41d5eae48849a11ddb8f595b50cf800b73d969a141797238b424725b1ff194c3b726e5d98548b58268a4a2c69ea1ee5ff2e07ac0562dbd3244cfe3a51f3932fdf38d151167caad7ffa1c1f9533d90ce10b3c3dde3479270b8fc3e7fe11e438452721cd34ff678fa054bd0a369bc938d392a30ae5573a6e4ae692d2d7162b46e5b4c769e62cde5f39856c417239ac14e7badb284e0fa320c820054c5324e3ce31c724df574da7703d7fade04dd6e8516624a327771b3e121fe52173986f0a476a172b254522e33595e9d1829db308fdbe29d37b0a5ca8f302b8b8adea01c2172b772303933d51823b395940f52ec516e4688aa6a73d87fddb01f559f8f811e14133292fd57e9ad0fa8a7a3edd7620751141c693326107cc48672a01c8fd10f9c8772edbe714e42d1b13cf2ba59af850e15a985264a0cc7a2d08f8ecb3ab62117e872f581b16e6959e213350c6e70f791842ae0370f0c84e3071d84a70e9fb2684e725a5d495385990ce0a00b6eb55b501c6bece98d301dd4a74d34a4368d412887720750176b9464e35b1d5ad67bf06ee6e2f26e37a6b9de1f04033cee9ffbca727274fbea08d1f48f255d929c3ee102b0bee5a36f04154269b468c4a5533744f2142c3183bcc74e7b877a740fd4d9adc8101049cb92fd7fd0a5a79b8fa0560fb5727e6761fb9f0104cdf6d9c1ffe27446f693650b36799011cec020a28526e526725a218b9e8f756b5e29ef2a72c990a748aacf30a31ed0629eb15f6695d36f64729667d67de52751c9a5f29ea674a56521c1272fcb645d1a18c896054d5cff5e727e17e8dd186ed257d480f4baf5b1ae397c238eecde676a28d410e0f3f495af727328f1d150c0c7bd92a76a6cbd84610609835f20f3299d9b2a9611e35cde317242d7905699e735001fc1f48a9dba945dc5105a792c91912742aa7190efb3db6798e5826f37dbf82fd61027a3efb179a943ab0fce869a71572de0abba513ac95517eb495adb7bcc0145633ea578b8f4c2b5c22dbfc27fea1803826a13bf677a729b9e5ee5eee3db7ecd685793eebf548c72e12871ee39477b30dc15d189ae3a72faa9d4e17ba1329d8d65f2444740e75329c9dc973b60005b1b9a918396a98d726e6260e62d0f04b46c4420d9bbfff0b5a31fbe236f0be80ea965fe6a8709df5d4367d104601476682993c73bc69ae54758513159de188571a9f104b3ef0c472c198e18a37cd2137ffa00492b73570eff78e21c933e7df2820f2e3b613fbf76219d91caa482e0ae6a685f8439f102e785b3102afb16bac587cdb45c28957ef60c4353a690786fec3af8be6409bae38aabafcccfdf2a3f777db32029fcabca2b3c09ae0a72463676c45d4a8c3e7fa1a06c1a31b52301897b6adf83df145188371a38113b0e3c6633102f9d384be2f1f3c1f1c73e16c060daddc1ef71aece7fae21629039215e1abd7c22f0b5db7ca7f96fcc99823dfcf07f7fcef41d1b582f39633386184372cfc6fcf61446bc3610465d2f77e8a9cea1c126b9d8ecb7065e28722ddb0dcc3621a6ea2ae4145efcb74e13c2a082b464a10d9513fc7a27040c0e7284a3eb01c65d77f50ccbe40b74679087c0e324675a44ff482035ef6298ba21329da2f529cb734eb6d002ec564012cb27ca2683b57ec479547e7c181589f5c670d702e6bb12b9a12ae229200b0eb3b980df9aea450720c90891e4185b25f22872dc4879c695365c39b9a7adb900ee0364d7ce0f5cfdf5c8fab9dd4f0d0e33197291535f1b9004f634eb2d79b8534c633961cd77aeba99ffc6e7f85461894c4c4efddd461a5fd4b17b57a0c16de6ad79cbd037f863cb2ae728ba0678ef3d4486139e0011b16b6fdb22988c3b34aa65ac8dd61c28c340a7efbb489d4cadf94339723ce50641c278dcc3c8f2062ddf74504a1a556c9c75eabe291d99c5f069db8f06f139272ae30c18d32de73d5ef694b77e696863a5406edbfed84d8dda8fa7171df3fdbe3d3f74a4f905a8dfe5cc11cfaeffe7c8c1ffc2cc526bb5618fb7c03872d554ebb5c94600b0339628a800698d83ebd90690cf0729c9cc05fecaaa216a72b90396fa252e4d6c3cb4e3755c302b5dc5f5592200afa3164a3caad91cc96d1ff05c46652697ba8c5321607856816de709c397abf423e8156fc97471c57fce7255b73c83e227f170f444be6a2ff38f87d8e0ca9b6aca7c8d8f605b1af7622172de2983b82b845f51174e633699d30997b6f7925f5904d2dc4630633b88606c729df2c436d702d307b9f1e0f42b9b40e90d7248a2a0040ff207e1eb05f19c427244e4115710a632d8178aacbd8eaa1c1d35b6285137e8193b888e5f452ed93272fc4c6c1692aef0eaddf8abb23cde790b6a7f7c4c9a62f58b623f0c5b96685972d00cc9ed3fa3c177a3c2b3a077dec8e215d5cc9087592954311ce5b51b4c6e72fcbf2d627e126adf9f432c77b7f16fad6061656b86a0ef43c057e8f62305f0720bea0f72a4626842d2a5263901ab054d68e4c1a6e80679655c1831e65ebaa972547223f9cb08e208985775bfd28ac0abbb79e6f0428c673fda712ff71b260d7257eb81e1a3bf33b2db8a7594313f3187f004d939455ba33ef5336ae84a49e26579af907f946cbfcb15ae9a66ab6b409889934dd6b20ab02c60af96945a950d17fcdf465b5033a1df6bffca71c13ec21695c6cc6f1240e39c6ce0a6819890b6723759a3b589a7d2e4e1eaddeb154c06e5cc6280bc8f5e56ee966471ff4b603172f489850b4d37c1b08d50c32b5aca0139dc66a8983f77215baafe54fca4548e726ac0f3bf0bf3551727b9bfef11f767e9112f01aa317a014cc3c50014d2d9fe720df512b1686ecbe1a53a76e560b9e784f046064129836f59c368a8a4772d2271adeefc665ef1774a013089667ed101e934a286f91b2261752584eec22f5d09466a832b637a7f3189fea190a4cbc93f796661371808dcae0d02ea436ddee7fd720b2c5908a65bd797d38992b6fea7dd5da8f89e8730cbfd34c34610ca626ff2723b27001fd8342442aab380cc8f4cfac7c96ec29b3431d66708c53bd46e0ef67202b3b8a557e124e7938405e5c4b2bd15b198f5346e00d7c3b26de3624055944559e06b0943f6a196d8d69b76bc4b19bd680c67db1f79f677fedcec01be1d56438b7a9527dfb8fbca10b94de4df2b71fffd9acb1ea02141a3bd1fa7eb1473b6722f9f8a5809cd92985a7464d65ccd009c5a38a48665dc0b7786b7f41e45105f15237ce4f49cdb9093c8dff0089e23dac7edc7926c8832ce53cc71c6988b2f7c271c77aa254a0309189d3eb561ecbfc3479c08d82ea6dc7d480e7478669865fa72b2f3ac71f7b1868c5d7e00a4a78e73e7d73dc144505eec2d47b4b5c19f2232723b275569d2e84f0f9770b519da68c906639b98e1d632e3acea29dfc210bc1c7207e12881a9f258833ad4f36bc5b83613ce59a1ec924d54fe1161d27ff415641a59bcbd24550fbaa50800891e2447126e5ed52cd6d118123b6c76aa09ad7ae43afae15d075afa81c090647507d29bc7309850dba73c1141502c4c9b3ad8b5b27283defaf1697053934d2fbbcad1259769cf67d72d92cb42bb74a24cd5508eb27253c08cf6c27bfd5cd594585236dc1e86dc041c300bb98b1e7f3d5ec9ce4a96669ab8b19359254462128663bd99e31a964478a77877499c9bbd45e822e588cc72a54036d7ead3fe4749cd1293aa5e14882884015735db2334c4508ce361ee8372bd2f6c5452b6dbe00ce675ddd65b0974017d1baa71885b83f86edc7606119d007aa491d197b665422ac63fe8a6a38161e38d9a839928b7587de8a5522889dc00d42aabe2108031fb6a7b6e1a8b8398e11b7b90bad1c5ba9f9388b4f342fea072808672bc26e6b2fb45417f1cda32fc938bfcddd3602cd9d41662b9a1679f921815cffbdd3790bc9ebc72c11809d7edb71d804fdbdc637014e0c5dc987c419372ce95e2ad0059d0fad20bb5a62427459efd4cff96a7be7fbc8073607f671e304bc7bd3de216ce898563ccf18a3bc6037ff44e7d8ae0f753547cd71181a054fa4ce3f4710ce29af12250424b301f6a7fb4e743e0aa542ec866c2a4f9408dbf6b2b154bdab36a0b4c31c44e3b5643fd7d02e5308dbd6f8edf6c974a364be6d256727c918dc847d421c170d42480933a3f9bc628bce21a5fb4f219f1e233984b387299566661aa87d7bb6c323496232c283e19a15c5c3ee83e3f0dd2c2e7f05dec72275009052a98992245916f7c9d43bc92e48eb0ecfe45a1bc4fa464e52b023572455207b5cbc3e831f97cee0aca7ce2f4d04f22b1a1b77552962aae22f712e072fbe60d6e3dc00900db31c8e8d6155bff8925040ea2a4ae81d59db65772ceda72922ea2463c304747e125062f28c8b9dc5469b9e3f7f6d13f4d7435ce9ee94d537ba74b6502f52a6b570adbeebdeee43c0f25e73086beb1e0cc00c930a15feb39964758d32ead7971ef5e012ae13be224587ef6c476aa91d7fe86100c078b17724afed9f82df23faed3cc89bc08aac537dc8de4299d45457359175ccfbd51d229b6693b81037822d91c18b8499fdc2006ed2b17c0058918605ae39eb2ef69e172f6db80945d480b759a339959b352fea1210516d55a2b3f0459da2fdc41149672d38335eba259bc5a7f0470f81694ca6187284490864d31a1ad6471351406327287ed150abff3b828bb26b6f152d2051e7d93de2eb1a8b71425803ec56bb5cc5926b739da307bcf7a770d90fc62d2aa7e3b618e4fde17785fd73c4cb5aeead611fb0c93a3b7603e779153ce1172e5bfbd2ac4ebafd0149b5f09ca921a45f9f972e2212da09d9b38b496b83f2c4a1263f049cfe51ff38daa8f2c73c0ceae64e0726121bb5dda8228de72e07447210ef49a1c79a4e1a5ae5c971a5058881305b9727e75286eb44d0324f29cd9d60ff6584256a960a8fe4b5641042c32cfda55fa727b8678311a8d19e23d130cf6de01357200e17aa6946a8089983dfe0313d35c7285ad0da8738a44ac8302e224f03da36cb7ef2bf0edd323d2a4a60a9ca49fcc72c7fdabc1ad7a32dba4f09ed0e7be9f932a5a48d891e3354d3f99017b9b8b9a72806a76a65e35e848325aef5381e1133ac08bebbc986dae57b849b63db722d47272423ae219db0c30153526c8a634b118e1b50c326b12134eddd8b1d03008c752c7a932a58a36ca2a04c79fc20d6d196aa13f5431da68660160d59b3b23720b5ecdf5b37541a6b7a32ba19468cc942ff1c79de8c4e2053ab122dfe7237492d0721d48af62c38cbfc2937d541a42651a41d38af21d4db9b3ee77761fbd6816ae722d9670d5a0f75888ac97c9aff40abe82f8fd4d5c8b5982f2ed52b4c9a6aebd2bd8a3cf0be0702934d9c855765d80a3f25ce96e027746a5c5270e3ba1816d1d7283c751def104471172b54ef298bf8b8913a6f6e019cce05b09cc3f3549f9e941a797feeb1228f0f9733dc6cb5a85d5d550fbd484c325d5aafc1b85460afcec3bd97df2731e9ac55a74f931c33541de4561b9c5d7576ccf0ed635601c3442eb33429bcc7796da793328e1f3352899db16dfe5cdc8d737bc7c87291b17a9a76d72e7954a40c16a5e01f95c02fe86d50b2eb8642b286aaec4704abb21afc4c2d2723d944f3ab28db80f803332c0b0dd83eaa86b1468649b51208a8b321cbccb8e72e0e09618f3386e592c000d8a2cdc5de15d2b153650ee980c32951052ef5422630e6d31e3c8c89db03de89d80d5fbe3428e17ee1bc8cc870aa00b183732050272310fecec2dcafa77035b77ef19a15b925f4fed59badc5df392949a02e83ad97264dda9196b888096e1af43369f46923541d386824c11e8225df89252cbde1f6f936c0f6ce47aa9805c0563944df33cfb8ee0bdb2081ee56f107367e2c44f7132c6fe84868a500b96beb52b740c7255c5cb42ff815346b1050f66fe7a70c0cb72c2e9e38a2b44e0e52af13da90a67732abc6d88c8d55443d83d877a439cd83f62a02b6165a9d100e4c794b755d33c39e4d540f79a7134191a600b2d9f15e1bd72eb0121eed8a7a89c550f2f5524609d4c98f7c871ed3b79d3d19288ba0332e13ec33edad6b8996699e0fc71ac96353857c6ed60d65caa0a163f5adb59e23464192b9a6757b6b05f6a8b6d99ee8a361cf32a1662915934c747a3b109994e0c96319f118c235bac0fbd7b711694ad4ada7229f3c332e1c16ee7cbd40f8cf2e5806bd8c5da5afbfe2cce99e702ea27499208bf34984b62ef9275b8d5f580f36b3625942858bfa015c884e134b33f1f8b7a988ca8e2dc74d730e601f542e706ae353d821b5553d3918e86a9f64df65dcf29c00c87128b9b2049da6b4ea5ec48e33c55c7afb79d7958717197f8a41cb783921ed8a0f87f24ecb2dfcb6a887ce4c2637288879205482f86a16582acc00bf29b7fda07ff121f1379a0ddd38d5656e5621965ec50cded8f28cd5fcc530c2abd0b45e65a0f9022223db75d2623dbd69a9e11b10bfb7d7b9fb12afa9bdf82ae8a818237b02ebf43c466a307a77afa2b597d2b1e3856bfd9a56e5302eb9faa4ffbdd937342eabcae02aade5182a9929bfb544ce92f054e2b8289aaa712264a383fb87935effb73ca288d11514cd59265cc4d720c115d3db7bcdbd2944ccceff890281e07d858e87d9c8d09899c98ed2a240d37638d851594c7e14f53487e362a8873f41907adc414ef7cf0d4d7a1559194177268452b304bec4779a3ead63352d6e5a5ba7dc1fce3cd327ad718c466d56b7272422f609d17957f0c1c82494b573b1c4ff823ecc7ee1476f2b5e2da822804357207db8eab13aabbfc282dc85697980ad6340fc6c2f08654099a5cbc907fb250723994c6126334721177412c7f2d96a5c7cd9caa44bd63b1464b2ec1c113ea13509240af5bd9efd8a95a1521b6902dadf19ef7009207d5d6722e3dd4ad14d212722c1e6288dcff9b7bb9fe9311f3a00564a42c54ba5dedbff164847add2cbc46727ba1fe1ae4c21c9616e0ff309d32f8782f451c364bf1da1d7a214a7eec3e9272cc443aff729a94654085203a0d60a009d8b1c06ba3681681a750941d63e52872f4f9f8a3ec0099d2023b40c6187628d281bdf43a7af87624d5b7a73374ac1a7274af23ac7b96300b118d6b4692924f673071aa41ae72161fe9ed43e718a307726563b5985209f63c3e5f96612a22380c577d28960126eb8aec2e2dbaaa8d5a47ca36e7a99c2bfcdbd7f41f4564ad433276ad6125b9a74c16cbd73964a60dae72d99bb06d8a1ebaf1fe363bb673edb8f37c3337c165f6b4c6c070f23263fecf5e66b0d44d8d7ac9996d90dcb08cee81b6c0ab5822421991686c6d0b9b4c23c87225a3c53a616e0dac88fca1cca5f97cbc6b2814ef820444c25118ae1a6c256772f1c61fdb4afd39f689485ef48dc2f67e7cc99d5ca3facf569bc7cade53758e729d5a672e78d473d20cacb578154862ffa3005615cd605f684000420e38af5b72fa6fdfe9afa9b952f4915f69b06461f2d9e52c84387e65e6d07feac4b9c7e7729c8c261f17296f0003837705e22e5733192471b98a1292ae55e37d3da93c4d0aeb8be3558d3d56945fe23dd3138075f56f4b4e24e5bf37287f8d67a77e62c25f16d116d09956572186396726188ddca91ec37623ddbd2c8d5a8a14391c91504a9c14f5db4ae1f4ab87079444ec01ffc62cf7db1e7edad9bc89d0e7141b3a9407d061b2967d187b4cba243ca58d25f61946a438e8696acdcc009f630b5ef11630a14d792a7a5712ac930b095ea34103c388db184ad180273ef75f9bf28b2f2c72d31dc49da74c83165a206e86fed028ccf6086232f71e2b56d6dd2240944f6c7252e0aeac32311075a7b5997fcb867706028859906790033917664e95f2757d721921bc2ec7f3b50c01d95d1ac624229aee367deaaa8188ae5fe1093d124464728165f025268a9e1b6638ec1ed9ba71763e01b753f85d6ea05dfe7a83a002a72ae2e8860daab55c824a280edfce37ba6fd62e37e1defc38b8eaa1b4f403742572c9b7f89b526618c58b006e8b9945db0f85c67e94e24305ff5a24c75d06e6de331e3ebfd44f72c598f5d8c69562f03569cdb103e391b338b0433f9c13d7aee44809730fb066261447ade6e5636e8a6d852966f11acb8b39442a08170dc0a5037212250b9c9c31ef8f284f995b57d4c360c7d2dd86e7ca2944c29f9c04047ee23ec09a70fdb56922327dfad779fb4bab58e0d58b16b8e911fb911e8d98faf45472e9a16db8c651e7d701466ef0c6e79c5cdfa406140bd17d64483b8c927ccc901dbb4fbd1e2e0f7020e568b3d96c2dfb26ca87b8390ae36f0064d5e281405ec5233218842d914e632492818d9cb9a6965d2dfb21a20dc844d5aa3eb401c608c8721e6b608c7743a0bd92c892f83eadf87a6a258fe57c333af48ef25b63d80cf072b9dab4f98ede563368b8ce2b1d2d0951c95bcbe84631776b4106380421920272934835b0a8aa26d715a6d1166aa762efb8fd92ad8a931248c879a502673db17243f3fb0414201c5b8f31c93721f8c7e39fd62370dfb9d3fa817a696e37981e10b233a699b8d5e03324087179ab7cafb6527f31734d13fd783ad9f565ed55b32af60975e4fe8a8ab42054814b3dbe8af4de43286afb6c11a86e62fc24802fb572380240029497887748305bc92e7e98a1724f9d13a797545308a03f906308b2724ed4c2a176a01e348ed4ec5797a4f103480e316e8536f34d0744c9f3bb185f72c9235df3774597d18aedad2a495b1e34ef27f448e2c2ed4983497bd4fcb85672fbd9511cfe0874c28d44a8116ec3ae53234ad6f011b7593c2608aea06b41b1720b997e3437b1d2ec8ec147feb5c8987f4a301041958d72cd86a1c272f884a13a46731600627e5246b89f6c7bba764eda28fff5012be6ba4d5abdbd3d7758e272688477648008b8b058f6fcb5f2bf90fbb8212f9b5a8328ef8601fe6ff133b34b287337e47e3b68e41adc577db0f5d3b0c21e981e492d500ae93f913e60051b728a8d764596705cdf64ae2f8eb7ffe7a97dbb3b32ff24ee3f06d747cfcbf1d072e62b5ffd0bbcd24fcc81c4623b3f7afc3f9c88d8d9c731ba122bfa7fdf3469016c21421d2d681dce56562b679f4c7cd7d5b4a3057e657ccb28d4b49c26f08472e9da2a06cbbd80caaee5ab233e776a54b75e995d2ac0f6b8a6a00027085a7a72b5091229ced7585fb47441d9ba9f9422d1d5a04a699ce2d472395685a61c6072c00bf3124fc6079e85d0408f63ab4bbd915746ab6322885cd5fcbad665defa72c3ec0df6f4a337f93840f8e16e99b644bebfb3aa202fc0623a48ef3fecffe04dd5a560ff6e081ed949bba96c2f77f95d683edb1dc7e5b0a151242158e444d837aac0817de62f12ce29b858c7a1f81ac1ee438663bddbbc7af1065cde7daa76716cdd8817acb3d1072e7536a30c08f6c80e2e13fd4406840abf484d60c9703f3714a26f8e5c21d9e6d28a49cc41bff6fab646ca3923b93b6078b12744215b5a72c25da3e090538011c4a5f2de76a89f77e3e7c92d24fc65aaddd7468717c8ea72eabd959d67a671af40f7156d77332fa7a96dd24ae11e1c63c71474bf7d3a3166d117946396e80836bbaa5b24b8bc0a21b29784c80370830d15b25e4c3ada30723486ebe06a0b32667ecd7c7176ffa3f7fc7abbeca7f55b9165a1035a75ce06234d04d91294e614ac35e41e6b2e4e437f82c6083d685028414b46f363db5d1672989fa02d9f2f297b9b231ea2d8cb235510624d7c9f694fae34c7bace00a729724b8b685fcf0ad91689df2edc9f9ae850529530bd4624bf21914e28104c125255ad1a1ff6a1b60b8bb2da4c341cac90c43de6ab363620cb9a97d3f621cd0b3c38d1cdfb0aca0bf38cf6a9558dd1e42a1f519dfb3ca2da888fef197c8ef9d884729b1634405a35bc9886894871f4e10a76ad65a0c185915064b77ae0dd7705ed04067b31b478045f420e2551cb003ec94866f6372849d353ebe47566593f91924c2476ed940a07b42a540675d9a7ecf856d3489294b7c0ec5b2d9871d79cd49a6465a401dc452809808cf76b05215110630c425a83d7945baff71f875f629dd918421f6ec1014781be7bfcb56b8b0d22b29c3d100e94768716e15dab51fad6eb4663bebff6296638f7d1710a2f5d28465b51fdd5621b00f7f77a75215ac24e2403f13f8c9079a9b7984d11af9efd6f28bdd411b722174dcf52f7df56d9ac1ffc72a3f3a6dbf7444976cb3867b305eec82a31ae52e6a917e1675e5817a58134410ee2dfdda7a2b1194fa051fbbe91aa7a5fb2f3fabda776694eec3955f2918862679367fb933cf9339e1ab5d7d6dde5e2ac3b3d7f8139f7018c42df82cb30e28a720d12712245d3f36d9ce911819adc560f85f8d06add6010a0cb8a24884d697b0015abeb384c886dfc48f3c614165ead70ba79b329af5f6a32ed0aa8c27921137185f2fe2f38082a65361fb2c245c2e60cc7ae61ab8493a7ebf751a5a07a269c4da8b2c8f870ce5078e47bb7aefc8e10aa4031a140e5c33cf2387cee4d3ed852120f288911ba204c71252b4c616b85e3acda9457a06b22988dc73e57495a1c4772f663b22fe3a5b1f4677f204c7137ced5b4fdeb7f61db4613f5ae78daafb67026e4a43ff2a14c97263652449b318b4f6a99e431d46eafcf0ec339a11f84e81172e89257cf43294ca5b2d2e24c2b170dcbd1354f6976dd00749672d571a2c1900f02d69f013ce1e843ab2bacc819c3bc880c4b0dc6a7fd4a084900894c7b5ed264051cd5f3ab4a419028b0e4927c96f6cc5f806d82e8d218bdc8e3a347154633725d6cc0a67820abfe482a557d06ca6abb1e4e4849cb5082b8b95396c26edbae720feb8e682f2333543bea1730680499574674937870a43cd681991914d86d9572fcf983e4427389033016d863cb589b28759f7de152e03c11938b9e2ceea022602620b95900925753ffd4a2b4e609842b0f7f943d6618ca4fa8f2f44ff3625672377db17d35fee09e9e6b8c10901641076c1dcdc8c1ff79c959f8e8ff0ebfa572c27f5faf09348d5b7de1b2a464c11d33027e8fec13dfac0b9fba9d0c071bbb72b58eafd989c282295fc4c98e73727de863ba367abe92905e981f0f51a7993f687f360d03b839b1feb478bd2d3d0d6d96904ef427c46ddf26153ffe1e276b6c2e9e026790de0d780dea88197867f8a54bf6fcc5fb4064cb8ab1f5a4f4523c9e72af00d9352d7beec062b0ce87f29e0c94280253645b16fda9c490581aa271ef2d64aa8332b4d5dce4e9a651406bb3789361a0494caa9f4aeb081bda4293d7ea0d9efefb52594656337dde6f192008319b084a21b14055af993bc5af31a96d1c5bbef9944f64bd3ed681c340ac159e25478ea474d920cbe5d1762c651a7067e4442af3aa7430b85cd6d614b030df0ee31cfeb52a536d25a1fcac55cee2606cc94ec2d716b3c079cd16194e0f3a7cdf206a1be61e8530f9e2012a709f1b45d5c3726122bae7a5f9d38d0e06f00f5ff69bbb58b62ffdd610f3b297453c1ceccf5c37d2878010826e1f2a7bfab2d1ffce9c187c9b26884933ccc293c5c531868af75544a6391129433d9f1a8ce47311506068b0d78f6f7c77beda6f1cdee68536fe63589970505474caec0230841c63c92a923eed818f65f57131e5d236b5442a8f72efad5fb3fec61b7a0480e8325dbd2687c881e5e52e61cf51718276fec9f62c40f77c978f22e42f145ef31dd53ba0b6467796bd15bf9ea33ac0fe428b19fe067217be46df49292a0cb8be4c49ad839d102237e9c06034ad259bdfd4a3dcb7c271f8e8abaece8c7a93c89f1ca51792a76d19835f997153850128c813430a0f5c72695b9d0219aa8cbd0c47689845f4ecfbe8064a142285814f6b2c9b4fd766eb427804f374c1cfc73bb19a1bec6f3ea05cdc13cd945566665ce8213afcf87aed72b064d89bad412f5bf7c23b4690fca1cca8ad844f182c63bb1b13c3c8124bcf720749e5c1d58032e31c2186637565a7a8b93452ac20a74e0267e685acdd7d6d64fb06f680f87ef40d0005936d2c9c48346d505d986354c356f10a449480f28c0a3b71b08333ac7140f5917e578331be4cd861e360d73045569ac5412ca8445e56d7197bef7c731f4641219cb39c437ea7b6e54ef53d91a66cd7fff62faa86dc72358ebb60b79dfb723f3588dac7ffb20022fd6171606a87ceb4889c9812fa3b3cc86608edb0d21125eea1ad76e1558ec89f4a642451cf89470609ddb92beeb17283483253ff2d24548ef22e34428d2eea7d8c22cd5567072b9eb13d1d38a5495653f7373040ea17321c05b6f7b4cd5b3844cfa405ec8f404315b28ca76478ae72815942ca12ebe08230e625d320a7d6f4e80f486b025f5ea38929e518464b813bc035bda5c5319f879d3d8fb686ae2e97531949b811f603c6afa376bc5a9fdf2fc8b18be1649049228eb5b08281bbb91a52f725f1453354fedbe686700d322172fc30102572ca413f99fb65015c2c28a7c3dc065b1acce8702128f600bbdcbc72222bbfff267011f12eb7837e311194946435c2f4ca3e12127978f3302606ee72c1be41446e5c0bba60f9fe998f8ac19329e6b83d8de62bf2ad2d7055aa1a91729eda2fa2c4cf39c781db4ee87e6713691d954fbc439499babd117f459ae390727f0193ebee49e874f9ca8b2830646786ae93757ec408a1cb495adfdac30ae6728b4db41d5d80bab464e9e3350f9663a99a9961ed5c5dbc768424d204a1c391725519d07839b62a490ceb83a3dacf24bad27351298bd472e5f81a652632cf3c1c0547f44fd6ab64b064a26a3f2f7db05af83039cd9a542bee7a4393fde6315972c71c393426722ebd41c6015c1487f5852bda0fcd029fab672974853347ce454022319931f880586253a5353c89a59b9a76361a945407118cdd1268b4a77760473350a6fb53b3d9311d0b0dc32333d4f23000edc5f1b5680a0382c2c9ae3b9b1a73815e59d373e4b61174b3d70f58c2f3c98314ab1a1ca818f9c08958c71eb51dc00bb750f2c3600a8d408e0b836623ee03f9414e44c15a4560f4176446b3ef093db3dbe65fd660a55d8ba3be83763eb550bbe2584a5a5b1318d8105b97222d72b6d3f10b175b799d9d3582a1d2ca3c5effe146085eb5a1046b54aca0019d1b721bb2bae843d9170a2f341713b63f256fbbfd4982ba356a10506752d8d97ade6f21dbcbe290d129d53b264291fb0a84a8d10d8f94d3648de90e4a51245f67157298e73443d7c641b13b86488ca37ea8f3f45be7719eeca8439c1b39fb887e92722e8c16d446ff787653c382a6501b323196f8ef4402bebc03655ebf3d0262347210c9111542a72b23461f6380f5e4481528b1d2c56fc591d0195acfc59cf57708a01200b2af2912e37e89b13a26528068c947747c5de72a226f3f89404b96fe7276d6946f578d0baf1064a27cc997ff9d5eefb2e78db7e9916efe70512370e4725ca264e275a6118790b8349796d866839b0c8c4ae23156d2ed824c89f241791559d3aefc22934bc84e18993d17cf715476c1ac369435e1c73040fd8738d1a372e6444ae4ba47166475b3a36db9e581160ac91355064ea6811b531dbb9200c97299920751f837b6e08084436addb954f12242da39e23d362e1ee69edf57bc994f3a42478123613cca00485f022c0db892dca31d2bf4104f44eb2d240f0ff79c725c7cb2b4c59843aa789809f94dbf3f9d5907e5a7a5259389f622cffd96c850477253c3f13fd70908b048341dfc77c9ba4f54b580a67e52dc44f3275d8748cf594b5e25b805b0e46582a9d0aec90f38226d4e0496460f3e7dcef41b5bc8d5f864710f3b9e9d4e80debd4318a2c6af95f90ce371472bba833bc736c2fb5e1b657277d406291073d58423c90f52456836478b7cd50abc4eed50635581ea51ecc66f3d2366b1b618c525357ab060a51461231ce5621960fa68860d56709441377f103820a0fc554c3e3dc725406a81b95c526c074083f9d58bc42287575552f5a072ec4fd851afa1f1b7614916bc6c48f7f336e5177028f42f4e7db1fc4db1bed672c9702c6c353818ffc5a26436b2461936a502aaf23df7de717031a68e9c040c72010a3861b7f55e854d5968da3089f0c6d2aa32014285e4ca13fe5257627cb072a0c566121dc24b5a6ddc985d2bf6b6adbb6209ad4ddad189b7c5aacd85bf3e5bcf2b30c7042c131c76b01ea7888dc9630ba7572d9b7d4166eb68940a618d9d50b58131efef120b8b0558090475121dea1c55180c65acf9cb0fe68019a2cd6b72a7c28779668ae5295774b11780c195af2642468a5be6c241e1eef211fc33667230e76b3d5d68a98cee444d6722440f418328499965500304331c710ab2132172bfcef7a0ec2de0152924c3d142771c3a5f1adda5d6b54bea1e2afd8179595d72cb5085696b6948675c504c47a07a123bc67f72bc7f0c137bccc7eaa200e80d725dbe51c0f995d61bffe12a828911edef039368a803edd6964956645317b7021e52497f770e86a26f0554a2616473d277086171a56e8d366af974d5d5fe7fba72d9e85d15bb9a54a930f5b7462f50d7aeecac89558f36f567e382dba200672c724326c641292634fc5f86757167452515acb76df9055d5591af3a12277c74ee722e13473bc37b5503230c1637b2c5fa82e86071658ad79199b8264367f92c194b77bfffb3905fba867144a74b8f1e2c66995daf731730fe4bd0618ef42b9ce172efef1806da9061f4c350b14e41be5892d199e5f375e45164886631df380cdb72588ec38f6f0fa619f9f80ade475fe32ca1468345dbf19bc377692077eaaad57280d051750da3dd822ac98567bfb6b41d2a038721267f5a84ede9ef346c57cd72140df33f196bdac0d6a15f2dac93c1c45995fc0836bed6627a74b0d192e0a90337a394ca052f71a8756bce6a7fa22bc21360ccd93e26a15e3e1208a3bdf23e68683bf68e46dac02dc5af24fd6fdc1fcfdabcbde0411f1b4b1417abde7f52c0221da243e177ea36436b3b55fcd1f5ecd5100f9711fdb6abd7d35f956d658b2a726560aca63903674b8b98c3cf2b4de972e960d5f284c3ba65b84908aced2c7572be18770a1a3e69a0889f9b212f2b856db5498fea05d2f7181393dc1d9c92796e0d4620bd2670fcdf54dde80450d0f1a5abdbe9a4bad8c7a55934928f9fa6e37216dd84fc4afb495927d2715f0c013cba6641b03cd869558ea61e3119ad465e72e443a942aab75de805d4c188c22295b5238c7416b601d5db9d54b289db3c37702b67564db234cc19c069d25c9b9addda45010edc4545900ea5538411e8783372e6b89e1478eb778337e93a94a666af06f01914dffd02d74e952d480e85fb50025533b8bb908923a7a66f616503d252251e85ae0d36803129e699b5d0fff67472188a3c332c92385b3f4ffa410a37d519077e97657d67706da58c8ed3228a3e72dec50801a915fadbe25f65755954c30a4732d13fd552bc425eee9ba01a0a4972ca10d01eda88867fb907085a070eede4bb3733f7780e82dda5c1d99d820d8b3df199f5f2a339a4823627dd1e69bb09b22efc3944b67b3b914dd52e65cbd4bc10ede6b6e96db985c5d0a13d7baa0bf71c21705498510279b2b65c9fd7304cd5721526eb981ee3e65c075e504b10919664b99a09393159471405e75b890a7b36725e97bf2bb46803cd791d19655c11ad1c2dc96b35b4cd2f97a5695da7428c4832c68b6fbbf14c72ab61c907e5ce9b024660e9a3d1f393bc9a7859e9a70a85de282dc92f8f67afdf82cfc5007ca060ff2c6fb8c6a0068399b3d93c2d3d528dbd720c6d9a4cf372498f5f35ed1003b7c102118ff4fc2f0299d60d3f93af09f3647268cd7a9ce7d8dd7c812b2d59821b3dfacb1ff61d89b13f7833bf037c55c6386b16974fce21af0a4bfb15de50e9cf4bf3f9b5578b44c57d2911e562e9ade1b5615797c018520f622958181c44387db14ba2e003eb660994852af0828b09d5984530ce5c165cdeebfd5b0ea2ef72cd202884586af247ab65fe4d69cd0ddd871c726e38c5fdbc006b2557313004356de4b70396e10683c443562ddc7f38bdb70870045f3872479b6458ddf395ec19d0c9fa042239abe8b80c6de973cb3fa1f5a072fa13b5274115009d452d410fe6276fb6a319efb932ea846006dfe064de14c96e3180e5355d2b3e0075fbe3b65f723ff7d7a04f9daf93f77bbc319d8880dc0072324f6653698923824ef0ca5d6b223eeccee4c17c46941f2f5f5e1125beec027280fbdb1ca20a07e2d23047090a224115b7f13b648a3cdd18520b05f252de3d72a85c81dcf09b7c45d51ca43bf8661b4571c686d909545b57d17dab19a7c7e672542dd26a1adc6f7ad6ff5156510ce0d738ae9244da3aa5b04d8653458ba5e9727150bc1501dcc792bb3e7d0c3309e4d641aa3902e0586449660c81c663654572f48f8dc78bd11183185947c4ac22bbe8969c7c849d69116f65122317cd7be3555cfde552dc695b4097f4e2182eb9af9c2716fa9d146fe20ff2c7ee7721e296720633a2c420fb86d86245dd3008de2fdc995e4e6b2b74a11682e112f01ee338241ff6c2969f6511c03d6c7a8e04cce3eef997553e237f1346409d61db1b0c737290cc7e1421b83aa25ce86be91d019accd222453001826a22624f7a73796a1a204fd57b5e283b669ddf96cb1925f551f7807342357fb800a82a0a8509c1e71434c58b04df94634a948da1bffba9ab800c8847eca70ea4acdabf56294e3f781f72151705c91fc99676ab5a1430618977de4d14d61d4cbca08042aaf08e0508c3729affa49611c644a88e2c52b494254790dd75a4e7e258a22a1dcc75734179ab0919cc5255133939980af2d3735964782f50a954796b8f180ac311796a4524fd723a5aa28d270cdea2872d386656081c581a281507542d5bebedea91dc8d716172b81031824b22aebac20daf04fe1034a2aad37d621334d2c2989ab84343de7e51fe22f0fa56243e588bb41aaf8d2e9c86629d82c08cdef3279aa60b52ca7a9f72070528a251a4ec699b54ad06f84acb13864bb197fa5d065fc2513b75820ed5724774da6ad4b62b98dd397c414ec5597c7ab565915833800c872d71415c119c72e5d308a847d626bb7f1da5955fd6f3f324223acf1feb235ee988fb88cb8e9a7267dc32d68d87af308d17cc9f08680fea59c8c2f872846613b3b96dd7fc699072a990c14e986886bf6b7ff44bd74517c3c6f8a501213b96618c29524edd2c137282d4bcf7cc3a34bd0b1c1b51ee88e66ce417ef2f32ecae582b13b25cca7cd2290ecc5fe0135309037aae8ab4bf8ae9998274307120af58e835fc52ed1604cd72b24ef4f1bcd7afa77671d734735c519bbbe10a3c3850ad4e4e455aa40657f20825c3eb70eb6df645ca1a990918069dc46c213fe194e773536c281ff52ae1f34344083fdc5ba32e502661f8fe1db6f0d8b9ed4a280ce6e84974ea932cf13198721bafa8df8c703de7ef8cb38c3dfe5c97dddc2d7df08c13b6e85a39a59b11053e038011d1d1cd9470ca5fd1becd48750b37256ddfbcbe01f1e3f0e71d1ab3f7725609c27c8e9c08945f69d6dd724c96be43f43ea6df80ac7399ac7697dc40e772f4dd907b2afb4cce01bdd19520195bda522b817777bf2c9e48cfaa724bbb097220ea26beeb7621b5a86e45c591cdb55c462c965816035882eef04b6c0a0e4162120c329ad36596af938b7f13a12d987b5c0f456d654949bae1033d98f7ba2d72c8b5d41c79e3b263d85adc1990b17a999b0da68519dda66d9930b5b7a219d02f818db6ab00b32bdffd85bd7c7d921ca595e90b04677096a5594a5a675eb69d720677da77279e214769a6769b38aef288f7a42f786aa7c6e0bdbf0269530e9c0d001d510efed9e182fe39f986b6f022c0f8a1e4c2b9f956508602b3edaaa48b5452057e07dd07cc217322bd11a2e53e4b616b61b69333db931212c32e230ea11bce8239235e9e98b940d51c360050e719a203404222916a52957e4280adc9c1502728180127e953558296b0273d314269ad97f541268d723798702b4ae8a57972fb6bd056fda5f753a7123186619c2e35172d7af3c05e432be388498c613a00722347ebdb2a5a7babedf03e5d04dbe890b9d14a4c9177dc458b02cbfe72f21e2340118b4740970867a7ecc4e01baca80725a5eff55d37eb18020e7277d050dc6c38e19a155412e714a518b63bfcb5be22b97e16e0e32a72ddf9c069c3d019f43b762f74ea8d7e4baed5185ef9a837decccd647ba38dc92881a86c9b59e9d0bb6c8ac0b70259de8b80bded1c219e20d4e0a8bc0d43cb963e7ede5894e037f1207259eac7cc29229664aed0a38fd1688587f7b11ccd3c5dc1694c71fd80d6e8b47289a1beff5c66486ae6f57248bc3d16cef8437dc2ab5e0590d9db082a616a5a281f3899d122cce46c61191da8b75fd1f74de5953abe912c63791aa02b3ac9fe456374ae177da37347644475ee38d5d00bc6d1ad080b5efa77202c2ec609ab7a43c76be76d805a42ce0f1b27369bba8bf23afbc3b5b5a8584c350cd2becc04aa72616718b515e2373a034c6bb16cd0a4e9a66beaa9a2a678f25cc8a253eee1876c2195f1150c385bfc5805a7fa03aa66c4305806e9558545219ff6975aa5eabd72432f36bf8352986fc79aafd753a97f7bd49319e730cb446e4378bd67a79c59723f15c725a5db8f9dca9d8592e8bc5ef9ee20588f1fd535bc6fa4ee18a11fb85f5207ec0712d9f98103f5ea21b8f2289609ef0d346dac2793a1116c2040a7e35a6de3107bdfa01823ccf99dd48eb09fc441eea502f12d6cc6a4e764b99003b972f984548dfae758494e163730b20e7172ae0c48584e8d3d9e15aedba18fca2b720ac3f7a307af406d4b724b9db032bf22941de510f8d5a6579ef8de9775b247432d556e763a55d74a11b97d3a095f731a9e48cda3669f088f5b3024c31baf117237dc4f804a183b37dea5afebeb524486c1f4d4b2be3b97847acc130989e46a38f1984c1b2cea115af315fa802a4216590553e5be66fef1deff8cff3d25714f15fd13a54576882d31280a5c51386989f5f0d4b9a9adb9b4e3f13143ca0dce644d34155916abbe8282a0cdbd64d415d6b24baca1b1b27147bbe10c3ca4e36da34eac91e259064df41242a7051fd1386f6462289ec8009da40259762735ee694a39548612504a6b17cd18f288c3cd5d1e0830104a20f4c2d679531555b7c4c07301bffb071150a5158550e247f6d5931adcf89a88d32199edcbde7792693d316649c17b93949ec6996b48ff13383704aabfedb8162d42a31ce1843cad3dffa4af1bc33f6a7fcbe40837bf850ab6a68005616a4d2ac89fdf0f1eacb3713e7e95e472d1828e5817dddf41f882f0dd101a2f0d486deb671f4269f2f3cc4694405c06726b51744e48c6644431084069c276a64922aee265c501badc4b463f9f71347572bec3aba51316b6cc3dc077da03fc1681ed8430290b94af6696dc5d0bd8c31c72ec466d722b2c7ad0c4de82c378e5e273aa715640a0ee58655d22ed02f9a8752e5087e99fa1d2db1b026b7dfec43fd837af0fdc982ff39c6f10939e25ff7d52118ae63fb953891b0f6af023d5659d15db7a32ba727b2d066f98fd066789a4555a526583f0a1b015ae843ee7c897b91216e9a96ca8fb080cbd1631988858b982725aaf6575641efce25d045b37fdb68493c888fd2c9f7451ebc768709abcaa70391abc5420469fb5919c5af32c689326189b3458095d7ed6a19b1b0471e852ab2852e0c33e36c7da1a598a317ae45d9ca621661344a47a65c0d2de9f8b0f973a728355351e9f07a78a64ce9c6f2937a21aa22a75354be438be867f17e71b1c9669e14fdea42918c9ba5320ae66fa35acf63c2df88610a3516ee7809f6f00103a728c11a87004adef376d691c83470e7dfeef172c1a42345268b64f30a35659f15a2a8447bf2db3ac9c6f3fcd59b2a0c20c1a1d59473315ab45b052e60b75888172707d1c18cbfa21745c2b9c155f47789be871764dc40d877cbe6e8b05c65afa728142563e7b6c4da5ba2e06c5ebd452405026a9d5c989b6e5169b91155971c6388e98a57aa965ea4ddc81222a0c9e5aa888ce29c97175e48dc3c0456cef9d98727785f8432d4e65ffd4425ec737fedb252767d44ae5bcaef4f8f32c74444d2572ab7238cc41ecfbba0b7740e4b7da9f9f0b300340a620cb99f6d38cd623527672343616fe54c1aafc39b271494e3a265ce3f2410a3c3a14d6d7c7d16dc23d6072bdf933607449381dd85feedb73588fc09510372eeb99ab9b090233df8f1adf7263c48503c143529aa94d79ffd60ebb2bbc72ef3611b7c0bd6354b7af4b28c3411acd58ef81c4b4670c7c124a865d8d03fc9a87067a3e1419001b61f5752322725dab3cbf6ba862207fe2f33b44f0e20fe8b7ffb87427ca71b2d65d4d26650c179d53e9747177c255c5afa9453d6ce16fdca0b704453ad5356e336629469b7f720b2aed0213b6c853bb426e7356356829df2e5a78e81462e7132cbcdb2f090472ee1fdb557b2a9ad17d337c838c7fa12ad301d82e88d26503a6ac05befaa2647208c63501538d5e155f6bd04e7f0fec1c547c4179a99aa45d7f60f34a51429c315047e9dcb9b8e36174bb3a07bc398d457ef4e736517821ce9007813b110262724157f17883016c66581c33f64f78998b2534950147500f4c0f31e66959edb446efe99b05a96ddce27276873cb593ca008fa7a6e82a1017af19f0232802917f02679fa7ed38bade46303f54124be475b3755cae4ebfafd532305e4fa1cc861d7257905b5816f179dabada52ca384f2adcb3a96005fc38487ffeca2cd10810db72a8342aff32b34a0d3e8ad50a010640eb8314ef1b33d45118a52ef126c30f4f728d7b6566b9774b621cfd51a5d0b2dc5ce2d8bc4d4faf02e24e48754e8ff6247257fdc11746f2ed6de4cd130d0e366ced3b5856f456fae499cbf5107d3188e27217e8c0bea5859bff8ed34c58627a7364c115980fab925daae42cb8bc9dd4774d2dbbce44a91a5422be23221e633cd21f95b1b78a50989aa48b61749df5602d72f146b6a484e35203831cc7ca09a6c59fef09112d8a01c705e85a1d61f2f6d3721703f90d4b30fa0dcced2e2cc1d080ba3d442f66f9d1e34544b5678bf657460d548dc18a10cc8eb344ba9035636fd9cbc10dce2a634a34ffcdb8e0ce5a796172a6df555a09307146a4a28a93aa926724da026b58b9f12363c9dfe394ca4a9072188f3f81af04f68e34d4bf6a9f6584dc9be15559fff91ec903741436817b5b61b5ced415779b120060f2c614acb074d25e1b25a6b91cb3188c9f8af1d25f5123f4a8b5f3376a39ed4d32e0500f508e54134d1f6b1ef9dd865866781283f74a72eec230bd1e097e97a39f61b86e0d7247957b444fae628fe33b1ae06cc572c772c70055f4c9f707b94aef3a3268e9dea88d7b06ae6b19e4177f25c4f08dcea0729df3acd727341b65e26069ff8ecc9a84d072e018bf70d506c8083b2fc8e9ff725458c90ee41e710198896b20e728599aa8aafbc1e0c1ef4959fe051be0feba72dda0ab7002ef9e0131e18788bc64c6fd1a7722d0a00a4d26a5c95425ca3a5d72d12726811b23ba5ac0e9218ccaa8a39b59ef267137d9e801abbea6e7063830193ad38d667b7096a948a354a8a2387d14ca599844eb18308bd78bacb3ad09075ead773f5252f40a9167f670bf0be81f6a506b4cdda69f77f33045780398464a724a4de2eca2056e0143017f0aaa5ad2d5d9b05af027f8d9a2ca5d0b747c505544fe5484bce0916edcae94db5c954e5603bb404beb985491694d7e77782a90c97297687f6d8ecc5f2ba98c67c7bdf5bb5f59ab6d3f9d730c24b75b58ae02bbb95581319118bedc1e96d32546ec6e076ea280d27f59ddf202af393a94fb8239a15f7578ea242792b84c49e07b0aafb961dcbae1333f2d950cd21de87e5bb7584072b78cd288630d350bdd351bbca38b092896aef3eced50ccd97e9ad653e6dce772f514265031cf6586f956f2014aa879eb2b76fac911f0b30384b74c32df082a72bb9aa6560ee324e33d57cb4ff728c52541f9694edcbb411e70d3f305412b01728b9b4319d462d26438741291adb1bb0c6ed3482a227148f257ff153807f28f7237360fc4f29e8096c9108677f89a389c9efce9c1f107a6621a6d4b22c3eb497263e4709781d1f9675232ff0214bfe4d3f8b25fcc8b47bf9e3e33b3a7ec6c137204d8302f2c796f0c9c87ebc000b6e5538da4cb6374a6743c275ede79bb19ae68129b4ee50f4038322f39adb4ea38333b803bb69e96a1ec60e15d28789bef2256eb6e70c9f1edb4a8715912cd2e5c6150ed2230876cd9e47706576e24fa561d63e0cb90c755f7e065e24ad216b126c142829a4e68ebe949174eded2c00f39754b77ac8e98f1f5b8f2116935d3e4bf346bbf78cd33a5ff1d84453804bb07ba5c72c7a26932149bf37c1996abe4202444addf5028009117c88923354213179ff006f7ab41c3a71b99c5674ba276f533110e20dd8263dcf693c9b64b3f4bf0a28b723000a51d11d25502bede1f8f725645173f6ac896e4a4e42f33987e88c1f356729b5862da2501f7206f2292621ede9b70f8a286d4fa2347949e8686a6c1f9602363c2d4e994d05b54482d40ec380abaa3f9c1871926dd35f37202c44878841872badbc629497293b64f2afae47af2361c8d559db3f95c8e8afde70554527f907201affad0e8ff88c876274d3be9779798f34126d032e26f33003230d35e7e56723b8ad0423297ca713323c84ee0b7d60b7ff6eeea747f0babccf439899206ce72d6558ab974121506bd37d3b0595d738e01fdc1ff0ea1ed03e0d7015d4c573f2e3db2ef534a410ff24ea0b227919ba4f18502c65c1e726098960d96f74012227270e6d9bdc8edbf3f29e8423fa2ac8d81032fdf9bba84699438ff0c0b5c9069722627d02bb6142fd8d2cdee57afb6a88afc68a9c2b05ab7bc547fbb6c40babe1daffddac9885146cc095ba5710fc7ac04d0623aa682dce02c8ec6dd46e718b572d22eaa74d5fab0971f9ad50bd6959399e0df6c8a20afbd04f7a1ada1db5cff72e930e638528517e13f0882df73bbfccea6327a5114148ccfd05860be2e8c057219a368f3595d3f49671a56e05fb279ad247fa3c0c3c0c6e56c8bd97ea3236172addc815c531fe298d7c25dd55625f002533ca1980bb2a7ca7af0c447bfda81725a3b25fc9eeccc15c72a83db55fc351e2c2fe3881e5189acbc1101433f2f8472d327530d7c7569dbecf2edbaf8ec98aebee719bdd2f4accf34c2155ddbfbfe72da7567789b52717b1de1229fc3e7a96530da2e554403aaf241d3036bdcbbee06ade44caf55793e18646394897a48ad0215c9d41062b431ba7a786b8430349272948ebdf2cf946c3e15e352e06e89de22e94db124353091e6e4bb356917f73316317525084e446544fa7fb14945ef53a900324479b796d4f0e38f40970a9ff7720e116d8e563b44d821a813ce1ec9e183b51fefa8e4043f96dcd5a56f0da4ed403e37a9186ee03762ba885453cf18063dbbc84b4df0055039107a162f44d1b972ffb157001a03e90548b0399e3b7a823ed00b5087679bd50afd8fc73476fead72af018ca1e2d44f5c94fc1fb052aafdc1d50574b8e928363d49a78dd1d6d2633d5f97b1a07cf9703bd3ecdcb222b65824e24c434df329d4107b5a867f57d60171311128ed6dd5e13ac5aa591da3feb47292136853379f47390a4284963a4221468eb4f9ce3c8f9c9e538e5a17b0e471d750322807e7145407a378ab1b9ae754532f4e4eeb374e66aa4b90268931cd72caa8f7d16cc509ebe37d5eb8f24c9e2c60020a9cf145bd353b115256aabddc95cd2d9ae6c45e064e3ca3e5abd34cb70229ba991738e7cb0b49bed2566a0ca1961c12e2ccdfa9a2d2ad977de61720b85b2b2588f1dfb3719ece2231fc2c7c4d4edaa41e612af156f0b59f3b21bfaa30fc72b2c20d95308a01a69766b130263564254ccc6f51fb3e3f35dddad1e088b70315ad374610e1b9114be9b6d6a8ad3028781b504f363585ab86d7a0fa04f7dba772be5a088a858fc333feb3b61bf3b7786f3c092fc5007360c33da69ecb6256d66df64cf446a91d5067f2924ee1449f16da26894a2e422e255e7a3286094f4c617216c00fd9908508e028bfb7ba60c0dec6a1d00b11cfaa71d922b55a5417d1c372813ca80c800612c59505da0cc1682490bb3db1f44574876e7b3151069db6d869fa058d22a0cc33b2ed50cade3e7e7ab115673c98ec0a69c496988a6b52cf732d6ed20e8e93e0e0345d07b55313ed832d5e24899d8e7474c0777b2a3504fd8572fed420b0848993d034b27dbcb8e4b9ace286dc3cf6d74004513228c2f7b4e30986e5463b818c53be62a67a43322cf31cb05d8e82e30a60c97ae7b6f633b7ef41958981301f41db2a62cd8cb623f9d4e5ec8440c7c97dc9f00bebe89dcca232728e16e3ad5b154d60f272ee32f6d6ab7d95fdd5bd0f9e22b5c7023df972a29f72f6f947c0de5f11aa067333b2c14530fc751a4870fac2001b1b3650c1db695521d70385281f81b050236d01fd32bc5515a485d3fc7a3775da41a063d0f7bfd3722f46dc43abadaad2785311bfdfe67e3365dc5e8c2a36a697b4acd539aeef147288bad98ccc27a7f076502ecc4467d260f941a4bef0f2caa8007518238c658e7205ac9ea895f96b2043a97c61e5720ccd323463c1ef39fe60fb86801572307f5f76b9cc8e65ec514c253b6792f94c1efee44c27d0fc23f3dd8111c4dea16ed372fbc573fa40ce721bc3ef5a49d2e1b89096e30c2174f326d69ba1ebceb11eac72b2aae67c2d205b6bb0654f8823a680faa1a1dd7bf3827b257b98abbb3e5dad7227d7c5deebef55b51bd051ed3cf5e6528d1690cf04b30af3f9bb796bcd6f611df6eaaaffb9f5c7581d6d1a20730e62a730c90ef355e05a6d93a41ec4d7d76672a31ccbedcf1ddb6a1635b9489a54b884ddd2cb1686b21b99ad52e3015e0a4855a3c35d2f7078739842027bdcca0089bdacc93b7c35c23ea57287bac2a0df95721c8a6c318fa8d962eb411d23d8f770106e7daa881588f804291b71b521c98708bb351f9f884ddb19b28794057cbca1e3d969be8f213774556a085ee2a9e15d72b140be59df9adcb946a8933e386ba99b53af5d5df61a868e8b510f9b3dbd967226df7b05bde21e150ea7f704a8c20d790985abfbc284414322931631d5344455d815116202a985f1601e4bd75691e1a1e1b5480bd86f756d0ffe41b023101b4b425781293cdc091fb8e6889499ca9c0f677b90024efdf69ca6d377aa16845c4b93fd6d9004cd899e478aa8b59d57705eae171cb8d36472d694ec0a50accbc76b3c9015cb14d08add176b6d4cabc6ac7bd4bca209be9bbaed28ed327c85222c726a60e987a26ec2fc747d7df21c34638744bb613362ff1f890692b7a696ddae729a66a7bbe097d696de161216007f63768d72230b57c82b34baa35931196fe163e73638bc5b6c95f60e3f4791d85b7ae24a970af206d6ee6e015e9ac61ffa7f3ba557e8da04b31ae7cab4c8448b464bc509f540e75124ca97a3c8aa14acc34c4afee7c4c326394ae8d5298c76d54516bab9c3467c1eccf947e491b130d0f7aa7262f0274df2ab657969fed9627fc3c2b02b42bd0892d89b6a575087dca37bd172cddf65a59dd924bb1548fb53a52af8a6e0866b0db04186d43e99df0fef811072fdf5151b55da992f2093ce03e68c3da65f6f85e5e3118c499bf8c0e6689ad972bdb9c7092962748d2c946b1117335f72392f3c792cea7044ca45c30c4dc6e572200f22c4eb34e1675069ef98a8dd17fcda1269f4613fde7649c543928b8e1c35b5d410f0cf468143f962f0d514a0f6ca6d197d8377ae41e6d9100613642e0172ab7374142b9f3a504b0b734c27aeb640148b656995c2e982696f9e4123ed4572a8ae91bfe670841a0899c5a3d7def912da5a14ae0d3d759f719ddde14d988b5875a0fc5b6fdd952ccc2f3a18cce9b3c20dd346c0061ccb12c1b44ac7b045f028cad896013772555e36912edc4c3ddbb8073636841972581f47d204bcd6f94a5d4f2aaa9d6a6d9a5462415be12a96f586205a913b4bf2ff56f917ba8089a70272575c1c36d84a7bab921b9ba24322dbd87f0189a7969ff185ded6db9aa29eea72dde19a6bdfff2a5e5f92d5eb6ce1b6aa934948800c37f6cdfa839ff3405cb372830a285344337d6ffe6f0780e6ee635b8ffe87f47879a64503557fa429ed7d2ddfc495a68843296b1c3bede94393f5b0d57f71cb64cb64e1e97e5d26ffdc893a9d55cead605153ae677d57772272120a3672e1bd629e6458e674704a4d28f17253db2c9ffe5f970eaec2cc2607f8b536ff773c5692e4963d979e7f95c5521272f8f466e9dd4db6d90a48303001952ca7d48f86aa236ae4043176fe169d8f017283a8c75536a5ba83c75d0458f4e8887e4e2c6194bfb056549e5a14f154252c721453b456b90e42042d1dc6fb509a44bad603a6de78b99297c61491621b728d72244c9cecf19b6bac5e3346f0b4fcf93612ac27f2e0660b5d43afa81a6928c272d5ac90966812316a187621d3fe9b38cec33b68c93c89f40485be75d80f0637615ad3497340a170240c33183839e67b8f07e9be2c806837a3ce8e618d22729f72e8e999345941383027623df7e38dcb3b833e4d25243c54ef881defa8ecae4d70687c319f63537cbfe2930e147e3e424b6f7887c0d8cc1a1160ca1a9b5c593672b3210120eb41cd1dcc86064ba560d2879a74cc80cf1e8c0b2038e32992b5ea72d9bf56d59d72a705cb23225956a3547f4106bac76c5e321485214ca968ac522d5a3d4decc7ed35f714255ad099ce22e462b0976c04e5d3da2f3341f7cada697282501bfa92800188bcb9fb01f846645102f567b20a6eec4db43e1dafad85b8722117a8ad94ee1d9f371912d062542f594107ca9f21108e2c0cb04f1acceef90561c8d59331f9e56c462b74e3a483b64bd2db16e2c7d1a5ccfb1b0629ec35296706be582e24a8cb8227e6978afb6ccb6c8aa51b33361b32986884b81e6c140f63da597c5f082284be12e627d1f5bde91e1612e9f0ed98fc6ab89b561b989bbe32e54e7c2af6252bb9b9614b0ee7bf7f1eaa520674d93bc4a3040281696e1cf9727dfca423c4dac4db6f0a278273179625bfd71d845b46b95eb10aeeefeaadb272573fb68b7cf24c80a90a4b810f27da3ba6ad2c506455a1d16315bbcb37c2c371c6cfdd092c6c1a8880c5457305b72b53451132edc584c3e25c4ec606682ab5725c742024aa29da05cf3a7ca629c6829c6c3bbae86f5292d4fbf4213d15497c7271aa9ae6895fabe93a13116dcc9e6e934864812a8f6d1467ca61b87d137414725f5d7ead3a47f28ab2b24bac79e56f906c8233245fe793771fca41738cf11f7266a7cf01f05c39e0c1dacab06ef56d203898a4e217a6624beda485d62b3b4f72a0be8e35e1b423ebc6cfb1fb533cdbf18f219a2251f372acba54d4b27c36f872239eb04b9ce898075f7d22013a5b0c166d3492c984da6f498ffcc519fa70fb713aefa16d7ac0e7906932d15b31dbf8ea6aa9648472d49b25f57b467d69378e72539a710672e2b41c73369f1a7f9048eefaed399f005c3d179126081c22fc8f723ad303031feaaf1bf3867265b2566ce38f24b0c1be3e2d233bc6fdd49b56e40657605d2e8f8f03457c8ec7f82c8c3a5c48dc7a5e367d07c861a054463397c73385ca255a4733ce25d1ba22771a6b3ec0449ab824c5eae87148f7ca42f5a01d13650273081fa782420e8caae2b346ce9db51f970b29d1df1a7cb0325a82a3ab27c1a8bee1b5ec502b8cddc0e81ca6091594c21a169e3f7a67728813458d075a72b62e0cc5d005f877f73d87bae96e6f3a045a710f8ed28289b82d2d1d2b3af4729e5ea74713a28aec9abfb180ccf3e518e8a8543bddde59d87524551979cee972e9ecb1a8a1323504cd17a7b64b98a5076706e414e5eaf83bf7768725b2518910a9b175c316090ff7e1224cf64e627097929302a6af86e0aeef85f2b2bd09b472d06ee4c8a004527ea640b109180aed39bc4741ea9251436c6e06ce484b259e72f5eb74e628398ee0b2810dd51ac887995943791a4816bfd8c7b5297b7d1aa972d504a06bee74f7b319e5e358ea740640e9663f64d94ea6d3f6ae3808ed425672b26beb94c2a0479539160d22c3268339319caa1697e877906441204cfd324e20cf48f99ab62544115902eddf3470289f9ec6e0b671ded91d5f79b363c133c0724cf95088245dc5c8f58e475ba9db0cd8d94d3c4e77ebb16c6f8409eec8e369724d1abb756fde02aa169dd0122bc05778e523115ef6af4512d9b892dd84018a6c3d140e8d9235e72b88eb58c999d26557df40cef1d794001771c29fa77de01d1fbe446b67214f58bbc24ddf4535adc14ece268cc039f923a507a7a780c39edf72c67139e5f2a0468e9cfc22c9c58a5615bc4be95cde369414814c75d1fefe5972d8e4f72c4afbbec475ac38d7adea97f29f16d3997fe0d62b4a631408d996d961bf23e8da081d5e1c8fef7632b07abf2f8ac3b296fab204fc3aa74b0ba9dad3720f84fc3a9b043189e76f160b730b4c3685b7e3f24c30051ac095248444fe0727e5d76ca1d0416d6ef6213da87c9d5db50130e71b4eca12913c57d6934dfd5372202d70ef3f5f11dc3abf0256ef2259adb83da80458477162c4394ba02899f44dcf6d25f3ab7a3fd7679139a69c23a1a95059169aa3a7e1176c2b12f6ee5215727c10526056c4cad112da123ad2d1e2d2b46c950ce9835aa561880bb996881772e94427baa61ae518af04a328954d7557c02b3e1f744e84bd145a86c382498e5a0e3754ab18afd76f55cb4d78f4e8b941b4bd55dfd8131d2a461b5aaca07cf734296cc01aea56a981fa9752b90e1b8304cdef81610d0c5e697ecc438cab65e772f0fef9d6848333a2e50b21705e5369a71dc4a975f0f55af29a44384fc1453c724c5866766dc8de304d11f50fa96e88762bc1236e843e6c7bcfc763c2d128b572a89cc8bef59860647342ae489980714b7688978667109041e91310f5764fa4725df8b3973761239d87edda3c3ebff81e0105b645a5a385a6a6480fedbf980f7239aaee1ef9241d972256dd421a52983c80df28f28232d70cf829a9772d82903b90d77b57bf6e77aa73657078db3bc3607123dac1288e8a9a815a6d01d2d60d728e9f36340957e00cb01405bdb812c26faeaba09dce1683a7a177e1ad9ecb4a38483f22d840db1a23b328e0d4b2c7f46a7264a9d96b1e26229f4c2b23e5962e725e3767a357214a6a5ec95a08cc666be277fbce5d55df900a4834f72f4a8ab803a9d3baad031b739637b2b56acef02aae54bfa1f9089ea0008d31ea87259b72685ca87b0146823d7688fd6b2d3c5474f34b53e7c4e4329e4bed54364da36c245aa18a4b02ae6d91ac3b126c937935d9bf119da06ff90b41ad92ab9fc0876e1b030f9534b7a92f9a845c08f2537885949be2aa1a3ff83e59a50f4364077e31a272d84b002e73467eb551eae130286672ad522cae758fea385cd6574e3be84949726b0960831b1b9ccab61b67fc14fc9100b3e1f9e8a6c485fd57c59864beb7783cda608ede6ed11d5398c21f85b7e749852ea083308ce65d999cf3eb2ff34414725e65c9a40ad1633b62950b0c920d65916fce3ce7e7d7d99b123af9d90e92066fa653a934ff03775b64a2a54b7d88a8be5239a42ba4382eaf77963ca01e36cc6ec797a18772f5922a27c4360182f67b3444d035018dda549975e6f694a371111341f927c1ad3ca82f7e3b3aa9419fd43c1040f5d18702a88646f47e45650c4172b1d56a6414283572ed0f79b71fad0676e03df61b21b3c3da65de9cfe6545d07249c67cf9cd20782c19bc831c828dafc97d30ef718bdfbd36ec91543da090ec72987b2c2ea950b339f36d71ff8573ed331018f9e60638195440d189ca05836c720dfa54bca13ba39b2584e1a6641c61bce34482b89dbc92bc3746277ae92fd72c20c00a87ac02e8f68afd1f83dd3f161ae5f20abd29139e7ab952af8d06298672279865d9cda68bb32ff33104d295b0d1e6d4a2aa81e159bcc876c36c0946365e67d745ddf6f80bec35f6625ed8f120dab2901b239d06d72c99cc9d60fcd59072f6d56123c2db5e1101d00864d00b369ac2619dc196669f1f5f642f967c90a0729bf455a5b03b64fb7f67a88b2c3f221ac7a59099f87ababfbc9546219fc14e7297ea4cbab48ea6224f744068b342cb65d0f858d2395d2b10d783e648a41ad67223519760dd5ee8946901ba53b22ff43270ceb9900b9a9c41b6396e9031827172c4a13a310a542769ff37de967d5618756f5f709f717a1d806d3767842f6eb772de4e25fd22a1c1689088c176bcb6dc9b903f35118e5c7800155e07ef79e2cc72dcecd645b41bc47fb183103895cc92f90ffce30dd452515a6e21ef7f2bf12854739aba274c52a3a37ecc76aceaaaa67447cbe03622cfb4d1388f273ca7803c72c05a0c1f95d4794fc7b440e7d9155f2d9fbcea93e75b61d55a9af5755a4ecf72df7625b289ba7b27a70978ad52270a5df35c06d77725a74eaf9370469dc5e566a12458fa9c5eb6260cadf94e4ac2d0668ee58a013ec66f239a9851c5742fd372f466e7ad8e2df72e491b4ed5b6cec4c1b98d7075f3fbafae893b7d298c33bb72c9fa8311edae73d6fb837b3edd4f6691178475bb3a33532ccb4c0b64c095cc725d6efb89414cb559785336aa7db3ba88e0c15a23f27aa7835c0f1f2f6d47351a82f842e3b22b6b8471c6ebd2ce45836cfe869a9f308e79ad48bff32c99a3d872ae1c91786a8e8205ff801f5accc5673053d48f6df46d2cd9fd4691bbca279d727e63c8a64d89029c080265b1d09d636852ace09a5b7f56c604f80a1724f2b0519456b71e3fe192bb19a149e3278c854d64ac2848f19a5a9587b073f1b5a545126131cffc9e87d2bef3a9ba1ad071ea56b1600e71a4f2837d7197eae212f09d5f8eabca5ee574d6243c186a4b5d9e14800fd6b7e74a766b897846a0fa164e452491829a19b49e586c08b224ac51c4dc78259f80c0e1227fa22ccc0724057398729a8b4af17e7c6f58cee9eb9475dd75d85b2e10d817bc21be4dcca83defb2b22ece33026b5e6eb9832ff19f05b6aadd9194ae1e2918f99cf214c489251d8fdb72b12138e4574fce4559c00aecaea77393a86aab54326714e1d9ad60a77125c572f6cb05ef53e4a0659633ed48757f782686889784e77d77ae87de3050f47fa472ce2d5b4f3f91c952546492234d9ba489a4e0f5ebb6b8344a8e346af6d8f9e9720af28e4ffa6c53145cb570a20e08741b569a1b1848098c3947737140955c2d72ae2ec0bab6dd8b9109f57a006afc5a1f7177ee63baa2be4091cc85b4f402fc58ee4d7b6545fddce8d9e947584673c5b4db6769a4e594ec7d3efb12dd7c156872c19874cfdc4c0fc55c777ebf32f6cb2b5ab8298bb906445037009bc22566547208447c44af9761aca8aed5484ad443924e46ff081c816f5854c5d20f11fedb7250b49935e38b50ce12db03bf0eca496f54665c4794ea3f4cb5e321b9d74be37279f4d8f8e8012ee533a9d8492311b40b61be10ab1a2023a23804d3dc51fda872044788d24129b06415bd551954f9b83ba6efa7958416f263a6ba770632927672ef9717cb7ea1bbc3fbd6d624867d1a2cc5e9e1a054c7e69876d51188f350a043dd371f13e1b315e22903fdfb3d80c16809683503f626be691ad85cbe4a283c723b03c0dadf9da4d112025c0fa48b8e2f73c5b0ea9434e5fa78b30bb84066747296716658235ee9d11bf0026fbc802c957fc92d5d073e922ee9a9e90297e253598f4c8275a58dbc0bd727d6815d3c92db7d5b6ff566f415a555b4ce8d56f0895efdca7507e555ffeaa996695f53afb1ddbc41f6994a0923b340cdb47da9b6c272725b40cd92d84e28af744808927671bfac7639edb7ebb70f2b9394b5850dd472b9650ab4f37c47800cfc5dab8339b6c6b27bc50bba470702577bffa3e184aa72c03741130ea14173c1334e632f8c5a0969249121eea421627767a86356b26e72f958a4c43964b5e3b191631829addc5b3e8c37404d8bb92653821de1b9b1c04caa72c47ea2fcde002ce1c6c1c9910f32f71ebf6552c90848dd764ccc8ad191722ffe0d667198f201e41a502b2b73c7fed89dd033444661f7c51f05c29133802f2118013ed3b0119fb1658d32cf927cdefb4f9f23288f7e9c1a4a1d407a14f53f4c63d0481f4f6629855d08125941ce8f20d1c26bbbed8b09782a694dfc2c6c7222b22d05e0aa1f23d1533994db99fff55f581329585f7d8cfb61b79a986a6e7239bc3405d765dd3d3c3f25c6c14f198e499c138cf7cfa85498b19c2428651a7277848d4dc9b588049133ad825ebb6abd84cdf045f3a3bba2000d1607bfde2072d0ac0610373dda9ea78eb755eca239d48cf0207428d94041fd35596169c2773c9350bbd11b3a4a709d31f1420e9c38ffc8a949c404bfe22b2411012bd50b7272163cbba397291cdd4c472a67804795807a93df009600553e7889ce0bdb522c0460cdf125c90b5c12134c4012368fe27fc55d9c7c7960a6534e7d96aa93d034350881aaf51653bb227e22e2ffe4485d0917910e2460ee2e6a86e106ce12b12c65d9fbc313d956b382c610c24cb5bc444b4d6bb5766ad132235955e83dea3b8e722da8e9efc0e5e249649b267bfc572a23e93f424862222fc72b4aa1c21c27a01abd70566de1426263e4d2c5d9d2233d4d75d32986bd9a139916be27194a98ea4480dc3d90413545070d67326456ea3b7a811a83bf1dc9da43803122959015a049424b2beac782d78de9bfec39cdfae9c46601f0a600a8f690b198535c03b6835b74b61fb425947ae4bdeb2d31fe84b0d2153cff8b0393b7f0194e0192bd300f2c4752ba7daf6bdea1282bfadcf0f9075886684154852ee4cde7d1a36ad0e2b372d4af3fabbd96738efcc60b2b09e976dfcf02c623c9de848e1db1b0321de98672ff954b2f501c97dc7b917654c89226e72202eef6cae7860069839da959b69f43b602a26eb90df3a2ebbec0f3d4b65c216fb99b08246d7ce1679bb084fc9b1a7270e46d936eaf98507934f09fc0405b9f49ff6b4fc04c5bdebf1812f75d132309c6c95e3018bbd81c9fbf84e56a35506c51b747af490dd9a84708282c85395a66204504291b319d0a468f78f87306c231a7e4adfae824cb9dd1c5c6049b2787728c0451f7a701a7bf02eabf5582bb752659d8b17ab47ea76e9e5a8d8378e88847b2f699391c417a2497fa9376acad677a24ec1742b03705403618fff333ded572bc0fdcd3660a4ccda7e076e2bc4da31dafb7bbc228f4a32665010f32202960121ca4af76191579128b39c487ed9a55e0f6e953e49d497b7062e0e855e35eba5f834ac5139af119412f5d70f81cbc285eaa6e9ad2d3c2ca28a5023b94ae1b911d0c5c9be8e5d907fabc0e7db00b0c722cc882b627cd4805b01598b814d1144572800486d9e8d4873d8ab8f06d7c0b3eb3b113cfc4024e3841c9326a220ec57c727e0a5a2e4608aaea045ac658c9ca34203b1ba6f1a907e71723d609c174c4e3400ee2b5df1f24ae426519b0cab68ec7ba3738b323984fa990ccafda395f0e957275d90d83ac6c67328ea4117dd826f8d732f5841c62b396e1fbf66e9f6d627d189f6337315b987814450e35c52c649b6e3bfc2e300646ecb1d60b0c6d293a166390e106e90e58298fb13574c3cdc3085d476c798308fd5786634985d1317f9872fa1b863408612a8ba523b289455796802f451596147350b71a72d0f098b4067213a4c21b598cb9225bab9360ee3a080d1e1c6b74ba0c9a9702de9a234116da4383ee02ae8378f02add9572babfbc10db5da06ca394e94258c89190d8f3248e1092b9683a3a37d48d18b839630294f01f5dcbb62eb4eace220013042f1bb08a41b523a45cacad166eed72b3f65e5ac755b9df87229b04921f84f0560109e66e7036feadce1ff8b8bc301855b6a7490f99ac4c75c1fefd6a2d4f364561a7ee187257ff1d936dc73ed7d9e2252a8ec3a197ee5467c9ad8ffc142588231c0e893f027e556dbf02d9690c97201d210c40dc9cddf3129b2ed7855b65fc85dfe043747207a27367f72bbf26dd3c958e08d25afc3c374e4cf813da39982fda82bb027872e8ecc2875326fefdfefa1011f9ba2ac2f06df78b3216aecd150f5a2820dde95b7ed7c374a5ec28269d0366690667dda0250ec18118cf93e2b12dc4f6a67907720c87af1d760345d42d1b508fd7e7023daaaa50d690e8a5b95ccd0367581a18721ef4c62b98d5ef73d6db02c25642fafe23bddb951dabc2d50d0ec1409456f072128d625126713e0cd20c0e9eb1c4ffc56ae42bab37c138290c16caaba20c6c727d4f24ec06b6a78699b0b2f42c06f66eb2c4558138c751538e3034e8995279727b43aa8a2e5efb3cd167697b39735bf981b3dfe404321e7666234276fd1dd9723aaf283f7912972e0cf72c92373d1adf1608224316a0395cf6ca6aa78639c33aef8e9f3480f7c372fec7e9693cba5a3e81fae2acadd819093471b396e19e93004c64cc680e6edc508c0ad2e1c5c406e80f4e5a4b3a62a35e1be0eb32b083f41c147495a838878dcfaeca6dac5800bcd6f7e7454b472253b23b79195d6a1106176aa22e0a6392f22f15cb245623dc15efff3120a017d83f39e6de2b2b483cb852e3f15ca774887f61d563096f218a7285c0699427de7e99e497272d0fd585d872dce9eb09fff5d2415e60174a9e161de70dc5abaa9fe5f08a6d5ce072b1dd0c7286b1f2f9a66a784a9ee185662d44be4df7887269fad906c3615e15db6d4b5e22cf3a401107b948a676d1f235a923562d77706f61ba2b7d3b4beea19a5c0fb81b6dad94b3cd59a9f53c32a9f95e2a16591b843bc65ae77037795c235cdd35a91adfa7b446018963b2b42972ccfbb56c9dc1b3608df27d854a0b6114f6ba302e727756cd731bc25f180fcf1368437f3caad20f3ca951d240cdb340bcdd67700e725adc32bef268a78df7dcf6c5d140ad1df23d29cabb11131a82e2c0c900500f727b0872971be9910c13e0fd015c2d5dd45e1150b79a3cbcd9e61d15ed8d81335a629504546d8b99d29e0bc8bd55fa7f829a528c50ebc0097edb797723a2b17272cd6bc584b73ff608df0a53f22c4406c86fcfbde063e14d28df4ff2c01ba3141037d0ddc2981f44fce576247c007c3ad2f1d9328e10b2f24a0e5c5941faa35372ca3177de71858c1a7adade1b6ea40eb305292fc1acf4d68984257b8662a79972445c9953995e8342554c599454d8d454e7be8c4f21e1c7a2c5baccf918be4572b7fa914c3e66c0033ff474d4698ecf4a2dc19e5967433b84f97bb35aa03d8e7282179ade802a6d775e4494a4bbe11f4272bc65dd0df6446b7bc4dc11c14da572d1fe5e35aca40e542d4e7882bcd11942ff2b367a7f568c585e5cccc021b8c91c4138f045437f5fa9d0d5c895ad8b613b874c22fddda9ad46acbb55c8e10c6f5c69971fd980cf9adcdb1e8c0fc5727ba41a65cd22d5f47f34429beec9a9de9b4cbe3435911f09d200a62d9fc43e103696db79b98be22fd2e194e90b2d18570672319ef9fe3aaa8b705b7ae3fecdfe1402aef868bc2be7577c0350d638a4c10f1163ac63b1ce3d33e6fec17dbc7fbb45d70ca3222b785d8318f62132aaee8fb972d5c0ac153b3e367dd7415dbb4d5924b995d229c7621da2866b029e52cf009c729e7ecbca81f6a6909676dfa0199d89a93dab47e03356711e722f729af5d15c11a3fea86e86d4f678d9d011b857bd20bbc95456cfb0635e0cc3511566e839a46dc96492d4b7a61d76d9af9c2c7480937544517f5ca40ec39604b77640fe843c2647483611e2d68c39f6e581e161ff39eda65ea7e42562dba49ce857b8098d2072d9446199f533a61554d81ec164df1dba2645a9af3da70e4efa2b212ea630280355d896540debd46cf37769bb58c5228a230c6fbeef8eb4c43134bb746550494ec138563d013a7c407307ee476ac49339271f258260137c4ece56b2f82cac4e7293cdfddf64a462fc37cb9523c8bdf8beb386dc5fd82d835d39c8df89070e3536befb5b8517770baa324320996ac5262db50faeb619980cee14c80bc27ffcd6729f97bf906604fd2cd1db41aa7b0338d1248c310eebcb7ac6df69aa65542b7610fc0b17c58a0cf36a9758f5f83a4e079fc057172c7990f659e6be59b3806b9e3e46ecfa7af334feac9612f6ba208d3214f8cce129100cb5330198d03527c3616cd7db535af9fca207988218674fd2ad6549128c1da931ddf6da400f21d6f687010394fcfbfdf0219cf9d221bc768ae273c1cde79dfc02dba3342ed2a3dc76986ae7d2fef9a554707d973a8f848580f07e46cd97f993578a3ddac1300f3533835251d9fae2eda2118315ffa0a100c5f93ff506e29a6f6f57c48befb1cbfdfa68728090f75918d72ea9b08cb6ac123361d86b7a0e6b1c593193b4ff6cc5d7b69d72e77656d4aa3dc4762ed7831b0684b2f6a30dc4298eeb4e187009d6b12bc228727c7578d861095f858609583497b45909f06133c7e4bb67ca307a7311f95f6072e6e71546e690865b71de317a0e2014112477df9e382947fbfa0c46898a2a6a722d8e451c65afb93df4570f1f56d5326138772e80c12cdd8b9ec72c56825efe72070bebbc0e4dca2df9a024d0c6c1f8932a8e9cfc9ff650f9555991c685eab408d49377e5201cd11e85c5395edec9954e2fe907950b3202f651dcaf929da53a46703a24a29adbe61f63fc813bdebf654ffaa459cba7f4740c717b21f99bbbbb13fb2e883232c573ffcd5f35de39038c6bacb5cc119d5d3d895e708d133745e7723c1006d5a2de3c84261a33c60594284ee21c2d55fc5653a465393961b7b76556e0251f4ad3eca31461938f2c74316e8bac3a0c170392aaf64f24e93c5083bd722aea050d8200f8912efd9b5b013f715b44b70a8423dcd808b6d6dc18a7f7f32deb65afa45469800839998d18d2da963c1ffd71515f3fcec52e94308e815fc0723f0197322513cac8db2d4f4eddd531022a279a72145f6555462b94442eec66727ecf5c1f646d2cd705aa888850793b4139b611b03292ed7d65563e23016c9c7270b3bc4a486e8c8e7dae8050529162be099ddf8f92059b6d8ef23ad53e77594a82f940dea4cafc3c3ec948e1d61cf331daf31e4efec01d1069410b9daa40d072292284ed57be47f669a3dddca29a37cb3bb1b62ba9e630b1ff71b165670b046efd9faa12c6e9516ad67d0132fb53841c12642eb6cf63e79fb51e1ecebbf04e1858b57039fd01b61bb56bb1fb78a6a232c32c3e00b465dd7dcd4768f09cde554f807d78f0b9ede7bc4855c01095efc3d655488ce455aa1930212dee4d0dcb5972b498a6db92c632e3be011a3d73c3e2a2e46694bdaaca0a3ae2273a5f3ec6e037ff8c94ed61a0a8fc5f6cd6e17ca104274160df05513cc65cc755a34fbdcfa772c974b95914e307e537884c095eb680d2e8e6c435a47bd6728f0eddb556714a726c1b115da3a9ef91032d1853c079ee9a0e73922bfd14acbbb4e762157911237222c7e6be86cf0f470aa15b0e207a47eb517b1ef5bf22b3985088f1d7e00e3170c53fbe6615fc156fb5e51b7d5133a4838b01679fb7280954d8153b4d0a67293c5633b9d768160e77bb79ab5f90e4d203f63782388d7a7e0613fd80ae259ba272d739bccbbd3b655605f8cac338259045a98ceb7a9933ac8b7a183f0a5a5a7b7248943f46615d32f31fc797248300769a96493575844efd7b02ed58dfc98a7b72324c79ce53c7073c9e1c54d49ea2b1f9a5bc74f466a3dc5d90f805881a6e2772f4a96e1c7290c0b77607af4b6e766734e0c818d9e34e91956e19f8336ce44b72802505b0145820cef8b06f3ef5e2c0a744b8c2c4b27b13db1e8b27248caad272695d8cf660d9e67f0c702145dfeb447209bee7dc5c4b9703a2545cf3b4e4ea557a1ab9fa833e1a5ab0749c1fc382fd87c3e54f5baf0c0cfe6618c99aa1b63472564b32b45639407dd961c026e18239dc9446753b1570a80bfd50949e6275bb723065b99200e081859d6c565177ddb6e75b5d1d8ef8a957466e080e35f456f34b8a994c0f093637eca76a303f5def15ca82b0a13e53137e98555b7e45e0e19503e5c7de6148d97826b8a39d045fd4d0ef4bbbcc47f5d69b0e290c5c7b3afc977239003a6f4cbd779adfaf0453e4ed78eb1f701a1bf508e4ca8405317abec52872bff450ed7c49c081fcb686c05da2ad75a9b71b13cc2c8ddd1660ab7f9c6d3c140c3f08eb3954d6e2a0702a06c80938eb3eb1e865cb26a0c5a49e72075b1d035914bfd9adbd71c4079f82b8d45a776db11b5bc3d85ce85aab8cd39c5f5b2971727eec74d59240e3b42d0bd9c6f44b7fad2a9fe494c69f26a55f0368b8dba9c872eacdea674d1215b633b3daac0b3487db40ac8c52cd8c68dfc7dba36f945e430809954229ef740a5dc20bdda9b2ca3ff38e8d0721ba09c3520ede8539b4fedc712dd6da77b8e478bd2585b82e8b5ca633a30d186cad86111bd54f644374080772036705426cd7a1eef4f138ad87d2257b1c37951d79f11c1424b6a823ed92520d53855af43cc0b537968cae16164d7d82e367c77d2590aa82a0bb40b51e7c3072c6c493003bb216bfc8532ef2bf8abdd3c227dd1b3b67b8a931571a4e69ff7772453f84fe3337e75ea8939924e32c64f343e3c3bc4eefbea4b19207d9d048401a2ec10b9433a5a466b13b6a59d6bf3f6fcbdc7660777640ec6437c75d16dceb16c147920504da58c529b142ef5787a4ef4351a46570a8c5ab3ffbd3882d2928246b061ddf4309d6d7691626726f5b8949dd5dc9325e2ef42920fcbc7b11e069726fb6616f5a1c9d761f1cdbdbc06b7eae7b6aa81a12208872de7ee10ed4e65a72f5b4a21932027538ee0ca43cadae83b79fd22f4beff5fd861fff8f9c99961272a12c2bf9ba0561b75b0cdb615f5dcd517395a1495bd8680f678da8c8d509d272c95f0a166218f411d0779fc253c66634563edb0d129843c6ef53d0f582a0566237249782dc01f2d9e4f3eb239e5c318104fcabbeef264fdd6b0e62c862759b2dcadaea174ef5119bce5ec92a334f93da8abd22cdadc2c23e3179a285f6b300082d3c9fafa5f82538d41960a63fe108f1512953f97a5cf57b99827d8840637672b4a72dc44e124a2eed8ea638b776f8fe64125fbefc77b9bf59b25410e0b16f72f66d4633917977b6a83e3cb6f98d447210906c2dd4968e3873c3bf9a75544b269695dddd7544047c88a995e33c49d3883768f9d489084308ff5b3102a506dc729322618a1d8daf0c690e6d1fd62bba321a8f027d554d4616fc9f1cf5e2bdff59e2d2305c502eb1e865b329925eb30ea5cfd5d082e2ca58b8932125432767f167e557edd913f568f298a54c93da0964a6747eacfef4ed557eeb6f2b49091a07724e897ae8c39c64797289ebc1adb37b0ef472f5ca110722b1b6c4b41b0fa63f7226f35b1250137213da89280ea780b65cd3634b9e611e12e10b46e7424fea0b7259f2177c0e8f14f019c71f07b685267f8d60b78be8ede13b8fa3e6c1fb927e717c9c667b5ce7a8520024e1f9a7d09d459eadfcefaad419f868d430a16ada987213c4e2b490d726506f439bfad56a60d763a08cf6291200bb3da4c525f18940725f00b0806d049c2e86735f1f2bc3382e7e36f4b6e186ddca4c59a3cab44707724c04159196839e9c93f194f6b4bc79236eee3276664919cfecde59fbc95d4d7214de1c25089ab002881f5aec257a91fe18821f5a27e15db5ad001da56fe9e40e4d61ce048ed3270e491c44302fa4483b9ea473089fe2557f9dd47ac00993e54e052fb054190621a9664d2e4dc2cb3e2f01945c5f539d4879c175541952bf0172d46a0006982662abf6a370f425224747b0906fa6f3b782b343d48358ed033672f17ef6d45cd15a5fa47591b8c16e095b578d723fc83ec9371615969cc6d37104435f46c5c8b09b08cea4dbf431f8e200d6b0a88c7244f3dc03e1f4c92e084b721bd6e11aa8c2f9c4c1fbc7260a529721017a35717b79cae7a4ecb6a9fac3212abfdd5d6a46ec713cfce4293fa816c87f9fb0aef87562e17af978c36a5698415f6e820862c9fbbc4be1a652decaac513d5f347b95fdefd36ab1ee1fd56c21373697ab76d41d89f938841912a335a5fa5f9beaf32c8cf2980132b7e9b05c838e72f2d4f5aff71e5bf2560a2abf53f1eced79ba36ec7594931335e20b1879b60a48129de5dc121d577bce58ede0d828d112b72d217e29534619545adff6fbebcd60e3ef0bd155f9ece9999b8f727cb3d8e11d23b269099b050676c1de5119f714725b6fba2c0f4f2b0b336413c06ce4f252295f487ce8fae25676c86347355a7d50c3cccb812add48b59dda55c8178bcdb9871ffdeb3c0dbce8a21c3675febe302379d8827788b002157efc2aab7b2976884b4ffe4cb9ba04e6fc1fa1842e617a72b8c64ee82726111c62fa442f8f4573825db40eb44c17385fd111de2a6d83374503da764563ac27f0a21dd314d6733aee22ad21e61fd2d06833db296a82225872b9edde524c1e6a78131379239bba6802c9621e93e1b01fdd5aa9bb49700f3d723b616b90200f536883792232075f1641165d73732c8432b96371caf5447f5272543a9c4c4152af4db17d9a2552fdf0155f4b1ce90555fc972a90ac20e15d7351faa72bc4bcf0dbae8b4a12ec4fedb9810d1212f0668e6557f3f0ef824317197261433da74c747c724ed45675908866b21ede40a26755426bc0da276c0a3ff2723edc336bb861ad1611211eb092e957a9505f98ee7f4304d10beaf91f854ac00be64d9e5f23691362cf8e09fc79d0b9c3760f8a4ebe9fbb3506802e3b93e4e2179f75547efba5c61a0e048ccdcaeb2b3d54a65ddfe1223669456ee33115f26c7220ee64bc47a346d0440201aefa9af5c439f4d94264dd3c72dbc71d418fabbc72b52950b0a9d7f704f0efb0b444623138623a0761238d2fa63bd5532080cd8172f7d1e6dc00867ed3a31ab6aac38b953f06d4b2ad8b8d4e581d93594f21fb687227975e0690d22d5d1fb4d1cb16d33046d50c55c6f50e2e3e204639e5344c8c72828c3ce4067ac73c83edb61573b8e42bd4baf0e316463e8881da4eec5196010c9c0d5dfe54fae1cca167025b62ccbe5d0f69e8f1a93d19f0b48862ea7b9965728ea0054f24d426223f3560d778a493bc49a20054455966e68cc67ce44faee8720d9cb3695993af069824d9fe5b989b25f74e6ed913b82996a4bd069bcbf5ce7236f6a4985cac3620381b7c4d239ba6c1ab1828cd1c4f400ba4db7a5a25474f726c120ab86455390e689fe3a3dcb4c24b3f4200eed6ce923bf2453de17f230d000cb328b18ed58d92f27b2fd24426ca19ef86e7a303cbdf30ae2c6c55e1a884729903df7ce0a9df710d268684208ae940697397563043b05bbeea29022556e96a4a2b8c7cffcf29941fa245de8369fa78d8c18c715ee4876ce44651e862f93842c719aa8c54d30e3297906594d1832044d39a4b2f0e3ceb13c3fdcca492db3972c2957b6511ed8280837a1843aed492fdbf25f9eab5ad8d7b895e8352da88fa0e44da9371b216773706ed8e357e5c9cb2b91878864114fcfb2292f747650f247248f00de53fbe5b540e20bfb15448259ebd7b4f5cf3ce8156ad01afdb376ee9720b6df116458f88f1375d917cce38761ca284d792a0be505660f9d7f66a499f72f62df0678fbbb9f35b86d3814ae3d4be786b7bbda9ef623ca8e6634c309c14724c171259149f452930ec7a2a78eafa64f24d98ba09d911a6ffeb58e61be95f563ce3bec88ca93f8b87515d3ef795716d2687b15af157e47c907e8fd82feb0272c213c729bfe63847f4b810760ebc59a7f1e445284b748b9d5a65d35664023d725b49bd78f31049673a89e4c8902b8d67a47341aa6e0904558b9bad69d045ed6b090bd1f694c538ab4083a7a01428bdf9ffb02a177b89ac454b95e928bfabee72d995a4ea331298e3fc7d27cab57ff632722064fbac901e2eaabc65042958324eb88c023b1d92f431453c126a275b24f5f87c262dbf315f96a5fc3ba4cea08372dc167e66b26511dcee2c1b03c2fa7a28cd43bf547dd54b14891ee6fc98db517203604b3cf6ac41d2716e00c1890220aea7d7987d2bf09c49f400464410921005651412420c813fceec1492b159f2b7f6101fd9f99cf43f25c30621ef8e75e072c96b337c5450abac715c09c9b17802b37673d37f8c0b398128f79e463aff3f729d47390f777fc3af50039deb5689342b59144cacadbdb1f3c12b9eb3e2554264d53c33ddf64e1684a5f6bc181386f837dd4c9475135e6d121a5f3c31fcbbb52bf38a3dc3eef262677723dfbd7a7d6b44abb5df861ca830038e165a3d0235544ac28dd2840fa4189f31305063220e65358b0f17ee93d07e32888a5bae1c134864af4ea72dd9efd560b9b5c120dfd048288886be69f9c2ff9c8d9820b229b64322cbcd468e61fdc10a39e3dcbcfce41c64adf42d8ad900ca979f4bb5dd8e526872dc87166107f06061a0ead1e1a7f999e45d44bf126d889e8490c2cd2eb37b9e72caedda7f27300f9e59976549dc71fe5495d458c00ef5386b09217084020a8372d40b8531020a65e0632e69497dc1d31d743ab65acf0d4232f424131cac2b55726ac5beb96c0f5eaa9967df3bd08563f69423bbf04b7aa9af9235b6433444477204e741048addf63c4ecff8705a912e27eae99892b63d250347fa70e00cfe9837edc9e875d2417afd092e93030912821a70d67b49b9e77d29aba8651cde4a50721685007f8ea41c5bd441d95f3e8808ad889e1924ca867260eef077917eb896242d175ea16082836ea1879474d0ab84117185a07613775f333021bceb5892d8630f1a247c158c7c09cbd51f9bbe0296226f7b020a1384269306c7bb1416e4010f8e91244d891389c61b8fbc57c1b931c54fbf9ff40909698e7b5d040b46037172b3ee5a21d17ebfff75c07ba084cf02463d762c4f9a3bcef9f59109566734e5720d68460c7ed72711decc44143c6de7863b073cb1e44a7950ab4729eb6b3dd3727d27ef3709801597aa9edfbc88e55b323773be8b96b565c516adff6907bdd45c6f0354c200ffa340e2107a7d8335d4c71af51c960d1c2c45e9c2f36ea4fd08728d7d9393aab13cdd610dc5072d825a3e186ae42c964bb8e4a50cd29de7e04772e4f6f3ca5263ecf9efd0a97bcf859693b29eea2bf8985341e3ce7a6917a24a72d688ab1fc7c18c5d87d5bdc39361ee53d24e7c53f72faee30b33ee4661f42238e127007109359f7f798c04ae588c957955ae31337472324765187ff383fb591e17cc504fadc0341bc0e102944dc9c3cf5fec022ae33f4390a4ed38a8eb6a09681e9b2680b7e31da7b907a67fd6e2d24fd1b7ba8f1427ff156831dd84ff039d729242b149b7fd045e4f7169a79fc3f33f76f810e03d32fb71770a356b94ded16333e31d1c76a30864f7cf92ac583acf384053d51fe909538f631bbb29e9ce32726efabbc1383ccb857a0db0b458f2ac92a26bb2713814c6a13af3f8f6a37c2a720bede1cc43e95f201dbdce41481d960c2b5aefafc087c6cfadad4c274d1aee20e0ff65c722ca586563708830a6c072751381eaf02ee5441658aac913e736ca7210f4c7e2e73933822049237434b8f1d248c705fb0ec7465e016ba28040105f7235d50a60c9889e7e94c7e6d0ead3a4a7621068108a3964e209edc6ce1e69181be98888dd7e8a3699b62da86b632ff124ca0f290a9cd1e2d64dee177537671351169676f6c6013b37b464b5502c957f7ca16481cdce0674cbcaed19c8aaebae164b1ba5b5e3516665bba0867c1635295287d295108592ecd2946226a075ec49433d528d2aea6e38f8752f7ec438dd5d93839fb0f22a4562194ce0a84c4b0b6b13870f18188c0738f7f5da627f6550197484ec16197c7227161ad3a64be577e82f17740ae3890a29f73428ce8fdc3fb9f6975e1a321e416226f3f08f56fd42787267e74b7e6117714ea1319ff60211659dbe578f02393065b97d2971899acc6c252ae0196b3c4cd96e958a8044ee8e146141d15fac64672a8435e15bc34211ba72ac7f77bd0ab71abbf1af21c6aa9078ca3719f4b4cea80cd31df51d080b2a1772911de18a3e3b6c0b8fc6cb791a905ba79a37c98ef82061f2b2b2c2992245fd7272396681f27a06c7d382b32bd42c216ba6bc84bf3959841b031228afddf50372b5d99315a94a8e201ed6d1b5d50bc6d72cd6b2d9623b397c267b7188d337204815f753ad3b57ccb03239da00a42869b369159c0c8591d52c7e7c6d208cfea972b69b8444e8078e4e96f4832d2e9c349680bf7cf1aacb691dffe4c1307a380f7210a6d16ed3a88616e3897dcd72b36e22a0d9a90d25251e217f367a1bb327ab72f6f5651a08b7d585b2a12ca65b014078209cee0950e60cd195208124b0e59e4683a92c286efd4deea76d52510fed1e7bbc53583d5bc3f99af9719c538ca796723a49f6714ac2d1f976a800ce9f8ccfafbb9ef032aa9a551a4b2c74f594907627ff6085a4cc7211ed1f48ad769911f17adb511d083c4edbdcd523ffcbba37425bb6fb66c618248b72e9dea6325db51fff9c0aebbca5c1d3d26133fefd4e79201ad0093785eed3d0a098c4099821762cbdea089d44401f5557f6df92297189c172a46a62764e82fffc0a7e4f2d315d6e2f2ed2b0047c155cf55adab5ad3ab07d72fda8a45c826cc6297afef387bdeca2fb9a1610230548e774b0494c257b39c372af49e9ff3043f92220183da68b253145861d5e20e31d8b5967f1a84b28861c4d8812a75cebf70a5584319194ac721b69d91bbd49b065caff3ea3838c4f2f5e728a6b4789088dc327738713717e717b86329875849a3e88db09b3fb83921eb772d162e537e4e37e6a06b0ea9a7271734eed7753d34575b9837bf18b2701caa90a25747b5770bd23a9d19722cf4c85a54bc16249b19a6dfe3f6c05d6d4a6e78a44475f3c57a1104afe24c9d942e0aed0d22e05a1946379db3810264a3a09dea472cecd330a357b934c211f2e750727520bfd7606bc6090e8e098a768c212b8331ba9a3c6a896a19e42cee35f4bb2937554400b8dd695004814b769064bc4b51e72eaedb1aa6ae23c8e4a5e1dd9137b822326abbaf4642cc2c1d1c3f4b8ebd7f348c738a7894acea280ee050b11090927a9b86a325698ef7d476fd6c39a69edeb72846ea71395d3740df85ffcf23b37c52332e6ed06003535f608634a07abd34272667dcc60d80dbc9b68eb20e1e58fd173c6a26c7a7d6c8d03e8795e19b4a316726db310533752a1755928ccd46877d196f4463d668b4325901f4697bb14894a72b7cb4eb1ce739ab128505910655f3ad65800552ea2ae7c2b7be3607efa77fb1e1de4f246d882fafc17a0742a1c26512d6ad51fafb5c216a4eaf6088966e49a184eb53c2ee517d171033f8cd7396a4445e5e4224e34894c5325252ba274a6247205090684a0087349360fb2df62552b23c3cf47925fdb15440bbb9c4266ef9372ebb716ba8eba21b59e9f1ae70a7ccc2068ec6a0bb94a0d773476596f878e2f72f8d82b48d0f1d8263414c025cba4b1099ef6d6290322c52d169a2becb516684a846b268375f1d759f372ae74503d17a8a5df56ce5feb0230c6d3e24d3dd66f720ee5824e2db5d1de435ee15d6b5d7f1fc50b112af55291d0a7122836d155c05a7496418442efa320bd6f75011a17217eb08ad6cb1e66b1f2460b80bab1844372d7be2a66cfeba31b4f9b9eccbbbb691d6c30933ef3d21346ed9fb993d715610202bbacc155076f7016e7c02a098bed82428e697a59e3d02ff91a7a6b4a17977274932d489f97a6fb93e07709ada3ea65058fb4ee89adba867d2274221894087273c1f7b4182ad9c0dd4ab8d65b87ad16cd6ecd124dbc73f070562b2708246772e884193c4dc68d88181d8baf9f55ce758a3dafc33258a2ec4fe741901007cd7275097331757547e2e48db09b74221205d527131e7786db5ae55491f0cee206674b4a0c63f2b8705ffd975e9b0015d97aab81e0cab94c35956936c3315533f702cb70a28a400aac92276e4049b3a5bba0d325df48ebd33c052520d856741fd0728c2815798b12a030c166fc1d20c85f7707bf104483a34f61e4f8355293f28072387c86d8404a9ff75f126c6e4372f0843be565822f50e3e304b953b5adb5c272f204ae224024102394f912e32ca31b8e041343e0476dceab283c775f383dbd043a3781f91b6616941456122c999f3fe1e69f9419815eadc5a83bb7a84580b97283767afcb61fec5d9aa33e8bc2a3da9854ff9d49a96360a2c3bcb480a6e622721aa71b1983a9f42b7ecd3930f5e05acfde780fce57e471759a4aff81b952203258c834aee0400b39c3a14fd66ca97d9f6ad6c52a0f3b476846f60871e09f200d22051f336e0ce16e929df1bd7156a74d8250e87a69ba9c7612c9af3451f71b31433c02a26dfb7007dbbed8b5776967b7d788f4dac0e3787dad5e759dfd0d2a7253cbd2dcd98fdf9bd06a2e8187af8ad492a66c9c629c8b3ebbc9ef39454ffd72a1b9eb5bc83b7180e91c87f0eddfdafee3919cbc6b1e489677c701e775e65972755b3f6c492c8f4493391c973b9092b24d2e97ded9139cfd319ebd722fcca8722a82fd7bfebb67125ef9acb7673244a4a509a64b40a39bb7e223b1efaedebb729b22dfb2d92cc3493a54c4bca42e7da69243969b4f745bc63d608524277f78724797cd8fe3bd310624b3cf355eb8de6bbdfd51b68ae3bafab7cf1f7b6b5bfd72c4924e7a077ab078ce69867e326fd6c7dc713c226b657d71bfd32128289919545dacea2f8c38eabef9ca72b0392529c52416b6560b6fb67e10b0c072f15c3a578da837576198259f19151a6cf505a0bd86de9842e94125d94046bfcaee28e2721922105aa4c53ec71660bea721a49f54ba3fb3d3ed274ded19a080b8f3b0aa72825981a1aa50ca2b3e90d8dc6cc304d93721a80789b3a5c26187b7847084740aa303ca5aae65c1af02d44a8e2d7d71ea29cacc8be8a39cd02940a9faaf3f023232b958343efa63cfad042896cb595d3e3bb8be5b8df660e2af78f44137e40c0885749edfdd8acdb498f1ec897aafadbf91a14af2687040160931d86dbabd2472d49f41529241eea0156c3ff04cc748c95469eb983f513205b9028e2b421e545a658b4a5ce33b5781dae02dfd660d04e392eeb8961a56fd36c397c1c5cf55ee721326af91b151516baedf9e376fbd42fc66d0d5caaeabb57bec2d3f1861c14372a9ac49e832af7f2823a392ac692c9afc3c864918a30e09165bcd87bf72685772d9638c10e2b0c5c14d6dec276744deb10b0bafa38664ba24d0881f1f5acc4472a5412775b931cc295601c94fcb0db8280707d0cc1b8098629349e11fab099400ce4d88d19fb84ed79e4f7abd5058253ab416fe4547eaf065e9a3295ded6e5b282e1ccd2066a36bbcb093f8399940f79428fe53d0f6be904b5ff8b8c36e8f1772e8f2f0f9b1f8ed1a16134f0fce7bc63e969166513ca962ba16b23bca6489675c614fc84a73df4f4e5a9bf00dd515cf250987cdfd1313c144ef9ae47e6af05743374c7e1eb28dbba8650909b4584e4af4cf9bbeb86d120b3abd992c4eae884359a3975f45ebdb413a4d76cb019c8774a121216f1ba16731b6583190f002a4b972b97d029fb54f13dadafcb305adfa37f776e80bfb43f348cf8529b6f332fc5867798aa31e8d3d822aa06e284904b581d5968018efe08c23fd7bcd9c2aa1def77259b2aab4ac700352fae2c65e8d336c8541fd7b436758673cfeec729c4c2b0172d4e4bbf785214823f52485950554cf7b9ee00ca63820e42a87fdf827138e6c47673e4f2a00404078e9485f406723a4cc6f8f4eccd2aded3894bd1c6a15635c72a3ece203c3efc2ffca8d7d2ef40b82f812298799bf8b9757569014f5e7791569cdc21ec1f792ed2d80d12cf533692c14541d5de48edecd6c9014e1b0d23778506dab9e266b416a577dc3709b3afefd70d220d360a821477ed6bc6742fe17042c5cdf818ec78b95e46c77f4555304e60911e9770cd69605d09f91796d5c187272fba34be5968f561dcd7ef693df0e14660da2ad755a20ae4ea4fc086b3a387372c38c965dd1c6ccf760759604f73b3edc0abfccc511c11b1d76193c6473fe05728cb52c29af6aa6cadc17234bd346a2a52ba3517e12fca7bba737ff5fab8c6472725c92f8e2733126d2242524726519e5595d66c9e78b02c433b2bd3ff5140f72b4520c21284c282e8082f24d6ba251447c72a94dcdfa3294be4e05c337e3b05ad3be542fadc4bdef42afdf0870ec68b35b534bc2996150eb450cf18b85fb68723206a122c7dcc4777dcc2a54d46733f71d6cd2ab6a5632c8feffead2dc28c110fea0e95ae04f79b95cce8ac6f32b26c14826107db14139e906c517b353f9000071b21879e2753d6c3233a3ffc264e65c03f8d19b0e81bb6ae554474c5d9735729c76b1a48b5e767f26070aac6ad05f0366c5866835dd37a69ac251d305ab893f85330bb69e46bfc6af9287900b9a52cfd939d1683aaeb58e459a30e4542ab23566aa90bd3ec007a3aa684c023ca817cbd37fcebe0b72f8af4a65f059ab57500799e4ef1cf7d1003d529213183173f21b5b5abfe9fd1f7aa03a47aeea1bf9da72ac701303b15a86c707fec8824513d6631567a620788d4fb34996e54923f4051cdc7f0b7956e43f41386378d46d36b30987f563dce608e51ac7cdde9d6e541f59a948215ac1c027b9f0165691c8a68d22ea509401b4abd0f2d40bed8e9a4895263045d5531191ac309e2d196d7a54a77a650374d39650b91e020b329c077d6038320af9dd40aa875fca697249aa77852bdc7a192e87f898fab54c01244d0cc4726de31647e18a3caeaf0c9d272e11d97ee4dc9bf6efec3172a28b7f631f753972d55fd6f5de091137da537e484ac7fe1812506d5815026a16bfa29d797db28b729859c256d8ea05939d5661964d0d4df628810e0b82680c380ac90225951c3c7123ff747cf72dbff26b9243c1d493d1724d18cb2f79d0e030bd6f84a2c45da9725112098b9cef703d14b0e379107784971dccbd9de295bae314be83ec10e121726d969843a94a6fe9ec874233aefcbb7cb8073cef4d51ca43df5d66ddb6573e7262b3717db6aa1b947ec418dc6974f347340a9f0ff57d86e1146d365553b310727a8755d7134ab2ef2fcdc31e0ea776afd24b944d863fb338721368a64f0b7672fa3f5c23752b60b7acd414866a2f8a23bdc44071a1a0d2f2491f4b9b6d7f243cf69d53bf43018dca6331338bbf29e066b9d92c1486c64a62574cc43f0954365a0393ea3847d740f35f913518914c7e60c59e10b32e3695af8ea245907fa79d72a50250720558b7ba66be187e4a710df05970b7c7a3d424cf016bb6884fa478726449395ad3eda164adaab51fa3daced07ccb6506c216ae89be327345da189a570004cd7136c02fbad9dff827baa0ca9ecea8462c1199ff666f8cbb4ccd9aa272fc9ef11e826243ca69296bb6483355d3916d77f9c578a31b9bd3946145a49607d39cfabea8c7f50b5a4a1f8fbff911ea3ae396813bf7fb71d97d81313821d772f01c3c45d0ef2891562113e331f58f56c309d8a2759f84b2d94c0e3fb7663303e25433ecd12d73ba95ead74e2e00b860c5fa3967663d83d22b28becc1b6e084085f51c36479e4dd0f61237c7363869cf9d4fa6c56a516add840a8c9dd697ec30a7d5f808fc61baddbbbe1d18d39d30afa403158b57939859e5fee7dd5e9acf6b42fd62bbc35249ebd68fbd3be6b21193cb7d1945d70aa67e507a3a8c0afe0572c66e7344555355e143f538eca9b1a38961c05a77e8fce2bcf7818923d67f876ffaf1e3545f857a7f3de6174a96f6c01f5de9d7e04f09566dae789b65a74eca72f1d14be6dc34fcc503d04cfa070b315e62b95d08ca7190550ee0d9986134486fb0396752810dccd613a52f793b7bcef4af24ebf1ccc70231c2c075bf6758fb729b4c0116370a272b60f845089f70ad3dc0feb4edac325560957d5fe8209269720ea922b27ea0ed1710cebac100bab053a5479a213b37eb5ae410ef655404fd4163b6c4cbdff7ffbbc2f4171e787959b007e2c3261156ac93d6575fcbe16a6469ef23ad9500dc5c9ec4b37f22d2f05f6b839688006fa56c86c46a8daee9cc3172535637d4980bf3eb5accdf13ddcf5e0d33efe49acde626709ec51642d380bc14a83ca4f4743dfb4466f27be8c1264863d81817f20271f2240a012445e255b5721349be7c0547f9bea87f06a3bdc1f0becfec498ce425b8b6d15470ccfe8002724a2405d807ed72914fa72ccbe2027327e966099607419148b65651f4aee40848eb21ee30deccde7c068ce7c5586e4d674ad7626a7808bb7db4d29b45a2cd957286e8d6d2456775d854d4c55eedcfa9f5686b53e100258495319b18fc66119f72f1607643d42ad6dd179dddd15e92ab11563e1e34002dc43a3b5a03d324f4044a523b040ac870128c71dbf2ee24c62403dbde08265f3ba9a530610ab9f1d50d249c55a620aa62e82fec0e723f7aecba0ebf40245a4154600a0b483c27f252d34adf3982278870461d243931f55b748ed1f2e3e32bca5867e503f91f4d60142d01927c8a889ccc22af37a8ad5dabab2688aed42a5d8bdca0c8e5a8e41eea88eb72a5e0f1c89f06e10533aa4ad6eb7ae94c614eb7d6efb580f6378a0690a8fb200874f96966abb6782d018469daceb7a462cb3aa74dc1375501428b585bfd625172b21a03cf0a00a376f33b48e871e92ac648763c83bcdb0dee4134142d87684a303032c69fdc7b50b913bb361d5dc8539fa0eddf77fc932a6f792d5e1dc8a2df72a80d9a5cf49b722966230a5f226f948f542c7186b4bd8f434b5fd92683c6df72cac6decf163d3a304d4df6b0b45e176ebab2f9d7a9bbfab3c36505a185bf1a240e50af7e414266788f17688e1d7f22cb9842041a69e1e9700bfd4420787884720b73953b0b83319ce45d20b1597c9f0b3e514ba4f6d8601a06f201e94474a60bef2edd71abc9ff8e086aff3f6285a6f95061f6d1612a263c0812e77b00cbe9276985bdb09c0f12845600cd48e1d3691b9d52b9d932ac987a9a90c88ae3440b2332395a781fce27f5f3e0b13af32410895bdd7f5e4827b5f1cf858e49904c87728bed336be5c8d50b8021290612d05c862773e1ab7b977eda2995f8dbba5a0e72ee12d68f3fcb717dc0b70b8553b7b2a3ea2b1f2439a87ea1d4ba06b223d0b87220b7f70ebfd2ce2a191af7c07a4c8d20d6cb4515faafa350e4516593e416eb33217055552613477b0c1c1f855af8a1859241ac864c1da3f9f88911ddc637942936fa4410288abfc866daba2d3f1ae0ef5202405aa3a63a2de4011c00f81822613c3f2461afd4864b6c6c7736c73879a16a99b3ac53d4765e803dfa9ae3edd3129ceaa20626b2f667b96eccc4a220addb829ccc24f7161b56a6e9609056c2f772f0e0b7bbf34f3a3da91d1c417d0b696c8be1063b3bd393711b02d6653885f34a423200370c34e99f4705ee92543b60d8f4690c463f4a9747e790663844aebd33e0531fcb99138dd358cd785249cecbfb57d84c272f72cf0620554dd4f9fe9a72360fb2f690bfb1e00ecfde8e36caf518abbb3a36dfc2d38a06e255f02f5274702a8b48ebd31a9f667575e650afff2b9ea823ba53990988f966ddb8710f5ee072926115d9ae8695abcbd7273f61a9e1aeb09b82efa0fe62d68350dc1224b7164c96066a82eb062454a79815f46a5125b3ee90ca92214f6c7e71860c5dfe07b872d2d067a6d07de7f6bea90ba8290250c6bdbc1df16aff34e0a38b0cf26fe767728c487c819ecd7646e6d07188aeb218be6357196a165b1dbeb7281f76aaef1f07d630f1a5a0d6b3be45d0e465e6127b9e9bfedd4511e559a4f1c33db95333c672984cf9a3addff6875f8f7d15804ffe673b6f6981cb29299d06a971e6b8301136497cd6e286313505a73d2beef0a6a22699f79189f9a73e968f8b2e560e087326972afc019226658b0684af0063b7d74b402884bd0907fcf2e3921b9f65bffb7266dfde62b83f5b57de827c7030cce65fb06c2d509445a172fa44a4ba74503d70691f17a99af2512ec57c2391c26f73a42e8f42316d469a09b1e73c1d4c7f6372e6e36e8f422092796ec81cc2698afc5d061579d4038919e786c6406d76f26460d72464acaedffe7a6691c123581ff9d58fb864bf582b0943b3ced6842a1b3a72b8c79a66906f457810de16426af17c89557a04d9587e01d06a15e3e8973a0972da9794f2902a35f632ed379fe3af0690ef6a7558d0b7c2016ccb93898711b272d18a15b7c51d231ba55e3c38d0ee285194848a5da7051cc621ce359400886172beaed25a61c807cb9c28f301f8ed1e6593d78f8806d89146536ae7fd7e6ac50648e34311811c0ff9deef533558f4c6c860a5e74ec3b96ca20d83cb293d1e426481e02662623e1f18715f4ae82c7a0aefa444876d914f6a59039f6508522e6f38b58cd15d6931009485bf4c76622ed084c4aec7f39811fee3212b44f940848272fed3faed65eae4191e27fa75fa85498c159d2eef6de423fef933d0ae0027a7729ff6f8978e1b7249e6ae4f57e03f22cdfd3f16f34638a30aecbcfbe2d6140872d6466880cc45fb4d0290bb46dab9dc7db3ec2535f4a57391d8640cfb5164b57285ee94b0c787b92b8260f3e4eca1bc0a43c5bdc18b179b46bc4e053a4c6aed6bb66e8ac9f2da4c71f20cf864fe8647863a9179a5d4b2002f6601b19645fa5e5fb88fe141873d76665a193a3556f370599e760b3684ac4723eb7d15a50715814f98d10072cf21d555d3ea021adf4f9ae9f4ffb622cc799e8ce620cef71504f95754d003fe3c76551b4a3ccef42435823b3a478e5c7f04aeb989fb9b39a55a1e721044267498d81decf715590457b83216bec906b8cce9cf2e94f9fe4e39964e720ea99237e4d9579e2da0e676be72723ccfba250cb90735d4def6f4f00e41d172a9d861ada74494a252a30405eb8be9241e7fc5db6c2c71c667d116aaecada932c7e3778ad012b9a8a42ee38f3726e2af47f0add85a6b912587a2fc296c96a572b01e2217a502522d58835e45d70d1a19c0037cdf26d0278a71047f9eeb6df35cf78b0274bbf9f991c7146cb4a7363db1d6a4cff77b9c968e4d98fc99d8e6591eb3117fa09b22ed766d1c01c37768fbb9db3a3bac17e57fd90480d1b764d7aa72061ad1139001babe5928f23f64c2d180409f0792bcb745c171e55c9d4d018c729c5de96ba7096a90959d3fb4ccd5b08306de35c5e21f608cd6d26b4d756dd44533cabc9fb2d690d6232109da12fb3d212605446ea759844605d64901d450f27234b3128b2b6e606f80375f7975fd22a97f9b29f173a43e30d2ed93c84ece0d2ec9afc6ae9eafa479feb7a6e90ce09795552b4657d5438160608b60a8667aeb72db11585ab254fd78a538617f3668e05626a19cdd8f3ebb642b412f0f5a70540d454232c9af8bac674d7649458747a244143b374d4e416d7f78f48fbb30a0826ee2d63ef8e3cb7115540eabbcb48c9c10b0ee83d6349d2626330f8ab632417a7220ce0144cca882813a848db18951c9a013d7618117113d0f9bc53ee57536cc720f927652bda96c6d8ac0563dc20b4cff20fe8bf48ac176da7fadb68e59b467724f47ebdf146c3ba7fcb0425748fbe07a9f67609f83cfd70838a8fd2e306d5920f0752c1f06bd56f3bfc5dcbaded92acfe2ba227e9517d07ea2ae0ca6b0ace341ec1448d09cc60695e732bbe508160740493220b9dbe4f3a3e4047a169da34372b9be0cc7671283047458f63f69cc687a945f1b7e576ab0dff5f029c49b7aa4721feaf8a94fb0dc5fd14457eab0f29e8171b80d552603e25a086a93f766228a7222cd5985368b35f08e7824ffa3160435ccdd51a462214583a2949332f859620a90b6d1970d074b49822c00e151d1a25fb9fc345300318cd605cd1ccf3bb40e727f82ff2bc2f3864f9e01661715daa9ca89bf665ee81d1c6a36801bfa20fad90a29683549bb8df523b198fac93c6ce2eb220fb973f558a135e63cdddd49554b72dffb55ef1907b8e31b3a16f1eb84c3e6aad9d92d428586584aea09af1704d252ad3c7e4d56b2737da1dc559c4ede5c9ab8a8378562efeb59c794befea3767c11d706fafdf6098f9e142f6971de98bebe5f9116ee960fefc3ec9345c867e6127289a890f8f3f3db859cfee78c41cd4365b1cf964da25c1426204cd86682db9970c95db60af1fdbd0ee19210a6bf52e06d3a5dd4c4a5aa3b449fc3fa41e635ba3b53d0fc1f286cc5172dccb75f5753838176929985a995578a4e92a8814ccac472781f66b122628938f1febfd186466da5ecee77427e60e606b4bcff53bd987c67e611dde3bcc25b566471588e8c4004686f731dad19104867f4c786c5efa5b672dc46389e9615eab4a3cd705dafae69ada9e2f86e056fc19d43c2efb258231a72077d6a737ee59a8652185083c4fc9dd0abd2e890fbc8228d10735edc0079df5b7b89bce6e5cb171533d5d345d939f38ff4a11d559079b203e33dc1f683717c723a6a382723ec0ebc3ece0ca83e54e30622fd9a779c02a4f9cdf0ab41376d2424ce85e4a04c4afb6060c108a66ca419a6dce1d98da71134ec7edd452e6f3b6b72cf703c56dcfb67a651491a5cc33d63a4b6ca1c38c70b2272b64a1e0332582905ba1b386e42fe4f7b4842415ba74d2d404a7977f00e929e4aac21a0afc1fb9072d7ff9ff694e3f594fbab1807f6073dcafe5e78484ebd803444eae728d2568a72e61056bf406fa303a2d8ce8fe04716a58a5ff403ed08c4013921401584f19f720fd33a84a544cb828ded753fa7c9ccd644833da1173bd15d6ab1b66e563452728ad0e45ee9b724fafb54d00b7642b5fcb84bea527a49bb98581782301e609472f13de09fdca5a0fd7f27c8e3c1447896337ae99ff158063b364e69ef72eaaf4803105277075a012cfdd41f0ad609b5ce3a81271b8b257f3f84d4585d017c7b1e3d2ac8534cd3218a4d40aa745f1ff5e2ddf84df9d53b664a174b32989498057086fa446b62e36fbc55d678b688616852da523f8e89d90fc0d9dbfc2331951563a97addc474775416ad1ea8422fae688a5d4eab8314d8566697e47935ab9add726d5e432b6a214b44734c695e2b83e09ef70d633de4a8393f6fded0f715b29972f4d38c1a92a443b60fee5de90e2587d644e46b2d7798ce714b1b5bbc84d2ac00cf3a59cc07c1a9986f3f59cf7602a69c999f65fa2fd1eba3c19e21cfa555b3115097e8de1ac6a6b055dd172707788b750223a4f96a20886a05b20657b140b6668e9c77f3940c7ac99aa1433a2868c5d90270be97286fb849340c42a0760cef1aafa50bbd3bf63042226e1e8b36aef2fd6b721ff45dc3d493aafb9d01e5e7a3103a07cf98b5fa345e9cde22afe0cc37f75f25acde6215d312e693c6d724711212d70385ac2dda7deb90291681b86664947816ca78c8953b938bda108dd35a037295a42b60e28c8cb1a232d53b2844b7df2f6e2bd9c0deb06d97855787fe5e624aa5f96ab7d0112d8c1f2ed6d3eb771c7411745b6a3a7daa3f8316d0e7eb18881dfdac531ab708c958e0e835c01c88169ffd930d4eec73974ea24339f0a3f59d72f1db89d96ff8b11ff83d00141bd5bf1be66b770764bb2ca047dc58744e45fa7234beb916da2127a189e1ad0bb4290de76d4fca43f256d085f0fa4f356e649d473ed4ad61133771474c1a4cb65e5bd61c78cfb774b895997fed41c49ed1f813727839c3df5b85b885fa74b07bc49b75b0fd084b902dbcb3ef6e71a8065d57ed720f01a9b76ed18075df0226d0f021e3224f2582b032c573817e8bdcb64212c6720c3254a444b0b37bedc7ea0fc23f9aee8e728517203e4c34302e0236342b3e51047e2fe81ea797d3112f9aff57648ef148a5cb2968ca18b6120b156751bc70726e6f6abd0bedb3436b14863ba4a54418dc6ae27625ef53177eec647ee1d8fa72f4e8dc703ca598733a35381cd09e183c90c4295c37fa9af331a8fd466cdc5572f84e175b0de2787075e22458e8cb8d8af804c79e30064809282a94b9b8440a30576d9172f6734b29c69207c9afe124d75a28f5b6e235d1ccb36c553867cba40be3691cf5616c24e80258c2923354d4c620959fbc5c51442e2369e4e298d6d77276531500a0c3fe9095c0f792b57307345494b36232c7e2a65d857b9ef5d0cd72bbdd9a48df3b35c6f2986c56aad7b22e683c0b140bdb9b9b16c888960be2dc72714857ece5fa5cc32ca326031ee99e82bf04185319c639c6f485aebc8eec222e2be178ef41ed1d3a6ce38466d4bb8dde7cf137d95e1168fe0a178b48d4a27472da8dd6536fd82c17584200aa2191c9606a49fa8890ef28352e449c385879b372dd89b03e4e8ac9e9342c330631151a76f54bdc5b9d6932093fb0106f4439956511f3dbc04d428bb25fffda3174c424fac55c5c470947be15399c80eb2b8b573c760a1d99340073017c3e8944029b9a74dfaf8953dd720f84e52a2d9cdb8ef572e819071449567cf2c00349abb91fd7b50e01f78e82ad6a0265ab1ea78b5f8b723db545bb6a81c035f9c39ea514b9ad202402e3158d0a9482b9d71cdb9fedc8720285deb94de77351f4dcec4f19cf534b8ad9546005494a7ebf52ff3607da0c7226c9f54d67aa52631e51fdcae017d4ede19929ed6ba38635c876c31a4c9516724e613af080508f02c49d36397f64f8072b0f0a1edbfa78ebf303f88e2b1dc57242bdca65f18d54197eb080aa7526773f36b848dcdaa004d8ac3e91d23c02db72b9b5bc20b9a86a646083c2bcc606cc15fbffddfe9acaeae1657bab6b488fd672daa4ddc3ee3f39d964f44b666b5dcf7a707dab63e6ece4e6680bba502da1db14b10569eabc9293504d9ece9aca1721890ddf2649c3ade5f71fd14bb63cbe1872925c3b0667c010e8a3e624dd959b78655a53804c361c44dcc206166a5057c50fa328afebd9017ae0468c51e7ab89a786a49de65e0037051133f992dd5b19ad079f47f5fb80b5a2025477583d97d0a88c5024b5f19b298c73103ffd8a44359b722bec5923a73942559f10649cda5282e7f8aa980ae6cad79fc8f02a22dade8e7209ad2f07cd0967c5ea94680631c19c15b5c3faefd549e94348da60906c85f7720be0abd7bbeae25dc2dca4aebc640c7f9a86fa5448a0c2053fce1b34842e7c728eb8a0b369d2038587b093d9669386cf69a9e06bd78b2e722bc94c9e0e180e723d5dc500a85ef098788b24bd06a3a0111c981db7bf81242b40100f5d2c0b9a721809b41bcfa3c67f9a5cc6f842a07adbde9a3f37c3e365d3a3ede84cb7e856729cedc60dfbd967d4e243ea90921f1dd76bb4cbb54a5056b170e4179147511472e703a52ed96134f2de802c6d2e452c801e41b0be652e179e9f991a3238c2de72022b8b5b48e615f2b29e91fb3c55f90f55f81be24cecef14116c743c36bd781856370c6786dc04ae0e48f24c0ed2f0f51221da9c1056e6aa8580de42fec236670e996261164b784ddee02b97671743f849c8434b24298d50969c741414827c091eb1b478d59e14235077f04dd05304a958e1866ea9884bc979b15ab479b4b472c1ee13003f3d45db2e6742274b7fc9076fa02e64bb91dd0ce4c85a18a6db0072097c7f6f706b9f76c818211ee43fe4908db66345d9059d168bd3a71098a1a24733fa713393b9ffbb39d833bfbfeeec372476d287ec7e7f8f16bcc0c2b10b3172d0c1207d4c420f1bb851f3af6825682352344f9588f65c167d9d105607da8c72152b291e8e8d783060b414b43c5746879ba708e8d98a90b355b12f6e32b37300f9955e19258d5ea1cae05d24f6b019062f067a2482e598e7494d08381a23ed726d70bf4fbbc85e3ea56e909b5181a57705fb6fb98c3b956672e146889fff90190197363808878bb3fe16839c6bf7d9388a9590ae6a575dece6d84cba13677d727431fb70eb3c22e44be6b9648d9d3ff8c24a9aafff304ec016efcc46f124a07218c2a42a28ffe2525e41423de8e93d52ed0cf13f6aa1c4383658153ed070157258c3ac89ce01f9e7ca487c8d0bb633aac9e91bde6abf05a678ece89d41823f7229f573951b037d762cd6a34c5e47f87649a3fed670e88a076bb888735468fa7243fb994e17800e978627f141f36bc1519608c15babf422d158a77efbd54af430e67cb5b36a47d096d1af7add8cf711bcdf001904250f4047441220a0bbb6e37298998f1aa71deb166a7924081dc78bd1cf6312ba176d58f00634c8d9f09d83721ac5406d2273e38bd382ad29a53c5b1aaf8c7323d1771d8d98adc0b34663be72e622df3fab7ab7a9156bf6c77ee5e0993f4b777ca19ebafb247ea8b6ea7cfb72e481b2bccf8c522916b9aae7c9cc60f57a8e84689647bf7362d792bebaa89072708b84cb34ab8fb93128d943ef11a05e2daa6e8eacbbc14515e04baa87b5cf5496afa9b4b664bfbd56d3e080743cfa393eedddc0e7711bb15ebb0e9adb8d157296beb6c993b3bd11a5c157372de09d4c9acedd49d24f6a6015c4f0d808d7ea7207e51ed73f681ca2c15a6dce8458bb620b98afc7629fa2153477a819ca3cf9240dd2b5021f8c8e2b80e3564521cb7ded300b30dfee032758888f7e5e623a0b7270f8fc5d736f6bc996559e892dbb261223f87fad18550cf896e417f70302e87259cfc4d6a3b18f421986eeab5badf4fa9fb35477ea3d5f1e58d43d2f9b84c47246c9fdbda29590edaa55ef3077b4053184a262b43633aab3f053b67bdb88b8720af06cef4ad7ff1cc4650c55d735ebdbf1d73e7ca06c16fc39488ead574140725f0676eff98d6eb23d9dec598ab8ab0c2784b398e7f5afad50f85a4e407e8b72861c41d97009785f609b869ce342245dabc9314a99dfc3d64fcae4b17e8f7c4c1a429d18b715fd3a54cc960a2c83a0040ffbae9f90d0283790d6986d4c725b72587880776339948eefed4a3702c04cde1735d465331061f93747cefaf633410a7c42ac450da89dc10191fd55b6388123b705302ba7b558cd9e7abbb44bbc61424c37bd93708ead7b9a7fb73c0d552f2e1ce0ee43cf6fc5580e69f3b22f5df5729807eee17736264f94d91692448b65f2ca0ac8e1b76077550b46bda245e11e5c087203351caed6a4858316241f21294bb4e3815e9cf8e61e73ed2f703c2844392a5bea91eea5a50b7b68901aad3a67e813f28e13dfa34d1a3b19ebf009688b7264295aa43e30ed1894baade055edc49a346a1932ddf95ff9a324b4a2658b2372a8bb951b1469151e34b45143a9bb35e4e7ed87b2f73045ab91f77a2bb3ba0372df303b44fad6aa33d32471e4df3fbfe0c71020ee4c22cf786c9a107a6f2728216173ed4d77a1c00a7a46c8f138a31bdedd3785165b37288aada7d68bc7282d3a279c6f7037097dd1ef4959a54300a828fde0d743234d4de5a072e6ed5695b0726080eca1a96efc19e8fb014924267b9f79f446125f2c5c317ab1916dc874944f5b0597fd1534bb9d1d891eb7ef817bd5f600501cdb89fe93439662246633613e57807c4addb04404b6b1f3bc70c003c6ec4bfc0d147dd5482791bf98b0eae0721749bd50bdc51434dc8ab61f52301a08d3bfe2198260a130a97110408edcf01975b1c9f5f77a26617791e3f4748154df8e496613ac131d40871bd792f4489b28d403950d8d09ae3da144628a868a3e46fee76c07186f1bb8b3eb73e63f9b192b8e59d112a7efcf70f3dffb0e704d4448db69b632681026492355521441b9037225cfaa4a72c0f695cfec127a29ee70439b080bc41e186eab4b3cdacc0003d5055dcdf5c437bdc8dc05655e669d2e8b1ac5a68a88c2d8f7260a793d0de4c8167273261ed12484c60b58d085cbcdc6ae69e48fc21ada41f8bd4367140bf7430f29c2cc3d6ecc105b6418ff199ee275ba9deb1522ff60c7f6214b92383d3983a8729f80f81c7e73f33c215528a139529a5165cf2c5a810204d108b837519121347254c9f06b2d57892cf55cf4360cce3379643c69924046e67150c3ae52522f0e7210a4de8772955a2ab662daf757522be228d3485285fa1c117e53daccf7129521301df18283c51f9eb71236eadc644a4332cc1a1658ef70b33ef450d2d26e4b72c5eba4b078122dd98d29f7a79bc4657ccba7ab7446524f8987a4c4be4f22081030f2254edc64c0da6d8eb2c6a46f11696b58e67f459ac783f34f8e2ed9d60800000e59884838311140cd5d87345f7e2888963100a6a8062dbd905bc20425bd729879fd1b478fb5078c09436fb58f2352394763a0c8c491f72e13d439986a1b721ce8d1137c9f2a9244868648ed4320ed6dffd87f192bc0f44f6939b87d4411723e8d7bba03291f574ed47952459b46645ba79f91b36879c48387bdfc4a757f727158e611f81955d3d5bfc606fd0c73dd3b3d14afe2e7b5376587f7c9dca0d4726116c333d74fed07891a4a8be732fae890e321fb3d5b8feb003f01c1af95c85004c46b428e75a4d70edef27009b2114c8c8a4e5bc76814e11f6a7c361df7cf72ae501878ea911bb49211e21edb2eca756e4e3c3490ca9dc5e061068f3c77d7244d002d1c0b641db9bd776bdef0ae8b3e6216c233f1bc73eb1368d57b542ead1289aed033477ed32b5ec7c49b8024b401e088d938da4793cff45640d755652747848583276179c65ce5c8e4a7f3ad33d59195923cc551c3e259a62e0fe5985872e9193113e0af4e40b1749f2d2463a1a1be45b9d2ef6584f15a65a04055016a72347e17c9b143a479ab3a24c8cb1cf8d18827868647d2edd56dd818b279db6372546a28a297ee785bc9166753a2ed49273967c311082c9bf3ed5c822db05a3a72c6d5f88076e3e4b18d994b892a503369448a41578a03beecdf9418b65b31ab727cd0eca7d0f4d7482772f7deda12e4faf1fea704b377e4563d08594936fd90717f899cddc58a711eb8d32d6c48c65370ff5ff9f197b71bce2aa14de3077b63729e5794af85b035587c06bfcb30162a29a2c223a3af5afc642a47688592e1e172802f10fdcdb88cdf3467b8c22ec0fb31b055d8b2e032e84b5c43d38f297724034dbe4ada4169a4a3d0999af190abe59074107387cab9e78edcd6b49c46bb1a7219a00c7e69358a10c8dbd1d072fe660ca9aa746f9c641265a7283a71b39f8512430a10bbffd69ef59669c1ad59b77926e44814179472ab45c243d4f1193a2c727a70e4e812aea8827b5d27c900792cf105ebb37daded67d6552941d2854d022dd132e18c2230d5c8975b54a9bf41dd80fe3d53e263376fb9d8e1fb6d7b8f0a4e93555fe1dceb7c488321784d81360021db699a2d52abe32bdc1bdde62e1c7c72ddef9ba10a8fbe8a53c79051d5857ce6ce5d17d8d8a667dd8db90fe79df10b7204cf94c3c979f7532e4b855c9bc871582409471e4f9ff2d478fa9dc81248942a144b5ca82e7b8920be3a4fbf827bc71c72791d6364d2ad348716d7a932847a4cc00a46c787fc2100eefe7fb356bec6192bf48f233615588f4ba87a14c5e6f972d89bd0660976c9e12751fef52f957e0be4acd30a2c69d023209a8c339046296c37e2b5ac61cd45509bf58f28842e04c7fab403eff825df9253efbf043abe5b13e406f29aa9c051ed7f555fa0fd5ce0fabe5b5b67501fd681ec127366794afe424114fd8394b97e8a8a2af2232412ebbc4ba33d6775268164ba2fff35d420847233bddea7f771f4ded168432db5b4c2a39142afe296e908e19f436b66a7e99947e3d1409c0420b27894de8605afe7e03e8d3e30fadcbb09755777c617c323ed727784185344bb0f5169e9e2cb756c5ed28d8fdd1024595609a9422f26cb29cd72bc5e2f3f9d6ce0223ff197c3921e08bcf2855d8041d0a8bb92a77ced4812dd3af2d055aa59b6a10095c582f54f4d1c9da4eb58c0b55766244318bf6008229b164060c7647ea033255c14a21b88d0f85ef971d4c9bdcc01dca111887431e27d728c01af17792cacddad60390eb8500e151c83b443e333e1d0025139ada979784ac7ffc875bc9db826d48c30ad59c8adaa42ebeb2ed09a7393937e23503e5aaf72584ba204d4a8ceda62b550dece91f31097e345f19ce2fe7ddc5902cfbe718b151df49a8422d001f0044fd60fbd6babd656dec62c0ef9f0c1656b4426fa1c1b7228c1ac1b28d7b8da361db759c2fc6dad27f6f7c52f7c48083624efec8b915044d77330f0c744fcb24159674b9bb1bd13d43b3e1fbd28076a9f15e0598d9127723d60dc6d14b0ff3765e07493d70e4905a03b42ce391a18f79f4a0ddbaabc753e58c82e6e723ac3ac5727f0fc66a911a577b496ae06aebac0e6f3f907f8fb56109c1600b3671dad1e90fe6636e6673a2b25e9bf84f8b0e2d08e02d471fafb07265d3c8a35b6ea634f6ddaf632d68605a110b9af05cd98337bb157275a0fd884721ee03336c982fe5df7466e92a93c52fcd4e4087102190c5ac86770a93c3c9d136b94ee85f9bb11d0543eb3f7e2f2d66748d5245c41ae82a17df743c82bbe8e72e9e46c65d8c5c4493d0e6932f9fbb74401e585e629c8aac38c2ef31f23a1194f38afcbb675b2335556d298ab0c17fe862498e5882343d967f8593f4bb62d1872cf6dc67910677f247d66552bc2cec8c9ce4328ec8273dec3fa24a8a81168bf434b1399d68d96bc953404e6cffb2444a9f5a179a85601604ac9ec6108f2946872f20f4c1a350fa1acd790b3c0c60caf05b3c27cd30b7c27a9bea0012a18fb9b727422e9772fa9afd373e3957b554426658635479c3bea194fb5c2e8790ad7d572f5edca3a34e7f0efa0901c4cbe26c1f1a29b44a22f2068f0b8c54c9396a5fb4230f7e9648421aa922abf8a3949378cf78866dcaddefedafa3aaffbad6c119427d67b3a4afd817f779f168834cd2c9d63ecf0f3dca48ad052035dd8588b277218fba785355ce6eb222eed18e77fb820998e18212b429f23ec37eec71a58e5c34929b4ace6590cc6ed46f6d04099a8131e8fdb32d2f203b26953c0cd69ba39a7729134792d9fa550a98aaa0d6bcf035a860f503c08600accb2fc70d9c75d3d1d2ae24405dddfbc984248292a5c6c49ca2b195c4a485ee0137042bc33a47162dd7257e332bf60f9a20d445213a745bfa9212a79fcb0561414b144ba814320596c568afc3ce4266a1cecf368d383f546dc334b347a70271f44685e79b4616c13b77254887b12ef72cbe02e764398600833043ca7377dfb8f660c088f43794f34633557f0729d5f04645ba7cfa6f4545a0d818054b58256d01bc097d702feeb0f7170ed58cfbae10630565f222812d96559aec015cff882f203074fd0fc4d1683207265801838c797c3b338a68031178c1475b73e11776eece428d1b7591e0b4112216f93275f19e65a90e34e806304bcfb3305cbcab28ff27b1a873c1b652c618c72f994036d01c8c66b367110a1e4f70d2e1ded909f38e20ca982f1687e0ce6a67244d3995a152e694bc5d75017234aff9434cb746a9ee7dac7987d2fa05a802872fd81c7423f266f1a9f6ddde1274222655328d290c5b846a7431e39648a25aa72afe5896844982a152b37bae630f816187b38d4a096957da934a54a504d3784002e5cad54e18b1cf680e392f943c39ef8499ea5832ccc056e07e63707e0366768215c9653f8dd14688938de69b3296bc04bcc7a0071d665b53052b02c3c4eb4729178bf48aff9330ab549d5e529f486e00f1975b966720e7e7b36ab6d96c92b721212932e88e6626a166a668d8372f8a9342c3514478caf8f08b8cff3f2434d72ff2259afef4cb6d5e3474552b421fcd979db6194b4a5668b403fe0de528266699d89ee07fa644912655e9f73ffa1fae735ac05dfb24731aff8ec4245b12167727e9dd4365e0760c272b50e3a0bf4971167979c80290d2fbae1ed2b1c5be250727a464470432606588c098b61debc32228b86836d502fe2ff5f3ca0dc75209e72c995273d4a5fc0d8ec5a712c04fa976b26f99e567e893459cf5e033e5f5b73723d7bfdd20002d666a660c9354a35d6f7a8034853d49f04a83b5b9641a23d53020c9ca4ae8b359cc6e70353e81fb0f0ed4f2837196ac88fc5b51c88e35672457270194e71dcb18369f3d609155b3b84394cc94b1f0efe6b235bc26a97c53556723821baa73f4837457fc431f2f744c115402ea588504a7dffbd8997b911f82a617575795e94d16b7ce0dfb20f4af9ef28e3846cbcc2fd87ecd7b8cab35016b4725c1ebd2e31cf2d0326741c0c1468c1724b19afcd1fdf808cf978e9bf19453672ad802170e373636d5d038c26c5fda628dccb9ef8da6d31c5a69da40d23ae4f2f8e392e50f539639f06a9e92f7e3a60b840b2e347758a769b31b4d7c30d2b415d140952b0d040a63d8c32bb1977f461841508ac9874261c91064f9590050d29053aa58cdfed6d4a69984c94cc4012185b189e3c2ae946adfd17a093b30b402b72462c8453fda2d779418c56ed615b06b503ee2e305cb91929710b8473b5e091721d25820c19375941a4ea92237bb589776951f83a89d946acdff1aed02677fa72f4e4713924015cfd26c8b06fd62f1dc14fed0773c1ccdd51d53c7e662b968b592ab01cf72be04ebc64b2d768e512e1452af41194c0f65e8d0e84f904af6349727c70f4a05d959a985ce8ae836bd5d954ceaa61178df7d3f143233eeefb7fed0c0e3f1f0d3ecc32989bc3428ed78e6506934308b9d3be9610f20f9892704c48722a1fd7e3ed78225b95b6264cf910c1d8e7b3af54444662b42ef1cbe18412df4ddcbc90fd2e1d3663e2666c2f47d558278f6b2bcce0c81947e344ec11460bf1646ff0b83f21415ab2e4eb0b488770f776d13a2baf5916677b8da331d4aeebae72ae456100c8cf476614539c0f71603f294caae691364264e758ca350262bb1e72477e5fb158c62bd3878610656a430afd522693e90926d983d52667aa4b65e872661a9dc2efead0beebd23df040448f8be226f2d87bd2f77bdf854fb1f315f272dc687e7af2290d23be603eeac10d8f6c6d101adbcbd7170d22f0b0d735071c326d4dfaf7fb37327b51abae9fd5c726da493f141055a8ca5f3c4f4642a174665edb48903729e7fab3bd91d65922077289e8fa3a98263e86572edf20ada4997834d67e70cb78f0dc0bf41c350b13b93479b4443cb30d4ace769a95080c57b79a72bc2add9066dc267b02110ec162e3bd6538eb8bf2ea54386e2d0d3f607b9c2f7277c4ac2fdd91ae3951cfe35fea7574661e734b42da61a0d63f40c3f21ca23d529c5de91f41eca3a6ab5eff80530e654efd9c2ecf8d9c01caff58d889c3b24c7233c123c1466834bf2e30b4a46061281537749304c4fcdede0484028ac68520466fdf6cd42061a356bf074bef99ef56a2bc1292ad564bf3fa2a39d96364490972076ba1443bba46c99d3731789fcd9a40451b599f03a421f27c5cf6d38cc9db5b50b603cbcec20d522a43b43e626e5db81766e69798f612db7b06d481b47a45727cd0b57500b6c9ba613db6f08dccf9f367e0cf950f7afce9d18acde3eb69ed72ec158de3d79f5d9543a707dc72a4e1677308151e190f1f7c79eb135b02e9c22e778f69dfdd61c4785624c7d619a2f6012b8effbbfa0e5c7a9da1188fd1c19f23bc47e9448f02e3e081285945833388194eae85d33823e7e9bc5c9bd097f3d9724a68c3b360bc7e1419c507a6ef21b2fc221a1ff58c7b935a0f0d945f713cee722062ea482adb5ec5a58362c0f29b781582e5dc5a4f1ac7a37ea8ef8aff4cad330bd26a3d671e8317c7e983855a751fe770415bf80f842893b2d859e9e885421446702e19904600a1741ee50b99433dd3ed0e022c984736d8ef760c5083c0cd729b536eeb49f3f6cf5521eb7ed0dac97af4a770638c9502aa313a3d229ab79972c59e2c81376736e6fa311c0a62a35fb4f86008dff20bf70bd44fd95480555872aa9181d985e974508aba2118f3485b5557ef6b892b74d9f853630ec1e4db99729ac9a4f6af5118ab17af813bc35b4e9156cbcd69db1612a0ade66b9a419af33452ad8cdeeb324ae658733b4c8e47f3f356f944543e6a0067882223780d663e7216202665a161cdc07b934126b871731621a000e7ff2f203afe51c95878e8223f436624b536d3bafa64bb8a4c9648cf70ecbc0c241861b7a1c7dbc0d65dfa470028550fcf8368af38fd4dc710c19445c28c12b30df1dc43eabfdba09754b4857262ce8926c74ab5257fddc56928ab5bd7ba57d655109d3c2c462e123ea387cd72fe3d121cbb33b96e6279d295d0b01c0105321ac9524932f3cf7ca70d6826d6729571a15489c80ef4f1c13a1023fc306a4672550def25be6126cd3bd70bcc567206c4cca1c4767896ac37d16e16b3c2e80fee7e413389e998ee416fb6df220672d1d077b68d30b2fbdb164f89080da7079a585e603174cf32a31dbeea943bf972aa9e7acb4ef5c5235ab2cce8ad75ece7fb4bdd7c12bc31fd640b350007f78e7244df3041f3b495136d8dc0b61ebb1fb11ab0e1ace92257c32712843112a463727324b8e8b4d0af9e977bf6b2cc940f208967810acfb4c66e4f9dde90d8bc0a72278cdb1462a344a7059066efb347ad72237e594fb61a04984fdd2f5c1a821472e3f51ef1d0fe76801613fe1f32805364d80ae18f942ed2fde20e76a808a0fd616a669bb5eaac434e247ce811c9e65112796fa3763d85aae33fd98087fcf4c972f0dde48648e4ba21fab38995569d2a466372d36e6f8f95aa89a563d98e1b32587e105e22b96a36369185f2fe38cf4ae48879e73a06d34e0f3583166d193df0728829642871f0f1300994113367259020d31f63b83bdc95c69a3fef5011482e3db94b2f43346996b2aca4f05e1f44086582318545e21974a89b39abdb3032141da16b10306e2b7ad509a3841ec42ea92f5e6c66b6bcf6225f0ebd40b99b0ab4724bdb294eeb1fa426a1ca0660385b67633d28542987ba277c24648e21f2e78d68055f203eddcda7eb58f72b5451dc9faa502dfa55547a6c916ce73028214c50728a70bc032d8f47a5114ee5f28c20c326d2833b53244c8a6db728f0251f2eae72d18c037cb22e82becd0b812d45e0777fb71d8ecce0237025776131f12a989552b7a0ead0d1658fbe1da0c731d3d095684ef652aa562ce397d65bcabab8ad2572d3db902708864ee3e2b1247f4da308a08e377a7b9b5b5cc66ef1a7b79783f0728814738219a6be221a6d3c0282336de4ca40338db909ba069831f078cd9a91722230a357ea5426942b0983fea9052db9c980ead770278a995429aa77b251db23f232aded124292b52b90b6e2ebba89ba50325036ef55c6ca09f25d77422c9864047f392b68bf33b04f3131f3414be88ea9ac9049f32cc72f598a2e07297ce20d2c2a37340d38db761cf0222e18500939633871f82f5efd56ab1bd8c2fbac2f728686301f765bff331bf9898d4b10823aa4877bd5a5f248f9a3cb206002c28672839fa7272b2ed26038e250a869de7c94330b7cbe6b76cf03be4c8254c4b9ca72ff7d1fb34475dfe646a095a9ed48a5fbbc6b3e00ff8253d34b903e9804a12a726b71816ee53a545c5b3e3db2c4bd279bf87016709bb7eeab4777f1a586811d723c71800a1aa8cfc84990e6adf3b292019a0f53f32262b5dd4adfbbfc334c602def51ab42d26dafb3bc31358af51e2072363c25cc6d667cc75d509bd93aca992f490715611b9ce34e805eedfd64e1df3b490562e5b6e2519682bed9a1d23da2728a33595660fee44a4e871cc3702202063844b3993faecfe780efee72deec7749a406b995db71f2e6121eb4079ac4bff88b124d3573d7e14caddd831ac62a297289d3315fe9c8b28f01ab5e8bf37b9bece602935776597bfbccc268a0ad9815475a0a034b7197a0e732497bd8eace9704c786c8902f3446ec677d0dc526123063ef8e93df17a5b9a4397a415224116db4606c51ab15b1ccf737744d5f6d9a9c130ae5000bc5b1713f5bf71e2f20ffad7165e95097dce83ba7da6ecd967f79ed729d47a75b61e4a9f2a3a170986aabe8aafe9c3e24bad89412f0892c657f8c5a72c6eb731ecbb83f016a995f49ca3328b5ffda2089789a4db13e1a0ab8bd5f1908ab3c8b2c0b40e6e1a4b6e17c9ea9369696357e210400b88005c837395446311f83ff2db95162c9268881238a0ed2e11ca0aa8e6ca556888f235e08d3743bc3725e0be63c568c9e27d4d56b57c6752b8dea707255a492f50e2ac559a744531e673cce6e959447f447b4446c177d56c073efc3bf5a515c5c4ad5d999c838e60d728394b9f4a90a88854bd8eea02c49e86aad17b32c95311fa04e4bf0546a5b2b721672c71d1c0d44c77199a4c8f6231dcb2425fa7ddb37cc35fe07504487e5a272c1b4188f604c429c85f290ef0f42240096b6a3d3402d5002a1cc13c0f01d47721be6b0b4c6a8037cc6c1111508d5ea9aa2ca5164ca6983878751c97b4b7e9265fa2d823251d2c1deed327137fc7a7abe4b66cfc50936bc1c58f19c46d449d77218cdd9f9ba28f7e6f0a1e4779fee2545278fed14c0a24b471835c0c1e9750f721ac4a5d03563caf5db74f41fafb31e2eb0daa2f2208109155fc1e7d2804d3f36c17e94d7a118dff55ac1dad8d202435e5f1b758b434b117741b3150b768f1e727663113462f3fa44d9a1e7f114ee3cd4a8327d6214095034af35f816849d2d723cd29f851e16f9a7e93ff8731d39a9565d769fb6239c21daf4537c2b59d9a772357b6fede9a41b807e2a385b7416b8ad72c128b91a44f78345e762faeb8def40867de86c3fe17d813748405bdc19ff4cb8d87e9bfee77bad0c8fddad8742975d1d2752cd03e820b12e3655aa65b7b15922e15ac06cfec5febfe856cf6f9bd3669565d224b723cb45124b8d116d602412155cd9b69e4166871fc6b3733a5de6720ebe70f0e4d4f1d0fdb5cd2a70bec346a168bcd25754856c44764066ae552a60eba5a4c99ce6bd746c805656e47fe628f47b68723018d2cf5e6aab56beebc87266ffd1c432396f66d00eeea28447fe0a8fb9bf1d104fe2fabe85e8507e21cc72d454dadbacc8ce189a582b8a6ebb49cc51d9a3f9a7e25251f03dbf46b29f3f5ea5f7cdbd0b34495a763946b849f601b6cd9c6e3caaa6fff0399269388f9765725b916e7bf6ba72946e55a33bf93beb294b489cb76352e3c7fbf55d24f6348a72ccc3d44f662e859de57479b401703ae17ecfb759e99bf303b274f0502a304472e460c661fe307da614bbfd3bf227265992812d31ad6de0e3f5385fc5bbc98b54ffbe87d16d59ad5b01a397c9985e960c50f0662ffd52417270e934a03af68953c1cfb403f68286465b1363e3611a20475d5019f6ca2550c9be900f13b0dd5872f82093a782b6dd1229fcb27712c5f2acab2ab2f028e7cdc88c8854c25899a550632fef4a8ff1693261aa06bb3af9b8ed18742761f80550271eb5f394e5063e72466be377a51052c66066333a24d5353ddebc1b30109b15eb5f7fb05fcb883c7222f7c4794ce8686bcc3021a1062d53bdb90f8791320de7554c601af4671a2972296234c5eecf872e0ec70f236cf1adc3b6c8e8dc5659c0d7e4c5a8cf2ac73e14a29c1fc63512ffe83d59104dea62e2afba6243608ac1683062be76b98f14c3561b39a47ea80528523d556db362c44da3f50e839dcadd2aaedb4484f7f1573c7245a66d174520c278917f84d8eb8835badeb66d83d166854113667c1d7980c16450e724930765c45cec47120e5445d67a2cfb88e69ee51e9d171a708188bc897224bffe5eb1bcc4db737ce42d4cd3c8763efca82314583aefdccca4154e813e72043b652e31703f670b69ea597ddcf7118b62a98e863ebabbd0f7018e8f90477232b74925251da8a9e7f55cd8890f836e0e71b263c4e1defc258141307cb85f628a2b5cdfb512e332222dd8ca9cd54f5b73d7c0e63ea345fcfd5f462078549d72b554d066d56aba4b1b21bae5130e3c6359df483ec94b2757b0b02c8779eed16eb2147c3c264fe63f62da82649b9c703d6598407c1cde5c2b3e3ba54069514f2ca8257f32c0654135b7fc0c515c549036c90dd71f13c97233f4ecd79b6088987200bcd136c3711801d106e7c9ef7710eadd541186d646fed3c21b6952e866e55a400a5b24c160e6a698a266e02209a8c47c1283aaca9a34263d6d8aea1243ee721fcafd5c9ac0e6346d70bfeb0cc361399ec1ee58249f7c5173d9dbbf6ebfdd58ae761025919a9fe5649138dd15f6d21d0f6bddde3a7f00324ed8ee292ec62e72a72819dd3f513f9ea9eba667cdff4671188fd1fdb5dbeeb9b2940766ce440f0e3fbf09091bc806e6cc784976f8ed4907eb42e0ad4ed7028e59815f6a6c2d326d93d070890f6eca3e36dd0f2356460fcf1d08d5e14424d47ab438e23316b82072047fd6544fd030939f8cebced38832d62ee5d12ad4335f6a7620ee835d79751578319065317e8d8e524a1fc6fa5e7beba31d4ee0f9cd1b057f2055b55801f628f417bb4e30e2baf3f1e71388f1a9a429169a41cf2b12bf5692057851f1a1297299b6655f15eebded10a03f25e3b2a1557823a858f2e6068306ca1ba692497904162c535ca4a0247c0f5a88438a7eba17d63206a5c0756043cf112b660064e772dea9ca5495eb6d2b7fd85a7ef28a5e6e64220d147b390944693316e004176c69d4531e2fe71e242eafb769440026c8fe17d98fb3a60c06a5c2b4a09999140972b3760ef073ff07034f9d02ade1e719e012fb8c3e6ec4bd3287f81d05f0368472e5293ee0e9be96540d5a28dfac3e545f8f431dd8f814d08382922cff62f0cf402bde3b60e96c23a4dcc1c50e120c8372f6118c6e2edbb6c1b5af1d2a4ee4fe6931d1ec29ee8875bc4efaf52c689a1968f9097d4084905c2d027139c33c8add725d98f1bf129d4aecc669a2abf9981eb44b65f4ba6ca60413892533b147ac7972f40dbd8d771b528a8b2d437b21247005667c45452a6e2981251e524dfd8e1c72d9aa4f7c3478bd3c0f1c09e9845fb3ff194b8daf7e2bd8bae2e97d7f851589725f17b584246997f348ddce9a0d507c8cf1bcae81bd932a1c52bab47b2ff501723de028b2f18a308a1b2f07e6c93bde2d96aa99ad2910fb42ca9e3198ede35a36e42554bc84ac6ba02fb18f9506d85f2569e266fb6b5d560cd4c68e289c53400ce9c1db2ec57fc69acec01d6a3a87037dba48a76c86b4035e87fdb32e43045658d99a7199e4f6e55fba34c98a75064fc37170453a346562b0c73fbf50c8cbae724a869a1bb55efbce9dcead4e7960dcd3ac6be918e9366083379278020f98e7688743c75c81e23ed8a3f5f60cd0d49321ca41d036333db7f2652f2a536ebec770eff25c52843694e8f8f736eeec5b9026c3ba9efc945942ebedd2e9a85c1b5e1c53b27b3c7ef188fa223421389253881bbcc1cca14ead33fa54a3467382cbbe1aba95c4dd2a760a042a6edfb4b5558f062c5b1f778349b512b93038eb8c5fe8727059e6697745ca328d146b03e597ee8fb71118943672fd7f1fc3df171c06b24fc06dc4599d0612360ebd65e8a07b941fffad59f240e320d43cebbf0da855f15ce22aee34e68bc0878587007492b6cea5cdbbe2c39ff60307d2005390217042040648d3f82a81d2bbf4a5fa15d950ddd6a770b3eea533ed44c2c4915ee7658b72d4e92d2c69aeec64ef84297d31e545934794e6081ecd3d339f256b0d7383713fbf59a5cef303d15782cbf10fc8f81b681b1bbedee77e94df19bf25596125e972a2a5308382cc7039c8c596ebdb71d06679a8f20f8b19b0f810a4e0dba0c794720b1cd581f5020535290607c26e51eec3a312045db42b20db91e6e604152c6925a97518556a93046693ce4e8500dd05936b7355d1942c0cdada2bab063b268b72dd55d7109f9a823caeb74acccb2190f5a58f0598de9aa1fc82db0119d3383f7231a426376a01de061272c250841a09f2e273b48dfeb848a1ad24590306ce9c37ee2cbc669b535b4d1229f9a26ef7932851a959203226987efc69cd45d1358d72fc805fbb33ace9abff3480b180691eddc9bd42e2ceefd83888a50497ed1c0b729f1e454f4c6fb272fae8b36b232a9a4d2cb7397a46319ea63e6c5870dc75b42a165c7b264051582d8e80a12368f305eddc2a8994748323ed58838658a5634172ae74f4465e8bc4d9faecd0ed51ef3d606a100615dde190c42105df8b16273615226af37cd3cab361c2b5affedff5604ee8708e7a4e861ed2f2d8029b061e1428ead8b631983042238d16d7e9e96234b9b27afb9699719bf8d7af8c0154a81544b5e2218f8dc2f5db1cdf5064edb4110dfd93de006fd1cc5a9c747fd7c7ead94b80628499c1329885e1d4ce44fe080913f1c6c6cea71ee711e634dc268e056172fc29ab1ea5eacd2a7b302ecb593cfb549dafe7aa35d87120d6bf8adf45fd5b72b1969ae0c65951258fee5c18899008c2182080232b31619e4d5e0af6e64be87273c4fbaf4518f02f9a2ad1793f208b3144fd29a365a9e70d0db689329f52507231ddde803a19fa4ad973fa70e3d4749896079bebe1b1d47f3f1cd3e7273c203b06b9c383a22073b46e8150a17b66be8e26f8a89ec574459efe74b19fba2bf7729f19621eb8914dd9c5556a8f00e9f72db9d7df7d97f4e45018ede1c06f7c6268f7bba6428ea87a33d2d6eedfebe4bb2caedb4a1cb8f9dda196168b34906e5269ef5f320f40bf4f5816f3724e1305a6e11f699cabeeb361e1e6eb87c4d00a8a605642ef6122067acde69d671cc11e37e66e666c103ffb5158c8cfab86941a17729842b622457b5989519be127fff0357088b1012ee88d7b492bf1af09f0ec127283867cd4b8d38a14fabcfaba7099db15ea8303f27972fdd13380588fc7e3f53ee5f69edecf98504e27ebb1d60f629bc576340544208e4ab2588a2a51c614027225730261b123065af0e6980a6c5907e59403df0cb12b7b0b9eec6b0654687e7286fc32fafa5badac4267e728e404487db6db51e8b88751fb9108bfd96fe72b2371312ccf16a7abe2dd8e2f99d451661818296ab37a7aa848ffb5afcdde497d4557b1cae154e0f307b97b419bbb093d8a0e8ce8654c3cfbae0952ab2924b180721909ded175964e55ec3777ec88c464aabbdd267b655be4882fe566685c78733398c32e3f48c3bdf8956e3447656c971317edc42474a09471ad509f1532a09a4b30a1efa1f1daf64a57393b23c3b7f71f38bfc4f506d90d5a60689208d8b87c6ff653eb5f7c0b51c80f1372a2472f9c6fedbfcb659b37072ec70706f256b10e72b594b33fee75b25e50f3e1390b52923e7b7cd00969482022a2b4c0d30341ca724e06e0a8e5e3f337415520dcca82c3fca0952bca24241a7be718660e9fc4eb31fb2640b27be3178627db43407ade8b1eb07b65ccc196dd8db3e335850467fc72c0d212df3c119f367ab7e92b6b73af3127f6eee97d8e5688fdce51c22c476472cab8e1abc485960bd4621772631f3d98a84cf213bb7d14a72b3efbe99dcede168bcea5cd7dd2616ab4639442b568d982cfe89f2a07b51c35c11784a0aee67c726f7fd5ae52a629a513d1cf05333839ffcac62b49ce1e8765b3b1821f5ba503103317e4ffe45a758b36876dfc7e67b848d4ab9dba67767f9931c562703706c42f8f8c43c13019cba1f5bb19b490044a31227f0e79013ac9ffabdc44fd7a89ee30ff74de6a7a79851aaa36af6a9076b5c02053e1fa74511609129b1e8f4a4b4472a9e3603b142ffe66ec975b00b5c5b8e0b9d3520f3d0787363c01b63dc5136f513fd8216433ed503d67fc9e31ff15b060558a618f06501a73813ddcec6168bc2af5ce8a9e3fb48432816467e0d8cd821e4361542b461977d1944f1c4ab5108672b5513863cd73e5a5905afa7f6f7212626dfa5cf67a52ed8698bc63810a36367273ca35109e7748b59f06ed5a2bd8612cfec93e34a078ec320890f98581c7c472393081f0cafd8ab8ed7ef912a50b355c363fa59b8653d6d172fa17a2e48e45728e6f9c28499af846617c32cab4ba26e4b227a5d58aabe034de3f074130ef5b6656e1925bb79f376fff10594de90b1ac30ba0ea48895eafc6cee08bdc1d8dc072ee48cec6aab27a11bb700d59ba23861f7864cd0ef70b82b74da40e94dfb0a318b42c5fab91782bb8671fca138c0eb5089472023e7721ade4231c73751d7551729361cc702438f8a3a7468ad66e9d1cb2c4ff8f35133f0d0e73245354770d127268c1c923533f13486f6c5eeeca2754a9611386463c115b65d171591e1939b272f000056ca07ac49ff82516a0d2f2bb445d74f5488b8046ec556d8fe83f420800f96008dd41b55ed892c6e261e06edad17e11829a2e84c32047bb15dc317291722996e7e64589ad9d94b41d76024707bbc00afd44c6a51148ec980fa77d18b872f3ae6dec6cb5940c57570fb512c618710879bebd77c9a8caaf1c8e6002a69b725a71c92cd25354fb5c4d07ff9eec870da2f03192546912767682d47983b32231698094ca0bb84c13ed432816d70fc00269708df602aa795b76a1e79f69982d72588b8dfb2d929a75d5a4c3ffad527eb858f150746f47375617f1ea2e0d1c462c8e9ceea185cb138b399c893b0ed965b097a26a92b4978d1898a039e8fe079c723fd32f2968ab15a58c556e5bd86f90e344512c296075f336bd7509fd1566e472579a421987e208f832aa7ddb2202d72a01cb41452739525d5b951d96e9dfc5722a99b5f550d913f19bb04f9929508ebdbfae165bac9fa4de47470d5ff491e672a225ff25c7894cc5e974b27fd5262a497ca47d1a67e76d5c5b3f9ccca866a372a86113625b4bb53f9492bf0e2e917d70a0e8f4c08897e94e773c05a8e1b512364ebe4e1cee8c8cb4507eb990200576be2572e372fcb935d0f0327efba76612728e8f890634b0657154d6d9c4a221a0dea64f3a3537cdace785db1835e410a5723bc1b784ab4f3f2184a908ea3757ccbaac191c4914b607d2a6be4842446dde06ca397bf74106849b8de7bed14f8c045085db51f093064a3cb0105fdc3bff32729611620e42ced03de666970b6674c0cfed0b15044d6e824347bb3fe4df031072f7d69fb9f953cd8594180b811ee9c9918ea9f966f602fd10ae3cd15ccf70a272eec7b006b17b7e516898b40be27fc6e25c29f891d66925e9c0e0eef76913b207ab6da4762bdca34f8123ecdc05d6379d7774da73b53712cbea188cbc28ff7b4854a63e21281b4343bb81855c56ce42e208a77da4e7f7fd9b1df730e001b427726d21afc9c556a6999cb15a481b056c6d9a5deb200624e82cb210a6fa1acddd7210a5df024e84e51f118e1fc60a160c3cb723dfa09dc6f3690855ee5f42e1e5054ef6d9c04cfafd2ca142ae1de55ea80a288d198a7de59d50c68dc728ed159872796948de5d35295f615ebbc2ba5cde4a74e4f00f0148f26bbba84057a9a18c72a26560977eca8b35028285ad123ccc3dfc3181f985c7ddded0355a093e00017221bb1a703985c9ef94ef4dcce7644d4eef94f0641617470f428ee1f3c8fc9c52206c59ba06b6c6cfc40256621d16a29fd62ff848a7de6eaecacc1939a899921919831bd0745528dec7b2845734c594490e76227ad789af95795e96bb84dad472606bbd50ae12179fd561f5e7488cb82419d0529887ce06aa8fa48e3221047f72cb3ab0c3db2413925344efd56e4ee57d2b0f3ef65a0b72d9298d4ad8f48395729ca41380b89d159787d28051b20425632a278866f3e70b8f04b0c24d7da24f310083d67759fe7978e92fca706d57d62a8e0820ecc6461e972005770ac2e30c36ac87471b168b0e962b9b3df0890494533361d1ccc55b25afb224c8208cfbbb72be6c0c0e9a5c89bcbcdb4e2dea3ae3ea2531ed19b8a40a8352be749c0074fa48551dfe52c041d4bb14e019c15027471e60d88b1e7eb69e3c2fb231f7f4a02d72a9cfde2fb463178b88c84510f458087d53ad193fc63191a9f7940b7754b0082d7bb14fdb2b83dd64e8821d320bc2aabd93ad0733a4a9fb1c30d563825834270595459870d820c88089e55e3e0b8c8a43e39c9f7309f2765903c50e9aed11510e4b324dea1d27b60fc86385afa5b57e469ece2e36ea8aab0e6bd861f297d0dc62884bff0b7b6ac211f0c806b8a7a5d3dc43afe918799fda8e57f6367bbfee165d82a36ec1e21ab313bfb8166b85c4734244f07bde3fc79f5bb085a7232c0ac2723390a41058e50b0f89aab4fdd68f771a925e42ba2c1b03621c8b075bb4d9ef72d95f840fc7015fff0ec78939a08daf33e7f7d12c09d9731e5123919b6f4ebe408a3eca36a17d067c5d172507d08f0cdaa33e54b05db42c06a873179f4834be726ca75c310d129df4ecea23fa8b74648360f0e4a82397141ad48e1f550024c87233cadb406b5ed43cd1fe1e457b5d423f4b5806d0daa9232f5826161387e104726812d84eabe64be491278db03530c9e882b15e3272dfb7e2fe5f158ca238bf7234d4b131d1b5388835eca05312f2e64595fd55a28c0892a319a3b6ed96055f41fb68168f0df554374d82a35b6db4aed6302dee9f3ac2dbc04f2d9739f7834f72468a032f2716b8d5d2c2bfd8bc9a1ff23da0c1ee0c07b69a0c5222371e622d723140f678ad566554ee8291777501ad97208a0440ae73f8f94a82f087a92be27271fba680ce46d2e4e6f06448cbb8aa87994e1e3dfdb5fa68af5eefef3d4aa54c764d476f3a38fb0b8aeae1b1afb713072a7c9b1ad8b0ff8cb9a1ca459e77ba722efc868b8c54b8eedbb2082137b5c131966a9afeebf37abde97e109ce2bf8972457d946131591fe352eae87a952671d8efd8f52869a4e59b0cd049071cc0b072621977ae656c5fd310c36f1624be775f2e3ad9afc0fbd215bbd3f8d7308b280762ab63ab5e7cc7271d6a34a1b37101c9cfbb650ed30e33d0bb14b11387b9387258c28f9b1e9c148b1ecb17b4a81b758cf227fbca8b0088af1e8385b94c603b7235661116defbd2d0689d61a23fe980ec53b9fa3779e316885edab61da3c29572a4302d2f1ba7d72538ba5291ba9c69bc1ecceb6a51d8a86f3275c05bb9df815546e71cf75da219daa39a76605c44d6d536a8041c8bc43488ba79576c63f3fe482017fa6a8613e6c4205f4f756ef1a3e4fc45cc0d4d7e7d024f463f959c258d1cb13f6aa3a23ad8430cc8fa94c130a64db17e2a657c711e7af99855c40892b072dbe8a50e81197e3dd566ea36fa9ea5e0644bd64633bdd7687dcea85410eec25272e00cf1a1ef1893e918830e5fc97b8f331fbd3eacb3a505c2a17d4a50571c725ae998ea498d6316e77cf317a876b81010de4616046d8d43dcbcee95088f861cb620dca50b8d26c7138c1114c4680937402c06dfa8e6479f63fe2623fb9cb65022ca818a00c5a62c1915752674721256f310257df634dcb8a30a94caad5eb060a6b7f578d1d4f14e0c718392bc90b0cf80ad176eb69a4fe8ea5c873a1436d6632f2fbbf0fa4a8b8c1470b6b20571f85eb1dd98d8f3cc4f97e8d05fef3f4197726ddd1dd5471e2f7a5c0e601d6f59555326f635634fe84938daa5b58011dc5d1e6ab5b32ef5d652e6458e0048c15e2eb0b95edcdbd9ae51d021df7d897565a85ac99e04fb06cbb3ac8b858e0909fc1f5cd33af601788ac475e59daf7e89d884648714060456e0eb4d5bb83da8350e0321d51c40f34129b9535f87bb02493c98721fecf88c5448fcfd6f7b4c2b80d4b8badb804dcafa37fba0cbe6c4d2ec119063dabaca96ea0301d8b71983e1bfe66894147671ed9ecceec9bd2a585cad0b1772a836410f7fa197e076f30f6f65a876ae7734abf100c0ef75d89111bd4f60437287ff75e1e1c6946a2ecfd1a044f05e7acb9bd35bf488a50fb6eb2d5a7eb4917295a5c606873838e5555283479d9eef62a2dfdc510b6aa29e24e0515795ba187266de92d50e6ae8e70472117f5e6891ea6aaf9e7721947c93d51e6b5aca7a7872ce27ed00b5676fdae841334f2d5e37cb07a4e8ddef39597cd6f7ba5d92d86172d0911042c50b6e3970f295495b6c764014afb9bf37004dbf4fe4c732edb59338a5952ac3626fd686441d4f9143214da9ddb73133b7d7bea2299a2c144753f15e19ad092b44934d96ac68b67e9e5aa1ed8a69569ec6b970722d506ba827e0487253cc709d03ae30e577ed620261c2091ad09fe945b7f40e16389a146a0866f67218a29df6edd19fa1deb11465ac41a91757869abf01ad15a2f2ac65793dcba07291645acbcf82d713e84f59d4390d9d03c0d304e2b6cc61465de7b64e67405372e70d931b1998284b8db1d1652e8d0037a15f60d73a53663785f90b77c66ec87230d7c4a98bed1773884387c524c522839afbe5779f82fd6c326cd538cd3ec5722262a12fddbaa153475115ad40ab64d4d08b02610c28ad8718565936ae8bb0727378312e023922dff75fe28029da3210e826b93e32ccd47ecd432030b20bf063b21e918c6bf64c3665f2d4a3658cd04f84d07f3408445c5eefc9e6fa76dc1a438c8145a7c2ba364baeb753eb725027c37600a672495139f4c4b47f959f3e0317a6c89fce29ba6ad073934fa2499f27d62fb1713254e4d24123149e16c283ee6e7b01a9b00821d98a2fdc64aeaa90facd55de177fe137ed48f6ac33ddeee4bf697687816e31f00b42eb4677d03f4a146c2096b250868ca6f408541f868dc22f72e706dfa5d0cb37f4d53ed88cc340201248613665bcc4b56f76ec9b078076725ae42fa9da490e6fab3d82487873c33c37ba7ac20ec01b8674c61d90fbc9c56472d40a82805235af499a1f9c2b1f3bb891e1a73d47dfb28a9e5f062caf64a5a372fa93b45e67e1a32b1a5a99e6026201be6dfa440673c7243e90f871aca9dfe83c143e6eb3ad0b367c94297aace419f9600b3506e45c7d43b2aafc609f69e9104c9b2434a48c6eb35aebee05013e7c415c72cb6fc77f0f11f39d49b012c488c472701e2619dc002d31c3bdf93086b8f27d595615ce015bc471f920a1640dafd12c253214789cdbc1cf5b2f135743584dfcb602c04ec2119b4cc1d657e5a0215572a7eeba869c4cbc6a635f1456eda34cabcebef0749a13c0eb9c2a1065f59de172937502d8f29743b4c10b84f4560b6c99fcfdb8cabe5b445c2734579f8d348c72e16d856e99181b15abfa44d99012014f8f433c0e587725ae7edd88dfaf7de82f2447430aa21652b8481a25d02bd5ce244123eb9f775407ce34e0d065e5cd7d7239ba885e73fc4daf0a2d3a9cdefad0c633d8f6d88d3ec509aad24ba2a3349a5ed2ff079c113ba8ad7fa7810eafec395b6edb314206bfb2243ec5b104a255c15cf7899e66412e462a1a3da3f21630bb329f2c39c726679c72186520f376852364680b8ffef421021d9670963cd8087753f45d6e957747315e874c4fc75f9456725e24c53a5d1a299287615e684b152037a6223c56be30a40471a8d142d1c7dc0526e9bd4d64b3ab653d6585ef33dde1fc886e6ef5f5f66b5f572c177665cad872d3b89bdbaa881296124fbe5e0b171ab954cea169bcf78c433a12d03531fc1f2021b7fbb13ea9f377b212fb5d264987452af891719c42bd6494db872cd93e87723603bd433940f0b2e5f77f1570024424962949d967a7804b367a2fb7b7ee39727fba21c740de08247c3e743c52e18e265ceaa5a62451b60e77c29a8958e9ba6354416f0223f98e0b5b8ecb83e31b7a8a56b703f2dbded105e67cadf021d15a5fca24982d7f2c64188140891adf47ff875c33a06231e3bec4050fac92c3459a55d41b8677a44dda172bd63d8119c4155eae35a732244c1e22d784654ea2f644526c0e49ba3730f572837d78e59568e9917b3add618985b6718607c3c7f51876094899921ed577e7f0ca09c020274e73dbbe6fa6af0aaabafb7ccd7b494a49bf72694473ddc04ac6aeeef9db2ef453773ab7b8886361825eaaefe344b488233d724b7aca023a65fafe9bccbfa231df7c256dffae78c292cd7055baa17382125e3327b30122adb79fcb5ae0115ff2affa0f224eb70d39502cd3a4e08bfe970561728c90adcbc9e5c60f562e32f2b70b68c8e41e0f78377757f37b00b9980faff2726f78451b050ee162000320c817e41058ae8f006265b6d1602904b0420d02230d515efd0ebf7cfc3c9d9c658d7a0ed51921f71286fadd16b5562444c270941b72535c665d58292d3ef26b861ef96abaff6199bcc6d6aff6dfacbe25a608f154722f873e5917c31091a707c79736c300e2c4e9bcb83b4c7c37903694761897d33c322fdf7a5fcef250819f335ee5f1cf092de579820864e99709d6b3370b1ca840edff4aaa338880d7698b65e86d4d6fcaf74d9152aed4b244783acd678f2d2072f007507ec1272706e39b1725e09e7964e059989e0f4dceaafbe03af00b8e12608cbd0064209189ef85ea02f4baf347ec99f05805895c5fa39599e4b454fccd1e1f4a77a006be0a846fbde670f1c7e81dda869dfde2c377851bc73b5bb58031722b16144f7d6ad2ceeca1298e76058a1126d37e4aa028da672524c9801d6cc436854132ca696ec581ef96eec34e8f597b791ae7a4e8c9e69f5d3c90e04cb60272547c1dfd5fb3d99f1da04d596e40e9453d6162d3ff2fd91215e8aafcf79d21720fa015eca24ee44b21622749af3858d5dd303c1ec5e94908c27e486328fc074445a660f87dbad04ef94ba185254c8bc3bdf8e5d346aef18a447c4df9eec3a672347b5a81f7674ca8658cee9479a921b9a55fcc94d8770837458f4c5d41cc6772a73028dcf0511c2e4efbfbc0747997c86b726827924fb1ef0679e768af5b4472b89e0fd52da7c4453d35cec71b275455fecea042720db3ea20b15a8d176ccc72a7329d5c152ed7cf28d08adfda5970b2fccdacdac95d51d49b01d9d3a4147d72145e9b9eaca13fa931c0ece268fb8aa709a2e9c79ad8c253c41f7077dd373372f860826f5a1fa40c0b37ce6e04aa87fc7580d30e8f2ddfa9994a7f043ef75f72cd0a7761d851f430d894e63ab18c13985388e865c60abeff19cd572ec99dd9293ee892791bb6e286da930e68d4d7edc67bee9864adffdc80ca703502747f31628854eda853ea9227db85c471275051c5ce681a655f46ba4b324b418ca0451472db323dcfd9fcaa3cb95ce5d0642f13ea60045116275b99c080a0685c9ff31b72410c2f7d3d9dbc34b8ca4dd6e8289f065bf1a73fbea59c5939127a671625967203197c04d8c4be33041bcbce73f17b4cb2a7538b85c21091579aafd0b2f67b334d58df77ad2801746707f04922000f66bd05fd0f03e7623d1fa60ba97377ea26a526c7a0e7c8deb3f327619c9c0022b9ec81df6475753ab549256eb7aae7653f88cafa0763d4b55d81d30bd8cc33837919ada886b2f835835cf3a05a12f74072553cb6996b4da1fa219e58800a8de40cb5d43eb49d8c0619ad782cc36cdf5e3a3adcfe8bb930dcc1cdb05fcfc59eb586ffab49bcfc87e9869e5124fc00073d633ada60134058fe0098a06b17b69645858e7bc586c01a509a5a4c2c9f37ce56325dd78fe91e0d3d2d841cb4cd86186a54cf9ed0abb40cb257757297534f018d677d8b0c50b8e43bac9d519f380a056ba67828d141347d8ad6d08bd6f1fc71df4f31f8c7ae40c74f4b4e1afb0c0acec5c51be5bed6a2d01829517a7419a90afe7204cca6e5af1736f1e0c7c5fa11a0c5d04e3704b45b0bb088060b4e01d345ad7263fc2e3c8d0ee64ae5b9b15bc47c97b9a1ad1b31fd5f154104b6d11423b01d72e639ef6c81fa87a896744bd2587c5bd14f9694f41e043b64c849e8aee2560672943c3ac22e345f64d9bc65e6c800a98d5f022f897308440a59ef4c30b825ca72ebfca802269caa448f38845b917b182b219b5c21917aabb337be15a552171f72fb0f48446c8922c98aecbe3199c131c1f1c920e29322560978e02a3102e724726b20d6c374c34fb088afd30a272da04148b159b810deef1d6878bb2636809072470276da116e71cfc9e5ee3ac27e80324a1aa124e6a4c06baea00594ed2a4330c2767482411dbf0c7d6d8e1e30ceb69c52dab4c372c17a041f3c100a4fe3db66b821f7b6789fa40f1bfb62d3ffb1f1bf4ac91edad66a31f441d5ad1a8318b93209015e1502574620536aa1d030902949a5d8735e673c34fab44d5e18dcb33b50516a2bf69208747b94b701bd569f23c9050e9d92ca7f5b5b55bfa621e06c7347f981453bea2a5005e836161ac886c5693d4320d813cf9b4340e2df13874b4d073d7cba9b75031d07cb0b4e038be15ccfd5f44bca754fd68e49c9026156d7f80c149d3b0b7f346f33e045b8e92122d0a29ccc96ab9dca24184bc36bcf7e2b7772cb02c77fa95d06dbb1640427712463d64f2870fed5eba4baa756cb9b19a8c93f3f88a4dc06ca4041c7b93c8fc652c35d4aa2521c730c14c1a56a5825a928ae7296633f3018c95163eeb9809ce8d2b58d9038c4f948001f4ad288e615e479e05ef588f2170bc2a7d4a492025588820e6199bdaa7b3f6a8fb9493f9511e9f59a7250cd9f0c77c926f0bfea7fc6a46188a8011e5f7e9ef9d36e33f9c6a5d14ac359365b448a66e08d84328732fb0761d8695b6af2dfe36f1d3212fe70d74f2c7e06d6aa6c00343438cc3e3c4de0a0c1b045c8852443b69447c5939716e3965db50b257fc829018367760cc240ab721ce6bc3b205bb673576790d38d46f037cd176da37c4e27ff9565657c2632bdbf3e1badc6c33181874beec64e3d7177193a5772ca9d49a09e97ccea2fc608ce59cc2e46b197b07aae7bd8ab0e5cdc513a29670960f199b084294dcbcf485f49462b2c14222ead7ea4f5152be3c7cd2a8d1ce572291c1a48c4cb7597b10fc535c8dd2025a7054b756f74ee83e06847cb2a4aef581f41cc70b04f01b94f710f204be86725475187f703f27958d628cb44a30fa3435636430abf038c05e31d03a679b23dc3e80d336498ed31d099086e0da8afe9724cc9147eb18f8c0e2955755027f7a1aaa56c7f72f4f2166a40f7bad01f54d32573b598bbea5d1c87cb5c40c4fcd234272e973c9ef6647bd540e2254fe13a6972cdd863f22a9c6235ed4a210f6119157d72e8aef3a3f9d5c2c7f19cf65470c272aec664cfc88715bf5aa65ad57c6f4f229fd8d73b1a16eb888f67756dab1d8b29e5a30a3aeef832e1800e7095f1896b82975d23b05b6fc519371446b23bb18f72dff56f1a8ce4640d268b1570e42cc01b3fdaedf09ff1c91595a33744ff886c2452f3ce4253f341fb6e32987ec134b5e93c3774091a5970431df2cbbffb59f3722195999b2dc201edeca0981dc19491c09c0892c0123bae2246baf0bb85b12772bb1279a7489982f0939bd30728f03887a4730d0e24082a388ece064de34001720aee700e7b3f993af5c7c7195c5762a5292a59cb7ab5984550f480bef002ee7252dba3386f83cde1c403e3db715b8fe54ff84bd5c5f9ba3046061786c6955a72fb330cbc2c6b7dedf8f19beb7e6c0cab3978440754449925627ca1ddde5c4b723bf770e711b93edc10d5b783bbb826a4dcdc5ccdd8d61d6ca3c8115d0639c172817646a45868a102daec7e46c3cf3d6245f9db29a3c0bb81bafae7e2f54eba624a32083c4b2be60bd5fc526f68aefb469b678f0365475953164be1d27885fc09283e6e20d135d69fc95939351308f2ab4e486275ec2c612e4452200d29e03252e8e17d6c740bd80512245743d7fd8b68ff82f7b356e94015e2a5c6735b39e34643dc5f27764d3fe37b02d2ed8d3faadd546d726f54507bd75f7b2a9d9622640e1ce3b02476573729e1acaaa53d9ea9699bb19b3d051fa798f88710c2e66d6032ddcb029f1b3ffae18fe3de3cf1c5c896359fa70768aa0b11a9d587b421dc627288950c44bb704331c6dc41a3e7ae53a4ed94f211c7195b53c6b23841bd34337264962137880def55273bbdf43d7b82ef152067a1585160039f4a6df25dc4675208a145da573612143fca1036e2949ddee58717cb751464798ed01e9438afcf725bdc170ebb9d0c89e9add4224f50e1b948d2ad502b7fee212b0a14eac3545722e435107158dbb0367964c952fc83e5844317e0c27234af735f39ec85190e0272849bc28b2fd2c2d3cd10a55332989ed1a135811acad3bfdd90c373da5e4d60725be984ba42c14856020ead8c8e55ab2f414b18c66066c86f7429f9bb8e856f48bb7e1aebc27a3639425ccb883d727c3fba2a4671f036c0de7055611f6df5c6724cd8bbcaa718aaff170f5b642601880eedf4b8e43441248a55508e5503cf3c21cea37dbca2620a2386d7a7bf8393a91f6d10f95a354c9476b3ecd248fe85bb24b76bbc787b45cc52958d33c4c6f477184d413fce3d15bdfb330905f402f24572b9f62ad70572a3c013d73326c9b4ad1e76a361844fb43021ef374451fdf97229ab63a1cb78891866a762eaf1fef022d812acf5f4b5794f9f390d2458c35df34601a367f601d576ffc9c2bb38e36961770aca9a5da145395c400c360f7a679b723a79e1ffe02b97e9d3206ab24e07ba7aed5c427798620b4176cd624a1784150b32066e34f62c34e626e6027f10c6443fab470b1450984911090c6bd4d7c64b724aa870d9367abf6c9d14e5c57f1dbea5358d9bcacb9a482c9e03b3b023b01372d2a5576d091d8909aba52aa1e7def340a7bb869294b5631234b84c8698125a229d3c63d6ab695c943c933d4f58c68e26838c009ce97e42aff9aa95a514f8c1724feb570c7b4b093af1a1dc6c7e68445fa334d85d048edc22e0803534d221c94fbc3e96bd543d1e2eaf6f16709b501e85e9433f8156d3b02a483cd166bd501947bf20d9d640e07a466781552501e333ae2d22f843980963494e5944e448f1647233b873f6d03ea516aff029a5faf2ef2ded82d4c9eda7aad53807c541bf496c588d02681b26cc020707c51aecd7b28b57449d1710128e17756c467e27b101ce724b2120626c12680fe0bc23575df80900c4686490c9d1aa6686f391bfa1c42e08f1c3581c855ac503471618bf91ffa39cd317be64b49422c0658075e14984cd725d4a688fd745fcfd2534b960864c73901065b503fc221957d6a09bfbc8b2cd72ec5dad58648b5eec23b15348d814316e03f97a0c36df73c5b474cd31c42154722db30a3925a5570553ac0c2fb28ac296e2c9491b3874c73f39524077c734850affe00da5480fab81585cabdd9d38bcbb965aa3df98e8c9b94fd36c6ca75eae72a1d755fac7d3cdacae472fc581447c41eeaf247f74562a6eb20b4b282267402716d54dccd76596c103676102b90bf5aa852cef75aba95378d2bc526c793e6772a9706381020fa11111e5e44c0eaf2c552351f375f15229d3b5ca67237e05d472a30e5b43722cc75b0147569c08aaef63d3604b3751da9666427c83bf94ae61721c413be9273f00b53b4f3ae3044afa465a1dc9bd755e40616e78a40ca74e423a0279dc0c456b38e1c9675d489dba6c6bd232c360864e022c78e9a4799aced6727a4a3d21dcde63c79fcab153d8f05f834968d75166cb2fbb74422d44a7b0d9725ce58d5d6efe236c0ac468a0ed802b70542d1e666ab6b42d8f89d43b38c1b24351546916fe8bd2cf832f4c4bb473e9920ac39e62c4244135530f021f5ce67b33f5f9e0272a9a2173e3218b00e1ab23fdcb50c9496be6a1d8420ae852bdb2ba7234fd539a04d1f2626761e9e77e40fae20d6eaca2377c2d56953335c6b0089172c9bc4998fc0efbb00c4b6716292558e69098a32cbfd808d07d5844fc0253bd72786ac036947d7d6789a0755ad5f664cdb9cc257010869fe427960e34f86d01455791e351f5aa0eca21a740c1196960070b6eecf1a6b42ee211248f16236b2b4a7250cd4e50e52d0a7344e30597c8dd3a5b115bee1c6a07b37321cc9566133772e7e550632f2bb4a1b7dce6367312053d96d82d00e97a87ec8ff5a312df844c72922144d2b8bb0434c2fd75e75ec62be14a8a8136388a345670f5f3d554289c72fd3c90fac095806631dd05cf390f6a5346796888a8586f54be7bfbe16b05e972643d865fd78d37f14338d205d3115982393af7d341439960629e71f72190796d6c1bb47f3312c22d90692b43b67ceddeedb7287f9be800a0f2d7553439687f24a45729f9865f37475f65b0f5277537a94b1845a3b8718e4f4c043d33b0f59b4f174551ea5637c87075932a67c03ecf6b2123eb507e9305c0b6970f2d37cbf172981095d89298c44d024202dff612d68cf20738d2d4248b23195b3f8823dfd672e68c470761c72b96230b7ad8132e2c23acbafc2893c5eeeffc10b8eeb160db729be81e90d64cb9610699b90eedc09f4709c34349ad1eee52edad50a4aeb9725ce1ed7c39ed71b8df5abba626da22dc0fe569a0cbcdab0ec4552b7955de37d936fd4eadc61b70f430d7bbde9cf6d227b0d902d5c5d5d9fba9e889907b8e646272d1b8f5508f48d543323aa5b09db25dffa2d58b2a44dfdfaefc1862ffe7ca8e722d174e82401adda656ac5e47aafb56f52e7f6213a2edc35d122b2841268c187260674d594590b5425e393fcdb24384cafad9074e6ff2d115b93b527b90aaad729cdee2d0a7323d23c7f674eabcba538ef50bf760b700ade2abbc37b71475227277cb6f1f47d56028128e62d51e73ead43d44fa6752f030188a3ccd6cba24e3532e915dfcdceb196f88326f4e94f9d44ca2a68a558dbdacca22afcc5737d5006e7cd10a15787c438344f94cd9dfe1d494322efb0b48346de3bd844696f7eb1b729317529c971e7481336ca4f914040f4283da1e66ccea3b8b3fc40ac13f2be6671eb76c90b46ae35b09f78644dde1fb0c2b04a4e41f0004adef8b0d62f258b433b8187f00648875fcd81575aeb89c604ed1903a8e2f8983ee0293fce2b47eeb435f27f55a6e7b448786f27b52db9856c46181725e9846756f5db03798c2d9fe16546b7972fb4b1544b37d07766ed01cea36fb1e33d841b3226f43a2f066d3fe7295277d190365f6d5b38555ce895738f41af7710dedb4e76c95777138f917ca03a21b7c28a7f72dcb37191ccd2a81bce427d09e0f138c3c7be873886e4bba817116070dd4b9f6537669035a63c0e805fe78a1ed73afaadc2210be85b418b16353d3d865cfe41ff1e8ed5cc3b6faf2a03c163bfa48068831d1e297c17cb5d8714a0807ef1abfa6a26e33cf35274f3f922cb4af69b73179f2d5943d5b584d7a6454e593f63f2e8e3774cf2447f228e4ad0ac84c5f2082df941ebd43fc7e837204105e4eed57ede64ded45729b3f100aa543b7cbb0c40f8bd08e8e5eaf9878dc4c668896500e644a938d6466bfa8f4a849c9d182495764295f473e461977c8d8b0723b0df6ba5fc8ae15ebccb71a8fe05dca3f4f4b127d5c3693b0dc56847b1bfb72b09fb018408dc6d9a33623d7d7b3d6659c7ad4d804883a4644f8ecde2a1bcc25eac9b0c02806122546652865146c60be943e2203e99093a4883535b4f40d1e7259337fe0131f20fbf627dab9ab3847cd5e2f956031dadc0a3563b3477199ac062e754e307d2cad3354cb4efbd4d8cc0c91cb56fc6174b8a9dc87c100247d1771b54750bd5bfb58b3f0d19ca02c914bd8a7b253b35ec9c93b726d131baf5a94729b31518ab57ec4b3fc7032edeffdf2b0b10421afc1d5e7083dee557075c2a52528643ea1ee521fd1325e1aba256a60bedec176aea1ad7cdbcc2843faec66b772213e140a8f07cfd33960e96453090253627f591b2fe7a2c970cfa6d72475ed5e45d262bdc8e02ffa255a047072245cd780c6e977dc552f518fff2a75e596a7664ff9e620fa508ce1d76ea0d0811cee6e4b33c8538951fd5920cb66f8e5db3b725818ac3f106c3bd8ea01bee1fecdb805b7ce0f62d84bcb313e4c53f94852dc72db22dc6d7d64d318fe56bfdceb23b0225a7892ddf6f87cc8a8ac3e5452c6bb511f9fc44e74f57476d95459f95d2943bff1f69f338c7d377eb5446bc7ee0945727e16e34a8a5bd77a607d51ff455c24e8d715efe4b0f5539960b99d0b95ba3b727864e484c29bf0ea82e8665f60a44cdd784e8886adea942f473d59074615d072bc38828de5c6d05b52a59beda25634b8f62f332af409b62016d2949dd9692a31c8084b5bae20bb81c19359b47eac9583d20947d335340c9c0a62f0a32af06f724af0a94bc9bb25c5039587f44e3652fb675a194de63b24b5092da9dc2f9bf6726cf05ec1be23ca5efd81d182d601782c93c7855d36a4977c70864d60e582257298c20f11ec55fad14821628aa0f303d1ffe347ae8b295303fe3af08a0a4d847217ff845b8cd87690d8bd807a28733435498aac4713d1210cd57ae0b403b79f725233257c2f3046f1776fd3d70339c50e80a3cf1e5a434bd6a6717506cb133d72f47e4f2c4f0c1b95aa0b55d1b4e8f0758d713e5fe7985364391bdfedbf664b72063721331f9763aab5f1865953541f69f9bbc1dea829b7d9a56da0f0f4c0440fc1d217775b0317b37358079d6994190fb973bcf61b2c7bc4d927e76727d2316438d0340fb15bbe4d5bf1b11644e453f61e98e45215bac479ac0738a88308ac3aaa5c8f3888fe88ba84661fd8dcbba495480f60820e11f9bbc30d061f92892463f96778c716c9ce3491cafc5bdfadfc254e5d58dd5051c70dbbb47d2f9b6d5b65bb6ef209c04574c0dc3d5457f7eb27dc6fe118461d9cd6865b6de98861161572e89ab03db4e53cad32b0b2f93e60645d7958871ab6ddb1ba1a4429b24b2c7b726c935b438cad35f906eed67a662e3c1190fd6099a46d0423ba710dfead42c2156033d8864ba22bcfed78f0a533530be8c54bbc9006dca003804c78ae3d97847223f32dbc47c0bf789ab08f63f8fa4d5f34059af4b9aaf0ca509623eef3064072971a242465a2e79456b7e61dd11469218fc6f722fd15102b88f9759f3f163d7273310e846fd6e6ae193490ec8da9b01664f741579b0fe19397576999a7877017415babe91d967e6c73c1463dca7582fe8aa1e19f5e0e3ade0dd8f9046cf4cf4eb827d6f03be693c5160b0c100fa5d8431519b7cc31012793578295a0126ef972f1dd3fcf1c10d7197f4408dfde21d0f8ea5b9b13c8aedb991b1bc05cd1d7636686b22dbd91b54a70eb781d51c51b247f9ef2bfb251ddbe2015246c976abc8172fc6c8cfe28fc1539ae9f523cb467c9a61935038c16ba5f79e8bfe640e2fa1e6a94022b1b2e7a0c761b240e4563fbd9c947868f8fd4548480c127335e6888e272b4abfcb338633c1ff9b87cab8e08ceb788c2aa2a4554218be2ed12f108e05372c71be5675ccfeb72adf50ce3666012436da33a7b840b67557b43d802dafa8272dee31e5bb32fa361704385bfe9488d81a98dd6e4263e450ca0f86a81ebd5177262258fb2d68a3cfe292c01207a0cac26e4b1becd57f8ed2df6d797a23b97d5722a5004579c15dc912e49cf1c64f67cef8dd6947827c621770f78fbb8ac247b72d97aa4b34f1bb0755fdfcd684c42699ed59c8072b70058c38066f9f87ad8023c38b9b7c913c871c5cbe74340d45b4fabc04bced1a7a71f890aba472a6b49527220f515bc1063072fb11cce11998f65ea09d24265730a19dec8ec9a574ea19d729677f6d1ce25a3224717095874ff8dbbcdbf69375df62acbc09e190cb61645337956bce6117f8dd69f4f204aaa016d39281fdd2ddcc0ecbcbf5d5bb7a7f735728a72dcebe5edc9465c146892adea3fc0b9f7a74fe531cb22a305f9039f120a19019aec34fa8992f24a1d2d21df6ef14cf72df358bcb7945883edbfd698cde972807f88d0dccd4110c78fe2a51da2d6cc44683d0f9339a21a9b7f7140fa506d718d84d35e971d788c060c09ba1195ee0b03ec5f6b6049b805d04599d5ca1835003d13732d865aaaa2d6362f15c16b11cd357387526a7774aa72b7a456559a2d722616506c1a34b63332056e841966e7e57c00fdcd69ebd54e7ba8025fbcb2da6ff3e094f30a932fb1c37e6e4033e56fd681db14fa26952c2ad4a31eaff1690865e3d93dc09bc79ec44de9f59429c5b49826bfb88bdf3f187719c6621d2c2d2d4f5a64dc48a1284df208b98d4be1e7fbe4776c0f0a0e761fd6b5afc9eb0f42d8720d9ed4e830e267eb62b8923f21ebb599e65bf5ee892ef7927a6f16e9787c6c72f50da718ceb68529c26e83560dc56c5c0b3df62dd66e0164e1570e7a51939a729bc78ebb5fbbad260b856ea03050a5648233d0871a522cbbca87ee4fd2050b450f0b52c0fc6b06baee84f8567655db0aca188d87bc3a8303b13f05065e392d721cd17ec966884ee0da019cd9e5d09bab5c2f7d01c3979cc2b8dcf8340fa78c72ae7f1195836e82560f37885d3c3d8e0e8b2afee47a80eaaa7126efecced1af57879ba553b4dc5b89e2c2f6b9ded2b2ba0e31dd0b31425b97b128e5fc11d2bc310bbce48071823329afa470b6a74298a50d7a1f03c8ac1621bdb0d5afdacbc4460b31579b3478666eaabc86503fbd7ba802879e3a530f91eb6687a195ec143c2279a0d40e4dc0701e07be75463a9b19a09dc50bc910c047adac133a5dcb8d3772a79f1f42ad8119ab28d5527c0f24e6f9589b57071a3578f52d042a40206a58720e412c10094214d9fafeaf6be6bea868141a008875b4b113d415282e15b54572cb4ee611289eae12482052f925f8cfa8f8890356eb99b644f9fb9ba55a255a724d3413a1ee06f63791275d408ecd67f7d8194dc815d72fed858cf43c88c308729ae4c3b1f949b9dab8849492fbbfc642e45601e872843af7356a6225a44b6e72a9fd2c7ab7b0b0fec058260e3e265007276c53baea045e0f009429408b4ee672d96ef8a244d96ca21af9c702a875174a49c39b147b1e9e7b8afe2fb4f4167c728513bbbe13609a61fe996ccccbf04363b2af406a513aadad61f576631b0f7b0acf1a0f2c21e6660a7b54e86aa1bf3f53305188da28970bd6ab01a9e805ad8823b7fb479a3af167f6d6323b2d415c1f10fec0e0504673b25994e60bb79e54d272b3342578f76c70a6770d34c50ec344e8afa22672f5a5542707c427c98816ae72a1584ca8aa80d80ac4c9343a52414e18a0d0572d70607871ca1e72cb516f753e5e3e76809d24d155ef68d837967e6b80a72e3b13848329155f7db1057db66a729b6459e25dfc8e70776cc43005a67f00af8d9319c6b02c165b75b144c62f571ee7afa97235847a0f2796e1e1b3bd9ba6c9a28744cba833e695761cef9b14191b0aa9c1e47ce065bea5ee9ba17ccd5accb3d3764063d4f3d5b4f79e71e3bbbb335833598cc745f4b5fb911dfb5cc6b390d46547656faae417f015d17c67b1524feb559e4fffe658d836fb3a73b2213b01c4c61cf6c1f6ccd851b9eac4bee8b14a9cd283a47f890bc3ab7d10afe2fc9779f9ae044c75542944d88644d1c79935614743f9a7837e89270f05439d102c13adc239d3baea12d99b8943c2c83417ff6a9c684fcd5550b736a67b1bdac381d6f0114270029282915d8448eea48de4137204d245e8a9fffeb9efc8404262601cc4e4b79dec8b4b658d60f4efaefafc97720b72ea291890227407eb366ff9fffb453282beb1e8118e4bbbf3570c7a6a8237511749b5bcae5a05aa66d967703ee6aa73ee7e3ac5ef82be898c64ea8eaf1d72a7c6112c505394412cfc51bcbf8674986c289d921c55521dea3771c584160e727aca577626de675f7e77bd119a35b08c8c1554f97fb89543b5db607e89a8830500b4a59bce84772dd331ca72008c5f2b379181622952069655b5f4b1d7bbef21c8180352cb933ab0e8bc7eb62b5a87466fd754cac782d806c50d1dcd81f85b72055280115204c641053d41d6120b9121b6a0f6a69e1f3698dd4443b831fd833fa6a4a4133d034cff24f16a60415fbb0da03e9c5b2cd4a45938521baa7ac18c247019effb4a435b92d91c0f03d0ce00608c8ac4c9989705fd084a1922a5ed26523d8a873852c0e8a22a7862921dd854ac79bd505a5e3b919f2904b0cce17a5472f2766ad206e981c54237c1aa298fefc39e0dab9485a003c069776679e419e0725c1c3774ccdc7dd41d21a136004949a4278ce0df9ad8585c21c74ca78810ca720741cd59149abbe8a844d9a8d84d8adf81356506140f54b529e8d7559d11e30ae963cf9519c20e66dfa346fa5a73363bcd99fa321c66609307970e9b4c6d00720959816f665178512dafc58c5b6f5c39382bc83edab5b2a358ba8aefd4243b061592aa68d8fb73a616b8c90538d6f60216dcab6dc8a6da7a3489364884c8cb72692c7926affda7655f79ed918460ec3993cf7358a72a1efa6fdd58643d877f0a6e94d42326dec28684ee8bf15254714133226ec10481a0d8ee0626a870f6842d7cc9fdbebcb93b7d34c4781cb56d87c8ed74cab77e735b2572fa473cdec00572ed94bbce17ed1d6b80e3286e9e214b6fb31083c0b1a16b9a0d6ce4a2e2990f72b44ca70c08cc6d9378bdbce9aceb8cdc0022b2bb771ece3da5ff119d9ef8fe3ecbefd25dddf410bbea8519d78d6c123bda67fdff709ebf08ace273564788fb3add8ffda51bacd51748939d32fc5243c393f1dd5aea34ea0a688d04ce894331721ac280a8b08321ef4b68092173a4a3a02511e96ecbcbcff77aed356f77c35b3de4bbfc82a056f36455d678da500bbabb9234e3dc357308da500352c4da3c8f723a9972696e7ee2c2f7ae13b29b9b3c87244bc3b167955197feae0b6f15332172c72b0dadae86c6b5de5779fd445e2b7b156fac2bd210dfb49d9aa2a094cc9b720cb8be826e080feae40743f9be9bcb725b33e6a07670d5e465197ec6c3aeb77280680f221ce90b1ecaa9549c83e8e54ec35c01febb10f21f188be74343972135b5d3c58e6a94b0acb8cca44899e9718cc860f7aedad6e037ffb55e706079125ba568deb975dda96cef6fc681a3afec16a4d1248e6bc4a518c886cf761b83fd72fa5d7b41151235c68f60cc3b084a3c77f6b7680e04548640b192c647933f2a6f3e5aab67d5cb7377f27921e9cec443ed93f0b44a453029e230883f1516a13c23bf339e1f5f7f34680301f6f835ec89eabe8951e7708af1f9afcc5eb858356c72a5f65db1343968f268b9d07e4d145cdae0c1a85f9cc75e489a1dab37b78954723b890379453cc17104552ef60c59969242c00092e792461ad95ce3aaa1ff4739dd15bef6327b892ed2205da3da150558eb8c7aff910b7fa35d6306a23da62572685fa412847f54a7c63bb35f2482e35261f847623360618c15f89735ed7add722f19c1793c202f92732703c7dd574e02409f6eec353d9f45a1e5b621d42c6b7237e11179b43bfdb00d6ea18980a62121c34c137d6113c444096e09b938236f72e7e035523bc768f29999c4f4409c0e2750e8e842618d73e9905ce8fe20f2052b16cd9be156b3c054e2288a78ac3e896099c536663ff0eceb0e1bfa42239cdf217a344562832237c6fc33f17138071f4f75331aa0116592863fc353e1659c68154f34d31c6a0931532dd4d951e976b67880915c41059eea23dd65f66b6308d472b5e85bba9f37164f32b14230c68c81c57a1a824d6af71e354060abed70f45272756cb0ad33f26867a43738d443da2a9aba11b68528e9b466617e5f9a81130b4d8886d705d072cee0f808058614c05b859105e7dd15cdb7b205140af103d74972ff6a349f2b6e30f1c8cac06924b2d7c8acc97aa480efca1a0d519d8faeb686687868834d40b060bb4c90bf07ce929ca1a9fe1690238f8af5ce8c266405d05c69b63fb4cbf119286c963aaf30126892d9e469b31bb209ed6145eb6024020fa66367f89c1396596e7df71e2f95b5e7d12a1fb62e78171f2fb14ac9646ebadd3c1554ecc052ea45197010f7c49d93c228adeb6738b4ef7146faa88ef0774fc77872a7835b3e6e03f4fd0b12299ac7667f49cc5794bf1b04507fff9602a16994877251a8b373dc0b22c1e040050c8956b665f5091e2f055d2c1cb883f7405a161c53905473d52593a97681bf9bda9a0150d4edf92a85459b8f0ffbcef2e3ebd4657253ba3a6e3505e20e702eb8aefd14263c649e2d54c606c8e036dc2621bb137072495a6f0a7fbc99300fff99ed6acafb17a5832243d7369c47d7a9045bfea0ea4804cfe34976f79c9a7e57378e08b430c9e82d0cd344883708cfa6239590cc5372bba0f2db39cdc02f6e633388045eab2d2243df8646be12b79df88274792b912a0442f99a00af75fc4c07b04b0739bbfaff19c883a06384d8464836334150d521c720e9a386cc7b100be86b93dc157a91270d351a350dcbee56fd78212525f57255fc43118b6deb9e30e1f7044072f957c716b44f7598ef9dd40dd9b06a8b7e7264f849ea107c983b42314ac031c7a5a25d466a5d19571da9c27f9ce71f0e5b72bd0425162e499a770bf209c9ee8e5786ab4e19f7042ef2a0a00f1c4059ac146e860dfeb055d2a3b85197a36097b259185e02e7c565a3a9e553f301a017868d727abcca18b32d90469310efd654db6cf1d8fa114d7734ac9f3a13ce3c0e7bec723ec0849105b30de714013802b50c38390cc23b2959df96e18027fd5fb76a16722d559b13947c72c9692c0474ab3a05ce6e141c2785875892e892bebe6566b9728b054a7f1211198291ce4e3de783b2a166ec59e3938351994497d9798c07284d7f391060b0726ba0f4f3bc4886f74489af7e3e2e6babb7263d65e03c82359949e8decfe33ded713a1e921deb56e860b441b706650972f9b624f3fc0a1c9920721b44e38369993dce2b4c8bcb7b59abe1b4eeeb9d33466774de69f1abec993a516d7ba57632412638ebc79c16dc287bcd53c1941d75934c124e7af124e0381038dc1e643015501dcf6de259e7127adb3e51760502255b6c84aee24bd1b6efac72fcc521fc6ce8a964c6cdc94bb22a665e8ec70e93ceaf851df3fd2989fa0a1a639645d809e4a3a8867e758d71c7436900c6fc95b7eff145011fe0346012e7d672d057a193571743a0d847fccbc1bc80198e82fe77984fb3839fbcac48350bdb72e3583ea7250446e7ea2caf5548d6fd47113642341d7c6fc02301782635bef0255f6dd2489b3635015ec257cd2b685c3e74f6302e49a1bffebb8758a1c7031472b8408603ce9b0f3015484e2083261d1218969cc730afaeb3d8050030b173bb6d9df59965bb405329ece6c5420a5ea95705926d1d1f68b74315739e746f4c7272626bd2046feb7bea1eb199fdc7d7dc9a5c0178ee39523eb0200cf30d0248ca720ee0476e776df6e46ead7988851294001da6466c1d6792d6e27467fe14ad15722a9e124ef5c068082ea0a9f5b466b49ba9b7e1fa48a5c19a465c0f7b54262b7258ca7489c9c8ae6c6fea0f849c5806eff9eecee8991ae73e5e56bc4043541a726032473599b31c08eddc91a0ca57aff91608d373aaa646ccb84a6491bade16255a233b9ff986a5ffb480595d9fa74670f98b613aa370e6fa80bc09c2172bd5338a80a68659cac8bc6779ccdb84dca7f307428e208c577888e47604df036ea272616654221f83e46a6f17922b9eebb45604a234da9c5e0630345240376378b42c43cfd2de5df271a183792cb139ee3937800a9028e43f4edca87f05e223329d6c02fd70152e82ba3bfc399ca6aaf73d617a529a38ade2048ef7a562404c1e3966904d29e99c7164103383f806d4c99098c8baa626379b0021e9a08586d113a86e0cb7d74be7440dcb43e5c39dc7de5aa613c84eabf0303aa9645c4a1397c8a113bcedf43136f40f4243e07db6b8bc54f4f3c0dd896251ae8b3cdd25618c0593723b5d4a286c71c238487057bf881573a3420f0a00fa5f5bd0295f5dab0b55e072de12254ea4157a59f3f10a5792bd3580dbc3bdd4a46d13a8984a8f737903bf37ed0343d8cb2179b221ccc14912f0d3cba1eddb9970b700cbd1100e9c91a24b727ba547d8a48eb9884c453526c4e91263c2b5184f3c16439c0d5c660c054a900c0a445fe89ed0b5215c86ba38fb2149aff33260a1e2059fd99512d1a5e0191b722672c4f3a4b1ba992c5e61bffa5c1ea3eb991789eb0bd3a5c06587d5cb88827287b425981b3db7994cb3e77d1509bfd2439f0126f20421396b1d01fe77095443a6034ed59d72e3120bfb4a50a321b19d2838bd402212323dcb735bed1fe33647169b37c6eea04e56acdc7eb4ba59c4b23a494bd050dc480a189c837cdc360d724091980365a0ff755aca5539e1bbdd1b84048ecbb10cbe3c4f0f1efe59f7d46bd0b680e987ec2ce39a1fcb917f822ec7733fa023c490172c3a213ff44d4d6f39a3d575d40544d292c03a8583eb25c92843d2cc191578a83920c639a567d54e3c1b3d39c5055e3db59d2531d95b8f0e9d076e98852809011f941369264201847274e295b8ddbbe883d70a2ca57e48ebc6762d7c310e80b259b399155fede11572d96eb8028b3ead10177dc507d4aa30efac79348377465cd1c35fce116312af2ba1b4f8cf253dc8c6b7292e26658785339d48906bbd7f2c28e3353a882d152f1bdb923db79993bce891f90faa74c8fd135bc7449b886960d068720975d730412b6dfbf63e544f58c85d01e41c6487bda23a5e6f0145843f297ea061a818bf55729ef3be1a8f383653e5e2835ff787117dc96805c8e46b058a5a24847341611b727b99753865b9cef573a4ebcbbf03218e9948875aa1346261f52b7ce112b8897280e62ea4fc2bd3f93be79b34f13ca109943e3f1ada9ce4beb364542abf98711698045fbd1be9be559fa6396bde2c704ba4e6736569dc89ed3626579fa51c9f724b31f672d36aef974cc37c67c8a50f8b06f923f1478ecb93ff1b66c52a0e644663a1831c0c45b2ed8db81ab5cbebbe6082dbb6538a2309e63805741708b605552fed26d5391be0e4ee3e0ec2e8d8b5eb334df8294b7d0f9e17cfd5e3d536f46745d003d7fa6e2028327efffc2991754ce3c0d49ba586daeedcb108043420cd" + ] + }, + "shouldOverrideBuilder": false + } + } + } + ] + }, + { + "name": "engine_newPayloadV1", + "summary": "Runs execution payload validation", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_newpayloadv1" + }, + "params": [ + { + "name": "Execution payload", + "required": true, + "schema": { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + } + ], + "result": { + "name": "Payload status", + "schema": { + "title": "Payload status object V1", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED", + "INVALID_BLOCK_HASH" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + } + }, + "examples": [ + { + "name": "engine_newPayloadV1 example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } + } + }, + { + "name": "engine_newPayloadV1 invalid example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "INVALID", + "latestValidHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "validationError": "New payload is invalid" + } + } + } + ] + }, + { + "name": "engine_newPayloadV2", + "summary": "Runs execution payload validation", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_newpayloadv2" + }, + "params": [ + { + "name": "Execution payload", + "required": true, + "schema": { + "oneOf": [ + { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + { + "title": "Execution payload object V2", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + ] + } + } + ], + "result": { + "name": "Payload status", + "schema": { + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + } + }, + "errors": [ + { + "code": -32602, + "message": "Invalid params" + } + ], + "examples": [ + { + "name": "engine_newPayloadV2 example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + } + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } + } + } + ] + }, + { + "name": "engine_newPayloadV3", + "summary": "Runs execution payload validation", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_newpayloadv3" + }, + "params": [ + { + "name": "Execution payload", + "required": true, + "schema": { + "title": "Execution payload object V3", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals", + "blobGasUsed", + "excessBlobGas" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + { + "name": "Expected blob versioned hashes", + "required": true, + "schema": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + }, + { + "name": "Root of the parent beacon block", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Payload status", + "schema": { + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + } + }, + "errors": [ + { + "code": -32602, + "message": "Invalid params" + }, + { + "code": -38005, + "message": "Unsupported fork" + } + ], + "examples": [ + { + "name": "engine_newPayloadV3 example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ], + "blobGasUsed": "0x0", + "excessBlobGas": "0x0" + } + }, + { + "name": "Expected blob versioned hashes", + "value": [ + "0x000657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014" + ] + }, + { + "name": "Root of the parent beacon block", + "value": "0x169630f535b4a41330164c6e5c92b1224c0c407f582d407d0ac3d206cd32fd52" + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } + } + } + ] + }, + { + "name": "eth_accounts", + "summary": "Returns a list of addresses owned by client.", + "params": [], + "result": { + "name": "Accounts", + "schema": { + "title": "Accounts", + "type": "array", + "items": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + } + }, + { + "name": "eth_blockNumber", + "summary": "Returns the number of most recent block.", + "params": [], + "result": { + "name": "Block number", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_call", + "summary": "Executes a new message call immediately without creating a transaction on the block chain.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Return data", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_chainId", + "summary": "Returns the chain ID of the current network.", + "params": [], + "result": { + "name": "Chain ID", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_coinbase", + "summary": "Returns the client coinbase address.", + "params": [], + "result": { + "name": "Coinbase address", + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + }, + { + "name": "eth_createAccessList", + "summary": "Generates an access list for a transaction.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Gas used", + "schema": { + "title": "Access list result", + "type": "object", + "additionalProperties": false, + "properties": { + "accessList": { + "title": "accessList", + "type": "array", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "error": { + "title": "error", + "type": "string" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + }, + { + "name": "eth_estimateGas", + "summary": "Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Gas used", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_feeHistory", + "summary": "Transaction fee history", + "description": "Returns transaction base fee per gas and effective priority fee per gas for the requested/supported block range.", + "params": [ + { + "name": "blockCount", + "description": "Requested range of blocks. Clients will return less than the requested range if not all blocks are available.", + "required": true, + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + }, + { + "name": "newestBlock", + "description": "Highest block of the requested range.", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + }, + { + "name": "rewardPercentiles", + "description": "A monotonically increasing list of percentile values. For each block in the requested range, the transactions will be sorted in ascending order by effective tip per gas and the coresponding effective tip for the percentile will be determined, accounting for gas consumed.", + "required": true, + "schema": { + "title": "rewardPercentiles", + "type": "array", + "items": { + "title": "rewardPercentile", + "description": "Floating point value between 0 and 100.", + "type": "number" + } + } + } + ], + "result": { + "name": "feeHistoryResult", + "description": "Fee history for the returned block range. This can be a subsection of the requested range if not all blocks are available.", + "schema": { + "title": "feeHistoryResults", + "description": "Fee history results.", + "type": "object", + "required": [ + "oldestBlock", + "baseFeePerGas", + "gasUsedRatio" + ], + "additionalProperties": false, + "properties": { + "oldestBlock": { + "title": "oldestBlock", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Lowest number block of returned range." + }, + "baseFeePerGas": { + "title": "baseFeePerGasArray", + "description": "An array of block base fees per gas. This includes the next block after the newest of the returned range, because this value can be derived from the newest block. Zeroes are returned for pre-EIP-1559 blocks.", + "type": "array", + "items": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + }, + "gasUsedRatio": { + "title": "gasUsedRatio", + "description": "An array of block gas used ratios. These are calculated as the ratio of gasUsed and gasLimit.", + "type": "array", + "items": { + "title": "normalized ratio", + "type": "number", + "minimum": 0, + "maximum": 1 + } + }, + "reward": { + "title": "rewardArray", + "description": "A two-dimensional array of effective priority fees per gas at the requested block percentiles.", + "type": "array", + "items": { + "title": "rewardPercentile", + "description": "An array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty.", + "type": "array", + "items": { + "title": "rewardPercentile", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "A given percentile sample of effective priority fees per gas from a single block in ascending order, weighted by gas used. Zeroes are returned if the block is empty." + } + } + } + } + } + } + }, + { + "name": "eth_gasPrice", + "summary": "Returns the current price per gas in wei.", + "params": [], + "result": { + "name": "Gas price", + "schema": { + "title": "Gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_getBalance", + "summary": "Returns the balance of the account of given address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Balance", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_getBlockByHash", + "summary": "Returns information about a block by hash.", + "params": [ + { + "name": "Block hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "name": "Hydrated transactions", + "required": true, + "schema": { + "title": "hydrated", + "type": "boolean" + } + } + ], + "result": { + "name": "Block information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] + } + } + }, + { + "name": "eth_getBlockByNumber", + "summary": "Returns information about a block by number.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + }, + { + "name": "Hydrated transactions", + "required": true, + "schema": { + "title": "hydrated", + "type": "boolean" + } + } + ], + "result": { + "name": "Block information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] + } + } + }, + { + "name": "eth_getBlockReceipts", + "summary": "Returns the receipts of a block by number or hash.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Receipts information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Receipts information", + "type": "array", + "items": { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + } + ] + } + } + }, + { + "name": "eth_getBlockTransactionCountByHash", + "summary": "Returns the number of transactions in a block from a block matching the given block hash.", + "params": [ + { + "name": "Block hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Transaction count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_getBlockTransactionCountByNumber", + "summary": "Returns the number of transactions in a block matching the given block number.", + "params": [ + { + "name": "Block", + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Transaction count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_getCode", + "summary": "Returns code at a given address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Bytecode", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_getFilterChanges", + "summary": "Polling method for a filter, which returns an array of logs which occurred since last poll.", + "params": [ + { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Log objects", + "schema": { + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] + } + } + }, + { + "name": "eth_getFilterLogs", + "summary": "Returns an array of all logs matching filter with given id.", + "params": [ + { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Log objects", + "schema": { + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] + } + } + }, + { + "name": "eth_getLogs", + "summary": "Returns an array of all logs matching filter with given id.", + "params": [ + { + "name": "Filter", + "schema": { + "title": "filter", + "type": "object", + "additionalProperties": false, + "properties": { + "fromBlock": { + "title": "from block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "toBlock": { + "title": "to block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "Address(es)", + "oneOf": [ + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "title": "Addresses", + "type": "array", + "items": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + ] + }, + "topics": { + "title": "Topics", + "type": "array", + "items": { + "title": "Filter Topic List Entry", + "oneOf": [ + { + "title": "Any Topic Match", + "type": "null" + }, + { + "title": "Single Topic Match", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + { + "title": "Multiple Topic Match", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ] + } + } + } + } + } + ], + "result": { + "name": "Log objects", + "schema": { + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] + } + } + }, + { + "name": "eth_getProof", + "summary": "Returns the merkle proof for a given account and optionally some storage keys.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "StorageKeys", + "required": true, + "schema": { + "title": "Storage keys", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + } + } + }, + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Account", + "schema": { + "title": "Account proof", + "type": "object", + "required": [ + "address", + "accountProof", + "balance", + "codeHash", + "nonce", + "storageHash", + "storageProof" + ], + "additionalProperties": false, + "properties": { + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "accountProof": { + "title": "accountProof", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "balance": { + "title": "balance", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "codeHash": { + "title": "codeHash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "storageHash": { + "title": "storageHash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "storageProof": { + "title": "Storage proofs", + "type": "array", + "items": { + "title": "Storage proof", + "type": "object", + "required": [ + "key", + "value", + "proof" + ], + "additionalProperties": false, + "properties": { + "key": { + "title": "key", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "proof": { + "title": "proof", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + } + } + } + } + }, + { + "name": "eth_getStorageAt", + "summary": "Returns the value from a storage position at a given address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Storage slot", + "required": true, + "schema": { + "title": "hex encoded 256 bit unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Value", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_getTransactionByBlockHashAndIndex", + "summary": "Returns information about a transaction by block hash and transaction index position.", + "params": [ + { + "name": "Block hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "name": "Transaction index", + "required": true, + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Transaction information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] + } + } + }, + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "summary": "Returns information about a transaction by block number and transaction index position.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + }, + { + "name": "Transaction index", + "required": true, + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Transaction information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] + } + } + }, + { + "name": "eth_getTransactionByHash", + "summary": "Returns the information about a transaction requested by transaction hash.", + "params": [ + { + "name": "Transaction hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Transaction information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] + } + } + }, + { + "name": "eth_getTransactionCount", + "summary": "Returns the number of transactions sent from an address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Transaction count", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_getTransactionReceipt", + "summary": "Returns the receipt of a transaction by transaction hash.", + "params": [ + { + "name": "Transaction hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Receipt information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + ] + } + } + }, + { + "name": "eth_getUncleCountByBlockHash", + "summary": "Returns the number of uncles in a block from a block matching the given block hash.", + "params": [ + { + "name": "Block hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Uncle count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_getUncleCountByBlockNumber", + "summary": "Returns the number of transactions in a block matching the given block number.", + "params": [ + { + "name": "Block", + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Uncle count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_maxPriorityFeePerGas", + "summary": "Returns the current maxPriorityFeePerGas per gas in wei.", + "params": [], + "result": { + "name": "Max priority fee per gas", + "schema": { + "title": "Max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_newBlockFilter", + "summary": "Creates a filter in the node, to notify when a new block arrives.", + "params": [], + "result": { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_newFilter", + "summary": "Creates a filter object, based on filter options, to notify when the state changes (logs).", + "params": [ + { + "name": "Filter", + "schema": { + "title": "filter", + "type": "object", + "additionalProperties": false, + "properties": { + "fromBlock": { + "title": "from block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "toBlock": { + "title": "to block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "Address(es)", + "oneOf": [ + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "title": "Addresses", + "type": "array", + "items": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + ] + }, + "topics": { + "title": "Topics", + "type": "array", + "items": { + "title": "Filter Topic List Entry", + "oneOf": [ + { + "title": "Any Topic Match", + "type": "null" + }, + { + "title": "Single Topic Match", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + { + "title": "Multiple Topic Match", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ] + } + } + } + } + } + ], + "result": { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_newPendingTransactionFilter", + "summary": "Creates a filter in the node, to notify when new pending transactions arrive.", + "params": [], + "result": { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_sendRawTransaction", + "summary": "Submits a raw transaction. For EIP-4844 transactions, the raw form must be the network form. This means it includes the blobs, KZG commitments, and KZG proofs.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + ], + "result": { + "name": "Transaction hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + }, + { + "name": "eth_sendTransaction", + "summary": "Signs and submits a transaction.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + } + ], + "result": { + "name": "Transaction hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + }, + { + "name": "eth_sign", + "summary": "Returns an EIP-191 signature over the provided data.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Message", + "required": true, + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + ], + "result": { + "name": "Signature", + "schema": { + "title": "65 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{130}$" + } + } + }, + { + "name": "eth_signTransaction", + "summary": "Returns an RLP encoded transaction signed by the specified account.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + } + ], + "result": { + "name": "Encoded transaction", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_syncing", + "summary": "Returns an object with data about the sync status or false.", + "params": [], + "result": { + "name": "Syncing status", + "schema": { + "title": "Syncing status", + "oneOf": [ + { + "title": "Syncing progress", + "type": "object", + "additionalProperties": false, + "properties": { + "startingBlock": { + "title": "Starting block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "currentBlock": { + "title": "Current block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "highestBlock": { + "title": "Highest block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Not syncing", + "description": "Should always return false if not syncing.", + "type": "boolean" + } + ] + } + } + }, + { + "name": "eth_uninstallFilter", + "summary": "Uninstalls a filter with given id.", + "params": [ + { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Success", + "schema": { + "type": "boolean" + } + } + } + ], + "components": {} +} \ No newline at end of file diff --git a/rpctypes/schemas/rpcschemadebugblock.json b/rpctypes/jsonschemas/rpcschemadebugblock.json similarity index 100% rename from rpctypes/schemas/rpcschemadebugblock.json rename to rpctypes/jsonschemas/rpcschemadebugblock.json diff --git a/rpctypes/schemas/rpcschemadebugtrace.json b/rpctypes/jsonschemas/rpcschemadebugtrace.json similarity index 100% rename from rpctypes/schemas/rpcschemadebugtrace.json rename to rpctypes/jsonschemas/rpcschemadebugtrace.json diff --git a/rpctypes/jsonschemas/rpcschemahexarray.json b/rpctypes/jsonschemas/rpcschemahexarray.json new file mode 100644 index 00000000..6f8ca23f --- /dev/null +++ b/rpctypes/jsonschemas/rpcschemahexarray.json @@ -0,0 +1,9 @@ +{ + "title": "Receipt array", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } +} diff --git a/rpctypes/schemas/rpcschemasigntxresponse.json b/rpctypes/jsonschemas/rpcschemasigntxresponse.json similarity index 100% rename from rpctypes/schemas/rpcschemasigntxresponse.json rename to rpctypes/jsonschemas/rpcschemasigntxresponse.json diff --git a/rpctypes/schemas.go b/rpctypes/schemas.go index 44821279..75d704a9 100644 --- a/rpctypes/schemas.go +++ b/rpctypes/schemas.go @@ -4,44 +4,44 @@ import ( _ "embed" ) -//go:embed schemas/rpcschemaethsyncing.json +//go:embed jsonschemas/eth_syncing.json var RPCSchemaEthSyncing string -//go:embed schemas/rpcschemaethblock.json +//go:embed jsonschemas/eth_getBlockByNumber.json var RPCSchemaEthBlock string -//go:embed schemas/rpcschemaaccountlist.json +//go:embed jsonschemas/eth_accounts.json var RPCSchemaAccountList string -//go:embed schemas/rpcschemasigntxresponse.json +//go:embed jsonschemas/rpcschemasigntxresponse.json var RPCSchemaSignTxResponse string -//go:embed schemas/rpcschemaethtransaction.json +//go:embed jsonschemas/eth_getTransactionByHash.json var RPCSchemaEthTransaction string -//go:embed schemas/rpcschemaethreceipt.json +//go:embed jsonschemas/eth_getTransactionReceipt.json var RPCSchemaEthReceipt string -//go:embed schemas/rpcschemafilterchanges.json +//go:embed jsonschemas/eth_getFilterChanges.json var RPCSchemaEthFilter string -//go:embed schemas/rpcschemaethfeehistory.json +//go:embed jsonschemas/eth_feeHistory.json var RPCSchemaEthFeeHistory string -//go:embed schemas/rpcschemaethaccesslist.json +//go:embed jsonschemas/eth_createAccessList.json var RPCSchemaEthAccessList string -//go:embed schemas/rpcschemaethproof.json +//go:embed jsonschemas/eth_getProof.json var RPCSchemaEthProof string -//go:embed schemas/rpcschemadebugtrace.json +//go:embed jsonschemas/rpcschemadebugtrace.json var RPCSchemaDebugTrace string -//go:embed schemas/rpcschemahexarray.json +//go:embed jsonschemas/rpcschemahexarray.json var RPCSchemaHexArray string -//go:embed schemas/rpcschemabadblocks.json +//go:embed jsonschemas/debug_getBadBlocks.json var RPCSchemaBadBlocks string -//go:embed schemas/rpcschemadebugblock.json +//go:embed jsonschemas/rpcschemadebugblock.json var RPCSchemaDebugTraceBlock string diff --git a/rpctypes/schemas/openrpc.json b/rpctypes/schemas/openrpc.json deleted file mode 100644 index 4448c260..00000000 --- a/rpctypes/schemas/openrpc.json +++ /dev/null @@ -1,5873 +0,0 @@ -{ - "openrpc": "1.2.4", - "info": { - "title": "Ethereum JSON-RPC Specification", - "description": "A specification of the standard interface for Ethereum clients.", - "license": { - "name": "CC0-1.0", - "url": "https://creativecommons.org/publicdomain/zero/1.0/legalcode" - }, - "version": "0.0.0" - }, - "methods": [ - { - "name": "eth_getBlockByHash", - "summary": "Returns information about a block by hash.", - "params": [ - { - "name": "Block hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "Hydrated transactions", - "required": true, - "schema": { - "title": "hydrated", - "type": "boolean" - } - } - ], - "result": { - "name": "Block information", - "schema": { - "title": "Block object", - "type": "object", - "required": [ - "parentHash", - "sha3Uncles", - "miner", - "stateRoot", - "transactionsRoot", - "receiptsRoot", - "logsBloom", - "number", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "mixHash", - "nonce", - "size", - "transactions", - "uncles" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "sha3Uncles": { - "title": "Ommers hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "miner": { - "title": "Coinbase", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionsRoot": { - "title": "Transactions root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "difficulty": { - "title": "Difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "number": { - "title": "Number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "mixHash": { - "title": "Mix hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "Nonce", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - }, - "totalDifficulty": { - "title": "Total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "withdrawalsRoot": { - "title": "Withdrawals root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "size": { - "title": "Block size", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactions": { - "anyOf": [ - { - "title": "Transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "Full transactions", - "type": "array", - "items": { - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ] - } - } - ] - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "type": "object", - "title": "Validator withdrawal", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "index of withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "index of validator that generated withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "recipient address for withdrawal value", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "value contained in withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "uncles": { - "title": "Uncles", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - }, - { - "name": "eth_getBlockByNumber", - "summary": "Returns information about a block by number.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - }, - { - "name": "Hydrated transactions", - "required": true, - "schema": { - "title": "hydrated", - "type": "boolean" - } - } - ], - "result": { - "name": "Block information", - "schema": { - "title": "Block object", - "type": "object", - "required": [ - "parentHash", - "sha3Uncles", - "miner", - "stateRoot", - "transactionsRoot", - "receiptsRoot", - "logsBloom", - "number", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "mixHash", - "nonce", - "size", - "transactions", - "uncles" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "sha3Uncles": { - "title": "Ommers hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "miner": { - "title": "Coinbase", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionsRoot": { - "title": "Transactions root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "difficulty": { - "title": "Difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "number": { - "title": "Number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "mixHash": { - "title": "Mix hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "Nonce", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - }, - "totalDifficulty": { - "title": "Total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "withdrawalsRoot": { - "title": "Withdrawals root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "size": { - "title": "Block size", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactions": { - "anyOf": [ - { - "title": "Transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "Full transactions", - "type": "array", - "items": { - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ] - } - } - ] - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "type": "object", - "title": "Validator withdrawal", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "index of withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "index of validator that generated withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "recipient address for withdrawal value", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "value contained in withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "uncles": { - "title": "Uncles", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - }, - { - "name": "eth_getBlockTransactionCountByHash", - "summary": "Returns the number of transactions in a block from a block matching the given block hash.", - "params": [ - { - "name": "Block hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Transaction count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getBlockTransactionCountByNumber", - "summary": "Returns the number of transactions in a block matching the given block number.", - "params": [ - { - "name": "Block", - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Transaction count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getUncleCountByBlockHash", - "summary": "Returns the number of uncles in a block from a block matching the given block hash.", - "params": [ - { - "name": "Block hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Uncle count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getUncleCountByBlockNumber", - "summary": "Returns the number of transactions in a block matching the given block number.", - "params": [ - { - "name": "Block", - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Uncle count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_chainId", - "summary": "Returns the chain ID of the current network.", - "params": [], - "result": { - "name": "Chain ID", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_syncing", - "summary": "Returns an object with data about the sync status or false.", - "params": [], - "result": { - "name": "Syncing status", - "schema": { - "title": "Syncing status", - "oneOf": [ - { - "title": "Syncing progress", - "type": "object", - "properties": { - "startingBlock": { - "title": "Starting block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "currentBlock": { - "title": "Current block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "highestBlock": { - "title": "Highest block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Not syncing", - "description": "Should always return false if not syncing.", - "type": "boolean" - } - ] - } - } - }, - { - "name": "eth_coinbase", - "summary": "Returns the client coinbase address.", - "params": [], - "result": { - "name": "Coinbase address", - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - }, - { - "name": "eth_accounts", - "summary": "Returns a list of addresses owned by client.", - "params": [], - "result": { - "name": "Accounts", - "schema": { - "title": "Accounts", - "type": "array", - "items": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - } - }, - { - "name": "eth_blockNumber", - "summary": "Returns the number of most recent block.", - "params": [], - "result": { - "name": "Block number", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_call", - "summary": "Executes a new message call immediately without creating a transaction on the block chain.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Return data", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_estimateGas", - "summary": "Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Gas used", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_createAccessList", - "summary": "Generates an access list for a transaction.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Gas used", - "schema": { - "title": "Access list result", - "type": "object", - "properties": { - "accessList": { - "title": "accessList", - "type": "array", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "error": { - "title": "error", - "type": "string" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_gasPrice", - "summary": "Returns the current price per gas in wei.", - "params": [], - "result": { - "name": "Gas price", - "schema": { - "title": "Gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_maxPriorityFeePerGas", - "summary": "Returns the current maxPriorityFeePerGas per gas in wei.", - "params": [], - "result": { - "name": "Max priority fee per gas", - "schema": { - "title": "Max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_feeHistory", - "summary": "Transaction fee history", - "description": "Returns transaction base fee per gas and effective priority fee per gas for the requested/supported block range.", - "params": [ - { - "name": "blockCount", - "description": "Requested range of blocks. Clients will return less than the requested range if not all blocks are available.", - "required": true, - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - }, - { - "name": "newestBlock", - "description": "Highest block of the requested range.", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - }, - { - "name": "rewardPercentiles", - "description": "A monotonically increasing list of percentile values. For each block in the requested range, the transactions will be sorted in ascending order by effective tip per gas and the corresponding effective tip for the percentile will be determined, accounting for gas consumed.", - "required": true, - "schema": { - "title": "rewardPercentiles", - "type": "array", - "items": { - "title": "rewardPercentile", - "description": "Floating point value between 0 and 100.", - "type": "number" - } - } - } - ], - "result": { - "name": "feeHistoryResult", - "description": "Fee history for the returned block range. This can be a subsection of the requested range if not all blocks are available.", - "schema": { - "title": "feeHistoryResults", - "description": "Fee history results.", - "type": "object", - "required": [ - "oldestBlock", - "baseFeePerGas", - "gasUsedRatio" - ], - "properties": { - "oldestBlock": { - "title": "oldestBlock", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Lowest number block of returned range." - }, - "baseFeePerGas": { - "title": "baseFeePerGasArray", - "description": "An array of block base fees per gas. This includes the next block after the newest of the returned range, because this value can be derived from the newest block. Zeroes are returned for pre-EIP-1559 blocks.", - "type": "array", - "items": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - }, - "reward": { - "title": "rewardArray", - "description": "A two-dimensional array of effective priority fees per gas at the requested block percentiles.", - "type": "array", - "items": { - "title": "rewardPercentile", - "description": "An array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty.", - "type": "array", - "items": { - "title": "rewardPercentile", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "A given percentile sample of effective priority fees per gas from a single block in ascending order, weighted by gas used. Zeroes are returned if the block is empty." - } - } - } - } - } - } - }, - { - "name": "eth_newFilter", - "summary": "Creates a filter object, based on filter options, to notify when the state changes (logs).", - "params": [ - { - "name": "Filter", - "schema": { - "title": "filter", - "type": "object", - "properties": { - "fromBlock": { - "title": "from block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "toBlock": { - "title": "to block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "Address(es)", - "oneOf": [ - { - "title": "Address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "title": "Addresses", - "type": "array", - "items": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - ] - }, - "topics": { - "title": "Topics", - "type": "array", - "items": { - "title": "Filter Topic List Entry", - "oneOf": [ - { - "title": "Any Topic Match", - "type": "null" - }, - { - "title": "Single Topic Match", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "Multiple Topic Match", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ] - } - } - } - } - } - ], - "result": { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_newBlockFilter", - "summary": "Creates a filter in the node, to notify when a new block arrives.", - "params": [], - "result": { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_newPendingTransactionFilter", - "summary": "Creates a filter in the node, to notify when new pending transactions arrive.", - "params": [], - "result": { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_uninstallFilter", - "summary": "Uninstalls a filter with given id.", - "params": [ - { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Success", - "schema": { - "type": "boolean" - } - } - }, - { - "name": "eth_getFilterChanges", - "summary": "Polling method for a filter, which returns an array of logs which occurred since last poll.", - "params": [ - { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Log objects", - "schema": { - "title": "Filter results", - "oneOf": [ - { - "title": "new block hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - ] - } - } - }, - { - "name": "eth_getFilterLogs", - "summary": "Returns an array of all logs matching filter with given id.", - "params": [ - { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Log objects", - "schema": { - "title": "Filter results", - "oneOf": [ - { - "title": "new block hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - ] - } - } - }, - { - "name": "eth_getLogs", - "summary": "Returns an array of all logs matching filter with given id.", - "params": [ - { - "name": "Filter", - "schema": { - "title": "filter", - "type": "object", - "properties": { - "fromBlock": { - "title": "from block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "toBlock": { - "title": "to block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "Address(es)", - "oneOf": [ - { - "title": "Address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "title": "Addresses", - "type": "array", - "items": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - ] - }, - "topics": { - "title": "Topics", - "type": "array", - "items": { - "title": "Filter Topic List Entry", - "oneOf": [ - { - "title": "Any Topic Match", - "type": "null" - }, - { - "title": "Single Topic Match", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "Multiple Topic Match", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ] - } - } - } - } - } - ], - "result": { - "name": "Log objects", - "schema": { - "title": "Filter results", - "oneOf": [ - { - "title": "new block hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - ] - } - } - }, - { - "name": "eth_mining", - "summary": "Returns whether the client is actively mining new blocks.", - "params": [], - "result": { - "name": "Mining status", - "schema": { - "title": "miningStatus", - "type": "boolean" - } - } - }, - { - "name": "eth_hashrate", - "summary": "Returns the number of hashes per second that the node is mining with.", - "params": [], - "result": { - "name": "Mining status", - "schema": { - "title": "Hashrate", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getWork", - "summary": "Returns the hash of the current block, the seedHash, and the boundary condition to be met (“target”).", - "params": [], - "result": { - "name": "Current work", - "schema": { - "type": "array", - "items": [ - { - "title": "Proof-of-work hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "seed hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - }, - { - "name": "eth_submitWork", - "summary": "Used for submitting a proof-of-work solution.", - "params": [ - { - "name": "nonce", - "required": true, - "schema": { - "title": "8 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - }, - { - "name": "hash", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "digest", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Success", - "schema": { - "type": "boolean" - } - } - }, - { - "name": "eth_submitHashrate", - "summary": "Used for submitting mining hashrate.", - "params": [ - { - "name": "Hashrate", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "ID", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Success", - "schema": { - "type": "boolean" - } - } - }, - { - "name": "eth_sign", - "summary": "Returns an EIP-191 signature over the provided data.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Message", - "required": true, - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - ], - "result": { - "name": "Signature", - "schema": { - "title": "65 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{65}$" - } - } - }, - { - "name": "eth_signTransaction", - "summary": "Returns an RLP encoded transaction signed by the specified account.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - } - ], - "result": { - "name": "Encoded transaction", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_getBalance", - "summary": "Returns the balance of the account of given address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Balance", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getStorageAt", - "summary": "Returns the value from a storage position at a given address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Storage slot", - "required": true, - "schema": { - "title": "hex encoded 256 bit unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Value", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_getTransactionCount", - "summary": "Returns the number of transactions sent from an address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Transaction count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getCode", - "summary": "Returns code at a given address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Bytecode", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_getProof", - "summary": "Returns the merkle proof for a given account and optionally some storage keys.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "StorageKeys", - "required": true, - "schema": { - "title": "Storage keys", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - } - } - }, - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Account", - "schema": { - "title": "Account proof", - "type": "object", - "required": [ - "address", - "accountProof", - "balance", - "codeHash", - "nonce", - "storageHash", - "storageProof" - ], - "properties": { - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "accountProof": { - "title": "accountProof", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "balance": { - "title": "balance", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "codeHash": { - "title": "codeHash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "storageHash": { - "title": "storageHash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "storageProof": { - "title": "Storage proofs", - "type": "array", - "items": { - "title": "Storage proof", - "type": "object", - "required": [ - "key", - "value", - "proof" - ], - "properties": { - "key": { - "title": "key", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "proof": { - "title": "proof", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - } - } - } - } - }, - { - "name": "eth_sendTransaction", - "summary": "Signs and submits a transaction.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - } - ], - "result": { - "name": "Transaction hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - }, - { - "name": "eth_sendRawTransaction", - "summary": "Submits a raw transaction.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - ], - "result": { - "name": "Transaction hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - }, - { - "name": "eth_getTransactionByHash", - "summary": "Returns the information about a transaction requested by transaction hash.", - "params": [ - { - "name": "Transaction hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Transaction information", - "schema": { - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_getTransactionByBlockHashAndIndex", - "summary": "Returns information about a transaction by block hash and transaction index position.", - "params": [ - { - "name": "Block hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "Transaction index", - "required": true, - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Transaction information", - "schema": { - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_getTransactionByBlockNumberAndIndex", - "summary": "Returns information about a transaction by block number and transaction index position.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - }, - { - "name": "Transaction index", - "required": true, - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Transaction information", - "schema": { - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_getTransactionReceipt", - "summary": "Returns the receipt of a transaction by transaction hash.", - "params": [ - { - "name": "Transaction hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Receipt Information", - "schema": { - "type": "object", - "title": "Receipt info", - "required": [ - "blockHash", - "blockNumber", - "from", - "cumulativeGasUsed", - "gasUsed", - "logs", - "logsBloom", - "transactionHash", - "transactionIndex", - "effectiveGasPrice" - ], - "properties": { - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "to": { - "title": "to", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$", - "description": "Address of the receiver or null in a contract creation transaction." - }, - "cumulativeGasUsed": { - "title": "cumulative gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The sum of gas used by this transaction and all preceding transactions in the same block." - }, - "gasUsed": { - "title": "gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The amount of gas used for this specific transaction alone." - }, - "contractAddress": { - "title": "contract address", - "description": "The contract address created, if the transaction was a contract creation, otherwise null.", - "oneOf": [ - { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "name": null, - "type": "null" - } - ] - }, - "logs": { - "title": "logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "logsBloom": { - "title": "logs bloom", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "root": { - "title": "state root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$", - "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." - }, - "status": { - "title": "status", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." - }, - "effectiveGasPrice": { - "title": "effective gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The actual value per gas deducted from the senders account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." - } - } - } - } - }, - { - "name": "debug_getRawHeader", - "summary": "Returns an RLP-encoded header.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Header RLP", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "debug_getRawBlock", - "summary": "Returns an RLP-encoded block.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Block RLP", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "debug_getRawTransaction", - "summary": "Returns an array of EIP-2718 binary-encoded transactions.", - "params": [ - { - "name": "Transaction hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "EIP-2718 binary-encoded transaction", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "debug_getRawReceipts", - "summary": "Returns an array of EIP-2718 binary-encoded receipts.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Receipts", - "schema": { - "title": "Receipt array", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - }, - { - "name": "debug_getBadBlocks", - "summary": "Returns an array of recent bad blocks that the client has seen on the network.", - "params": [], - "result": { - "name": "Blocks", - "schema": { - "title": "Bad block array", - "type": "array", - "items": { - "title": "Bad block", - "type": "object", - "required": [ - "block", - "hash", - "rlp" - ], - "properties": { - "block": { - "title": "Block", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "hash": { - "title": "Hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "rlp": { - "title": "RLP", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - } - }, - { - "name": "engine_exchangeCapabilities", - "summary": "Exchanges list of supported Engine API methods", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine_exchangecapabilities" - }, - "params": [ - { - "name": "Consensus client methods", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "result": { - "name": "Execution client methods", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "name": "engine_forkchoiceUpdatedV1", - "summary": "Updates the forkchoice state", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_forkchoiceupdatedv1" - }, - "params": [ - { - "name": "Forkchoice state", - "required": true, - "schema": { - "title": "Forkchoice state object V1", - "type": "object", - "required": [ - "headBlockHash", - "safeBlockHash", - "finalizedBlockHash" - ], - "properties": { - "headBlockHash": { - "title": "Head block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "safeBlockHash": { - "title": "Safe block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "finalizedBlockHash": { - "title": "Finalized block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - }, - { - "name": "Payload attributes", - "required": false, - "schema": { - "title": "Payload attributes object V1", - "type": "object", - "required": [ - "timestamp", - "prevRandao", - "suggestedFeeRecipient" - ], - "properties": { - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "suggestedFeeRecipient": { - "title": "Suggested fee recipient", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - } - } - ], - "result": { - "name": "Response object", - "schema": { - "title": "Forkchoice updated response", - "type": "object", - "required": [ - "payloadStatus" - ], - "properties": { - "payloadStatus": { - "title": "Payload status", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING" - ], - "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - }, - "payloadId": { - "title": "Payload id", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - } - }, - "errors": [ - { - "code": -38002, - "message": "Invalid forkchoice state" - }, - { - "code": -38003, - "message": "Invalid payload attributes" - } - ] - }, - { - "name": "engine_forkchoiceUpdatedV2", - "summary": "Updates the forkchoice state", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_forkchoiceupdatedv2" - }, - "params": [ - { - "name": "Forkchoice state", - "required": true, - "schema": { - "title": "Forkchoice state object V1", - "type": "object", - "required": [ - "headBlockHash", - "safeBlockHash", - "finalizedBlockHash" - ], - "properties": { - "headBlockHash": { - "title": "Head block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "safeBlockHash": { - "title": "Safe block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "finalizedBlockHash": { - "title": "Finalized block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - }, - { - "name": "Payload attributes", - "required": false, - "schema": { - "title": "Payload attributes object V2", - "type": "object", - "required": [ - "timestamp", - "prevRandao", - "suggestedFeeRecipient", - "withdrawals" - ], - "properties": { - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "suggestedFeeRecipient": { - "title": "Suggested fee recipient", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - } - ], - "result": { - "name": "Response object", - "schema": { - "title": "Forkchoice updated response", - "type": "object", - "required": [ - "payloadStatus" - ], - "properties": { - "payloadStatus": { - "title": "Payload status", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING" - ], - "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - }, - "payloadId": { - "title": "Payload id", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - } - }, - "errors": [ - { - "code": -38002, - "message": "Invalid forkchoice state" - }, - { - "code": -38003, - "message": "Invalid payload attributes" - } - ] - }, - { - "name": "engine_newPayloadV1", - "summary": "Runs execution payload validation", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_newpayloadv1" - }, - "params": [ - { - "name": "Execution payload", - "required": true, - "schema": { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - } - ], - "result": { - "name": "Payload status", - "schema": { - "title": "Payload status object V1", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING", - "ACCEPTED", - "INVALID_BLOCK_HASH" - ] - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - } - } - }, - { - "name": "engine_newPayloadV2", - "summary": "Runs execution payload validation", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_newpayloadv2" - }, - "params": [ - { - "name": "Execution payload", - "required": true, - "schema": { - "oneOf": [ - { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - }, - { - "title": "Execution payload object V2", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions", - "withdrawals" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - ] - } - } - ], - "result": { - "name": "Payload status", - "schema": { - "title": "Payload status object deprecating INVALID_BLOCK_HASH status", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING", - "ACCEPTED" - ] - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - } - }, - "errors": [ - { - "code": -32602, - "message": "Invalid params" - } - ] - }, - { - "name": "engine_getPayloadV1", - "summary": "Obtains execution payload from payload build process", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_getpayloadv1" - }, - "params": [ - { - "name": "Payload id", - "required": true, - "schema": { - "title": "8 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - ], - "result": { - "name": "Execution payload", - "schema": { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - }, - "errors": [ - { - "code": -38001, - "message": "Unknown payload" - } - ] - }, - { - "name": "engine_getPayloadV2", - "summary": "Obtains execution payload from payload build process", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadv2" - }, - "params": [ - { - "name": "Payload id", - "required": true, - "schema": { - "title": "8 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - ], - "result": { - "name": "Response object", - "schema": { - "type": "object", - "required": [ - "executionPayload", - "blockValue" - ], - "properties": { - "executionPayload": { - "title": "Execution payload", - "oneOf": [ - { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - }, - { - "title": "Execution payload object V2", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions", - "withdrawals" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - ] - }, - "blockValue": { - "title": "Expected fee value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "errors": [ - { - "code": -38001, - "message": "Unknown payload" - } - ] - }, - { - "name": "engine_getPayloadBodiesByHashV1", - "summary": "Given block hashes returns bodies of the corresponding execution payloads", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyhashv1" - }, - "params": [ - { - "name": "Array of block hashes", - "required": true, - "schema": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - ], - "result": { - "name": "Execution payload bodies", - "schema": { - "type": "array", - "items": { - "title": "Execution payload body object V1", - "type": "object", - "required": [ - "transactions" - ], - "properties": { - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": [ - "array", - "null" - ], - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - } - }, - "errors": [ - { - "code": -38004, - "message": "Too large request" - } - ] - }, - { - "name": "engine_getPayloadBodiesByRangeV1", - "summary": "Given a range of block numbers returns bodies of the corresponding execution payloads", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyrangev1" - }, - "params": [ - { - "name": "Starting block number", - "required": true, - "schema": { - "title": "hex encoded 64 bit unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - }, - { - "name": "Number of blocks to return", - "required": true, - "schema": { - "title": "hex encoded 64 bit unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - ], - "result": { - "name": "Execution payload bodies", - "schema": { - "type": "array", - "items": { - "title": "Execution payload body object V1", - "type": "object", - "required": [ - "transactions" - ], - "properties": { - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": [ - "array", - "null" - ], - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - } - }, - "errors": [ - { - "code": -38004, - "message": "Too large request" - } - ] - }, - { - "name": "engine_exchangeTransitionConfigurationV1", - "summary": "Exchanges transition configuration", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_exchangetransitionconfigurationv1" - }, - "params": [ - { - "name": "Consensus client configuration", - "required": true, - "schema": { - "title": "Transition configuration object", - "type": "object", - "required": [ - "terminalTotalDifficulty", - "terminalBlockHash", - "terminalBlockNumber" - ], - "properties": { - "terminalTotalDifficulty": { - "title": "Terminal total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "terminalBlockHash": { - "title": "Terminal block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "terminalBlockNumber": { - "title": "Terminal block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - ], - "result": { - "name": "Execution client configuration", - "schema": { - "title": "Transition configuration object", - "type": "object", - "required": [ - "terminalTotalDifficulty", - "terminalBlockHash", - "terminalBlockNumber" - ], - "properties": { - "terminalTotalDifficulty": { - "title": "Terminal total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "terminalBlockHash": { - "title": "Terminal block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "terminalBlockNumber": { - "title": "Terminal block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - ], - "components": {} -} \ No newline at end of file diff --git a/rpctypes/schemas/rpcschemabadblocks.json b/rpctypes/schemas/rpcschemabadblocks.json deleted file mode 100644 index 3059b207..00000000 --- a/rpctypes/schemas/rpcschemabadblocks.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "title": "Bad block array", - "type": "array", - "items": { - "title": "Bad block", - "type": "object", - "required": [ - "block", - "hash", - "rlp" - ], - "properties": { - "block": { - "title": "Block", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "hash": { - "title": "Hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "rlp": { - "title": "RLP", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } -} diff --git a/rpctypes/schemas/rpcschemaethblock.json b/rpctypes/schemas/rpcschemaethblock.json deleted file mode 100644 index bb7d3765..00000000 --- a/rpctypes/schemas/rpcschemaethblock.json +++ /dev/null @@ -1,469 +0,0 @@ -{ - "title": "Block object", - "type": "object", - "required": [ - "parentHash", - "sha3Uncles", - "miner", - "stateRoot", - "transactionsRoot", - "receiptsRoot", - "logsBloom", - "number", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "mixHash", - "nonce", - "size", - "transactions", - "uncles" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "sha3Uncles": { - "title": "Ommers hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "miner": { - "title": "Coinbase", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionsRoot": { - "title": "Transactions root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "difficulty": { - "title": "Difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "number": { - "title": "Number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "mixHash": { - "title": "Mix hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "Nonce", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - }, - "totalDifficulty": { - "title": "Total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "withdrawalsRoot": { - "title": "Withdrawals root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "size": { - "title": "Block size", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactions": { - "anyOf": [ - { - "title": "Transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "Full transactions", - "type": "array", - "items": { - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ] - } - } - ] - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "type": "object", - "title": "Validator withdrawal", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "index of withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "index of validator that generated withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "recipient address for withdrawal value", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "value contained in withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "uncles": { - "title": "Uncles", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } -} diff --git a/rpctypes/schemas/rpcschemaethreceipt.json b/rpctypes/schemas/rpcschemaethreceipt.json deleted file mode 100644 index 089f0c4e..00000000 --- a/rpctypes/schemas/rpcschemaethreceipt.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "type": "object", - "title": "Receipt info", - "required": [ - "blockHash", - "blockNumber", - "from", - "cumulativeGasUsed", - "gasUsed", - "logs", - "logsBloom", - "transactionHash", - "transactionIndex", - "effectiveGasPrice" - ], - "properties": { - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "to": { - "title": "to", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$", - "description": "Address of the receiver or null in a contract creation transaction." - }, - "cumulativeGasUsed": { - "title": "cumulative gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The sum of gas used by this transaction and all preceding transactions in the same block." - }, - "gasUsed": { - "title": "gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The amount of gas used for this specific transaction alone." - }, - "contractAddress": { - "title": "contract address", - "description": "The contract address created, if the transaction was a contract creation, otherwise null.", - "oneOf": [ - { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "name": null, - "type": "null" - } - ] - }, - "logs": { - "title": "logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "logsBloom": { - "title": "logs bloom", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "root": { - "title": "state root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$", - "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." - }, - "status": { - "title": "status", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." - }, - "effectiveGasPrice": { - "title": "effective gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The actual value per gas deducted from the senders account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." - } - } -} diff --git a/rpctypes/schemas/rpcschemaethtransaction.json b/rpctypes/schemas/rpcschemaethtransaction.json deleted file mode 100644 index 78c3aa56..00000000 --- a/rpctypes/schemas/rpcschemaethtransaction.json +++ /dev/null @@ -1,323 +0,0 @@ -{ - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } -} diff --git a/scripts/rpctypes.sh b/scripts/rpctypes.sh new file mode 100755 index 00000000..6bd9293f --- /dev/null +++ b/scripts/rpctypes.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# This script takes an argument of the dest directory for the rpc types json file +# Usage: ./rpctypes.sh rpctypes/schemas/ +readonly url=https://github.com/ethereum/execution-apis.git +readonly dest=tmp/execution-apis +readonly schema_dest=schemas + +git clone --depth=1 $url $dest + +pushd $dest +npm install +npm run build + +methods=($(cat openrpc.json | jq -r '.methods[].name' | sort)) + +mkdir $schema_dest +echo "Methods:" +for method in "${methods[@]}"; do + echo "Generating schemas for: $method" + cat openrpc.json | jq --arg methodName $method '.methods[] | select(.name == $methodName) | .result.schema' > "$schema_dest/$method.json" +done + +popd + +if [ ! -d $1 ] ; then + mkdir $1 +fi + +echo "copying schemas to $1..." +cp -r $dest/$schema_dest/ $1