From 9639d1a8f512d9f88cee3425e171f4b1ce9ce685 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Fri, 29 Sep 2023 13:56:36 +0200 Subject: [PATCH] don't revert on rate limit errors (#170) * don't revert on rate limit errors * make wrappers * don't shadow error name --- contracts/gas-snapshots/ccip.gas-snapshot | 18 ++++++------- .../src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol | 22 +++------------- .../ccip/test/offRamp/EVM2EVMOffRamp.t.sol | 26 ++++++++----------- .../evm_2_evm_offramp/evm_2_evm_offramp.go | 2 +- .../evm_2_evm_offramp_helper.go | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 4 +-- 6 files changed, 28 insertions(+), 46 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 8b1caf2c28..04b764ebb5 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -87,13 +87,13 @@ CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) DefensiveExampleTest:testHappyPathSuccess() (gas: 174828) DefensiveExampleTest:testRecovery() (gas: 399728) E2E:testE2E_3MessagesSuccess_gas() (gas: 863423) -EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 428056) -EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 100322) +EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 426826) +EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 100041) EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18159) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokensSuccess() (gas: 139008) EVM2EVMOffRamp__report:testReportSuccess() (gas: 126666) -EVM2EVMOffRamp__trialExecute:testRateLimitErrorReverts() (gas: 150522) -EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 179946) +EVM2EVMOffRamp__trialExecute:testRateLimitErrorSuccess() (gas: 171346) +EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 179665) EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 228022) EVM2EVMOffRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 2548304) EVM2EVMOffRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 17359) @@ -102,10 +102,10 @@ EVM2EVMOffRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 5153053) EVM2EVMOffRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 2512963) EVM2EVMOffRamp_applyPoolUpdates:testTokenPoolMismatchReverts() (gas: 5155382) EVM2EVMOffRamp_ccipReceive:testReverts() (gas: 17094) -EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 169257) -EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 6004286) -EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145623) -EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2651907) +EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 169122) +EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 5915423) +EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145488) +EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2651772) EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 136534) EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 18990) EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 33939) @@ -133,7 +133,7 @@ EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 20494) EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 47668) EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 20042) EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 196939) -EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 136903) +EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 136622) EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 225488) EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48191) EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 230624) diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index b1c5cd2482..4b1955120c 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -380,7 +380,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion try this.executeSingleMessage(message, offchainTokenData) {} catch (bytes memory err) { if (ReceiverError.selector == bytes4(err) || TokenHandlingError.selector == bytes4(err)) { // If CCIP receiver execution is not successful, bubble up receiver revert data, - // prepended by the 4 bytes of ReceiverError.selector + // prepended by the 4 bytes of ReceiverError.selector or TokenHandlingError.selector // Max length of revert data is Router.MAX_RET_BYTES, max length of err is 4 + Router.MAX_RET_BYTES return (Internal.MessageExecutionState.FAILURE, err); } else { @@ -589,23 +589,9 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion i_sourceChainSelector, abi.encode(sourceTokenData[i], offchainTokenData[i]) ) - {} catch ( - /// @dev we only want to revert on rate limiting errors, any other errors are - /// wrapped in a TokenHandlingError, which is caught above and handled gracefully. - bytes memory err - ) { - bytes4 errSig = bytes4(err); - if ( - RateLimiter.BucketOverfilled.selector == errSig || - RateLimiter.AggregateValueMaxCapacityExceeded.selector == errSig || - RateLimiter.AggregateValueRateLimitReached.selector == errSig || - RateLimiter.TokenMaxCapacityExceeded.selector == errSig || - RateLimiter.TokenRateLimitReached.selector == errSig - ) { - revert TokenRateLimitError(err); - } else { - revert TokenHandlingError(err); - } + {} catch (bytes memory err) { + /// @dev wrap and rethrow the error so we can catch it lower in the stack + revert TokenHandlingError(err); } destTokenAmounts[i].token = address(pool.getToken()); diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol index 2bc9faa0ac..c7acc21f7b 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol @@ -1102,12 +1102,12 @@ contract EVM2EVMOffRamp__trialExecute is EVM2EVMOffRampSetup { IERC20 dstToken0 = IERC20(s_destTokens[0]); uint256 startingBalance = dstToken0.balanceOf(message.receiver); - (Internal.MessageExecutionState newState, bytes memory error) = s_offRamp.trialExecute( + (Internal.MessageExecutionState newState, bytes memory err) = s_offRamp.trialExecute( message, new bytes[](message.tokenAmounts.length) ); assertEq(uint256(Internal.MessageExecutionState.SUCCESS), uint256(newState)); - assertEq("", error); + assertEq("", err); // Check that the tokens were transferred assertEq(startingBalance + amounts[0], dstToken0.balanceOf(message.receiver)); @@ -1126,20 +1126,18 @@ contract EVM2EVMOffRamp__trialExecute is EVM2EVMOffRampSetup { Internal.EVM2EVMMessage memory message = _generateAny2EVMMessageWithTokens(1, amounts); MaybeRevertingBurnMintTokenPool(s_destPools[1]).setShouldRevert(errorMessage); - (Internal.MessageExecutionState newState, bytes memory error) = s_offRamp.trialExecute( + (Internal.MessageExecutionState newState, bytes memory err) = s_offRamp.trialExecute( message, new bytes[](message.tokenAmounts.length) ); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); - assertEq(abi.encodeWithSelector(EVM2EVMOffRamp.TokenHandlingError.selector, errorMessage), error); + assertEq(abi.encodeWithSelector(EVM2EVMOffRamp.TokenHandlingError.selector, errorMessage), err); // Expect the balance to remain the same assertEq(startingBalance, dstToken0.balanceOf(OWNER)); } - // Reverts - - function testRateLimitErrorReverts() public { + function testRateLimitErrorSuccess() public { uint256[] memory amounts = new uint256[](2); amounts[0] = 1000; amounts[1] = 50; @@ -1149,14 +1147,12 @@ contract EVM2EVMOffRamp__trialExecute is EVM2EVMOffRampSetup { Internal.EVM2EVMMessage memory message = _generateAny2EVMMessageWithTokens(1, amounts); MaybeRevertingBurnMintTokenPool(s_destPools[1]).setShouldRevert(errorMessage); - vm.expectRevert( - abi.encodeWithSelector( - EVM2EVMOffRamp.ExecutionError.selector, - abi.encodeWithSelector(EVM2EVMOffRamp.TokenRateLimitError.selector, errorMessage) - ) + (Internal.MessageExecutionState newState, bytes memory err) = s_offRamp.trialExecute( + message, + new bytes[](message.tokenAmounts.length) ); - - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); + assertEq(abi.encodeWithSelector(EVM2EVMOffRamp.TokenHandlingError.selector, errorMessage), err); } } @@ -1244,7 +1240,7 @@ contract EVM2EVMOffRamp__releaseOrMintTokens is EVM2EVMOffRampSetup { for (uint256 i = 0; i < rateLimitErrors.length; ++i) { MaybeRevertingBurnMintTokenPool(s_destPools[1]).setShouldRevert(rateLimitErrors[i]); - vm.expectRevert(abi.encodeWithSelector(EVM2EVMOffRamp.TokenRateLimitError.selector, rateLimitErrors[i])); + vm.expectRevert(abi.encodeWithSelector(EVM2EVMOffRamp.TokenHandlingError.selector, rateLimitErrors[i])); s_offRamp.releaseOrMintTokens( srcTokenAmounts, diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go index d3c376ed23..6ebe5c6f92 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -104,7 +104,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"contractIPool[]\",\"name\":\"pools\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenRateLimitError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getDestinationToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDestinationTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"getPoolByDestToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162006aae38038062006aae833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615fa662000b0860003960008181610309015281816120fd015261239b0152600081816102cd01528181611622015281816116a4015281816120d30152818161291101526129980152600061255401526000818161029101526120ac015260008181610231015261205a015260008181610261015281816120840152818161312401526138100152600081816101f50152818161202c015261264901526000818161136b015281816113b70152818161176501526117b10152615fa66000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806379ba5097116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c7146106a7578063d7e2bb50146106af578063f2fde38b146106c2578063f52121a5146106d557600080fd5b8063b1dc65a41461066e578063b4069b3114610681578063c92b28321461069457600080fd5b8063856c8247116100c8578063856c8247146106045780638da5cb5b14610630578063afcb95d71461064e57600080fd5b806379ba5097146105be57806381ff7048146105c657806385572ffb146105f657600080fd5b8063599f64311161015b578063681fba1611610135578063681fba16146104b8578063704b6c02146104cd578063740f4150146104e05780637437ff9f146104f357600080fd5b8063599f6431146104515780635d86f14114610490578063666cab8d146104a357600080fd5b80631ef381741161018c5780631ef38174146103c55780633a87ac53146103da578063546719cd146103ed57600080fd5b806306285c69146101b3578063142a98fc1461035c578063181f5a771461037c575b600080fd5b6103466040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161035391906146b1565b60405180910390f35b61036f61036a366004614748565b6106e8565b60405161035391906147cf565b6103b86040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b604051610353919061484b565b6103d86103d3366004614ab9565b610763565b005b6103d86103e8366004614bcb565b610c22565b6103f5611032565b604051610353919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610353565b61046b61049e366004614c37565b6110e7565b6104ab611150565b6040516103539190614ca5565b6104c06111bf565b6040516103539190614cb8565b6103d86104db366004614c37565b611278565b6103d86104ee366004615151565b611368565b6105b16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b604051610353919061520c565b6103d86114ea565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610353565b6103d86101ae36600461526f565b610617610612366004614c37565b6115e7565b60405167ffffffffffffffff9091168152602001610353565b60005473ffffffffffffffffffffffffffffffffffffffff1661046b565b604080516001815260006020820181905291810191909152606001610353565b6103d861067c3660046152ef565b61170f565b61046b61068f366004614c37565b6119a0565b6103d86106a23660046153f4565b611a79565b6104c0611afe565b61046b6106bd366004614c37565b611bb3565b6103d86106d0366004614c37565b611bc2565b6103d86106e3366004615462565b611bd3565b60006106f6600160046154f5565b6002610703608085615537565b67ffffffffffffffff16610717919061555e565b60136000610726608087615575565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561075d5761075d614765565b92915050565b84518460ff16601f8211156107d9576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610843576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016107d0565b61084b611e2d565b61085485611eb0565b60095460005b818110156108e05760086000600983815481106108795761087961559c565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556108d9816155cb565b905061085a565b50875160005b81811015610adc5760008a82815181106109025761090261559c565b602002602001015190506000600281111561091f5761091f614765565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff16600281111561095e5761095e614765565b146109c5576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016107d0565b73ffffffffffffffffffffffffffffffffffffffff8116610a12576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610ac257610ac2614765565b02179055509050505080610ad5906155cb565b90506108e6565b508851610af09060099060208c019061461b565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610b76914691309190600090610b489063ffffffff16615603565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61215d565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c0d99989796959493929190615626565b60405180910390a15050505050505050505050565b610c2a611e2d565b60005b83811015610e29576000858583818110610c4957610c4961559c565b610c5f9260206040909202019081019150614c37565b90506000868684818110610c7557610c7561559c565b9050604002016020016020810190610c8d9190614c37565b9050610c9a600c83612208565b610cd0576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610cf2600c8461222a565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4a600c8361224c565b50610dc58173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd91906156bc565b600f9061224c565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610e22906155cb565b9050610c2d565b5060005b8181101561102b576000838383818110610e4957610e4961559c565b610e5f9260206040909202019081019150614c37565b90506000848484818110610e7557610e7561559c565b9050604002016020016020810190610e8d9190614c37565b905073ffffffffffffffffffffffffffffffffffffffff82161580610ec6575073ffffffffffffffffffffffffffffffffffffffff8116155b15610efd576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f08600c83612208565b15610f3f576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4b600c838361226e565b50610fc78173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906156bc565b600f908361226e565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080611024906155cb565b9050610e2d565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff1615159383019390935260045480841660608401520490911660808201526110e290612291565b905090565b600080806110f6600c85612343565b9150915081611149576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b9392505050565b606060098054806020026020016040519081016040528092919081815260200182805480156111b557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161118a575b5050505050905090565b60606111cb600f612372565b67ffffffffffffffff8111156111e3576111e361485e565b60405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b8151811015611274576000611228600f8361237d565b5090508083838151811061123e5761123e61559c565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525061126d816155cb565b9050611212565b5090565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906112b8575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156112ef576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146113f3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044016107d0565b81515181518114611430576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156114da57600083828151811061144f5761144f61559c565b6020026020010151905080600014158015611488575084518051839081106114795761147961559c565b60200260200101516080015181105b156114c9576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107d0565b506114d3816155cb565b9050611433565b506114e58383612399565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107d0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561165a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561075d576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114991906156d9565b6117198787612d49565b600554883590808214611762576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107d0565b467f0000000000000000000000000000000000000000000000000000000000000000146117e3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107d0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561186b5761186b614765565b600281111561187c5761187c614765565b905250905060028160200151600281111561189957611899614765565b1480156118e057506009816000015160ff16815481106118bb576118bb61559c565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611916576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061192485602061555e565b61192f88602061555e565b61193b8b6101446156f6565b61194591906156f6565b61194f91906156f6565b9050368114611993576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107d0565b5050505050505050505050565b600080806119af600c85612343565b9150915081611a02576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906156bc565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611ab9575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611af0576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afb600382612d70565b50565b6060611b0a600c612372565b67ffffffffffffffff811115611b2257611b2261485e565b604051908082528060200260200182016040528015611b4b578160200160208202803683370190505b50905060005b8151811015611274576000611b67600c8361237d565b50905080838381518110611b7d57611b7d61559c565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611bac816155cb565b9050611b51565b600080806110f6600f85612343565b611bca611e2d565b611afb81612f55565b333014611c0c576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611c49565b6040805180820190915260008082526020820152815260200190600190039081611c225790505b506101408401515190915015611cb657611cb38361014001518460200151604051602001611c93919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661304a565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611d2057506040830151611d1e9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb0000000000000000000000000000000000000000000000000000000061352d565b155b15611d2a57505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611d5f8786613549565b611388886080015189604001516040518563ffffffff1660e01b8152600401611d8b949392919061575a565b6000604051808303816000875af1158015611daa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611df0919081019061582c565b915091508161102b57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107d0565b565b600081806020019051810190611ec691906158cd565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16611f1a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda91612151918490615968565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161218199989796959493929190615a37565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006111498373ffffffffffffffffffffffffffffffffffffffff84166135f9565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613605565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613611565b6000611a718473ffffffffffffffffffffffffffffffffffffffff85168461361d565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261231f82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261230391906154f5565b85608001516fffffffffffffffffffffffffffffffff16613640565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000806123668473ffffffffffffffffffffffffffffffffffffffff851661365f565b915091505b9250929050565b600061075d8261366e565b600080808061238c8686613679565b9097909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124289190615acc565b1561245f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151600081900361249c576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001515181146124da576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156124f5576124f561485e565b60405190808252806020026020018201604052801561251e578160200160208202803683370190505b50905060005b828110156125fe576000856000015182815181106125445761254461559c565b60200260200101519050612578817f0000000000000000000000000000000000000000000000000000000000000000613688565b83838151811061258a5761258a61559c565b6020026020010181815250508061018001518383815181106125ae576125ae61559c565b6020026020010151146125ed576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506125f7816155cb565b9050612524565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263320488759261267f92879291600401615b19565b602060405180830381865afa15801561269c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c09190615b4f565b9050806000036126fc576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b84811015612d40576000876000015182815181106127235761272361559c565b60200260200101519050600061273c82606001516106e8565b9050600081600381111561275257612752614765565b148061276f5750600381600381111561276d5761276d614765565b145b6127b75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b831561287457600a5460009063ffffffff166127d387426154f5565b11905080806127f3575060038260038111156127f1576127f1614765565b145b612829576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061283b5761283b61559c565b602002602001015160001461286e5788848151811061285c5761285c61559c565b60200260200101518360800181815250505b506128d1565b600081600381111561288857612888614765565b146128d15760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561294957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15612aec5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156129e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0591906156d9565b60c084015190915067ffffffffffffffff16612a22826001615b68565b67ffffffffffffffff1614612a8f57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612d30565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612b0057612b00614765565b03612b8c5760c083015167ffffffffffffffff16612b1f826001615b68565b67ffffffffffffffff1614612b8c57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612d30565b60008a602001518581518110612ba457612ba461559c565b60200260200101519050612bb984825161380e565b612bc8846060015160016139e4565b600080612bd58684613a8e565b91509150612be78660600151836139e4565b6003826003811115612bfb57612bfb614765565b14158015612c1b57506002826003811115612c1857612c18614765565b14155b15612c5a578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107d0929190615b89565b6000856003811115612c6e57612c6e614765565b03612cdb5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff1691612cb383615ba7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612d21929190615bc4565b60405180910390a35050505050505b612d39816155cb565b9050612703565b50505050505050565b612d6c612d5882840184615be4565b604080516000815260208101909152612399565b5050565b8154600090612d9990700100000000000000000000000000000000900463ffffffff16426154f5565b90508015612e3b5760018301548354612de1916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613640565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612e61916fffffffffffffffffffffffffffffffff9081169116613c31565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612f489084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107d0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60606000865167ffffffffffffffff8111156130685761306861485e565b6040519080825280602002602001820160405280156130ad57816020015b60408051808201909152600080825260208201528152602001906001900390816130865790505b50905060005b87518110156134fc5760006130e48983815181106130d3576130d361559c565b6020026020010151600001516110e7565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c86815181106131165761311661559c565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b88815181106131555761315561559c565b60200260200101518b898151811061316f5761316f61559c565b6020026020010151604051602001613188929190615c19565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016131b7959493929190615c3e565b600060405180830381600087803b1580156131d157600080fd5b505af19250505080156131e2575060015b613405573d808015613210576040519150601f19603f3d011682016040523d82523d6000602084013e613215565b606091505b50600061322182615ca1565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821614806132b457507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061330057507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061334c57507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061339857507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b156133d157816040517f30dabb590000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347491906156bc565b8383815181106134865761348661559c565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff909116905288518990839081106134bf576134bf61559c565b6020026020010151602001518383815181106134dd576134dd61559c565b6020908102919091018101510152506134f5816155cb565b90506130b3565b50600b5461352190829073ffffffffffffffffffffffffffffffffffffffff16613c47565b90505b95945050505050565b600061353883613e2f565b801561114957506111498383613e93565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016135ce919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006111498383613f62565b60006111498383613f6e565b60006111498383613ff8565b6000611a71848473ffffffffffffffffffffffffffffffffffffffff8516614015565b600061352485613650848661555e565b61365a90876156f6565b613c31565b600080808061238c8686614032565b600061075d8261406c565b600080808061238c8686614077565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161372b98979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016137649190615cf1565b604051602081830303815290604052805190602001208761016001516040516020016137909190615d59565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff161461388e5781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff1610156138ff5760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b8082610140015151146139505760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015612d6c57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff16600483015260248201526044016107d0565b600060026139f3608085615537565b67ffffffffffffffff16613a07919061555e565b90506000601381613a19608087615575565b67ffffffffffffffff168152602081019190915260400160002054905081613a43600160046154f5565b901b191681836003811115613a5a57613a5a614765565b901b178060136000613a6d608088615575565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590613ad29087908790600401615d6c565b600060405180830381600087803b158015613aec57600080fd5b505af1925050508015613afd575060015b613c16573d808015613b2b576040519150601f19603f3d011682016040523d82523d6000602084013e613b30565b606091505b50613b3a81615ca1565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613bd25750613b8d81615ca1565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613be25760039250905061236b565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107d0919061484b565b50506040805160208101909152600081526002909250929050565b6000818310613c405781611149565b5090919050565b81516000805b82811015613e1b5760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613c8557613c8561559c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1d9190615ef6565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613daf57858281518110613d5857613d5861559c565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107d0565b613dfd868381518110613dc457613dc461559c565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140a290919063ffffffff16565b613e0790846156f6565b92505080613e14906155cb565b9050613c4d565b50613e2960038260006140df565b50505050565b6000613e5b827f01ffc9a700000000000000000000000000000000000000000000000000000000613e93565b801561075d5750613e8c827fffffffff00000000000000000000000000000000000000000000000000000000613e93565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613f4b575060208210155b8015613f575750600081115b979650505050505050565b60006111498383614462565b600081815260028301602052604081205480151580613f925750613f928484613f62565b611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016107d0565b60008181526002830160205260408120819055611149838361447a565b60008281526002840160205260408120829055611a718484614486565b6000818152600283016020526040812054819080614061576140548585613f62565b92506000915061236b9050565b60019250905061236b565b600061075d82614492565b60008080614085858561449c565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006140d5837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661555e565b6111499190615f56565b825474010000000000000000000000000000000000000000900460ff161580614106575081155b1561411057505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061415690700100000000000000000000000000000000900463ffffffff16426154f5565b905080156142165781831115614198576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546141d29083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613640565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142cd5773ffffffffffffffffffffffffffffffffffffffff8416614275576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107d0565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107d0565b848310156143e05760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061431190826154f5565b61431b878a6154f5565b61432591906156f6565b61432f9190615f56565b905073ffffffffffffffffffffffffffffffffffffffff8616614388576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107d0565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107d0565b6143ea85846154f5565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515611149565b600061114983836144a8565b600061114983836145a2565b600061075d825490565b600061114983836145f1565b600081815260018301602052604081205480156145915760006144cc6001836154f5565b85549091506000906144e0906001906154f5565b90508181146145455760008660000182815481106145005761450061559c565b90600052602060002001549050808760000184815481106145235761452361559c565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061455657614556615f6a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061075d565b600091505061075d565b5092915050565b60008181526001830160205260408120546145e95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561075d565b50600061075d565b60008260000182815481106146085761460861559c565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215614695579160200282015b8281111561469557825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061463b565b506112749291505b80821115611274576000815560010161469d565b60c0810161075d828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611afb57600080fd5b803561474381614722565b919050565b60006020828403121561475a57600080fd5b813561114981614722565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106147cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075d8284614794565b60005b838110156147f85781810151838201526020016147e0565b50506000910152565b600081518084526148198160208601602086016147dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111496020830184614801565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156148b0576148b061485e565b60405290565b6040516101a0810167ffffffffffffffff811182821017156148b0576148b061485e565b6040516080810167ffffffffffffffff811182821017156148b0576148b061485e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156149445761494461485e565b604052919050565b600067ffffffffffffffff8211156149665761496661485e565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611afb57600080fd5b803561474381614970565b600082601f8301126149ae57600080fd5b813560206149c36149be8361494c565b6148fd565b82815260059290921b840181019181810190868411156149e257600080fd5b8286015b84811015614a065780356149f981614970565b83529183019183016149e6565b509695505050505050565b803560ff8116811461474357600080fd5b600067ffffffffffffffff821115614a3c57614a3c61485e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614a7957600080fd5b8135614a876149be82614a22565b818152846020838601011115614a9c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614ad257600080fd5b863567ffffffffffffffff80821115614aea57600080fd5b614af68a838b0161499d565b97506020890135915080821115614b0c57600080fd5b614b188a838b0161499d565b9650614b2660408a01614a11565b95506060890135915080821115614b3c57600080fd5b614b488a838b01614a68565b9450614b5660808a01614738565b935060a0890135915080821115614b6c57600080fd5b50614b7989828a01614a68565b9150509295509295509295565b60008083601f840112614b9857600080fd5b50813567ffffffffffffffff811115614bb057600080fd5b6020830191508360208260061b850101111561236b57600080fd5b60008060008060408587031215614be157600080fd5b843567ffffffffffffffff80821115614bf957600080fd5b614c0588838901614b86565b90965094506020870135915080821115614c1e57600080fd5b50614c2b87828801614b86565b95989497509550505050565b600060208284031215614c4957600080fd5b813561114981614970565b600081518084526020808501945080840160005b83811015614c9a57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614c68565b509495945050505050565b6020815260006111496020830184614c54565b6020808252825182820181905260009190848201906040850190845b81811015614d0657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614cd4565b50909695505050505050565b8015158114611afb57600080fd5b803561474381614d12565b600082601f830112614d3c57600080fd5b81356020614d4c6149be8361494c565b82815260069290921b84018101918181019086841115614d6b57600080fd5b8286015b84811015614a065760408189031215614d885760008081fd5b614d9061488d565b8135614d9b81614970565b81528185013585820152835291830191604001614d6f565b600082601f830112614dc457600080fd5b81356020614dd46149be8361494c565b82815260059290921b84018101918181019086841115614df357600080fd5b8286015b84811015614a0657803567ffffffffffffffff811115614e175760008081fd5b614e258986838b0101614a68565b845250918301918301614df7565b60006101a08284031215614e4657600080fd5b614e4e6148b6565b9050614e5982614738565b8152614e6760208301614992565b6020820152614e7860408301614992565b6040820152614e8960608301614738565b606082015260808201356080820152614ea460a08301614d20565b60a0820152614eb560c08301614738565b60c0820152614ec660e08301614992565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614ef357600080fd5b614eff86838701614a68565b83850152610140925082850135915080821115614f1b57600080fd5b614f2786838701614d2b565b83850152610160925082850135915080821115614f4357600080fd5b50614f5085828601614db3565b82840152505061018080830135818301525092915050565b600082601f830112614f7957600080fd5b81356020614f896149be8361494c565b82815260059290921b84018101918181019086841115614fa857600080fd5b8286015b84811015614a0657803567ffffffffffffffff811115614fcc5760008081fd5b614fda8986838b0101614db3565b845250918301918301614fac565b600082601f830112614ff957600080fd5b813560206150096149be8361494c565b82815260059290921b8401810191818101908684111561502857600080fd5b8286015b84811015614a06578035835291830191830161502c565b60006080828403121561505557600080fd5b61505d6148da565b9050813567ffffffffffffffff8082111561507757600080fd5b818401915084601f83011261508b57600080fd5b8135602061509b6149be8361494c565b82815260059290921b840181019181810190888411156150ba57600080fd5b8286015b848110156150f2578035868111156150d65760008081fd5b6150e48b86838b0101614e33565b8452509183019183016150be565b508652508581013593508284111561510957600080fd5b61511587858801614f68565b9085015250604084013591508082111561512e57600080fd5b5061513b84828501614fe8565b6040830152506060820135606082015292915050565b6000806040838503121561516457600080fd5b823567ffffffffffffffff8082111561517c57600080fd5b61518886838701615043565b935060209150818501358181111561519f57600080fd5b85019050601f810186136151b257600080fd5b80356151c06149be8261494c565b81815260059190911b820183019083810190888311156151df57600080fd5b928401925b828410156151fd578335825292840192908401906151e4565b80955050505050509250929050565b60a0810161075d828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b60006020828403121561528157600080fd5b813567ffffffffffffffff81111561529857600080fd5b820160a0818503121561114957600080fd5b60008083601f8401126152bc57600080fd5b50813567ffffffffffffffff8111156152d457600080fd5b6020830191508360208260051b850101111561236b57600080fd5b60008060008060008060008060e0898b03121561530b57600080fd5b606089018a81111561531c57600080fd5b8998503567ffffffffffffffff8082111561533657600080fd5b818b0191508b601f83011261534a57600080fd5b81358181111561535957600080fd5b8c602082850101111561536b57600080fd5b6020830199508098505060808b013591508082111561538957600080fd5b6153958c838d016152aa565b909750955060a08b01359150808211156153ae57600080fd5b506153bb8b828c016152aa565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461474357600080fd5b60006060828403121561540657600080fd5b6040516060810181811067ffffffffffffffff821117156154295761542961485e565b604052823561543781614d12565b8152615445602084016153d4565b6020820152615456604084016153d4565b60408201529392505050565b6000806040838503121561547557600080fd5b823567ffffffffffffffff8082111561548d57600080fd5b61549986838701614e33565b935060208501359150808211156154af57600080fd5b506154bc85828601614db3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561075d5761075d6154c6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061555257615552615508565b92169190910692915050565b808202811582820484141761075d5761075d6154c6565b600067ffffffffffffffff8084168061559057615590615508565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155fc576155fc6154c6565b5060010190565b600063ffffffff80831681810361561c5761561c6154c6565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526156568184018a614c54565b9050828103608084015261566a8189614c54565b905060ff871660a084015282810360c08401526156878187614801565b905067ffffffffffffffff851660e08401528281036101008401526156ac8185614801565b9c9b505050505050505050505050565b6000602082840312156156ce57600080fd5b815161114981614970565b6000602082840312156156eb57600080fd5b815161114981614722565b8082018082111561075d5761075d6154c6565b600081518084526020808501945080840160005b83811015614c9a578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161571d565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615795610120840182614801565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526157d18383614801565b9250608089015191508085840301610100860152506157f08282615709565b92505050615804602083018661ffff169052565b836040830152613524606083018473ffffffffffffffffffffffffffffffffffffffff169052565b6000806040838503121561583f57600080fd5b825161584a81614d12565b602084015190925067ffffffffffffffff81111561586757600080fd5b8301601f8101851361587857600080fd5b80516158866149be82614a22565b81815286602083850101111561589b57600080fd5b6158ac8260208301602086016147dd565b8093505050509250929050565b805163ffffffff8116811461474357600080fd5b600060a082840312156158df57600080fd5b60405160a0810181811067ffffffffffffffff821117156159025761590261485e565b60405261590e836158b9565b8152602083015161591e81614970565b6020820152604083015161593181614970565b6040820152606083015161ffff8116811461594b57600080fd5b606082015261595c608084016158b9565b60808201529392505050565b61016081016159da828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff16610120840152608084015116610140830152611149565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615a7e8285018b614c54565b91508382036080850152615a92828a614c54565b915060ff881660a085015283820360c0850152615aaf8288614801565b90861660e085015283810361010085015290506156ac8185614801565b600060208284031215615ade57600080fd5b815161114981614d12565b600081518084526020808501945080840160005b83811015614c9a57815187529582019590820190600101615afd565b606081526000615b2c6060830186615ae9565b8281036020840152615b3e8186615ae9565b915050826040830152949350505050565b600060208284031215615b6157600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561459b5761459b6154c6565b67ffffffffffffffff83168152604081016111496020830184614794565b600067ffffffffffffffff80831681810361561c5761561c6154c6565b615bce8184614794565b604060208201526000611a716040830184614801565b600060208284031215615bf657600080fd5b813567ffffffffffffffff811115615c0d57600080fd5b611a7184828501615043565b604081526000615c2c6040830185614801565b82810360208401526135248185614801565b60a081526000615c5160a0830188614801565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff851660608401528281036080840152615c958185614801565b98975050505050505050565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615ce95780818460040360031b1b83161693505b505050919050565b6020815260006111496020830184615709565b600081518084526020808501808196508360051b8101915082860160005b85811015615d4c578284038952615d3a848351614801565b98850198935090840190600101615d22565b5091979650505050505050565b6020815260006111496020830184615d04565b60408152615d8760408201845167ffffffffffffffff169052565b60006020840151615db0606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615e1e8185018367ffffffffffffffff169052565b60e08601519150610120615e498186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615e796101e0870185614801565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615eb88686615709565b9550828a01519450818887030184890152615ed38686615d04565b9550808a01516101c0890152505050505082810360208401526135248185615d04565b600060408284031215615f0857600080fd5b615f1061488d565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615f3c57600080fd5b8152615f4a602084016158b9565b60208201529392505050565b600082615f6557615f65615508565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x6101806040523480156200001257600080fd5b50604051620068f3380380620068f3833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615deb62000b0860003960008181610309015281816120fd015261239b0152600081816102cd01528181611622015281816116a4015281816120d30152818161291101526129980152600061255401526000818161029101526120ac015260008181610231015261205a015260008181610261015281816120840152818161312401526136550152600081816101f50152818161202c015261264901526000818161136b015281816113b70152818161176501526117b10152615deb6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806379ba5097116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c7146106a7578063d7e2bb50146106af578063f2fde38b146106c2578063f52121a5146106d557600080fd5b8063b1dc65a41461066e578063b4069b3114610681578063c92b28321461069457600080fd5b8063856c8247116100c8578063856c8247146106045780638da5cb5b14610630578063afcb95d71461064e57600080fd5b806379ba5097146105be57806381ff7048146105c657806385572ffb146105f657600080fd5b8063599f64311161015b578063681fba1611610135578063681fba16146104b8578063704b6c02146104cd578063740f4150146104e05780637437ff9f146104f357600080fd5b8063599f6431146104515780635d86f14114610490578063666cab8d146104a357600080fd5b80631ef381741161018c5780631ef38174146103c55780633a87ac53146103da578063546719cd146103ed57600080fd5b806306285c69146101b3578063142a98fc1461035c578063181f5a771461037c575b600080fd5b6103466040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161035391906144f6565b60405180910390f35b61036f61036a36600461458d565b6106e8565b6040516103539190614614565b6103b86040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103539190614690565b6103d86103d33660046148fe565b610763565b005b6103d86103e8366004614a10565b610c22565b6103f5611032565b604051610353919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610353565b61046b61049e366004614a7c565b6110e7565b6104ab611150565b6040516103539190614aea565b6104c06111bf565b6040516103539190614afd565b6103d86104db366004614a7c565b611278565b6103d86104ee366004614f96565b611368565b6105b16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b6040516103539190615051565b6103d86114ea565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610353565b6103d86101ae3660046150b4565b610617610612366004614a7c565b6115e7565b60405167ffffffffffffffff9091168152602001610353565b60005473ffffffffffffffffffffffffffffffffffffffff1661046b565b604080516001815260006020820181905291810191909152606001610353565b6103d861067c366004615134565b61170f565b61046b61068f366004614a7c565b6119a0565b6103d86106a2366004615239565b611a79565b6104c0611afe565b61046b6106bd366004614a7c565b611bb3565b6103d86106d0366004614a7c565b611bc2565b6103d86106e33660046152a7565b611bd3565b60006106f66001600461533a565b600261070360808561537c565b67ffffffffffffffff1661071791906153a3565b601360006107266080876153ba565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561075d5761075d6145aa565b92915050565b84518460ff16601f8211156107d9576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610843576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016107d0565b61084b611e2d565b61085485611eb0565b60095460005b818110156108e0576008600060098381548110610879576108796153e1565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556108d981615410565b905061085a565b50875160005b81811015610adc5760008a8281518110610902576109026153e1565b602002602001015190506000600281111561091f5761091f6145aa565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff16600281111561095e5761095e6145aa565b146109c5576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016107d0565b73ffffffffffffffffffffffffffffffffffffffff8116610a12576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610ac257610ac26145aa565b02179055509050505080610ad590615410565b90506108e6565b508851610af09060099060208c0190614460565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610b76914691309190600090610b489063ffffffff16615448565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61215d565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c0d9998979695949392919061546b565b60405180910390a15050505050505050505050565b610c2a611e2d565b60005b83811015610e29576000858583818110610c4957610c496153e1565b610c5f9260206040909202019081019150614a7c565b90506000868684818110610c7557610c756153e1565b9050604002016020016020810190610c8d9190614a7c565b9050610c9a600c83612208565b610cd0576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610cf2600c8461222a565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4a600c8361224c565b50610dc58173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190615501565b600f9061224c565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610e2290615410565b9050610c2d565b5060005b8181101561102b576000838383818110610e4957610e496153e1565b610e5f9260206040909202019081019150614a7c565b90506000848484818110610e7557610e756153e1565b9050604002016020016020810190610e8d9190614a7c565b905073ffffffffffffffffffffffffffffffffffffffff82161580610ec6575073ffffffffffffffffffffffffffffffffffffffff8116155b15610efd576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f08600c83612208565b15610f3f576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4b600c838361226e565b50610fc78173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190615501565b600f908361226e565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a150508061102490615410565b9050610e2d565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff1615159383019390935260045480841660608401520490911660808201526110e290612291565b905090565b600080806110f6600c85612343565b9150915081611149576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b9392505050565b606060098054806020026020016040519081016040528092919081815260200182805480156111b557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161118a575b5050505050905090565b60606111cb600f612372565b67ffffffffffffffff8111156111e3576111e36146a3565b60405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b8151811015611274576000611228600f8361237d565b5090508083838151811061123e5761123e6153e1565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525061126d81615410565b9050611212565b5090565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906112b8575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156112ef576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146113f3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044016107d0565b81515181518114611430576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156114da57600083828151811061144f5761144f6153e1565b602002602001015190508060001415801561148857508451805183908110611479576114796153e1565b60200260200101516080015181105b156114c9576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107d0565b506114d381615410565b9050611433565b506114e58383612399565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107d0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561165a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561075d576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611149919061551e565b6117198787612d49565b600554883590808214611762576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107d0565b467f0000000000000000000000000000000000000000000000000000000000000000146117e3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107d0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561186b5761186b6145aa565b600281111561187c5761187c6145aa565b9052509050600281602001516002811115611899576118996145aa565b1480156118e057506009816000015160ff16815481106118bb576118bb6153e1565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611916576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006119248560206153a3565b61192f8860206153a3565b61193b8b61014461553b565b611945919061553b565b61194f919061553b565b9050368114611993576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107d0565b5050505050505050505050565b600080806119af600c85612343565b9150915081611a02576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107d0565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190615501565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611ab9575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611af0576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afb600382612d70565b50565b6060611b0a600c612372565b67ffffffffffffffff811115611b2257611b226146a3565b604051908082528060200260200182016040528015611b4b578160200160208202803683370190505b50905060005b8151811015611274576000611b67600c8361237d565b50905080838381518110611b7d57611b7d6153e1565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611bac81615410565b9050611b51565b600080806110f6600f85612343565b611bca611e2d565b611afb81612f55565b333014611c0c576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611c49565b6040805180820190915260008082526020820152815260200190600190039081611c225790505b506101408401515190915015611cb657611cb38361014001518460200151604051602001611c93919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661304a565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611d2057506040830151611d1e9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613372565b155b15611d2a57505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611d5f878661338e565b611388886080015189604001516040518563ffffffff1660e01b8152600401611d8b949392919061559f565b6000604051808303816000875af1158015611daa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611df09190810190615671565b915091508161102b57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107d09190614690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107d0565b565b600081806020019051810190611ec69190615712565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16611f1a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda916121519184906157ad565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a6040516020016121819998979695949392919061587c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006111498373ffffffffffffffffffffffffffffffffffffffff841661343e565b60006111498373ffffffffffffffffffffffffffffffffffffffff841661344a565b60006111498373ffffffffffffffffffffffffffffffffffffffff8416613456565b6000611a718473ffffffffffffffffffffffffffffffffffffffff851684613462565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261231f82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612303919061533a565b85608001516fffffffffffffffffffffffffffffffff16613485565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000806123668473ffffffffffffffffffffffffffffffffffffffff85166134a4565b915091505b9250929050565b600061075d826134b3565b600080808061238c86866134be565b9097909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124289190615911565b1561245f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151600081900361249c576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001515181146124da576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156124f5576124f56146a3565b60405190808252806020026020018201604052801561251e578160200160208202803683370190505b50905060005b828110156125fe57600085600001518281518110612544576125446153e1565b60200260200101519050612578817f00000000000000000000000000000000000000000000000000000000000000006134cd565b83838151811061258a5761258a6153e1565b6020026020010181815250508061018001518383815181106125ae576125ae6153e1565b6020026020010151146125ed576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506125f781615410565b9050612524565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263320488759261267f9287929160040161595e565b602060405180830381865afa15801561269c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c09190615994565b9050806000036126fc576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b84811015612d4057600087600001518281518110612723576127236153e1565b60200260200101519050600061273c82606001516106e8565b90506000816003811115612752576127526145aa565b148061276f5750600381600381111561276d5761276d6145aa565b145b6127b75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b831561287457600a5460009063ffffffff166127d3874261533a565b11905080806127f3575060038260038111156127f1576127f16145aa565b145b612829576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061283b5761283b6153e1565b602002602001015160001461286e5788848151811061285c5761285c6153e1565b60200260200101518360800181815250505b506128d1565b6000816003811115612888576128886145aa565b146128d15760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561294957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15612aec5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156129e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a05919061551e565b60c084015190915067ffffffffffffffff16612a228260016159ad565b67ffffffffffffffff1614612a8f57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612d30565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612b0057612b006145aa565b03612b8c5760c083015167ffffffffffffffff16612b1f8260016159ad565b67ffffffffffffffff1614612b8c57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612d30565b60008a602001518581518110612ba457612ba46153e1565b60200260200101519050612bb9848251613653565b612bc884606001516001613829565b600080612bd586846138d3565b91509150612be7866060015183613829565b6003826003811115612bfb57612bfb6145aa565b14158015612c1b57506002826003811115612c1857612c186145aa565b14155b15612c5a578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107d09291906159ce565b6000856003811115612c6e57612c6e6145aa565b03612cdb5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff1691612cb3836159ec565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612d21929190615a09565b60405180910390a35050505050505b612d3981615410565b9050612703565b50505050505050565b612d6c612d5882840184615a29565b604080516000815260208101909152612399565b5050565b8154600090612d9990700100000000000000000000000000000000900463ffffffff164261533a565b90508015612e3b5760018301548354612de1916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613485565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612e61916fffffffffffffffffffffffffffffffff9081169116613a76565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612f489084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107d0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60606000865167ffffffffffffffff811115613068576130686146a3565b6040519080825280602002602001820160405280156130ad57816020015b60408051808201909152600080825260208201528152602001906001900390816130865790505b50905060005b87518110156133415760006130e48983815181106130d3576130d36153e1565b6020026020010151600001516110e7565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c8681518110613116576131166153e1565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b8881518110613155576131556153e1565b60200260200101518b898151811061316f5761316f6153e1565b6020026020010151604051602001613188929190615a5e565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016131b7959493929190615a83565b600060405180830381600087803b1580156131d157600080fd5b505af19250505080156131e2575060015b61324a573d808015613210576040519150601f19603f3d011682016040523d82523d6000602084013e613215565b606091505b50806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107d09190614690565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b99190615501565b8383815181106132cb576132cb6153e1565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690528851899083908110613304576133046153e1565b602002602001015160200151838381518110613322576133226153e1565b60209081029190910181015101525061333a81615410565b90506130b3565b50600b5461336690829073ffffffffffffffffffffffffffffffffffffffff16613a8c565b90505b95945050505050565b600061337d83613c74565b801561114957506111498383613cd8565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001613413919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006111498383613da7565b60006111498383613db3565b60006111498383613e3d565b6000611a71848473ffffffffffffffffffffffffffffffffffffffff8516613e5a565b60006133698561349584866153a3565b61349f908761553b565b613a76565b600080808061238c8686613e77565b600061075d82613eb1565b600080808061238c8686613ebc565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161357098979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016135a99190615ae6565b604051602081830303815290604052805190602001208761016001516040516020016135d59190615b4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff16146136d35781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff1610156137445760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b8082610140015151146137955760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107d0565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015612d6c57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff16600483015260248201526044016107d0565b6000600261383860808561537c565b67ffffffffffffffff1661384c91906153a3565b9050600060138161385e6080876153ba565b67ffffffffffffffff1681526020810191909152604001600020549050816138886001600461533a565b901b19168183600381111561389f5761389f6145aa565b901b1780601360006138b26080886153ba565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906139179087908790600401615b61565b600060405180830381600087803b15801561393157600080fd5b505af1925050508015613942575060015b613a5b573d808015613970576040519150601f19603f3d011682016040523d82523d6000602084013e613975565b606091505b5061397f81615ceb565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613a1757506139d281615ceb565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613a275760039250905061236b565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107d09190614690565b50506040805160208101909152600081526002909250929050565b6000818310613a855781611149565b5090919050565b81516000805b82811015613c605760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613aca57613aca6153e1565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b629190615d3b565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613bf457858281518110613b9d57613b9d6153e1565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107d0565b613c42868381518110613c0957613c096153e1565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613ee790919063ffffffff16565b613c4c908461553b565b92505080613c5990615410565b9050613a92565b50613c6e6003826000613f24565b50505050565b6000613ca0827f01ffc9a700000000000000000000000000000000000000000000000000000000613cd8565b801561075d5750613cd1827fffffffff00000000000000000000000000000000000000000000000000000000613cd8565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613d90575060208210155b8015613d9c5750600081115b979650505050505050565b600061114983836142a7565b600081815260028301602052604081205480151580613dd75750613dd78484613da7565b611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016107d0565b6000818152600283016020526040812081905561114983836142bf565b60008281526002840160205260408120829055611a7184846142cb565b6000818152600283016020526040812054819080613ea657613e998585613da7565b92506000915061236b9050565b60019250905061236b565b600061075d826142d7565b60008080613eca85856142e1565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a7640000613f1a837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166153a3565b6111499190615d9b565b825474010000000000000000000000000000000000000000900460ff161580613f4b575081155b15613f5557505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613f9b90700100000000000000000000000000000000900463ffffffff164261533a565b9050801561405b5781831115613fdd576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546140179083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613485565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156141125773ffffffffffffffffffffffffffffffffffffffff84166140ba576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107d0565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107d0565b848310156142255760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290614156908261533a565b614160878a61533a565b61416a919061553b565b6141749190615d9b565b905073ffffffffffffffffffffffffffffffffffffffff86166141cd576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107d0565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107d0565b61422f858461533a565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515611149565b600061114983836142ed565b600061114983836143e7565b600061075d825490565b60006111498383614436565b600081815260018301602052604081205480156143d657600061431160018361533a565b85549091506000906143259060019061533a565b905081811461438a576000866000018281548110614345576143456153e1565b9060005260206000200154905080876000018481548110614368576143686153e1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061439b5761439b615daf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061075d565b600091505061075d565b5092915050565b600081815260018301602052604081205461442e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561075d565b50600061075d565b600082600001828154811061444d5761444d6153e1565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156144da579160200282015b828111156144da57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614480565b506112749291505b8082111561127457600081556001016144e2565b60c0810161075d828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611afb57600080fd5b803561458881614567565b919050565b60006020828403121561459f57600080fd5b813561114981614567565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614610577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075d82846145d9565b60005b8381101561463d578181015183820152602001614625565b50506000910152565b6000815180845261465e816020860160208601614622565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111496020830184614646565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156146f5576146f56146a3565b60405290565b6040516101a0810167ffffffffffffffff811182821017156146f5576146f56146a3565b6040516080810167ffffffffffffffff811182821017156146f5576146f56146a3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614789576147896146a3565b604052919050565b600067ffffffffffffffff8211156147ab576147ab6146a3565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611afb57600080fd5b8035614588816147b5565b600082601f8301126147f357600080fd5b8135602061480861480383614791565b614742565b82815260059290921b8401810191818101908684111561482757600080fd5b8286015b8481101561484b57803561483e816147b5565b835291830191830161482b565b509695505050505050565b803560ff8116811461458857600080fd5b600067ffffffffffffffff821115614881576148816146a3565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126148be57600080fd5b81356148cc61480382614867565b8181528460208386010111156148e157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561491757600080fd5b863567ffffffffffffffff8082111561492f57600080fd5b61493b8a838b016147e2565b9750602089013591508082111561495157600080fd5b61495d8a838b016147e2565b965061496b60408a01614856565b9550606089013591508082111561498157600080fd5b61498d8a838b016148ad565b945061499b60808a0161457d565b935060a08901359150808211156149b157600080fd5b506149be89828a016148ad565b9150509295509295509295565b60008083601f8401126149dd57600080fd5b50813567ffffffffffffffff8111156149f557600080fd5b6020830191508360208260061b850101111561236b57600080fd5b60008060008060408587031215614a2657600080fd5b843567ffffffffffffffff80821115614a3e57600080fd5b614a4a888389016149cb565b90965094506020870135915080821115614a6357600080fd5b50614a70878288016149cb565b95989497509550505050565b600060208284031215614a8e57600080fd5b8135611149816147b5565b600081518084526020808501945080840160005b83811015614adf57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614aad565b509495945050505050565b6020815260006111496020830184614a99565b6020808252825182820181905260009190848201906040850190845b81811015614b4b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614b19565b50909695505050505050565b8015158114611afb57600080fd5b803561458881614b57565b600082601f830112614b8157600080fd5b81356020614b9161480383614791565b82815260069290921b84018101918181019086841115614bb057600080fd5b8286015b8481101561484b5760408189031215614bcd5760008081fd5b614bd56146d2565b8135614be0816147b5565b81528185013585820152835291830191604001614bb4565b600082601f830112614c0957600080fd5b81356020614c1961480383614791565b82815260059290921b84018101918181019086841115614c3857600080fd5b8286015b8481101561484b57803567ffffffffffffffff811115614c5c5760008081fd5b614c6a8986838b01016148ad565b845250918301918301614c3c565b60006101a08284031215614c8b57600080fd5b614c936146fb565b9050614c9e8261457d565b8152614cac602083016147d7565b6020820152614cbd604083016147d7565b6040820152614cce6060830161457d565b606082015260808201356080820152614ce960a08301614b65565b60a0820152614cfa60c0830161457d565b60c0820152614d0b60e083016147d7565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614d3857600080fd5b614d44868387016148ad565b83850152610140925082850135915080821115614d6057600080fd5b614d6c86838701614b70565b83850152610160925082850135915080821115614d8857600080fd5b50614d9585828601614bf8565b82840152505061018080830135818301525092915050565b600082601f830112614dbe57600080fd5b81356020614dce61480383614791565b82815260059290921b84018101918181019086841115614ded57600080fd5b8286015b8481101561484b57803567ffffffffffffffff811115614e115760008081fd5b614e1f8986838b0101614bf8565b845250918301918301614df1565b600082601f830112614e3e57600080fd5b81356020614e4e61480383614791565b82815260059290921b84018101918181019086841115614e6d57600080fd5b8286015b8481101561484b5780358352918301918301614e71565b600060808284031215614e9a57600080fd5b614ea261471f565b9050813567ffffffffffffffff80821115614ebc57600080fd5b818401915084601f830112614ed057600080fd5b81356020614ee061480383614791565b82815260059290921b84018101918181019088841115614eff57600080fd5b8286015b84811015614f3757803586811115614f1b5760008081fd5b614f298b86838b0101614c78565b845250918301918301614f03565b5086525085810135935082841115614f4e57600080fd5b614f5a87858801614dad565b90850152506040840135915080821115614f7357600080fd5b50614f8084828501614e2d565b6040830152506060820135606082015292915050565b60008060408385031215614fa957600080fd5b823567ffffffffffffffff80821115614fc157600080fd5b614fcd86838701614e88565b9350602091508185013581811115614fe457600080fd5b85019050601f81018613614ff757600080fd5b803561500561480382614791565b81815260059190911b8201830190838101908883111561502457600080fd5b928401925b8284101561504257833582529284019290840190615029565b80955050505050509250929050565b60a0810161075d828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b6000602082840312156150c657600080fd5b813567ffffffffffffffff8111156150dd57600080fd5b820160a0818503121561114957600080fd5b60008083601f84011261510157600080fd5b50813567ffffffffffffffff81111561511957600080fd5b6020830191508360208260051b850101111561236b57600080fd5b60008060008060008060008060e0898b03121561515057600080fd5b606089018a81111561516157600080fd5b8998503567ffffffffffffffff8082111561517b57600080fd5b818b0191508b601f83011261518f57600080fd5b81358181111561519e57600080fd5b8c60208285010111156151b057600080fd5b6020830199508098505060808b01359150808211156151ce57600080fd5b6151da8c838d016150ef565b909750955060a08b01359150808211156151f357600080fd5b506152008b828c016150ef565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461458857600080fd5b60006060828403121561524b57600080fd5b6040516060810181811067ffffffffffffffff8211171561526e5761526e6146a3565b604052823561527c81614b57565b815261528a60208401615219565b602082015261529b60408401615219565b60408201529392505050565b600080604083850312156152ba57600080fd5b823567ffffffffffffffff808211156152d257600080fd5b6152de86838701614c78565b935060208501359150808211156152f457600080fd5b5061530185828601614bf8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561075d5761075d61530b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff808416806153975761539761534d565b92169190910692915050565b808202811582820484141761075d5761075d61530b565b600067ffffffffffffffff808416806153d5576153d561534d565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036154415761544161530b565b5060010190565b600063ffffffff8083168181036154615761546161530b565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261549b8184018a614a99565b905082810360808401526154af8189614a99565b905060ff871660a084015282810360c08401526154cc8187614646565b905067ffffffffffffffff851660e08401528281036101008401526154f18185614646565b9c9b505050505050505050505050565b60006020828403121561551357600080fd5b8151611149816147b5565b60006020828403121561553057600080fd5b815161114981614567565b8082018082111561075d5761075d61530b565b600081518084526020808501945080840160005b83811015614adf578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615562565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c08401526155da610120840182614646565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526156168383614646565b925060808901519150808584030161010086015250615635828261554e565b92505050615649602083018661ffff169052565b836040830152613369606083018473ffffffffffffffffffffffffffffffffffffffff169052565b6000806040838503121561568457600080fd5b825161568f81614b57565b602084015190925067ffffffffffffffff8111156156ac57600080fd5b8301601f810185136156bd57600080fd5b80516156cb61480382614867565b8181528660208385010111156156e057600080fd5b6156f1826020830160208601614622565b8093505050509250929050565b805163ffffffff8116811461458857600080fd5b600060a0828403121561572457600080fd5b60405160a0810181811067ffffffffffffffff82111715615747576157476146a3565b604052615753836156fe565b81526020830151615763816147b5565b60208201526040830151615776816147b5565b6040820152606083015161ffff8116811461579057600080fd5b60608201526157a1608084016156fe565b60808201529392505050565b610160810161581f828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff16610120840152608084015116610140830152611149565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526158c38285018b614a99565b915083820360808501526158d7828a614a99565b915060ff881660a085015283820360c08501526158f48288614646565b90861660e085015283810361010085015290506154f18185614646565b60006020828403121561592357600080fd5b815161114981614b57565b600081518084526020808501945080840160005b83811015614adf57815187529582019590820190600101615942565b606081526000615971606083018661592e565b8281036020840152615983818661592e565b915050826040830152949350505050565b6000602082840312156159a657600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156143e0576143e061530b565b67ffffffffffffffff831681526040810161114960208301846145d9565b600067ffffffffffffffff8083168181036154615761546161530b565b615a1381846145d9565b604060208201526000611a716040830184614646565b600060208284031215615a3b57600080fd5b813567ffffffffffffffff811115615a5257600080fd5b611a7184828501614e88565b604081526000615a716040830185614646565b82810360208401526133698185614646565b60a081526000615a9660a0830188614646565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff851660608401528281036080840152615ada8185614646565b98975050505050505050565b602081526000611149602083018461554e565b600081518084526020808501808196508360051b8101915082860160005b85811015615b41578284038952615b2f848351614646565b98850198935090840190600101615b17565b5091979650505050505050565b6020815260006111496020830184615af9565b60408152615b7c60408201845167ffffffffffffffff169052565b60006020840151615ba5606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615c138185018367ffffffffffffffff169052565b60e08601519150610120615c3e8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615c6e6101e0870185614646565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615cad868661554e565b9550828a01519450818887030184890152615cc88686615af9565b9550808a01516101c0890152505050505082810360208401526133698185615af9565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615d335780818460040360031b1b83161693505b505050919050565b600060408284031215615d4d57600080fd5b615d556146d2565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615d8157600080fd5b8152615d8f602084016156fe565b60208201529392505050565b600082615daa57615daa61534d565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go index 384c8d34b0..cb6b557723 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go @@ -104,7 +104,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampHelperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"contractIPool[]\",\"name\":\"pools\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenRateLimitError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IS_SCRIPT\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"rep\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"manualExecGasLimits\",\"type\":\"uint256[]\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getDestinationToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDestinationTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"bitmapIndex\",\"type\":\"uint64\"}],\"name\":\"getExecutionStateBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"getPoolByDestToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"releaseOrMintTokens\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"executableMessages\",\"type\":\"bytes\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"}],\"name\":\"setExecutionStateHelper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"trialExecute\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040526014805460ff191660011790553480156200001f57600080fd5b5060405162006f3538038062006f358339810160408190526200004291620008a6565b838383838033806000816200009e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d1816200048d565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001815760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b03161580620001a4575083516001600160a01b0316155b15620001c3576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620009bd565b6001600160401b03166001146200025657604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002cd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000538565b6101205260005b83518110156200047e576200032e848281518110620002f757620002f7620009db565b6020026020010151848381518110620003145762000314620009db565b6020026020010151600c6200059f60201b9092919060201c565b50620003e3838281518110620003485762000348620009db565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b49190620009f1565b848381518110620003c957620003c9620009db565b6020026020010151600f6200059f60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c8482815181106200041a576200041a620009db565b6020026020010151848381518110620004375762000437620009db565b6020026020010151604051620004639291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004768162000a18565b9050620002d4565b50505050505050505062000a40565b336001600160a01b03821603620004e75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000095565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200058294939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005b7846001600160a01b03851684620005bf565b949350505050565b6000620005b784846001600160a01b03851660008281526002840160205260408120829055620005b784846000620005f8838362000601565b90505b92915050565b60008181526001830160205260408120546200064a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fb565b506000620005fb565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200068e576200068e62000653565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006bf57620006bf62000653565b604052919050565b6001600160a01b0381168114620006dd57600080fd5b50565b80516001600160401b0381168114620006f857600080fd5b919050565b60006001600160401b0382111562000719576200071962000653565b5060051b60200190565b600082601f8301126200073557600080fd5b815160206200074e6200074883620006fd565b62000694565b82815260059290921b840181019181810190868411156200076e57600080fd5b8286015b84811015620007965780516200078881620006c7565b835291830191830162000772565b509695505050505050565b600082601f830112620007b357600080fd5b81516020620007c66200074883620006fd565b82815260059290921b84018101918181019086841115620007e657600080fd5b8286015b84811015620007965780516200080081620006c7565b8352918301918301620007ea565b80516001600160801b0381168114620006f857600080fd5b6000606082840312156200083957600080fd5b604051606081016001600160401b03811182821017156200085e576200085e62000653565b8060405250809150825180151581146200087757600080fd5b815262000887602084016200080e565b60208201526200089a604084016200080e565b60408201525092915050565b600080600080848603610160811215620008bf57600080fd5b60c0811215620008ce57600080fd5b50620008d962000669565b8551620008e681620006c7565b8152620008f660208701620006e0565b60208201526200090960408701620006e0565b604082015260608601516200091e81620006c7565b606082015260808601516200093381620006c7565b608082015260a08601516200094881620006c7565b60a082015260c08601519094506001600160401b03808211156200096b57600080fd5b620009798883890162000723565b945060e08701519150808211156200099057600080fd5b506200099f87828801620007a1565b925050620009b286610100870162000826565b905092959194509250565b600060208284031215620009d057600080fd5b620005f882620006e0565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0457600080fd5b815162000a1181620006c7565b9392505050565b60006001820162000a3957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051610140516101605161640362000b3260003960008181610381015281816123190152612cdb015260008181610345015281816118090152818161188b015281816122ef0152818161325101526132d801526000612e94015260008181610309015281816122c801526136f30152600081816102a90152818161227601526136d20152600081816102d9015281816122a0015281816128d0015281816136b10152613f1e01526000818161026d015281816122480152612f890152600081816115520152818161159e0152818161194c015261199801526164036000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637437ff9f1161012a578063b4069b31116100bd578063d3c7c2c71161008c578063f2fde38b11610071578063f2fde38b146107f4578063f52121a514610807578063f8ccbf471461081a57600080fd5b8063d3c7c2c7146107d9578063d7e2bb50146107e157600080fd5b8063b4069b3114610798578063b5767166146107ab578063c5a1d7f0146107be578063c92b2832146107c657600080fd5b8063856c8247116100f9578063856c82471461071b5780638da5cb5b14610747578063afcb95d714610765578063b1dc65a41461078557600080fd5b80637437ff9f1461060a57806379ba5097146106d557806381ff7048146106dd57806385572ffb1461070d57600080fd5b8063546719cd116101bd578063681fba161161018c5780636c6bd845116101715780636c6bd845146105d1578063704b6c02146105e4578063740f4150146105f757600080fd5b8063681fba161461059c578063693928ae146105b157600080fd5b8063546719cd146104d1578063599f6431146105355780635d86f14114610574578063666cab8d1461058757600080fd5b80632dea00f3116101f95780632dea00f3146104525780633a87ac53146104655780634f9f03fe14610478578063506449721461049957600080fd5b806306285c691461022b578063142a98fc146103d4578063181f5a77146103f45780631ef381741461043d575b600080fd5b6103be6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103cb919061498a565b60405180910390f35b6103e76103e2366004614a21565b610837565b6040516103cb9190614aa8565b6104306040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103cb9190614b24565b61045061044b366004614d92565b6108b2565b005b610450610460366004614e5f565b610d71565b610450610473366004614ee1565b610d7f565b61048b6104863660046151b7565b61118f565b6040516103cb92919061521b565b6104c36104a7366004614a21565b67ffffffffffffffff1660009081526013602052604090205490565b6040519081526020016103cb565b6104d96111a9565b6040516103cb919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103cb565b61054f61058236600461523b565b61125e565b61058f6112c7565b6040516103cb91906152a9565b6105a4611336565b6040516103cb91906152bc565b6105c46105bf36600461539d565b6113ef565b6040516103cb91906154c1565b6104506105df3660046156bd565b611455565b6104506105f236600461523b565b61145f565b6104506106053660046156bd565b61154f565b6106c86040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b6040516103cb9190615778565b6104506116d1565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016103cb565b6104506102263660046157db565b61072e61072936600461523b565b6117ce565b60405167ffffffffffffffff90911681526020016103cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661054f565b6040805160018152600060208201819052918101919091526060016103cb565b610450610793366004615816565b6118f6565b61054f6107a636600461523b565b611b87565b6104506107b93660046158cd565b611c60565b6104c3611c6a565b6104506107d436600461592f565b611c95565b6105a4611d1a565b61054f6107ef36600461523b565b611dcf565b61045061080236600461523b565b611dde565b6104506108153660046151b7565b611def565b6014546108279060ff1681565b60405190151581526020016103cb565b6000610845600160046159cc565b6002610852608085615a0e565b67ffffffffffffffff166108669190615a35565b60136000610875608087615a4c565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156108ac576108ac614a3e565b92915050565b84518460ff16601f821115610928576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610992576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f7369746976650000000000000000000000000000604482015260640161091f565b61099a612049565b6109a3856120cc565b60095460005b81811015610a2f5760086000600983815481106109c8576109c8615a73565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610a2881615aa2565b90506109a9565b50875160005b81811015610c2b5760008a8281518110610a5157610a51615a73565b6020026020010151905060006002811115610a6e57610a6e614a3e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610aad57610aad614a3e565b14610b14576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116610b61576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610c1157610c11614a3e565b02179055509050505080610c2490615aa2565b9050610a35565b508851610c3f9060099060208c01906148f4565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610cc5914691309190600090610c979063ffffffff16615ada565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d612379565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610d5c99989796959493929190615afd565b60405180910390a15050505050505050505050565b610d7b8282612424565b5050565b610d87612049565b60005b83811015610f86576000858583818110610da657610da6615a73565b610dbc926020604090920201908101915061523b565b90506000868684818110610dd257610dd2615a73565b9050604002016020016020810190610dea919061523b565b9050610df7600c836124ce565b610e2d576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e4f600c846124f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea7600c83612512565b50610f228173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a9190615b93565b600f90612512565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610f7f90615aa2565b9050610d8a565b5060005b81811015611188576000838383818110610fa657610fa6615a73565b610fbc926020604090920201908101915061523b565b90506000848484818110610fd257610fd2615a73565b9050604002016020016020810190610fea919061523b565b905073ffffffffffffffffffffffffffffffffffffffff82161580611023575073ffffffffffffffffffffffffffffffffffffffff8116155b1561105a576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611065600c836124ce565b1561109c576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110a8600c8383612534565b506111248173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190615b93565b600f9083612534565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a150508061118190615aa2565b9050610f8a565b5050505050565b6000606061119d8484612557565b915091505b9250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152611259906126fa565b905090565b6000808061126d600c856127ac565b91509150816112c0576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561132c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611301575b5050505050905090565b6060611342600f6127cf565b67ffffffffffffffff81111561135a5761135a614b37565b604051908082528060200260200182016040528015611383578160200160208202803683370190505b50905060005b81518110156113eb57600061139f600f836127da565b509050808383815181106113b5576113b5615a73565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152506113e481615aa2565b9050611389565b5090565b60606114488989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061143991508990508a615bb0565b6114438789615bb0565b6127f6565b9998505050505050505050565b610d7b8282612cd9565b60005473ffffffffffffffffffffffffffffffffffffffff16331480159061149f575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156114d6576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146115da576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff4616602482015260440161091f565b81515181518114611617576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156116c157600083828151811061163657611636615a73565b602002602001015190508060001415801561166f5750845180518390811061166057611660615a73565b60200260200101516080015181105b156116b0576040517f085e39cf000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161091f565b506116ba81615aa2565b905061161a565b506116cc8383612cd9565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161091f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561184157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156108ac576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190615bbd565b6119008787613689565b600554883590808214611949576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161091f565b467f0000000000000000000000000000000000000000000000000000000000000000146119ca576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161091f565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611a5257611a52614a3e565b6002811115611a6357611a63614a3e565b9052509050600281602001516002811115611a8057611a80614a3e565b148015611ac757506009816000015160ff1681548110611aa257611aa2615a73565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611afd576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611b0b856020615a35565b611b16886020615a35565b611b228b610144615bda565b611b2c9190615bda565b611b369190615bda565b9050368114611b7a576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161091f565b5050505050505050505050565b60008080611b96600c856127ac565b9150915081611be9576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c589190615b93565b949350505050565b610d7b8282613689565b60006112597f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36136ac565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611cd5575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611d0c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d17600382613779565b50565b6060611d26600c6127cf565b67ffffffffffffffff811115611d3e57611d3e614b37565b604051908082528060200260200182016040528015611d67578160200160208202803683370190505b50905060005b81518110156113eb576000611d83600c836127da565b50905080838381518110611d9957611d99615a73565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611dc881615aa2565b9050611d6d565b6000808061126d600f856127ac565b611de6612049565b611d178161395e565b333014611e28576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611e65565b6040805180820190915260008082526020820152815260200190600190039081611e3e5790505b506101408401515190915015611ed257611ecf8361014001518460200151604051602001611eaf919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528560400151866101600151866127f6565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611f3c57506040830151611f3a9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613a53565b155b15611f4657505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611f7b8786613a6f565b611388886080015189604001516040518563ffffffff1660e01b8152600401611fa79493929190615bed565b6000604051808303816000875af1158015611fc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261200c9190810190615cbf565b915091508161118857806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161091f565b565b6000818060200190518101906120e29190615d60565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16612136576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda9161236d918490615dfb565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161239d99989796959493929190615eca565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006002612433608085615a0e565b67ffffffffffffffff166124479190615a35565b90506000601381612459608087615a4c565b67ffffffffffffffff168152602081019190915260400160002054905081612483600160046159cc565b901b19168183600381111561249a5761249a614a3e565b901b1780601360006124ad608088615a4c565b67ffffffffffffffff16815260208101919091526040016000205550505050565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b1f565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b2b565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613b37565b6000611c588473ffffffffffffffffffffffffffffffffffffffff851684613b43565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061259b9087908790600401615fb1565b600060405180830381600087803b1580156125b557600080fd5b505af19250505080156125c6575060015b6126df573d8080156125f4576040519150601f19603f3d011682016040523d82523d6000602084013e6125f9565b606091505b506126038161613b565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061269b57506126568161613b565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b156126ab576003925090506111a2565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b50506040805160208101909152600081526002909250929050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261278882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261276c91906159cc565b85608001516fffffffffffffffffffffffffffffffff16613b66565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60008061119d8473ffffffffffffffffffffffffffffffffffffffff8516613b85565b60006108ac82613b94565b60008080806127e98686613b9f565b9097909650945050505050565b60606000865167ffffffffffffffff81111561281457612814614b37565b60405190808252806020026020018201604052801561285957816020015b60408051808201909152600080825260208201528152602001906001900390816128325790505b50905060005b8751811015612ca857600061289089838151811061287f5761287f615a73565b60200260200101516000015161125e565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c86815181106128c2576128c2615a73565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b888151811061290157612901615a73565b60200260200101518b898151811061291b5761291b615a73565b602002602001015160405160200161293492919061618b565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016129639594939291906161b0565b600060405180830381600087803b15801561297d57600080fd5b505af192505050801561298e575060015b612bb1573d8080156129bc576040519150601f19603f3d011682016040523d82523d6000602084013e6129c1565b606091505b5060006129cd8261613b565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082161480612a6057507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612aac57507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612af857507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80612b4457507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b15612b7d57816040517f30dabb5900000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161091f9190614b24565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c209190615b93565b838381518110612c3257612c32615a73565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690528851899083908110612c6b57612c6b615a73565b602002602001015160200151838381518110612c8957612c89615a73565b602090810291909101810151015250612ca181615aa2565b905061285f565b50600b54612ccd90829073ffffffffffffffffffffffffffffffffffffffff16613bae565b90505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d689190616213565b15612d9f576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003612ddc576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612e1a576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612e3557612e35614b37565b604051908082528060200260200182016040528015612e5e578160200160208202803683370190505b50905060005b82811015612f3e57600085600001518281518110612e8457612e84615a73565b60200260200101519050612eb8817f0000000000000000000000000000000000000000000000000000000000000000613d96565b838381518110612eca57612eca615a73565b602002602001018181525050806101800151838381518110612eee57612eee615a73565b602002602001015114612f2d576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612f3781615aa2565b9050612e64565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633204887592612fbf92879291600401616260565b602060405180830381865afa158015612fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130009190616296565b90508060000361303c576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156136805760008760000151828151811061306357613063615a73565b60200260200101519050600061307c8260600151610837565b9050600081600381111561309257613092614a3e565b14806130af575060038160038111156130ad576130ad614a3e565b145b6130f75760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b83156131b457600a5460009063ffffffff1661311387426159cc565b11905080806131335750600382600381111561313157613131614a3e565b145b613169576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061317b5761317b615a73565b60200260200101516000146131ae5788848151811061319c5761319c615a73565b60200260200101518360800181815250505b50613211565b60008160038111156131c8576131c8614a3e565b146132115760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561328957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561342c5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615bbd565b60c084015190915067ffffffffffffffff166133628260016162af565b67ffffffffffffffff16146133cf57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613670565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561344057613440614a3e565b036134cc5760c083015167ffffffffffffffff1661345f8260016162af565b67ffffffffffffffff16146134cc57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613670565b60008a6020015185815181106134e4576134e4615a73565b602002602001015190506134f9848251613f1c565b61350884606001516001612424565b6000806135158684612557565b91509150613527866060015183612424565b600382600381111561353b5761353b614a3e565b1415801561355b5750600282600381111561355857613558614a3e565b14155b1561359a578560600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161091f9291906162d0565b60008560038111156135ae576135ae614a3e565b0361361b5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff16916135f3836162ee565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161366192919061521b565b60405180910390a35050505050505b61367981615aa2565b9050613043565b50505050505050565b610d7b6136988284018461630b565b604080516000815260208101909152612cd9565b6000817f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060405160200161375c949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b604051602081830303815290604052805190602001209050919050565b81546000906137a290700100000000000000000000000000000000900463ffffffff16426159cc565b9050801561384457600183015483546137ea916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613b66565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461386a916fffffffffffffffffffffffffffffffff90811691166140f2565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906139519084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036139dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161091f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613a5e83614108565b80156112c057506112c0838361416c565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001613af4919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006112c0838361423b565b60006112c08383614247565b60006112c083836142d1565b6000611c58848473ffffffffffffffffffffffffffffffffffffffff85166142ee565b6000612cd085613b768486615a35565b613b809087615bda565b6140f2565b60008080806127e9868661430b565b60006108ac82614345565b60008080806127e98686614350565b81516000805b82811015613d825760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613bec57613bec615a73565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c849190616340565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d1657858281518110613cbf57613cbf615a73565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161091f565b613d64868381518110613d2b57613d2b615a73565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661437b90919063ffffffff16565b613d6e9084615bda565b92505080613d7b90615aa2565b9050613bb4565b50613d9060038260006143b8565b50505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613e3998979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613e7291906154c1565b60405160208183030381529060405280519060200120876101600151604051602001613e9e91906163a0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff1614613f9c5781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff16101561400d5760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b80826101400151511461405e5760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015610d7b57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff166004830152602482015260440161091f565b600081831061410157816112c0565b5090919050565b6000614134827f01ffc9a70000000000000000000000000000000000000000000000000000000061416c565b80156108ac5750614165827fffffffff0000000000000000000000000000000000000000000000000000000061416c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015614224575060208210155b80156142305750600081115b979650505050505050565b60006112c0838361473b565b60008181526002830160205260408120548015158061426b575061426b848461423b565b6112c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161091f565b600081815260028301602052604081208190556112c08383614753565b60008281526002840160205260408120829055611c58848461475f565b600081815260028301602052604081205481908061433a5761432d858561423b565b9250600091506111a29050565b6001925090506111a2565b60006108ac8261476b565b6000808061435e8585614775565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006143ae837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615a35565b6112c091906163b3565b825474010000000000000000000000000000000000000000900460ff1615806143df575081155b156143e957505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061442f90700100000000000000000000000000000000900463ffffffff16426159cc565b905080156144ef5781831115614471576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546144ab9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613b66565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156145a65773ffffffffffffffffffffffffffffffffffffffff841661454e576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161091f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161091f565b848310156146b95760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906145ea90826159cc565b6145f4878a6159cc565b6145fe9190615bda565b61460891906163b3565b905073ffffffffffffffffffffffffffffffffffffffff8616614661576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161091f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161091f565b6146c385846159cc565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260018301602052604081205415156112c0565b60006112c08383614781565b60006112c0838361487b565b60006108ac825490565b60006112c083836148ca565b6000818152600183016020526040812054801561486a5760006147a56001836159cc565b85549091506000906147b9906001906159cc565b905081811461481e5760008660000182815481106147d9576147d9615a73565b90600052602060002001549050808760000184815481106147fc576147fc615a73565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061482f5761482f6163c7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108ac565b60009150506108ac565b5092915050565b60008181526001830160205260408120546148c2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108ac565b5060006108ac565b60008260000182815481106148e1576148e1615a73565b9060005260206000200154905092915050565b82805482825590600052602060002090810192821561496e579160200282015b8281111561496e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614914565b506113eb9291505b808211156113eb5760008155600101614976565b60c081016108ac828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611d1757600080fd5b8035614a1c816149fb565b919050565b600060208284031215614a3357600080fd5b81356112c0816149fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614aa4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016108ac8284614a6d565b60005b83811015614ad1578181015183820152602001614ab9565b50506000910152565b60008151808452614af2816020860160208601614ab6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112c06020830184614ada565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614b8957614b89614b37565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614b8957614b89614b37565b6040516080810167ffffffffffffffff81118282101715614b8957614b89614b37565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c1d57614c1d614b37565b604052919050565b600067ffffffffffffffff821115614c3f57614c3f614b37565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611d1757600080fd5b8035614a1c81614c49565b600082601f830112614c8757600080fd5b81356020614c9c614c9783614c25565b614bd6565b82815260059290921b84018101918181019086841115614cbb57600080fd5b8286015b84811015614cdf578035614cd281614c49565b8352918301918301614cbf565b509695505050505050565b803560ff81168114614a1c57600080fd5b600067ffffffffffffffff821115614d1557614d15614b37565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614d5257600080fd5b8135614d60614c9782614cfb565b818152846020838601011115614d7557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614dab57600080fd5b863567ffffffffffffffff80821115614dc357600080fd5b614dcf8a838b01614c76565b97506020890135915080821115614de557600080fd5b614df18a838b01614c76565b9650614dff60408a01614cea565b95506060890135915080821115614e1557600080fd5b614e218a838b01614d41565b9450614e2f60808a01614a11565b935060a0890135915080821115614e4557600080fd5b50614e5289828a01614d41565b9150509295509295509295565b60008060408385031215614e7257600080fd5b8235614e7d816149fb565b9150602083013560048110614e9157600080fd5b809150509250929050565b60008083601f840112614eae57600080fd5b50813567ffffffffffffffff811115614ec657600080fd5b6020830191508360208260061b85010111156111a257600080fd5b60008060008060408587031215614ef757600080fd5b843567ffffffffffffffff80821115614f0f57600080fd5b614f1b88838901614e9c565b90965094506020870135915080821115614f3457600080fd5b50614f4187828801614e9c565b95989497509550505050565b8015158114611d1757600080fd5b8035614a1c81614f4d565b600082601f830112614f7757600080fd5b81356020614f87614c9783614c25565b82815260069290921b84018101918181019086841115614fa657600080fd5b8286015b84811015614cdf5760408189031215614fc35760008081fd5b614fcb614b66565b8135614fd681614c49565b81528185013585820152835291830191604001614faa565b6000614ffc614c9784614c25565b8381529050602080820190600585901b84018681111561501b57600080fd5b845b8181101561505757803567ffffffffffffffff81111561503d5760008081fd5b61504989828901614d41565b85525092820192820161501d565b505050509392505050565b600082601f83011261507357600080fd5b6112c083833560208501614fee565b60006101a0828403121561509557600080fd5b61509d614b8f565b90506150a882614a11565b81526150b660208301614c6b565b60208201526150c760408301614c6b565b60408201526150d860608301614a11565b6060820152608082013560808201526150f360a08301614f5b565b60a082015261510460c08301614a11565b60c082015261511560e08301614c6b565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561514257600080fd5b61514e86838701614d41565b8385015261014092508285013591508082111561516a57600080fd5b61517686838701614f66565b8385015261016092508285013591508082111561519257600080fd5b5061519f85828601615062565b82840152505061018080830135818301525092915050565b600080604083850312156151ca57600080fd5b823567ffffffffffffffff808211156151e257600080fd5b6151ee86838701615082565b9350602085013591508082111561520457600080fd5b5061521185828601615062565b9150509250929050565b6152258184614a6d565b604060208201526000611c586040830184614ada565b60006020828403121561524d57600080fd5b81356112c081614c49565b600081518084526020808501945080840160005b8381101561529e57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161526c565b509495945050505050565b6020815260006112c06020830184615258565b6020808252825182820181905260009190848201906040850190845b8181101561530a57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016152d8565b50909695505050505050565b60008083601f84011261532857600080fd5b50813567ffffffffffffffff81111561534057600080fd5b6020830191508360208285010111156111a257600080fd5b60008083601f84011261536a57600080fd5b50813567ffffffffffffffff81111561538257600080fd5b6020830191508360208260051b85010111156111a257600080fd5b60008060008060008060008060a0898b0312156153b957600080fd5b883567ffffffffffffffff808211156153d157600080fd5b6153dd8c838d01614f66565b995060208b01359150808211156153f357600080fd5b6153ff8c838d01615316565b909950975060408b0135915061541482614c49565b90955060608a0135908082111561542a57600080fd5b6154368c838d01615358565b909650945060808b013591508082111561544f57600080fd5b5061545c8b828c01615358565b999c989b5096995094979396929594505050565b600081518084526020808501945080840160005b8381101561529e578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615484565b6020815260006112c06020830184615470565b600082601f8301126154e557600080fd5b813560206154f5614c9783614c25565b82815260059290921b8401810191818101908684111561551457600080fd5b8286015b84811015614cdf57803567ffffffffffffffff8111156155385760008081fd5b6155468986838b0101615062565b845250918301918301615518565b600082601f83011261556557600080fd5b81356020615575614c9783614c25565b82815260059290921b8401810191818101908684111561559457600080fd5b8286015b84811015614cdf5780358352918301918301615598565b6000608082840312156155c157600080fd5b6155c9614bb3565b9050813567ffffffffffffffff808211156155e357600080fd5b818401915084601f8301126155f757600080fd5b81356020615607614c9783614c25565b82815260059290921b8401810191818101908884111561562657600080fd5b8286015b8481101561565e578035868111156156425760008081fd5b6156508b86838b0101615082565b84525091830191830161562a565b508652508581013593508284111561567557600080fd5b615681878588016154d4565b9085015250604084013591508082111561569a57600080fd5b506156a784828501615554565b6040830152506060820135606082015292915050565b600080604083850312156156d057600080fd5b823567ffffffffffffffff808211156156e857600080fd5b6156f4868387016155af565b935060209150818501358181111561570b57600080fd5b85019050601f8101861361571e57600080fd5b803561572c614c9782614c25565b81815260059190911b8201830190838101908883111561574b57600080fd5b928401925b8284101561576957833582529284019290840190615750565b80955050505050509250929050565b60a081016108ac828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b6000602082840312156157ed57600080fd5b813567ffffffffffffffff81111561580457600080fd5b820160a081850312156112c057600080fd5b60008060008060008060008060e0898b03121561583257600080fd5b606089018a81111561584357600080fd5b8998503567ffffffffffffffff8082111561585d57600080fd5b6158698c838d01615316565b909950975060808b013591508082111561588257600080fd5b61588e8c838d01615358565b909750955060a08b01359150808211156158a757600080fd5b506158b48b828c01615358565b999c989b50969995989497949560c00135949350505050565b600080602083850312156158e057600080fd5b823567ffffffffffffffff8111156158f757600080fd5b61590385828601615316565b90969095509350505050565b80356fffffffffffffffffffffffffffffffff81168114614a1c57600080fd5b60006060828403121561594157600080fd5b6040516060810181811067ffffffffffffffff8211171561596457615964614b37565b604052823561597281614f4d565b81526159806020840161590f565b60208201526159916040840161590f565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108ac576108ac61599d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615a2957615a296159df565b92169190910692915050565b80820281158282048414176108ac576108ac61599d565b600067ffffffffffffffff80841680615a6757615a676159df565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615ad357615ad361599d565b5060010190565b600063ffffffff808316818103615af357615af361599d565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152615b2d8184018a615258565b90508281036080840152615b418189615258565b905060ff871660a084015282810360c0840152615b5e8187614ada565b905067ffffffffffffffff851660e0840152828103610100840152615b838185614ada565b9c9b505050505050505050505050565b600060208284031215615ba557600080fd5b81516112c081614c49565b60006112c0368484614fee565b600060208284031215615bcf57600080fd5b81516112c0816149fb565b808201808211156108ac576108ac61599d565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615c28610120840182614ada565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615c648383614ada565b925060808901519150808584030161010086015250615c838282615470565b92505050615c97602083018661ffff169052565b836040830152612cd0606083018473ffffffffffffffffffffffffffffffffffffffff169052565b60008060408385031215615cd257600080fd5b8251615cdd81614f4d565b602084015190925067ffffffffffffffff811115615cfa57600080fd5b8301601f81018513615d0b57600080fd5b8051615d19614c9782614cfb565b818152866020838501011115615d2e57600080fd5b615d3f826020830160208601614ab6565b8093505050509250929050565b805163ffffffff81168114614a1c57600080fd5b600060a08284031215615d7257600080fd5b60405160a0810181811067ffffffffffffffff82111715615d9557615d95614b37565b604052615da183615d4c565b81526020830151615db181614c49565b60208201526040830151615dc481614c49565b6040820152606083015161ffff81168114615dde57600080fd5b6060820152615def60808401615d4c565b60808201529392505050565b6101608101615e6d828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151166101408301526112c0565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615f118285018b615258565b91508382036080850152615f25828a615258565b915060ff881660a085015283820360c0850152615f428288614ada565b90861660e08501528381036101008501529050615b838185614ada565b6000815180845260208085019450848260051b860182860160005b85811015615fa4578383038952615f92838351614ada565b98850198925090840190600101615f7a565b5090979650505050505050565b60408152615fcc60408201845167ffffffffffffffff169052565b60006020840151615ff5606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006160638185018367ffffffffffffffff169052565b60e0860151915061012061608e8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526160be6101e0870185614ada565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526160fd8686615470565b9550828a015194508188870301848901526161188686615f5f565b9550808a01516101c089015250505050508281036020840152612cd08185615f5f565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156161835780818460040360031b1b83161693505b505050919050565b60408152600061619e6040830185614ada565b8281036020840152612cd08185614ada565b60a0815260006161c360a0830188614ada565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff8516606084015282810360808401526162078185614ada565b98975050505050505050565b60006020828403121561622557600080fd5b81516112c081614f4d565b600081518084526020808501945080840160005b8381101561529e57815187529582019590820190600101616244565b6060815260006162736060830186616230565b82810360208401526162858186616230565b915050826040830152949350505050565b6000602082840312156162a857600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156148745761487461599d565b67ffffffffffffffff83168152604081016112c06020830184614a6d565b600067ffffffffffffffff808316818103615af357615af361599d565b60006020828403121561631d57600080fd5b813567ffffffffffffffff81111561633457600080fd5b611c58848285016155af565b60006040828403121561635257600080fd5b61635a614b66565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461638657600080fd5b815261639460208401615d4c565b60208201529392505050565b6020815260006112c06020830184615f5f565b6000826163c2576163c26159df565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x6101806040526014805460ff191660011790553480156200001f57600080fd5b5060405162006d7a38038062006d7a8339810160408190526200004291620008a6565b838383838033806000816200009e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d1816200048d565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001815760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b03161580620001a4575083516001600160a01b0316155b15620001c3576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620009bd565b6001600160401b03166001146200025657604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002cd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000538565b6101205260005b83518110156200047e576200032e848281518110620002f757620002f7620009db565b6020026020010151848381518110620003145762000314620009db565b6020026020010151600c6200059f60201b9092919060201c565b50620003e3838281518110620003485762000348620009db565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b49190620009f1565b848381518110620003c957620003c9620009db565b6020026020010151600f6200059f60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c8482815181106200041a576200041a620009db565b6020026020010151848381518110620004375762000437620009db565b6020026020010151604051620004639291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004768162000a18565b9050620002d4565b50505050505050505062000a40565b336001600160a01b03821603620004e75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000095565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200058294939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005b7846001600160a01b03851684620005bf565b949350505050565b6000620005b784846001600160a01b03851660008281526002840160205260408120829055620005b784846000620005f8838362000601565b90505b92915050565b60008181526001830160205260408120546200064a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fb565b506000620005fb565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200068e576200068e62000653565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006bf57620006bf62000653565b604052919050565b6001600160a01b0381168114620006dd57600080fd5b50565b80516001600160401b0381168114620006f857600080fd5b919050565b60006001600160401b0382111562000719576200071962000653565b5060051b60200190565b600082601f8301126200073557600080fd5b815160206200074e6200074883620006fd565b62000694565b82815260059290921b840181019181810190868411156200076e57600080fd5b8286015b84811015620007965780516200078881620006c7565b835291830191830162000772565b509695505050505050565b600082601f830112620007b357600080fd5b81516020620007c66200074883620006fd565b82815260059290921b84018101918181019086841115620007e657600080fd5b8286015b84811015620007965780516200080081620006c7565b8352918301918301620007ea565b80516001600160801b0381168114620006f857600080fd5b6000606082840312156200083957600080fd5b604051606081016001600160401b03811182821017156200085e576200085e62000653565b8060405250809150825180151581146200087757600080fd5b815262000887602084016200080e565b60208201526200089a604084016200080e565b60408201525092915050565b600080600080848603610160811215620008bf57600080fd5b60c0811215620008ce57600080fd5b50620008d962000669565b8551620008e681620006c7565b8152620008f660208701620006e0565b60208201526200090960408701620006e0565b604082015260608601516200091e81620006c7565b606082015260808601516200093381620006c7565b608082015260a08601516200094881620006c7565b60a082015260c08601519094506001600160401b03808211156200096b57600080fd5b620009798883890162000723565b945060e08701519150808211156200099057600080fd5b506200099f87828801620007a1565b925050620009b286610100870162000826565b905092959194509250565b600060208284031215620009d057600080fd5b620005f882620006e0565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0457600080fd5b815162000a1181620006c7565b9392505050565b60006001820162000a3957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051610140516101605161624862000b3260003960008181610381015281816123190152612b20015260008181610345015281816118090152818161188b015281816122ef01528181613096015261311d01526000612cd9015260008181610309015281816122c801526135380152600081816102a90152818161227601526135170152600081816102d9015281816122a0015281816128d0015281816134f60152613d6301526000818161026d015281816122480152612dce0152600081816115520152818161159e0152818161194c015261199801526162486000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637437ff9f1161012a578063b4069b31116100bd578063d3c7c2c71161008c578063f2fde38b11610071578063f2fde38b146107f4578063f52121a514610807578063f8ccbf471461081a57600080fd5b8063d3c7c2c7146107d9578063d7e2bb50146107e157600080fd5b8063b4069b3114610798578063b5767166146107ab578063c5a1d7f0146107be578063c92b2832146107c657600080fd5b8063856c8247116100f9578063856c82471461071b5780638da5cb5b14610747578063afcb95d714610765578063b1dc65a41461078557600080fd5b80637437ff9f1461060a57806379ba5097146106d557806381ff7048146106dd57806385572ffb1461070d57600080fd5b8063546719cd116101bd578063681fba161161018c5780636c6bd845116101715780636c6bd845146105d1578063704b6c02146105e4578063740f4150146105f757600080fd5b8063681fba161461059c578063693928ae146105b157600080fd5b8063546719cd146104d1578063599f6431146105355780635d86f14114610574578063666cab8d1461058757600080fd5b80632dea00f3116101f95780632dea00f3146104525780633a87ac53146104655780634f9f03fe14610478578063506449721461049957600080fd5b806306285c691461022b578063142a98fc146103d4578063181f5a77146103f45780631ef381741461043d575b600080fd5b6103be6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103cb91906147cf565b60405180910390f35b6103e76103e2366004614866565b610837565b6040516103cb91906148ed565b6104306040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103cb9190614969565b61045061044b366004614bd7565b6108b2565b005b610450610460366004614ca4565b610d71565b610450610473366004614d26565b610d7f565b61048b610486366004614ffc565b61118f565b6040516103cb929190615060565b6104c36104a7366004614866565b67ffffffffffffffff1660009081526013602052604090205490565b6040519081526020016103cb565b6104d96111a9565b6040516103cb919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103cb565b61054f610582366004615080565b61125e565b61058f6112c7565b6040516103cb91906150ee565b6105a4611336565b6040516103cb9190615101565b6105c46105bf3660046151e2565b6113ef565b6040516103cb9190615306565b6104506105df366004615502565b611455565b6104506105f2366004615080565b61145f565b610450610605366004615502565b61154f565b6106c86040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b6040516103cb91906155bd565b6104506116d1565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016103cb565b610450610226366004615620565b61072e610729366004615080565b6117ce565b60405167ffffffffffffffff90911681526020016103cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661054f565b6040805160018152600060208201819052918101919091526060016103cb565b61045061079336600461565b565b6118f6565b61054f6107a6366004615080565b611b87565b6104506107b9366004615712565b611c60565b6104c3611c6a565b6104506107d4366004615774565b611c95565b6105a4611d1a565b61054f6107ef366004615080565b611dcf565b610450610802366004615080565b611dde565b610450610815366004614ffc565b611def565b6014546108279060ff1681565b60405190151581526020016103cb565b600061084560016004615811565b6002610852608085615853565b67ffffffffffffffff16610866919061587a565b60136000610875608087615891565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156108ac576108ac614883565b92915050565b84518460ff16601f821115610928576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610992576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f7369746976650000000000000000000000000000604482015260640161091f565b61099a612049565b6109a3856120cc565b60095460005b81811015610a2f5760086000600983815481106109c8576109c86158b8565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610a28816158e7565b90506109a9565b50875160005b81811015610c2b5760008a8281518110610a5157610a516158b8565b6020026020010151905060006002811115610a6e57610a6e614883565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610aad57610aad614883565b14610b14576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015260640161091f565b73ffffffffffffffffffffffffffffffffffffffff8116610b61576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610c1157610c11614883565b02179055509050505080610c24906158e7565b9050610a35565b508851610c3f9060099060208c0190614739565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610cc5914691309190600090610c979063ffffffff1661591f565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d612379565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610d5c99989796959493929190615942565b60405180910390a15050505050505050505050565b610d7b8282612424565b5050565b610d87612049565b60005b83811015610f86576000858583818110610da657610da66158b8565b610dbc9260206040909202019081019150615080565b90506000868684818110610dd257610dd26158b8565b9050604002016020016020810190610dea9190615080565b9050610df7600c836124ce565b610e2d576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e4f600c846124f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea7600c83612512565b50610f228173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a91906159d8565b600f90612512565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610f7f906158e7565b9050610d8a565b5060005b81811015611188576000838383818110610fa657610fa66158b8565b610fbc9260206040909202019081019150615080565b90506000848484818110610fd257610fd26158b8565b9050604002016020016020810190610fea9190615080565b905073ffffffffffffffffffffffffffffffffffffffff82161580611023575073ffffffffffffffffffffffffffffffffffffffff8116155b1561105a576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611065600c836124ce565b1561109c576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110a8600c8383612534565b506111248173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b91906159d8565b600f9083612534565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080611181906158e7565b9050610f8a565b5050505050565b6000606061119d8484612557565b915091505b9250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152611259906126fa565b905090565b6000808061126d600c856127ac565b91509150816112c0576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561132c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611301575b5050505050905090565b6060611342600f6127cf565b67ffffffffffffffff81111561135a5761135a61497c565b604051908082528060200260200182016040528015611383578160200160208202803683370190505b50905060005b81518110156113eb57600061139f600f836127da565b509050808383815181106113b5576113b56158b8565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152506113e4816158e7565b9050611389565b5090565b60606114488989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061143991508990508a6159f5565b61144387896159f5565b6127f6565b9998505050505050505050565b610d7b8282612b1e565b60005473ffffffffffffffffffffffffffffffffffffffff16331480159061149f575060025473ffffffffffffffffffffffffffffffffffffffff163314155b156114d6576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f0000000000000000000000000000000000000000000000000000000000000000146115da576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff4616602482015260440161091f565b81515181518114611617576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156116c1576000838281518110611636576116366158b8565b602002602001015190508060001415801561166f57508451805183908110611660576116606158b8565b60200260200101516080015181105b156116b0576040517f085e39cf000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161091f565b506116ba816158e7565b905061161a565b506116cc8383612b1e565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161091f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561184157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156108ac576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190615a02565b61190087876134ce565b600554883590808214611949576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161091f565b467f0000000000000000000000000000000000000000000000000000000000000000146119ca576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161091f565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611a5257611a52614883565b6002811115611a6357611a63614883565b9052509050600281602001516002811115611a8057611a80614883565b148015611ac757506009816000015160ff1681548110611aa257611aa26158b8565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611afd576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611b0b85602061587a565b611b1688602061587a565b611b228b610144615a1f565b611b2c9190615a1f565b611b369190615a1f565b9050368114611b7a576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161091f565b5050505050505050505050565b60008080611b96600c856127ac565b9150915081611be9576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161091f565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5891906159d8565b949350505050565b610d7b82826134ce565b60006112597f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36134f1565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611cd5575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611d0c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d176003826135be565b50565b6060611d26600c6127cf565b67ffffffffffffffff811115611d3e57611d3e61497c565b604051908082528060200260200182016040528015611d67578160200160208202803683370190505b50905060005b81518110156113eb576000611d83600c836127da565b50905080838381518110611d9957611d996158b8565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611dc8816158e7565b9050611d6d565b6000808061126d600f856127ac565b611de6612049565b611d17816137a3565b333014611e28576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611e65565b6040805180820190915260008082526020820152815260200190600190039081611e3e5790505b506101408401515190915015611ed257611ecf8361014001518460200151604051602001611eaf919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528560400151866101600151866127f6565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611f3c57506040830151611f3a9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613898565b155b15611f4657505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611f7b87866138b4565b611388886080015189604001516040518563ffffffff1660e01b8152600401611fa79493929190615a32565b6000604051808303816000875af1158015611fc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261200c9190810190615b04565b915091508161118857806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161091f9190614969565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161091f565b565b6000818060200190518101906120e29190615ba5565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16612136576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda9161236d918490615c40565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161239d99989796959493929190615d0f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006002612433608085615853565b67ffffffffffffffff16612447919061587a565b90506000601381612459608087615891565b67ffffffffffffffff16815260208101919091526040016000205490508161248360016004615811565b901b19168183600381111561249a5761249a614883565b901b1780601360006124ad608088615891565b67ffffffffffffffff16815260208101919091526040016000205550505050565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613964565b60006112c08373ffffffffffffffffffffffffffffffffffffffff8416613970565b60006112c08373ffffffffffffffffffffffffffffffffffffffff841661397c565b6000611c588473ffffffffffffffffffffffffffffffffffffffff851684613988565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061259b9087908790600401615df6565b600060405180830381600087803b1580156125b557600080fd5b505af19250505080156125c6575060015b6126df573d8080156125f4576040519150601f19603f3d011682016040523d82523d6000602084013e6125f9565b606091505b5061260381615f80565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061269b575061265681615f80565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b156126ab576003925090506111a2565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161091f9190614969565b50506040805160208101909152600081526002909250929050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261278882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261276c9190615811565b85608001516fffffffffffffffffffffffffffffffff166139ab565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60008061119d8473ffffffffffffffffffffffffffffffffffffffff85166139ca565b60006108ac826139d9565b60008080806127e986866139e4565b9097909650945050505050565b60606000865167ffffffffffffffff8111156128145761281461497c565b60405190808252806020026020018201604052801561285957816020015b60408051808201909152600080825260208201528152602001906001900390816128325790505b50905060005b8751811015612aed57600061289089838151811061287f5761287f6158b8565b60200260200101516000015161125e565b90508073ffffffffffffffffffffffffffffffffffffffff16638627fad689898c86815181106128c2576128c26158b8565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008b8881518110612901576129016158b8565b60200260200101518b898151811061291b5761291b6158b8565b6020026020010151604051602001612934929190615fd0565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612963959493929190615ff5565b600060405180830381600087803b15801561297d57600080fd5b505af192505050801561298e575060015b6129f6573d8080156129bc576040519150601f19603f3d011682016040523d82523d6000602084013e6129c1565b606091505b50806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161091f9190614969565b8073ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6591906159d8565b838381518110612a7757612a776158b8565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690528851899083908110612ab057612ab06158b8565b602002602001015160200151838381518110612ace57612ace6158b8565b602090810291909101810151015250612ae6816158e7565b905061285f565b50600b54612b1290829073ffffffffffffffffffffffffffffffffffffffff166139f3565b90505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bad9190616058565b15612be4576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003612c21576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612c5f576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612c7a57612c7a61497c565b604051908082528060200260200182016040528015612ca3578160200160208202803683370190505b50905060005b82811015612d8357600085600001518281518110612cc957612cc96158b8565b60200260200101519050612cfd817f0000000000000000000000000000000000000000000000000000000000000000613bdb565b838381518110612d0f57612d0f6158b8565b602002602001018181525050806101800151838381518110612d3357612d336158b8565b602002602001015114612d72576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612d7c816158e7565b9050612ca9565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633204887592612e04928792916004016160a5565b602060405180830381865afa158015612e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4591906160db565b905080600003612e81576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156134c557600087600001518281518110612ea857612ea86158b8565b602002602001015190506000612ec18260600151610837565b90506000816003811115612ed757612ed7614883565b1480612ef457506003816003811115612ef257612ef2614883565b145b612f3c5760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b8315612ff957600a5460009063ffffffff16612f588742615811565b1190508080612f7857506003826003811115612f7657612f76614883565b145b612fae576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888481518110612fc057612fc06158b8565b6020026020010151600014612ff357888481518110612fe157612fe16158b8565b60200260200101518360800181815250505b50613056565b600081600381111561300d5761300d614883565b146130565760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff16801580156130ce57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156132715760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015613166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318a9190615a02565b60c084015190915067ffffffffffffffff166131a78260016160f4565b67ffffffffffffffff161461321457826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050506134b5565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561328557613285614883565b036133115760c083015167ffffffffffffffff166132a48260016160f4565b67ffffffffffffffff161461331157826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050506134b5565b60008a602001518581518110613329576133296158b8565b6020026020010151905061333e848251613d61565b61334d84606001516001612424565b60008061335a8684612557565b9150915061336c866060015183612424565b600382600381111561338057613380614883565b141580156133a05750600282600381111561339d5761339d614883565b14155b156133df578560600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161091f929190616115565b60008560038111156133f3576133f3614883565b036134605760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff169161343883616133565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516134a6929190615060565b60405180910390a35050505050505b6134be816158e7565b9050612e88565b50505050505050565b610d7b6134dd82840184616150565b604080516000815260208101909152612b1e565b6000817f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040516020016135a1949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b604051602081830303815290604052805190602001209050919050565b81546000906135e790700100000000000000000000000000000000900463ffffffff1642615811565b90508015613689576001830154835461362f916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166139ab565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546136af916fffffffffffffffffffffffffffffffff9081169116613f37565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906137969084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161091f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006138a383613f4d565b80156112c057506112c08383613fb1565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001613939919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006112c08383614080565b60006112c0838361408c565b60006112c08383614116565b6000611c58848473ffffffffffffffffffffffffffffffffffffffff8516614133565b6000612b15856139bb848661587a565b6139c59087615a1f565b613f37565b60008080806127e98686614150565b60006108ac8261418a565b60008080806127e98686614195565b81516000805b82811015613bc75760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613a3157613a316158b8565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac99190616185565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613b5b57858281518110613b0457613b046158b8565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161091f565b613ba9868381518110613b7057613b706158b8565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166141c090919063ffffffff16565b613bb39084615a1f565b92505080613bc0906158e7565b90506139f9565b50613bd560038260006141fd565b50505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613c7e98979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613cb79190615306565b60405160208183030381529060405280519060200120876101600151604051602001613ce391906161e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff1614613de15781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b54610140830151517401000000000000000000000000000000000000000090910461ffff161015613e525760608201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b808261014001515114613ea35760608201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161091f565b600b546101208301515176010000000000000000000000000000000000000000000090910463ffffffff161015610d7b57600b54610120830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff166004830152602482015260440161091f565b6000818310613f4657816112c0565b5090919050565b6000613f79827f01ffc9a700000000000000000000000000000000000000000000000000000000613fb1565b80156108ac5750613faa827fffffffff00000000000000000000000000000000000000000000000000000000613fb1565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015614069575060208210155b80156140755750600081115b979650505050505050565b60006112c08383614580565b6000818152600283016020526040812054801515806140b057506140b08484614080565b6112c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161091f565b600081815260028301602052604081208190556112c08383614598565b60008281526002840160205260408120829055611c5884846145a4565b600081815260028301602052604081205481908061417f576141728585614080565b9250600091506111a29050565b6001925090506111a2565b60006108ac826145b0565b600080806141a385856145ba565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006141f3837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661587a565b6112c091906161f8565b825474010000000000000000000000000000000000000000900460ff161580614224575081155b1561422e57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061427490700100000000000000000000000000000000900463ffffffff1642615811565b9050801561433457818311156142b6576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546142f09083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166139ab565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156143eb5773ffffffffffffffffffffffffffffffffffffffff8416614393576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161091f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161091f565b848310156144fe5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061442f9082615811565b614439878a615811565b6144439190615a1f565b61444d91906161f8565b905073ffffffffffffffffffffffffffffffffffffffff86166144a6576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161091f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161091f565b6145088584615811565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260018301602052604081205415156112c0565b60006112c083836145c6565b60006112c083836146c0565b60006108ac825490565b60006112c0838361470f565b600081815260018301602052604081205480156146af5760006145ea600183615811565b85549091506000906145fe90600190615811565b905081811461466357600086600001828154811061461e5761461e6158b8565b9060005260206000200154905080876000018481548110614641576146416158b8565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806146745761467461620c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108ac565b60009150506108ac565b5092915050565b6000818152600183016020526040812054614707575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108ac565b5060006108ac565b6000826000018281548110614726576147266158b8565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156147b3579160200282015b828111156147b357825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614759565b506113eb9291505b808211156113eb57600081556001016147bb565b60c081016108ac828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611d1757600080fd5b803561486181614840565b919050565b60006020828403121561487857600080fd5b81356112c081614840565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106148e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016108ac82846148b2565b60005b838110156149165781810151838201526020016148fe565b50506000910152565b600081518084526149378160208601602086016148fb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112c0602083018461491f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156149ce576149ce61497c565b60405290565b6040516101a0810167ffffffffffffffff811182821017156149ce576149ce61497c565b6040516080810167ffffffffffffffff811182821017156149ce576149ce61497c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614a6257614a6261497c565b604052919050565b600067ffffffffffffffff821115614a8457614a8461497c565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611d1757600080fd5b803561486181614a8e565b600082601f830112614acc57600080fd5b81356020614ae1614adc83614a6a565b614a1b565b82815260059290921b84018101918181019086841115614b0057600080fd5b8286015b84811015614b24578035614b1781614a8e565b8352918301918301614b04565b509695505050505050565b803560ff8116811461486157600080fd5b600067ffffffffffffffff821115614b5a57614b5a61497c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614b9757600080fd5b8135614ba5614adc82614b40565b818152846020838601011115614bba57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614bf057600080fd5b863567ffffffffffffffff80821115614c0857600080fd5b614c148a838b01614abb565b97506020890135915080821115614c2a57600080fd5b614c368a838b01614abb565b9650614c4460408a01614b2f565b95506060890135915080821115614c5a57600080fd5b614c668a838b01614b86565b9450614c7460808a01614856565b935060a0890135915080821115614c8a57600080fd5b50614c9789828a01614b86565b9150509295509295509295565b60008060408385031215614cb757600080fd5b8235614cc281614840565b9150602083013560048110614cd657600080fd5b809150509250929050565b60008083601f840112614cf357600080fd5b50813567ffffffffffffffff811115614d0b57600080fd5b6020830191508360208260061b85010111156111a257600080fd5b60008060008060408587031215614d3c57600080fd5b843567ffffffffffffffff80821115614d5457600080fd5b614d6088838901614ce1565b90965094506020870135915080821115614d7957600080fd5b50614d8687828801614ce1565b95989497509550505050565b8015158114611d1757600080fd5b803561486181614d92565b600082601f830112614dbc57600080fd5b81356020614dcc614adc83614a6a565b82815260069290921b84018101918181019086841115614deb57600080fd5b8286015b84811015614b245760408189031215614e085760008081fd5b614e106149ab565b8135614e1b81614a8e565b81528185013585820152835291830191604001614def565b6000614e41614adc84614a6a565b8381529050602080820190600585901b840186811115614e6057600080fd5b845b81811015614e9c57803567ffffffffffffffff811115614e825760008081fd5b614e8e89828901614b86565b855250928201928201614e62565b505050509392505050565b600082601f830112614eb857600080fd5b6112c083833560208501614e33565b60006101a08284031215614eda57600080fd5b614ee26149d4565b9050614eed82614856565b8152614efb60208301614ab0565b6020820152614f0c60408301614ab0565b6040820152614f1d60608301614856565b606082015260808201356080820152614f3860a08301614da0565b60a0820152614f4960c08301614856565b60c0820152614f5a60e08301614ab0565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614f8757600080fd5b614f9386838701614b86565b83850152610140925082850135915080821115614faf57600080fd5b614fbb86838701614dab565b83850152610160925082850135915080821115614fd757600080fd5b50614fe485828601614ea7565b82840152505061018080830135818301525092915050565b6000806040838503121561500f57600080fd5b823567ffffffffffffffff8082111561502757600080fd5b61503386838701614ec7565b9350602085013591508082111561504957600080fd5b5061505685828601614ea7565b9150509250929050565b61506a81846148b2565b604060208201526000611c58604083018461491f565b60006020828403121561509257600080fd5b81356112c081614a8e565b600081518084526020808501945080840160005b838110156150e357815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016150b1565b509495945050505050565b6020815260006112c0602083018461509d565b6020808252825182820181905260009190848201906040850190845b8181101561514f57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161511d565b50909695505050505050565b60008083601f84011261516d57600080fd5b50813567ffffffffffffffff81111561518557600080fd5b6020830191508360208285010111156111a257600080fd5b60008083601f8401126151af57600080fd5b50813567ffffffffffffffff8111156151c757600080fd5b6020830191508360208260051b85010111156111a257600080fd5b60008060008060008060008060a0898b0312156151fe57600080fd5b883567ffffffffffffffff8082111561521657600080fd5b6152228c838d01614dab565b995060208b013591508082111561523857600080fd5b6152448c838d0161515b565b909950975060408b0135915061525982614a8e565b90955060608a0135908082111561526f57600080fd5b61527b8c838d0161519d565b909650945060808b013591508082111561529457600080fd5b506152a18b828c0161519d565b999c989b5096995094979396929594505050565b600081518084526020808501945080840160005b838110156150e3578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016152c9565b6020815260006112c060208301846152b5565b600082601f83011261532a57600080fd5b8135602061533a614adc83614a6a565b82815260059290921b8401810191818101908684111561535957600080fd5b8286015b84811015614b2457803567ffffffffffffffff81111561537d5760008081fd5b61538b8986838b0101614ea7565b84525091830191830161535d565b600082601f8301126153aa57600080fd5b813560206153ba614adc83614a6a565b82815260059290921b840181019181810190868411156153d957600080fd5b8286015b84811015614b2457803583529183019183016153dd565b60006080828403121561540657600080fd5b61540e6149f8565b9050813567ffffffffffffffff8082111561542857600080fd5b818401915084601f83011261543c57600080fd5b8135602061544c614adc83614a6a565b82815260059290921b8401810191818101908884111561546b57600080fd5b8286015b848110156154a3578035868111156154875760008081fd5b6154958b86838b0101614ec7565b84525091830191830161546f565b50865250858101359350828411156154ba57600080fd5b6154c687858801615319565b908501525060408401359150808211156154df57600080fd5b506154ec84828501615399565b6040830152506060820135606082015292915050565b6000806040838503121561551557600080fd5b823567ffffffffffffffff8082111561552d57600080fd5b615539868387016153f4565b935060209150818501358181111561555057600080fd5b85019050601f8101861361556357600080fd5b8035615571614adc82614a6a565b81815260059190911b8201830190838101908883111561559057600080fd5b928401925b828410156155ae57833582529284019290840190615595565b80955050505050509250929050565b60a081016108ac828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b60006020828403121561563257600080fd5b813567ffffffffffffffff81111561564957600080fd5b820160a081850312156112c057600080fd5b60008060008060008060008060e0898b03121561567757600080fd5b606089018a81111561568857600080fd5b8998503567ffffffffffffffff808211156156a257600080fd5b6156ae8c838d0161515b565b909950975060808b01359150808211156156c757600080fd5b6156d38c838d0161519d565b909750955060a08b01359150808211156156ec57600080fd5b506156f98b828c0161519d565b999c989b50969995989497949560c00135949350505050565b6000806020838503121561572557600080fd5b823567ffffffffffffffff81111561573c57600080fd5b6157488582860161515b565b90969095509350505050565b80356fffffffffffffffffffffffffffffffff8116811461486157600080fd5b60006060828403121561578657600080fd5b6040516060810181811067ffffffffffffffff821117156157a9576157a961497c565b60405282356157b781614d92565b81526157c560208401615754565b60208201526157d660408401615754565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108ac576108ac6157e2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061586e5761586e615824565b92169190910692915050565b80820281158282048414176108ac576108ac6157e2565b600067ffffffffffffffff808416806158ac576158ac615824565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615918576159186157e2565b5060010190565b600063ffffffff808316818103615938576159386157e2565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526159728184018a61509d565b90508281036080840152615986818961509d565b905060ff871660a084015282810360c08401526159a3818761491f565b905067ffffffffffffffff851660e08401528281036101008401526159c8818561491f565b9c9b505050505050505050505050565b6000602082840312156159ea57600080fd5b81516112c081614a8e565b60006112c0368484614e33565b600060208284031215615a1457600080fd5b81516112c081614840565b808201808211156108ac576108ac6157e2565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615a6d61012084018261491f565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615aa9838361491f565b925060808901519150808584030161010086015250615ac882826152b5565b92505050615adc602083018661ffff169052565b836040830152612b15606083018473ffffffffffffffffffffffffffffffffffffffff169052565b60008060408385031215615b1757600080fd5b8251615b2281614d92565b602084015190925067ffffffffffffffff811115615b3f57600080fd5b8301601f81018513615b5057600080fd5b8051615b5e614adc82614b40565b818152866020838501011115615b7357600080fd5b615b848260208301602086016148fb565b8093505050509250929050565b805163ffffffff8116811461486157600080fd5b600060a08284031215615bb757600080fd5b60405160a0810181811067ffffffffffffffff82111715615bda57615bda61497c565b604052615be683615b91565b81526020830151615bf681614a8e565b60208201526040830151615c0981614a8e565b6040820152606083015161ffff81168114615c2357600080fd5b6060820152615c3460808401615b91565b60808201529392505050565b6101608101615cb2828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151166101408301526112c0565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615d568285018b61509d565b91508382036080850152615d6a828a61509d565b915060ff881660a085015283820360c0850152615d87828861491f565b90861660e085015283810361010085015290506159c8818561491f565b6000815180845260208085019450848260051b860182860160005b85811015615de9578383038952615dd783835161491f565b98850198925090840190600101615dbf565b5090979650505050505050565b60408152615e1160408201845167ffffffffffffffff169052565b60006020840151615e3a606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615ea88185018367ffffffffffffffff169052565b60e08601519150610120615ed38186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615f036101e087018561491f565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615f4286866152b5565b9550828a01519450818887030184890152615f5d8686615da4565b9550808a01516101c089015250505050508281036020840152612b158185615da4565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615fc85780818460040360031b1b83161693505b505050919050565b604081526000615fe3604083018561491f565b8281036020840152612b15818561491f565b60a08152600061600860a083018861491f565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff85166060840152828103608084015261604c818561491f565b98975050505050505050565b60006020828403121561606a57600080fd5b81516112c081614d92565b600081518084526020808501945080840160005b838110156150e357815187529582019590820190600101616089565b6060815260006160b86060830186616075565b82810360208401526160ca8186616075565b915050826040830152949350505050565b6000602082840312156160ed57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156146b9576146b96157e2565b67ffffffffffffffff83168152604081016112c060208301846148b2565b600067ffffffffffffffff808316818103615938576159386157e2565b60006020828403121561616257600080fd5b813567ffffffffffffffff81111561617957600080fd5b611c58848285016153f4565b60006040828403121561619757600080fd5b61619f6149ab565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146161cb57600080fd5b81526161d960208401615b91565b60208201529392505050565b6020815260006112c06020830184615da4565b60008261620757616207615824565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOffRampHelperABI = EVM2EVMOffRampHelperMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 3397089b9e..a8beb856df 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -5,8 +5,8 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.19/BurnMintTokenPool.abi ../. commit_store: ../../../contracts/solc/v0.8.19/CommitStore.abi ../../../contracts/solc/v0.8.19/CommitStore.bin 7d80f085f8249ef15e0850bf03698806c972125156f3476a1dafca54598f7f4d commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper.abi ../../../contracts/solc/v0.8.19/CommitStoreHelper.bin 0891a1662bda54db424d12e80a56533cfd9859f7d94a3be147ad3caa46cad072 custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool.bin 79ab937aa4493bf31fb0e57affd00555aad75205c90268e89674c28ea9e5e48f -evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin 8a0bd8a428ae8d071d326a2d4e1f7a2d35da08fef7307b6e1f15e108eb23770e -evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin 9e06fb409bcc9b1728c1a327d404640796c2834e7798728224b8ad4e5745c4a7 +evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin bfea579e0b5100b6e90c2ea4d1533789ff037104fd03ba590e135772a0cf0997 +evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin fe22966f5d97a8f386a4f01f901a308592336ea52c8fd06311f4bf1a961033ad evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 1c21fbc9b49521a9a783c40b0674297bfcb18a64100dae10173682e38ea199fc lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.bin 7f7a28f55f9fb63669cd8038a7f99e31431acd6d15ddeeb6a77188eb0bf85d58 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5