From 5b95087a6f5d375d1f68902f43fbe6064f4a59c1 Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Fri, 23 Jan 2026 13:52:12 +0100 Subject: [PATCH 1/7] upgrade foundry deps to 1.4.3 --- mise.toml | 6 +- packages/contracts-bedrock/foundry.lock | 50 +++ packages/contracts-bedrock/foundry.toml | 5 +- packages/contracts-bedrock/justfile | 3 +- .../contracts-bedrock/scripts/L2Genesis.s.sol | 50 ++- .../OPCMUpgradeChecksMocks.sol | 7 +- .../scripts/deploy/ChainAssertions.sol | 31 +- .../scripts/deploy/Deploy.s.sol | 36 ++- .../scripts/deploy/DeployDisputeGame.s.sol | 4 +- .../deploy/DeployImplementations.s.sol | 65 ++-- .../scripts/deploy/DeployMIPS.s.sol | 4 +- .../scripts/deploy/DeployOPChain.s.sol | 32 +- .../scripts/deploy/DeployOwnership.s.sol | 20 +- .../scripts/deploy/DeploySaferSafes.s.sol | 4 +- .../scripts/deploy/DeploySuperchain.s.sol | 5 +- .../scripts/deploy/InteropMigration.s.sol | 3 +- .../deploy/UpgradeSuperchainConfig.s.sol | 3 +- .../scripts/deploy/VerifyOPCM.s.sol | 4 +- .../scripts/libraries/DeployUtils.sol | 23 +- .../periphery/deploy/DeployPeriphery.s.sol | 24 +- .../snapshots/semver-lock.json | 96 +++--- .../src/L1/DataAvailabilityChallenge.sol | 10 +- .../src/L1/L1CrossDomainMessenger.sol | 18 +- .../src/L1/L1ERC721Bridge.sol | 8 +- .../src/L1/L1StandardBridge.sol | 16 +- .../src/L1/OPContractsManager.sol | 96 +++--- .../OPContractsManagerStandardValidator.sol | 9 +- .../src/L1/OptimismPortal2.sol | 14 +- .../src/L1/OptimismPortalInterop.sol | 21 +- .../src/L1/ProtocolVersions.sol | 13 +- .../src/L1/ProxyAdminOwnedBase.sol | 3 +- .../L1/opcm/OPContractsManagerContainer.sol | 6 +- .../L1/opcm/OPContractsManagerMigrator.sol | 3 +- .../L1/opcm/OPContractsManagerUtilsCaller.sol | 15 +- .../src/L1/opcm/OPContractsManagerV2.sol | 17 +- .../contracts-bedrock/src/L2/FeeVault.sol | 4 +- .../src/L2/L2StandardBridge.sol | 7 +- .../src/L2/L2StandardBridgeInterop.sol | 4 +- .../src/L2/L2ToL1MessagePasserCGT.sol | 14 +- .../src/L2/SuperchainETHBridge.sol | 15 +- .../contracts-bedrock/src/cannon/MIPS64.sol | 31 +- .../src/cannon/PreimageOracle.sol | 63 ++-- .../src/cannon/libraries/CannonTypes.sol | 18 +- .../cannon/libraries/MIPS64Instructions.sol | 16 +- .../src/cannon/libraries/MIPS64Memory.sol | 29 +- .../src/cannon/libraries/MIPS64Syscalls.sol | 2 +- .../src/dispute/AnchorStateRegistry.sol | 12 +- .../src/dispute/DisputeGameFactory.sol | 17 +- .../src/dispute/FaultDisputeGame.sol | 8 +- .../src/dispute/SuperFaultDisputeGame.sol | 8 +- .../dispute/SuperPermissionedDisputeGame.sol | 9 +- .../src/dispute/lib/LibPosition.sol | 13 +- .../src/governance/GovernanceToken.sol | 9 +- .../src/integration/EventLogger.sol | 2 +- .../src/libraries/Blueprint.sol | 9 +- .../src/libraries/GasPayingToken.sol | 3 +- .../src/libraries/SafeCall.sol | 57 ++-- .../src/libraries/rlp/RLPReader.sol | 7 +- .../src/libraries/trie/MerkleTrie.sol | 10 +- .../src/libraries/trie/SecureMerkleTrie.sol | 10 +- .../drippie/dripchecks/CheckSecrets.sol | 6 +- .../monitoring/DisputeMonitorHelper.sol | 9 +- .../src/safe/LivenessModule.sol | 8 +- .../src/safe/SafeSigners.sol | 2 +- .../src/universal/CrossDomainMessenger.sol | 25 +- .../src/universal/ProxyAdmin.sol | 5 +- .../contracts-bedrock/src/vendor/eas/EAS.sol | 15 +- .../contracts-bedrock/src/vendor/eas/IEAS.sol | 9 +- .../src/vendor/eas/ISchemaRegistry.sol | 8 +- .../src/vendor/eas/SchemaRegistry.sol | 13 +- .../vendor/eas/eip1271/EIP1271Verifier.sol | 12 +- .../test/L1/DataAvailabilityChallenge.t.sol | 17 +- .../test/L1/L1StandardBridge.t.sol | 22 +- .../test/L1/OPContractsManager.t.sol | 104 +++---- ...OPContractsManagerContractsContainer.t.sol | 4 +- .../OPContractsManagerStandardValidator.t.sol | 44 ++- .../test/L1/OptimismPortal2.t.sol | 293 ++++++++---------- .../test/L1/ProtocolVersions.t.sol | 21 +- .../test/L1/ProxyAdminOwnedBase.t.sol | 4 +- .../test/L1/ResourceMetering.t.sol | 8 +- .../test/L1/SuperchainConfig.t.sol | 3 +- .../L1/opcm/OPContractsManagerContainer.t.sol | 7 +- .../L1/opcm/OPContractsManagerUtils.t.sol | 5 +- .../test/L1/opcm/OPContractsManagerV2.t.sol | 226 +++++++------- .../test/L2/CrossL2Inbox.t.sol | 7 +- .../test/L2/ETHLiquidity.t.sol | 2 +- .../test/L2/GasPriceOracle.t.sol | 36 +-- .../test/L2/L1Withdrawer.t.sol | 4 +- .../test/L2/L2CrossDomainMessenger.t.sol | 12 +- .../test/L2/L2StandardBridge.t.sol | 28 +- .../test/L2/L2ToL1MessagePasser.t.sol | 24 +- .../test/L2/L2ToL2CrossDomainMessenger.t.sol | 19 +- .../test/L2/LiquidityController.t.sol | 8 +- .../test/L2/OptimismSuperchainERC20.t.sol | 9 +- .../test/L2/RevenueSharingIntegration.t.sol | 14 +- .../test/L2/SuperchainERC20.t.sol | 16 +- .../test/L2/SuperchainTokenBridge.t.sol | 8 +- .../test/actors/FaultDisputeActors.sol | 4 +- .../test/cannon/PreimageOracle.t.sol | 36 +-- .../test/dispute/AnchorStateRegistry.t.sol | 6 +- .../test/dispute/DisputeGameFactory.t.sol | 26 +- .../test/dispute/FaultDisputeGame.t.sol | 54 ++-- .../dispute/PermissionedDisputeGame.t.sol | 12 +- .../test/dispute/SuperFaultDisputeGame.t.sol | 30 +- .../SuperPermissionedDisputeGame.t.sol | 6 +- .../test/dispute/lib/LibGameArgs.t.sol | 5 +- .../test/dispute/lib/LibPosition.t.sol | 8 +- .../test/dispute/zk/OptimisticZkGame.t.sol | 2 +- .../test/governance/MintManager.t.sol | 4 +- .../test/integration/EventLogger.t.sol | 12 +- .../invariants/CrossDomainMessenger.t.sol | 3 +- .../test/invariants/FeeSplit.t.sol | 42 +-- .../test/invariants/OptimismPortal2.t.sol | 22 +- .../fuzz/Protocol.unguided.t.sol | 5 +- .../handlers/Protocol.t.sol | 15 +- .../MockL2ToL2CrossDomainMessenger.t.sol | 9 +- .../test/libraries/Blueprint.t.sol | 8 +- .../test/libraries/Bytes.t.sol | 41 ++- .../test/libraries/DeployUtils.t.sol | 21 +- .../test/libraries/DevFeatures.t.sol | 11 +- .../test/libraries/Encoding.t.sol | 35 ++- .../test/libraries/Hashing.t.sol | 3 +- .../test/libraries/SafeCall.t.sol | 10 +- .../test/libraries/SemverComp.t.sol | 10 +- .../test/libraries/TransientContext.t.sol | 8 +- .../test/libraries/trie/MerkleTrie.t.sol | 10 +- .../test/mocks/MockFeeVault.sol | 6 +- .../test/opcm/UpgradeOPChain.t.sol | 23 +- .../test/opcm/UpgradeSuperchainConfig.t.sol | 17 +- .../test/periphery/drippie/Drippie.t.sol | 15 +- .../monitoring/DisputeMonitorHelper.t.sol | 12 +- .../test/safe-tools/SafeTestTools.sol | 102 +++--- .../test/safe/DeputyPauseModule.t.sol | 8 +- .../test/safe/LivenessModule2.t.sol | 3 +- .../test/safe/SaferSafes.t.sol | 12 +- .../test/safe/TimelockGuard.t.sol | 60 ++-- .../test/scripts/FetchChainInfo.t.sol | 25 +- .../test/scripts/VerifyOPCM.t.sol | 7 +- .../test/setup/DisputeGames.sol | 8 +- .../test/setup/ForkLive.s.sol | 48 +-- .../test/setup/PastUpgrades.sol | 16 +- .../test/universal/CrossDomainMessenger.t.sol | 44 ++- .../test/universal/Proxy.t.sol | 3 +- .../test/universal/ProxyAdmin.t.sol | 4 +- .../test/universal/StandardBridge.t.sol | 6 +- .../test/universal/WETH98.t.sol | 3 +- .../test/vendor/Initializable.t.sol | 8 +- .../test/vendor/InitializableOZv5.t.sol | 4 +- 148 files changed, 1677 insertions(+), 1373 deletions(-) create mode 100644 packages/contracts-bedrock/foundry.lock diff --git a/mise.toml b/mise.toml index 7a3aa33b7e0..af6261863d9 100644 --- a/mise.toml +++ b/mise.toml @@ -31,9 +31,9 @@ svm-rs = "0.5.19" # GitHub release, so we need to use the aliasing trick to get mise to not error # The git ref here should be on the `stable` branch. # Updated to use the specific nightly build -forge = "1.2.3" -cast = "1.2.3" -anvil = "1.2.3" +forge = "1.4.3" +cast = "1.4.3" +anvil = "1.4.3" # Other dependencies codecov-uploader = "0.8.0" diff --git a/packages/contracts-bedrock/foundry.lock b/packages/contracts-bedrock/foundry.lock new file mode 100644 index 00000000000..3cffcbae0ea --- /dev/null +++ b/packages/contracts-bedrock/foundry.lock @@ -0,0 +1,50 @@ +{ + "../../kona/crates/protocol/registry/superchain-registry": { + "rev": "300d18077f2799e21e5f2becb64f9cf04c9a0760" + }, + "../../op-rbuilder": { + "rev": "272d462d980a43e7caf568df0fbbc0c2e0066207" + }, + "../../reth": { + "rev": "8fa01eb62eb145112c8285f02aee12c2b4e2bd4d" + }, + "../../rollup-boost": { + "rev": "196237bab2a02298de994b439e0455abb1ac512f" + }, + "lib/forge-std": { + "rev": "6853b9ec7df5dc0c213b05ae67785ad4f4baa0ea" + }, + "lib/kontrol-cheatcodes": { + "rev": "2c48ae1ab44228c199dca29414c0b4b18a3434e6" + }, + "lib/lib-keccak": { + "rev": "3b1e7bbb4cc23e9228097cfebe42aedaf3b8f2b9" + }, + "lib/openzeppelin-contracts": { + "rev": "ecd2ca2cd7cac116f7a37d0e474bbb3d7d5e1c4d" + }, + "lib/openzeppelin-contracts-upgradeable": { + "rev": "0a2cb9a445c365870ed7a8ab461b12acf3e27d63" + }, + "lib/openzeppelin-contracts-v5": { + "rev": "dbb6104ce834628e473d2173bbc9d47f81a9eec3" + }, + "lib/safe-contracts": { + "branch": { + "name": "v1.4.1", + "rev": "bf943f80fec5ac647159d26161446ac5d716a294" + } + }, + "lib/solady": { + "rev": "502cc1ea718e6fa73b380635ee0868b0740595f0" + }, + "lib/solady-v0.0.245": { + "rev": "e0ef35adb0ccd1032794731a995cb599bba7b537" + }, + "lib/solmate": { + "rev": "8f9b23f8838670afda0fd8983f2c41e8037ae6bc" + }, + "lib/superchain-registry": { + "rev": "84bce73573f130008d84bae6e924163bab589a11" + } +} \ No newline at end of file diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index 86de308acd7..77258766d04 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -74,9 +74,12 @@ fs_permissions = [ # 5159 error code is selfdestruct error code ignored_error_codes = ["transient-storage", "code-size", "init-code-size", "too-many-warnings", 5159] -deny_warnings = true +deny = "warnings" ffi = true +[lint] +exclude_lints = ["mixed-case-function", "unsafe-typecast", "asm-keccak256", "screaming-snake-case-immutable", "mixed-case-variable", "divide-before-multiply", "unaliased-plain-import", "screaming-snake-case-const", "unsafe-cheatcode", "erc20-unchecked-transfer", "unaliased-plain-import", "named-struct-fields", "incorrect-shift", "unchecked-call", "unwrapped-modifier-logic", "unwrapped-modifier-logic", "pascal-case-struct", "unused-import"] + # We set the gas limit to max int64 to avoid running out of gas during testing, since the default # gas limit is 1B and some of our tests require more gas than that, such as # test_callWithMinGas_noLeakageLow_succeeds. We use this gas limit since it was the default gas diff --git a/packages/contracts-bedrock/justfile b/packages/contracts-bedrock/justfile index 5168203a810..17c792aaca1 100644 --- a/packages/contracts-bedrock/justfile +++ b/packages/contracts-bedrock/justfile @@ -357,8 +357,7 @@ semgrep-test: # Runs all checks. check: - @just semgrep-test-validity-check \ - semgrep \ + @just semgrep \ lint-check \ snapshots-check-no-build \ unused-imports-check-no-build \ diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index c189309fddd..d077a15a234 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -234,12 +234,12 @@ contract L2Genesis is Script { /// LEGACY_ERC20_ETH and L1_MESSAGE_SENDER are deprecated and are not set. function setPredeployImplementations(Input memory _input) internal { setLegacyMessagePasser(); // 0 - // 01: legacy, not used in OP-Stack + // 01: legacy, not used in OP-Stack setDeployerWhitelist(); // 2 - // 3,4,5: legacy, not used in OP-Stack. + // 3,4,5: legacy, not used in OP-Stack. setWETH(); // 6: WETH (not behind a proxy) setL2CrossDomainMessenger(_input.l1CrossDomainMessengerProxy); // 7 - // 8,9,A,B,C,D,E: legacy, not used in OP-Stack. + // 8,9,A,B,C,D,E: legacy, not used in OP-Stack. setGasPriceOracle(); // f setL2StandardBridge(_input.l1StandardBridgeProxy); // 10 setSequencerFeeVault(_input); // 11 @@ -253,7 +253,7 @@ contract L2Genesis is Script { setBaseFeeVault(_input); // 19 setL1FeeVault(_input); // 1A setOperatorFeeVault(_input); // 1B - // 1C,1D,1E,1F: not used. + // 1C,1D,1E,1F: not used. setSchemaRegistry(); // 20 setEAS(); // 21 setGovernanceToken(_input); // 42: OP (not behind a proxy) @@ -300,9 +300,8 @@ contract L2Genesis is Script { IL2CrossDomainMessenger(impl).initialize({ _l1CrossDomainMessenger: ICrossDomainMessenger(address(0)) }); - IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize({ - _l1CrossDomainMessenger: ICrossDomainMessenger(_l1CrossDomainMessengerProxy) - }); + IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER) + .initialize({ _l1CrossDomainMessenger: ICrossDomainMessenger(_l1CrossDomainMessengerProxy) }); } /// @notice This predeploy is following the safety invariant #1. @@ -311,9 +310,8 @@ contract L2Genesis is Script { IL2StandardBridge(payable(impl)).initialize({ _otherBridge: IStandardBridge(payable(address(0))) }); - IL2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize({ - _otherBridge: IStandardBridge(_l1StandardBridgeProxy) - }); + IL2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)) + .initialize({ _otherBridge: IStandardBridge(_l1StandardBridgeProxy) }); } /// @notice This predeploy is following the safety invariant #1. @@ -343,9 +341,8 @@ contract L2Genesis is Script { IOptimismMintableERC20Factory(impl).initialize({ _bridge: address(0) }); - IOptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY).initialize({ - _bridge: Predeploys.L2_STANDARD_BRIDGE - }); + IOptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY) + .initialize({ _bridge: Predeploys.L2_STANDARD_BRIDGE }); } /// @notice This predeploy is following the safety invariant #2, @@ -551,17 +548,15 @@ contract L2Genesis is Script { function setLiquidityController(Input memory _input) internal { address impl = _setImplementationCode(Predeploys.LIQUIDITY_CONTROLLER); - ILiquidityController(impl).initialize({ - _owner: _input.liquidityControllerOwner, - _gasPayingTokenName: "", - _gasPayingTokenSymbol: "" - }); + ILiquidityController(impl) + .initialize({ _owner: _input.liquidityControllerOwner, _gasPayingTokenName: "", _gasPayingTokenSymbol: "" }); - ILiquidityController(Predeploys.LIQUIDITY_CONTROLLER).initialize({ - _owner: _input.liquidityControllerOwner, - _gasPayingTokenName: _input.gasPayingTokenName, - _gasPayingTokenSymbol: _input.gasPayingTokenSymbol - }); + ILiquidityController(Predeploys.LIQUIDITY_CONTROLLER) + .initialize({ + _owner: _input.liquidityControllerOwner, + _gasPayingTokenName: _input.gasPayingTokenName, + _gasPayingTokenSymbol: _input.gasPayingTokenSymbol + }); } /// @notice This predeploy is following the safety invariant #1. @@ -733,11 +728,10 @@ contract L2Genesis is Script { /// Initialize the implementation using max value for min withdrawal amount to make it unusable IFeeVault(payable(impl)).initialize(address(0), type(uint256).max, Types.WithdrawalNetwork.L1); // Initialize the predeploy - IFeeVault(payable(_vaultAddr)).initialize({ - _recipient: recipient, - _minWithdrawalAmount: minWithdrawalAmount, - _withdrawalNetwork: network - }); + IFeeVault(payable(_vaultAddr)) + .initialize({ + _recipient: recipient, _minWithdrawalAmount: minWithdrawalAmount, _withdrawalNetwork: network + }); } /// @notice Funds the default dev accounts with ether diff --git a/packages/contracts-bedrock/scripts/checks/opcm-upgrade-checks/OPCMUpgradeChecksMocks.sol b/packages/contracts-bedrock/scripts/checks/opcm-upgrade-checks/OPCMUpgradeChecksMocks.sol index aa879a02020..0f523b60620 100644 --- a/packages/contracts-bedrock/scripts/checks/opcm-upgrade-checks/OPCMUpgradeChecksMocks.sol +++ b/packages/contracts-bedrock/scripts/checks/opcm-upgrade-checks/OPCMUpgradeChecksMocks.sol @@ -8,7 +8,12 @@ uint8 constant UPGRADE_INTERNAL_CALL = 2; interface IUpgradeable { function upgrade() external; - function upgradeAndCall(address _newImplementation, address _newImplementationCode, bytes memory _data) external; + function upgradeAndCall( + address _newImplementation, + address _newImplementationCode, + bytes memory _data + ) + external; } ///////// INDIRECT UPGRADE CALLS ////////// diff --git a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index ec618a04bd1..cad279f7245 100644 --- a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -134,7 +134,14 @@ library ChainAssertions { } /// @notice Asserts that the L1CrossDomainMessenger is setup correctly - function checkL1CrossDomainMessenger(IL1CrossDomainMessenger _messenger, Vm _vm, bool _isProxy) internal view { + function checkL1CrossDomainMessenger( + IL1CrossDomainMessenger _messenger, + Vm _vm, + bool _isProxy + ) + internal + view + { console.log( "Running chain assertions on the L1CrossDomainMessenger %s at %s", _isProxy ? "proxy" : "implementation", @@ -144,10 +151,7 @@ library ChainAssertions { // Check that the contract is initialized DeployUtils.assertInitialized({ - _contractAddress: address(_messenger), - _isProxy: _isProxy, - _slot: 0, - _offset: 20 + _contractAddress: address(_messenger), _isProxy: _isProxy, _slot: 0, _offset: 20 }); if (_isProxy) { @@ -370,10 +374,7 @@ library ChainAssertions { // Check that the contract is initialized DeployUtils.assertInitialized({ - _contractAddress: address(superchainConfig), - _isProxy: _isProxy, - _slot: 0, - _offset: 0 + _contractAddress: address(superchainConfig), _isProxy: _isProxy, _slot: 0, _offset: 0 }); if (_isProxy) { @@ -440,17 +441,19 @@ library ChainAssertions { require(keccak256(rdProxyPreamble.initcode) == keccak256(vm.getCode("ResolvedDelegateProxy")), "CHECK-OPCM-200"); } - function checkAnchorStateRegistryProxy(IAnchorStateRegistry _anchorStateRegistryProxy, bool _isProxy) internal { + function checkAnchorStateRegistryProxy( + IAnchorStateRegistry _anchorStateRegistryProxy, + bool _isProxy + ) + internal + { DeployUtils.assertValidContractAddress(address(_anchorStateRegistryProxy)); if (_isProxy) { DeployUtils.assertERC1967ImplementationSet(address(_anchorStateRegistryProxy)); } DeployUtils.assertInitialized({ - _contractAddress: address(_anchorStateRegistryProxy), - _isProxy: _isProxy, - _slot: 0, - _offset: 0 + _contractAddress: address(_anchorStateRegistryProxy), _isProxy: _isProxy, _slot: 0, _offset: 0 }); // The below check cannot be done in the standard validator because the assertion only applies at deploy time. diff --git a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol index da4df8094fa..c0bcbedbc1f 100644 --- a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol @@ -136,7 +136,12 @@ contract Deploy is Deployer { /// @notice Deploy a new OP Chain using an existing SuperchainConfig and ProtocolVersions /// @param _superchainConfigProxy Address of the existing SuperchainConfig proxy /// @param _protocolVersionsProxy Address of the existing ProtocolVersions proxy - function runWithSuperchain(address payable _superchainConfigProxy, address payable _protocolVersionsProxy) public { + function runWithSuperchain( + address payable _superchainConfigProxy, + address payable _protocolVersionsProxy + ) + public + { require(_superchainConfigProxy != address(0), "Deploy: must specify address for superchain config proxy"); require(_protocolVersionsProxy != address(0), "Deploy: must specify address for protocol versions proxy"); @@ -186,9 +191,8 @@ contract Deploy is Deployer { // Set the respected game type according to the deploy config vm.startPrank(ISuperchainConfig(artifacts.mustGetAddress("SuperchainConfigProxy")).guardian()); - IAnchorStateRegistry(artifacts.mustGetAddress("AnchorStateRegistryProxy")).setRespectedGameType( - GameType.wrap(uint32(cfg.respectedGameType())) - ); + IAnchorStateRegistry(artifacts.mustGetAddress("AnchorStateRegistryProxy")) + .setRespectedGameType(GameType.wrap(uint32(cfg.respectedGameType()))); vm.stopPrank(); if (cfg.useAltDA()) { @@ -334,8 +338,7 @@ contract Deploy is Deployer { ); ChainAssertions.checkDelayedWETHImpl(IDelayedWETH(payable(impls.DelayedWETH)), cfg.faultGameWithdrawalDelay()); ChainAssertions.checkMIPS({ - _mips: IMIPS64(address(dio.mipsSingleton)), - _oracle: IPreimageOracle(address(dio.preimageOracleSingleton)) + _mips: IMIPS64(address(dio.mipsSingleton)), _oracle: IPreimageOracle(address(dio.preimageOracleSingleton)) }); IOPContractsManager _opcm; if (DevFeatures.isDevFeatureEnabled(cfg.devFeatureBitmap(), DevFeatures.OPCM_V2)) { @@ -344,10 +347,7 @@ contract Deploy is Deployer { _opcm = IOPContractsManager(address(dio.opcm)); } ChainAssertions.checkOPContractsManager({ - _impls: impls, - _proxies: _proxies(), - _opcm: _opcm, - _mips: IMIPS64(address(dio.mipsSingleton)) + _impls: impls, _proxies: _proxies(), _opcm: _opcm, _mips: IMIPS64(address(dio.mipsSingleton)) }); ChainAssertions.checkSystemConfigImpls(impls); ChainAssertions.checkAnchorStateRegistryProxy(IAnchorStateRegistry(impls.AnchorStateRegistry), false); @@ -398,10 +398,11 @@ contract Deploy is Deployer { address delayedWETHPermissionlessGameProxy = deployERC1967ProxyWithOwner("DelayedWETHProxy", address(deployOutput.opChainProxyAdmin)); vm.broadcast(address(deployOutput.opChainProxyAdmin)); - IProxy(payable(delayedWETHPermissionlessGameProxy)).upgradeToAndCall({ - _implementation: delayedWETHImpl, - _data: abi.encodeCall(IDelayedWETH.initialize, (deployOutput.systemConfigProxy)) - }); + IProxy(payable(delayedWETHPermissionlessGameProxy)) + .upgradeToAndCall({ + _implementation: delayedWETHImpl, + _data: abi.encodeCall(IDelayedWETH.initialize, (deployOutput.systemConfigProxy)) + }); } /// @notice Deploy all of the OP Chain specific contracts using OPCM v2 @@ -482,7 +483,9 @@ contract Deploy is Deployer { blobBasefeeScalar: cfg.blobbasefeeScalar(), l2ChainId: cfg.l2ChainID(), startingAnchorRoot: abi.encode( - Proposal({ root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), l2SequenceNumber: cfg.faultGameGenesisBlock() }) + Proposal({ + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), l2SequenceNumber: cfg.faultGameGenesisBlock() + }) ), saltMixer: saltMixer, gasLimit: uint64(cfg.l2GenesisBlockGasLimit()), @@ -540,8 +543,7 @@ contract Deploy is Deployer { unsafeBlockSigner: cfg.p2pSequencerAddress(), batcher: cfg.batchSenderAddress(), startingAnchorRoot: Proposal({ - root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), - l2SequenceNumber: uint64(cfg.faultGameGenesisBlock()) + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), l2SequenceNumber: uint64(cfg.faultGameGenesisBlock()) }), startingRespectedGameType: GameTypes.PERMISSIONED_CANNON, basefeeScalar: cfg.basefeeScalar(), diff --git a/packages/contracts-bedrock/scripts/deploy/DeployDisputeGame.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployDisputeGame.s.sol index 6e57c6c0344..87e1abbd239 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployDisputeGame.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployDisputeGame.s.sol @@ -79,7 +79,9 @@ contract DeployDisputeGame is Script { impl = IPermissionedDisputeGame( DeployUtils.createDeterministic({ _name: "PermissionedDisputeGame", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IPermissionedDisputeGame.__constructor__, (args))), + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IPermissionedDisputeGame.__constructor__, (args)) + ), _salt: DeployUtils.DEFAULT_SALT }) ); diff --git a/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol index 6b8d1f40695..07bd8304959 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol @@ -199,9 +199,7 @@ contract DeployImplementations is Script { opcm_ = IOPContractsManager( // nosemgrep: sol-safety-deployutils-args DeployUtils.createDeterministic({ - _name: "OPContractsManager", - _args: encodeOPCMConstructor(_input, _output), - _salt: _salt + _name: "OPContractsManager", _args: encodeOPCMConstructor(_input, _output), _salt: _salt }) ); @@ -227,28 +225,28 @@ contract DeployImplementations is Script { private returns (IOPContractsManagerV2 opcmV2_) { - IOPContractsManagerContainer.Implementations memory implementations = IOPContractsManagerContainer - .Implementations({ - superchainConfigImpl: address(_output.superchainConfigImpl), - protocolVersionsImpl: address(_output.protocolVersionsImpl), - l1ERC721BridgeImpl: address(_output.l1ERC721BridgeImpl), - optimismPortalImpl: address(_output.optimismPortalImpl), - optimismPortalInteropImpl: address(_output.optimismPortalInteropImpl), - ethLockboxImpl: address(_output.ethLockboxImpl), - systemConfigImpl: address(_output.systemConfigImpl), - optimismMintableERC20FactoryImpl: address(_output.optimismMintableERC20FactoryImpl), - l1CrossDomainMessengerImpl: address(_output.l1CrossDomainMessengerImpl), - l1StandardBridgeImpl: address(_output.l1StandardBridgeImpl), - disputeGameFactoryImpl: address(_output.disputeGameFactoryImpl), - anchorStateRegistryImpl: address(_output.anchorStateRegistryImpl), - delayedWETHImpl: address(_output.delayedWETHImpl), - mipsImpl: address(_output.mipsSingleton), - faultDisputeGameImpl: address(_output.faultDisputeGameImpl), - permissionedDisputeGameImpl: address(_output.permissionedDisputeGameImpl), - superFaultDisputeGameImpl: address(_output.superFaultDisputeGameImpl), - superPermissionedDisputeGameImpl: address(_output.superPermissionedDisputeGameImpl), - storageSetterImpl: address(_output.storageSetterImpl) - }); + IOPContractsManagerContainer.Implementations memory implementations = + IOPContractsManagerContainer.Implementations({ + superchainConfigImpl: address(_output.superchainConfigImpl), + protocolVersionsImpl: address(_output.protocolVersionsImpl), + l1ERC721BridgeImpl: address(_output.l1ERC721BridgeImpl), + optimismPortalImpl: address(_output.optimismPortalImpl), + optimismPortalInteropImpl: address(_output.optimismPortalInteropImpl), + ethLockboxImpl: address(_output.ethLockboxImpl), + systemConfigImpl: address(_output.systemConfigImpl), + optimismMintableERC20FactoryImpl: address(_output.optimismMintableERC20FactoryImpl), + l1CrossDomainMessengerImpl: address(_output.l1CrossDomainMessengerImpl), + l1StandardBridgeImpl: address(_output.l1StandardBridgeImpl), + disputeGameFactoryImpl: address(_output.disputeGameFactoryImpl), + anchorStateRegistryImpl: address(_output.anchorStateRegistryImpl), + delayedWETHImpl: address(_output.delayedWETHImpl), + mipsImpl: address(_output.mipsSingleton), + faultDisputeGameImpl: address(_output.faultDisputeGameImpl), + permissionedDisputeGameImpl: address(_output.permissionedDisputeGameImpl), + superFaultDisputeGameImpl: address(_output.superFaultDisputeGameImpl), + superPermissionedDisputeGameImpl: address(_output.superPermissionedDisputeGameImpl), + storageSetterImpl: address(_output.storageSetterImpl) + }); // Convert blueprints to V2 blueprints IOPContractsManagerContainer.Blueprints memory blueprints = IOPContractsManagerContainer.Blueprints({ @@ -510,7 +508,9 @@ contract DeployImplementations is Script { IDelayedWETH impl = IDelayedWETH( DeployUtils.createDeterministic({ _name: "DelayedWETH", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IDelayedWETH.__constructor__, (withdrawalDelaySeconds))), + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IDelayedWETH.__constructor__, (withdrawalDelaySeconds)) + ), _salt: _salt }) ); @@ -548,7 +548,9 @@ contract DeployImplementations is Script { IMIPS64 singleton = IMIPS64( DeployUtils.createDeterministic({ _name: "MIPS64", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS64.__constructor__, (preimageOracle, mipsVersion))), + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMIPS64.__constructor__, (preimageOracle, mipsVersion)) + ), _salt: DeployUtils.DEFAULT_SALT }) ); @@ -611,7 +613,9 @@ contract DeployImplementations is Script { IPermissionedDisputeGame impl = IPermissionedDisputeGame( DeployUtils.createDeterministic({ _name: "PermissionedDisputeGame", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IPermissionedDisputeGame.__constructor__, (params))), + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IPermissionedDisputeGame.__constructor__, (params)) + ), _salt: _salt }) ); @@ -1037,10 +1041,7 @@ contract DeployImplementations is Script { ChainAssertions.checkDelayedWETHImpl(_output.delayedWETHImpl, _input.withdrawalDelaySeconds); ChainAssertions.checkDisputeGameFactory(_output.disputeGameFactoryImpl, address(0), address(0), false); DeployUtils.assertInitialized({ - _contractAddress: address(_output.anchorStateRegistryImpl), - _isProxy: false, - _slot: 0, - _offset: 0 + _contractAddress: address(_output.anchorStateRegistryImpl), _isProxy: false, _slot: 0, _offset: 0 }); ChainAssertions.checkL1CrossDomainMessenger(IL1CrossDomainMessenger(impls.L1CrossDomainMessenger), vm, false); ChainAssertions.checkL1ERC721BridgeImpl(_output.l1ERC721BridgeImpl); diff --git a/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol index 190dbd8e44d..ca0f2f92c14 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol @@ -84,7 +84,9 @@ contract DeployMIPS is Script { IMIPS64 singleton = IMIPS64( DeployUtils.createDeterministic({ _name: "MIPS64", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS64.__constructor__, (preimageOracle, mipsVersion))), + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMIPS64.__constructor__, (preimageOracle, mipsVersion)) + ), _salt: DeployUtils.DEFAULT_SALT }) ); diff --git a/packages/contracts-bedrock/scripts/deploy/DeployOPChain.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployOPChain.s.sol index 6f491e15d11..bf3834b2fe0 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployOPChain.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployOPChain.s.sol @@ -174,12 +174,12 @@ contract DeployOPChain is Script { }); // Config 1: PERMISSIONED_CANNON (must be enabled) - IOPContractsManagerUtils.PermissionedDisputeGameConfig memory pdgConfig = IOPContractsManagerUtils - .PermissionedDisputeGameConfig({ - absolutePrestate: _input.disputeAbsolutePrestate, - proposer: _input.proposer, - challenger: _input.challenger - }); + IOPContractsManagerUtils.PermissionedDisputeGameConfig memory pdgConfig = + IOPContractsManagerUtils.PermissionedDisputeGameConfig({ + absolutePrestate: _input.disputeAbsolutePrestate, + proposer: _input.proposer, + challenger: _input.challenger + }); disputeGameConfigs[1] = IOPContractsManagerUtils.DisputeGameConfig({ enabled: permissionedCannonEnabled, @@ -381,28 +381,16 @@ contract DeployOPChain is Script { // Proxies initialized checks DeployUtils.assertInitialized({ - _contractAddress: address(_o.l1ERC721BridgeProxy), - _isProxy: true, - _slot: 0, - _offset: 0 + _contractAddress: address(_o.l1ERC721BridgeProxy), _isProxy: true, _slot: 0, _offset: 0 }); DeployUtils.assertInitialized({ - _contractAddress: address(_o.l1StandardBridgeProxy), - _isProxy: true, - _slot: 0, - _offset: 0 + _contractAddress: address(_o.l1StandardBridgeProxy), _isProxy: true, _slot: 0, _offset: 0 }); DeployUtils.assertInitialized({ - _contractAddress: address(_o.optimismMintableERC20FactoryProxy), - _isProxy: true, - _slot: 0, - _offset: 0 + _contractAddress: address(_o.optimismMintableERC20FactoryProxy), _isProxy: true, _slot: 0, _offset: 0 }); DeployUtils.assertInitialized({ - _contractAddress: address(_o.ethLockboxProxy), - _isProxy: true, - _slot: 0, - _offset: 0 + _contractAddress: address(_o.ethLockboxProxy), _isProxy: true, _slot: 0, _offset: 0 }); require(_o.addressManager.owner() == address(_o.opChainProxyAdmin), "AM-10"); diff --git a/packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol index f40fde014a5..8d719723e19 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol @@ -253,14 +253,12 @@ contract DeployOwnership is Deploy { function deploySecurityCouncilSafe() public broadcast returns (address addr_) { // Deploy the safe with the extra deployer key, and keep the threshold at 1 to allow for further setup. SecurityCouncilConfig memory exampleCouncilConfig = _getExampleCouncilConfig(); - addr_ = payable( - deploySafe({ + addr_ = payable(deploySafe({ _name: "SecurityCouncilSafe", _owners: exampleCouncilConfig.safeConfig.owners, _threshold: 1, _keepDeployer: true - }) - ); + })); } /// @notice Deploy Guardian Safe. @@ -299,9 +297,7 @@ contract DeployOwnership is Deploy { // Deploy and add the Liveness Module. address livenessModule = deployLivenessModule(); _callViaSafe({ - _safe: safe, - _target: address(safe), - _data: abi.encodeCall(ModuleManager.enableModule, (livenessModule)) + _safe: safe, _target: address(safe), _data: abi.encodeCall(ModuleManager.enableModule, (livenessModule)) }); // Configure the LivenessModule2 (second step of installation) @@ -311,17 +307,17 @@ contract DeployOwnership is Deploy { _target: livenessModule, _data: abi.encodeCall( LivenessModule2.configureLivenessModule, - ( - LivenessModule2.ModuleConfig({ + (LivenessModule2.ModuleConfig({ livenessResponsePeriod: livenessModuleConfig.livenessInterval, fallbackOwner: livenessModuleConfig.fallbackOwner - }) - ) + })) ) }); // Finalize configuration by removing the additional deployer key. - removeDeployerFromSafe({ _name: "SecurityCouncilSafe", _newThreshold: exampleCouncilConfig.safeConfig.threshold }); + removeDeployerFromSafe({ + _name: "SecurityCouncilSafe", _newThreshold: exampleCouncilConfig.safeConfig.threshold + }); // Verify the module was configured correctly LivenessModule2.ModuleConfig memory verifyConfig = diff --git a/packages/contracts-bedrock/scripts/deploy/DeploySaferSafes.s.sol b/packages/contracts-bedrock/scripts/deploy/DeploySaferSafes.s.sol index 3c411baed94..bae8a91f517 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeploySaferSafes.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeploySaferSafes.s.sol @@ -30,9 +30,7 @@ contract DeploySaferSafes is Script { function _deploy() internal returns (Output memory output_) { output_.saferSafesSingleton = ISaferSafes( DeployUtils.createDeterministic({ - _name: "SaferSafes", - _args: DeployUtils.encodeConstructor(bytes("")), - _salt: DeployUtils.DEFAULT_SALT + _name: "SaferSafes", _args: DeployUtils.encodeConstructor(bytes("")), _salt: DeployUtils.DEFAULT_SALT }) ); vm.label(address(output_.saferSafesSingleton), "SaferSafesSingleton"); diff --git a/packages/contracts-bedrock/scripts/deploy/DeploySuperchain.s.sol b/packages/contracts-bedrock/scripts/deploy/DeploySuperchain.s.sol index 548d1e5e367..91a057f4f5e 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeploySuperchain.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeploySuperchain.s.sol @@ -245,10 +245,7 @@ contract DeploySuperchain is Script { // Proxy checks. ISuperchainConfig superchainConfig = _output.superchainConfigProxy; DeployUtils.assertInitialized({ - _contractAddress: address(superchainConfig), - _isProxy: true, - _slot: 0, - _offset: 0 + _contractAddress: address(superchainConfig), _isProxy: true, _slot: 0, _offset: 0 }); require(superchainConfig.guardian() == _input.guardian, "SUPCON-10"); diff --git a/packages/contracts-bedrock/scripts/deploy/InteropMigration.s.sol b/packages/contracts-bedrock/scripts/deploy/InteropMigration.s.sol index 47f9a0e37cf..71aa517034e 100644 --- a/packages/contracts-bedrock/scripts/deploy/InteropMigration.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/InteropMigration.s.sol @@ -177,8 +177,7 @@ contract InteropMigration is Script { IOPContractsManagerInteropMigrator.MigrateInput memory inputs = IOPContractsManagerInteropMigrator.MigrateInput({ usePermissionlessGame: _imi.usePermissionlessGame(), startingAnchorRoot: Proposal({ - root: Hash.wrap(_imi.startingAnchorRoot()), - l2SequenceNumber: _imi.startingAnchorL2SequenceNumber() + root: Hash.wrap(_imi.startingAnchorRoot()), l2SequenceNumber: _imi.startingAnchorL2SequenceNumber() }), gameParameters: IOPContractsManagerInteropMigrator.GameParameters({ proposer: _imi.proposer(), diff --git a/packages/contracts-bedrock/scripts/deploy/UpgradeSuperchainConfig.s.sol b/packages/contracts-bedrock/scripts/deploy/UpgradeSuperchainConfig.s.sol index b8bdb483a95..2df09fb8cc6 100644 --- a/packages/contracts-bedrock/scripts/deploy/UpgradeSuperchainConfig.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/UpgradeSuperchainConfig.s.sol @@ -70,8 +70,7 @@ contract UpgradeSuperchainConfig is Script { data = abi.encodeCall( IOPContractsManagerV2.upgradeSuperchain, IOPContractsManagerV2.SuperchainUpgradeInput({ - superchainConfig: _input.superchainConfig, - extraInstructions: _input.extraInstructions + superchainConfig: _input.superchainConfig, extraInstructions: _input.extraInstructions }) ); } else { diff --git a/packages/contracts-bedrock/scripts/deploy/VerifyOPCM.s.sol b/packages/contracts-bedrock/scripts/deploy/VerifyOPCM.s.sol index 8d33a259a90..3c498b647f2 100644 --- a/packages/contracts-bedrock/scripts/deploy/VerifyOPCM.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/VerifyOPCM.s.sol @@ -749,9 +749,7 @@ contract VerifyOPCM is Script { // Put together the artifact info struct. return ArtifactInfo({ - bytecode: bytecode, - deployedBytecode: deployedBytecode, - immutableRefs: _parseImmutableRefs(artifactJson) + bytecode: bytecode, deployedBytecode: deployedBytecode, immutableRefs: _parseImmutableRefs(artifactJson) }); } diff --git a/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol b/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol index 25d0ba2da3a..e6c7f16c6ed 100644 --- a/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol +++ b/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol @@ -281,10 +281,7 @@ library DeployUtils { /// @notice Builds an L1ChugSplashProxy with a dummy implementation. /// @param _proxyImplName Name of the implementation contract. - function buildL1ChugSplashProxyWithImpl(string memory _proxyImplName) - internal - returns (IL1ChugSplashProxy proxy_) - { + function buildL1ChugSplashProxyWithImpl(string memory _proxyImplName) internal returns (IL1ChugSplashProxy proxy_) { proxy_ = IL1ChugSplashProxy( create1({ _name: "L1ChugSplashProxy", @@ -364,7 +361,15 @@ library DeployUtils { /// type(uint8).max (if an implementation contract). /// A call to `initialize` will set proxies to 1 and a call to _disableInitializers will set implementations to /// type(uint8).max. - function assertInitialized(address _contractAddress, bool _isProxy, uint256 _slot, uint256 _offset) internal view { + function assertInitialized( + address _contractAddress, + bool _isProxy, + uint256 _slot, + uint256 _offset + ) + internal + view + { bytes32 slotVal = vm.load(_contractAddress, bytes32(_slot)); uint8 val = uint8((uint256(slotVal) >> (_offset * 8)) & 0xFF); if (_isProxy) { @@ -390,7 +395,13 @@ library DeployUtils { /// @param _etchTo Address of the contract to etch. /// @param _cname The contract name (also used to label the contract). /// @param _artifactPath The path to the artifact to etch. - function etchLabelAndAllowCheatcodes(address _etchTo, string memory _cname, string memory _artifactPath) internal { + function etchLabelAndAllowCheatcodes( + address _etchTo, + string memory _cname, + string memory _artifactPath + ) + internal + { vm.etch(_etchTo, vm.getDeployedCode(_artifactPath)); vm.label(_etchTo, _cname); vm.allowCheatcodes(_etchTo); diff --git a/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol b/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol index 60967a213a2..dabe59445cf 100644 --- a/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol +++ b/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol @@ -111,9 +111,7 @@ contract DeployPeriphery is Script { /// @notice Deploy the Faucet contract. function deployFaucet() public broadcast returns (address addr_) { addr_ = _deployCreate2({ - _name: "Faucet", - _creationCode: type(Faucet).creationCode, - _constructorParams: abi.encode(cfg.faucetAdmin()) + _name: "Faucet", _creationCode: type(Faucet).creationCode, _constructorParams: abi.encode(cfg.faucetAdmin()) }); Faucet faucet = Faucet(payable(addr_)); @@ -175,27 +173,21 @@ contract DeployPeriphery is Script { /// @notice Deploy CheckTrue contract. function deployCheckTrue() public broadcast returns (address addr_) { addr_ = _deployCreate2({ - _name: "CheckTrue", - _creationCode: type(CheckTrue).creationCode, - _constructorParams: hex"" + _name: "CheckTrue", _creationCode: type(CheckTrue).creationCode, _constructorParams: hex"" }); } /// @notice Deploy CheckBalanceLow contract. function deployCheckBalanceLow() public broadcast returns (address addr_) { addr_ = _deployCreate2({ - _name: "CheckBalanceLow", - _creationCode: type(CheckBalanceLow).creationCode, - _constructorParams: hex"" + _name: "CheckBalanceLow", _creationCode: type(CheckBalanceLow).creationCode, _constructorParams: hex"" }); } /// @notice Deploy CheckSecrets contract. function deployCheckSecrets() public broadcast returns (address addr_) { addr_ = _deployCreate2({ - _name: "CheckSecrets", - _creationCode: type(CheckSecrets).creationCode, - _constructorParams: hex"" + _name: "CheckSecrets", _creationCode: type(CheckSecrets).creationCode, _constructorParams: hex"" }); } @@ -292,7 +284,13 @@ contract DeployPeriphery is Script { /// @param _faucet The faucet contract. /// @param _name The name of the auth module. /// @param _config The configuration of the auth module. - function _installAuthModule(Faucet _faucet, string memory _name, Faucet.ModuleConfig memory _config) internal { + function _installAuthModule( + Faucet _faucet, + string memory _name, + Faucet.ModuleConfig memory _config + ) + internal + { AdminFaucetAuthModule module = AdminFaucetAuthModule(artifacts.mustGetAddress(_name)); if (_faucet.isModuleEnabled(module)) { console.log("%s already installed.", _name); diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index b787c12f110..550a3ec7154 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -1,7 +1,7 @@ { "src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge": { - "initCodeHash": "0xacbae98cc7c0f7ecbf36dc44bbf7cb0a011e6e6b781e28b9dbf947e31482b30d", - "sourceCodeHash": "0xe772f7db8033e4a738850cb28ac4849d3a454c93732135a8a10d4f7cb498088e" + "initCodeHash": "0xa957b89a7a77447ddac685ccdfb481d0066315684dd58339b6a65985a0d135f9", + "sourceCodeHash": "0xdccb30b8d3a0f93d1c1054f12dd661ece95310d8350c75e2748bc6091cf009d1" }, "src/L1/ETHLockbox.sol:ETHLockbox": { "initCodeHash": "0x65db3aa3c2e3221065752f66016fa02b66688a01cc5c3066533b27fe620619c8", @@ -12,36 +12,36 @@ "sourceCodeHash": "0xe5f2b1915a201c0b8a107f168f5b9bc8aec8e8e95f938082e42ba5b5c8ebbd11" }, "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger": { - "initCodeHash": "0x3dc659aafb03bd357f92abfc6794af89ee0ddd5212364551637422bf8d0b00f9", - "sourceCodeHash": "0xef3d366cd22eac2dfd22a658e003700c679bd9c38758d9c21befa7335bbd82ad" + "initCodeHash": "0xc1ec4cfb082f933ed4a705a6d6de874c0fe167683e1f8fcf792fdcfeb767ea0d", + "sourceCodeHash": "0xe4b8eb65997a5fb2f761c2d954d4d68f8070f45eaf8710d4982f21daedf2f1a7" }, "src/L1/L1ERC721Bridge.sol:L1ERC721Bridge": { - "initCodeHash": "0x6f586bf82f6e89b75c2cc707e16a71ac921a911acf00f1594659f82e5c819fcc", - "sourceCodeHash": "0x4d48a9cf80dd288d1c54c9576a1a8c12c1c5b9f1694246d0ebba60996f786b69" + "initCodeHash": "0x8754f400a5110749e26f9820e0532b86f0122a6b8ceb10028fd997d39b023ff7", + "sourceCodeHash": "0xf7d67bb0aeea51aa1e6efc6fe99cdb95ee2cbb055a51534ce36d13aa5d9301f0" }, "src/L1/L1StandardBridge.sol:L1StandardBridge": { - "initCodeHash": "0xadd7863f0d14360be0f0c575d07aa304457b190b64a91a8976770fb7c34b28a3", - "sourceCodeHash": "0xfca613b5d055ffc4c3cbccb0773ddb9030abedc1aa6508c9e2e7727cc0cd617b" + "initCodeHash": "0x9367896a99f843fd56024e5f45a7b435a9fa8591cd4a37ffd529e8becf1b0305", + "sourceCodeHash": "0x1a82cfc822f39b3e41ade5041ef6ed8db37354eaf26112105dbb049610a751b3" }, "src/L1/OPContractsManager.sol:OPContractsManager": { - "initCodeHash": "0xd4593c8b35e7a1d5371315011c48116594001b198168d416d5df6d43d49f97c8", - "sourceCodeHash": "0xf8900a57ff29a27f99f6f68b2978b7964629a5d4b8bb351394c10431cae0f617" + "initCodeHash": "0x255b4642dc8aff7860165eb1228398c50ec42f01c2fafa300acd6bd3ee9b2c97", + "sourceCodeHash": "0x93bfc83fde2199feba8394782c7c98b47d3f96849425ab692f9d6b07ab9db2dc" }, "src/L1/OPContractsManagerStandardValidator.sol:OPContractsManagerStandardValidator": { - "initCodeHash": "0xdec828fdb9f9bb7a35ca03d851b041fcd088681957642e949b5d320358d9b9a1", - "sourceCodeHash": "0x17231caf75773e159b91ad37d798c600ed9662b77c236143022456dc9eb83e47" + "initCodeHash": "0x49f1cd40b5545d345c65d56a7cdbd29b44feb545ea8cb1e8d7a78c8ad4371b46", + "sourceCodeHash": "0x182a0a1041b6d9b04827ea607b6cdffaef8386a1ff35c38c0fa0e1327c0b7066" }, "src/L1/OptimismPortal2.sol:OptimismPortal2": { - "initCodeHash": "0x2c01bc6c0a55a1a27263224e05c1b28703ff85c61075bae7ab384b3043820ed2", - "sourceCodeHash": "0x16fb96f4d29a10d03b3b9c70edf56df51e97c2a1a3f0ba36aae79469b446ad5c" + "initCodeHash": "0xe618d22151e72b7b0d91467a6b197a2da3a5c2bc91e6967220135885f672d0b5", + "sourceCodeHash": "0x124ff98963fcbccd25a79011e34a99ed1053f43e8387b69c206917f878f49010" }, "src/L1/OptimismPortalInterop.sol:OptimismPortalInterop": { - "initCodeHash": "0xd361ed3b8d56dcc1f3c068ef3af9c83f3da1165bcdab097250ad4772f350c52e", - "sourceCodeHash": "0xd7d2166d29a22f3a051bc832cbce05f9ca06f1ac1bfb0790f29579f12bb95b8f" + "initCodeHash": "0x80a36592323d3360530959e63ba2aa7c3dc497778a884d9861b4b0873229d76d", + "sourceCodeHash": "0xce227a5fe87ca897f5fd3aa6e0b3a71768797ece8f777ce2db2b6f6bca5328f3" }, "src/L1/ProtocolVersions.sol:ProtocolVersions": { - "initCodeHash": "0xcb59ad9a5ec2a0831b7f4daa74bdacba82ffa03035dafb499a732c641e017f4e", - "sourceCodeHash": "0x3b7b7a1023e6e87ce4680eee3cc4eebefc15b5ec80db3d39e824fbdd521762db" + "initCodeHash": "0x7b1797bcc9b34c752d36493b69bd749750d72566bc34f2c85d950132c7cfc882", + "sourceCodeHash": "0xb3f374307a6609a299c8157db2b51765d92206868aa91353366adce5e0b070cf" }, "src/L1/SuperchainConfig.sol:SuperchainConfig": { "initCodeHash": "0xfb8c98028f1a0e70bb1afbbc532035ea71b0724883554eeaae62e1910a6c1cd9", @@ -52,8 +52,8 @@ "sourceCodeHash": "0xb3184aa5d95a82109e7134d1f61941b30e25f655b9849a0e303d04bbce0cde0b" }, "src/L1/opcm/OPContractsManagerV2.sol:OPContractsManagerV2": { - "initCodeHash": "0x6b2d8f2796b7f348410b2cf429c6e0c6884ef9b500f4ee8d0728a879ae5ed911", - "sourceCodeHash": "0x9d36fe176e2c201854f13d88be3a5d11a714de876c6d6585d367e4392fd9d091" + "initCodeHash": "0x5f3548d6d5502669d34ff3104826d8498c3f74be2f6840a6acb9860e266d96a8", + "sourceCodeHash": "0x12606a3f23e0bd59abe73e80118a6a85734ef22ef37faae1ff7deff13257545d" }, "src/L2/BaseFeeVault.sol:BaseFeeVault": { "initCodeHash": "0x838bbd7f381e84e21887f72bd1da605bfc4588b3c39aed96cbce67c09335b3ee", @@ -100,20 +100,20 @@ "sourceCodeHash": "0xc05bfcfadfd09a56cfea68e7c1853faa36d114d9a54cd307348be143e442c35a" }, "src/L2/L2StandardBridge.sol:L2StandardBridge": { - "initCodeHash": "0xba5b288a396b34488ba7be68473305529c7da7c43e5f1cfc48d6a4aecd014103", - "sourceCodeHash": "0x9dd26676cd1276c807ffd4747236783c5170d0919c70693e70b7e4c4c2675429" + "initCodeHash": "0xd3f6efd0a0af955a2928752b11711cd7e716ed1e7a98d28b8f9ea0e82297ef2a", + "sourceCodeHash": "0x9d8dd8a916d47467e4a5b1397e340bb45df14913c96aae7670abfc6b4590b74f" }, "src/L2/L2StandardBridgeInterop.sol:L2StandardBridgeInterop": { - "initCodeHash": "0xa7a2e7efe8116ebb21f47ee06c1e62d3b2f5a046478094611a2ab4b714154030", - "sourceCodeHash": "0xde724da82ecf3c96b330c2876a7285b6e2b933ac599241eaa3174c443ebbe33a" + "initCodeHash": "0x996a1fe002331a309a55f5a9fc7603eabf2cee5a15ea22d9e4b24d4797090166", + "sourceCodeHash": "0x929831a2f0569b1289a5704f28390e0626925f72780847c426c747bc1454b934" }, "src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser": { "initCodeHash": "0xe30675ea6623cd7390dd2cd1e9a523c92c66956dfab86d06e318eb410cd1989b", "sourceCodeHash": "0xdc7bd63134eeab163a635950f2afd16b59f40f9cf1306f2ed33ad661cc7b4962" }, "src/L2/L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT": { - "initCodeHash": "0xf36eab44c41249b4d8ea95a21b70f1eae55b1a555384870c2f4ca306fa9121b6", - "sourceCodeHash": "0xec1736e67134e22ad9ceb0b8b6c116fd169637aa6729c05d9f0f4b02547aaac0" + "initCodeHash": "0xe09e6219f705bc120b604f25997610f3107daef880f33e380da7ed618b45bb6e", + "sourceCodeHash": "0xfa834ddfd79c9dd9ec1fbfad8e8ad06d3e2467af8c5271e96ad609759684053c" }, "src/L2/L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger": { "initCodeHash": "0x975fd33a3a386310d54dbb01b56f3a6a8350f55a3b6bd7781e5ccc2166ddf2e6", @@ -160,8 +160,8 @@ "sourceCodeHash": "0x76eb2c7617e9b0b8dcd6b88470797cc946798a9ac067e3f195fff971fcabdbf5" }, "src/L2/SuperchainETHBridge.sol:SuperchainETHBridge": { - "initCodeHash": "0xa43665ad0f2b4f092ff04b12e38f24aa8d2cb34ae7a06fc037970743547bdf98", - "sourceCodeHash": "0x862b8a2e5dd5cafcda55e35df7713b0d0b7a93d4d6ce29ea9ca53e045bf63cb4" + "initCodeHash": "0xb94646e13079721fa88b776fcff8d23be6242c53340b5a877fd16ea288c9088d", + "sourceCodeHash": "0x7e322cdc24479b54d2c04b00f4ec993ada4955b875bf5dc99698ff21d59f726b" }, "src/L2/SuperchainRevSharesCalculator.sol:SuperchainRevSharesCalculator": { "initCodeHash": "0xdfff95660d2d470e198054bb1717a30a45a806d2eaa3720fb43acaa3356c9a3e", @@ -176,40 +176,40 @@ "sourceCodeHash": "0x734a6b2aa6406bc145d848ad6071d3af1d40852aeb8f4b2f6f51beaad476e2d3" }, "src/cannon/MIPS64.sol:MIPS64": { - "initCodeHash": "0x13196c1652a1f51cf0c16191f0092898f127eff036c773923c72b02a2823c7f4", - "sourceCodeHash": "0xd745aaf4ed265be7be7bff9bca1dd040e15dfe41e3a453906d72ca09a47f2c8b" + "initCodeHash": "0x3b8d31bed4586a9ab0268d630f43e688acfeecd59f040e61c743fc33f200f4c2", + "sourceCodeHash": "0x9e339987e3ee9c16e33aabc91e5d79c82d2b2cbd55f88b32904d6ce9200db7f1" }, "src/cannon/PreimageOracle.sol:PreimageOracle": { - "initCodeHash": "0x6af5b0e83b455aab8d0946c160a4dc049a4e03be69f8a2a9e87b574f27b25a66", - "sourceCodeHash": "0x03c160168986ffc8d26a90c37366e7ad6da03f49d83449e1f8b3de0f4b590f6f" + "initCodeHash": "0x0d4914ec1a173835ac6964eabe0d54050665a3589e0e3baf6f2ae0e2d2de0dcf", + "sourceCodeHash": "0xebec5104267a7ee5be4dedc8d2e353cdc41f83ce6f3c1754736015a14422bb6d" }, "src/dispute/AnchorStateRegistry.sol:AnchorStateRegistry": { - "initCodeHash": "0xc00fdb1a4ae0ec8d7a96ebaad38ffaee9d96b942ab2a56e0ce2f76639f79ae7c", - "sourceCodeHash": "0xd2837ddf6992926ced31ef1916f95ebb8cc2006e94b82c2287997e5397edfeaf" + "initCodeHash": "0x85d8a2a1fe9054c76ab02416b864c72cf5cdb87ead6e32a2f9bde8386ec8047d", + "sourceCodeHash": "0x9bba0d063378d153ae7261cc41be8a882c12fda518de4b3f6dee0acdaae43455" }, "src/dispute/DelayedWETH.sol:DelayedWETH": { "initCodeHash": "0xa8f60e142108b33675a8f6b6979c73b96eea247884842d796f9f878904c0a906", "sourceCodeHash": "0xdebf2ab3af4d5549c40e9dd9db6b2458af286f323b6891f3b0c4e89f3c8928db" }, "src/dispute/DisputeGameFactory.sol:DisputeGameFactory": { - "initCodeHash": "0xb7ef378c93102b733ec5e96f6448cdae0057b24be05ac99512fd155c0d7d3512", - "sourceCodeHash": "0xb6a8606b6849a28ee413d257a02732794e75165f40810ad1e0721204fce4ba36" + "initCodeHash": "0x2182a63e68d89afa743b28f0a2fbe1067a2252991e4872c5bf59065abafbdd18", + "sourceCodeHash": "0x938ed3ae8e481ef7aa15a8a6f231bab188317b56c8e5d9b38fbe0ca2a844fc2a" }, "src/dispute/FaultDisputeGame.sol:FaultDisputeGame": { - "initCodeHash": "0x2493823ad9fb986a696e61ce8a8ef50c548c6a4e0affeeec63edd119ca206083", - "sourceCodeHash": "0xd6a17c76aed0e561d4b7293dc17157b9435173c0a61ec40dc4ff8e49e2c1e601" + "initCodeHash": "0x43294a9f4f07acad0ab70d6e9cb4dfbf91675bc83da6cb9b9493cbd01a8cfca8", + "sourceCodeHash": "0x260cbb04c2e58b83ddb961990e33ff8473c9b95e7a2e2ae000c3e03b178b9feb" }, "src/dispute/PermissionedDisputeGame.sol:PermissionedDisputeGame": { "initCodeHash": "0x940289cf9018b6b22b532a90ee1e731427d435d7982e4e78ea44f25e1cb874a2", "sourceCodeHash": "0x8302f265145ebccb05d1dfb123a1176bb0b29a06167817b0020eac104da8a841" }, "src/dispute/SuperFaultDisputeGame.sol:SuperFaultDisputeGame": { - "initCodeHash": "0xb5ce71bc56109055cd0dc71fc63015443bbdb29c5975e049802cd1b5188f06ca", - "sourceCodeHash": "0x3096a447574168528555f091a357a120b1dee6f35b50634b7d705ace1ef9c0ad" + "initCodeHash": "0xe087ca1944daada8c7d97b6b30057c97719ce54e9f5cf9f9a6af976353d7780e", + "sourceCodeHash": "0x533c0f83fa6f3c55c5480c1ee41a48f953a161b5ff0a4c266760d43153ab9ac7" }, "src/dispute/SuperPermissionedDisputeGame.sol:SuperPermissionedDisputeGame": { - "initCodeHash": "0xa080730728e812e8b02d03b5857b23d16ade46f1656f26f22274835a3100edd7", - "sourceCodeHash": "0x314b6e0412f698ce3531e8176ce8e5b8a3976cc3fa9d7ecb1f3278612f90ed4e" + "initCodeHash": "0x3c2ef2e3832a1c9dfad63318857ea332be24e79e4c7da26aa0bff7e266dc75f2", + "sourceCodeHash": "0xd37db2c7215c776a6efc4c06636299f9805771612df5624f4d617ee578ef1f5d" }, "src/dispute/zk/OptimisticZkGame.sol:OptimisticZkGame": { "initCodeHash": "0xffd6e4c9ab9cbbc40d972db32f87d547d5b13b0f122549f588ba39b7ae609311", @@ -236,8 +236,8 @@ "sourceCodeHash": "0x62e1354f04f8de3edb58aa8517faf803cd69e6b5f1ce850ac83690bf6be0d25a" }, "src/safe/LivenessModule.sol:LivenessModule": { - "initCodeHash": "0x5e980d76c3eb8820b25e45142c68324a65e47b0fabbf171a6a4bef10476ec80e", - "sourceCodeHash": "0x7fc4789b082bc8ecd29c4c75a06058f0ff0b72f1c1028a42db6f1c35269c8865" + "initCodeHash": "0xf55316e85e58b74934e6075b22c85c4b77d4505e2c9e750e42865c01707e50c1", + "sourceCodeHash": "0x2ec4b97daac34eb2628a9637a39603184a8a1822240fa8df45aa7dbbc4e281ec" }, "src/safe/SaferSafes.sol:SaferSafes": { "initCodeHash": "0x0ad1f0f33517132b06a225b51e6eac48904d4ad691e0045eb70244d811d0d99d", @@ -256,11 +256,11 @@ "sourceCodeHash": "0xcfbaae5729ca367328ea546bbbe96194341586b2f4bfbd0cfa84acc09324d59b" }, "src/vendor/eas/EAS.sol:EAS": { - "initCodeHash": "0xbd79d6fff128b3da3e09ead84b805b7540740190488f2791a6b4e5b7aabf9cff", - "sourceCodeHash": "0x3512c3a1b5871341346f6646a04c0895dd563e9824f2ab7ab965b6a81a41ad2e" + "initCodeHash": "0x2dc3758ffa5bb29d774155507aa6e825131a8b8a408e02c51a826d2157c3e188", + "sourceCodeHash": "0x7d3d3c2db5d3f1df2acd50838fbc06bc659d0e894f32fd4fa40a59d68207655a" }, "src/vendor/eas/SchemaRegistry.sol:SchemaRegistry": { - "initCodeHash": "0x2bfce526f82622288333d53ca3f43a0a94306ba1bab99241daa845f8f4b18bd4", - "sourceCodeHash": "0xf49d7b0187912a6bb67926a3222ae51121e9239495213c975b3b4b217ee57a1b" + "initCodeHash": "0xd17acb17a562902a864531712531b5f16f4bb01fbd05f6c0fe837f5791a952cf", + "sourceCodeHash": "0xb8964233f4baa4545f2032f294e116997e77f05c886a91ae639b4e01e969796e" } } \ No newline at end of file diff --git a/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol b/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol index 0b28f7bce20..f89d78fb488 100644 --- a/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol +++ b/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol @@ -95,8 +95,8 @@ contract DataAvailabilityChallenge is OwnableUpgradeable, ISemver { event BalanceChanged(address account, uint256 balance); /// @notice Semantic version. - /// @custom:semver 1.0.1 - string public constant version = "1.0.1"; + /// @custom:semver 1.0.2 + string public constant version = "1.0.2"; /// @notice The fixed cost of resolving a challenge. /// @dev The value is estimated by measuring the cost of resolving with `bytes(0)` @@ -392,9 +392,9 @@ contract DataAvailabilityChallenge is OwnableUpgradeable, ISemver { address challenger = _resolvedChallenge.challenger; // approximate the cost of resolving a challenge with the provided pre-image size - uint256 resolutionCost = ( - fixedResolutionCost + _preImageLength * variableResolutionCost / variableResolutionCostPrecision - ) * block.basefee; + uint256 resolutionCost = + (fixedResolutionCost + _preImageLength * variableResolutionCost / variableResolutionCostPrecision) + * block.basefee; // refund bond exceeding the resolution cost to the challenger if (lockedBond > resolutionCost) { diff --git a/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol index b6208c80180..8938e38a128 100644 --- a/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol +++ b/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol @@ -36,8 +36,8 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ProxyAdminOwnedBase, Re address private spacer_253_0_20; /// @notice Semantic version. - /// @custom:semver 2.11.0 - string public constant version = "2.11.0"; + /// @custom:semver 2.11.1 + string public constant version = "2.11.1"; /// @notice Contract of the SystemConfig. ISystemConfig public systemConfig; @@ -50,7 +50,13 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ProxyAdminOwnedBase, Re /// @notice Initializes the contract. /// @param _systemConfig Contract of the SystemConfig contract on this network. /// @param _portal Contract of the OptimismPortal contract on this network. - function initialize(ISystemConfig _systemConfig, IOptimismPortal _portal) external reinitializer(initVersion()) { + function initialize( + ISystemConfig _systemConfig, + IOptimismPortal _portal + ) + external + reinitializer(initVersion()) + { // Initialization transactions must come from the ProxyAdmin or its owner. _assertOnlyProxyAdminOrProxyAdminOwner(); @@ -82,11 +88,7 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ProxyAdminOwnedBase, Re /// @inheritdoc CrossDomainMessenger function _sendMessage(address _to, uint64 _gasLimit, uint256 _value, bytes memory _data) internal override { portal.depositTransaction{ value: _value }({ - _to: _to, - _value: _value, - _gasLimit: _gasLimit, - _isCreation: false, - _data: _data + _to: _to, _value: _value, _gasLimit: _gasLimit, _isCreation: false, _data: _data }); } diff --git a/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol b/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol index 98c557a603c..bfdd20472d3 100644 --- a/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol +++ b/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol @@ -33,8 +33,8 @@ contract L1ERC721Bridge is ERC721Bridge, ProxyAdminOwnedBase, ReinitializableBas address private spacer_50_0_20; /// @notice Semantic version. - /// @custom:semver 2.9.0 - string public constant version = "2.9.0"; + /// @custom:semver 2.9.1 + string public constant version = "2.9.1"; /// @notice Address of the SystemConfig contract. ISystemConfig public systemConfig; @@ -59,7 +59,9 @@ contract L1ERC721Bridge is ERC721Bridge, ProxyAdminOwnedBase, ReinitializableBas // Now perform initialization logic. systemConfig = _systemConfig; - __ERC721Bridge_init({ _messenger: _messenger, _otherBridge: ERC721Bridge(payable(Predeploys.L2_ERC721_BRIDGE)) }); + __ERC721Bridge_init({ + _messenger: _messenger, _otherBridge: ERC721Bridge(payable(Predeploys.L2_ERC721_BRIDGE)) + }); } /// @inheritdoc ERC721Bridge diff --git a/packages/contracts-bedrock/src/L1/L1StandardBridge.sol b/packages/contracts-bedrock/src/L1/L1StandardBridge.sol index 465ec7f7ed5..05abcf0ab8c 100644 --- a/packages/contracts-bedrock/src/L1/L1StandardBridge.sol +++ b/packages/contracts-bedrock/src/L1/L1StandardBridge.sol @@ -77,8 +77,8 @@ contract L1StandardBridge is StandardBridge, ProxyAdminOwnedBase, Reinitializabl ); /// @notice Semantic version. - /// @custom:semver 2.8.0 - string public constant version = "2.8.0"; + /// @custom:semver 2.8.1 + string public constant version = "2.8.1"; /// @custom:legacy /// @custom:spacer superchainConfig @@ -114,8 +114,7 @@ contract L1StandardBridge is StandardBridge, ProxyAdminOwnedBase, Reinitializabl // Now perform initialization logic. systemConfig = _systemConfig; __StandardBridge_init({ - _messenger: _messenger, - _otherBridge: StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)) + _messenger: _messenger, _otherBridge: StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)) }); } @@ -258,7 +257,14 @@ contract L1StandardBridge is StandardBridge, ProxyAdminOwnedBase, Reinitializabl /// @param _to Address of the recipient on L2. /// @param _minGasLimit Minimum gas limit for the deposit message on L2. /// @param _extraData Optional data to forward to L2. - function _initiateETHDeposit(address _from, address _to, uint32 _minGasLimit, bytes memory _extraData) internal { + function _initiateETHDeposit( + address _from, + address _to, + uint32 _minGasLimit, + bytes memory _extraData + ) + internal + { _initiateBridgeETH(_from, _to, msg.value, _minGasLimit, _extraData); } diff --git a/packages/contracts-bedrock/src/L1/OPContractsManager.sol b/packages/contracts-bedrock/src/L1/OPContractsManager.sol index 8ab8b23c425..4e707aa634b 100644 --- a/packages/contracts-bedrock/src/L1/OPContractsManager.sol +++ b/packages/contracts-bedrock/src/L1/OPContractsManager.sol @@ -385,7 +385,13 @@ abstract contract OPContractsManagerBase { /// @param _dgf The dispute game factory /// @param _gameType The game type /// @param _newGame The new game implementation - function setDGFImplementation(IDisputeGameFactory _dgf, GameType _gameType, IDisputeGame _newGame) internal { + function setDGFImplementation( + IDisputeGameFactory _dgf, + GameType _gameType, + IDisputeGame _newGame + ) + internal + { _dgf.setImplementation(_gameType, _newGame); } @@ -457,7 +463,9 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { /// @notice Constructor to initialize the immutable thisOPCM variable and contract addresses /// @param _contractsContainer The blueprint contract addresses and implementation contract addresses - constructor(OPContractsManagerContractsContainer _contractsContainer) OPContractsManagerBase(_contractsContainer) { } + constructor(OPContractsManagerContractsContainer _contractsContainer) + OPContractsManagerBase(_contractsContainer) + { } /// @notice Deploys a new dispute game and installs it into the DisputeGameFactory. Inputted /// game configs must be added in ascending GameType order. @@ -500,14 +508,12 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { // Deploy the DelayedWETH proxy. We use the chain ID and the game type in the // contract name to ensure that the contract is unique across chains. outputs[i].delayedWETH = IDelayedWETH( - payable( - deployProxy( + payable(deployProxy( l2ChainId, gameConfig.systemConfig.proxyAdmin(), gameConfig.saltMixer, string.concat("DelayedWETH-", Strings.toString(uint256(gameTypeInt))) - ) - ) + )) ); // Initialize the proxy. @@ -556,7 +562,9 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { vm: address(gameConfig.vm), anchorStateRegistry: address(getAnchorStateRegistry(ISystemConfig(gameConfig.systemConfig))), weth: address(outputs[i].delayedWETH), - l2ChainId: gameConfig.disputeGameType.raw() == GameTypes.PERMISSIONED_CANNON.raw() ? l2ChainId : 0, // must + l2ChainId: gameConfig.disputeGameType.raw() == GameTypes.PERMISSIONED_CANNON.raw() + ? l2ChainId + : 0, // must // be zero for SUPER gam types proposer: getProposer( dgf, IPermissionedDisputeGame(address(existingGame)), gameConfig.disputeGameType @@ -639,7 +647,7 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { // Select the prestate to use Claim prestate = gameType.raw() == GameTypes.CANNON_KONA.raw() - || gameType.raw() == GameTypes.SUPER_CANNON_KONA.raw() + || gameType.raw() == GameTypes.SUPER_CANNON_KONA.raw() ? _prestateUpdateInputs[i].cannonKonaPrestate : _prestateUpdateInputs[i].cannonPrestate; @@ -690,7 +698,9 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { error OPContractsManagerUpgrader_SuperchainConfigAlreadyUpToDate(); /// @param _contractsContainer The OPContractsManagerContractsContainer to use. - constructor(OPContractsManagerContractsContainer _contractsContainer) OPContractsManagerBase(_contractsContainer) { } + constructor(OPContractsManagerContractsContainer _contractsContainer) + OPContractsManagerBase(_contractsContainer) + { } /// @notice Upgrades a set of chains to the latest implementation contracts /// @param _opChainConfigs Array of OpChain structs, one per chain to upgrade @@ -879,7 +889,9 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { _newAbsolutePrestate: cannonKonaPrestate, // CANNON and CANNON_KONA use the same weth and asr proxy addresses _newDelayedWeth: getWETH(dgf, permissionlessDisputeGame, GameTypes.CANNON), - _newAnchorStateRegistryProxy: getAnchorStateRegistry(dgf, permissionlessDisputeGame, GameTypes.CANNON), + _newAnchorStateRegistryProxy: getAnchorStateRegistry( + dgf, permissionlessDisputeGame, GameTypes.CANNON + ), _gameType: GameTypes.CANNON_KONA, _disputeGameFactory: disputeGameFactory }); @@ -895,11 +907,9 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { /// @dev This function will revert if the SuperchainConfig is already at or above the target version. function upgradeSuperchainConfig(ISuperchainConfig _superchainConfig) external { // Only upgrade the superchainConfig if the current version is less than the target version. - if ( - SemverComp.gte( + if (SemverComp.gte( _superchainConfig.version(), ISuperchainConfig(getImplementations().superchainConfigImpl).version() - ) - ) { + )) { revert OPContractsManagerUpgrader_SuperchainConfigAlreadyUpToDate(); } @@ -1046,7 +1056,9 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { /// @param deployOutput ABI-encoded output of the deployment. event Deployed(uint256 indexed l2ChainId, address indexed deployer, bytes deployOutput); - constructor(OPContractsManagerContractsContainer _contractsContainer) OPContractsManagerBase(_contractsContainer) { } + constructor(OPContractsManagerContractsContainer _contractsContainer) + OPContractsManagerBase(_contractsContainer) + { } /// @notice Deploys a new OP Stack chain. /// @param _input The deploy input parameters for the deployment. @@ -1095,8 +1107,9 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { // -------- Deploy Proxy Contracts -------- // Deploy ERC-1967 proxied contracts. - output.l1ERC721BridgeProxy = - IL1ERC721Bridge(deployProxy(_input.l2ChainId, output.opChainProxyAdmin, _input.saltMixer, "L1ERC721Bridge")); + output.l1ERC721BridgeProxy = IL1ERC721Bridge( + deployProxy(_input.l2ChainId, output.opChainProxyAdmin, _input.saltMixer, "L1ERC721Bridge") + ); output.optimismPortalProxy = IOptimismPortal( payable(deployProxy(_input.l2ChainId, output.opChainProxyAdmin, _input.saltMixer, "OptimismPortal")) ); @@ -1116,13 +1129,11 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { // Deploy legacy proxied contracts. output.l1StandardBridgeProxy = IL1StandardBridge( - payable( - Blueprint.deployFrom( + payable(Blueprint.deployFrom( blueprint.l1ChugSplashProxy, computeSalt(_input.l2ChainId, _input.saltMixer, "L1StandardBridge"), abi.encode(output.opChainProxyAdmin) - ) - ) + )) ); output.opChainProxyAdmin.setProxyType(address(output.l1StandardBridgeProxy), IProxyAdmin.ProxyType.CHUGSPLASH); string memory contractName = "OVM_L1CrossDomainMessenger"; @@ -1133,16 +1144,15 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { abi.encode(output.addressManager, contractName) ) ); - output.opChainProxyAdmin.setProxyType( - address(output.l1CrossDomainMessengerProxy), IProxyAdmin.ProxyType.RESOLVED - ); + output.opChainProxyAdmin + .setProxyType(address(output.l1CrossDomainMessengerProxy), IProxyAdmin.ProxyType.RESOLVED); output.opChainProxyAdmin.setImplementationName(address(output.l1CrossDomainMessengerProxy), contractName); // Eventually we will switch from DelayedWETHPermissionedGameProxy to DelayedWETHPermissionlessGameProxy. output.delayedWETHPermissionedGameProxy = IDelayedWETH( - payable( - deployProxy(_input.l2ChainId, output.opChainProxyAdmin, _input.saltMixer, "DelayedWETHPermissionedGame") - ) + payable(deployProxy( + _input.l2ChainId, output.opChainProxyAdmin, _input.saltMixer, "DelayedWETHPermissionedGame" + )) ); // -------- Set and Initialize Proxy Implementations -------- @@ -1277,7 +1287,7 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { optimismMintableERC20Factory: address(_output.optimismMintableERC20FactoryProxy), delayedWETH: address(0), // Will be used in OPCMv2. opcm: address(0) // Unsupported for V1. - }); + }); assertValidContractAddress(opChainAddrs_.l1CrossDomainMessenger); assertValidContractAddress(opChainAddrs_.l1ERC721Bridge); @@ -1325,8 +1335,9 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { virtual returns (bytes memory) { - return - abi.encodeCall(IL1ERC721Bridge.initialize, (_output.l1CrossDomainMessengerProxy, _output.systemConfigProxy)); + return abi.encodeCall( + IL1ERC721Bridge.initialize, (_output.l1CrossDomainMessengerProxy, _output.systemConfigProxy) + ); } /// @notice Helper method for encoding the OptimismPortal initializer data. @@ -1429,8 +1440,9 @@ contract OPContractsManagerDeployer is OPContractsManagerBase { virtual returns (bytes memory) { - return - abi.encodeCall(IL1CrossDomainMessenger.initialize, (_output.systemConfigProxy, _output.optimismPortalProxy)); + return abi.encodeCall( + IL1CrossDomainMessenger.initialize, (_output.systemConfigProxy, _output.optimismPortalProxy) + ); } /// @notice Helper method for encoding the L1StandardBridge initializer data. @@ -1519,7 +1531,9 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { } /// @param _contractsContainer Container of blueprints and implementations. - constructor(OPContractsManagerContractsContainer _contractsContainer) OPContractsManagerBase(_contractsContainer) { } + constructor(OPContractsManagerContractsContainer _contractsContainer) + OPContractsManagerBase(_contractsContainer) + { } /// @notice Migrates one or more OP Stack chains to use the Super Root dispute games and shared /// dispute game contracts. @@ -1680,14 +1694,12 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { { // Deploy a new DelayedWETH proxy for the permissioned game. IDelayedWETH newPermissionedDelayedWETHProxy = IDelayedWETH( - payable( - deployProxy({ + payable(deployProxy({ _l2ChainId: block.timestamp, _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "DelayedWETH-Interop-Permissioned" - }) - ) + })) ); // Initialize the new DelayedWETH proxy. @@ -1726,14 +1738,12 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { if (_input.usePermissionlessGame) { // Deploy a new DelayedWETH proxy for the permissionless game. IDelayedWETH newPermissionlessDelayedWETHProxy = IDelayedWETH( - payable( - deployProxy({ + payable(deployProxy({ _l2ChainId: block.timestamp, _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "DelayedWETH-Interop-Permissionless" - }) - ) + })) ); // Initialize the new DelayedWETH proxy. @@ -1917,9 +1927,9 @@ contract OPContractsManager is ISemver { /// @dev This needs to stay at 6.x.x because the next release will ship OPCMv2. Since we are /// not actually planning to release a 7.x.x of OPCMv1, it needs to stay at 6.x.x to avoid /// errors in the versioning rules of OPCMv2. - /// @custom:semver 6.0.3 + /// @custom:semver 6.0.4 function version() public pure virtual returns (string memory) { - return "6.0.3"; + return "6.0.4"; } OPContractsManagerGameTypeAdder public immutable opcmGameTypeAdder; diff --git a/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol b/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol index 7831f956fde..3fc98d7a4d0 100644 --- a/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol +++ b/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol @@ -40,8 +40,8 @@ import { IBigStepper } from "interfaces/dispute/IBigStepper.sol"; /// before and after an upgrade. contract OPContractsManagerStandardValidator is ISemver { /// @notice The semantic version of the OPContractsManagerStandardValidator contract. - /// @custom:semver 2.3.0 - string public constant version = "2.3.0"; + /// @custom:semver 2.3.1 + string public constant version = "2.3.1"; /// @notice The SuperchainConfig contract. ISuperchainConfig public superchainConfig; @@ -402,8 +402,9 @@ contract OPContractsManagerStandardValidator is ISemver { _errors = internalRequire( LibString.eq(getVersion(address(_bridge)), getVersion(l1ERC721BridgeImpl)), "L721B-10", _errors ); - _errors = - internalRequire(getProxyImplementation(_admin, address(_bridge)) == l1ERC721BridgeImpl, "L721B-20", _errors); + _errors = internalRequire( + getProxyImplementation(_admin, address(_bridge)) == l1ERC721BridgeImpl, "L721B-20", _errors + ); IL1CrossDomainMessenger _l1XDM = IL1CrossDomainMessenger(_sysCfg.l1CrossDomainMessenger()); _errors = internalRequire(address(_bridge.OTHER_BRIDGE()) == Predeploys.L2_ERC721_BRIDGE, "L721B-30", _errors); diff --git a/packages/contracts-bedrock/src/L1/OptimismPortal2.sol b/packages/contracts-bedrock/src/L1/OptimismPortal2.sol index 7024fad39c7..09d6f6af622 100644 --- a/packages/contracts-bedrock/src/L1/OptimismPortal2.sol +++ b/packages/contracts-bedrock/src/L1/OptimismPortal2.sol @@ -208,9 +208,9 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ReinitializableBase error OptimismPortal_InvalidLockboxState(); /// @notice Semantic version. - /// @custom:semver 5.2.0 + /// @custom:semver 5.2.1 function version() public pure virtual returns (string memory) { - return "5.2.0"; + return "5.2.1"; } /// @param _proofMaturityDelaySeconds The proof maturity delay in seconds. @@ -405,11 +405,11 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ReinitializableBase // be relayed on L1. if ( SecureMerkleTrie.verifyInclusionProof({ - _key: abi.encode(storageKey), - _value: hex"01", - _proof: _withdrawalProof, - _root: _outputRootProof.messagePasserStorageRoot - }) == false + _key: abi.encode(storageKey), + _value: hex"01", + _proof: _withdrawalProof, + _root: _outputRootProof.messagePasserStorageRoot + }) == false ) { revert OptimismPortal_InvalidMerkleProof(); } diff --git a/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol b/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol index dec588d5cc1..01f01a300f6 100644 --- a/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol +++ b/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol @@ -229,9 +229,9 @@ contract OptimismPortalInterop is Initializable, ResourceMetering, Reinitializab error OptimismPortal_MigratingToSameRegistry(); /// @notice Semantic version. - /// @custom:semver 5.2.0+interop + /// @custom:semver 5.2.1+interop function version() public pure virtual returns (string memory) { - return "5.2.0+interop"; + return "5.2.1+interop"; } /// @param _proofMaturityDelaySeconds The proof maturity delay in seconds. @@ -390,7 +390,12 @@ contract OptimismPortalInterop is Initializable, ResourceMetering, Reinitializab /// ETHLockbox.migrateLiquidity() function within the same transaction. /// @param _newLockbox The address of the new ETHLockbox contract. /// @param _newAnchorStateRegistry The address of the new AnchorStateRegistry contract. - function migrateToSuperRoots(IETHLockbox _newLockbox, IAnchorStateRegistry _newAnchorStateRegistry) external { + function migrateToSuperRoots( + IETHLockbox _newLockbox, + IAnchorStateRegistry _newAnchorStateRegistry + ) + external + { // Migration can only be triggered when the system is not paused because the migration can // potentially unpause the system as a result of the modified ETHLockbox address. _assertNotPaused(); @@ -586,11 +591,11 @@ contract OptimismPortalInterop is Initializable, ResourceMetering, Reinitializab // be relayed on L1. if ( SecureMerkleTrie.verifyInclusionProof({ - _key: abi.encode(storageKey), - _value: hex"01", - _proof: _withdrawalProof, - _root: _outputRootProof.messagePasserStorageRoot - }) == false + _key: abi.encode(storageKey), + _value: hex"01", + _proof: _withdrawalProof, + _root: _outputRootProof.messagePasserStorageRoot + }) == false ) { revert OptimismPortal_InvalidMerkleProof(); } diff --git a/packages/contracts-bedrock/src/L1/ProtocolVersions.sol b/packages/contracts-bedrock/src/L1/ProtocolVersions.sol index ae3fad92942..94291374817 100644 --- a/packages/contracts-bedrock/src/L1/ProtocolVersions.sol +++ b/packages/contracts-bedrock/src/L1/ProtocolVersions.sol @@ -41,8 +41,8 @@ contract ProtocolVersions is OwnableUpgradeable, ISemver { event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data); /// @notice Semantic version. - /// @custom:semver 1.1.1 - string public constant version = "1.1.1"; + /// @custom:semver 1.1.2 + string public constant version = "1.1.2"; /// @notice Constructs the ProtocolVersion contract. constructor() { @@ -53,7 +53,14 @@ contract ProtocolVersions is OwnableUpgradeable, ISemver { /// @param _owner Initial owner of the contract. /// @param _required Required protocol version to operate on this chain. /// @param _recommended Recommended protocol version to operate on thi chain. - function initialize(address _owner, ProtocolVersion _required, ProtocolVersion _recommended) external initializer { + function initialize( + address _owner, + ProtocolVersion _required, + ProtocolVersion _recommended + ) + external + initializer + { __Ownable_init(); transferOwnership(_owner); _setRequired(_required); diff --git a/packages/contracts-bedrock/src/L1/ProxyAdminOwnedBase.sol b/packages/contracts-bedrock/src/L1/ProxyAdminOwnedBase.sol index b23ce019c36..ad4b91e7819 100644 --- a/packages/contracts-bedrock/src/L1/ProxyAdminOwnedBase.sol +++ b/packages/contracts-bedrock/src/L1/ProxyAdminOwnedBase.sol @@ -59,7 +59,8 @@ abstract contract ProxyAdminOwnedBase { if ( Storage.getBytes32(keccak256(abi.encode(address(this), uint256(0)))) != bytes32( - uint256(bytes32("OVM_L1CrossDomainMessenger")) | uint256(bytes("OVM_L1CrossDomainMessenger").length * 2) + uint256(bytes32("OVM_L1CrossDomainMessenger")) + | uint256(bytes("OVM_L1CrossDomainMessenger").length * 2) ) ) { revert ProxyAdminOwnedBase_NotResolvedDelegateProxy(); diff --git a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerContainer.sol b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerContainer.sol index 5d3419bdbea..b925cac43e5 100644 --- a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerContainer.sol +++ b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerContainer.sol @@ -64,7 +64,11 @@ contract OPContractsManagerContainer { /// @param _blueprints The blueprint contract addresses. /// @param _implementations The implementation contract addresses. /// @param _devFeatureBitmap The bitmap of development features that are enabled. - constructor(Blueprints memory _blueprints, Implementations memory _implementations, bytes32 _devFeatureBitmap) { + constructor( + Blueprints memory _blueprints, + Implementations memory _implementations, + bytes32 _devFeatureBitmap + ) { bps = _blueprints; impls = _implementations; devFeatureBitmap = _devFeatureBitmap; diff --git a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerMigrator.sol b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerMigrator.sol index c8a018f9516..20bc2392e13 100644 --- a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerMigrator.sol +++ b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerMigrator.sol @@ -97,8 +97,7 @@ contract OPContractsManagerMigrator is OPContractsManagerUtilsCaller { IOPContractsManagerUtils.ExtraInstruction[] memory extraInstructions = new IOPContractsManagerUtils.ExtraInstruction[](1); extraInstructions[0] = IOPContractsManagerUtils.ExtraInstruction({ - key: Constants.PERMITTED_PROXY_DEPLOYMENT_KEY, - data: bytes(Constants.PERMIT_ALL_CONTRACTS_INSTRUCTION) + key: Constants.PERMITTED_PROXY_DEPLOYMENT_KEY, data: bytes(Constants.PERMIT_ALL_CONTRACTS_INSTRUCTION) }); // Deploy the new ETHLockbox. diff --git a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtilsCaller.sol b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtilsCaller.sol index 63eb3bdb8ee..549f3988318 100644 --- a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtilsCaller.sol +++ b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtilsCaller.sol @@ -141,8 +141,7 @@ abstract contract OPContractsManagerUtilsCaller { internal returns (address payable) { - return payable( - abi.decode( + return payable(abi.decode( _delegatecall( abi.encodeCall( IOPContractsManagerUtils.loadOrDeployProxy, @@ -150,8 +149,7 @@ abstract contract OPContractsManagerUtilsCaller { ) ), (address) - ) - ); + )); } /// @notice Upgrades a contract by resetting the initialized slot and calling the initializer. @@ -159,7 +157,14 @@ abstract contract OPContractsManagerUtilsCaller { /// @param _target The target of the contract. /// @param _implementation The implementation of the contract. /// @param _data The data to call the initializer with. - function _upgrade(IProxyAdmin _proxyAdmin, address _target, address _implementation, bytes memory _data) internal { + function _upgrade( + IProxyAdmin _proxyAdmin, + address _target, + address _implementation, + bytes memory _data + ) + internal + { _upgrade(_proxyAdmin, _target, _implementation, _data, bytes32(0), 0); } diff --git a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol index 85e4bfbd605..a5963bfbfda 100644 --- a/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol +++ b/packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol @@ -147,9 +147,9 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller { /// - Major bump: New required sequential upgrade /// - Minor bump: Replacement OPCM for same upgrade /// - Patch bump: Development changes (expected for normal dev work) - /// @custom:semver 7.0.5 + /// @custom:semver 7.0.6 function version() public pure returns (string memory) { - return "7.0.5"; + return "7.0.6"; } /// @param _standardValidator The standard validator for this OPCM release. @@ -201,8 +201,7 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller { IOPContractsManagerUtils.ExtraInstruction[] memory instructions = new IOPContractsManagerUtils.ExtraInstruction[](1); instructions[0] = IOPContractsManagerUtils.ExtraInstruction({ - key: Constants.PERMITTED_PROXY_DEPLOYMENT_KEY, - data: Constants.PERMIT_ALL_CONTRACTS_INSTRUCTION + key: Constants.PERMITTED_PROXY_DEPLOYMENT_KEY, data: Constants.PERMIT_ALL_CONTRACTS_INSTRUCTION }); // Load the chain contracts. @@ -381,10 +380,7 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller { // Set up the deploy args once, keeps the code cleaner. IOPContractsManagerUtils.ProxyDeployArgs memory proxyDeployArgs = IOPContractsManagerUtils.ProxyDeployArgs({ - proxyAdmin: proxyAdmin, - addressManager: addressManager, - l2ChainId: _l2ChainId, - saltMixer: _saltMixer + proxyAdmin: proxyAdmin, addressManager: addressManager, l2ChainId: _l2ChainId, saltMixer: _saltMixer }); // Now also load the portal, which contains the last few contract references. We do this @@ -842,9 +838,8 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller { // NOTE: If the game is disabled, we'll set the implementation to address(0) and the // arguments to bytes(""), disabling the game. _cts.disputeGameFactory.setImplementation(_cfg.disputeGameConfigs[i].gameType, gameImpl, gameArgs); - _cts.disputeGameFactory.setInitBond( - _cfg.disputeGameConfigs[i].gameType, _cfg.disputeGameConfigs[i].initBond - ); + _cts.disputeGameFactory + .setInitBond(_cfg.disputeGameConfigs[i].gameType, _cfg.disputeGameConfigs[i].initBond); } // If the custom gas token feature was requested, enable it in the SystemConfig. diff --git a/packages/contracts-bedrock/src/L2/FeeVault.sol b/packages/contracts-bedrock/src/L2/FeeVault.sol index 7443d2b57f9..c5cc7111faa 100644 --- a/packages/contracts-bedrock/src/L2/FeeVault.sol +++ b/packages/contracts-bedrock/src/L2/FeeVault.sol @@ -163,9 +163,7 @@ abstract contract FeeVault is Initializable { require(success, "FeeVault: failed to send ETH to L2 fee recipient"); } else { IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: value_ }({ - _target: recipientAddr, - _gasLimit: _WITHDRAWAL_MIN_GAS, - _data: hex"" + _target: recipientAddr, _gasLimit: _WITHDRAWAL_MIN_GAS, _data: hex"" }); } } diff --git a/packages/contracts-bedrock/src/L2/L2StandardBridge.sol b/packages/contracts-bedrock/src/L2/L2StandardBridge.sol index 1e9c2ac15f3..da90117dca4 100644 --- a/packages/contracts-bedrock/src/L2/L2StandardBridge.sol +++ b/packages/contracts-bedrock/src/L2/L2StandardBridge.sol @@ -57,9 +57,9 @@ contract L2StandardBridge is StandardBridge, ISemver { ); /// @notice Semantic version. - /// @custom:semver 1.13.0 + /// @custom:semver 1.13.1 function version() public pure virtual returns (string memory) { - return "1.13.0"; + return "1.13.1"; } /// @notice Constructs the L2StandardBridge contract. @@ -71,8 +71,7 @@ contract L2StandardBridge is StandardBridge, ISemver { /// @param _otherBridge Contract for the corresponding bridge on the other chain. function initialize(StandardBridge _otherBridge) external initializer { __StandardBridge_init({ - _messenger: ICrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER), - _otherBridge: _otherBridge + _messenger: ICrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER), _otherBridge: _otherBridge }); } diff --git a/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol b/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol index 8dd1230e12e..d589300bda1 100644 --- a/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol +++ b/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol @@ -39,9 +39,9 @@ contract L2StandardBridgeInterop is L2StandardBridge { event Converted(address indexed from, address indexed to, address indexed caller, uint256 amount); /// @notice Semantic version. - /// @custom:semver +interop.10 + /// @custom:semver +interop.11 function version() public pure override returns (string memory) { - return string.concat(super.version(), "+interop.10"); + return string.concat(super.version(), "+interop.11"); } /// @notice Converts `amount` of `from` token to `to` token. diff --git a/packages/contracts-bedrock/src/L2/L2ToL1MessagePasserCGT.sol b/packages/contracts-bedrock/src/L2/L2ToL1MessagePasserCGT.sol index efd00314559..7e2f8c1adf7 100644 --- a/packages/contracts-bedrock/src/L2/L2ToL1MessagePasserCGT.sol +++ b/packages/contracts-bedrock/src/L2/L2ToL1MessagePasserCGT.sol @@ -18,16 +18,24 @@ contract L2ToL1MessagePasserCGT is L2ToL1MessagePasser { /// @notice The error thrown when a withdrawal is initiated with value and custom gas token is used. error L2ToL1MessagePasserCGT_NotAllowedOnCGTMode(); - /// @custom:semver +custom-gas-token + /// @custom:semver +custom-gas-token.1 function version() public pure override returns (string memory) { - return string.concat(super.version(), "+custom-gas-token"); + return string.concat(super.version(), "+custom-gas-token.1"); } /// @notice Sends a message from L2 to L1. /// @param _target Address to call on L1 execution. /// @param _gasLimit Minimum gas limit for executing the message on L1. /// @param _data Data to forward to L1 target. - function initiateWithdrawal(address _target, uint256 _gasLimit, bytes memory _data) public payable override { + function initiateWithdrawal( + address _target, + uint256 _gasLimit, + bytes memory _data + ) + public + payable + override + { if (IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken() && msg.value > 0) { revert L2ToL1MessagePasserCGT_NotAllowedOnCGTMode(); } diff --git a/packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol b/packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol index 73673af11ed..724823f90e9 100644 --- a/packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol +++ b/packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol @@ -35,8 +35,8 @@ contract SuperchainETHBridge is ISemver { event RelayETH(address indexed from, address indexed to, uint256 amount, uint256 source); /// @notice Semantic version. - /// @custom:semver 1.0.1 - string public constant version = "1.0.1"; + /// @custom:semver 1.0.2 + string public constant version = "1.0.2"; /// @notice Sends ETH to some target address on another chain. /// @param _to Address to send ETH to. @@ -48,11 +48,12 @@ contract SuperchainETHBridge is ISemver { // NOTE: 'burn' will soon change to 'deposit'. IETHLiquidity(Predeploys.ETH_LIQUIDITY).burn{ value: msg.value }(); - msgHash_ = IL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER).sendMessage({ - _destination: _chainId, - _target: address(this), - _message: abi.encodeCall(this.relayETH, (msg.sender, _to, msg.value)) - }); + msgHash_ = IL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER) + .sendMessage({ + _destination: _chainId, + _target: address(this), + _message: abi.encodeCall(this.relayETH, (msg.sender, _to, msg.value)) + }); emit SendETH(msg.sender, _to, msg.value, _chainId); } diff --git a/packages/contracts-bedrock/src/cannon/MIPS64.sol b/packages/contracts-bedrock/src/cannon/MIPS64.sol index 644f478ce02..aa2beb8f67e 100644 --- a/packages/contracts-bedrock/src/cannon/MIPS64.sol +++ b/packages/contracts-bedrock/src/cannon/MIPS64.sol @@ -66,8 +66,8 @@ contract MIPS64 is ISemver { } /// @notice The semantic version of the MIPS64 contract. - /// @custom:semver 1.10.0 - string public constant version = "1.10.0"; + /// @custom:semver 1.10.1 + string public constant version = "1.10.1"; /// @notice The preimage oracle contract. IPreimageOracle internal immutable ORACLE; @@ -437,7 +437,7 @@ contract MIPS64 is ISemver { newThread.registers[i] = thread.registers[i]; } newThread.registers[29] = a1; // set stack pointer - // the child will perceive a 0 value as returned value instead, and no error + // the child will perceive a 0 value as returned value instead, and no error newThread.registers[2] = 0; newThread.registers[7] = 0; state.nextThreadID++; @@ -530,11 +530,9 @@ contract MIPS64 is ISemver { } uint64 effAddr = a1 & arch.ADDRESS_MASK; // First verify the effAddr path - if ( - !MIPS64Memory.isValidProof( + if (!MIPS64Memory.isValidProof( state.memRoot, effAddr, MIPS64Memory.memoryProofOffset(MEM_PROOF_OFFSET, 1) - ) - ) { + )) { revert InvalidMemoryProof(); } // Recompute the new root after updating effAddr @@ -542,11 +540,9 @@ contract MIPS64 is ISemver { MIPS64Memory.writeMem(effAddr, MIPS64Memory.memoryProofOffset(MEM_PROOF_OFFSET, 1), secs); handleMemoryUpdate(state, effAddr); // Verify the second memory proof against the newly computed root - if ( - !MIPS64Memory.isValidProof( + if (!MIPS64Memory.isValidProof( state.memRoot, effAddr + 8, MIPS64Memory.memoryProofOffset(MEM_PROOF_OFFSET, 2) - ) - ) { + )) { revert InvalidSecondMemoryProof(); } state.memRoot = @@ -864,7 +860,14 @@ contract MIPS64 is ISemver { return inactiveStack == EMPTY_THREAD_ROOT && currentStackIsAlmostEmpty; } - function computeThreadRoot(bytes32 _currentRoot, ThreadState memory _thread) internal pure returns (bytes32 out_) { + function computeThreadRoot( + bytes32 _currentRoot, + ThreadState memory _thread + ) + internal + pure + returns (bytes32 out_) + { // w_i = hash(w_0 ++ hash(thread)) bytes32 threadRoot = outputThreadState(_thread); out_ = keccak256(abi.encodePacked(_currentRoot, threadRoot)); @@ -895,7 +898,7 @@ contract MIPS64 is ISemver { from, to := copyMem(from, to, 8) // lo from, to := copyMem(from, to, 8) // hi from := mload(from) // offset to registers - // Copy registers + // Copy registers for { let i := 0 } lt(i, 32) { i := add(i, 1) } { from, to := copyMem(from, to, 8) } // Clean up end of memory @@ -955,7 +958,7 @@ contract MIPS64 is ISemver { c, m := putField(c, m, 8) // lo c, m := putField(c, m, 8) // hi m := mload(m) // offset to registers - // Unpack register calldata into memory + // Unpack register calldata into memory for { let i := 0 } lt(i, 32) { i := add(i, 1) } { c, m := putField(c, m, 8) } } } diff --git a/packages/contracts-bedrock/src/cannon/PreimageOracle.sol b/packages/contracts-bedrock/src/cannon/PreimageOracle.sol index ed3120092b6..bf68d7e46ac 100644 --- a/packages/contracts-bedrock/src/cannon/PreimageOracle.sol +++ b/packages/contracts-bedrock/src/cannon/PreimageOracle.sol @@ -50,8 +50,8 @@ contract PreimageOracle is ISemver { uint256 public constant PRECOMPILE_CALL_RESERVED_GAS = 100_000; /// @notice The semantic version of the Preimage Oracle contract. - /// @custom:semver 1.1.4 - string public constant version = "1.1.4"; + /// @custom:semver 1.1.5 + string public constant version = "1.1.5"; //////////////////////////////////////////////////////////////// // Authorized Preimage Parts // @@ -236,7 +236,7 @@ contract PreimageOracle is ISemver { // this will be zero-padded at the end, since memory at end is clean. part := mload(add(sub(ptr, 0x08), _partOffset)) let h := keccak256(ptr, size) // compute preimage keccak256 hash - // mask out prefix byte, replace with type 2 byte + // mask out prefix byte, replace with type 2 byte key := or(and(h, not(shl(248, 0xFF))), shl(248, 0x02)) } preimagePartOk[key][_partOffset] = true; @@ -288,7 +288,7 @@ contract PreimageOracle is ISemver { // Check if the staticcall succeeded if iszero(success) { revert(0, 0) } let h := mload(0) // get return data - // mask out prefix byte, replace with type 4 byte + // mask out prefix byte, replace with type 4 byte key := or(and(h, not(shl(248, 0xFF))), shl(248, 4)) } preimagePartOk[key][_partOffset] = true; @@ -345,15 +345,14 @@ contract PreimageOracle is ISemver { // Verify the KZG proof by calling the point evaluation precompile. If the proof is invalid, the precompile // will revert. - success := - staticcall( - gas(), // forward all gas - 0x0A, // point evaluation precompile address - ptr, // input ptr - 0xC0, // input size = 192 bytes - 0x00, // output ptr - 0x00 // output size - ) + success := staticcall( + gas(), // forward all gas + 0x0A, // point evaluation precompile address + ptr, // input ptr + 0xC0, // input size = 192 bytes + 0x00, // output ptr + 0x00 // output size + ) if iszero(success) { // Store the "InvalidProof()" error selector. mstore(0x00, 0x09bde339) @@ -437,15 +436,14 @@ contract PreimageOracle is ISemver { // Call the precompile to get the result. // SAFETY: Given the above gas check, the staticall cannot fail due to insufficient gas. - res := - staticcall( - gas(), // forward all gas - _precompile, - add(28, ptr), // input ptr - _input.length, - 0x0, // Unused as we don't copy anything - 0x00 // don't copy anything - ) + res := staticcall( + gas(), // forward all gas + _precompile, + add(28, ptr), // input ptr + _input.length, + 0x0, // Unused as we don't copy anything + 0x00 // don't copy anything + ) size := add(1, returndatasize()) // revert if part offset >= size+8 (i.e. parts must be within bounds) @@ -627,9 +625,8 @@ contract PreimageOracle is ISemver { if (blocksProcessed > MAX_LEAF_COUNT) revert TreeSizeOverflow(); // Update the proposal metadata to include the number of blocks processed and total bytes processed. - metaData = metaData.setBlocksProcessed(uint32(blocksProcessed)).setBytesProcessed( - uint32(_input.length + metaData.bytesProcessed()) - ); + metaData = metaData.setBlocksProcessed(uint32(blocksProcessed)) + .setBytesProcessed(uint32(_input.length + metaData.bytesProcessed())); // If the proposal is being finalized, set the timestamp to the current block timestamp. This begins the // challenge period, which must be waited out before the proposal can be finalized. if (_finalize) { @@ -670,12 +667,8 @@ contract PreimageOracle is ISemver { { // Verify that both leaves are present in the merkle tree. bytes32 root = getTreeRootLPP(_claimant, _uuid); - if ( - !( - _verify(_preStateProof, root, _preState.index, _hashLeaf(_preState)) - && _verify(_postStateProof, root, _postState.index, _hashLeaf(_postState)) - ) - ) revert InvalidProof(); + if (!(_verify(_preStateProof, root, _preState.index, _hashLeaf(_preState)) + && _verify(_postStateProof, root, _postState.index, _hashLeaf(_postState)))) revert InvalidProof(); // Verify that the prestate passed matches the intermediate state claimed in the leaf. if (keccak256(abi.encode(_stateMatrix)) != _preState.stateCommitment) revert InvalidPreimage(); @@ -753,12 +746,8 @@ contract PreimageOracle is ISemver { // Verify that both leaves are present in the merkle tree. bytes32 root = getTreeRootLPP(_claimant, _uuid); - if ( - !( - _verify(_preStateProof, root, _preState.index, _hashLeaf(_preState)) - && _verify(_postStateProof, root, _postState.index, _hashLeaf(_postState)) - ) - ) revert InvalidProof(); + if (!(_verify(_preStateProof, root, _preState.index, _hashLeaf(_preState)) + && _verify(_postStateProof, root, _postState.index, _hashLeaf(_postState)))) revert InvalidProof(); // Verify that the prestate passed matches the intermediate state claimed in the leaf. if (keccak256(abi.encode(_stateMatrix)) != _preState.stateCommitment) revert InvalidPreimage(); diff --git a/packages/contracts-bedrock/src/cannon/libraries/CannonTypes.sol b/packages/contracts-bedrock/src/cannon/libraries/CannonTypes.sol index 26d0a17edae..ecb623cf788 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/CannonTypes.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/CannonTypes.sol @@ -39,13 +39,27 @@ library LPPMetadataLib { } } - function setBlocksProcessed(LPPMetaData _self, uint32 _blocksProcessed) internal pure returns (LPPMetaData self_) { + function setBlocksProcessed( + LPPMetaData _self, + uint32 _blocksProcessed + ) + internal + pure + returns (LPPMetaData self_) + { assembly { self_ := or(shl(96, _blocksProcessed), and(_self, not(shl(96, U32_MASK)))) } } - function setBytesProcessed(LPPMetaData _self, uint32 _bytesProcessed) internal pure returns (LPPMetaData self_) { + function setBytesProcessed( + LPPMetaData _self, + uint32 _bytesProcessed + ) + internal + pure + returns (LPPMetaData self_) + { assembly { self_ := or(shl(64, _bytesProcessed), and(_self, not(shl(64, U32_MASK)))) } diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPS64Instructions.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPS64Instructions.sol index 42c150af3b3..4c8bcffaf93 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/MIPS64Instructions.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPS64Instructions.sol @@ -172,12 +172,7 @@ library MIPS64Instructions { // ALU // Note: swr outputs more than 8 bytes without the u64_mask ExecuteMipsInstructionParams memory params = ExecuteMipsInstructionParams({ - insn: _args.insn, - opcode: _args.opcode, - fun: _args.fun, - rs: rs, - rt: rt, - mem: mem + insn: _args.insn, opcode: _args.opcode, fun: _args.fun, rs: rs, rt: rt, mem: mem }); uint64 val = executeMipsInstruction(params) & U64_MASK; @@ -835,7 +830,14 @@ library MIPS64Instructions { /// registers. /// @param _linkReg The register to store the link to the instruction after the delay slot instruction. /// @param _dest The destination to jump to. - function handleJump(CoreStepLogicParams memory _cpuAndRegisters, uint64 _linkReg, uint64 _dest) internal pure { + function handleJump( + CoreStepLogicParams memory _cpuAndRegisters, + uint64 _linkReg, + uint64 _dest + ) + internal + pure + { unchecked { if (_cpuAndRegisters.cpu.nextPC != _cpuAndRegisters.cpu.pc + 4) { revert("MIPS64: jump in delay slot"); diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPS64Memory.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPS64Memory.sol index 2f77fcd599c..0b0eb6aff54 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/MIPS64Memory.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPS64Memory.sol @@ -90,7 +90,15 @@ library MIPS64Memory { /// @param _proofOffset The offset of the memory proof in calldata. /// @param _val The value to write. /// @return newMemRoot_ The new memory root after modification - function writeMem(uint64 _addr, uint256 _proofOffset, uint64 _val) internal pure returns (bytes32 newMemRoot_) { + function writeMem( + uint64 _addr, + uint256 _proofOffset, + uint64 _val + ) + internal + pure + returns (bytes32 newMemRoot_) + { unchecked { validateMemoryProofAvailability(_proofOffset); assembly { @@ -141,7 +149,15 @@ library MIPS64Memory { /// @param _addr The _addr proven. /// @param _proofOffset The offset of the memory proof in calldata. /// @return valid_ True iff it is a valid proof. - function isValidProof(bytes32 _memRoot, uint64 _addr, uint256 _proofOffset) internal pure returns (bool valid_) { + function isValidProof( + bytes32 _memRoot, + uint64 _addr, + uint256 _proofOffset + ) + internal + pure + returns (bool valid_) + { (, valid_) = readMemUnchecked(_memRoot, _addr, _proofOffset); } @@ -150,7 +166,14 @@ library MIPS64Memory { /// Equal to the offset of the first memory proof (at _proofIndex 0). /// @param _proofIndex The index of the proof in the calldata. /// @return offset_ The offset of the memory proof at the given _proofIndex in the calldata. - function memoryProofOffset(uint256 _proofDataOffset, uint8 _proofIndex) internal pure returns (uint256 offset_) { + function memoryProofOffset( + uint256 _proofDataOffset, + uint8 _proofIndex + ) + internal + pure + returns (uint256 offset_) + { unchecked { // A proof of 64-bit memory, with 32-byte leaf values, is (64-5)=59 bytes32 entries. // And the leaf value itself needs to be encoded as well: (59 + 1) = 60 bytes32 entries. diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPS64Syscalls.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPS64Syscalls.sol index f237f8c38f0..15d2c2263b2 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/MIPS64Syscalls.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPS64Syscalls.sol @@ -295,7 +295,7 @@ library MIPS64Syscalls { if lt(space, datLen) { datLen := space } // if less space than data, shorten data if lt(a2, datLen) { datLen := a2 } // if requested to read less, read less dat := shr(sub(256, mul(datLen, 8)), dat) // right-align data - // position data to insert into memory word + // position data to insert into memory word dat := shl(mul(sub(sub(WORD_SIZE_BYTES, datLen), alignment), 8), dat) // mask all bytes after start let mask := sub(shl(mul(sub(WORD_SIZE_BYTES, alignment), 8), 1), 1) diff --git a/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol b/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol index cc44cac8ff2..87f44f0031a 100644 --- a/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol +++ b/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol @@ -25,8 +25,8 @@ import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; /// be initialized with a more recent starting state which reduces the amount of required offchain computation. contract AnchorStateRegistry is ProxyAdminOwnedBase, Initializable, ReinitializableBase, ISemver { /// @notice Semantic version. - /// @custom:semver 3.7.0 - string public constant version = "3.7.0"; + /// @custom:semver 3.7.1 + string public constant version = "3.7.1"; /// @notice The dispute game finality delay in seconds. uint256 internal immutable DISPUTE_GAME_FINALITY_DELAY_SECONDS; @@ -173,7 +173,13 @@ contract AnchorStateRegistry is ProxyAdminOwnedBase, Initializable, Reinitializa /// be removed in a future release. Use getAnchorRoot() instead. Anchor roots are no /// longer stored per game type, so this function will return the same root for all /// game types. - function anchors(GameType /* unused */ ) external view returns (Hash, uint256) { + function anchors( + GameType /* unused */ + ) + external + view + returns (Hash, uint256) + { return getAnchorRoot(); } diff --git a/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol b/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol index db1fecaf173..ccdce11c58f 100644 --- a/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol +++ b/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol @@ -56,8 +56,8 @@ contract DisputeGameFactory is ProxyAdminOwnedBase, ReinitializableBase, Ownable } /// @notice Semantic version. - /// @custom:semver 1.5.0 - string public constant version = "1.5.0"; + /// @custom:semver 1.5.1 + string public constant version = "1.5.1"; /// @notice `gameImpls` is a mapping that maps `GameType`s to their respective /// `IDisputeGame` implementations. @@ -193,9 +193,10 @@ contract DisputeGameFactory is ProxyAdminOwnedBase, ReinitializableBase, Ownable // │ [88 + n, 88 + n + m) │ Implementation args (opaque) │ // └──────────────────────┴─────────────────────────────────────┘ proxy_ = IDisputeGame( - address(impl).clone( - abi.encodePacked(msg.sender, _rootClaim, parentHash, _gameType, _extraData, gameArgs[_gameType]) - ) + address(impl) + .clone( + abi.encodePacked(msg.sender, _rootClaim, parentHash, _gameType, _extraData, gameArgs[_gameType]) + ) ); } proxy_.initialize{ value: msg.value }(); @@ -274,11 +275,7 @@ contract DisputeGameFactory is ProxyAdminOwnedBase, ReinitializableBase, Ownable bytes memory extraData = IDisputeGame(proxy).extraData(); Claim rootClaim = IDisputeGame(proxy).rootClaim(); games_[games_.length - 1] = GameSearchResult({ - index: i, - metadata: id, - timestamp: timestamp, - rootClaim: rootClaim, - extraData: extraData + index: i, metadata: id, timestamp: timestamp, rootClaim: rootClaim, extraData: extraData }); if (games_.length >= _n) break; } diff --git a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol index e0d3d8c372c..ff60a4aefea 100644 --- a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol @@ -147,9 +147,9 @@ contract FaultDisputeGame is Clone, ISemver { uint256 internal constant HEADER_BLOCK_NUMBER_INDEX = 8; /// @notice Semantic version. - /// @custom:semver 2.4.0 + /// @custom:semver 2.4.1 function version() public pure virtual returns (string memory) { - return "2.4.0"; + return "2.4.1"; } /// @notice The starting timestamp of the game @@ -524,8 +524,8 @@ contract FaultDisputeGame is Clone, ISemver { // Construct the next clock with the new duration and the current block timestamp. Clock nextClock = LibClock.wrap(nextDuration, Timestamp.wrap(uint64(block.timestamp))); - // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. Multiple - // claims at the same position may dispute the same challengeIndex. However, they must have different + // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. + // Multiple claims at the same position may dispute the same challengeIndex. However, they must have different // values. Hash claimHash = _claim.hashClaimPos(nextPosition, _challengeIndex); if (claims[claimHash]) revert ClaimAlreadyExists(); diff --git a/packages/contracts-bedrock/src/dispute/SuperFaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/SuperFaultDisputeGame.sol index d34297c51db..2a2286b6ae3 100644 --- a/packages/contracts-bedrock/src/dispute/SuperFaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/SuperFaultDisputeGame.sol @@ -146,9 +146,9 @@ contract SuperFaultDisputeGame is Clone, ISemver { Position internal constant ROOT_POSITION = Position.wrap(1); /// @notice Semantic version. - /// @custom:semver 0.7.0 + /// @custom:semver 0.7.1 function version() public pure virtual returns (string memory) { - return "0.7.0"; + return "0.7.1"; } /// @notice The starting timestamp of the game @@ -574,8 +574,8 @@ contract SuperFaultDisputeGame is Clone, ISemver { // Construct the next clock with the new duration and the current block timestamp. Clock nextClock = LibClock.wrap(nextDuration, Timestamp.wrap(uint64(block.timestamp))); - // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. Multiple - // claims at the same position may dispute the same challengeIndex. However, they must have different + // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. + // Multiple claims at the same position may dispute the same challengeIndex. However, they must have different // values. Hash claimHash = _claim.hashClaimPos(nextPosition, _challengeIndex); if (claims[claimHash]) revert ClaimAlreadyExists(); diff --git a/packages/contracts-bedrock/src/dispute/SuperPermissionedDisputeGame.sol b/packages/contracts-bedrock/src/dispute/SuperPermissionedDisputeGame.sol index a8c754f8a2f..74776691757 100644 --- a/packages/contracts-bedrock/src/dispute/SuperPermissionedDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/SuperPermissionedDisputeGame.sol @@ -27,9 +27,9 @@ contract SuperPermissionedDisputeGame is SuperFaultDisputeGame { } /// @notice Semantic version. - /// @custom:semver 0.7.0 + /// @custom:semver 0.7.1 function version() public pure override returns (string memory) { - return "0.7.0"; + return "0.7.1"; } /// @param _params Parameters for creating a new FaultDisputeGame. @@ -91,8 +91,9 @@ contract SuperPermissionedDisputeGame is SuperFaultDisputeGame { /// @notice Returns the proposer address. The proposer role is allowed to create proposals and participate in the /// dispute game. function proposer() public pure returns (address proposer_) { - proposer_ = - _getArgAddress(super._preExtraDataByteCount() + super._extraDataByteCount() + super.gameImplArgsByteCount()); + proposer_ = _getArgAddress( + super._preExtraDataByteCount() + super._extraDataByteCount() + super.gameImplArgsByteCount() + ); } /// @notice Returns the challenger address. The challenger role is allowed to participate in the dispute game. diff --git a/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol b/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol index 9cff271920b..52dcc7baacc 100644 --- a/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol +++ b/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol @@ -46,14 +46,13 @@ library LibPosition { _position := or(_position, shr(8, _position)) _position := or(_position, shr(16, _position)) - depth_ := - or( - depth_, - byte( - shr(251, mul(_position, shl(224, 0x07c4acdd))), - 0x0009010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f - ) + depth_ := or( + depth_, + byte( + shr(251, mul(_position, shl(224, 0x07c4acdd))), + 0x0009010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f ) + ) } } diff --git a/packages/contracts-bedrock/src/governance/GovernanceToken.sol b/packages/contracts-bedrock/src/governance/GovernanceToken.sol index eecfafc5d75..e3f3a713787 100644 --- a/packages/contracts-bedrock/src/governance/GovernanceToken.sol +++ b/packages/contracts-bedrock/src/governance/GovernanceToken.sol @@ -28,7 +28,14 @@ contract GovernanceToken is ERC20Burnable, ERC20Votes, Ownable { /// @param from The account sending tokens. /// @param to The account receiving tokens. /// @param amount The amount of tokens being transferred. - function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { + function _afterTokenTransfer( + address from, + address to, + uint256 amount + ) + internal + override(ERC20, ERC20Votes) + { super._afterTokenTransfer(from, to, amount); } diff --git a/packages/contracts-bedrock/src/integration/EventLogger.sol b/packages/contracts-bedrock/src/integration/EventLogger.sol index 06bb831412b..2fff424cca3 100644 --- a/packages/contracts-bedrock/src/integration/EventLogger.sol +++ b/packages/contracts-bedrock/src/integration/EventLogger.sol @@ -16,7 +16,7 @@ contract EventLogger { let dataSize := _data.length let memDataOffset := mload(0x40) // load free memory pointer calldatacopy(memDataOffset, _data.offset, dataSize) // args: to, from, size - // after the event-logging is done, the memory is not used, so no mem pointer to update/restore. + // after the event-logging is done, the memory is not used, so no mem pointer to update/restore. let topicsCount := _topics.length let t0 := calldataload(add(_topics.offset, mul(32, 0))) diff --git a/packages/contracts-bedrock/src/libraries/Blueprint.sol b/packages/contracts-bedrock/src/libraries/Blueprint.sol index e89ff01d3cc..38d1cec079e 100644 --- a/packages/contracts-bedrock/src/libraries/Blueprint.sol +++ b/packages/contracts-bedrock/src/libraries/Blueprint.sol @@ -121,7 +121,14 @@ library Blueprint { /// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode /// with the given `_data` appended, i.e. `_data` is the ABI-encoded constructor arguments. - function deployFrom(address _target, bytes32 _salt, bytes memory _data) internal returns (address newContract_) { + function deployFrom( + address _target, + bytes32 _salt, + bytes memory _data + ) + internal + returns (address newContract_) + { Preamble memory preamble = parseBlueprintPreamble(address(_target).code); if (preamble.ercVersion != 0) revert UnsupportedERCVersion(preamble.ercVersion); if (preamble.preambleData.length != 0) revert UnexpectedPreambleData(preamble.preambleData); diff --git a/packages/contracts-bedrock/src/libraries/GasPayingToken.sol b/packages/contracts-bedrock/src/libraries/GasPayingToken.sol index bf53367476b..eb127f21765 100644 --- a/packages/contracts-bedrock/src/libraries/GasPayingToken.sol +++ b/packages/contracts-bedrock/src/libraries/GasPayingToken.sol @@ -30,7 +30,8 @@ library GasPayingToken { bytes32 internal constant GAS_PAYING_TOKEN_SLOT = bytes32(uint256(keccak256("opstack.gaspayingtoken")) - 1); /// @notice The storage slot that contains the ERC20 `name()` of the gas paying token - bytes32 internal constant GAS_PAYING_TOKEN_NAME_SLOT = bytes32(uint256(keccak256("opstack.gaspayingtokenname")) - 1); + bytes32 internal constant GAS_PAYING_TOKEN_NAME_SLOT = + bytes32(uint256(keccak256("opstack.gaspayingtokenname")) - 1); /// @notice the storage slot that contains the ERC20 `symbol()` of the gas paying token bytes32 internal constant GAS_PAYING_TOKEN_SYMBOL_SLOT = diff --git a/packages/contracts-bedrock/src/libraries/SafeCall.sol b/packages/contracts-bedrock/src/libraries/SafeCall.sol index a8ae9ec8be3..063373dc88c 100644 --- a/packages/contracts-bedrock/src/libraries/SafeCall.sol +++ b/packages/contracts-bedrock/src/libraries/SafeCall.sol @@ -11,16 +11,15 @@ library SafeCall { /// @param _value Amount of value to pass to the call function send(address _target, uint256 _gas, uint256 _value) internal returns (bool success_) { assembly { - success_ := - call( - _gas, // gas - _target, // recipient - _value, // ether value - 0, // inloc - 0, // inlen - 0, // outloc - 0 // outlen - ) + success_ := call( + _gas, // gas + _target, // recipient + _value, // ether value + 0, // inloc + 0, // inlen + 0, // outloc + 0 // outlen + ) } } @@ -46,16 +45,15 @@ library SafeCall { returns (bool success_) { assembly { - success_ := - call( - _gas, // gas - _target, // recipient - _value, // ether value - add(_calldata, 32), // inloc - mload(_calldata), // inlen - 0, // outloc - 0 // outlen - ) + success_ := call( + _gas, // gas + _target, // recipient + _value, // ether value + add(_calldata, 32), // inloc + mload(_calldata), // inlen + 0, // outloc + 0 // outlen + ) } } @@ -152,16 +150,15 @@ library SafeCall { // `_minGas` does not account for the `memory_expansion_cost` and `code_execution_cost` // factors of the dynamic cost of the `CALL` opcode), the call will receive at least // the minimum amount of gas specified. - _success := - call( - gas(), // gas - _target, // recipient - _value, // ether value - add(_calldata, 32), // inloc - mload(_calldata), // inlen - 0x00, // outloc - 0x00 // outlen - ) + _success := call( + gas(), // gas + _target, // recipient + _value, // ether value + add(_calldata, 32), // inloc + mload(_calldata), // inlen + 0x00, // outloc + 0x00 // outlen + ) } return _success; } diff --git a/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol b/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol index f342658cb45..2471a8b1d66 100644 --- a/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol +++ b/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol @@ -74,14 +74,15 @@ library RLPReader { uint256 offset = listOffset; while (offset < _in.length) { (uint256 itemOffset, uint256 itemLength,) = _decodeLength( - RLPItem({ length: _in.length - offset, ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) }) + RLPItem({ + length: _in.length - offset, ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) + }) ); // We don't need to check itemCount < out.length explicitly because Solidity already // handles this check on our behalf, we'd just be wasting gas. out_[itemCount] = RLPItem({ - length: itemLength + itemOffset, - ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) + length: itemLength + itemOffset, ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) }); itemCount += 1; diff --git a/packages/contracts-bedrock/src/libraries/trie/MerkleTrie.sol b/packages/contracts-bedrock/src/libraries/trie/MerkleTrie.sol index cbbf9fdf3d6..93eef069b03 100644 --- a/packages/contracts-bedrock/src/libraries/trie/MerkleTrie.sol +++ b/packages/contracts-bedrock/src/libraries/trie/MerkleTrie.sol @@ -66,7 +66,15 @@ library MerkleTrie { /// @param _proof Merkle trie inclusion proof for the key. /// @param _root Known root of the Merkle trie. /// @return value_ Value of the key if it exists. - function get(bytes memory _key, bytes[] memory _proof, bytes32 _root) internal pure returns (bytes memory value_) { + function get( + bytes memory _key, + bytes[] memory _proof, + bytes32 _root + ) + internal + pure + returns (bytes memory value_) + { require(_key.length > 0, "MerkleTrie: empty key"); TrieNode[] memory proof = _parseProof(_proof); diff --git a/packages/contracts-bedrock/src/libraries/trie/SecureMerkleTrie.sol b/packages/contracts-bedrock/src/libraries/trie/SecureMerkleTrie.sol index 56992fba997..cbe2d0a774b 100644 --- a/packages/contracts-bedrock/src/libraries/trie/SecureMerkleTrie.sol +++ b/packages/contracts-bedrock/src/libraries/trie/SecureMerkleTrie.sol @@ -36,7 +36,15 @@ library SecureMerkleTrie { /// @param _proof Merkle trie inclusion proof for the key. /// @param _root Known root of the Merkle trie. /// @return value_ Value of the key if it exists. - function get(bytes memory _key, bytes[] memory _proof, bytes32 _root) internal pure returns (bytes memory value_) { + function get( + bytes memory _key, + bytes[] memory _proof, + bytes32 _root + ) + internal + pure + returns (bytes memory value_) + { bytes memory key = _getSecureKey(_key); value_ = MerkleTrie.get(key, _proof, _root); } diff --git a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol index f255c2e6964..a567e54f568 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol @@ -33,11 +33,9 @@ contract CheckSecrets is IDripCheck { Params memory params = abi.decode(_params, (Params)); // Check that the secrets have/have not been revealed. - execute_ = ( - revealedSecrets[params.secretHashMustExist] > 0 + execute_ = (revealedSecrets[params.secretHashMustExist] > 0 && block.timestamp >= revealedSecrets[params.secretHashMustExist] + params.delay - && revealedSecrets[params.secretHashMustNotExist] == 0 - ); + && revealedSecrets[params.secretHashMustNotExist] == 0); } /// @notice Reveal a secret. diff --git a/packages/contracts-bedrock/src/periphery/monitoring/DisputeMonitorHelper.sol b/packages/contracts-bedrock/src/periphery/monitoring/DisputeMonitorHelper.sol index 12df4991a06..a23d49c932c 100644 --- a/packages/contracts-bedrock/src/periphery/monitoring/DisputeMonitorHelper.sol +++ b/packages/contracts-bedrock/src/periphery/monitoring/DisputeMonitorHelper.sol @@ -26,7 +26,14 @@ contract DisputeMonitorHelper { /// @param _factory The factory of the dispute games. /// @param _game The game to check. /// @return isValid_ True if the game was created by the factory, false otherwise. - function isGameRegistered(IDisputeGameFactory _factory, IDisputeGame _game) public view returns (bool isValid_) { + function isGameRegistered( + IDisputeGameFactory _factory, + IDisputeGame _game + ) + public + view + returns (bool isValid_) + { // Grab the game and game data. (GameType gameType, Claim rootClaim, bytes memory extraData) = _game.gameData(); diff --git a/packages/contracts-bedrock/src/safe/LivenessModule.sol b/packages/contracts-bedrock/src/safe/LivenessModule.sol index 8a2452e3c0b..24e1edfddf8 100644 --- a/packages/contracts-bedrock/src/safe/LivenessModule.sol +++ b/packages/contracts-bedrock/src/safe/LivenessModule.sol @@ -58,8 +58,8 @@ contract LivenessModule is ISemver { uint256 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8; /// @notice Semantic version. - /// @custom:semver 1.3.0 - string public constant version = "1.3.0"; + /// @custom:semver 1.3.1 + string public constant version = "1.3.1"; // Constructor to initialize the Safe and baseModule instances constructor( @@ -164,9 +164,7 @@ contract LivenessModule is ISemver { // We now attempt remove the owner from the safe. _removeOwner({ - _prevOwner: _previousOwners[i], - _ownerToRemove: _ownersToRemove[i], - _newOwnersCount: ownersCount + _prevOwner: _previousOwners[i], _ownerToRemove: _ownersToRemove[i], _newOwnersCount: ownersCount }); // when all owners are removed and the sole owner is the fallback owner, the diff --git a/packages/contracts-bedrock/src/safe/SafeSigners.sol b/packages/contracts-bedrock/src/safe/SafeSigners.sol index 9a75f43ffea..76bb206c9b6 100644 --- a/packages/contracts-bedrock/src/safe/SafeSigners.sol +++ b/packages/contracts-bedrock/src/safe/SafeSigners.sol @@ -37,7 +37,7 @@ library SafeSigners { /// @notice Extract the signers from a set of signatures. /// This method is based closely on the code in the Safe.checkNSignatures() method. /// https://github.com/safe-global/safe-contracts/blob/e870f514ad34cd9654c72174d6d4a839e3c6639f/contracts/Safe.sol#L274 - /// It has been modified by removing all signature _validation_ code. We trust the Safe to properly validate + /// It has been modified by removing all signature _validation_ code. We trust the Safe to properly validate /// the signatures. /// This method therefore simply extracts the addresses from the signatures. function getNSigners( diff --git a/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol b/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol index ba21a0c7c51..f4cc0be42ec 100644 --- a/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol +++ b/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol @@ -366,14 +366,14 @@ abstract contract CrossDomainMessenger is uint64 executionGas = uint64( // Constant costs for relayMessage RELAY_CONSTANT_OVERHEAD - // Covers dynamic parts of the CALL opcode - + RELAY_CALL_OVERHEAD - // Ensures execution of relayMessage completes after call - + RELAY_RESERVED_GAS - // Buffer between hasMinGas check and the CALL - + RELAY_GAS_CHECK_BUFFER - // Minimum gas limit, multiplied by 64/63 to account for EIP-150. - + ((_minGasLimit * MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR) / MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR) + // Covers dynamic parts of the CALL opcode + + RELAY_CALL_OVERHEAD + // Ensures execution of relayMessage completes after call + + RELAY_RESERVED_GAS + // Buffer between hasMinGas check and the CALL + + RELAY_GAS_CHECK_BUFFER + // Minimum gas limit, multiplied by 64/63 to account for EIP-150. + + ((_minGasLimit * MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR) / MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR) ); // Total message size is the result of properly ABI encoding the call to relayMessage. @@ -388,11 +388,10 @@ abstract contract CrossDomainMessenger is // contract creation case because this is always a call to relayMessage. return TX_BASE_GAS + uint64( - Math.max( - executionGas + (totalMessageSize * MIN_GAS_CALLDATA_OVERHEAD), - (totalMessageSize * FLOOR_CALLDATA_OVERHEAD) - ) - ); + Math.max( + executionGas + (totalMessageSize * MIN_GAS_CALLDATA_OVERHEAD), (totalMessageSize * FLOOR_CALLDATA_OVERHEAD) + ) + ); } /// @notice Initializer. diff --git a/packages/contracts-bedrock/src/universal/ProxyAdmin.sol b/packages/contracts-bedrock/src/universal/ProxyAdmin.sol index 9e7cd908242..96f41c4763c 100644 --- a/packages/contracts-bedrock/src/universal/ProxyAdmin.sol +++ b/packages/contracts-bedrock/src/universal/ProxyAdmin.sol @@ -154,9 +154,8 @@ contract ProxyAdmin is Ownable { if (ptype == ProxyType.ERC1967) { IProxy(_proxy).upgradeTo(_implementation); } else if (ptype == ProxyType.CHUGSPLASH) { - IL1ChugSplashProxy(_proxy).setStorage( - Constants.PROXY_IMPLEMENTATION_ADDRESS, bytes32(uint256(uint160(_implementation))) - ); + IL1ChugSplashProxy(_proxy) + .setStorage(Constants.PROXY_IMPLEMENTATION_ADDRESS, bytes32(uint256(uint160(_implementation)))); } else if (ptype == ProxyType.RESOLVED) { string memory name = implementationName[_proxy]; addressManager.setAddress(name, _implementation); diff --git a/packages/contracts-bedrock/src/vendor/eas/EAS.sol b/packages/contracts-bedrock/src/vendor/eas/EAS.sol index 791e28f1508..ef64bc844c4 100644 --- a/packages/contracts-bedrock/src/vendor/eas/EAS.sol +++ b/packages/contracts-bedrock/src/vendor/eas/EAS.sol @@ -79,8 +79,8 @@ contract EAS is IEAS, ISemver, EIP1271Verifier { uint256[MAX_GAP - 3] private __gap; /// @notice Semantic version. - /// @custom:semver 1.4.1-beta.3 - string public constant version = "1.4.1-beta.3"; + /// @custom:semver 1.4.1-beta.4 + string public constant version = "1.4.1-beta.4"; /// @dev Creates a new EAS instance. constructor() EIP1271Verifier("EAS", "1.3.0") { } @@ -112,11 +112,7 @@ contract EAS is IEAS, ISemver, EIP1271Verifier { } /// @inheritdoc IEAS - function multiAttest(MultiAttestationRequest[] calldata multiRequests) - external - payable - returns (bytes32[] memory) - { + function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory) { // Since a multi-attest call is going to make multiple attestations for multiple schemas, we'd need to collect // all the returned UIDs into a single list. uint256 length = multiRequests.length; @@ -317,8 +313,9 @@ contract EAS is IEAS, ISemver, EIP1271Verifier { } // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch. - availableValue -= - _revoke(multiDelegatedRequest.schema, data, multiDelegatedRequest.revoker, availableValue, last); + availableValue -= _revoke( + multiDelegatedRequest.schema, data, multiDelegatedRequest.revoker, availableValue, last + ); } } diff --git a/packages/contracts-bedrock/src/vendor/eas/IEAS.sol b/packages/contracts-bedrock/src/vendor/eas/IEAS.sol index 7581fdb3b36..84706bb0179 100644 --- a/packages/contracts-bedrock/src/vendor/eas/IEAS.sol +++ b/packages/contracts-bedrock/src/vendor/eas/IEAS.sol @@ -204,10 +204,7 @@ interface IEAS { /// @param multiRequests The arguments of the multi attestation requests. The requests should be grouped by distinct /// schema ids to benefit from the best batching optimization. /// @return The UIDs of the new attestations. - function multiAttest(MultiAttestationRequest[] calldata multiRequests) - external - payable - returns (bytes32[] memory); + function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory); /// @notice Attests to multiple schemas using via provided EIP712 signatures. /// @@ -348,9 +345,7 @@ interface IEAS { /// @param multiDelegatedRequests The arguments of the delegated multi revocation attestation requests. The requests /// should be /// grouped by distinct schema ids to benefit from the best batching optimization. - function multiRevokeByDelegation(MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests) - external - payable; + function multiRevokeByDelegation(MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests) external payable; /// @notice Timestamps the specified bytes32 data. /// @param data The data to timestamp. diff --git a/packages/contracts-bedrock/src/vendor/eas/ISchemaRegistry.sol b/packages/contracts-bedrock/src/vendor/eas/ISchemaRegistry.sol index ed6203d3510..359539a2fe0 100644 --- a/packages/contracts-bedrock/src/vendor/eas/ISchemaRegistry.sol +++ b/packages/contracts-bedrock/src/vendor/eas/ISchemaRegistry.sol @@ -25,7 +25,13 @@ interface ISchemaRegistry { /// @param resolver An optional schema resolver. /// @param revocable Whether the schema allows revocations explicitly. /// @return The UID of the new schema. - function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32); + function register( + string calldata schema, + ISchemaResolver resolver, + bool revocable + ) + external + returns (bytes32); /// @dev Returns an existing schema by UID /// @param uid The UID of the schema to retrieve. diff --git a/packages/contracts-bedrock/src/vendor/eas/SchemaRegistry.sol b/packages/contracts-bedrock/src/vendor/eas/SchemaRegistry.sol index 98f87c35b53..9dc61534874 100644 --- a/packages/contracts-bedrock/src/vendor/eas/SchemaRegistry.sol +++ b/packages/contracts-bedrock/src/vendor/eas/SchemaRegistry.sol @@ -20,11 +20,18 @@ contract SchemaRegistry is ISchemaRegistry, ISemver { uint256[MAX_GAP - 1] private __gap; /// @notice Semantic version. - /// @custom:semver 1.3.1-beta.2 - string public constant version = "1.3.1-beta.2"; + /// @custom:semver 1.3.1-beta.3 + string public constant version = "1.3.1-beta.3"; /// @inheritdoc ISchemaRegistry - function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32) { + function register( + string calldata schema, + ISchemaResolver resolver, + bool revocable + ) + external + returns (bytes32) + { SchemaRecord memory schemaRecord = SchemaRecord({ uid: EMPTY_UID, schema: schema, resolver: resolver, revocable: revocable }); diff --git a/packages/contracts-bedrock/src/vendor/eas/eip1271/EIP1271Verifier.sol b/packages/contracts-bedrock/src/vendor/eas/eip1271/EIP1271Verifier.sol index ad4f8b7a92e..1b8c2df4796 100644 --- a/packages/contracts-bedrock/src/vendor/eas/eip1271/EIP1271Verifier.sol +++ b/packages/contracts-bedrock/src/vendor/eas/eip1271/EIP1271Verifier.sol @@ -129,11 +129,9 @@ abstract contract EIP1271Verifier is EIP712 { ) ) ); - if ( - !SignatureChecker.isValidSignatureNow( + if (!SignatureChecker.isValidSignatureNow( request.attester, hash, abi.encodePacked(signature.r, signature.s, signature.v) - ) - ) { + )) { revert InvalidSignature(); } } @@ -161,11 +159,9 @@ abstract contract EIP1271Verifier is EIP712 { ) ) ); - if ( - !SignatureChecker.isValidSignatureNow( + if (!SignatureChecker.isValidSignatureNow( request.revoker, hash, abi.encodePacked(signature.r, signature.s, signature.v) - ) - ) { + )) { revert InvalidSignature(); } } diff --git a/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol b/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol index b4a1b08100a..291ea607aa8 100644 --- a/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol +++ b/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol @@ -78,7 +78,12 @@ contract DataAvailabilityChallenge_SetResolverRefundPercentage_Test is DataAvail } /// @notice Test that the `setResolverRefundPercentage` function reverts if sender is not owner. - function testFuzz_setResolverRefundPercentage_onlyOwner_reverts(address _notOwner, uint256 _percentage) public { + function testFuzz_setResolverRefundPercentage_onlyOwner_reverts( + address _notOwner, + uint256 _percentage + ) + public + { vm.assume(_notOwner != dataAvailabilityChallenge.owner()); _percentage = bound(_percentage, 0, 100); @@ -574,11 +579,11 @@ contract DataAvailabilityChallenge_Resolve_Test is DataAvailabilityChallenge_Tes uint256 zeroAddressBalanceBeforeResolve = address(0).balance; // Assert challenger balance after bond distribution - uint256 resolutionCost = ( - dataAvailabilityChallenge.fixedResolutionCost() - + preImage.length * dataAvailabilityChallenge.variableResolutionCost() - / dataAvailabilityChallenge.variableResolutionCostPrecision() - ) * block.basefee; + uint256 resolutionCost = + (dataAvailabilityChallenge.fixedResolutionCost() + + preImage.length + * dataAvailabilityChallenge.variableResolutionCost() + / dataAvailabilityChallenge.variableResolutionCostPrecision()) * block.basefee; uint256 challengerRefund = bondSize > resolutionCost ? bondSize - resolutionCost : 0; uint256 resolverRefund = resolutionCost * dataAvailabilityChallenge.resolverRefundPercentage() / 100; resolverRefund = resolverRefund > resolutionCost ? resolutionCost : resolverRefund; diff --git a/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol b/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol index 294545b1561..de80a7805fa 100644 --- a/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol +++ b/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol @@ -271,10 +271,7 @@ contract L1StandardBridge_Paused_Test is CommonTest { vm.prank(address(l1StandardBridge.messenger())); vm.expectRevert("StandardBridge: paused"); l1StandardBridge.finalizeBridgeETH{ value: 100 }({ - _from: address(2), - _to: address(3), - _amount: 100, - _extraData: hex"" + _from: address(2), _to: address(3), _amount: 100, _extraData: hex"" }); } @@ -286,10 +283,7 @@ contract L1StandardBridge_Paused_Test is CommonTest { vm.prank(address(l1StandardBridge.messenger())); vm.expectRevert("StandardBridge: paused"); l1StandardBridge.finalizeETHWithdrawal{ value: 100 }({ - _from: address(2), - _to: address(3), - _amount: 100, - _extraData: hex"" + _from: address(2), _to: address(3), _amount: 100, _extraData: hex"" }); } @@ -455,7 +449,12 @@ contract L1StandardBridge_DepositETH_Test is L1StandardBridge_TestInit { } /// @notice Tests that depositETH reverts when custom gas token is enabled for EOA with 7702 delegation. - function testFuzz_depositETH_fromEOA7702WithCustomGasToken_reverts(uint256 _value, uint32 _minGasLimit) external { + function testFuzz_depositETH_fromEOA7702WithCustomGasToken_reverts( + uint256 _value, + uint32 _minGasLimit + ) + external + { skipIfSysFeatureDisabled(Features.CUSTOM_GAS_TOKEN); _value = bound(_value, 1, type(uint128).max); @@ -765,9 +764,8 @@ contract L1StandardBridge_FinalizeERC20Withdrawal_Test is CommonTest { function test_finalizeERC20Withdrawal_succeeds() external { deal(address(L1Token), address(l1StandardBridge), 100, true); - uint256 slot = stdstore.target(address(l1StandardBridge)).sig("deposits(address,address)").with_key( - address(L1Token) - ).with_key(address(L2Token)).find(); + uint256 slot = stdstore.target(address(l1StandardBridge)).sig("deposits(address,address)") + .with_key(address(L1Token)).with_key(address(L2Token)).find(); // Give the L1 bridge some ERC20 tokens vm.store(address(l1StandardBridge), bytes32(slot), bytes32(uint256(100))); diff --git a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol index d74c85b2a9a..61f9f94a493 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol @@ -153,9 +153,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest { opChainConfigs.push( IOPContractsManager.OpChainConfig({ - systemConfigProxy: systemConfig, - cannonPrestate: cannonPrestate, - cannonKonaPrestate: cannonKonaPrestate + systemConfigProxy: systemConfig, cannonPrestate: cannonPrestate, cannonKonaPrestate: cannonKonaPrestate }) ); @@ -267,10 +265,9 @@ contract OPContractsManager_Upgrade_Harness is CommonTest { // Create validationOverrides IOPContractsManagerStandardValidator.ValidationOverrides memory validationOverrides = - IOPContractsManagerStandardValidator.ValidationOverrides({ - l1PAOMultisig: opChainConfigs[0].systemConfigProxy.proxyAdmin().owner(), - challenger: initialChallenger - }); + IOPContractsManagerStandardValidator.ValidationOverrides({ + l1PAOMultisig: opChainConfigs[0].systemConfigProxy.proxyAdmin().owner(), challenger: initialChallenger + }); // Grab the validator before we do the error assertion because otherwise the assertion will // try to apply to this function call instead. @@ -794,10 +791,11 @@ contract OPContractsManager_AddGameType_Test is OPContractsManager_TestInit { _args: DeployUtils.encodeConstructor(abi.encodeCall(IProxy.__constructor__, (address(this)))) }) ); - IProxy(payable(address(delayedWETH))).upgradeToAndCall( - address(opcm.implementations().delayedWETHImpl), - abi.encodeCall(IDelayedWETH.initialize, (chainDeployOutput1.systemConfigProxy)) - ); + IProxy(payable(address(delayedWETH))) + .upgradeToAndCall( + address(opcm.implementations().delayedWETHImpl), + abi.encodeCall(IDelayedWETH.initialize, (chainDeployOutput1.systemConfigProxy)) + ); IOPContractsManager.AddGameInput memory input = newGameInputFactory(GameTypes.CANNON); input.delayedWETH = delayedWETH; IOPContractsManager.AddGameOutput memory output = addGameType(input); @@ -872,11 +870,9 @@ contract OPContractsManager_AddGameType_Test is OPContractsManager_TestInit { extraData = abi.encode(uint256(123)); // l2BlockNumber } IFaultDisputeGame game = IFaultDisputeGame( - payable( - DisputeGames.createGame( + payable(DisputeGames.createGame( chainDeployOutput1.disputeGameFactoryProxy, agi.disputeGameType, proposer, claim, extraData - ) - ) + )) ); // Verify immutable fields on the game proxy @@ -1030,14 +1026,16 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit { ) internal { - bool expectCannonUpdated = address( - IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()).gameImpls(GameTypes.CANNON) - ) != address(0); - bool expectCannonKonaUpdated = address( - IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()).gameImpls( - GameTypes.CANNON_KONA - ) - ) != address(0); + bool expectCannonUpdated = + address( + IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()) + .gameImpls(GameTypes.CANNON) + ) != address(0); + bool expectCannonKonaUpdated = + address( + IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()) + .gameImpls(GameTypes.CANNON_KONA) + ) != address(0); // Retrieve current game args before updatePrestate IDisputeGameFactory dgf = IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()); @@ -1175,9 +1173,8 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit { // Clear out the PermissionedDisputeGame implementation. address owner = chainDeployOutput1.disputeGameFactoryProxy.owner(); vm.prank(owner); - chainDeployOutput1.disputeGameFactoryProxy.setImplementation( - GameTypes.PERMISSIONED_CANNON, IDisputeGame(payable(address(0))) - ); + chainDeployOutput1.disputeGameFactoryProxy + .setImplementation(GameTypes.PERMISSIONED_CANNON, IDisputeGame(payable(address(0)))); // Create the input for the function call. Claim prestate = Claim.wrap(bytes32(hex"ABBA")); @@ -1194,14 +1191,12 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit { assertTrue(success, "updatePrestate failed"); LibGameArgs.GameArgs memory permissionedGameArgs = LibGameArgs.decode( - IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()).gameArgs( - GameTypes.SUPER_PERMISSIONED_CANNON - ) + IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()) + .gameArgs(GameTypes.SUPER_PERMISSIONED_CANNON) ); LibGameArgs.GameArgs memory cannonGameArgs = LibGameArgs.decode( - IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()).gameArgs( - GameTypes.SUPER_CANNON - ) + IDisputeGameFactory(chainDeployOutput1.systemConfigProxy.disputeGameFactory()) + .gameArgs(GameTypes.SUPER_CANNON) ); // Check the prestate values. @@ -1298,9 +1293,8 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit { // Clear out the PermissionedDisputeGame implementation. address owner = chainDeployOutput1.disputeGameFactoryProxy.owner(); vm.prank(owner); - chainDeployOutput1.disputeGameFactoryProxy.setImplementation( - GameTypes.PERMISSIONED_CANNON, IDisputeGame(payable(address(0))) - ); + chainDeployOutput1.disputeGameFactoryProxy + .setImplementation(GameTypes.PERMISSIONED_CANNON, IDisputeGame(payable(address(0)))); // Create the input for the function call. Claim cannonPrestate = Claim.wrap(bytes32(hex"ABBA")); @@ -1319,8 +1313,9 @@ contract OPContractsManager_UpdatePrestate_Test is OPContractsManager_TestInit { address(prestateUpdater).delegatecall(abi.encodeCall(IOPContractsManager.updatePrestate, (inputs))); assertTrue(success, "updatePrestate failed"); - LibGameArgs.GameArgs memory permissionedGameArgs = - LibGameArgs.decode(chainDeployOutput1.disputeGameFactoryProxy.gameArgs(GameTypes.SUPER_PERMISSIONED_CANNON)); + LibGameArgs.GameArgs memory permissionedGameArgs = LibGameArgs.decode( + chainDeployOutput1.disputeGameFactoryProxy.gameArgs(GameTypes.SUPER_PERMISSIONED_CANNON) + ); LibGameArgs.GameArgs memory cannonGameArgs = LibGameArgs.decode(chainDeployOutput1.disputeGameFactoryProxy.gameArgs(GameTypes.SUPER_CANNON)); LibGameArgs.GameArgs memory cannonKonaGameArgs = @@ -1744,16 +1739,16 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit { /// @notice Helper function to create the default migration input. function _getDefaultInput() internal view returns (IOPContractsManagerInteropMigrator.MigrateInput memory) { - IOPContractsManagerInteropMigrator.GameParameters memory gameParameters = IOPContractsManagerInteropMigrator - .GameParameters({ - proposer: address(1234), - challenger: address(5678), - maxGameDepth: 73, - splitDepth: 30, - initBond: 1 ether, - clockExtension: Duration.wrap(10800), - maxClockDuration: Duration.wrap(302400) - }); + IOPContractsManagerInteropMigrator.GameParameters memory gameParameters = + IOPContractsManagerInteropMigrator.GameParameters({ + proposer: address(1234), + challenger: address(5678), + maxGameDepth: 73, + splitDepth: 30, + initBond: 1 ether, + clockExtension: Duration.wrap(10800), + maxClockDuration: Duration.wrap(302400) + }); IOPContractsManager.OpChainConfig[] memory opChainConfigs = new IOPContractsManager.OpChainConfig[](2); opChainConfigs[0] = IOPContractsManager.OpChainConfig( @@ -1818,7 +1813,14 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit { _assertGameIsEmpty(_disputeGameFactory, GameTypes.SUPER_CANNON_KONA, "SUPER_CANNON_KONA"); } - function _assertGameIsEmpty(IDisputeGameFactory _dgf, GameType _gameType, string memory _label) internal view { + function _assertGameIsEmpty( + IDisputeGameFactory _dgf, + GameType _gameType, + string memory _label + ) + internal + view + { assertEq( address(_dgf.gameImpls(_gameType)), address(0), @@ -2351,15 +2353,13 @@ contract OPContractsManager_Deploy_Test is DeployOPChain_TestBase { Claim claim = Claim.wrap(bytes32(uint256(9876))); uint256 l2BlockNumber = uint256(123); IPermissionedDisputeGame pdg = IPermissionedDisputeGame( - payable( - DisputeGames.createGame( + payable(DisputeGames.createGame( opcmOutput.disputeGameFactoryProxy, GameTypes.PERMISSIONED_CANNON, opcmInput.roles.proposer, claim, l2BlockNumber - ) - ) + )) ); // Verify immutable fields on the game proxy diff --git a/packages/contracts-bedrock/test/L1/OPContractsManagerContractsContainer.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManagerContractsContainer.t.sol index 0028b6db813..d400b820672 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManagerContractsContainer.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManagerContractsContainer.t.sol @@ -54,9 +54,7 @@ contract OPContractsManagerContractsContainer_Constructor_Test is OPContractsMan OPContractsManagerContractsContainer.OPContractsManagerContractsContainer_DevFeatureInProd.selector ); OPContractsManagerContractsContainer container = new OPContractsManagerContractsContainer({ - _blueprints: blueprints, - _implementations: implementations, - _devFeatureBitmap: _devFeatureBitmap + _blueprints: blueprints, _implementations: implementations, _devFeatureBitmap: _devFeatureBitmap }); // Constructor shouldn't have worked, foundry makes this return address(1). diff --git a/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol index f68b153d673..438e3a1800a 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol @@ -253,9 +253,7 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest { gameType: GameTypes.PERMISSIONED_CANNON, gameArgs: abi.encode( IOPContractsManagerUtils.PermissionedDisputeGameConfig({ - absolutePrestate: cannonPrestate, - proposer: proposer, - challenger: challenger + absolutePrestate: cannonPrestate, proposer: proposer, challenger: challenger }) ) }); @@ -270,18 +268,17 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest { // Call upgrade to all games to be enabled. prankDelegateCall(owner); - (bool success,) = address(opcmV2).delegatecall( - abi.encodeCall( - IOPContractsManagerV2.upgrade, - ( - IOPContractsManagerV2.UpgradeInput({ - systemConfig: systemConfig, - disputeGameConfigs: disputeGameConfigs, - extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) - }) + (bool success,) = address(opcmV2) + .delegatecall( + abi.encodeCall( + IOPContractsManagerV2.upgrade, + (IOPContractsManagerV2.UpgradeInput({ + systemConfig: systemConfig, + disputeGameConfigs: disputeGameConfigs, + extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) + })) ) - ) - ); + ); assertTrue(success, "upgrade failed"); // Grab the FaultDisputeGame implementation. @@ -336,8 +333,7 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest { returns (IOPContractsManagerStandardValidator.ValidationOverrides memory) { return IOPContractsManagerStandardValidator.ValidationOverrides({ - l1PAOMultisig: address(0), - challenger: address(0) + l1PAOMultisig: address(0), challenger: address(0) }); } @@ -434,8 +430,10 @@ contract OPContractsManagerStandardValidator_GeneralOverride_Test is OPContracts /// successfully returns no error when there is none. That is, it never returns the /// overridden strings alone. function test_validateOverrides_noErrors_succeeds() public { - IOPContractsManagerStandardValidator.ValidationOverrides memory overrides = IOPContractsManagerStandardValidator - .ValidationOverrides({ l1PAOMultisig: address(0xbad), challenger: address(0xc0ffee) }); + IOPContractsManagerStandardValidator.ValidationOverrides memory overrides = + IOPContractsManagerStandardValidator.ValidationOverrides({ + l1PAOMultisig: address(0xbad), challenger: address(0xc0ffee) + }); vm.mockCall( address(delayedWeth), abi.encodeCall(IProxyAdminOwnedBase.proxyAdminOwner, ()), @@ -455,8 +453,10 @@ contract OPContractsManagerStandardValidator_GeneralOverride_Test is OPContracts /// @notice Tests that the validate function (with overrides) and allow failure set to false, /// returns the errors with the overrides prepended. function test_validateOverrides_notAllowFailurePrependsOverrides_succeeds() public { - IOPContractsManagerStandardValidator.ValidationOverrides memory overrides = IOPContractsManagerStandardValidator - .ValidationOverrides({ l1PAOMultisig: address(0xbad), challenger: address(0xc0ffee) }); + IOPContractsManagerStandardValidator.ValidationOverrides memory overrides = + IOPContractsManagerStandardValidator.ValidationOverrides({ + l1PAOMultisig: address(0xbad), challenger: address(0xc0ffee) + }); vm.expectRevert( bytes( @@ -1214,9 +1214,7 @@ contract OPContractsManagerStandardValidator_PermissionedDisputeGame_Test is /// @title OPContractsManagerStandardValidator_AnchorStateRegistry_Test /// @notice Tests validation of `AnchorStateRegistry` configuration -contract OPContractsManagerStandardValidator_AnchorStateRegistry_Test is - OPContractsManagerStandardValidator_TestInit -{ +contract OPContractsManagerStandardValidator_AnchorStateRegistry_Test is OPContractsManagerStandardValidator_TestInit { /// @notice Tests that the validate function successfully returns the right error when the /// AnchorStateRegistry version is invalid. function test_validate_anchorStateRegistryInvalidVersion_succeeds() public { diff --git a/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol b/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol index 35d8e4b33bb..c1f230c20b0 100644 --- a/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol +++ b/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol @@ -61,7 +61,7 @@ abstract contract OptimismPortal2_TestInit is DisputeGameFactory_TestInit { value: 100, gasLimit: 100_000, data: hex"aa" // includes calldata for ERC20 withdrawal test - }); + }); if (isUsingCustomGasToken()) { _defaultTx.value = 0; @@ -107,13 +107,11 @@ abstract contract OptimismPortal2_TestInit is DisputeGameFactory_TestInit { respectedGameType = optimismPortal2.respectedGameType(); game = IFaultDisputeGame( - payable( - address( + payable(address( disputeGameFactory.create{ value: disputeGameFactory.initBonds(respectedGameType) }( respectedGameType, Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber) ) - ) - ) + )) ); // Grab the index of the game we just created. @@ -381,9 +379,8 @@ contract OptimismPortal2_UpgradeInterop_Test is CommonTest { // Call the upgrade function. vm.prank(address(optimismPortal2.proxyAdmin())); - IOptimismPortalInterop(payable(optimismPortal2)).upgrade( - IAnchorStateRegistry(_newAnchorStateRegistry), IETHLockbox(ethLockbox) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .upgrade(IAnchorStateRegistry(_newAnchorStateRegistry), IETHLockbox(ethLockbox)); // Verify that the initialized slot was updated. bytes32 initializedSlotAfter = vm.load(address(optimismPortal2), bytes32(slot.slot)); @@ -416,16 +413,14 @@ contract OptimismPortal2_UpgradeInterop_Test is CommonTest { // Trigger first upgrade. vm.prank(address(optimismPortal2.proxyAdmin())); - IOptimismPortalInterop(payable(optimismPortal2)).upgrade( - IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .upgrade(IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox)); // Try to trigger second upgrade. vm.prank(address(optimismPortal2.proxyAdmin())); vm.expectRevert("Initializable: contract is already initialized"); - IOptimismPortalInterop(payable(optimismPortal2)).upgrade( - IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .upgrade(IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox)); } /// @notice Tests that the upgrade() function reverts if called after initialization. @@ -445,9 +440,8 @@ contract OptimismPortal2_UpgradeInterop_Test is CommonTest { // Try to trigger upgrade(). vm.expectRevert("Initializable: contract is already initialized"); - IOptimismPortalInterop(payable(optimismPortal2)).upgrade( - IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .upgrade(IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox)); } /// @notice Tests that the upgrade() function reverts if called by a non-proxy admin or owner. @@ -467,9 +461,8 @@ contract OptimismPortal2_UpgradeInterop_Test is CommonTest { // Call the `upgrade` function with the sender vm.prank(_sender); - IOptimismPortalInterop(payable(optimismPortal2)).upgrade( - IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .upgrade(IAnchorStateRegistry(address(0xdeadbeef)), IETHLockbox(ethLockbox)); } } @@ -845,9 +838,8 @@ contract OptimismPortal2_MigrateToSuperRoots_Test is OptimismPortal2_TestInit { vm.expectRevert(IProxyAdminOwnedBase.ProxyAdminOwnedBase_NotProxyAdminOwner.selector); vm.prank(_caller); - IOptimismPortalInterop(payable(optimismPortal2)).migrateToSuperRoots( - IETHLockbox(address(1)), IAnchorStateRegistry(address(1)) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .migrateToSuperRoots(IETHLockbox(address(1)), IAnchorStateRegistry(address(1))); } /// @notice Tests that `migrateToSuperRoots` reverts if the new registry is the same as the @@ -865,16 +857,20 @@ contract OptimismPortal2_MigrateToSuperRoots_Test is OptimismPortal2_TestInit { // Expect the migration to revert. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_MigratingToSameRegistry.selector); vm.prank(caller); - IOptimismPortalInterop(payable(optimismPortal2)).migrateToSuperRoots( - IETHLockbox(_newLockbox), newAnchorStateRegistry - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .migrateToSuperRoots(IETHLockbox(_newLockbox), newAnchorStateRegistry); } /// @notice Tests that `migrateToSuperRoots` updates the ETHLockbox contract, updates the /// AnchorStateRegistry, and sets the superRootsActive flag to true. /// @param _newLockbox The new ETHLockbox to migrate to. /// @param _newAnchorStateRegistry The new AnchorStateRegistry to migrate to. - function testFuzz_migrateToSuperRoots_succeeds(address _newLockbox, address _newAnchorStateRegistry) external { + function testFuzz_migrateToSuperRoots_succeeds( + address _newLockbox, + address _newAnchorStateRegistry + ) + external + { address oldLockbox = address(optimismPortal2.ethLockbox()); address oldAnchorStateRegistry = address(optimismPortal2.anchorStateRegistry()); vm.assume(_newLockbox != oldLockbox); @@ -884,9 +880,8 @@ contract OptimismPortal2_MigrateToSuperRoots_Test is OptimismPortal2_TestInit { emit PortalMigrated(oldLockbox, _newLockbox, oldAnchorStateRegistry, _newAnchorStateRegistry); vm.prank(optimismPortal2.proxyAdminOwner()); - IOptimismPortalInterop(payable(optimismPortal2)).migrateToSuperRoots( - IETHLockbox(_newLockbox), IAnchorStateRegistry(_newAnchorStateRegistry) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .migrateToSuperRoots(IETHLockbox(_newLockbox), IAnchorStateRegistry(_newAnchorStateRegistry)); assertEq(address(optimismPortal2.ethLockbox()), _newLockbox); assertEq(address(optimismPortal2.anchorStateRegistry()), _newAnchorStateRegistry); @@ -902,9 +897,8 @@ contract OptimismPortal2_MigrateToSuperRoots_Test is OptimismPortal2_TestInit { address caller = optimismPortal2.proxyAdminOwner(); vm.expectRevert(IOptimismPortal.OptimismPortal_CallPaused.selector); vm.prank(caller); - IOptimismPortalInterop(payable(optimismPortal2)).migrateToSuperRoots( - IETHLockbox(address(1)), IAnchorStateRegistry(address(1)) - ); + IOptimismPortalInterop(payable(optimismPortal2)) + .migrateToSuperRoots(IETHLockbox(address(1)), IAnchorStateRegistry(address(1))); } } @@ -1013,7 +1007,9 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test // Create a new dispute game, and mock both games to be CHALLENGER_WINS. IDisputeGame game2 = disputeGameFactory.create{ value: disputeGameFactory.initBonds(optimismPortal2.respectedGameType()) - }(optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)); + }( + optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1) + ); _proposedGameIndex = disputeGameFactory.gameCount() - 1; vm.mockCall(address(game), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS)); vm.mockCall(address(game2), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS)); @@ -1139,7 +1135,9 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test // Create a new game. IDisputeGame newGame = disputeGameFactory.create{ value: disputeGameFactory.initBonds(optimismPortal2.respectedGameType()) - }(GameType.wrap(0), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)); + }( + GameType.wrap(0), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1) + ); // Update the respected game type to 0xbeef. vm.prank(optimismPortal2.guardian()); @@ -1178,12 +1176,13 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test // Should revert. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_WrongProofMethod.selector); - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameIndex: _proposedGameIndex, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameIndex: _proposedGameIndex, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` reverts when using the Super Roots version @@ -1196,21 +1195,20 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test outputRootWithChainIdArr[0] = Types.OutputRootWithChainId({ root: _outputRoot, chainId: systemConfig.l2ChainId() }); Types.SuperRootProof memory superRootProof = Types.SuperRootProof({ - version: 0x01, - timestamp: uint64(block.timestamp), - outputRoots: outputRootWithChainIdArr + version: 0x01, timestamp: uint64(block.timestamp), outputRoots: outputRootWithChainIdArr }); // Should revert. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_WrongProofMethod.selector); - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameProxy: game, - _outputRootIndex: 0, - _superRootProof: superRootProof, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameProxy: game, + _outputRootIndex: 0, + _superRootProof: superRootProof, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` reverts when using the Super Roots version @@ -1226,21 +1224,20 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test outputRootWithChainIdArr[0] = Types.OutputRootWithChainId({ root: _outputRoot, chainId: systemConfig.l2ChainId() }); Types.SuperRootProof memory superRootProof = Types.SuperRootProof({ - version: 0x01, - timestamp: uint64(block.timestamp), - outputRoots: outputRootWithChainIdArr + version: 0x01, timestamp: uint64(block.timestamp), outputRoots: outputRootWithChainIdArr }); // Should revert because the proof is wrong. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_InvalidSuperRootProof.selector); - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameProxy: game, - _outputRootIndex: 0, - _superRootProof: superRootProof, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameProxy: game, + _outputRootIndex: 0, + _superRootProof: superRootProof, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` reverts when using the Super Roots version @@ -1257,9 +1254,7 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test outputRootWithChainIdArr[0] = Types.OutputRootWithChainId({ root: _outputRoot, chainId: systemConfig.l2ChainId() }); Types.SuperRootProof memory superRootProof = Types.SuperRootProof({ - version: 0x01, - timestamp: uint64(block.timestamp), - outputRoots: outputRootWithChainIdArr + version: 0x01, timestamp: uint64(block.timestamp), outputRoots: outputRootWithChainIdArr }); // Figure out what the right hash would be. @@ -1270,14 +1265,15 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test // Should revert because the proof is wrong. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_InvalidOutputRootIndex.selector); - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameProxy: game, - _outputRootIndex: outputRootWithChainIdArr.length, // out of bounds - _superRootProof: superRootProof, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameProxy: game, + _outputRootIndex: outputRootWithChainIdArr.length, // out of bounds + _superRootProof: superRootProof, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` reverts when using the Super Roots version @@ -1294,11 +1290,9 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test outputRootWithChainIdArr[0] = Types.OutputRootWithChainId({ root: _outputRoot, chainId: systemConfig.l2ChainId() + 1 // wrong chain id - }); + }); Types.SuperRootProof memory superRootProof = Types.SuperRootProof({ - version: 0x01, - timestamp: uint64(block.timestamp), - outputRoots: outputRootWithChainIdArr + version: 0x01, timestamp: uint64(block.timestamp), outputRoots: outputRootWithChainIdArr }); // Figure out what the right hash would be. @@ -1309,14 +1303,15 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test // Should revert because the proof is wrong. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_InvalidOutputRootChainId.selector); - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameProxy: game, - _outputRootIndex: 0, - _superRootProof: superRootProof, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameProxy: game, + _outputRootIndex: 0, + _superRootProof: superRootProof, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` reverts when using the Super Roots version @@ -1335,9 +1330,7 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test chainId: systemConfig.l2ChainId() }); Types.SuperRootProof memory superRootProof = Types.SuperRootProof({ - version: 0x01, - timestamp: uint64(block.timestamp), - outputRoots: outputRootWithChainIdArr + version: 0x01, timestamp: uint64(block.timestamp), outputRoots: outputRootWithChainIdArr }); // Figure out what the right hash would be. @@ -1348,14 +1341,15 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test // Should revert because the proof is wrong. vm.expectRevert(IOptimismPortalInterop.OptimismPortal_InvalidOutputRootProof.selector); - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameProxy: game, - _outputRootIndex: 0, - _superRootProof: superRootProof, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameProxy: game, + _outputRootIndex: 0, + _superRootProof: superRootProof, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` succeeds when all parameters are valid. @@ -1370,9 +1364,7 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test outputRootWithChainIdArr[0] = Types.OutputRootWithChainId({ root: _outputRoot, chainId: systemConfig.l2ChainId() }); Types.SuperRootProof memory superRootProof = Types.SuperRootProof({ - version: 0x01, - timestamp: uint64(block.timestamp), - outputRoots: outputRootWithChainIdArr + version: 0x01, timestamp: uint64(block.timestamp), outputRoots: outputRootWithChainIdArr }); // Figure out what the right hash would be. @@ -1382,14 +1374,15 @@ contract OptimismPortal2_ProveWithdrawalTransaction_Test is OptimismPortal2_Test vm.mockCall(address(game), abi.encodeCall(game.rootClaim, ()), abi.encode(expectedSuperRoot)); // Should succeed. - IOptimismPortalInterop(payable(optimismPortal2)).proveWithdrawalTransaction({ - _tx: _defaultTx, - _disputeGameProxy: game, - _outputRootIndex: 0, - _superRootProof: superRootProof, - _outputRootProof: _outputRootProof, - _withdrawalProof: _withdrawalProof - }); + IOptimismPortalInterop(payable(optimismPortal2)) + .proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameProxy: game, + _outputRootIndex: 0, + _superRootProof: superRootProof, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); } /// @notice Tests that `proveWithdrawalTransaction` succeeds. @@ -1483,13 +1476,11 @@ contract OptimismPortal2_FinalizeWithdrawalTransaction_Test is OptimismPortal2_T }); IFaultDisputeGame game_noData = IFaultDisputeGame( - payable( - address( + payable(address( disputeGameFactory.create{ value: disputeGameFactory.initBonds(respectedGameType) }( respectedGameType, Claim.wrap(_outputRoot_noData), abi.encode(_proposedBlockNumber) ) - ) - ) + )) ); uint256 _proposedGameIndex_noData = disputeGameFactory.gameCount() - 1; @@ -1564,7 +1555,9 @@ contract OptimismPortal2_FinalizeWithdrawalTransaction_Test is OptimismPortal2_T // Create a secondary dispute game. IDisputeGame secondGame = disputeGameFactory.create{ value: disputeGameFactory.initBonds(optimismPortal2.respectedGameType()) - }(optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)); + }( + optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1) + ); // Warp 1 second into the future so that the proof is submitted after the timestamp of game creation. vm.warp(block.timestamp + 1); @@ -1954,12 +1947,7 @@ contract OptimismPortal2_FinalizeWithdrawalTransaction_Test is OptimismPortal2_T // Get a withdrawal transaction and mock proof from the differential testing script. Types.WithdrawalTransaction memory _tx = Types.WithdrawalTransaction({ - nonce: nonce, - sender: _sender, - target: _target, - value: value, - gasLimit: gasLimit, - data: _data + nonce: nonce, sender: _sender, target: _target, value: value, gasLimit: gasLimit, data: _data }); ( bytes32 stateRoot, @@ -2041,12 +2029,7 @@ contract OptimismPortal2_FinalizeWithdrawalTransaction_Test is OptimismPortal2_T // Get a withdrawal transaction and mock proof from the differential testing script. Types.WithdrawalTransaction memory _tx = Types.WithdrawalTransaction({ - nonce: nonce, - sender: _sender, - target: _target, - value: value, - gasLimit: gasLimit, - data: _data + nonce: nonce, sender: _sender, target: _target, value: value, gasLimit: gasLimit, data: _data }); ( bytes32 stateRoot, @@ -2497,23 +2480,26 @@ contract OptimismPortal2_DepositTransaction_Test is OptimismPortal2_TestInit { uint64 gasLimit = optimismPortal2.minimumGasLimit(uint64(size)); vm.expectRevert(IOptimismPortal.OptimismPortal_CalldataTooLarge.selector); optimismPortal2.depositTransaction({ - _to: address(0), - _value: 0, - _gasLimit: gasLimit, - _isCreation: false, - _data: new bytes(size) + _to: address(0), _value: 0, _gasLimit: gasLimit, _isCreation: false, _data: new bytes(size) }); } /// @notice Tests that `depositTransaction` reverts when the gas limit is too small. function test_depositTransaction_smallGasLimit_reverts() external { vm.expectRevert(IOptimismPortal.OptimismPortal_GasLimitTooLow.selector); - optimismPortal2.depositTransaction({ _to: address(1), _value: 0, _gasLimit: 0, _isCreation: false, _data: hex"" }); + optimismPortal2.depositTransaction({ + _to: address(1), _value: 0, _gasLimit: 0, _isCreation: false, _data: hex"" + }); } /// @notice Tests that `depositTransaction` reverts when the value is greater than 0 and the /// custom gas token is active. - function test_depositTransaction_withCustomGasTokenAndValue_reverts(bytes memory _data, uint256 _value) external { + function test_depositTransaction_withCustomGasTokenAndValue_reverts( + bytes memory _data, + uint256 _value + ) + external + { skipIfSysFeatureDisabled(Features.CUSTOM_GAS_TOKEN); // Prevent overflow on an upgrade context @@ -2524,11 +2510,7 @@ contract OptimismPortal2_DepositTransaction_Test is OptimismPortal2_TestInit { vm.prank(alice); vm.expectRevert(IOptimismPortal.OptimismPortal_NotAllowedOnCGTMode.selector); optimismPortal2.depositTransaction{ value: _value }({ - _to: address(0x40), - _value: _value, - _gasLimit: gasLimit, - _isCreation: false, - _data: _data + _to: address(0x40), _value: _value, _gasLimit: gasLimit, _isCreation: false, _data: _data }); } @@ -2541,11 +2523,7 @@ contract OptimismPortal2_DepositTransaction_Test is OptimismPortal2_TestInit { } optimismPortal2.depositTransaction({ - _to: address(0x40), - _value: 0, - _gasLimit: gasLimit, - _isCreation: false, - _data: _data + _to: address(0x40), _value: 0, _gasLimit: gasLimit, _isCreation: false, _data: _data }); } @@ -2604,11 +2582,7 @@ contract OptimismPortal2_DepositTransaction_Test is OptimismPortal2_TestInit { vm.deal(depositor, _mint); vm.prank(depositor, depositor); optimismPortal2.depositTransaction{ value: _mint }({ - _to: _to, - _value: _value, - _gasLimit: _gasLimit, - _isCreation: _isCreation, - _data: _data + _to: _to, _value: _value, _gasLimit: _gasLimit, _isCreation: _isCreation, _data: _data }); if (isSysFeatureEnabled(Features.ETH_LOCKBOX)) { @@ -2671,11 +2645,7 @@ contract OptimismPortal2_DepositTransaction_Test is OptimismPortal2_TestInit { vm.deal(depositor, _mint); vm.prank(depositor, address(0x0420)); optimismPortal2.depositTransaction{ value: _mint }({ - _to: _to, - _value: _value, - _gasLimit: _gasLimit, - _isCreation: _isCreation, - _data: _data + _to: _to, _value: _value, _gasLimit: _gasLimit, _isCreation: _isCreation, _data: _data }); if (isSysFeatureEnabled(Features.ETH_LOCKBOX)) { @@ -2734,11 +2704,7 @@ contract OptimismPortal2_DepositTransaction_Test is OptimismPortal2_TestInit { vm.deal(address(this), _mint); vm.prank(address(this)); optimismPortal2.depositTransaction{ value: _mint }({ - _to: _to, - _value: _value, - _gasLimit: _gasLimit, - _isCreation: _isCreation, - _data: _data + _to: _to, _value: _value, _gasLimit: _gasLimit, _isCreation: _isCreation, _data: _data }); if (isSysFeatureEnabled(Features.ETH_LOCKBOX)) { @@ -2841,11 +2807,7 @@ contract OptimismPortal2_Params_Test is CommonTest { // Do a deposit, should not revert optimismPortal2.depositTransaction{ gas: MAX_GAS_LIMIT }({ - _to: address(0x20), - _value: 0x40, - _gasLimit: _gasLimit, - _isCreation: false, - _data: hex"" + _to: address(0x20), _value: 0x40, _gasLimit: _gasLimit, _isCreation: false, _data: hex"" }); } @@ -2872,9 +2834,10 @@ contract OptimismPortal2_Params_Test is CommonTest { // The value passed to the initialize must be larger than the last value // that initialize was called with. - IProxy(payable(address(optimismPortal2))).upgradeToAndCall( - address(nextImpl), abi.encodeCall(NextImpl.initialize, (optimismPortal2.initVersion() + 1)) - ); + IProxy(payable(address(optimismPortal2))) + .upgradeToAndCall( + address(nextImpl), abi.encodeCall(NextImpl.initialize, (optimismPortal2.initVersion() + 1)) + ); assertEq(IProxy(payable(address(optimismPortal2))).implementation(), address(nextImpl)); // Verify that the NextImpl contract initialized its values according as expected diff --git a/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol b/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol index 23c7bce9de9..aed0a91e95e 100644 --- a/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol +++ b/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol @@ -58,17 +58,18 @@ contract ProtocolVersions_Initialize_Test is ProtocolVersions_TestInit { emit ConfigUpdate(0, IProtocolVersions.UpdateType.RECOMMENDED_PROTOCOL_VERSION, abi.encode(recommended)); vm.prank(EIP1967Helper.getAdmin(address(protocolVersions))); - IProxy(payable(address(protocolVersions))).upgradeToAndCall( - address(protocolVersionsImpl), - abi.encodeCall( - IProtocolVersions.initialize, - ( - alice, // _owner - required, // _required - recommended // recommended + IProxy(payable(address(protocolVersions))) + .upgradeToAndCall( + address(protocolVersionsImpl), + abi.encodeCall( + IProtocolVersions.initialize, + ( + alice, // _owner + required, // _required + recommended // recommended + ) ) - ) - ); + ); } } diff --git a/packages/contracts-bedrock/test/L1/ProxyAdminOwnedBase.t.sol b/packages/contracts-bedrock/test/L1/ProxyAdminOwnedBase.t.sol index 9b56f17eb21..a9f81554a9d 100644 --- a/packages/contracts-bedrock/test/L1/ProxyAdminOwnedBase.t.sol +++ b/packages/contracts-bedrock/test/L1/ProxyAdminOwnedBase.t.sol @@ -244,9 +244,7 @@ contract ProxyAdminOwnedBase_assertOnlyProxyAdminOrProxyAdminOwner_Test is Proxy /// @notice Tests that the assertOnlyProxyAdminOrProxyAdminOwner function reverts if the caller /// is not the ProxyAdmin or the ProxyAdmin owner. /// @param _sender The address of the sender to test. - function test_assertOnlyProxyAdminOrProxyAdminOwner_notProxyAdminOrProxyAdminOwner_reverts(address _sender) - public - { + function test_assertOnlyProxyAdminOrProxyAdminOwner_notProxyAdminOrProxyAdminOwner_reverts(address _sender) public { // Prank as the not ProxyAdmin or ProxyAdmin owner. vm.assume(_sender != address(proxyAdmin) && _sender != proxyAdminOwner); vm.prank(_sender); diff --git a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol index eca3d477053..27135552b0d 100644 --- a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol +++ b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol @@ -45,9 +45,7 @@ contract MeterUser is ResourceMetering { function set(uint128 _prevBaseFee, uint64 _prevBoughtGas, uint64 _prevBlockNum) public { params = ResourceMetering.ResourceParams({ - prevBaseFee: _prevBaseFee, - prevBoughtGas: _prevBoughtGas, - prevBlockNum: _prevBlockNum + prevBaseFee: _prevBaseFee, prevBoughtGas: _prevBoughtGas, prevBlockNum: _prevBlockNum }); } @@ -65,9 +63,7 @@ contract CustomMeterUser is ResourceMetering { constructor(uint128 _prevBaseFee, uint64 _prevBoughtGas, uint64 _prevBlockNum) { params = ResourceMetering.ResourceParams({ - prevBaseFee: _prevBaseFee, - prevBoughtGas: _prevBoughtGas, - prevBlockNum: _prevBlockNum + prevBaseFee: _prevBaseFee, prevBoughtGas: _prevBoughtGas, prevBlockNum: _prevBlockNum }); } diff --git a/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol b/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol index 352d8b5b8fb..3f22f02cd13 100644 --- a/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol +++ b/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol @@ -36,8 +36,7 @@ contract SuperchainConfig_Initialize_Test is SuperchainConfig_TestInit { function test_initialize_paused_succeeds() external { IProxy newProxy = IProxy( DeployUtils.create1({ - _name: "Proxy", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IProxy.__constructor__, (alice))) + _name: "Proxy", _args: DeployUtils.encodeConstructor(abi.encodeCall(IProxy.__constructor__, (alice))) }) ); ISuperchainConfig newImpl = ISuperchainConfig( diff --git a/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerContainer.t.sol b/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerContainer.t.sol index 6ce881b6171..a6fedf85739 100644 --- a/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerContainer.t.sol +++ b/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerContainer.t.sol @@ -62,7 +62,12 @@ contract OPContractsManagerContainer_Constructor_Test is OPContractsManagerConta /// @notice Tests that the constructor succeeds with any dev bitmap when in a test environment. /// @param _chainId The chain ID to use. /// @param _devFeatureBitmap The dev feature bitmap to use. - function testFuzz_constructor_devBitmapInTestEnv_succeeds(uint64 _chainId, bytes32 _devFeatureBitmap) public { + function testFuzz_constructor_devBitmapInTestEnv_succeeds( + uint64 _chainId, + bytes32 _devFeatureBitmap + ) + public + { // Etch code into the magic testing address so we're recognized as a test env. vm.etch(Constants.TESTING_ENVIRONMENT_ADDRESS, hex"01"); diff --git a/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerUtils.t.sol b/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerUtils.t.sol index b71e09b7528..e765485e296 100644 --- a/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerUtils.t.sol +++ b/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerUtils.t.sol @@ -378,10 +378,7 @@ contract OPContractsManagerUtils_LoadOrDeployProxy_Test is OPContractsManagerUti proxyAdmin.setAddressManager(addressManager); deployArgs = OPContractsManagerUtils.ProxyDeployArgs({ - proxyAdmin: proxyAdmin, - addressManager: addressManager, - l2ChainId: 42, - saltMixer: "testMixer" + proxyAdmin: proxyAdmin, addressManager: addressManager, l2ChainId: 42, saltMixer: "testMixer" }); } diff --git a/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerV2.t.sol b/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerV2.t.sol index 21306d2d790..0b6227921ad 100644 --- a/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerV2.t.sol +++ b/packages/contracts-bedrock/test/L1/opcm/OPContractsManagerV2.t.sol @@ -121,10 +121,9 @@ contract OPContractsManagerV2_TestInit is CommonTest { // Create validationOverrides for the newly deployed chain. IOPContractsManagerStandardValidator.ValidationOverrides memory validationOverrides = - IOPContractsManagerStandardValidator.ValidationOverrides({ - l1PAOMultisig: _deployConfig.proxyAdminOwner, - challenger: deployChallenger - }); + IOPContractsManagerStandardValidator.ValidationOverrides({ + l1PAOMultisig: _deployConfig.proxyAdminOwner, challenger: deployChallenger + }); // Grab the validator before we do the error assertion. IOPContractsManagerStandardValidator validator = _opcm.opcmStandardValidator(); @@ -245,43 +244,51 @@ contract OPContractsManagerV2_Upgrade_TestInit is OPContractsManagerV2_TestInit address initialChallengerForV2 = DisputeGames.permissionedGameChallenger(disputeGameFactory); address initialProposerForV2 = DisputeGames.permissionedGameProposer(disputeGameFactory); v2UpgradeInput.systemConfig = systemConfig; - v2UpgradeInput.disputeGameConfigs.push( - IOPContractsManagerUtils.DisputeGameConfig({ - enabled: true, - initBond: disputeGameFactory.initBonds(GameTypes.CANNON), - gameType: GameTypes.CANNON, - gameArgs: abi.encode(IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonPrestate })) - }) - ); - v2UpgradeInput.disputeGameConfigs.push( - IOPContractsManagerUtils.DisputeGameConfig({ - enabled: true, - initBond: disputeGameFactory.initBonds(GameTypes.PERMISSIONED_CANNON), - gameType: GameTypes.PERMISSIONED_CANNON, - gameArgs: abi.encode( - IOPContractsManagerUtils.PermissionedDisputeGameConfig({ - absolutePrestate: cannonPrestate, - proposer: initialProposerForV2, - challenger: initialChallengerForV2 - }) - ) - }) - ); - v2UpgradeInput.disputeGameConfigs.push( - IOPContractsManagerUtils.DisputeGameConfig({ - enabled: true, - initBond: disputeGameFactory.initBonds(GameTypes.CANNON_KONA), - gameType: GameTypes.CANNON_KONA, - gameArgs: abi.encode( - IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonKonaPrestate }) - ) - }) - ); + v2UpgradeInput.disputeGameConfigs + .push( + IOPContractsManagerUtils.DisputeGameConfig({ + enabled: true, + initBond: disputeGameFactory.initBonds(GameTypes.CANNON), + gameType: GameTypes.CANNON, + gameArgs: abi.encode( + IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonPrestate }) + ) + }) + ); + v2UpgradeInput.disputeGameConfigs + .push( + IOPContractsManagerUtils.DisputeGameConfig({ + enabled: true, + initBond: disputeGameFactory.initBonds(GameTypes.PERMISSIONED_CANNON), + gameType: GameTypes.PERMISSIONED_CANNON, + gameArgs: abi.encode( + IOPContractsManagerUtils.PermissionedDisputeGameConfig({ + absolutePrestate: cannonPrestate, + proposer: initialProposerForV2, + challenger: initialChallengerForV2 + }) + ) + }) + ); + v2UpgradeInput.disputeGameConfigs + .push( + IOPContractsManagerUtils.DisputeGameConfig({ + enabled: true, + initBond: disputeGameFactory.initBonds(GameTypes.CANNON_KONA), + gameType: GameTypes.CANNON_KONA, + gameArgs: abi.encode( + IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonKonaPrestate }) + ) + }) + ); // Allow the DelayedWETH proxy to be (re)deployed during upgrades if it is missing. - v2UpgradeInput.extraInstructions.push( - IOPContractsManagerUtils.ExtraInstruction({ key: "PermittedProxyDeployment", data: bytes("DelayedWETH") }) - ); + v2UpgradeInput.extraInstructions + .push( + IOPContractsManagerUtils.ExtraInstruction({ + key: "PermittedProxyDeployment", data: bytes("DelayedWETH") + }) + ); } /// @notice Helper function that runs an OPCM V2 upgrade, asserts that the upgrade was successful, @@ -304,17 +311,16 @@ contract OPContractsManagerV2_Upgrade_TestInit is OPContractsManagerV2_TestInit // Execute the SuperchainConfig upgrade. prankDelegateCall(superchainPAO); - (bool success, bytes memory reason) = address(opcmV2).delegatecall( - abi.encodeCall( - IOPContractsManagerV2.upgradeSuperchain, - ( - IOPContractsManagerV2.SuperchainUpgradeInput({ - superchainConfig: superchainConfig, - extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) - }) + (bool success, bytes memory reason) = address(opcmV2) + .delegatecall( + abi.encodeCall( + IOPContractsManagerV2.upgradeSuperchain, + (IOPContractsManagerV2.SuperchainUpgradeInput({ + superchainConfig: superchainConfig, + extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) + })) ) - ) - ); + ); if (success == false) { // Only acceptable revert reason is the SuperchainConfig already being up to date. This // try/catch is better than checking the version via the implementations struct because @@ -369,10 +375,9 @@ contract OPContractsManagerV2_Upgrade_TestInit is OPContractsManagerV2_TestInit // Create validationOverrides IOPContractsManagerStandardValidator.ValidationOverrides memory validationOverrides = - IOPContractsManagerStandardValidator.ValidationOverrides({ - l1PAOMultisig: v2UpgradeInput.systemConfig.proxyAdminOwner(), - challenger: initialChallenger - }); + IOPContractsManagerStandardValidator.ValidationOverrides({ + l1PAOMultisig: v2UpgradeInput.systemConfig.proxyAdminOwner(), challenger: initialChallenger + }); // Grab the validator before we do the error assertion because otherwise the assertion will // try to apply to this function call instead. @@ -555,9 +560,8 @@ contract OPContractsManagerV2_Upgrade_Test is OPContractsManagerV2_Upgrade_TestI /// deployments. function test_upgrade_allPermittedProxyDeployments_reverts() public { delete v2UpgradeInput.extraInstructions; - v2UpgradeInput.extraInstructions.push( - IOPContractsManagerUtils.ExtraInstruction({ key: "PermitProxyDeployment", data: abi.encode("ALL") }) - ); + v2UpgradeInput.extraInstructions + .push(IOPContractsManagerUtils.ExtraInstruction({ key: "PermitProxyDeployment", data: abi.encode("ALL") })); // Expect upgrade to revert due to invalid upgrade input. // nosemgrep: sol-style-use-abi-encodecall @@ -905,9 +909,8 @@ contract OPContractsManagerV2_UpgradeSuperchain_Test is OPContractsManagerV2_Upg // Do the upgrade. prankDelegateCall(superchainPAO); - (bool success,) = address(opcmV2).delegatecall( - abi.encodeCall(IOPContractsManagerV2.upgradeSuperchain, (superchainUpgradeInput)) - ); + (bool success,) = address(opcmV2) + .delegatecall(abi.encodeCall(IOPContractsManagerV2.upgradeSuperchain, (superchainUpgradeInput))); assertTrue(success, "upgradeSuperchain failed"); } @@ -930,9 +933,8 @@ contract OPContractsManagerV2_UpgradeSuperchain_Test is OPContractsManagerV2_Upg // Should revert. vm.expectRevert("Ownable: caller is not the owner"); prankDelegateCall(delegateCaller); - (bool success,) = address(opcmV2).delegatecall( - abi.encodeCall(IOPContractsManagerV2.upgradeSuperchain, (superchainUpgradeInput)) - ); + (bool success,) = address(opcmV2) + .delegatecall(abi.encodeCall(IOPContractsManagerV2.upgradeSuperchain, (superchainUpgradeInput))); assertTrue(success, "upgradeSuperchain failed"); } @@ -955,9 +957,8 @@ contract OPContractsManagerV2_UpgradeSuperchain_Test is OPContractsManagerV2_Upg ) ); prankDelegateCall(superchainPAO); - (bool success,) = address(opcmV2).delegatecall( - abi.encodeCall(IOPContractsManagerV2.upgradeSuperchain, (superchainUpgradeInput)) - ); + (bool success,) = address(opcmV2) + .delegatecall(abi.encodeCall(IOPContractsManagerV2.upgradeSuperchain, (superchainUpgradeInput))); assertTrue(success, "upgradeSuperchain failed"); } } @@ -998,38 +999,41 @@ contract OPContractsManagerV2_Deploy_Test is OPContractsManagerV2_TestInit { // Set up dispute game configs using the same pattern as upgrade tests. address initialChallenger = DisputeGames.permissionedGameChallenger(disputeGameFactory); address initialProposer = DisputeGames.permissionedGameProposer(disputeGameFactory); - deployConfig.disputeGameConfigs.push( - IOPContractsManagerUtils.DisputeGameConfig({ - enabled: true, - initBond: DEFAULT_DISPUTE_GAME_INIT_BOND, // Standard init bond - gameType: GameTypes.CANNON, - gameArgs: abi.encode(IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonPrestate })) - }) - ); - deployConfig.disputeGameConfigs.push( - IOPContractsManagerUtils.DisputeGameConfig({ - enabled: true, - initBond: DEFAULT_DISPUTE_GAME_INIT_BOND, // Standard init bond - gameType: GameTypes.PERMISSIONED_CANNON, - gameArgs: abi.encode( - IOPContractsManagerUtils.PermissionedDisputeGameConfig({ - absolutePrestate: cannonPrestate, - proposer: initialProposer, - challenger: initialChallenger - }) - ) - }) - ); - deployConfig.disputeGameConfigs.push( - IOPContractsManagerUtils.DisputeGameConfig({ - enabled: true, - initBond: DEFAULT_DISPUTE_GAME_INIT_BOND, // Standard init bond - gameType: GameTypes.CANNON_KONA, - gameArgs: abi.encode( - IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonKonaPrestate }) - ) - }) - ); + deployConfig.disputeGameConfigs + .push( + IOPContractsManagerUtils.DisputeGameConfig({ + enabled: true, + initBond: DEFAULT_DISPUTE_GAME_INIT_BOND, // Standard init bond + gameType: GameTypes.CANNON, + gameArgs: abi.encode( + IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonPrestate }) + ) + }) + ); + deployConfig.disputeGameConfigs + .push( + IOPContractsManagerUtils.DisputeGameConfig({ + enabled: true, + initBond: DEFAULT_DISPUTE_GAME_INIT_BOND, // Standard init bond + gameType: GameTypes.PERMISSIONED_CANNON, + gameArgs: abi.encode( + IOPContractsManagerUtils.PermissionedDisputeGameConfig({ + absolutePrestate: cannonPrestate, proposer: initialProposer, challenger: initialChallenger + }) + ) + }) + ); + deployConfig.disputeGameConfigs + .push( + IOPContractsManagerUtils.DisputeGameConfig({ + enabled: true, + initBond: DEFAULT_DISPUTE_GAME_INIT_BOND, // Standard init bond + gameType: GameTypes.CANNON_KONA, + gameArgs: abi.encode( + IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonKonaPrestate }) + ) + }) + ); } /// @notice Tests that the deploy function succeeds and passes standard validation. @@ -1169,9 +1173,7 @@ contract OPContractsManagerV2_Migrate_Test is OPContractsManagerV2_TestInit { gameType: GameTypes.PERMISSIONED_CANNON, gameArgs: abi.encode( IOPContractsManagerUtils.PermissionedDisputeGameConfig({ - absolutePrestate: cannonPrestate, - proposer: initialProposer, - challenger: initialChallenger + absolutePrestate: cannonPrestate, proposer: initialProposer, challenger: initialChallenger }) ) }); @@ -1179,7 +1181,9 @@ contract OPContractsManagerV2_Migrate_Test is OPContractsManagerV2_TestInit { enabled: true, initBond: 0.08 ether, gameType: GameTypes.CANNON_KONA, - gameArgs: abi.encode(IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonKonaPrestate })) + gameArgs: abi.encode( + IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: cannonKonaPrestate }) + ) }); // Set up the deploy config using struct literal for compile-time field checking. @@ -1232,9 +1236,7 @@ contract OPContractsManagerV2_Migrate_Test is OPContractsManagerV2_TestInit { gameType: GameTypes.SUPER_PERMISSIONED_CANNON, gameArgs: abi.encode( IOPContractsManagerUtils.PermissionedDisputeGameConfig({ - absolutePrestate: superPrestate, - proposer: proposer, - challenger: challenger + absolutePrestate: superPrestate, proposer: proposer, challenger: challenger }) ) }); @@ -1256,7 +1258,12 @@ contract OPContractsManagerV2_Migrate_Test is OPContractsManagerV2_TestInit { /// @notice Helper function to execute a migration with a revert selector. /// @param _input The input to the migration function. /// @param _revertSelector The selector of the revert to expect. - function _doMigration(IOPContractsManagerMigrator.MigrateInput memory _input, bytes4 _revertSelector) internal { + function _doMigration( + IOPContractsManagerMigrator.MigrateInput memory _input, + bytes4 _revertSelector + ) + internal + { // Set the proxy admin owner to be a delegate caller. address proxyAdminOwner = chainContracts1.proxyAdmin.owner(); @@ -1291,7 +1298,14 @@ contract OPContractsManagerV2_Migrate_Test is OPContractsManagerV2_TestInit { /// @param _dgf The dispute game factory. /// @param _gameType The game type. /// @param _label The label for the game type. - function _assertGameIsEmpty(IDisputeGameFactory _dgf, GameType _gameType, string memory _label) internal view { + function _assertGameIsEmpty( + IDisputeGameFactory _dgf, + GameType _gameType, + string memory _label + ) + internal + view + { assertEq( address(_dgf.gameImpls(_gameType)), address(0), diff --git a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol index 7d1b2460099..3ff49ff581a 100644 --- a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol +++ b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol @@ -175,7 +175,12 @@ contract CrossL2Inbox_ValidateMessage_Test is CrossL2Inbox_TestInit { /// @notice Test that a valid tx calling `validateMessage` doesn't warm the slot for the next /// one. /// forge-config: default.isolate = true - function test_validateMessage_validDoesntWarm_reverts(Identifier memory _id, bytes32 _messageHash) external { + function test_validateMessage_validDoesntWarm_reverts( + Identifier memory _id, + bytes32 _messageHash + ) + external + { // Bound values types to ensure they are not too large _id.blockNumber = bound(_id.blockNumber, 0, type(uint64).max); _id.logIndex = bound(_id.logIndex, 0, type(uint32).max); diff --git a/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol b/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol index fdef5e443c7..97a4e724ceb 100644 --- a/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol +++ b/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol @@ -165,7 +165,7 @@ contract ETHLiquidity_Fund_Test is ETHLiquidity_TestInit { function testFuzz_fund_succeeds(uint256 _amount, address _caller) public { // Assume vm.assume(_amount > 0); // Fund amount must be greater than 0 - // Bound amount reasonably, e.g., up to 1 million ETH + // Bound amount reasonably, e.g., up to 1 million ETH _amount = bound(_amount, 1, STARTING_LIQUIDITY_BALANCE); vm.assume(_caller != address(0)); vm.assume(_caller != address(ethLiquidity)); // Prevent contract from calling itself diff --git a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol index 72b74f0c36b..307484975fb 100644 --- a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol +++ b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol @@ -227,7 +227,7 @@ contract GasPriceOracleEcotone_Test is GasPriceOracle_Test { /// @dev Tests that `getL1GasUsed` and `getL1Fee` return expected values function test_getL1Fee_succeeds() external view { bytes memory data = hex"0000010203"; // 2 zero bytes, 3 non-zero bytes - // (2*4) + (3*16) + (68*16) == 1144 + // (2*4) + (3*16) + (68*16) == 1144 uint256 gas = gasPriceOracle.getL1GasUsed(data); assertEq(gas, 1144); uint256 price = gasPriceOracle.getL1Fee(data); @@ -341,8 +341,7 @@ contract GasPriceOracleFjordActive_Test is GasPriceOracle_Test { /// for a specific test transaction function test_getL1FeeRegression_succeeds() external view { // fastlzSize: 235, inc signature - bytes memory data = - hex"1d2c3ec4f5a9b3f3cd2c024e455c1143a74bbd637c324adcbd4f74e346786ac44e23e78f47d932abedd8d1" + bytes memory data = hex"1d2c3ec4f5a9b3f3cd2c024e455c1143a74bbd637c324adcbd4f74e346786ac44e23e78f47d932abedd8d1" hex"06daadcea350be16478461046273101034601364012364701331dfad43729dc486abd134bcad61b34d6ca1" hex"f2eb31655b7d61ca33ba6d172cdf7d8b5b0ef389a314ca7a9a831c09fc2ca9090d059b4dd25194f3de297b" hex"dba6d6d796e4f80be94f8a9151d685607826e7ba25177b40cb127ea9f1438470"; @@ -454,21 +453,22 @@ contract GasPriceOracleJovian_Test is GasPriceOracle_Test { function _setOperatorFeeParams(uint32 _operatorFeeScalar, uint64 _operatorFeeConstant) internal { vm.prank(depositor); - (bool success,) = address(l1Block).call( - Encoding.encodeSetL1BlockValuesIsthmus( - baseFeeScalar, - blobBaseFeeScalar, - sequenceNumber, - timestamp, - number, - baseFee, - blobBaseFee, - hash, - batcherHash, - _operatorFeeScalar, - _operatorFeeConstant - ) - ); + (bool success,) = address(l1Block) + .call( + Encoding.encodeSetL1BlockValuesIsthmus( + baseFeeScalar, + blobBaseFeeScalar, + sequenceNumber, + timestamp, + number, + baseFee, + blobBaseFee, + hash, + batcherHash, + _operatorFeeScalar, + _operatorFeeConstant + ) + ); require(success, "GasPriceOracleJovian_Test: L1Block setup failed"); } diff --git a/packages/contracts-bedrock/test/L2/L1Withdrawer.t.sol b/packages/contracts-bedrock/test/L2/L1Withdrawer.t.sol index fa00468a039..0c33ac31463 100644 --- a/packages/contracts-bedrock/test/L2/L1Withdrawer.t.sol +++ b/packages/contracts-bedrock/test/L2/L1Withdrawer.t.sol @@ -45,7 +45,9 @@ contract L1Withdrawer_Constructor_Test is L1Withdrawer_TestInit { DeployUtils.create1({ _name: "L1Withdrawer", _args: DeployUtils.encodeConstructor( - abi.encodeCall(IL1Withdrawer.__constructor__, (_minWithdrawalAmount, _recipient, _withdrawalGasLimit)) + abi.encodeCall( + IL1Withdrawer.__constructor__, (_minWithdrawalAmount, _recipient, _withdrawalGasLimit) + ) ) }) ); diff --git a/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol index 7978cede990..50d69621213 100644 --- a/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol @@ -30,8 +30,9 @@ abstract contract L2CrossDomainMessenger_TestInit is CommonTest { contract L2CrossDomainMessenger_Constructor_Test is L2CrossDomainMessenger_TestInit { /// @notice Tests that the implementation is initialized correctly. function test_constructor_succeeds() external view { - IL2CrossDomainMessenger impl = - IL2CrossDomainMessenger(EIP1967Helper.getImplementation(artifacts.mustGetAddress("L2CrossDomainMessenger"))); + IL2CrossDomainMessenger impl = IL2CrossDomainMessenger( + EIP1967Helper.getImplementation(artifacts.mustGetAddress("L2CrossDomainMessenger")) + ); assertEq(address(impl.OTHER_MESSENGER()), address(0)); assertEq(address(impl.otherMessenger()), address(0)); assertEq(address(impl.l1CrossDomainMessenger()), address(0)); @@ -58,7 +59,12 @@ contract L2CrossDomainMessenger_Initialize_Test is L2CrossDomainMessenger_TestIn /// @notice Tests the `sendMessage` function of the `L2CrossDomainMessenger` contract. contract L2CrossDomainMessenger_SendMessage_Test is L2CrossDomainMessenger_TestInit { /// @notice Tests that `sendMessage` executes successfully with various target addresses and gas limits. - function testFuzz_sendMessage_withValidTargetAndGasLimit_succeeds(address _target, uint32 _minGasLimit) external { + function testFuzz_sendMessage_withValidTargetAndGasLimit_succeeds( + address _target, + uint32 _minGasLimit + ) + external + { vm.assume(_target != address(0)); _minGasLimit = uint32(bound(_minGasLimit, 21000, 30_000_000)); diff --git a/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol b/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol index 8ea1e57ad20..fa8f3b8df62 100644 --- a/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol +++ b/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol @@ -346,12 +346,7 @@ contract L2StandardBridge_Withdraw_Test is L2StandardBridge_TestInit { vm.expectEmit(address(l2StandardBridge)); emit WithdrawalInitiated({ - l1Token: address(0), - l2Token: Predeploys.LEGACY_ERC20_ETH, - from: alice, - to: alice, - amount: 100, - data: hex"" + l1Token: address(0), l2Token: Predeploys.LEGACY_ERC20_ETH, from: alice, to: alice, amount: 100, data: hex"" }); vm.expectEmit(address(l2StandardBridge)); @@ -359,10 +354,7 @@ contract L2StandardBridge_Withdraw_Test is L2StandardBridge_TestInit { vm.prank(alice, alice); l2StandardBridge.withdraw{ value: 100 }({ - _l2Token: Predeploys.LEGACY_ERC20_ETH, - _amount: 100, - _minGasLimit: 1000, - _extraData: hex"" + _l2Token: Predeploys.LEGACY_ERC20_ETH, _amount: 100, _minGasLimit: 1000, _extraData: hex"" }); assertEq(Predeploys.L2_TO_L1_MESSAGE_PASSER.balance, 100); @@ -494,7 +486,13 @@ contract L2StandardBridge_Uncategorized_Test is L2StandardBridge_TestInit { } /// @notice Tests that bridging ETH succeeds. - function testFuzz_bridgeETH_succeeds(uint256 _value, uint32 _minGasLimit, bytes calldata _extraData) external { + function testFuzz_bridgeETH_succeeds( + uint256 _value, + uint32 _minGasLimit, + bytes calldata _extraData + ) + external + { skipIfSysFeatureEnabled(Features.CUSTOM_GAS_TOKEN); uint256 nonce = l2CrossDomainMessenger.messageNonce(); @@ -528,7 +526,13 @@ contract L2StandardBridge_Uncategorized_Test is L2StandardBridge_TestInit { } /// @notice Tests that bridging ETH to a different address succeeds. - function testFuzz_bridgeETHTo_succeeds(uint256 _value, uint32 _minGasLimit, bytes calldata _extraData) external { + function testFuzz_bridgeETHTo_succeeds( + uint256 _value, + uint32 _minGasLimit, + bytes calldata _extraData + ) + external + { skipIfSysFeatureEnabled(Features.CUSTOM_GAS_TOKEN); uint256 nonce = l2CrossDomainMessenger.messageNonce(); diff --git a/packages/contracts-bedrock/test/L2/L2ToL1MessagePasser.t.sol b/packages/contracts-bedrock/test/L2/L2ToL1MessagePasser.t.sol index e3ddd2497db..4a1dafc41c7 100644 --- a/packages/contracts-bedrock/test/L2/L2ToL1MessagePasser.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ToL1MessagePasser.t.sol @@ -58,11 +58,20 @@ contract L2ToL1MessagePasser_Receive_Test is CommonTest { /// @notice Tests the `burn` function of the `L2ToL1MessagePasser` contract. contract L2ToL1MessagePasser_Burn_Test is CommonTest { /// @notice Tests that `burn` succeeds and destroys the ETH held in the contract. - function testFuzz_burn_succeeds(uint256 _value, address _target, uint256 _gasLimit, bytes memory _data) external { + function testFuzz_burn_succeeds( + uint256 _value, + address _target, + uint256 _gasLimit, + bytes memory _data + ) + external + { skipIfSysFeatureEnabled(Features.CUSTOM_GAS_TOKEN); vm.deal(address(this), _value); - l2ToL1MessagePasser.initiateWithdrawal{ value: _value }({ _target: _target, _gasLimit: _gasLimit, _data: _data }); + l2ToL1MessagePasser.initiateWithdrawal{ value: _value }({ + _target: _target, _gasLimit: _gasLimit, _data: _data + }); assertEq(address(l2ToL1MessagePasser).balance, _value); @@ -96,12 +105,7 @@ contract L2ToL1MessagePasser_InitiateWithdrawal_Test is CommonTest { bytes32 withdrawalHash = Hashing.hashWithdrawal( Types.WithdrawalTransaction({ - nonce: nonce, - sender: _sender, - target: _target, - value: _value, - gasLimit: _gasLimit, - data: _data + nonce: nonce, sender: _sender, target: _target, value: _value, gasLimit: _gasLimit, data: _data }) ); @@ -176,7 +180,9 @@ contract L2ToL1MessagePasser_InitiateWithdrawal_Test is CommonTest { vm.expectEmit(address(l2ToL1MessagePasser)); emit MessagePassed(nonce, alice, _target, _value, _gasLimit, _data, withdrawalHash); - l2ToL1MessagePasser.initiateWithdrawal{ value: _value }({ _target: _target, _gasLimit: _gasLimit, _data: _data }); + l2ToL1MessagePasser.initiateWithdrawal{ value: _value }({ + _target: _target, _gasLimit: _gasLimit, _data: _data + }); // the sent messages mapping is filled assertEq(l2ToL1MessagePasser.sentMessages(withdrawalHash), true); diff --git a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol index 508aac46590..c76ea17cfe0 100644 --- a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol @@ -177,7 +177,13 @@ contract L2ToL2CrossDomainMessenger_CrossDomainMessageContext_Test is L2ToL2Cros /// @notice Tests the `sendMessage` function of the `L2ToL2CrossDomainMessenger` contract. contract L2ToL2CrossDomainMessenger_SendMessage_Test is L2ToL2CrossDomainMessenger_TestInit { /// @notice Tests that `sendMessage` succeeds and emits the correct event. - function testFuzz_sendMessage_succeeds(uint256 _destination, address _target, bytes calldata _message) external { + function testFuzz_sendMessage_succeeds( + uint256 _destination, + address _target, + bytes calldata _message + ) + external + { // Ensure the destination is not the same as the source, otherwise the function will revert vm.assume(_destination != block.chainid); @@ -249,7 +255,12 @@ contract L2ToL2CrossDomainMessenger_SendMessage_Test is L2ToL2CrossDomainMesseng /// @notice Tests that the `sendMessage` function reverts when destination is the same as the /// source chain. - function testFuzz_sendMessage_destinationSameChain_reverts(address _target, bytes calldata _message) external { + function testFuzz_sendMessage_destinationSameChain_reverts( + address _target, + bytes calldata _message + ) + external + { // Expect a revert with the MessageDestinationSameChain selector vm.expectRevert(MessageDestinationSameChain.selector); @@ -275,9 +286,7 @@ contract L2ToL2CrossDomainMessenger_SendMessage_Test is L2ToL2CrossDomainMesseng // Call `senderMessage` with the L2ToL2CrossDomainMessenger as the target to provoke revert l2ToL2CrossDomainMessenger.sendMessage({ - _destination: _destination, - _target: Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, - _message: _message + _destination: _destination, _target: Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, _message: _message }); } } diff --git a/packages/contracts-bedrock/test/L2/LiquidityController.t.sol b/packages/contracts-bedrock/test/L2/LiquidityController.t.sol index 9b77c45ea75..00874919294 100644 --- a/packages/contracts-bedrock/test/L2/LiquidityController.t.sol +++ b/packages/contracts-bedrock/test/L2/LiquidityController.t.sol @@ -241,7 +241,13 @@ contract LiquidityController_Burn_Test is LiquidityController_TestInit { } /// @notice Tests that the burn function reverts when called by unauthorized address. - function testFuzz_burn_fromUnauthorizedCaller_fails(address _caller, uint256 _amount, address _minter) public { + function testFuzz_burn_fromUnauthorizedCaller_fails( + address _caller, + uint256 _amount, + address _minter + ) + public + { _authorizeMinter(_minter); vm.assume(_caller != _minter); _amount = bound(_amount, 0, address(nativeAssetLiquidity).balance); diff --git a/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol index 3950de5901a..8514a1a75a4 100644 --- a/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol +++ b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol @@ -322,7 +322,14 @@ contract OptimismSuperchainERC20_Uncategorized_Test is OptimismSuperchainERC20_T /// since the behaviour should be the same regardless of the caller. /// @param _owner The funds owner. /// @param _guy The address of the spender - It cannot be Permit2. - function testFuzz_allowance_succeeds(address _randomCaller, address _owner, address _guy, uint256 _amount) public { + function testFuzz_allowance_succeeds( + address _randomCaller, + address _owner, + address _guy, + uint256 _amount + ) + public + { // Assume vm.assume(_guy != Preinstalls.Permit2); diff --git a/packages/contracts-bedrock/test/L2/RevenueSharingIntegration.t.sol b/packages/contracts-bedrock/test/L2/RevenueSharingIntegration.t.sol index c8ec809265a..72c91102c50 100644 --- a/packages/contracts-bedrock/test/L2/RevenueSharingIntegration.t.sol +++ b/packages/contracts-bedrock/test/L2/RevenueSharingIntegration.t.sol @@ -31,7 +31,14 @@ contract RevenueSharingIntegration_Test is CommonTest { } /// @notice Helper to fund vaults - function _fundVaults(uint256 _sequencerFees, uint256 _baseFees, uint256 _l1Fees, uint256 _operatorFees) private { + function _fundVaults( + uint256 _sequencerFees, + uint256 _baseFees, + uint256 _l1Fees, + uint256 _operatorFees + ) + private + { vm.deal(address(sequencerFeeVault), _sequencerFees); vm.deal(address(baseFeeVault), _baseFees); vm.deal(address(l1FeeVault), _l1Fees); @@ -248,8 +255,9 @@ contract RevenueSharingIntegration_Test is CommonTest { { // Get share info from calculator first - ISharesCalculator.ShareInfo[] memory shareInfo = - superchainRevSharesCalculator.getRecipientsAndAmounts(_sequencerFees, _baseFees, _operatorFees, _l1Fees); + ISharesCalculator.ShareInfo[] memory shareInfo = superchainRevSharesCalculator.getRecipientsAndAmounts( + _sequencerFees, _baseFees, _operatorFees, _l1Fees + ); // Calculate expected values uint256 grossRevenue = _sequencerFees + _baseFees + _operatorFees + _l1Fees; diff --git a/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol b/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol index 7835c11542b..3d05367c9f6 100644 --- a/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol +++ b/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol @@ -39,7 +39,13 @@ abstract contract SuperchainERC20_TestInit is Test { /// @notice Tests the `crosschainMint` function of the `SuperchainERC20` contract. contract SuperchainERC20_CrosschainMint_Test is SuperchainERC20_TestInit { /// @notice Tests the `crosschainMint` function reverts when the caller is not the bridge. - function testFuzz_crosschainMint_callerNotBridge_reverts(address _caller, address _to, uint256 _amount) public { + function testFuzz_crosschainMint_callerNotBridge_reverts( + address _caller, + address _to, + uint256 _amount + ) + public + { // Ensure the caller is not the bridge vm.assume(_caller != SUPERCHAIN_TOKEN_BRIDGE); @@ -83,7 +89,13 @@ contract SuperchainERC20_CrosschainMint_Test is SuperchainERC20_TestInit { /// @notice Tests the `crosschainBurn` function of the `SuperchainERC20` contract. contract SuperchainERC20_CrosschainBurn_Test is SuperchainERC20_TestInit { /// @notice Tests the `crosschainBurn` function reverts when the caller is not the bridge. - function testFuzz_crosschainBurn_callerNotBridge_reverts(address _caller, address _from, uint256 _amount) public { + function testFuzz_crosschainBurn_callerNotBridge_reverts( + address _caller, + address _from, + uint256 _amount + ) + public + { // Ensure the caller is not the bridge vm.assume(_caller != SUPERCHAIN_TOKEN_BRIDGE); diff --git a/packages/contracts-bedrock/test/L2/SuperchainTokenBridge.t.sol b/packages/contracts-bedrock/test/L2/SuperchainTokenBridge.t.sol index daf0f1546ee..f9241ef934a 100644 --- a/packages/contracts-bedrock/test/L2/SuperchainTokenBridge.t.sol +++ b/packages/contracts-bedrock/test/L2/SuperchainTokenBridge.t.sol @@ -60,7 +60,13 @@ abstract contract SuperchainTokenBridge_TestInit is Test { /// @notice Tests the `sendERC20` function of the `SuperchainTokenBridge` contract. contract SuperchainTokenBridge_SendERC20_Test is SuperchainTokenBridge_TestInit { /// @notice Tests the `sendERC20` function reverts when the address `_to` is zero. - function testFuzz_sendERC20_zeroAddressTo_reverts(address _sender, uint256 _amount, uint256 _chainId) public { + function testFuzz_sendERC20_zeroAddressTo_reverts( + address _sender, + uint256 _amount, + uint256 _chainId + ) + public + { // Expect the revert with `ZeroAddress` selector vm.expectRevert(ISuperchainTokenBridge.ZeroAddress.selector); diff --git a/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol b/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol index b2e7a1d64d1..facbe292b51 100644 --- a/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol +++ b/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol @@ -402,9 +402,7 @@ contract HonestDisputeActor is DisputeActor { challengeIndex := mload(add(moveData, 0x24)) } GAME.addLocalData({ - _ident: LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, - _execLeafIdx: challengeIndex, - _partOffset: 0 + _ident: LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, _execLeafIdx: challengeIndex, _partOffset: 0 }); } diff --git a/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol b/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol index ce423dae10d..ce1f5e0d722 100644 --- a/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol +++ b/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol @@ -95,9 +95,7 @@ abstract contract PreimageOracle_TestInit is Test { LibKeccak.permutation(_stateMatrix); leaves_[i] = IPreimageOracle.Leaf({ - input: blockSlice, - index: uint32(i), - stateCommitment: keccak256(abi.encode(_stateMatrix)) + input: blockSlice, index: uint32(i), stateCommitment: keccak256(abi.encode(_stateMatrix)) }); } } @@ -923,7 +921,12 @@ contract PreimageOracle_ChallengeLPP_Test is PreimageOracle_TestInit { /// @notice Tests that challenging the first divergence in a large preimage proposal at an /// arbitrary location in the leaf values always succeeds. - function testFuzz_challengeLPP_arbitraryLocation_succeeds(uint256 _lastCorrectLeafIdx, uint256 _numBlocks) public { + function testFuzz_challengeLPP_arbitraryLocation_succeeds( + uint256 _lastCorrectLeafIdx, + uint256 _numBlocks + ) + public + { _numBlocks = bound(_numBlocks, 1, 2 ** 8); _lastCorrectLeafIdx = bound(_lastCorrectLeafIdx, 0, _numBlocks - 1); @@ -1005,10 +1008,7 @@ contract PreimageOracle_ChallengeFirstLPP_Test is PreimageOracle_TestInit { vm.expectRevert(PostStateMatches.selector); oracle.challengeFirstLPP({ - _claimant: address(this), - _uuid: TEST_UUID, - _postState: leaves[0], - _postStateProof: p + _claimant: address(this), _uuid: TEST_UUID, _postState: leaves[0], _postStateProof: p }); LPPMetaData metaData = oracle.proposalMetadata(address(this), TEST_UUID); @@ -1049,10 +1049,7 @@ contract PreimageOracle_ChallengeFirstLPP_Test is PreimageOracle_TestInit { // Should succeed since the commitment was wrong. vm.expectRevert(StatesNotContiguous.selector); oracle.challengeFirstLPP({ - _claimant: address(this), - _uuid: TEST_UUID, - _postState: leaves[1], - _postStateProof: p + _claimant: address(this), _uuid: TEST_UUID, _postState: leaves[1], _postStateProof: p }); } @@ -1089,10 +1086,7 @@ contract PreimageOracle_ChallengeFirstLPP_Test is PreimageOracle_TestInit { // Should succeed since the commitment was wrong. uint256 balanceBefore = address(this).balance; oracle.challengeFirstLPP({ - _claimant: address(this), - _uuid: TEST_UUID, - _postState: leaves[0], - _postStateProof: p + _claimant: address(this), _uuid: TEST_UUID, _postState: leaves[0], _postStateProof: p }); assertEq(address(this).balance, balanceBefore + oracle.MIN_BOND_SIZE()); assertEq(oracle.proposalBonds(address(this), TEST_UUID), 0); @@ -1132,10 +1126,7 @@ contract PreimageOracle_ChallengeFirstLPP_Test is PreimageOracle_TestInit { assertEq(rootA, canonicalRoot); oracle.challengeFirstLPP({ - _claimant: address(this), - _uuid: TEST_UUID, - _postState: leaves[0], - _postStateProof: postProof + _claimant: address(this), _uuid: TEST_UUID, _postState: leaves[0], _postStateProof: postProof }); LPPMetaData metaData = oracle.proposalMetadata(address(this), TEST_UUID); @@ -1237,10 +1228,7 @@ contract PreimageOracle_SqueezeLPP_Test is PreimageOracle_TestInit { // Should succeed since the commitment was wrong. oracle.challengeFirstLPP({ - _claimant: address(this), - _uuid: TEST_UUID, - _postState: leaves[0], - _postStateProof: preProof + _claimant: address(this), _uuid: TEST_UUID, _postState: leaves[0], _postStateProof: preProof }); LPPMetaData metaData = oracle.proposalMetadata(address(this), TEST_UUID); diff --git a/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol b/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol index 2af2302d2b5..fa7d2f7c07e 100644 --- a/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol +++ b/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol @@ -151,8 +151,7 @@ contract AnchorStateRegistry_Initialize_Test is AnchorStateRegistry_TestInit { systemConfig, disputeGameFactory, Proposal({ - root: Hash.wrap(0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF), - l2SequenceNumber: 0 + root: Hash.wrap(0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF), l2SequenceNumber: 0 }), GameType.wrap(0) ); @@ -181,8 +180,7 @@ contract AnchorStateRegistry_Initialize_Test is AnchorStateRegistry_TestInit { systemConfig, disputeGameFactory, Proposal({ - root: Hash.wrap(0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF), - l2SequenceNumber: 0 + root: Hash.wrap(0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF), l2SequenceNumber: 0 }), GameType.wrap(0) ); diff --git a/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol b/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol index 7400646b89e..c1b06dd4fea 100644 --- a/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol +++ b/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol @@ -117,7 +117,14 @@ abstract contract DisputeGameFactory_TestInit is CommonTest { _setGame(_gameImpl, _gameType, true, _implArgs); } - function _setGame(address _gameImpl, GameType _gameType, bool _hasImplArgs, bytes memory _implArgs) internal { + function _setGame( + address _gameImpl, + GameType _gameType, + bool _hasImplArgs, + bytes memory _implArgs + ) + internal + { vm.startPrank(disputeGameFactory.owner()); if (_hasImplArgs) { disputeGameFactory.setImplementation(_gameType, IDisputeGame(_gameImpl), _implArgs); @@ -494,7 +501,13 @@ contract DisputeGameFactory_Create_Test is DisputeGameFactory_TestInit { /// @notice Tests that the `create` function reverts when there exists a dispute game with the /// same UUID. - function testFuzz_create_sameUUID_reverts(uint32 gameType, Claim rootClaim, bytes calldata extraData) public { + function testFuzz_create_sameUUID_reverts( + uint32 gameType, + Claim rootClaim, + bytes calldata extraData + ) + public + { // Ensure that the `gameType` is within the bounds of the `GameType` enum's possible // values. uint32 maxGameType = 8; @@ -674,7 +687,14 @@ contract DisputeGameFactory_SetInitBond_Test is DisputeGameFactory_TestInit { contract DisputeGameFactory_GetGameUUID_Test is DisputeGameFactory_TestInit { /// @notice Tests that the `getGameUUID` function returns the correct hash when comparing /// against the keccak256 hash of the abi-encoded parameters. - function testDiff_getGameUUID_succeeds(uint32 gameType, Claim rootClaim, bytes calldata extraData) public view { + function testDiff_getGameUUID_succeeds( + uint32 gameType, + Claim rootClaim, + bytes calldata extraData + ) + public + view + { // Ensure that the `gameType` is within the bounds of the `GameType` enum's possible // values. GameType gt = GameType.wrap(uint8(bound(gameType, 0, 2))); diff --git a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol index 4966667c7c8..34975e53307 100644 --- a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol @@ -248,14 +248,12 @@ contract FaultDisputeGame_Constructor_Test is FaultDisputeGame_TestInit { _args: DeployUtils.encodeConstructor( abi.encodeCall( IFaultDisputeGame.__constructor__, - ( - IFaultDisputeGame.GameConstructorParams({ + (IFaultDisputeGame.GameConstructorParams({ maxGameDepth: _maxGameDepth, splitDepth: _maxGameDepth + 1, clockExtension: Duration.wrap(3 hours), maxClockDuration: Duration.wrap(3.5 days) - }) - ) + })) ) ) }); @@ -272,14 +270,12 @@ contract FaultDisputeGame_Constructor_Test is FaultDisputeGame_TestInit { _args: DeployUtils.encodeConstructor( abi.encodeCall( IFaultDisputeGame.__constructor__, - ( - IFaultDisputeGame.GameConstructorParams({ + (IFaultDisputeGame.GameConstructorParams({ maxGameDepth: maxGameDepth, splitDepth: _splitDepth, clockExtension: Duration.wrap(3 hours), maxClockDuration: Duration.wrap(3.5 days) - }) - ) + })) ) ) }); @@ -296,14 +292,12 @@ contract FaultDisputeGame_Constructor_Test is FaultDisputeGame_TestInit { _args: DeployUtils.encodeConstructor( abi.encodeCall( IFaultDisputeGame.__constructor__, - ( - IFaultDisputeGame.GameConstructorParams({ + (IFaultDisputeGame.GameConstructorParams({ maxGameDepth: 2 ** 3, splitDepth: _splitDepth, clockExtension: Duration.wrap(3 hours), maxClockDuration: Duration.wrap(3.5 days) - }) - ) + })) ) ) }); @@ -328,14 +322,12 @@ contract FaultDisputeGame_Constructor_Test is FaultDisputeGame_TestInit { _args: DeployUtils.encodeConstructor( abi.encodeCall( IFaultDisputeGame.__constructor__, - ( - IFaultDisputeGame.GameConstructorParams({ + (IFaultDisputeGame.GameConstructorParams({ maxGameDepth: 16, splitDepth: 8, clockExtension: Duration.wrap(_clockExtension), maxClockDuration: Duration.wrap(_maxClockDuration) - }) - ) + })) ) ) }); @@ -377,13 +369,11 @@ contract FaultDisputeGame_Initialize_Test is FaultDisputeGame_TestInit { assertEq(address(gameProxy).balance, 0); gameProxy = IFaultDisputeGame( - payable( - address( + payable(address( disputeGameFactory.create{ value: _value }( GAME_TYPE, arbitaryRootClaim, abi.encode(validL2BlockNumber) ) - ) - ) + )) ); assertEq(address(gameProxy).balance, 0); assertEq(delayedWeth.balanceOf(address(gameProxy)), _value); @@ -437,9 +427,9 @@ contract FaultDisputeGame_Initialize_Test is FaultDisputeGame_TestInit { Claim claim = _dummyClaim(); vm.expectRevert(IFaultDisputeGame.BadExtraData.selector); gameProxy = IFaultDisputeGame( - payable( - address(disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber))) - ) + payable(address( + disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber)) + )) ); } @@ -459,9 +449,9 @@ contract FaultDisputeGame_Initialize_Test is FaultDisputeGame_TestInit { Claim claim = _dummyClaim(); vm.expectRevert(IFaultDisputeGame.BadExtraData.selector); gameProxy = IFaultDisputeGame( - payable( - address(disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber))) - ) + payable(address( + disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber)) + )) ); } @@ -504,9 +494,9 @@ contract FaultDisputeGame_Initialize_Test is FaultDisputeGame_TestInit { // Creation should fail. vm.expectRevert(AnchorRootNotFound.selector); gameProxy = IFaultDisputeGame( - payable( - address(disputeGameFactory.create{ value: initBond }(GAME_TYPE, _dummyClaim(), new bytes(uint256(32)))) - ) + payable(address( + disputeGameFactory.create{ value: initBond }(GAME_TYPE, _dummyClaim(), new bytes(uint256(32))) + )) ); } @@ -535,13 +525,11 @@ contract FaultDisputeGame_Initialize_Test is FaultDisputeGame_TestInit { // Create game via factory - initialize() is called automatically and should revert gameProxy = IFaultDisputeGame( - payable( - address( + payable(address( disputeGameFactory.create{ value: initBond }( GAME_TYPE, _dummyClaim(), abi.encode(validL2BlockNumber) ) - ) - ) + )) ); } } diff --git a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol index c6e1640cbb3..790e0618c68 100644 --- a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol @@ -302,9 +302,9 @@ contract PermissionedDisputeGame_Initialize_Test is PermissionedDisputeGame_Test vm.prank(PROPOSER, PROPOSER); vm.expectRevert(IFaultDisputeGame.BadExtraData.selector); gameProxy = IPermissionedDisputeGame( - payable( - address(disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber))) - ) + payable(address( + disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber)) + )) ); } @@ -325,9 +325,9 @@ contract PermissionedDisputeGame_Initialize_Test is PermissionedDisputeGame_Test vm.prank(PROPOSER, PROPOSER); vm.expectRevert(IFaultDisputeGame.BadExtraData.selector); gameProxy = IPermissionedDisputeGame( - payable( - address(disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber))) - ) + payable(address( + disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber)) + )) ); } } diff --git a/packages/contracts-bedrock/test/dispute/SuperFaultDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/SuperFaultDisputeGame.t.sol index a25ae92bf9b..b3ac4c4742a 100644 --- a/packages/contracts-bedrock/test/dispute/SuperFaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/SuperFaultDisputeGame.t.sol @@ -222,11 +222,7 @@ abstract contract SuperFaultDisputeGame_TestInit is BaseSuperFaultDisputeGame_Te } /// @notice Helper to return a pseudo-random super root proof with the specified l2SequenceNumber - function _dummySuper(uint64 _l2SequenceNumber) - internal - view - returns (Types.SuperRootProof memory superRootProof_) - { + function _dummySuper(uint64 _l2SequenceNumber) internal view returns (Types.SuperRootProof memory superRootProof_) { Types.OutputRootWithChainId[] memory outputRoots = new Types.OutputRootWithChainId[](1); outputRoots[0] = Types.OutputRootWithChainId({ chainId: 5, root: keccak256(abi.encode(gasleft())) }); superRootProof_.version = bytes1(uint8(1)); @@ -296,14 +292,12 @@ contract SuperFaultDisputeGame_Constructor_Test is SuperFaultDisputeGame_TestIni _args: DeployUtils.encodeConstructor( abi.encodeCall( ISuperFaultDisputeGame.__constructor__, - ( - ISuperFaultDisputeGame.GameConstructorParams({ + (ISuperFaultDisputeGame.GameConstructorParams({ maxGameDepth: _maxGameDepth, splitDepth: _maxGameDepth + 1, clockExtension: Duration.wrap(3 hours), maxClockDuration: Duration.wrap(3.5 days) - }) - ) + })) ) ) }); @@ -320,14 +314,12 @@ contract SuperFaultDisputeGame_Constructor_Test is SuperFaultDisputeGame_TestIni _args: DeployUtils.encodeConstructor( abi.encodeCall( ISuperFaultDisputeGame.__constructor__, - ( - ISuperFaultDisputeGame.GameConstructorParams({ + (ISuperFaultDisputeGame.GameConstructorParams({ maxGameDepth: maxGameDepth, splitDepth: _splitDepth, clockExtension: Duration.wrap(3 hours), maxClockDuration: Duration.wrap(3.5 days) - }) - ) + })) ) ) }); @@ -344,14 +336,12 @@ contract SuperFaultDisputeGame_Constructor_Test is SuperFaultDisputeGame_TestIni _args: DeployUtils.encodeConstructor( abi.encodeCall( ISuperFaultDisputeGame.__constructor__, - ( - ISuperFaultDisputeGame.GameConstructorParams({ + (ISuperFaultDisputeGame.GameConstructorParams({ maxGameDepth: 2 ** 3, splitDepth: _splitDepth, clockExtension: Duration.wrap(3 hours), maxClockDuration: Duration.wrap(3.5 days) - }) - ) + })) ) ) }); @@ -376,14 +366,12 @@ contract SuperFaultDisputeGame_Constructor_Test is SuperFaultDisputeGame_TestIni _args: DeployUtils.encodeConstructor( abi.encodeCall( ISuperFaultDisputeGame.__constructor__, - ( - ISuperFaultDisputeGame.GameConstructorParams({ + (ISuperFaultDisputeGame.GameConstructorParams({ maxGameDepth: 16, splitDepth: 8, clockExtension: Duration.wrap(_clockExtension), maxClockDuration: Duration.wrap(_maxClockDuration) - }) - ) + })) ) ) }); diff --git a/packages/contracts-bedrock/test/dispute/SuperPermissionedDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/SuperPermissionedDisputeGame.t.sol index f3b216e8245..1048ee158c8 100644 --- a/packages/contracts-bedrock/test/dispute/SuperPermissionedDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/SuperPermissionedDisputeGame.t.sol @@ -366,9 +366,9 @@ contract SuperPermissionedDisputeGame_Initialize_Test is SuperPermissionedDisput vm.prank(PROPOSER, PROPOSER); vm.expectRevert(ISuperFaultDisputeGame.BadExtraData.selector); gameProxy = ISuperPermissionedDisputeGame( - payable( - address(disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber))) - ) + payable(address( + disputeGameFactory.create{ value: initBond }(GAME_TYPE, claim, abi.encode(validL2BlockNumber)) + )) ); } } diff --git a/packages/contracts-bedrock/test/dispute/lib/LibGameArgs.t.sol b/packages/contracts-bedrock/test/dispute/lib/LibGameArgs.t.sol index 1eee52105da..8c37fa8a31c 100644 --- a/packages/contracts-bedrock/test/dispute/lib/LibGameArgs.t.sol +++ b/packages/contracts-bedrock/test/dispute/lib/LibGameArgs.t.sol @@ -151,9 +151,8 @@ contract LibGameArgs_Decode_Test is Test { } function testFuzz_decode_invalidLength_reverts(bytes memory _buf) public { - bool ok = ( - _buf.length == LibGameArgs.PERMISSIONLESS_ARGS_LENGTH || _buf.length == LibGameArgs.PERMISSIONED_ARGS_LENGTH - ); + bool ok = (_buf.length == LibGameArgs.PERMISSIONLESS_ARGS_LENGTH + || _buf.length == LibGameArgs.PERMISSIONED_ARGS_LENGTH); vm.assume(!ok); vm.expectRevert(InvalidGameArgsLength.selector); harness.decode(_buf); diff --git a/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol b/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol index d38223ff0d0..61f64e67d9d 100644 --- a/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol +++ b/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol @@ -161,7 +161,13 @@ contract LibPosition_TraceAncestor_Test is LibPosition_TestInit { contract LibPosition_TraceAncestorBounded_Test is LibPosition_TestInit { /// @notice Tests that the `traceAncestorBounded` function correctly computes the position of /// the highest ancestor (below `SPLIT_DEPTH`) that commits to the same trace index. - function testFuzz_traceAncestorBounded_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure { + function testFuzz_traceAncestorBounded_correctness_succeeds( + uint8 _depth, + uint128 _indexAtDepth + ) + public + pure + { _depth = uint8(bound(_depth, SPLIT_DEPTH + 1, MAX_DEPTH)); _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth); diff --git a/packages/contracts-bedrock/test/dispute/zk/OptimisticZkGame.t.sol b/packages/contracts-bedrock/test/dispute/zk/OptimisticZkGame.t.sol index c3df8a1838d..913100aacfd 100644 --- a/packages/contracts-bedrock/test/dispute/zk/OptimisticZkGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/zk/OptimisticZkGame.t.sol @@ -484,7 +484,7 @@ contract OptimisticZkGame_Resolve_Test is OptimisticZkGame_TestInit { // The proposer loses their 1 ether stake. assertEq(proposer.balance, 1 ether); // started with 2, lost 1. - // The contract balance is zero. + // The contract balance is zero. assertEq(address(game).balance, 0); } diff --git a/packages/contracts-bedrock/test/governance/MintManager.t.sol b/packages/contracts-bedrock/test/governance/MintManager.t.sol index 62c0de45da2..d04394d5b52 100644 --- a/packages/contracts-bedrock/test/governance/MintManager.t.sol +++ b/packages/contracts-bedrock/test/governance/MintManager.t.sol @@ -33,7 +33,9 @@ abstract contract MintManager_TestInit is CommonTest { manager = IMintManager( DeployUtils.create1({ _name: "MintManager", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMintManager.__constructor__, (owner, address(gov)))) + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMintManager.__constructor__, (owner, address(gov))) + ) }) ); diff --git a/packages/contracts-bedrock/test/integration/EventLogger.t.sol b/packages/contracts-bedrock/test/integration/EventLogger.t.sol index 46265da67b6..715aeb4bdec 100644 --- a/packages/contracts-bedrock/test/integration/EventLogger.t.sol +++ b/packages/contracts-bedrock/test/integration/EventLogger.t.sol @@ -112,18 +112,10 @@ contract EventLogger_ValidateMessage_Test is EventLogger_TestInit { external { IfaceIdentifier memory idIface = IfaceIdentifier({ - origin: _origin, - blockNumber: _blockNumber, - logIndex: _logIndex, - timestamp: _timestamp, - chainId: _chainId + origin: _origin, blockNumber: _blockNumber, logIndex: _logIndex, timestamp: _timestamp, chainId: _chainId }); ImplIdentifier memory idImpl = ImplIdentifier({ - origin: _origin, - blockNumber: _blockNumber, - logIndex: _logIndex, - timestamp: _timestamp, - chainId: _chainId + origin: _origin, blockNumber: _blockNumber, logIndex: _logIndex, timestamp: _timestamp, chainId: _chainId }); address emitter = Predeploys.CROSS_L2_INBOX; diff --git a/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol index 4cc80787cbc..3c794f896b1 100644 --- a/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol @@ -79,7 +79,8 @@ contract RelayActor is StdUtils { } try xdm.relayMessage{ gas: gas, value: _value }( Encoding.encodeVersionedNonce(0, _version), sender, target, _value, minGasLimit, _message - ) { } catch { + ) { } + catch { // If any of these calls revert, set `reverted` to true to fail the invariant test. // NOTE: This is to get around forge's invariant fuzzer ignoring reverted calls // to this function. diff --git a/packages/contracts-bedrock/test/invariants/FeeSplit.t.sol b/packages/contracts-bedrock/test/invariants/FeeSplit.t.sol index f8d36eb6b19..e69c195eb82 100644 --- a/packages/contracts-bedrock/test/invariants/FeeSplit.t.sol +++ b/packages/contracts-bedrock/test/invariants/FeeSplit.t.sol @@ -80,9 +80,10 @@ contract FeeSplitter_Disburser is StdUtils { delete failureState; // Check if the l1withdrawer should have been triggered and empty its balance - uint256 _amountToL1Withdrawer = feeSplitter.sharesCalculator().getRecipientsAndAmounts( - _sequencerFees, _baseFees, _operatorFees, _l1Fees - )[0].amount; + uint256 _amountToL1Withdrawer = + feeSplitter.sharesCalculator() + .getRecipientsAndAmounts(_sequencerFees, _baseFees, _operatorFees, _l1Fees)[0] + .amount; if ( _l1withdrawerBalanceBeforeDisbursement + _amountToL1Withdrawer @@ -277,23 +278,25 @@ contract FeeSplitter_Invariant is CommonTest { + _failureState.l1FeeVaultBalance + _failureState.operatorFeeVaultBalance; // either one of the vaults is below the minimum withdrawal amount - bool _vaultBelowMinimum = ( - _failureState.sequencerFeeVaultBalance < _failureState.sequencerFeeVaultMinWithdrawalAmount - || _failureState.baseFeeVaultBalance < _failureState.baseFeeVaultMinWithdrawalAmount - || _failureState.l1FeeVaultBalance < _failureState.l1FeeVaultMinWithdrawalAmount - || _failureState.operatorFeeVaultBalance < _failureState.operatorFeeVaultMinWithdrawalAmount - ) - && keccak256(_failureState.reason) - == keccak256( - abi.encodeWithSignature( - "Error(string)", "FeeVault: withdrawal amount must be greater than minimum withdrawal amount" - ) - ); + bool _vaultBelowMinimum = + (_failureState.sequencerFeeVaultBalance < _failureState.sequencerFeeVaultMinWithdrawalAmount + || _failureState.baseFeeVaultBalance < _failureState.baseFeeVaultMinWithdrawalAmount + || _failureState.l1FeeVaultBalance < _failureState.l1FeeVaultMinWithdrawalAmount + || _failureState.operatorFeeVaultBalance < _failureState.operatorFeeVaultMinWithdrawalAmount) + && keccak256(_failureState.reason) + == keccak256( + abi.encodeWithSignature( + "Error(string)", + "FeeVault: withdrawal amount must be greater than minimum withdrawal amount" + ) + ); // not enough time since last disbursement - bool _tooEarly = _failureState.attemptTimestamp - < disburser.feeSplitter().lastDisbursementTime() + disburser.feeSplitter().feeDisbursementInterval() - && bytes4(_failureState.reason) == IFeeSplitter.FeeSplitter_DisbursementIntervalNotReached.selector; + bool _tooEarly = + _failureState.attemptTimestamp + < disburser.feeSplitter().lastDisbursementTime() + + disburser.feeSplitter().feeDisbursementInterval() + && bytes4(_failureState.reason) == IFeeSplitter.FeeSplitter_DisbursementIntervalNotReached.selector; // no revenue at all bool _noRevenue = @@ -301,7 +304,8 @@ contract FeeSplitter_Invariant is CommonTest { // rounding down error in the shares calculator bool _noSharesCalculator = (_grossRevenue * 250) < 10000 - && bytes4(_failureState.reason) == ISuperchainRevSharesCalculator.SharesCalculator_ZeroGrossShare.selector; + && bytes4(_failureState.reason) + == ISuperchainRevSharesCalculator.SharesCalculator_ZeroGrossShare.selector; assertTrue(_vaultBelowMinimum || _tooEarly || _noRevenue || _noSharesCalculator); } diff --git a/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol b/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol index 297f9a0e47a..c8d0c929a5c 100644 --- a/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol +++ b/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol @@ -81,8 +81,9 @@ contract OptimismPortal2_Depositor is StdUtils, ResourceMetering { ); try portal.depositTransaction{ value: value }(_to, value, gasLimit, _isCreation, _data) { - // Do nothing; Call succeeded - } catch { + // Do nothing; Call succeeded + } + catch { failedToComplete = true; } } @@ -105,12 +106,7 @@ contract OptimismPortal2_Invariant_Harness is DisputeGameFactory_TestInit { super.setUp(); _defaultTx = Types.WithdrawalTransaction({ - nonce: 0, - sender: alice, - target: bob, - value: 100, - gasLimit: 100_000, - data: hex"" + nonce: 0, sender: alice, target: bob, value: 100, gasLimit: 100_000, data: hex"" }); // If custom gas token is enabled, set deposit value to 0 @@ -138,13 +134,13 @@ contract OptimismPortal2_Invariant_Harness is DisputeGameFactory_TestInit { // Create a dispute game with the output root we've proposed. _proposedBlockNumber = 0xFF; IFaultDisputeGame game = IFaultDisputeGame( - payable( - address( - disputeGameFactory.create{ value: disputeGameFactory.initBonds(optimismPortal2.respectedGameType()) }( + payable(address( + disputeGameFactory.create{ + value: disputeGameFactory.initBonds(optimismPortal2.respectedGameType()) + }( optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber) ) - ) - ) + )) ); _proposedGameIndex = disputeGameFactory.gameCount() - 1; diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol index aa3eaaa9313..045a05c1419 100644 --- a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol @@ -56,9 +56,8 @@ contract ProtocolUnguided is ProtocolHandler, CompatibleAssert { { vm.prank(sender); // revert is possible in bound, but is not part of the external call - try OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).initialize( - remoteToken, name, symbol, decimals - ) { + try OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]) + .initialize(remoteToken, name, symbol, decimals) { compatibleAssert(false); } catch { } } diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol index 490a38bec1c..c728d2563ae 100644 --- a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol @@ -97,9 +97,8 @@ contract ProtocolHandler is TestBase, StdUtils, Actors { withActor(msg.sender) { vm.prank(currentActor()); - OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).transfer( - getActorByRawIndex(toIndex), amount - ); + OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]) + .transfer(getActorByRawIndex(toIndex), amount); } function handler_supERC20TransferFrom( @@ -112,9 +111,8 @@ contract ProtocolHandler is TestBase, StdUtils, Actors { withActor(msg.sender) { vm.prank(currentActor()); - OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).transferFrom( - getActorByRawIndex(fromIndex), getActorByRawIndex(toIndex), amount - ); + OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]) + .transferFrom(getActorByRawIndex(fromIndex), getActorByRawIndex(toIndex), amount); } function handler_supERC20Approve( @@ -126,9 +124,8 @@ contract ProtocolHandler is TestBase, StdUtils, Actors { withActor(msg.sender) { vm.prank(currentActor()); - OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).approve( - getActorByRawIndex(spenderIndex), amount - ); + OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]) + .approve(getActorByRawIndex(spenderIndex), amount); } /// @notice deploy a remote token, that supertokens will be a representation of. They are never called, so there diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol index 94f275e2655..64488751b03 100644 --- a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol @@ -86,7 +86,14 @@ contract MockL2ToL2CrossDomainMessenger { /// @notice recipient will not be used since in normal execution it's the same /// address on a different chain, but here we have to compute it to mock /// cross-chain messaging - function sendMessage(uint256 chainId, address, /*recipient*/ bytes calldata data) external { + function sendMessage( + uint256 chainId, + address, + /*recipient*/ + bytes calldata data + ) + external + { address crossChainRecipient = superTokenAddresses[chainId][superTokenInitDeploySalts[msg.sender]]; if (crossChainRecipient == msg.sender) { require(false, "MockL2ToL2CrossDomainMessenger: same chain"); diff --git a/packages/contracts-bedrock/test/libraries/Blueprint.t.sol b/packages/contracts-bedrock/test/libraries/Blueprint.t.sol index ae03959dcb3..ff3b4b70487 100644 --- a/packages/contracts-bedrock/test/libraries/Blueprint.t.sol +++ b/packages/contracts-bedrock/test/libraries/Blueprint.t.sol @@ -172,7 +172,13 @@ contract Blueprint_DeployFrom_Test is Blueprint_TestInit { /// @dev Here we deploy a simple mock contract to test that constructor args are appended /// properly. - function testFuzz_deployFrom_withConstructorArgs_succeeds(uint256 _x, bytes memory _y, bytes32 _salt) public { + function testFuzz_deployFrom_withConstructorArgs_succeeds( + uint256 _x, + bytes memory _y, + bytes32 _salt + ) + public + { bytes memory blueprintInitcode = blueprint.blueprintDeployerBytecode(type(ConstructorArgMock).creationCode); // Deploy the blueprint. diff --git a/packages/contracts-bedrock/test/libraries/Bytes.t.sol b/packages/contracts-bedrock/test/libraries/Bytes.t.sol index 3cd5b0e3551..4948acc1428 100644 --- a/packages/contracts-bedrock/test/libraries/Bytes.t.sol +++ b/packages/contracts-bedrock/test/libraries/Bytes.t.sol @@ -8,7 +8,15 @@ import { Test } from "test/setup/Test.sol"; import { Bytes } from "src/libraries/Bytes.sol"; contract Bytes_Harness { - function exposed_slice(bytes memory _input, uint256 _start, uint256 _length) public pure returns (bytes memory) { + function exposed_slice( + bytes memory _input, + uint256 _start, + uint256 _length + ) + public + pure + returns (bytes memory) + { return Bytes.slice(_input, _start, _length); } } @@ -25,14 +33,13 @@ abstract contract Bytes_TestInit is Test { function manualEq(bytes memory _a, bytes memory _b) internal pure returns (bool) { bool _eq; assembly { - _eq := - and( - // Check if the contents of the two bytes arrays are equal in memory. - eq(keccak256(add(0x20, _a), mload(_a)), keccak256(add(0x20, _b), mload(_b))), - // Check if the length of the two bytes arrays are equal in memory. - // This is redundant given the above check, but included for completeness. - eq(mload(_a), mload(_b)) - ) + _eq := and( + // Check if the contents of the two bytes arrays are equal in memory. + eq(keccak256(add(0x20, _a), mload(_a)), keccak256(add(0x20, _b), mload(_b))), + // Check if the length of the two bytes arrays are equal in memory. + // This is redundant given the above check, but included for completeness. + eq(mload(_a), mload(_b)) + ) } return _eq; } @@ -182,7 +189,13 @@ contract Bytes_Slice_Test is Bytes_TestInit { /// @notice Tests that, when given a length `n` that is greater than `type(uint256).max - 31`, /// the `slice` function reverts. - function testFuzz_slice_lengthOverflows_reverts(bytes memory _input, uint256 _start, uint256 _length) public { + function testFuzz_slice_lengthOverflows_reverts( + bytes memory _input, + uint256 _start, + uint256 _length + ) + public + { // Ensure that the `_length` will overflow if a number >= 31 is added to it. _length = uint256(bound(_length, type(uint256).max - 30, type(uint256).max)); @@ -193,7 +206,13 @@ contract Bytes_Slice_Test is Bytes_TestInit { /// @notice Tests that, when given a start index `n` that is greater than /// `type(uint256).max - n`, the `slice` function reverts. /// The calls to `bound` are to reduce the number of times that `assume` is triggered. - function testFuzz_slice_rangeOverflows_reverts(bytes memory _input, uint256 _start, uint256 _length) public { + function testFuzz_slice_rangeOverflows_reverts( + bytes memory _input, + uint256 _start, + uint256 _length + ) + public + { // Ensure that `_length` is a realistic length of a slice. This is to make sure we revert // on the correct require statement. _length = bound(_length, 0, _input.length == 0 ? 0 : _input.length - 1); diff --git a/packages/contracts-bedrock/test/libraries/DeployUtils.t.sol b/packages/contracts-bedrock/test/libraries/DeployUtils.t.sol index 4bee5fe1908..cdde885304e 100644 --- a/packages/contracts-bedrock/test/libraries/DeployUtils.t.sol +++ b/packages/contracts-bedrock/test/libraries/DeployUtils.t.sol @@ -41,7 +41,13 @@ contract DeployUtils_AssertUniqueAddresses_Test is DeployUtils_TestInit { /// @param _length The length of the array of addresses. /// @param _seed The seed for generating the addresses. - function testFuzz_assertUniqueAddresses_withUniqueAddresses_succeeds(uint8 _length, bytes32 _seed) public pure { + function testFuzz_assertUniqueAddresses_withUniqueAddresses_succeeds( + uint8 _length, + bytes32 _seed + ) + public + pure + { vm.assume(_length != 0); address[] memory addresses = new address[](_length); @@ -76,11 +82,12 @@ contract DeployUtils_AssertUniqueAddresses_Test is DeployUtils_TestInit { // Unfortunately it's not possible to use vm.expectRevert() here because the revert // message is not a calldata argument so we need to externalize the call - DeployUtils_AssertUniqueAddresses_Test(this).helper_assertUniqueAddresses_withDuplicateAddress_reverts( - string.concat( - "DeployUtils: check failed, duplicates at ", vm.toString(_duplicateIndex), ",", vm.toString(_length) - ), - addresses - ); + DeployUtils_AssertUniqueAddresses_Test(this) + .helper_assertUniqueAddresses_withDuplicateAddress_reverts( + string.concat( + "DeployUtils: check failed, duplicates at ", vm.toString(_duplicateIndex), ",", vm.toString(_length) + ), + addresses + ); } } diff --git a/packages/contracts-bedrock/test/libraries/DevFeatures.t.sol b/packages/contracts-bedrock/test/libraries/DevFeatures.t.sol index 31cf7d6a62a..e907f05c203 100644 --- a/packages/contracts-bedrock/test/libraries/DevFeatures.t.sol +++ b/packages/contracts-bedrock/test/libraries/DevFeatures.t.sol @@ -17,7 +17,8 @@ contract DevFeatures_isDevFeatureEnabled_Test is Test { bytes32 internal constant FEATURES_AB_INVERTED = ~FEATURES_AB; bytes32 internal constant EMPTY_FEATURES = bytes32(0x0000000000000000000000000000000000000000000000000000000000000000); - bytes32 internal constant ALL_FEATURES = bytes32(0x1111111111111111111111111111111111111111111111111111111111111111); + bytes32 internal constant ALL_FEATURES = + bytes32(0x1111111111111111111111111111111111111111111111111111111111111111); /// @notice Tests that a single feature matches itself exactly. function test_isDevFeatureEnabled_singleFeatureExactMatch_succeeds() public pure { @@ -108,7 +109,13 @@ contract DevFeatures_isDevFeatureEnabled_Test is Test { } /// @notice Fuzz test: feature is found when bitmap is a superset containing the feature. - function testFuzz_isDevFeatureEnabled_featureInSuperset_succeeds(bytes32 _bitmap, bytes32 _feature) public pure { + function testFuzz_isDevFeatureEnabled_featureInSuperset_succeeds( + bytes32 _bitmap, + bytes32 _feature + ) + public + pure + { vm.assume(_feature != bytes32(0)); bytes32 superset = _bitmap | _feature; assertTrue(DevFeatures.isDevFeatureEnabled(superset, _feature)); diff --git a/packages/contracts-bedrock/test/libraries/Encoding.t.sol b/packages/contracts-bedrock/test/libraries/Encoding.t.sol index 260844cefba..ef01a382839 100644 --- a/packages/contracts-bedrock/test/libraries/Encoding.t.sol +++ b/packages/contracts-bedrock/test/libraries/Encoding.t.sol @@ -139,7 +139,14 @@ contract Encoding_EncodeSuperRootProof_Test is Encoding_TestInit { /// @param _timestamp The timestamp of the super root proof /// @param _length The number of output roots in the super root proof /// @param _seed The seed used to generate the output roots - function testFuzz_encodeSuperRootProof_succeeds(uint64 _timestamp, uint256 _length, uint256 _seed) external pure { + function testFuzz_encodeSuperRootProof_succeeds( + uint64 _timestamp, + uint256 _length, + uint256 _seed + ) + external + pure + { // Ensure at least 1 element and cap at a reasonable maximum to avoid gas issues _length = uint256(bound(_length, 1, 50)); @@ -239,7 +246,13 @@ contract Encoding_EncodeSuperRootProof_Test is Encoding_TestInit { /// @param _timestamp The timestamp of the super root proof /// @param _length The number of output roots in the super root proof /// @param _seed The seed used to generate the output roots - function testDiff_encodeSuperRootProof_succeeds(uint64 _timestamp, uint256 _length, uint256 _seed) external { + function testDiff_encodeSuperRootProof_succeeds( + uint64 _timestamp, + uint256 _length, + uint256 _seed + ) + external + { // Ensure at least 1 element and cap at a reasonable maximum to avoid gas issues _length = uint256(bound(_length, 1, 50)); @@ -314,7 +327,14 @@ contract Encoding_DecodeSuperRootProof_Test is Encoding_TestInit { /// @param _timestamp The timestamp of the super root proof /// @param _length The number of output roots in the super root proof /// @param _seed The seed used to generate the output roots - function testFuzz_decodeSuperRootProof_succeeds(uint64 _timestamp, uint256 _length, uint256 _seed) external pure { + function testFuzz_decodeSuperRootProof_succeeds( + uint64 _timestamp, + uint256 _length, + uint256 _seed + ) + external + pure + { // Ensure at least 1 element and cap at a reasonable maximum to avoid gas issues _length = uint256(bound(_length, 1, 50)); @@ -473,7 +493,7 @@ contract Encoding_DecodeSuperRootProof_Test is Encoding_TestInit { // Add a dummy output root (chainId = 1, root = bytes32(uint256(1))) // ChainId (32 bytes starting at byte 9) encoded[40] = bytes1(uint8(1)); // Last byte of chainId at offset 9+31=40 - // Root (32 bytes starting at byte 41) + // Root (32 bytes starting at byte 41) encoded[72] = bytes1(uint8(1)); // Last byte of root at offset 41+31=72 // Expect revert when decoding @@ -537,7 +557,12 @@ contract Encoding_DecodeSuperRootProof_Test is Encoding_TestInit { } /// @notice Tests that decoding fails when output roots array is incomplete - function testFuzz_decodeSuperRootProof_partialOutputRoots_reverts(uint64 _timestamp, uint256 _length) external { + function testFuzz_decodeSuperRootProof_partialOutputRoots_reverts( + uint64 _timestamp, + uint256 _length + ) + external + { _length = uint256(bound(_length, 10, 72)); // Manually construct encoded bytes with no output roots diff --git a/packages/contracts-bedrock/test/libraries/Hashing.t.sol b/packages/contracts-bedrock/test/libraries/Hashing.t.sol index b9a4ed74566..18a06ce42a4 100644 --- a/packages/contracts-bedrock/test/libraries/Hashing.t.sol +++ b/packages/contracts-bedrock/test/libraries/Hashing.t.sol @@ -261,8 +261,7 @@ contract Hashing_hashSuperRootProof_Test is CommonTest { if (_proof.outputRoots.length == 0) { _proof.outputRoots = new Types.OutputRootWithChainId[](1); _proof.outputRoots[0] = Types.OutputRootWithChainId({ - chainId: vm.randomUint(0, type(uint64).max), - root: bytes32(vm.randomUint()) + chainId: vm.randomUint(0, type(uint64).max), root: bytes32(vm.randomUint()) }); } diff --git a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol index 3f6a3bdf255..8ac0b7b01f5 100644 --- a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol +++ b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol @@ -89,7 +89,15 @@ contract SafeCall_Send_Test is SafeCall_TestInit { /// @notice Tests the `call` function of the `SafeCall` contract. contract SafeCall_Call_Test is SafeCall_TestInit { /// @notice Tests that `call` succeeds. - function testFuzz_call_succeeds(address from, address to, uint256 gas, uint64 value, bytes memory data) external { + function testFuzz_call_succeeds( + address from, + address to, + uint256 gas, + uint64 value, + bytes memory data + ) + external + { assumeNot(from); assumeNot(to); diff --git a/packages/contracts-bedrock/test/libraries/SemverComp.t.sol b/packages/contracts-bedrock/test/libraries/SemverComp.t.sol index 45f2ace041c..5663dc8550e 100644 --- a/packages/contracts-bedrock/test/libraries/SemverComp.t.sol +++ b/packages/contracts-bedrock/test/libraries/SemverComp.t.sol @@ -39,7 +39,15 @@ abstract contract SemverComp_TestInit is Test { /// @param _major The expected major version. /// @param _minor The expected minor version. /// @param _patch The expected patch version. - function assertParsedEq(string memory _semver, uint256 _major, uint256 _minor, uint256 _patch) internal view { + function assertParsedEq( + string memory _semver, + uint256 _major, + uint256 _minor, + uint256 _patch + ) + internal + view + { (uint256 major, uint256 minor, uint256 patch) = harness.parse(_semver); assertEq(major, _major, "major mismatch"); assertEq(minor, _minor, "minor mismatch"); diff --git a/packages/contracts-bedrock/test/libraries/TransientContext.t.sol b/packages/contracts-bedrock/test/libraries/TransientContext.t.sol index 9d3511cf023..2b82103e6e6 100644 --- a/packages/contracts-bedrock/test/libraries/TransientContext.t.sol +++ b/packages/contracts-bedrock/test/libraries/TransientContext.t.sol @@ -200,7 +200,13 @@ contract TransientContext_Uncategorized_Test is TransientContext_Set_Test { /// @param _slot Slot to test. /// @param _value1 Value to write to slot at call depth 0. /// @param _value2 Value to write to slot at call depth 1. - function testFuzz_setGet_twiceDifferentDepth_succeeds(bytes32 _slot, uint256 _value1, uint256 _value2) public { + function testFuzz_setGet_twiceDifferentDepth_succeeds( + bytes32 _slot, + uint256 _value1, + uint256 _value2 + ) + public + { assertEq(TransientContext.callDepth(), 0); testFuzz_set_succeeds(_slot, _value1); assertEq(TransientContext.get(_slot), _value1); diff --git a/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol b/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol index 51e0cb1ae9a..051fc26b6a7 100644 --- a/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol +++ b/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol @@ -11,7 +11,15 @@ import { RLPReader } from "src/libraries/rlp/RLPReader.sol"; import "src/libraries/rlp/RLPErrors.sol"; contract MerkleTrie_Harness { - function exposed_get(bytes memory _key, bytes[] memory _proof, bytes32 _root) public pure returns (bytes memory) { + function exposed_get( + bytes memory _key, + bytes[] memory _proof, + bytes32 _root + ) + public + pure + returns (bytes memory) + { return MerkleTrie.get(_key, _proof, _root); } } diff --git a/packages/contracts-bedrock/test/mocks/MockFeeVault.sol b/packages/contracts-bedrock/test/mocks/MockFeeVault.sol index 4ab57603c0b..3be968c6cb6 100644 --- a/packages/contracts-bedrock/test/mocks/MockFeeVault.sol +++ b/packages/contracts-bedrock/test/mocks/MockFeeVault.sol @@ -12,7 +12,11 @@ contract MockFeeVault { event Withdrawal(uint256 value, address to, address from); event Withdrawal(uint256 value, address to, address from, Types.WithdrawalNetwork withdrawalNetwork); - constructor(address payable _recipient, uint256 _minWithdrawalAmount, Types.WithdrawalNetwork _withdrawalNetwork) { + constructor( + address payable _recipient, + uint256 _minWithdrawalAmount, + Types.WithdrawalNetwork _withdrawalNetwork + ) { RECIPIENT = _recipient; MIN_WITHDRAWAL_AMOUNT = _minWithdrawalAmount; WITHDRAWAL_NETWORK = _withdrawalNetwork; diff --git a/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol b/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol index da47f8b555c..b847707b8c7 100644 --- a/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol +++ b/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol @@ -184,10 +184,7 @@ contract UpgradeOPChainInput_Test is Test { IOPContractsManagerUtils.DisputeGameConfig[] memory disputeGameConfigs = new IOPContractsManagerUtils.DisputeGameConfig[](1); disputeGameConfigs[0] = IOPContractsManagerUtils.DisputeGameConfig({ - enabled: enabled, - initBond: initBond, - gameType: GameType.wrap(gameType), - gameArgs: abi.encode("test") + enabled: enabled, initBond: initBond, gameType: GameType.wrap(gameType), gameArgs: abi.encode("test") }); OPContractsManagerV2.UpgradeInput memory upgradeInput = OPContractsManagerV2.UpgradeInput({ @@ -231,10 +228,7 @@ contract UpgradeOPChainInput_TestV2 is Test { IOPContractsManagerUtils.DisputeGameConfig[] memory disputeGameConfigs = new IOPContractsManagerUtils.DisputeGameConfig[](1); disputeGameConfigs[0] = IOPContractsManagerUtils.DisputeGameConfig({ - enabled: enabled, - initBond: initBond, - gameType: GameType.wrap(gameType), - gameArgs: gameArgs + enabled: enabled, initBond: initBond, gameType: GameType.wrap(gameType), gameArgs: gameArgs }); IOPContractsManagerUtils.ExtraInstruction[] memory extraInstructions = @@ -326,7 +320,13 @@ contract MockOPCMV1 { address indexed sysCfgProxy, bytes32 indexed absolutePrestate, bytes32 indexed cannonKonaPrestate ); - function isDevFeatureEnabled(bytes32 /* _feature */ ) public pure returns (bool) { + function isDevFeatureEnabled( + bytes32 /* _feature */ + ) + public + pure + returns (bool) + { return false; } @@ -451,10 +451,7 @@ contract UpgradeOPChain_TestV2 is Test { IOPContractsManagerUtils.DisputeGameConfig[] memory disputeGameConfigs = new IOPContractsManagerUtils.DisputeGameConfig[](1); disputeGameConfigs[0] = IOPContractsManagerUtils.DisputeGameConfig({ - enabled: enabled, - initBond: initBond, - gameType: GameType.wrap(gameType), - gameArgs: gameArgs + enabled: enabled, initBond: initBond, gameType: GameType.wrap(gameType), gameArgs: gameArgs }); OPContractsManagerV2.UpgradeInput memory upgradeInput = OPContractsManagerV2.UpgradeInput({ diff --git a/packages/contracts-bedrock/test/opcm/UpgradeSuperchainConfig.t.sol b/packages/contracts-bedrock/test/opcm/UpgradeSuperchainConfig.t.sol index f9308dd30e2..c2ccf820d8e 100644 --- a/packages/contracts-bedrock/test/opcm/UpgradeSuperchainConfig.t.sol +++ b/packages/contracts-bedrock/test/opcm/UpgradeSuperchainConfig.t.sol @@ -19,7 +19,13 @@ import { DevFeatures } from "src/libraries/DevFeatures.sol"; contract MockOPCMV1 { event UpgradeCalled(address indexed superchainConfig); - function isDevFeatureEnabled(bytes32 /* _feature */ ) public pure returns (bool) { + function isDevFeatureEnabled( + bytes32 /* _feature */ + ) + public + pure + returns (bool) + { return false; } @@ -121,12 +127,9 @@ contract UpgradeSuperchainConfigV2_Run_Test is Test { // UpgradeCalled should be emitted by the prank since it's a delegate call. vm.expectEmit(address(prank)); - emit UpgradeCalled( - IOPContractsManagerV2.SuperchainUpgradeInput({ - superchainConfig: superchainConfig, - extraInstructions: extraInstructions - }) - ); + emit UpgradeCalled(IOPContractsManagerV2.SuperchainUpgradeInput({ + superchainConfig: superchainConfig, extraInstructions: extraInstructions + })); upgradeSuperchainConfig.run(input); } diff --git a/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol b/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol index e1869ef176d..219ad12762f 100644 --- a/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol +++ b/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol @@ -88,13 +88,10 @@ abstract contract Drippie_TestInit is Test { Drippie.DripAction[] memory actions = new Drippie.DripAction[](1); actions[0] = Drippie.DripAction({ target: payable(address(0x44)), data: hex"", value: 1 }); - return Drippie.DripConfig({ - interval: 100, - dripcheck: check, - reentrant: false, - checkparams: hex"", - actions: actions - }); + return + Drippie.DripConfig({ + interval: 100, dripcheck: check, reentrant: false, checkparams: hex"", actions: actions + }); } /// @notice Creates a default drip using the default drip config. @@ -430,9 +427,7 @@ contract Drippie_Drip_Test is Drippie_TestInit { // Add in an action cfg.actions[0] = Drippie.DripAction({ - target: payable(address(simpleStorage)), - data: abi.encodeCall(SimpleStorage.set, (key, value)), - value: 0 + target: payable(address(simpleStorage)), data: abi.encodeCall(SimpleStorage.set, (key, value)), value: 0 }); vm.prank(drippie.owner()); diff --git a/packages/contracts-bedrock/test/periphery/monitoring/DisputeMonitorHelper.t.sol b/packages/contracts-bedrock/test/periphery/monitoring/DisputeMonitorHelper.t.sol index 8c1e22609c0..140e9dc8785 100644 --- a/packages/contracts-bedrock/test/periphery/monitoring/DisputeMonitorHelper.t.sol +++ b/packages/contracts-bedrock/test/periphery/monitoring/DisputeMonitorHelper.t.sol @@ -216,7 +216,12 @@ contract DisputeMonitorHelper_GetUnresolvedGames_Test is DisputeMonitorHelper_Te /// @notice Fuzz test that getting unresolved games between two timestamps returns empty array. /// @param _timestamp1 The timestamp for the first game. /// @param _gap The gap between the two game timestamps. - function testFuzz_getUnresolvedGames_betweenTimestamps_succeeds(uint256 _timestamp1, uint256 _gap) external { + function testFuzz_getUnresolvedGames_betweenTimestamps_succeeds( + uint256 _timestamp1, + uint256 _gap + ) + external + { // Bound timestamps to ensure valid range with a gap of at least 2. _timestamp1 = bound(_timestamp1, 1, type(uint64).max - 1000); _gap = bound(_gap, 2, 1000); @@ -371,9 +376,8 @@ contract DisputeMonitorHelper_Search_Test is DisputeMonitorHelper_TestInit { // Different assertions for different cases. if ( (direction == DisputeMonitorHelper.SearchDirection.OLDER_THAN_OR_EQ && randomTimestamp < rangeStart) - || ( - direction == DisputeMonitorHelper.SearchDirection.NEWER_THAN_OR_EQ && randomTimestamp > rangeEnd - ) + || (direction == DisputeMonitorHelper.SearchDirection.NEWER_THAN_OR_EQ + && randomTimestamp > rangeEnd) ) { // If we fall outside of the range, expect the max index representing that no // valid game was found. diff --git a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol index 35b0ef9ee8e..548ead5ee9b 100644 --- a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol +++ b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol @@ -187,18 +187,19 @@ library SafeTestLib { bytes32 txDataHash; { uint256 _nonce = instance.safe.nonce(); - txDataHash = instance.safe.getTransactionHash({ - to: to, - value: value, - data: data, - operation: operation, - safeTxGas: safeTxGas, - baseGas: baseGas, - gasPrice: gasPrice, - gasToken: gasToken, - refundReceiver: refundReceiver, - _nonce: _nonce - }); + txDataHash = instance.safe + .getTransactionHash({ + to: to, + value: value, + data: data, + operation: operation, + safeTxGas: safeTxGas, + baseGas: baseGas, + gasPrice: gasPrice, + gasToken: gasToken, + refundReceiver: refundReceiver, + _nonce: _nonce + }); } (v, r, s) = Vm(VM_ADDR).sign(pk, txDataHash); @@ -208,7 +209,14 @@ library SafeTestLib { /// This version of getPrevOwner will call to the Safe contract to get the current list of owners. /// Note that this will break vm.expectRevert() tests by making a call which does not revert.. /// @param _owner The owner whose previous owner we want to find - function getPrevOwner(SafeInstance memory instance, address _owner) internal view returns (address prevOwner_) { + function getPrevOwner( + SafeInstance memory instance, + address _owner + ) + internal + view + returns (address prevOwner_) + { address[] memory owners = instance.safe.getOwners(); prevOwner_ = getPrevOwnerFromList(_owner, owners); } @@ -370,7 +378,14 @@ library SafeTestLib { /// @dev Removes an owner from the safe. If not provided explicitly, the identification of the prevOwner is handled /// automatically. - function removeOwner(SafeInstance memory instance, address prevOwner, address owner, uint256 threshold) internal { + function removeOwner( + SafeInstance memory instance, + address prevOwner, + address owner, + uint256 threshold + ) + internal + { prevOwner = prevOwner > address(0) ? prevOwner : SafeTestLib.getPrevOwner(instance, owner); execTransaction( instance, address(instance.safe), 0, abi.encodeCall(OwnerManager.removeOwner, (prevOwner, owner, threshold)) @@ -379,7 +394,14 @@ library SafeTestLib { /// @dev Replaces an old owner with a new owner. If not provided explicitly, the identification of the prevOwner is /// handled automatically. - function swapOwner(SafeInstance memory instance, address prevOwner, address oldOwner, address newOwner) internal { + function swapOwner( + SafeInstance memory instance, + address prevOwner, + address oldOwner, + address newOwner + ) + internal + { prevOwner = prevOwner > address(0) ? prevOwner : SafeTestLib.getPrevOwner(instance, oldOwner); execTransaction( instance, address(instance.safe), 0, abi.encodeCall(OwnerManager.swapOwner, (prevOwner, oldOwner, newOwner)) @@ -411,18 +433,19 @@ library SafeTestLib { bytes32 safeTxHash; { uint256 _nonce = instance.safe.nonce(); - safeTxHash = instance.safe.getTransactionHash({ - to: to, - value: value, - data: data, - operation: operation, - safeTxGas: safeTxGas, - baseGas: baseGas, - gasPrice: gasPrice, - gasToken: gasToken, - refundReceiver: refundReceiver, - _nonce: _nonce - }); + safeTxHash = instance.safe + .getTransactionHash({ + to: to, + value: value, + data: data, + operation: operation, + safeTxGas: safeTxGas, + baseGas: baseGas, + gasPrice: gasPrice, + gasToken: gasToken, + refundReceiver: refundReceiver, + _nonce: _nonce + }); } if (signatures.length == 0) { @@ -441,18 +464,19 @@ library SafeTestLib { } } - return instance.safe.execTransaction({ - to: to, - value: value, - data: data, - operation: operation, - safeTxGas: safeTxGas, - baseGas: baseGas, - gasPrice: gasPrice, - gasToken: gasToken, - refundReceiver: payable(refundReceiver), - signatures: signatures - }); + return instance.safe + .execTransaction({ + to: to, + value: value, + data: data, + operation: operation, + safeTxGas: safeTxGas, + baseGas: baseGas, + gasPrice: gasPrice, + gasToken: gasToken, + refundReceiver: payable(refundReceiver), + signatures: signatures + }); } /// @dev Executes either a CALL or DELEGATECALL transaction. diff --git a/packages/contracts-bedrock/test/safe/DeputyPauseModule.t.sol b/packages/contracts-bedrock/test/safe/DeputyPauseModule.t.sol index b20074f5b34..db4d5dd33d3 100644 --- a/packages/contracts-bedrock/test/safe/DeputyPauseModule.t.sol +++ b/packages/contracts-bedrock/test/safe/DeputyPauseModule.t.sol @@ -424,7 +424,13 @@ contract DeputyPauseModule_Pause_Test is DeputyPauseModule_TestInit { /// @param _nonce1 First nonce. /// @param _nonce2 Second nonce. /// @param _identifier The identifier to pause. - function testFuzz_pause_differentNonces_succeeds(bytes32 _nonce1, bytes32 _nonce2, address _identifier) external { + function testFuzz_pause_differentNonces_succeeds( + bytes32 _nonce1, + bytes32 _nonce2, + address _identifier + ) + external + { // Make sure that the nonces are different. vm.assume(_nonce1 != _nonce2); diff --git a/packages/contracts-bedrock/test/safe/LivenessModule2.t.sol b/packages/contracts-bedrock/test/safe/LivenessModule2.t.sol index 1059c0703ec..9a8c203d663 100644 --- a/packages/contracts-bedrock/test/safe/LivenessModule2.t.sol +++ b/packages/contracts-bedrock/test/safe/LivenessModule2.t.sol @@ -204,8 +204,7 @@ contract LivenessModule2_ConfigureLivenessModule_Test is LivenessModule2_TestIni vm.prank(address(safeInstance.safe)); livenessModule2.configureLivenessModule( LivenessModule2.ModuleConfig({ - livenessResponsePeriod: CHALLENGE_PERIOD, - fallbackOwner: address(safeInstance.safe) + livenessResponsePeriod: CHALLENGE_PERIOD, fallbackOwner: address(safeInstance.safe) }) ); } diff --git a/packages/contracts-bedrock/test/safe/SaferSafes.t.sol b/packages/contracts-bedrock/test/safe/SaferSafes.t.sol index 89dd8832dfe..f6781add302 100644 --- a/packages/contracts-bedrock/test/safe/SaferSafes.t.sol +++ b/packages/contracts-bedrock/test/safe/SaferSafes.t.sol @@ -75,8 +75,7 @@ contract SaferSafes_Uncategorized_Test is SaferSafes_TestInit { // Configure the liveness module FIRST LivenessModule2.ModuleConfig memory moduleConfig = LivenessModule2.ModuleConfig({ - livenessResponsePeriod: livenessResponsePeriod, - fallbackOwner: fallbackOwner + livenessResponsePeriod: livenessResponsePeriod, fallbackOwner: fallbackOwner }); vm.prank(address(safeInstance.safe)); @@ -102,8 +101,7 @@ contract SaferSafes_Uncategorized_Test is SaferSafes_TestInit { saferSafes.configureTimelockGuard(timelockDelay); LivenessModule2.ModuleConfig memory moduleConfig = LivenessModule2.ModuleConfig({ - livenessResponsePeriod: livenessResponsePeriod, - fallbackOwner: fallbackOwner + livenessResponsePeriod: livenessResponsePeriod, fallbackOwner: fallbackOwner }); // Configure the liveness module SECOND (this will trigger the check) @@ -126,8 +124,7 @@ contract SaferSafes_Uncategorized_Test is SaferSafes_TestInit { // Configure liveness module first LivenessModule2.ModuleConfig memory moduleConfig = LivenessModule2.ModuleConfig({ - livenessResponsePeriod: livenessResponsePeriod, - fallbackOwner: fallbackOwner + livenessResponsePeriod: livenessResponsePeriod, fallbackOwner: fallbackOwner }); vm.prank(address(safeInstance.safe)); @@ -148,8 +145,7 @@ contract SaferSafes_Uncategorized_Test is SaferSafes_TestInit { saferSafes.configureTimelockGuard(timelockDelay); LivenessModule2.ModuleConfig memory moduleConfig = LivenessModule2.ModuleConfig({ - livenessResponsePeriod: livenessResponsePeriod, - fallbackOwner: fallbackOwner + livenessResponsePeriod: livenessResponsePeriod, fallbackOwner: fallbackOwner }); // Configure liveness module second - this will trigger the check diff --git a/packages/contracts-bedrock/test/safe/TimelockGuard.t.sol b/packages/contracts-bedrock/test/safe/TimelockGuard.t.sol index 0bb2e4b84c0..ee0d6497cea 100644 --- a/packages/contracts-bedrock/test/safe/TimelockGuard.t.sol +++ b/packages/contracts-bedrock/test/safe/TimelockGuard.t.sol @@ -41,18 +41,19 @@ library TransactionBuilder { /// @notice Computes and stores the Safe transaction hash for the struct. function setHash(Transaction memory _tx) internal view { - _tx.hash = _tx.safeInstance.safe.getTransactionHash({ - to: _tx.params.to, - value: _tx.params.value, - data: _tx.params.data, - operation: _tx.params.operation, - safeTxGas: _tx.params.safeTxGas, - baseGas: _tx.params.baseGas, - gasPrice: _tx.params.gasPrice, - gasToken: _tx.params.gasToken, - refundReceiver: _tx.params.refundReceiver, - _nonce: _tx.nonce - }); + _tx.hash = _tx.safeInstance.safe + .getTransactionHash({ + to: _tx.params.to, + value: _tx.params.value, + data: _tx.params.data, + operation: _tx.params.operation, + safeTxGas: _tx.params.safeTxGas, + baseGas: _tx.params.baseGas, + gasPrice: _tx.params.gasPrice, + gasToken: _tx.params.gasToken, + refundReceiver: _tx.params.refundReceiver, + _nonce: _tx.nonce + }); } /// @notice Collects signatures from the first `_num` owners for the transaction. @@ -93,18 +94,19 @@ library TransactionBuilder { /// @notice Executes the transaction via the underlying Safe contract. function executeTransaction(Transaction memory _tx, address _owner) internal { Vm(VM_ADDR).prank(_owner); - _tx.safeInstance.safe.execTransaction( - _tx.params.to, - _tx.params.value, - _tx.params.data, - _tx.params.operation, - _tx.params.safeTxGas, - _tx.params.baseGas, - _tx.params.gasPrice, - _tx.params.gasToken, - _tx.params.refundReceiver, - _tx.signatures - ); + _tx.safeInstance.safe + .execTransaction( + _tx.params.to, + _tx.params.value, + _tx.params.data, + _tx.params.operation, + _tx.params.safeTxGas, + _tx.params.baseGas, + _tx.params.gasPrice, + _tx.params.gasToken, + _tx.params.refundReceiver, + _tx.signatures + ); } /// @notice Returns a fresh transaction struct copy with identical fields. @@ -201,9 +203,8 @@ abstract contract TimelockGuard_TestInit is Test, SafeTestTools { /// @param _safe The Safe for which to override the threshold. /// @param _value The threshold value to set. function _setCancellationThreshold(Safe _safe, uint256 _value) internal { - uint256 slot = stdstore.target(address(timelockGuard)).sig("cancellationThreshold(address)").with_key( - address(_safe) - ).find(); + uint256 slot = stdstore.target(address(timelockGuard)).sig("cancellationThreshold(address)") + .with_key(address(_safe)).find(); vm.store(address(timelockGuard), bytes32(slot), bytes32(uint256(_value))); } @@ -949,9 +950,8 @@ contract TimelockGuard_Integration_Test is TimelockGuard_TestInit { vm.warp(block.timestamp + TIMELOCK_DELAY); // increment the cancellation threshold so that we can test that it is reset - uint256 slot = stdstore.target(address(timelockGuard)).sig("cancellationThreshold(address)").with_key( - address(safeInstance.safe) - ).find(); + uint256 slot = stdstore.target(address(timelockGuard)).sig("cancellationThreshold(address)") + .with_key(address(safeInstance.safe)).find(); vm.store( address(timelockGuard), bytes32(slot), diff --git a/packages/contracts-bedrock/test/scripts/FetchChainInfo.t.sol b/packages/contracts-bedrock/test/scripts/FetchChainInfo.t.sol index 906c47d37ff..8dcff912908 100644 --- a/packages/contracts-bedrock/test/scripts/FetchChainInfo.t.sol +++ b/packages/contracts-bedrock/test/scripts/FetchChainInfo.t.sol @@ -319,9 +319,8 @@ contract FetchChainInfoTest is Test { ModernMockContract(payable(ctx.optimismPortal)).set_respectedGameType(GameTypes.PERMISSIONED_CANNON); OracleMock(payable(ctx.mips)).set_oracle(ctx.preimageOracle); - DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl( - GameTypes.PERMISSIONED_CANNON, ctx.permissionedGame - ); + DisputeGameFactoryMock(payable(ctx.disputeGameFactory)) + .set_gameImpl(GameTypes.PERMISSIONED_CANNON, ctx.permissionedGame); PermissionedDisputeGameMock(payable(ctx.permissionedGame)).set_challenger(TEST_CHALLENGER); PermissionedDisputeGameMock(payable(ctx.permissionedGame)).set_proposer(TEST_PROPOSER); @@ -448,13 +447,11 @@ contract FetchChainInfoTest is Test { DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl(GameTypes.CANNON, ctx.permissionlessGame); if (_withCannonKona) { - DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl( - GameTypes.CANNON_KONA, ctx.permissionlessCannonKonaGame - ); + DisputeGameFactoryMock(payable(ctx.disputeGameFactory)) + .set_gameImpl(GameTypes.CANNON_KONA, ctx.permissionlessCannonKonaGame); } - DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl( - GameTypes.PERMISSIONED_CANNON, ctx.permissionedGame - ); + DisputeGameFactoryMock(payable(ctx.disputeGameFactory)) + .set_gameImpl(GameTypes.PERMISSIONED_CANNON, ctx.permissionedGame); // Set up required properties on permissioned game PermissionedDisputeGameMock(payable(ctx.permissionedGame)).set_challenger(TEST_CHALLENGER); @@ -498,13 +495,11 @@ contract FetchChainInfoTest is Test { DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl(GameTypes.CANNON, ctx.permissionlessGame); if (_withCannonKona) { - DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl( - GameTypes.CANNON_KONA, ctx.permissionlessCannonKonaGame - ); + DisputeGameFactoryMock(payable(ctx.disputeGameFactory)) + .set_gameImpl(GameTypes.CANNON_KONA, ctx.permissionlessCannonKonaGame); } - DisputeGameFactoryMock(payable(ctx.disputeGameFactory)).set_gameImpl( - GameTypes.PERMISSIONED_CANNON, ctx.permissionedGame - ); + DisputeGameFactoryMock(payable(ctx.disputeGameFactory)) + .set_gameImpl(GameTypes.PERMISSIONED_CANNON, ctx.permissionedGame); PermissionedDisputeGameMock(payable(ctx.permissionedGame)).set_challenger(TEST_CHALLENGER); PermissionedDisputeGameMock(payable(ctx.permissionedGame)).set_proposer(TEST_PROPOSER); diff --git a/packages/contracts-bedrock/test/scripts/VerifyOPCM.t.sol b/packages/contracts-bedrock/test/scripts/VerifyOPCM.t.sol index bef1cfa7d96..0434cdc7a43 100644 --- a/packages/contracts-bedrock/test/scripts/VerifyOPCM.t.sol +++ b/packages/contracts-bedrock/test/scripts/VerifyOPCM.t.sol @@ -480,7 +480,12 @@ contract VerifyOPCM_Run_Test is VerifyOPCM_TestInit { /// @notice Utility function to mock the first OPCM component's contractsContainer address. /// @param _propRefs Array of property references to search through. /// @param _mockAddress The address to mock the contractsContainer call to return. - function _mockFirstOpcmComponent(VerifyOPCM.OpcmContractRef[] memory _propRefs, address _mockAddress) internal { + function _mockFirstOpcmComponent( + VerifyOPCM.OpcmContractRef[] memory _propRefs, + address _mockAddress + ) + internal + { for (uint256 i = 0; i < _propRefs.length; i++) { string memory field = _propRefs[i].field; // Check if this is an OPCM component that has contractsContainer() diff --git a/packages/contracts-bedrock/test/setup/DisputeGames.sol b/packages/contracts-bedrock/test/setup/DisputeGames.sol index 6268a5bc92f..419075eaa9d 100644 --- a/packages/contracts-bedrock/test/setup/DisputeGames.sol +++ b/packages/contracts-bedrock/test/setup/DisputeGames.sol @@ -184,7 +184,13 @@ library DisputeGames { _mockGameArg(_dgf, _gameType, GameArg.PROPOSER, value); } - function mockGameImplChallenger(IDisputeGameFactory _dgf, GameType _gameType, address _challenger) internal { + function mockGameImplChallenger( + IDisputeGameFactory _dgf, + GameType _gameType, + address _challenger + ) + internal + { bytes memory value = abi.encodePacked(_challenger); _mockGameArg(_dgf, _gameType, GameArg.CHALLENGER, value); } diff --git a/packages/contracts-bedrock/test/setup/ForkLive.s.sol b/packages/contracts-bedrock/test/setup/ForkLive.s.sol index c59a3feafb6..618356207de 100644 --- a/packages/contracts-bedrock/test/setup/ForkLive.s.sol +++ b/packages/contracts-bedrock/test/setup/ForkLive.s.sol @@ -246,17 +246,16 @@ contract ForkLive is Deployer, StdAssertions, FeatureFlags { // Always try to upgrade the SuperchainConfig. Not always necessary but easier to do it // every time rather than adding or removing this code for each upgrade. vm.prank(superchainPAO, true); - (bool success, bytes memory reason) = address(_opcm).delegatecall( - abi.encodeCall( - IOPContractsManagerV2.upgradeSuperchain, - ( - IOPContractsManagerV2.SuperchainUpgradeInput({ - superchainConfig: superchainConfig, - extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) - }) + (bool success, bytes memory reason) = address(_opcm) + .delegatecall( + abi.encodeCall( + IOPContractsManagerV2.upgradeSuperchain, + (IOPContractsManagerV2.SuperchainUpgradeInput({ + superchainConfig: superchainConfig, + extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) + })) ) - ) - ); + ); if (success == false) { // Only acceptable revert reason is downgrade not allowed. assertTrue( @@ -314,18 +313,17 @@ contract ForkLive is Deployer, StdAssertions, FeatureFlags { IOPContractsManagerUtils.ExtraInstruction({ key: "PermittedProxyDeployment", data: bytes("DelayedWETH") }); vm.prank(_delegateCaller, true); - (bool upgradeSuccess,) = address(_opcm).delegatecall( - abi.encodeCall( - IOPContractsManagerV2.upgrade, - ( - IOPContractsManagerV2.UpgradeInput({ - systemConfig: systemConfig, - disputeGameConfigs: disputeGameConfigs, - extraInstructions: extraInstructions - }) + (bool upgradeSuccess,) = address(_opcm) + .delegatecall( + abi.encodeCall( + IOPContractsManagerV2.upgrade, + (IOPContractsManagerV2.UpgradeInput({ + systemConfig: systemConfig, + disputeGameConfigs: disputeGameConfigs, + extraInstructions: extraInstructions + })) ) - ) - ); + ); assertTrue(upgradeSuccess, "upgrade failed"); } @@ -381,7 +379,13 @@ contract ForkLive is Deployer, StdAssertions, FeatureFlags { /// @param _contractName The name of the contract to save /// @param _tomlPath The path to the superchain config file /// @param _tomlKey The key in the superchain config file to get the proxy address - function saveProxyAndImpl(string memory _contractName, string memory _tomlPath, string memory _tomlKey) internal { + function saveProxyAndImpl( + string memory _contractName, + string memory _tomlPath, + string memory _tomlKey + ) + internal + { address proxy = vm.parseTomlAddress(_tomlPath, _tomlKey); artifacts.save(string.concat(_contractName, "Proxy"), proxy); diff --git a/packages/contracts-bedrock/test/setup/PastUpgrades.sol b/packages/contracts-bedrock/test/setup/PastUpgrades.sol index 5cc3b1ded52..636faa6a3ea 100644 --- a/packages/contracts-bedrock/test/setup/PastUpgrades.sol +++ b/packages/contracts-bedrock/test/setup/PastUpgrades.sol @@ -217,12 +217,10 @@ library PastUpgrades { (bool scSuccess,) = _opcm.delegatecall( abi.encodeCall( IOPContractsManagerV2.upgradeSuperchain, - ( - IOPContractsManagerV2.SuperchainUpgradeInput({ + (IOPContractsManagerV2.SuperchainUpgradeInput({ superchainConfig: _superchainConfig, extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) - }) - ) + })) ) ); // Acceptable to fail if already up to date @@ -262,7 +260,9 @@ library PastUpgrades { initBond: _disputeGameFactory.initBonds(GameTypes.CANNON_KONA), gameType: GameTypes.CANNON_KONA, gameArgs: abi.encode( - IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: Claim.wrap(DUMMY_CANNON_KONA_PRESTATE) }) + IOPContractsManagerUtils.FaultDisputeGameConfig({ + absolutePrestate: Claim.wrap(DUMMY_CANNON_KONA_PRESTATE) + }) ) }); @@ -274,13 +274,11 @@ library PastUpgrades { (bool upgradeSuccess,) = _opcm.delegatecall( abi.encodeCall( IOPContractsManagerV2.upgrade, - ( - IOPContractsManagerV2.UpgradeInput({ + (IOPContractsManagerV2.UpgradeInput({ systemConfig: _systemConfig, disputeGameConfigs: disputeGameConfigs, extraInstructions: new IOPContractsManagerUtils.ExtraInstruction[](0) - }) - ) + })) ) ); require(upgradeSuccess, "PastUpgrades: OPCMv2 upgrade failed"); diff --git a/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol index 3d11320d33a..2008e626ab6 100644 --- a/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol @@ -167,7 +167,13 @@ contract CrossDomainMessenger_BaseGas_Test is CommonTest { /// @notice The `baseGas` function should always return a value greater than or equal to the /// minimum gas limit value on the `OptimismPortal`. This guarantees that the /// messengers will always pass sufficient gas to the `OptimismPortal`. - function testFuzz_baseGas_portalMinGasLimit_succeeds(bytes calldata _data, uint32 _minGasLimit) external view { + function testFuzz_baseGas_portalMinGasLimit_succeeds( + bytes calldata _data, + uint32 _minGasLimit + ) + external + view + { if (_data.length > type(uint64).max) { _data = _data[0:type(uint64).max]; } @@ -186,10 +192,8 @@ contract CrossDomainMessenger_BaseGas_Test is CommonTest { // Calculate the expected floor cost uint64 expectedFloorCost = l1CrossDomainMessenger.TX_BASE_GAS() - + ( - uint64(largeMessage.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) - * l1CrossDomainMessenger.FLOOR_CALLDATA_OVERHEAD() - ); + + (uint64(largeMessage.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) + * l1CrossDomainMessenger.FLOOR_CALLDATA_OVERHEAD()); // Verify that the result is at least the floor cost assertTrue(baseGasResult >= expectedFloorCost, "baseGas should return at least the floor cost"); @@ -205,25 +209,19 @@ contract CrossDomainMessenger_BaseGas_Test is CommonTest { // Calculate the expected floor cost uint64 floorCost = l1CrossDomainMessenger.TX_BASE_GAS() - + ( - uint64(smallMessage.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) - * l1CrossDomainMessenger.FLOOR_CALLDATA_OVERHEAD() - ); + + (uint64(smallMessage.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) + * l1CrossDomainMessenger.FLOOR_CALLDATA_OVERHEAD()); // Calculate the expected execution gas (simplified version of what's in the contract) uint64 executionGas = l1CrossDomainMessenger.RELAY_CONSTANT_OVERHEAD() + l1CrossDomainMessenger.RELAY_CALL_OVERHEAD() + l1CrossDomainMessenger.RELAY_RESERVED_GAS() + l1CrossDomainMessenger.RELAY_GAS_CHECK_BUFFER() - + ( - (highGasLimit * l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()) - / l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() - ); + + ((highGasLimit * l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()) + / l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()); uint64 expectedExecutionGasWithOverhead = l1CrossDomainMessenger.TX_BASE_GAS() + executionGas - + ( - uint64(smallMessage.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) - * l1CrossDomainMessenger.MIN_GAS_CALLDATA_OVERHEAD() - ); + + (uint64(smallMessage.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) + * l1CrossDomainMessenger.MIN_GAS_CALLDATA_OVERHEAD()); // Verify that the result is the execution gas (which should be higher than floor cost) assertTrue( @@ -245,16 +243,12 @@ contract CrossDomainMessenger_BaseGas_Test is CommonTest { uint64 executionGas = l1CrossDomainMessenger.RELAY_CONSTANT_OVERHEAD() + l1CrossDomainMessenger.RELAY_CALL_OVERHEAD() + l1CrossDomainMessenger.RELAY_RESERVED_GAS() + l1CrossDomainMessenger.RELAY_GAS_CHECK_BUFFER() - + ( - (_minGasLimit * l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()) - / l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() - ); + + ((_minGasLimit * l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()) + / l1CrossDomainMessenger.MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()); uint64 executionGasWithOverhead = executionGas - + ( - uint64(_message.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) - * l1CrossDomainMessenger.MIN_GAS_CALLDATA_OVERHEAD() - ); + + (uint64(_message.length + l1CrossDomainMessenger.ENCODING_OVERHEAD()) + * l1CrossDomainMessenger.MIN_GAS_CALLDATA_OVERHEAD()); // The result should be at least the maximum of the two calculations uint64 expectedMinimum = uint64( diff --git a/packages/contracts-bedrock/test/universal/Proxy.t.sol b/packages/contracts-bedrock/test/universal/Proxy.t.sol index b3b7b52342e..c511534b2cc 100644 --- a/packages/contracts-bedrock/test/universal/Proxy.t.sol +++ b/packages/contracts-bedrock/test/universal/Proxy.t.sol @@ -50,8 +50,7 @@ abstract contract Proxy_TestInit is Test { // Deploy a proxy and simple storage contract as the implementation proxy = IProxy( DeployUtils.create1({ - _name: "Proxy", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IProxy.__constructor__, (alice))) + _name: "Proxy", _args: DeployUtils.encodeConstructor(abi.encodeCall(IProxy.__constructor__, (alice))) }) ); simpleStorage = new Proxy_SimpleStorage_Harness(); diff --git a/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol b/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol index f81ec40007e..db76775123b 100644 --- a/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol +++ b/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol @@ -51,7 +51,9 @@ abstract contract ProxyAdmin_TestInit is Test { chugsplash = IL1ChugSplashProxy( DeployUtils.create1({ _name: "L1ChugSplashProxy", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IL1ChugSplashProxy.__constructor__, (address(admin)))) + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IL1ChugSplashProxy.__constructor__, (address(admin))) + ) }) ); diff --git a/packages/contracts-bedrock/test/universal/StandardBridge.t.sol b/packages/contracts-bedrock/test/universal/StandardBridge.t.sol index 4cd950df868..6c264b92654 100644 --- a/packages/contracts-bedrock/test/universal/StandardBridge.t.sol +++ b/packages/contracts-bedrock/test/universal/StandardBridge.t.sol @@ -64,11 +64,7 @@ abstract contract StandardBridge_TestInit is CommonTest { bridge = new StandardBridgeTester(); mintable = new OptimismMintableERC20({ - _bridge: address(0), - _remoteToken: address(0), - _name: "Stonks", - _symbol: "STONK", - _decimals: 18 + _bridge: address(0), _remoteToken: address(0), _name: "Stonks", _symbol: "STONK", _decimals: 18 }); erc20 = new ERC20("Altcoin", "ALT"); diff --git a/packages/contracts-bedrock/test/universal/WETH98.t.sol b/packages/contracts-bedrock/test/universal/WETH98.t.sol index 8173dec67d3..5b8d64d8caf 100644 --- a/packages/contracts-bedrock/test/universal/WETH98.t.sol +++ b/packages/contracts-bedrock/test/universal/WETH98.t.sol @@ -25,8 +25,7 @@ abstract contract WETH98_TestInit is Test { function setUp() public { weth = IWETH98( DeployUtils.create1({ - _name: "WETH98", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IWETH98.__constructor__, ())) + _name: "WETH98", _args: DeployUtils.encodeConstructor(abi.encodeCall(IWETH98.__constructor__, ())) }) ); alice = makeAddr("alice"); diff --git a/packages/contracts-bedrock/test/vendor/Initializable.t.sol b/packages/contracts-bedrock/test/vendor/Initializable.t.sol index eafb97663b3..8aff79bc29d 100644 --- a/packages/contracts-bedrock/test/vendor/Initializable.t.sol +++ b/packages/contracts-bedrock/test/vendor/Initializable.t.sol @@ -361,7 +361,9 @@ contract Initializer_Test is CommonTest { InitializeableContract({ name: "ETHLockboxImpl", target: EIP1967Helper.getImplementation(address(ethLockbox)), - initCalldata: abi.encodeCall(ethLockbox.initialize, (ISystemConfig(address(0)), new IOptimismPortal2[](0))) + initCalldata: abi.encodeCall( + ethLockbox.initialize, (ISystemConfig(address(0)), new IOptimismPortal2[](0)) + ) }) ); @@ -370,7 +372,9 @@ contract Initializer_Test is CommonTest { InitializeableContract({ name: "ETHLockboxProxy", target: address(ethLockbox), - initCalldata: abi.encodeCall(ethLockbox.initialize, (ISystemConfig(address(0)), new IOptimismPortal2[](0))) + initCalldata: abi.encodeCall( + ethLockbox.initialize, (ISystemConfig(address(0)), new IOptimismPortal2[](0)) + ) }) ); } diff --git a/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol b/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol index c8077d79b04..e2bca8dffef 100644 --- a/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol +++ b/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol @@ -47,7 +47,9 @@ contract InitializerOZv5_Test is Test { target: address( DeployUtils.create1({ _name: "OptimismSuperchainERC20", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IOptimismSuperchainERC20.__constructor__, ())) + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IOptimismSuperchainERC20.__constructor__, ()) + ) }) ), initCalldata: abi.encodeCall(IOptimismSuperchainERC20.initialize, (address(0), "", "", 18)) From 42c1e13166a5a3ce6622bd16fee8873cce58ccfb Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Fri, 23 Jan 2026 14:42:10 +0100 Subject: [PATCH 2/7] update op-deployer foundry checksum and fix semgrep-test-validity-check --- ...es.sol-safety-no-immutable-variables.t.sol | 2 +- ....sol-style-ban-forge-std-test-import.t.sol | 14 +++--- .semgrep/tests/sol-rules.t.sol | 46 +++++++++---------- op-deployer/pkg/deployer/forge/version.json | 14 +++--- packages/contracts-bedrock/checks.yaml | 2 +- packages/contracts-bedrock/justfile | 5 +- 6 files changed, 40 insertions(+), 43 deletions(-) diff --git a/.semgrep/tests/sol-rules.sol-safety-no-immutable-variables.t.sol b/.semgrep/tests/sol-rules.sol-safety-no-immutable-variables.t.sol index 00486511d5b..620447730db 100644 --- a/.semgrep/tests/sol-rules.sol-safety-no-immutable-variables.t.sol +++ b/.semgrep/tests/sol-rules.sol-safety-no-immutable-variables.t.sol @@ -19,4 +19,4 @@ contract SemgrepTest__sol_safety_no_immutable_variables { // ok: sol-safety-no-immutable-variables uint256 constant constantVar = 1; -} \ No newline at end of file +} diff --git a/.semgrep/tests/sol-rules.sol-style-ban-forge-std-test-import.t.sol b/.semgrep/tests/sol-rules.sol-style-ban-forge-std-test-import.t.sol index 58f6f19357e..56d2be3ea44 100644 --- a/.semgrep/tests/sol-rules.sol-style-ban-forge-std-test-import.t.sol +++ b/.semgrep/tests/sol-rules.sol-style-ban-forge-std-test-import.t.sol @@ -1,20 +1,20 @@ // ruleid: sol-style-ban-forge-std-test-import -import { Test } from "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; // ruleid: sol-style-ban-forge-std-test-import -import { Test as ForgeTest } from "forge-std/Test.sol"; +import {Test as ForgeTest} from "forge-std/Test.sol"; // ruleid: sol-style-ban-forge-std-test-import -import { Test, Vm } from "forge-std/Test.sol"; +import {Test, Vm} from "forge-std/Test.sol"; // ok: sol-style-ban-forge-std-test-import -import { Test } from "test/setup/Test.sol"; +import {Test} from "test/setup/Test.sol"; // ok: sol-style-ban-forge-std-test-import -import { Test as BaseTest } from "test/setup/Test.sol"; +import {Test as BaseTest} from "test/setup/Test.sol"; // ok: sol-style-ban-forge-std-test-import -import { Vm } from "forge-std/Vm.sol"; +import {Vm} from "forge-std/Vm.sol"; // ok: sol-style-ban-forge-std-test-import -import { StdUtils } from "forge-std/StdUtils.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; diff --git a/.semgrep/tests/sol-rules.t.sol b/.semgrep/tests/sol-rules.t.sol index 9d0179318c9..45f614a4b2c 100644 --- a/.semgrep/tests/sol-rules.t.sol +++ b/.semgrep/tests/sol-rules.t.sol @@ -9,22 +9,22 @@ /// begin SemgrepTest__sol-style-no-bare-imports // ok: sol-style-no-bare-imports -import { SomeStruct } from "some-library.sol"; +import {SomeStruct} from "some-library.sol"; // ok: sol-style-no-bare-imports -import { SomeStruct, AnotherThing } from "some-library.sol"; +import {SomeStruct, AnotherThing} from "some-library.sol"; // ok: sol-style-no-bare-imports -import { SomeStruct as SomeOtherStruct } from "some-library.sol"; +import {SomeStruct as SomeOtherStruct} from "some-library.sol"; // ok: sol-style-no-bare-imports -import { SomeStruct as SomeOtherStruct, AnotherThing as AnotherOtherThing } from "some-library.sol"; +import {SomeStruct as SomeOtherStruct, AnotherThing as AnotherOtherThing} from "some-library.sol"; // ok: sol-style-no-bare-imports -import { SomeStruct as SomeOtherStruct, AnotherThing } from "some-library.sol"; +import {SomeStruct as SomeOtherStruct, AnotherThing} from "some-library.sol"; // ok: sol-style-no-bare-imports -import { AnotherThing, SomeStruct as SomeOtherStruct } from "some-library.sol"; +import {AnotherThing, SomeStruct as SomeOtherStruct} from "some-library.sol"; // ruleid: sol-style-no-bare-imports import "some-library.sol"; @@ -34,13 +34,11 @@ contract SemgrepTest__sol_safety_deployutils_args { function test() { // ruleid: sol-safety-deployutils-args DeployUtils.create1AndSave({ - _save: this, - _name: "SuperchainConfig", - _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()) + _save: this, _name: "SuperchainConfig", _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()) }); // ruleid: sol-safety-deployutils-args - DeployUtils.create1({ _name: "SuperchainConfig", _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()) }); + DeployUtils.create1({_name: "SuperchainConfig", _args: abi.encodeCall(ISuperchainConfig.__constructor__, ())}); // ruleid: sol-safety-deployutils-args DeployUtils.create2AndSave({ @@ -52,16 +50,12 @@ contract SemgrepTest__sol_safety_deployutils_args { // ruleid: sol-safety-deployutils-args DeployUtils.create2({ - _salt: _implSalt(), - _name: "SuperchainConfig", - _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()) + _salt: _implSalt(), _name: "SuperchainConfig", _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()) }); // ruleid: sol-safety-deployutils-args DeployUtils.createDeterministic({ - _name: "SuperchainConfig", - _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()), - _salt: _implSalt() + _name: "SuperchainConfig", _args: abi.encodeCall(ISuperchainConfig.__constructor__, ()), _salt: _implSalt() }); // ok: sol-safety-deployutils-args @@ -140,7 +134,7 @@ contract SemgrepTest__sol_safety_deployutils_named_args_parameter { ); // ruleid: sol-safety-deployutils-named-args-parameter - DeployUtils.create1({ _save: _args, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy" }); + DeployUtils.create1({_save: _args, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy"}); // ruleid: sol-safety-deployutils-named-args-parameter DeployUtils.createDeterministic( @@ -148,16 +142,16 @@ contract SemgrepTest__sol_safety_deployutils_named_args_parameter { ); // ruleid: sol-safety-deployutils-named-args-parameter - DeployUtils.create1AndSave({ _save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy" }); + DeployUtils.create1AndSave({_save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy"}); // ruleid: sol-safety-deployutils-named-args-parameter - DeployUtils.create1({ _save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy" }); + DeployUtils.create1({_save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy"}); // ruleid: sol-safety-deployutils-named-args-parameter - DeployUtils.create2AndSave({ _save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy" }); + DeployUtils.create2AndSave({_save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy"}); // ruleid: sol-safety-deployutils-named-args-parameter - DeployUtils.create2({ _save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy" }); + DeployUtils.create2({_save: this, _name: "Proxy", _nick: "DataAvailabilityChallengeProxy"}); // ok: sol-safety-deployutils-named-args-parameter DeployUtils.create1AndSave({ @@ -699,15 +693,17 @@ contract SemgrepTest__sol_safety_try_catch_eip_150 { // ok: sol-safety-trycatch-eip150 // eip150-safe try someContract.someFunction() { - // ... - } catch { + // ... + } + catch { // ... } // ruleid: sol-safety-trycatch-eip150 try someContract.someFunction() { - // ... - } catch { + // ... + } + catch { // ... } } diff --git a/op-deployer/pkg/deployer/forge/version.json b/op-deployer/pkg/deployer/forge/version.json index aa37fd4c5e2..753c6204a90 100644 --- a/op-deployer/pkg/deployer/forge/version.json +++ b/op-deployer/pkg/deployer/forge/version.json @@ -1,11 +1,11 @@ { - "forge": "v1.2.3", + "forge": "v1.4.3", "checksums": { - "darwin_amd64": "e3e2b425c7e1b8c853ed454276b20ff500fa82d65cc95acad225b4b7063add4a", - "darwin_arm64": "a3f3f1417a7a02a16942e9fc86418d0121c2d904c113feb1b26c9d69dc6f287d", - "linux_amd64": "8202f38f1635c2793b2d1a4fe443ae6f7315190dc6eed219d7969a40ab78a286", - "linux_arm64": "70612fd1da9df3a8b35484214e4f2b37ba1d6c41150849490642d7a053c31eaa", - "alpine_amd64": "015180571c79ce7664717768db2f35e878e6ad98a883750547897420c3a2c461", - "alpine_arm64": "c40f4786bde394514c1074390a477b7de9574e7c95561ca4b03b275de3f13c17" + "darwin_amd64": "4435ea9b063a6f3952de5b1744d03047fff9657afadd9183196c11224ca3af1d", + "darwin_arm64": "4adb4b0a8c5c4a40fa9450b1b87d748d591af7ea0617f514da808bd529098adc", + "linux_amd64": "325ba04dc5cb41c110723b00ac291f8269f8cd785028299aad8252ef980961a7", + "linux_arm64": "209492cb4ebd723d9eac002fa30f41f53c8810105b67d3c32fe8201cf70f89d4", + "alpine_amd64": "2992bccc4de49e604051baba0addbbdeb4d41fdbfba1a1e95db70f713153d765", + "alpine_arm64": "a06a81711ff791a44d0be9d0419ce3d5b4bcdf08394a4738881e22a9573b69a7" } } diff --git a/packages/contracts-bedrock/checks.yaml b/packages/contracts-bedrock/checks.yaml index b448c0778dc..33641c0f24a 100644 --- a/packages/contracts-bedrock/checks.yaml +++ b/packages/contracts-bedrock/checks.yaml @@ -37,7 +37,7 @@ phases: command: cd ../../ && semgrep scan --error --config .semgrep/rules/ ./packages/contracts-bedrock - name: semgrep-test-validity description: Check semgrep tests are valid - command: forge fmt ../../.semgrep/tests/sol-rules.t.sol --check + command: cd ../../ && forge fmt .semgrep/tests --check - name: deploy-configs description: Validate deploy configurations command: ./scripts/checks/check-deploy-configs.sh diff --git a/packages/contracts-bedrock/justfile b/packages/contracts-bedrock/justfile index 17c792aaca1..61d3651aab4 100644 --- a/packages/contracts-bedrock/justfile +++ b/packages/contracts-bedrock/justfile @@ -292,7 +292,7 @@ semver-diff-check: build semver-diff-check-no-build # Checks that the semgrep tests are valid. semgrep-test-validity-check: - forge fmt ../../.semgrep/tests/sol-rules.t.sol --check + cd ../../ && forge fmt .semgrep/tests --check # Validates forge test conventions and structure. Does not build contracts. lint-forge-tests-check-no-build: @@ -357,7 +357,8 @@ semgrep-test: # Runs all checks. check: - @just semgrep \ + @just semgrep-test-validity-check \ + semgrep \ lint-check \ snapshots-check-no-build \ unused-imports-check-no-build \ From a8ec85f68fd39ae369074c59b3182acdd4e3af70 Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Fri, 23 Jan 2026 17:32:06 +0100 Subject: [PATCH 3/7] fix op-deployer foundry, semgrep, tests, etc --- .semgrep/tests/sol-rules.t.sol | 12 +- .../OPContractsManagerStandardValidator.sol | 2 +- .../test/L2/CrossL2Inbox.t.sol | 9 +- .../proofs/utils/DeploymentSummary.sol | 1118 ++++++++++++++++- .../proofs/utils/DeploymentSummaryCode.sol | 100 +- .../scripts/make-summary-deployment.sh | 4 +- .../test/libraries/SafeCall.t.sol | 20 +- 7 files changed, 1229 insertions(+), 36 deletions(-) diff --git a/.semgrep/tests/sol-rules.t.sol b/.semgrep/tests/sol-rules.t.sol index 45f614a4b2c..b90aeeab4b1 100644 --- a/.semgrep/tests/sol-rules.t.sol +++ b/.semgrep/tests/sol-rules.t.sol @@ -690,22 +690,22 @@ contract SemgrepTest__sol_style_enforce_require_msg { contract SemgrepTest__sol_safety_try_catch_eip_150 { function test() { + /// forgefmt: disable-start // ok: sol-safety-trycatch-eip150 // eip150-safe try someContract.someFunction() { - // ... - } - catch { + // ... + } catch { // ... } // ruleid: sol-safety-trycatch-eip150 try someContract.someFunction() { - // ... - } - catch { + // ... + } catch { // ... } + /// forgefmt: disable-end } } diff --git a/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol b/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol index 3fc98d7a4d0..b2644ade37a 100644 --- a/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol +++ b/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol @@ -229,7 +229,7 @@ contract OPContractsManagerStandardValidator is ISemver { /// @notice Returns the expected PreimageOracle version. function preimageOracleVersion() public pure returns (string memory) { - return "1.1.4"; + return "1.1.5"; } /// @notice Internal function to get version from any contract implementing ISemver. diff --git a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol index 3ff49ff581a..496536031bf 100644 --- a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol +++ b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol @@ -166,6 +166,7 @@ contract CrossL2Inbox_ValidateMessage_Test is CrossL2Inbox_TestInit { vm.expectRevert(ICrossL2Inbox.NotInAccessList.selector); vm.accessList(accessList); crossL2Inbox.validateMessage(_idOne, _messageHashOne); + vm.noAccessList(); // Send the tx2 but without any access list and check that it reverts since the slot should not be warmed vm.expectRevert(ICrossL2Inbox.NotInAccessList.selector); @@ -175,12 +176,7 @@ contract CrossL2Inbox_ValidateMessage_Test is CrossL2Inbox_TestInit { /// @notice Test that a valid tx calling `validateMessage` doesn't warm the slot for the next /// one. /// forge-config: default.isolate = true - function test_validateMessage_validDoesntWarm_reverts( - Identifier memory _id, - bytes32 _messageHash - ) - external - { + function test_validateMessage_validDoesntWarm_reverts(Identifier memory _id, bytes32 _messageHash) external { // Bound values types to ensure they are not too large _id.blockNumber = bound(_id.blockNumber, 0, type(uint64).max); _id.logIndex = bound(_id.logIndex, 0, type(uint32).max); @@ -200,6 +196,7 @@ contract CrossL2Inbox_ValidateMessage_Test is CrossL2Inbox_TestInit { // Validate the message vm.accessList(accessList); crossL2Inbox.validateMessage(_id, _messageHash); + vm.noAccessList(); // Send the same msg but without any access list and check that it reverts since the // slot should not be warmed diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol index ae16357d728..621cba1de69 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol @@ -8,14 +8,1120 @@ import { Vm } from "forge-std/Vm.sol"; import { DeploymentSummaryCode } from "./DeploymentSummaryCode.sol"; contract DeploymentSummary is DeploymentSummaryCode { + // Test contract address, 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 + address private constant FOUNDRY_TEST_ADDRESS = 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496; // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm private constant vm = Vm(VM_ADDRESS); - // Addresses required for compilation to work. - address l1CrossDomainMessengerProxyAddress; - address superchainConfigProxyAddress; - address l1ERC721BridgeProxyAddress; - address l1StandardBridgeProxyAddress; - address optimismPortalProxyAddress; + address internal constant addressManagerAddress = 0xD7C8F982D3046421e3865F94004dca5D6142D9AE; + address internal constant anchorStateRegistryProxyAddress = 0x70E5a9b91ef26C70E6F5D9576133dD232a86D75E; + address internal constant delayedWETHImplAddress = 0x33Dadc2d1aA9BB613A7AE6B28425eA00D44c6998; + address internal constant delayedWETHProxyAddress = 0x4a008893b348986DFCfb875Fe62e45Fd9f683142; + address internal constant disputeGameFactoryProxyAddress = 0x7b47157a2B688900b19Ee8f32129E1A032Df4538; + address internal constant eTHLockboxProxyAddress = 0x7163DF3b04d259eaCD820740E2F84e5fb9E69419; + address internal constant l1CrossDomainMessengerProxyAddress = 0x170315d0792cFcb97c096C20bB78e8B3F6004f74; + address internal constant l1ERC721BridgeProxyAddress = 0x8c8Cb1491de8E27427e2fbfd00cA091196a3D8fd; + address internal constant l1StandardBridgeProxyAddress = 0x415f79B5a2Cd916F24f112bFFadE3cDD5CA90610; + address internal constant mipsSingletonAddress = 0xaCc005DCd857B401e4732E6F7837135A22825cfA; + address internal constant oPContractsManagerAddress = 0xC46652b373bA85D829a53a74f78b54F047c8209A; + address internal constant optimismMintableERC20FactoryProxyAddress = 0x7f3FEE1c10a2607E24433c1C6474277Befb3CCF2; + address internal constant optimismPortalProxyAddress = 0xC386dEC86d0d4c3a908B4fBf788b666f20eF20dF; + address internal constant permissionedDelayedWETHProxyAddress = 0xbc00a6a65C2C3ccBB1C6647E266cfdE6f5103f07; + address internal constant permissionedDisputeGameAddress = 0xe1dFFCBE4e22B813F26d2106D943C102e7cAb87e; + address internal constant preimageOracleAddress = 0x1E1d73536A081Ef2F355d29794547a9770Aeb1E0; + address internal constant protocolVersionsImplAddress = 0x15f5edb697F980b637470AE92ba12d9EFc72A26b; + address internal constant protocolVersionsProxyAddress = 0x856e75e9c0Da547F9753c17746D6cc139b668e5c; + address internal constant proxyAdminAddress = 0xc3C08D9b183a7EEa2e9DCbc17764D502bB22aBf1; + address internal constant superchainConfigImplAddress = 0xb08Cc720F511062537ca78BdB0AE691F04F5a957; + address internal constant superchainConfigProxyAddress = 0xDc82c0362A241Aa94d53546648EACe48C9773dAa; + address internal constant superchainProxyAdminAddress = 0xdaE97900D4B184c5D2012dcdB658c008966466DD; + address internal constant systemConfigProxyAddress = 0xcfFa31d1926A1e4bfA3c2A335A28544708D2753E; + address internal constant acc23Address = 0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141; + address internal constant acc24Address = 0x36AE6478b51dafc694d56394478343C7EcfEDFb1; + address internal constant acc25Address = 0xdad56314AbA81676e2d5826fb72B2168141c0A60; + address internal constant acc26Address = 0x83A2dF4B23236DCCc59a67d289Cd5163190213ea; + address internal constant acc27Address = 0x59D497530b00062f40950ba8EaB88868bf7F86f0; + address internal constant acc28Address = 0x9F164f1d02A81e06D639E55F65a87f0070E3Cb2e; + address internal constant acc29Address = 0x6b46FCAd8279829b6E5Ba69FfD7BF210C0bf568c; + address internal constant acc30Address = 0x8ee6fB13c6c9a7e401531168E196Fbf8b05cEabB; + address internal constant acc31Address = 0xbD5A941bD30EA2438B5957660adbe1eD427993eF; + address internal constant acc32Address = 0xed8fb0c36658458D33cE07e5E00AF138874fDd3d; + address internal constant acc33Address = 0x784d2F03593A42A6E4676A012762F18775ecbBe6; + address internal constant acc34Address = 0x16622ea0ce0eA05c5B7B050AC7c5d0d2eE4F557E; + address internal constant acc35Address = 0x01347e02CDB6a7cAAeAfB8e277E4b42Aa4Bd7dF1; + address internal constant acc36Address = 0xfAEde1fA7Cb0a650393D5FdCa823e83Db3C9763e; + address internal constant acc37Address = 0x2476c911E6D4D9411E677D8Faf15a64ac1fDEEe8; + address internal constant acc38Address = 0x765c6637a370595845F637739279C353484a26A6; + address internal constant acc39Address = 0xA643EA8ee60D92f615eC70AF0248c449bBCEcF4d; + address internal constant acc40Address = 0x2Fa0D0f6d92061344Db35132379dB419bD1c56f7; + address internal constant acc41Address = 0xA5d36DEaf2267B267278a4a1458deFe0d65620eb; + address internal constant acc42Address = 0x7096758bDD076a4cC42255c278F2Cb216D6D8ce3; + address internal constant acc43Address = 0x15dDc82A2AAA23D6f631dec6a61949CB5cBF272b; + address internal constant acc44Address = 0x50E6088d25b5d7f41548D99F39Ba1c21bD4cE999; + address internal constant acc45Address = 0x1d4F0EF0eFD3Aad2B687353108667E7bD3B53bDf; + address internal constant acc46Address = 0xbd793b2B8eCa7735FfCF813c7a364e124d6EdDec; + address internal constant acc47Address = 0x470D27d713C38cB156701E6686F31e259a66aB3e; + address internal constant acc48Address = 0xAe7945920ED1C49579Aa3bfD50b11C1cd06545c9; + + function recreateState() public { + bytes32 slot; + bytes32 value; + vm.etch(acc23Address, acc23Code); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"0000000000000000000000000000000000000000000000000000000000010001"; + vm.store(acc23Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"89fca2352a158519d2daabf7e53686272e828ddbff9487204546d918490b2ecf"; + vm.store(acc23Address, slot, value); + vm.etch(superchainProxyAdminAddress, superchainProxyAdminCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000005b73c5498c1e3b4dba84de0f1833c4a029d90519"; + vm.store(superchainProxyAdminAddress, slot, value); + vm.etch(superchainConfigImplAddress, superchainConfigImplCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(superchainConfigImplAddress, slot, value); + vm.etch(protocolVersionsImplAddress, protocolVersionsImplCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(protocolVersionsImplAddress, slot, value); + vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000102"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0102"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0002"; + vm.store(superchainConfigProxyAddress, slot, value); + vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"e314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(superchainProxyAdminAddress, slot, value); + slot = hex"24b65a6f94e32e259509ee2e63dc87d4fcbf36618c0b8609629e310e9a3fd0d5"; + value = hex"5375706572636861696e50726f787941646d696e000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"24b65a6f94e32e259509ee2e63dc87d4fcbf36618c0b8609629e310e9a3fd0d6"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6"; + value = hex"5375706572636861696e50726f787941646d696e000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(acc24Address, slot, value); + slot = hex"591eccd4639f012ad8640a57d585dea9e277ac0640d959411a3ae106d20f3f84"; + value = hex"5375706572636861696e436f6e66696750726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"591eccd4639f012ad8640a57d585dea9e277ac0640d959411a3ae106d20f3f85"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000002"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8"; + value = hex"5375706572636861696e436f6e66696750726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(acc24Address, slot, value); + slot = hex"59a10b4dcbfb6ed449f532fedb1613a8048a04e68786a4fbd792e30f8d5996c2"; + value = hex"5375706572636861696e436f6e666967496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"59a10b4dcbfb6ed449f532fedb1613a8048a04e68786a4fbd792e30f8d5996c3"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa"; + value = hex"5375706572636861696e436f6e666967496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfb"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(acc24Address, slot, value); + slot = hex"4d64f9a7b7f12fbbc6661e5cac85a76d68f9b9df6c166dbdb20968c4898cea2f"; + value = hex"50726f746f636f6c56657273696f6e7350726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"4d64f9a7b7f12fbbc6661e5cac85a76d68f9b9df6c166dbdb20968c4898cea30"; + value = hex"000000000000000000000000856e75e9c0da547f9753c17746d6cc139b668e5c"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000004"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfc"; + value = hex"50726f746f636f6c56657273696f6e7350726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfd"; + value = hex"000000000000000000000000856e75e9c0da547f9753c17746d6cc139b668e5c"; + vm.store(acc24Address, slot, value); + slot = hex"15ef12e33baecb5fcf038017416c0c7a250c3264d4209492a6155f738516695b"; + value = hex"50726f746f636f6c56657273696f6e73496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"15ef12e33baecb5fcf038017416c0c7a250c3264d4209492a6155f738516695c"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000005"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfe"; + value = hex"50726f746f636f6c56657273696f6e73496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cff"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(acc24Address, slot, value); + vm.etch(acc25Address, acc25Code); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"0000000000000000000000000000000000000000000000000000000000010001"; + vm.store(acc25Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"89fca2352a158519d2daabf7e53686272e828ddbff9487204546d918490b2ecf"; + vm.store(acc25Address, slot, value); + vm.etch(acc26Address, acc26Code); + slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; + value = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + vm.store(acc26Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc26Address, slot, value); + vm.etch(acc27Address, acc27Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000ff0000000000000000000000000000000000000000"; + vm.store(acc27Address, slot, value); + vm.etch(acc28Address, acc28Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc28Address, slot, value); + vm.etch(acc29Address, acc29Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc29Address, slot, value); + vm.etch(acc30Address, acc30Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc30Address, slot, value); + vm.etch(acc31Address, acc31Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc31Address, slot, value); + vm.etch(acc32Address, acc32Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc32Address, slot, value); + vm.etch(acc33Address, acc33Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc33Address, slot, value); + vm.etch(delayedWETHImplAddress, delayedWETHImplCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(delayedWETHImplAddress, slot, value); + vm.etch(preimageOracleAddress, preimageOracleCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000e"; + value = hex"f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000f"; + value = hex"3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000010"; + value = hex"c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000011"; + value = hex"5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000012"; + value = hex"da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2"; + vm.store(preimageOracleAddress, slot, value); + vm.etch(mipsSingletonAddress, mipsSingletonCode); + vm.etch(acc34Address, acc34Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc34Address, slot, value); + vm.etch(acc35Address, acc35Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc35Address, slot, value); + vm.etch(acc36Address, acc36Code); + vm.etch(permissionedDisputeGameAddress, permissionedDisputeGameCode); + vm.etch(acc37Address, acc37Code); + vm.etch(acc38Address, acc38Code); + vm.etch(acc39Address, acc39Code); + vm.etch(acc40Address, acc40Code); + vm.etch(acc41Address, acc41Code); + vm.etch(acc42Address, acc42Code); + vm.etch(acc43Address, acc43Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000000000765c6637a370595845f637739279c353484a26a6"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000a643ea8ee60d92f615ec70af0248c449bbcecf4d"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000002fa0d0f6d92061344db35132379db419bd1c56f7"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"000000000000000000000000a5d36deaf2267b267278a4a1458defe0d65620eb"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000007096758bdd076a4cc42255c278f2cb216d6d8ce3"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"0000000000000000000000009f164f1d02a81e06d639e55f65a87f0070e3cb2e"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"000000000000000000000000bd5a941bd30ea2438b5957660adbe1ed427993ef"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"000000000000000000000000ed8fb0c36658458d33ce07e5e00af138874fdd3d"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"000000000000000000000000784d2f03593a42a6e4676a012762f18775ecbbe6"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"00000000000000000000000083a2df4b23236dccc59a67d289cd5163190213ea"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"0000000000000000000000008ee6fb13c6c9a7e401531168e196fbf8b05ceabb"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"00000000000000000000000059d497530b00062f40950ba8eab88868bf7f86f0"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000e"; + value = hex"0000000000000000000000006b46fcad8279829b6e5ba69ffd7bf210c0bf568c"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000f"; + value = hex"00000000000000000000000016622ea0ce0ea05c5b7b050ac7c5d0d2ee4f557e"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000010"; + value = hex"00000000000000000000000001347e02cdb6a7caaeafb8e277e4b42aa4bd7df1"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000011"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000012"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000013"; + value = hex"000000000000000000000000faede1fa7cb0a650393d5fdca823e83db3c9763e"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000014"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc43Address, slot, value); + vm.etch(acc44Address, acc44Code); + vm.etch(acc45Address, acc45Code); + vm.etch(acc46Address, acc46Code); + vm.etch(acc47Address, acc47Code); + vm.etch(acc48Address, acc48Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000009ba6e03d8b90de867373db8cf1a58d2f7f006b3a"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"0000000000000000000000000000000000000000000000000000000000049d40"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000009f164f1d02a81e06d639e55f65a87f0070e3cb2e"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000bd5a941bd30ea2438b5957660adbe1ed427993ef"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"000000000000000000000000ed8fb0c36658458d33ce07e5e00af138874fdd3d"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"000000000000000000000000784d2f03593a42a6e4676a012762f18775ecbbe6"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"00000000000000000000000083a2df4b23236dccc59a67d289cd5163190213ea"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"0000000000000000000000008ee6fb13c6c9a7e401531168e196fbf8b05ceabb"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"00000000000000000000000059d497530b00062f40950ba8eab88868bf7f86f0"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"0000000000000000000000006b46fcad8279829b6e5ba69ffd7bf210c0bf568c"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"00000000000000000000000016622ea0ce0ea05c5b7b050ac7c5d0d2ee4f557e"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"00000000000000000000000001347e02cdb6a7caaeafb8e277e4b42aa4bd7df1"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000e"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000f"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000010"; + value = hex"000000000000000000000000faede1fa7cb0a650393d5fdca823e83db3c9763e"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000011"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc48Address, slot, value); + vm.etch(oPContractsManagerAddress, oPContractsManagerCode); + slot = hex"3179a0ca1decdc6d32acfd94d2e8f02773d53221a36b0601c73ccf869885fd4a"; + value = hex"4d69707353696e676c65746f6e0000000000000000000000000000000000001a"; + vm.store(acc24Address, slot, value); + slot = hex"3179a0ca1decdc6d32acfd94d2e8f02773d53221a36b0601c73ccf869885fd4b"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000006"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d00"; + value = hex"4d69707353696e676c65746f6e0000000000000000000000000000000000001a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d01"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc24Address, slot, value); + slot = hex"f586326a6f1afdf1a636f2ea023473af4bd79fefd4568d11d98c4859835b608d"; + value = hex"4f50436f6e7472616374734d616e616765720000000000000000000000000024"; + vm.store(acc24Address, slot, value); + slot = hex"f586326a6f1afdf1a636f2ea023473af4bd79fefd4568d11d98c4859835b608e"; + value = hex"000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000007"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d02"; + value = hex"4f50436f6e7472616374734d616e616765720000000000000000000000000024"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d03"; + value = hex"000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a"; + vm.store(acc24Address, slot, value); + slot = hex"763d0244a224d2fe2f7afc03ef2a0f29c2623e29cf918c8ea4f8f001f1e9f270"; + value = hex"44656c6179656457455448496d706c000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"763d0244a224d2fe2f7afc03ef2a0f29c2623e29cf918c8ea4f8f001f1e9f271"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000008"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d04"; + value = hex"44656c6179656457455448496d706c000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d05"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc24Address, slot, value); + slot = hex"81a67250c04810b4a94bf59594aa24659b3142b00d4efc51b42543c27a7080e2"; + value = hex"507265696d6167654f7261636c6500000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"81a67250c04810b4a94bf59594aa24659b3142b00d4efc51b42543c27a7080e3"; + value = hex"0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e0"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000009"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d06"; + value = hex"507265696d6167654f7261636c6500000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d07"; + value = hex"0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e0"; + vm.store(acc24Address, slot, value); + slot = hex"04e885518edc9038cab70e8d01c71a66bb227510061876ec8fcedf9d2cce258b"; + value = hex"5065726d697373696f6e65644469737075746547616d6500000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"04e885518edc9038cab70e8d01c71a66bb227510061876ec8fcedf9d2cce258c"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d08"; + value = hex"5065726d697373696f6e65644469737075746547616d6500000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d09"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc24Address, slot, value); + vm.etch(addressManagerAddress, addressManagerCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf"; + vm.store(addressManagerAddress, slot, value); + vm.etch(proxyAdminAddress, proxyAdminCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(addressManagerAddress, slot, value); + vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(optimismPortalProxyAddress, slot, value); + vm.etch(eTHLockboxProxyAddress, eTHLockboxProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(eTHLockboxProxyAddress, slot, value); + vm.etch(systemConfigProxyAddress, systemConfigProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(systemConfigProxyAddress, slot, value); + vm.etch(optimismMintableERC20FactoryProxyAddress, optimismMintableERC20FactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"d5538c794ce822f6578b51c514c1b5ad06a97c668cc0ea8b0d07e819badefe30"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(proxyAdminAddress, slot, value); + vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); + slot = hex"5c7ab8a0ff7087593461c3ba36cab4ce7c54b6c55334a7423a6e51d3606241f0"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"5ef907e431434b7fd9a5cf449bcbee1a430332ea5c05c55046fdd83dd8f57e1d"; + value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"5c7ab8a0ff7087593461c3ba36cab4ce7c54b6c55334a7423a6e51d3606241f0"; + value = hex"0000000000000000000000000000000000000000000000000000000000000002"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"891a9c7123617dc64d16604163be207a669607334ef9a2d03e53cfcdb82236d1"; + value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; + vm.store(proxyAdminAddress, slot, value); + vm.etch(permissionedDelayedWETHProxyAddress, permissionedDelayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000009f164f1d02a81e06d639e55f65a87f0070e3cb2e"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000004200000000000000000000000000000000000014"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000083a2df4b23236dccc59a67d289cd5163190213ea"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000067"; + value = hex"0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"00000000000000000000000000000000000c5fc5000005580000000000000000"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000066"; + value = hex"010000000000000000000000000000000000000000000000000c5fc500000558"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"00000000000000000000000000000000000c5fc50000055800000000017d7840"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597"; + value = hex"00000000000000000000000000289c189bee4e70334629f04cd5ed602b6600eb"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; + value = hex"0000000000000000000000008c8cb1491de8e27427e2fbfd00ca091196a3d8fd"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"a04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"; + value = hex"0000000000000000000000007f3fee1c10a2607e24433c1c6474277befb3ccf2"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000069"; + value = hex"0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000006b"; + value = hex"0000000000000000000000000000000000000000000000000000000000000385"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000006c"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000bd5a941bd30ea2438b5957660adbe1ed427993ef"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000003e"; + value = hex"00000000000000000000000070e5a9b91ef26c70e6f5d9576133dd232a86d75e"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000100000000000000000000000000000000000000003b9aca00"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000784d2f03593a42a6e4676a012762f18775ecbbe6"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0101"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"d978247ca0ca005a84d2c405b59bb67f19596a91cd35fed7e4f281becc4fbd9e"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0001"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000008ee6fb13c6c9a7e401531168e196fbf8b05ceabb"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"; + value = hex"00000000000000000000000059d497530b00062f40950ba8eab88868bf7f86f0"; + vm.store(addressManagerAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000001030000000000000000000000000000000000000000"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000fe"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000cf"; + value = hex"0000000000000000000000004200000000000000000000000000000000000007"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000030000000000000000000000000000000000000000"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000006b46fcad8279829b6e5ba69ffd7bf210c0bf568c"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000034"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000004200000000000000000000000000000000000010"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000016622ea0ce0ea05c5b7b050ac7c5d0d2ee4f557e"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa7d"; + value = hex"acc005dcd857b401e4732e6f7837135a22825cfa70e5a9b91ef26c70e6f5d957"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa7e"; + value = hex"6133dd232a86d75ebc00a6a65c2c3ccbb1c6647e266cfde6f5103f0700000000"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa7f"; + value = hex"0000000000000000000000000000000000000000000000000000038570997970"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa80"; + value = hex"c51812dc3a010c7d01b50e0d17dc79c89ba6e03d8b90de867373db8cf1a58d2f"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa81"; + value = hex"7f006b3a00000000000000000000000000000000000000000000000000000000"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"c073f36c05b6a60b24c30a48974b549770d8fa354751fb3170c9dfd8ca536add"; + value = hex"0000000000000000000000000000000000000000000000000000000000000149"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000001347e02cdb6a7caaeafb8e277e4b42aa4bd7df1"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0101"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000007b47157a2b688900b19ee8f32129e1a032df4538"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000100000001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"4db57451e2a8fd1712043520adfae22d5f9123e7cdc211ef2ea3c2f9f9432973"; + value = hex"50726f787941646d696e00000000000000000000000000000000000000000014"; + vm.store(acc24Address, slot, value); + slot = hex"4db57451e2a8fd1712043520adfae22d5f9123e7cdc211ef2ea3c2f9f9432974"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000b"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0a"; + value = hex"50726f787941646d696e00000000000000000000000000000000000000000014"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0b"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(acc24Address, slot, value); + slot = hex"00623c73290f616137607214ed44adf88e2053b38076d1558bab870c725fb370"; + value = hex"416464726573734d616e6167657200000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"00623c73290f616137607214ed44adf88e2053b38076d1558bab870c725fb371"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000c"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0c"; + value = hex"416464726573734d616e6167657200000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0d"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(acc24Address, slot, value); + slot = hex"b11fe4393d0477ff7d66a7c8fbc34405cdc12fe580a2fe06c7aa22f30fcbbff2"; + value = hex"4c3145524337323142726964676550726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"b11fe4393d0477ff7d66a7c8fbc34405cdc12fe580a2fe06c7aa22f30fcbbff3"; + value = hex"0000000000000000000000008c8cb1491de8e27427e2fbfd00ca091196a3d8fd"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000d"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0e"; + value = hex"4c3145524337323142726964676550726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0f"; + value = hex"0000000000000000000000008c8cb1491de8e27427e2fbfd00ca091196a3d8fd"; + vm.store(acc24Address, slot, value); + slot = hex"803db4bb13eb6384a6d480b8b5b2e44b42a6c56fde7615abab2aff349f5b8f97"; + value = hex"53797374656d436f6e66696750726f7879000000000000000000000000000022"; + vm.store(acc24Address, slot, value); + slot = hex"803db4bb13eb6384a6d480b8b5b2e44b42a6c56fde7615abab2aff349f5b8f98"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d10"; + value = hex"53797374656d436f6e66696750726f7879000000000000000000000000000022"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d11"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(acc24Address, slot, value); + slot = hex"e973345d9cd4152a12364c797bf4520ba340cc9a0bc0cd102d97b563669e0bee"; + value = hex"4f7074696d69736d4d696e7461626c654552433230466163746f727950726f78"; + vm.store(acc24Address, slot, value); + slot = hex"e973345d9cd4152a12364c797bf4520ba340cc9a0bc0cd102d97b563669e0bef"; + value = hex"7900000000000000000000000000000000000000000000000000000000000000"; + vm.store(acc24Address, slot, value); + slot = hex"7102cb4490810454919e77f2c535d732744edb7efecdbb0c076b63709e481a95"; + value = hex"0000000000000000000000000000000000000000000000000000000000000043"; + vm.store(acc24Address, slot, value); + slot = hex"7102cb4490810454919e77f2c535d732744edb7efecdbb0c076b63709e481a96"; + value = hex"0000000000000000000000007f3fee1c10a2607e24433c1c6474277befb3ccf2"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000f"; + vm.store(acc24Address, slot, value); + slot = hex"285306a5e178e53755c7321490a9e06978263cea459835e51b2e59fc11dff695"; + value = hex"4f7074696d69736d4d696e7461626c654552433230466163746f727950726f78"; + vm.store(acc24Address, slot, value); + slot = hex"285306a5e178e53755c7321490a9e06978263cea459835e51b2e59fc11dff696"; + value = hex"7900000000000000000000000000000000000000000000000000000000000000"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d12"; + value = hex"0000000000000000000000000000000000000000000000000000000000000043"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d13"; + value = hex"0000000000000000000000007f3fee1c10a2607e24433c1c6474277befb3ccf2"; + vm.store(acc24Address, slot, value); + slot = hex"73dfdd808bf7d29fb129ecf39295db3b0b0e93836c00329ea8af1cc6a784742f"; + value = hex"4c315374616e6461726442726964676550726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"73dfdd808bf7d29fb129ecf39295db3b0b0e93836c00329ea8af1cc6a7847430"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000010"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d14"; + value = hex"4c315374616e6461726442726964676550726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d15"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(acc24Address, slot, value); + slot = hex"03fcfa916057ab121cac44d6c0a435ed5ee381f0635d8b1698c62504e41f4e50"; + value = hex"4c3143726f7373446f6d61696e4d657373656e67657250726f78790000000036"; + vm.store(acc24Address, slot, value); + slot = hex"03fcfa916057ab121cac44d6c0a435ed5ee381f0635d8b1698c62504e41f4e51"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000011"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d16"; + value = hex"4c3143726f7373446f6d61696e4d657373656e67657250726f78790000000036"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d17"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(acc24Address, slot, value); + slot = hex"68926df76953e8b8e08cd96615b5cd7cc3a45a9feeb41b3e06808964497cbee4"; + value = hex"4554484c6f636b626f7850726f7879000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"68926df76953e8b8e08cd96615b5cd7cc3a45a9feeb41b3e06808964497cbee5"; + value = hex"0000000000000000000000007163df3b04d259eacd820740e2f84e5fb9e69419"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000012"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d18"; + value = hex"4554484c6f636b626f7850726f7879000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d19"; + value = hex"0000000000000000000000007163df3b04d259eacd820740e2f84e5fb9e69419"; + vm.store(acc24Address, slot, value); + slot = hex"09f38a27c7957cca3b027811dc616db30165b04891f5d2148b2ef7deac0fc52c"; + value = hex"4469737075746547616d65466163746f727950726f787900000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"09f38a27c7957cca3b027811dc616db30165b04891f5d2148b2ef7deac0fc52d"; + value = hex"0000000000000000000000007b47157a2b688900b19ee8f32129e1a032df4538"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000013"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1a"; + value = hex"4469737075746547616d65466163746f727950726f787900000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1b"; + value = hex"0000000000000000000000007b47157a2b688900b19ee8f32129e1a032df4538"; + vm.store(acc24Address, slot, value); + slot = hex"5fa099aac7d9cc1721a97b45776bcc86b85d0464b4d63954a54b49a6fd7218d7"; + value = hex"5065726d697373696f6e656444656c617965645745544850726f787900000038"; + vm.store(acc24Address, slot, value); + slot = hex"5fa099aac7d9cc1721a97b45776bcc86b85d0464b4d63954a54b49a6fd7218d8"; + value = hex"000000000000000000000000bc00a6a65c2c3ccbb1c6647e266cfde6f5103f07"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000014"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1c"; + value = hex"5065726d697373696f6e656444656c617965645745544850726f787900000038"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1d"; + value = hex"000000000000000000000000bc00a6a65c2c3ccbb1c6647e266cfde6f5103f07"; + vm.store(acc24Address, slot, value); + slot = hex"3ff2c3a4aaefcd5a8f21d8ceeed5e53b3588ab49a0f13d39f472c3d6efc0f77b"; + value = hex"416e63686f725374617465526567697374727950726f78790000000000000030"; + vm.store(acc24Address, slot, value); + slot = hex"3ff2c3a4aaefcd5a8f21d8ceeed5e53b3588ab49a0f13d39f472c3d6efc0f77c"; + value = hex"00000000000000000000000070e5a9b91ef26c70e6f5d9576133dd232a86d75e"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000015"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1e"; + value = hex"416e63686f725374617465526567697374727950726f78790000000000000030"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1f"; + value = hex"00000000000000000000000070e5a9b91ef26c70e6f5d9576133dd232a86d75e"; + vm.store(acc24Address, slot, value); + slot = hex"d2893c711d9d933c61935345c1de77b0227a76ebcba9aa921aa901830025e584"; + value = hex"4f7074696d69736d506f7274616c50726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"d2893c711d9d933c61935345c1de77b0227a76ebcba9aa921aa901830025e585"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000016"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d20"; + value = hex"4f7074696d69736d506f7274616c50726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d21"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + slot = hex"b72ba0f0ef225d34c9541d99d4a5fc750113e9c4dc4b083ce296ccf1ce138a80"; + value = hex"4f7074696d69736d506f7274616c3250726f7879000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b72ba0f0ef225d34c9541d99d4a5fc750113e9c4dc4b083ce296ccf1ce138a81"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000017"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d22"; + value = hex"4f7074696d69736d506f7274616c3250726f7879000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d23"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"daa555fac5e0d2ed3354ca00a81a4ddb8fb8489fcc3164b97d871ee94e62d077"; + value = hex"44656c617965645745544850726f787900000000000000000000000000000020"; + vm.store(acc24Address, slot, value); + slot = hex"daa555fac5e0d2ed3354ca00a81a4ddb8fb8489fcc3164b97d871ee94e62d078"; + value = hex"0000000000000000000000004a008893b348986dfcfb875fe62e45fd9f683142"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000018"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d24"; + value = hex"44656c617965645745544850726f787900000000000000000000000000000020"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d25"; + value = hex"0000000000000000000000004a008893b348986dfcfb875fe62e45fd9f683142"; + vm.store(acc24Address, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000100000000"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + } + + function _notExternalAddress(address user) public pure { + vm.assume(user != FOUNDRY_TEST_ADDRESS); + vm.assume(user != VM_ADDRESS); + vm.assume(user != addressManagerAddress); + vm.assume(user != anchorStateRegistryProxyAddress); + vm.assume(user != delayedWETHImplAddress); + vm.assume(user != delayedWETHProxyAddress); + vm.assume(user != disputeGameFactoryProxyAddress); + vm.assume(user != eTHLockboxProxyAddress); + vm.assume(user != l1CrossDomainMessengerProxyAddress); + vm.assume(user != l1ERC721BridgeProxyAddress); + vm.assume(user != l1StandardBridgeProxyAddress); + vm.assume(user != mipsSingletonAddress); + vm.assume(user != oPContractsManagerAddress); + vm.assume(user != optimismMintableERC20FactoryProxyAddress); + vm.assume(user != optimismPortalProxyAddress); + vm.assume(user != permissionedDelayedWETHProxyAddress); + vm.assume(user != permissionedDisputeGameAddress); + vm.assume(user != preimageOracleAddress); + vm.assume(user != protocolVersionsImplAddress); + vm.assume(user != protocolVersionsProxyAddress); + vm.assume(user != proxyAdminAddress); + vm.assume(user != superchainConfigImplAddress); + vm.assume(user != superchainConfigProxyAddress); + vm.assume(user != superchainProxyAdminAddress); + vm.assume(user != systemConfigProxyAddress); + vm.assume(user != acc23Address); + vm.assume(user != acc24Address); + vm.assume(user != acc25Address); + vm.assume(user != acc26Address); + vm.assume(user != acc27Address); + vm.assume(user != acc28Address); + vm.assume(user != acc29Address); + vm.assume(user != acc30Address); + vm.assume(user != acc31Address); + vm.assume(user != acc32Address); + vm.assume(user != acc33Address); + vm.assume(user != acc34Address); + vm.assume(user != acc35Address); + vm.assume(user != acc36Address); + vm.assume(user != acc37Address); + vm.assume(user != acc38Address); + vm.assume(user != acc39Address); + vm.assume(user != acc40Address); + vm.assume(user != acc41Address); + vm.assume(user != acc42Address); + vm.assume(user != acc43Address); + vm.assume(user != acc44Address); + vm.assume(user != acc45Address); + vm.assume(user != acc46Address); + vm.assume(user != acc47Address); + vm.assume(user != acc48Address); + } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol index 24d8e17c489..af847c84443 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol @@ -3,5 +3,101 @@ pragma solidity ^0.8.13; -// Will be generated by Kontrol -contract DeploymentSummaryCode { } +contract DeploymentSummaryCode { + bytes internal constant acc23Code = + hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c80638f997aaf14610051578063e0f54e861461007a578063f8ccbf471461008f578063ff07a313146100b2575b600080fd5b61006461005f3660046136ef565b610121565b60405161007191906137e9565b60405180910390f35b61008d6100883660046138c8565b6101c0565b005b600c546100a29062010000900460ff1681565b6040519015158152602001610071565b6100c56100c0366004613984565b6101ec565b6040516100719190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b60606000828060200190518101906101399190613a01565b90506000610146826101ec565b9050806040516020016101a89190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b60405160208183030381529060405292505050919050565b6101ca8282610330565b6101d4828261066a565b6101de8282610775565b6101e88282610ca3565b5050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101829052906102e3836040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c00160405280836000015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001836040015173ffffffffffffffffffffffffffffffffffffffff168152602001836060015115158152602001836080015160001c81526020018360a0015160001c8152509050919050565b90506102ee8161152e565b6102f8818361184b565b6103028183611a7e565b61030c8183611d76565b61031681836120f4565b610320818361244d565b61032a81836101c0565b50919050565b600061035382608001518360400151846060015185600001518660200151612564565b905061035e81612707565b6040517f06447d5600000000000000000000000000000000000000000000000000000000815260006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156103c457600080fd5b505af11580156103d8573d6000803e3d6000fd5b505050506000826060015173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561042f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104539190613a7e565b90506000836020015173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190613a7e565b9050737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561052a57600080fd5b505af115801561053e573d6000803e3d6000fd5b50505050836040015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f313030000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b835173ffffffffffffffffffffffffffffffffffffffff828116911614610663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f323030000000000000000000000000000000000000000000000000000000000060448201526064016105d7565b5050505050565b816040015173ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f89190613a7e565b73ffffffffffffffffffffffffffffffffffffffff16146101e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f5350412d3130000000000000000000000000000000000000000000000000000060448201526064016105d7565b6060810151610788816001600080612757565b826000015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190613a7e565b73ffffffffffffffffffffffffffffffffffffffff161461088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3130000000000000000000000000000000000000000000000060448201526064016105d7565b6040517f06447d5600000000000000000000000000000000000000000000000000000000815260006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b50505050816040015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109999190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3330000000000000000000000000000000000000000000000060448201526064016105d7565b816080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa29190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610b1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3430000000000000000000000000000000000000000000000060448201526064016105d7565b737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b7b57600080fd5b505af1158015610b8f573d6000803e3d6000fd5b5050505081604001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c219190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3530000000000000000000000000000000000000000000000060448201526064016105d7565b505050565b6020810151610cb6816001600080612757565b826020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d313000000000000000000000000000000000000000000000000000000060448201526064016105d7565b8260a001518173ffffffffffffffffffffffffffffffffffffffff1663dc8452cd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190613a9b565b14610e98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d323000000000000000000000000000000000000000000000000000000060448201526064016105d7565b82608001518173ffffffffffffffffffffffffffffffffffffffff1663d798b1ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190613a9b565b14610f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d333000000000000000000000000000000000000000000000000000000060448201526064016105d7565b6040517f06447d5600000000000000000000000000000000000000000000000000000000815260006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015610fd957600080fd5b505af1158015610fed573d6000803e3d6000fd5b50505050816000015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613a7e565b73ffffffffffffffffffffffffffffffffffffffff16146110fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d343000000000000000000000000000000000000000000000000000000060448201526064016105d7565b816080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611162573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111869190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d353000000000000000000000000000000000000000000000000000000060448201526064016105d7565b737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561125f57600080fd5b505af1158015611273573d6000803e3d6000fd5b5050505081600001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113059190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d363000000000000000000000000000000000000000000000000000000060448201526064016105d7565b8073ffffffffffffffffffffffffffffffffffffffff1663dc8452cd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f19190613a9b565b15611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d373000000000000000000000000000000000000000000000000000000060448201526064016105d7565b8073ffffffffffffffffffffffffffffffffffffffff1663d798b1ac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c79190613a9b565b15610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d383000000000000000000000000000000000000000000000000000000060448201526064016105d7565b805173ffffffffffffffffffffffffffffffffffffffff166115d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4465706c6f795375706572636861696e3a20677561726469616e206e6f74207360448201527f657400000000000000000000000000000000000000000000000000000000000060648201526084016105d7565b602081015173ffffffffffffffffffffffffffffffffffffffff16611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4465706c6f795375706572636861696e3a2070726f746f636f6c56657273696f60448201527f6e734f776e6572206e6f7420736574000000000000000000000000000000000060648201526084016105d7565b8060a0015160000361170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4465706c6f795375706572636861696e3a20726571756972656450726f746f6360448201527f6f6c56657273696f6e206e6f742073657400000000000000000000000000000060648201526084016105d7565b80608001516000036117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f795375706572636861696e3a207265636f6d6d656e64656450726f60448201527f746f636f6c56657273696f6e206e6f742073657400000000000000000000000060648201526084016105d7565b604081015173ffffffffffffffffffffffffffffffffffffffff16611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4465706c6f795375706572636861696e3a207375706572636861696e50726f7860448201527f7941646d696e4f776e6572206e6f74207365740000000000000000000000000060648201526084016105d7565b50565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b1580156118b057600080fd5b505af11580156118c4573d6000803e3d6000fd5b5050604080518082018252600a81527f50726f787941646d696e000000000000000000000000000000000000000000006020820152905133602482015260009350611992925061198d906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f038a609c00000000000000000000000000000000000000000000000000000000179052612b7b565b612c20565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f5375706572636861696e50726f787941646d696e0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166080919091015250565b604080518082018252601081527f5375706572636861696e436f6e6669670000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091611b219190611b1990612b7b565b600d54612d16565b604080518082018252601081527f50726f746f636f6c56657273696f6e730000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052919250600091611bbe91611b1990612b7b565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601460448201527f5375706572636861696e436f6e666967496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b5050604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601460448201527f50726f746f636f6c56657273696f6e73496d706c0000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c657c7189150608401600060405180830381600087803b158015611d3b57600080fd5b505af1158015611d4f573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff92831660408501525016905250565b8151608082015160408084015190517f7fec2a8d000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b158015611de757600080fd5b505af1158015611dfb573d6000803e3d6000fd5b5050604080518082018252600581527f50726f78790000000000000000000000000000000000000000000000000000006020820152905173ffffffffffffffffffffffffffffffffffffffff8616602482015260009350611e63925061198d90604401611912565b90508273ffffffffffffffffffffffffffffffffffffffff16639623609d828487604051602401611eb0919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152611f5f93929190600401613ab4565b600060405180830381600087803b158015611f7957600080fd5b505af1158015611f8d573d6000803e3d6000fd5b50505050737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611fed57600080fd5b505af1158015612001573d6000803e3d6000fd5b5050604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601560448201527f5375706572636861696e436f6e66696750726f787900000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c657c7189150608401600060405180830381600087803b1580156120b657600080fd5b505af11580156120ca573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166060949094019390935250505050565b602082015160a08301516080808501519084015184516040517f7fec2a8d000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561216f57600080fd5b505af1158015612183573d6000803e3d6000fd5b5050604080518082018252600581527f50726f78790000000000000000000000000000000000000000000000000000006020820152905173ffffffffffffffffffffffffffffffffffffffff86166024820152600093506121eb925061198d90604401611912565b6040805173ffffffffffffffffffffffffffffffffffffffff898116602483015260448201899052606480830189905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7a1ac61e0000000000000000000000000000000000000000000000000000000017905291517f9623609d00000000000000000000000000000000000000000000000000000000815292935090851691639623609d916122b69185918791600401613ab4565b600060405180830381600087803b1580156122d057600080fd5b505af11580156122e4573d6000803e3d6000fd5b50505050737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561234457600080fd5b505af1158015612358573d6000803e3d6000fd5b5050604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601560448201527f50726f746f636f6c56657273696f6e7350726f787900000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c657c7189150608401600060405180830381600087803b15801561240d57600080fd5b505af1158015612421573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660209690960195909552505050505050565b6040820151608082015161246081612f64565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b50506040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528416925063f2fde38b9150602401600060405180830381600087803b15801561254657600080fd5b505af115801561255a573d6000803e3d6000fd5b5050505050505050565b60408051600580825260c08201909252606091600091906020820160a080368337019050509050868160008151811061259f5761259f613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816001815181106125ed576125ed613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160028151811061263b5761263b613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160038151811061268957612689613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816004815181106126d7576126d7613af6565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152905095945050505050565b60005b815181101561274d57600082828151811061272757612727613af6565b6020026020010151905061273a81612f64565b508061274581613b54565b91505061270a565b506118488161309c565b6040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101839052600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156127df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128039190613a9b565b90506000612812836008613b8c565b82901c60ff1690508415612abb5762030d405a116128b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f795574696c733a20696e73756666696369656e742067617320666f60448201527f7220696e697456657273696f6e28292063616c6c00000000000000000000000060648201526084016105d7565b8573ffffffffffffffffffffffffffffffffffffffff166338d38c976040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612937575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261293491810190613bc9565b60015b6129f9578060ff166001146129f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f74207365742061742074686520676976656e20736c6f7420616e64206f66667360648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b612b73565b8060ff168260ff1614612ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f795574696c733a2073746f726167652076616c756520697320696e908201527f636f72726563742061742074686520676976656e20736c6f7420616e64206f6660648201527f6673657400000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b50612b73565b60ff81811614612b73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f7420307866662061742074686520676976656e20736c6f7420616e64206f666660648201527f7365740000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b505050505050565b6060600482511015612c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4465706c6f795574696c733a20656e636f6465436f6e7374727563746f72207460448201527f616b657320696e205f64617461206f66206c656e677468203e3d20340000000060648201526084016105d7565b612c1a8260046131b3565b92915050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590612c759087906004016137e9565b600060405180830381865afa158015612c92573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612cd89190810190613bec565b83604051602001612cea929190613c5a565b60405160208183030381529060405290508051602082016000f09150612d0f82612f64565b5092915050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590612d6b9088906004016137e9565b600060405180830381865afa158015612d88573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612dce9190810190613bec565b84604051602001612de0929190613c5a565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160208201207f890c283b0000000000000000000000000000000000000000000000000000000083526004830186905260248301529150600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa158015612e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eaa9190613a7e565b905073ffffffffffffffffffffffffffffffffffffffff81163b15612ed157809250612f5b565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b158015612f3657600080fd5b505af1158015612f4a573d6000803e3d6000fd5b50505050612f5882856131f0565b92505b50509392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff821601612fa45750565b73ffffffffffffffffffffffffffffffffffffffff8116613021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706c6f795574696c733a207a65726f20616464726573730000000000000060448201526064016105d7565b60008173ffffffffffffffffffffffffffffffffffffffff163b1161304582613217565b6040516020016130559190613c89565b604051602081830303815290604052906101e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d791906137e9565b60005b81518110156101e85760006130b5826001613cce565b90505b82518110156131a0578281815181106130d3576130d3613af6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683838151811061310357613103613af6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561312c836132f9565b613135836132f9565b604051602001613146929190613ce6565b6040516020818303038152906040529061318d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d791906137e9565b508061319881613b54565b9150506130b8565b50806131ab81613b54565b91505061309f565b6060825182106131d25750604080516020810190915260008152612c1a565b6131e983838486516131e49190613d8d565b61335b565b9392505050565b6000818351602085016000f590508061320e573d806000803e806000fd5b612c1a81612f64565b606061322282613533565b6028602282019081209192507f4040404040404040404040404040404040404040404040404040404040404040917f8888888888888888888888888888888888888888888888888888888888888880167e8800000000000000000000000000000000000000000000000000000000000060005b82811a82028180015260018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed0161329557505050818151166000511660011c8151188152602081019050818151166020511660011c81511881525050919050565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a9004806133145750508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b60608182601f0110156133ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105d7565b828284011015613436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105d7565b818301845110156134a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105d7565b6060821580156134c2576040519150600082526020820160405261352a565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156134fb5780518352602092830192016134e3565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061353e82613575565b805161307882526002017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90910190815292915050565b60606040519050608081016040526f30313233343536373839616263646566600f526002810190506028815260208101600060288201528260601b925060005b808101820184821a600f81165160018301538060041c518253505060018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed016135b5575050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561365457613654613602565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136a1576136a1613602565b604052919050565b600067ffffffffffffffff8211156136c3576136c3613602565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561370157600080fd5b813567ffffffffffffffff81111561371857600080fd5b8201601f8101841361372957600080fd5b803561373c613737826136a9565b61365a565b81815285602083850101111561375157600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b8381101561378a578181015183820152602001613772565b83811115613799576000848401525b50505050565b600081518084526137b781602086016020860161376f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131e9602083018461379f565b73ffffffffffffffffffffffffffffffffffffffff8116811461184857600080fd5b801515811461184857600080fd5b600060a0828403121561383e57600080fd5b60405160a0810181811067ffffffffffffffff8211171561386157613861613602565b6040529050808235613872816137fc565b81526020830135613882816137fc565b60208201526040830135613895816137fc565b604082015260608301356138a8816137fc565b606082015260808301356138bb816137fc565b6080919091015292915050565b6000808284036101608112156138dd57600080fd5b60c08112156138eb57600080fd5b5060405160c0810181811067ffffffffffffffff8211171561390f5761390f613602565b604052833561391d816137fc565b8152602084013561392d816137fc565b60208201526040840135613940816137fc565b604082015260608401356139538161381e565b60608201526080848101359082015260a08085013590820152915061397b8460c0850161382c565b90509250929050565b600060c0828403121561399657600080fd5b61399e613631565b82356139a9816137fc565b815260208301356139b9816137fc565b602082015260408301356139cc816137fc565b604082015260608301356139df8161381e565b60608201526080838101359082015260a0928301359281019290925250919050565b600060c08284031215613a1357600080fd5b613a1b613631565b8251613a26816137fc565b81526020830151613a36816137fc565b60208201526040830151613a49816137fc565b60408201526060830151613a5c8161381e565b60608201526080838101519082015260a0928301519281019290925250919050565b600060208284031215613a9057600080fd5b81516131e9816137fc565b600060208284031215613aad57600080fd5b5051919050565b600073ffffffffffffffffffffffffffffffffffffffff808616835280851660208401525060606040830152613aed606083018461379f565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b8557613b85613b25565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc457613bc4613b25565b500290565b600060208284031215613bdb57600080fd5b815160ff811681146131e957600080fd5b600060208284031215613bfe57600080fd5b815167ffffffffffffffff811115613c1557600080fd5b8201601f81018413613c2657600080fd5b8051613c34613737826136a9565b818152856020838501011115613c4957600080fd5b613aed82602083016020860161376f565b60008351613c6c81846020880161376f565b835190830190613c8081836020880161376f565b01949350505050565b7f4465706c6f795574696c733a206e6f20636f6465206174200000000000000000815260008251613cc181601885016020870161376f565b9190910160180192915050565b60008219821115613ce157613ce1613b25565b500190565b7f4465706c6f795574696c733a20636865636b206661696c65642c206475706c6981527f6361746573206174200000000000000000000000000000000000000000000000602082015260008351613d4481602985016020880161376f565b7f2c000000000000000000000000000000000000000000000000000000000000006029918401918201528351613d8181602a84016020880161376f565b01602a01949350505050565b600082821015613d9f57613d9f613b25565b50039056fea164736f6c634300080f000a"; + bytes internal constant superchainProxyAdminCode = + hex"60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant superchainConfigImplCode = + hex"608060405234801561001057600080fd5b50600436106100f55760003560e01c806354fd4d501161009757806382005715116100665780638200571514610297578063c4d66de8146102aa578063dad544e0146102bd578063f125af6b146102c557600080fd5b806354fd4d501461021e57806357b001f9146102675780635c975abb1461027c57806376a67a511461028457600080fd5b806332dfadd9116100d357806332dfadd91461016357806338d38c971461019a5780633e47158c146101cb578063452a9320146101f857600080fd5b806304dbe3fe146100fa5780630e3b6d1f146101205780632e48152c14610140575b600080fd5b61010d610108366004610af3565b6102ce565b6040519081526020015b60405180910390f35b61010d61012e366004610af3565b60016020526000908152604090205481565b61015361014e366004610af3565b610318565b6040519015158152602001610117565b610153610171366004610af3565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020541590565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000002168152602001610117565b6101d3610364565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b6000546101d39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b61025a6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101179190610b7b565b61027a610275366004610af3565b61056f565b005b6101536105d7565b61027a610292366004610af3565b6105e8565b61027a6102a5366004610af3565b6106c3565b61027a6102b8366004610af3565b610741565b6101d36108b1565b62784ce061010d565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260408120548082036103045750600092915050565b61031162784ce082610bbd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205480820361034e5750600092915050565b61035b62784ce082610bbd565b42109392505050565b60008061038f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156103b257919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026103f59190610bd5565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610450906060015b604051602081830303815290604052805190602001205490565b14610487576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906104a990606001610436565b905073ffffffffffffffffffffffffffffffffffffffff81161561053d578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610512573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105369190610c12565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610577610929565b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260408083209290925590519182527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91015b60405180910390a150565b60006105e36000610318565b905090565b6105f0610929565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260409020541561066a576040517fb7d8689400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260409182902042905590519182527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891016105cc565b6106cb610929565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054900361066a576040517f335b869500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610661565b7f0000000000000000000000000000000000000000000000000000000000000002600054610100900460ff16158015610781575060005460ff8083169116105b61080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610661565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610846610982565b61084f82610a03565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b60006108bb610364565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610c12565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610980576040517fafbe9bc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3361098b610364565b73ffffffffffffffffffffffffffffffffffffffff16141580156109cc5750336109b36108b1565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610980576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8416021781556040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610ac391610b7b565b60405180910390a250565b73ffffffffffffffffffffffffffffffffffffffff81168114610af057600080fd5b50565b600060208284031215610b0557600080fd5b813561031181610ace565b6000815180845260005b81811015610b3657602081850181015186830182015201610b1a565b81811115610b48576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006103116020830184610b10565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610bd057610bd0610b8e565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610c0d57610c0d610b8e565b500290565b600060208284031215610c2457600080fd5b815161031181610ace56fea164736f6c634300080f000a"; + bytes internal constant protocolVersionsImplCode = + hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e7366004610867565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e312e3200000000000000000000000000000000000000000000000000000081525081565b60405161010091906108cd565b6100ec610160366004610867565b61021d565b6100ec61022e565b6100ec61017b366004610910565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c6366004610943565b610460565b6100f6610514565b6100f6600081565b6101e361053f565b6101ec816105c0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161095e565b81565b61022561053f565b6101ec8161065a565b61023661053f565b61024060006106b6565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61037361072d565b61037c84610460565b610385836105c0565b61038e8261065a565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61095e565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161095e565b61046861053f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec816106b6565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61095e565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b6105f36105ee60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161095e565b829055565b60008160405160200161060891815260200190565b60408051601f19818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161064e91906108cd565b60405180910390a35050565b6106886105ee60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61095e565b60008160405160200161069d91815260200190565b60408051601f198184030181529190529050600161061d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff1661085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240336106b6565b60006020828403121561087957600080fd5b5035919050565b6000815180845260005b818110156108a65760208185018101518683018201520161088a565b818111156108b8576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006108e06020830184610880565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461090b57600080fd5b919050565b60008060006060848603121561092557600080fd5b61092e846108e7565b95602085013595506040909401359392505050565b60006020828403121561095557600080fd5b6108e0826108e7565b600082821015610997577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; + bytes internal constant superchainConfigProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant protocolVersionsProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant acc25Code = + hex"608060405234801561001057600080fd5b50600436106100415760003560e01c8063329aa281146100465780638f997aaf1461006f578063f8ccbf471461008f575b600080fd5b61005961005436600461d709565b6100b2565b604051610066919061d7f3565b60405180910390f35b61008261007d36600461daba565b6102a0565b604051610066919061dbb0565b600c546100a29062010000900460ff1681565b6040519015158152602001610066565b604080516103e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101829052610300810182905261032081018290526103408101829052610360810182905261038081018290526103a081018290526103c08101919091526101b4826102f0565b6101bd81610ed2565b6101c681611061565b6101cf816111e8565b6101d88161136f565b6101e1816114f6565b6101ea8161167d565b6101f381611804565b6101fd828261198b565b6102078282611b47565b61021081611c8c565b61021a8282611e13565b6102248282611f55565b61022e828261212e565b610237816123ff565b6102418282612586565b61024b82826126cb565b61025582826128d9565b60c0820151610265906001612a6c565b1561027e576102748282612a87565b61027e8282612c13565b61028781612d9f565b6102918282612f26565b61029b82826137e8565b919050565b60606000828060200190518101906102b8919061dbce565b905060006102c5826100b2565b9050806040516020016102d8919061d7f3565b60405160208183030381529060405292505050919050565b60008160e001511180156103095750607d8160e0015111155b6103c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f56324d617847616d654465707468206f7574206f662076616c69642072616e6760648201527f652028312d313235290000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6002816101000151101580156103e9575060e08101516101008201516103e790600161dcdc565b105b61049b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f563253706c69744465707468206d757374206265203e3d203220616e6420737060648201527f6c69744465707468202b2031203c206d617847616d6544657074680000000000608482015260a4016103b7565b61012081015167ffffffffffffffff101561055e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f5632436c6f636b457874656e73696f6e20746f6f206c6172676520666f72207560648201527f696e743634000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b61014081015167ffffffffffffffff1015610621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f56324d6178436c6f636b4475726174696f6e20746f6f206c6172676520666f7260648201527f2075696e74363400000000000000000000000000000000000000000000000000608482015260a4016103b7565b80610120015181610140015110156106e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4465706c6f79496d706c656d656e746174696f6e733a206d6178436c6f636b4460448201527f75726174696f6e206d757374206265203e3d20636c6f636b457874656e73696f60648201527f6e00000000000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b600081610120015111610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f5632436c6f636b457874656e73696f6e206d757374206265203e20300000000060648201526084016103b7565b8051600003610807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4465706c6f79496d706c656d656e746174696f6e733a2077697468647261776160448201527f6c44656c61795365636f6e6473206e6f7420736574000000000000000000000060648201526084016103b7565b806020015160000361089b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4465706c6f79496d706c656d656e746174696f6e733a206d696e50726f706f7360448201527f616c53697a654279746573206e6f74207365740000000000000000000000000060648201526084016103b7565b806040015160000361092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4465706c6f79496d706c656d656e746174696f6e733a206368616c6c656e676560448201527f506572696f645365636f6e6473206e6f7420736574000000000000000000000060648201526084016103b7565b604081015167ffffffffffffffff10156109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4465706c6f79496d706c656d656e746174696f6e733a206368616c6c656e676560448201527f506572696f645365636f6e647320746f6f206c6172676500000000000000000060648201526084016103b7565b8060600151600003610a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4465706c6f79496d706c656d656e746174696f6e733a2070726f6f664d61747560448201527f7269747944656c61795365636f6e6473206e6f7420736574000000000000000060648201526084016103b7565b8060800151600003610af3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4465706c6f79496d706c656d656e746174696f6e733a2064697370757465476160448201527f6d6546696e616c69747944656c61795365636f6e6473206e6f7420736574000060648201526084016103b7565b8060a00151600003610b87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4465706c6f79496d706c656d656e746174696f6e733a206d697073566572736960448201527f6f6e206e6f74207365740000000000000000000000000000000000000000000060648201526084016103b7565b61016081015173ffffffffffffffffffffffffffffffffffffffff16610c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f79496d706c656d656e746174696f6e733a2073757065726368616960448201527f6e436f6e66696750726f7879206e6f742073657400000000000000000000000060648201526084016103b7565b61018081015173ffffffffffffffffffffffffffffffffffffffff16610cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f79496d706c656d656e746174696f6e733a2070726f746f636f6c5660448201527f657273696f6e7350726f7879206e6f742073657400000000000000000000000060648201526084016103b7565b6101a081015173ffffffffffffffffffffffffffffffffffffffff16610d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4465706c6f79496d706c656d656e746174696f6e733a2073757065726368616960448201527f6e50726f787941646d696e206e6f74207365740000000000000000000000000060648201526084016103b7565b6101c081015173ffffffffffffffffffffffffffffffffffffffff16610e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4465706c6f79496d706c656d656e746174696f6e733a204c3150726f7879416460448201527f6d696e4f776e6572206e6f74207365740000000000000000000000000000000060648201526084016103b7565b6101e081015173ffffffffffffffffffffffffffffffffffffffff16610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706c6f79496d706c656d656e746174696f6e733a206368616c6c656e676560448201527f72206e6f7420736574000000000000000000000000000000000000000000000060648201526084016103b7565b50565b604080518082018252601081527f5375706572636861696e436f6e6669670000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091610f759190610f6d90614223565b600d546142c2565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f5375706572636861696e436f6e666967496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103009190910152565b604080518082018252601081527f50726f746f636f6c56657273696f6e730000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916110fc9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f50726f746f636f6c56657273696f6e73496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156111b057600080fd5b505af11580156111c4573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103209190910152565b604080518082018252600c81527f53797374656d436f6e666967000000000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916112839190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601060448201527f53797374656d436f6e666967496d706c000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561133757600080fd5b505af115801561134b573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102209190910152565b604080518082018252601681527f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a30000000000000000000000000000000000000000000000000000000017905260009161140a9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601a60448201527f4c3143726f7373446f6d61696e4d657373656e676572496d706c0000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156114be57600080fd5b505af11580156114d2573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102409190910152565b604080518082018252600e81527f4c3145524337323142726964676500000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916115919190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4c31455243373231427269646765496d706c00000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102609190910152565b604080518082018252601081527f4c315374616e646172644272696467650000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916117189190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4c315374616e64617264427269646765496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156117cc57600080fd5b505af11580156117e0573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102809190910152565b604080518082018252601c81527f4f7074696d69736d4d696e7461626c654552433230466163746f72790000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a30000000000000000000000000000000000000000000000000000000017905260009161189f9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602060448201527f4f7074696d69736d4d696e7461626c654552433230466163746f7279496d706c6064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102a09190910152565b6060820151604080518082018252600f81527f4f7074696d69736d506f7274616c3200000000000000000000000000000000006020820152905160248101839052600091611a5691610f6d906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f41232a1700000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4f7074696d69736d506f7274616c496d706c00000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661018092909201919091525050565b6060820151604080518082018252601581527f4f7074696d69736d506f7274616c496e7465726f7000000000000000000000006020820152905160248101839052600091611b9b91610f6d906044016119db565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601960448201527f4f7074696d69736d506f7274616c496e7465726f70496d706c000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611c4f57600080fd5b505af1158015611c63573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101a092909201919091525050565b604080518082018252600a81527f4554484c6f636b626f780000000000000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091611d279190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152600e60448201527f4554484c6f636b626f78496d706c0000000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611ddb57600080fd5b505af1158015611def573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101c09190910152565b8151604080518082018252600b81527f44656c61796564574554480000000000000000000000000000000000000000006020820152905160248101839052600091611e6491610f6d906044016119db565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152600f60448201527f44656c6179656457455448496d706c00000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611f1857600080fd5b505af1158015611f2c573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661016092909201919091525050565b600082602001519050600083604001519050600061203c6040518060400160405280600e81526020017f507265696d6167654f7261636c65000000000000000000000000000000000000815250610f6d8585604051602401611fc1929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6f334f5700000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601760448201527f507265696d6167654f7261636c6553696e676c65746f6e0000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156120f057600080fd5b505af1158015612104573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101e09390930192909252505050565b60a08201516101e08201516002821015612206576001461480612153575062aa36a746145b15612206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4465706c6f79496d706c656d656e746174696f6e733a204f6e6c79204d69707360448201527f36342073686f756c64206265206465706c6f796564206f6e204d61696e6e657460648201527f206f72205365706f6c6961000000000000000000000000000000000000000000608482015260a4016103b7565b604080518082018252600681527f4d495053363400000000000000000000000000000000000000000000000000006020820152905173ffffffffffffffffffffffffffffffffffffffff831660248201526044810184905260009161230d916122e790606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1605f41d00000000000000000000000000000000000000000000000000000000179052614223565b7f89fca2352a158519d2daabf7e53686272e828ddbff9487204546d918490b2ecf6142c2565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152600d60448201527f4d49505353696e676c65746f6e000000000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156123c157600080fd5b505af11580156123d5573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102009390930192909252505050565b604080518082018252601281527f4469737075746547616d65466163746f7279000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a30000000000000000000000000000000000000000000000000000000017905260009161249a9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601660448201527f4469737075746547616d65466163746f7279496d706c000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102c09190910152565b6080820151604080518082018252601381527f416e63686f72537461746552656769737472790000000000000000000000000060208201529051602481018390526000916125da91610f6d906044016119db565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601760448201527f416e63686f7253746174655265676973747279496d706c0000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561268e57600080fd5b505af11580156126a2573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102e092909201919091525050565b60408051608081018252600080825260208083018281528385018381526060850184815260e0890151865261010089015190925261012088015167ffffffffffffffff90811690915261014088015116905283518085018552601081527f4661756c744469737075746547616d6500000000000000000000000000000000918101919091529251919290916127e89190610f6d9061276d90869060240161dcf4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe818883400000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4661756c744469737075746547616d65496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561289c57600080fd5b505af11580156128b0573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661034092909201919091525050565b60408051608081018252600080825260208083018281528385018381526060850184815260e0890151865261010089015190925261012088015167ffffffffffffffff90811690915261014088015116905283518085018552601781527f5065726d697373696f6e65644469737075746547616d650000000000000000009181019190915292519192909161297b9190610f6d9061276d90869060240161dcf4565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601b60448201527f5065726d697373696f6e65644469737075746547616d65496d706c00000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612a2f57600080fd5b505af1158015612a43573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661036092909201919091525050565b60008115801590612a7e575081828416145b90505b92915050565b600060405180608001604052808460e001518152602001846101000151815260200184610120015167ffffffffffffffff16815260200184610140015167ffffffffffffffff1681525090506000612b226040518060400160405280601581526020017f53757065724661756c744469737075746547616d650000000000000000000000815250610f6d8460405160240161276d919061dcf4565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601960448201527f53757065724661756c744469737075746547616d65496d706c000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612bd657600080fd5b505af1158015612bea573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661038092909201919091525050565b600060405180608001604052808460e001518152602001846101000151815260200184610120015167ffffffffffffffff16815260200184610140015167ffffffffffffffff1681525090506000612cae6040518060400160405280601c81526020017f53757065725065726d697373696f6e65644469737075746547616d6500000000815250610f6d8460405160240161276d919061dcf4565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602060448201527f53757065725065726d697373696f6e65644469737075746547616d65496d706c6064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612d6257600080fd5b505af1158015612d76573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103a092909201919091525050565b604080518082018252600d81527f53746f726167655365747465720000000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091612e3a9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601160448201527f53746f72616765536574746572496d706c0000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612eee57600080fd5b505af1158015612f02573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103c09190910152565b6040805160a08101825260008082526020820181905281830181905260608201819052608082015290517f7fec2a8d000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b158015612fb257600080fd5b505af1158015612fc6573d6000803e3d6000fd5b50506040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416464726573734d616e616765720000000000000000000000000000000000006044820152600092506130b69150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906064015b600060405180830381865afa158015613068573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526130ae919081019061dd63565b600d54614510565b73ffffffffffffffffffffffffffffffffffffffff9182168452915081161561313b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d31300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50726f787900000000000000000000000000000000000000000000000000000060448201526131bd90737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff91821660208501529150811615613245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d32300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f50726f787941646d696e0000000000000000000000000000000000000000000060448201526132c790737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff9182166040850152915081161561334f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d33300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c314368756753706c61736850726f787900000000000000000000000000000060448201526133d190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff91821660608501529150811615613459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d34300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265736f6c76656444656c656761746550726f7879000000000000000000000060448201526134db90737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff91821660808501529150811615613563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d35300000000000000000000000000000000000000000000000000060448201526064016103b7565b737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156135bf57600080fd5b505af11580156135d3573d6000803e3d6000fd5b5050505060006135ed8560c001516201000060001b612a6c565b905080156136ef576000613602868686614a3b565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4f50436f6e7472616374734d616e6167657256320000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156136b657600080fd5b505af11580156136ca573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101208501526137e1565b60006136fc868686614dce565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4f50436f6e7472616374734d616e6167657200000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156137b057600080fd5b505af11580156137c4573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1684525b5050505050565b60006137fe8360c001516201000060001b612a6c565b9050600061384182613811578351613818565b8361012001515b846101800151856101600151866101e001518761020001518861030001518961032001516151ae565b90506000613889846102200151856102400151866102600151876102800151886102a00151896102c001518a6102e001518b6101c001518c61034001518d61036001516153f0565b905061389d8560c00151600160001b612a6c565b156138c85760006138b8856103800151866103a00151615720565b90506138c482826157d4565b9150505b6138da6138d583836157d4565b615905565b60c08501516138ec9062010000612a6c565b15613a915761012084015173ffffffffffffffffffffffffffffffffffffffff166139c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d2056322066908201527f6c616720656e61626c656420627574204f50434d205632206e6f74206465706c60648201527f6f79656400000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b835173ffffffffffffffffffffffffffffffffffffffff1615613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d2056322066908201527f6c616720656e61626c656420627574204f50434d20563120776173206465706c60648201527f6f79656400000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b613c2a565b835173ffffffffffffffffffffffffffffffffffffffff16613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d205632206660448201527f6c61672064697361626c656420627574204f50434d205631206e6f742064657060648201527f6c6f796564000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b61012084015173ffffffffffffffffffffffffffffffffffffffff1615613c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d205632206660448201527f6c61672064697361626c656420627574204f50434d205632207761732064657060648201527f6c6f796564000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b60c0850151613c3a906001612a6c565b613e285761038084015173ffffffffffffffffffffffffffffffffffffffff1615613d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606160248201527f4465706c6f79496d706c656d656e746174696f6e733a204f7074696d69736d5060448201527f6f7274616c496e7465726f7020666c61672064697361626c656420627574205360648201527f757065724661756c744469737075746547616d6520776173206465706c6f796560848201527f640000000000000000000000000000000000000000000000000000000000000060a482015260c4016103b7565b6103a084015173ffffffffffffffffffffffffffffffffffffffff1615613e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606860248201527f4465706c6f79496d706c656d656e746174696f6e733a204f7074696d69736d5060448201527f6f7274616c496e7465726f7020666c61672064697361626c656420627574205360648201527f757065725065726d697373696f6e65644469737075746547616d65207761732060848201527f6465706c6f79656400000000000000000000000000000000000000000000000060a482015260c4016103b7565b600061407a85604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152604051806101c0016040528083610240015173ffffffffffffffffffffffffffffffffffffffff16815260200183610280015173ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001836102c0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610160015173ffffffffffffffffffffffffffffffffffffffff16815260200183610160015173ffffffffffffffffffffffffffffffffffffffff168152602001836102e0015173ffffffffffffffffffffffffffffffffffffffff168152602001836102a0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610180015173ffffffffffffffffffffffffffffffffffffffff168152602001836101c0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610220015173ffffffffffffffffffffffffffffffffffffffff16815260200183610260015173ffffffffffffffffffffffffffffffffffffffff16815260200183610320015173ffffffffffffffffffffffffffffffffffffffff16815260200183610300015173ffffffffffffffffffffffffffffffffffffffff168152509050919050565b905061408f8561016001518760000151615955565b6140a2856102c001516000806000615add565b6140b5856102e001516000806000615f34565b80516140d790737109709ecfa91a80626ff3989d68f67f5b1dd12d6000616350565b6140e5856102600151616b41565b6140f3856102800151617115565b614107856102000151866101e001516176d6565b60c08601516141199062010000612a6c565b6141cf57604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608082018390526101808083018481526101a08401948552918a015173ffffffffffffffffffffffffffffffffffffffff90811690945289015190921690915285516102008701516141cd918491849190617878565b505b6141dd856102a00151618c72565b6141ef81876101600151600080618eaa565b614203856101c00151866101800151619d82565b61420c81619fad565b61421b8160c00151600061b13e565b505050505050565b60606004825110156142b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4465706c6f795574696c733a20656e636f6465436f6e7374727563746f72207460448201527f616b657320696e205f64617461206f66206c656e677468203e3d20340000000060648201526084016103b7565b612a8182600461b2f0565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061431790889060040161dbb0565b600060405180830381865afa158015614334573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261437a919081019061dd63565b8460405160200161438c92919061ddb4565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160208201207f890c283b0000000000000000000000000000000000000000000000000000000083526004830186905260248301529150600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa158015614432573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614456919061dde3565b905073ffffffffffffffffffffffffffffffffffffffff81163b1561447d57809250614507565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b1580156144e257600080fd5b505af11580156144f6573d6000803e3d6000fd5b50505050614504828561b321565b92505b50509392505050565b81516000908190615bcc9081106146c157600061452c8661b348565b805160208201206040517f890c283b000000000000000000000000000000000000000000000000000000008152600481018890526024810191909152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa1580156145a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cb919061dde3565b93508373ffffffffffffffffffffffffffffffffffffffff163b6000036146b75760006145f8828761b4ba565b90508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146146b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706c6f795574696c733a20756e657870656374656420626c75657072696e60448201527f742061646472657373000000000000000000000000000000000000000000000060648201526084016103b7565b505b6000925050614a33565b60006146d58660008463ffffffff1661b545565b905060006146fc878463ffffffff168563ffffffff168a516146f7919061de00565b61b545565b905060006147098361b348565b905060006147168361b348565b825160208401206040517f890c283b000000000000000000000000000000000000000000000000000000008152600481018b90526024810191909152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa158015614791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147b5919061dde3565b96508673ffffffffffffffffffffffffffffffffffffffff163b6000036148a15760006147e2838a61b4ba565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461489f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4465706c6f795574696c733a20756e657870656374656420706172742031206260448201527f6c75657072696e7420616464726573730000000000000000000000000000000060648201526084016103b7565b505b805160208201206040517f890c283b000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d9163890c283b91614901918c91600401918252602082015260400190565b602060405180830381865afa15801561491e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614942919061dde3565b95508573ffffffffffffffffffffffffffffffffffffffff163b600003614a2e57600061496f828a61b4ba565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4465706c6f795574696c733a20756e657870656374656420706172742032206260448201527f6c75657072696e7420616464726573730000000000000000000000000000000060648201526084016103b7565b505b505050505b509250929050565b60008060405180610260016040528085610300015173ffffffffffffffffffffffffffffffffffffffff16815260200185610320015173ffffffffffffffffffffffffffffffffffffffff16815260200185610260015173ffffffffffffffffffffffffffffffffffffffff16815260200185610180015173ffffffffffffffffffffffffffffffffffffffff168152602001856101a0015173ffffffffffffffffffffffffffffffffffffffff168152602001856101c0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610220015173ffffffffffffffffffffffffffffffffffffffff168152602001856102a0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610240015173ffffffffffffffffffffffffffffffffffffffff16815260200185610280015173ffffffffffffffffffffffffffffffffffffffff168152602001856102c0015173ffffffffffffffffffffffffffffffffffffffff168152602001856102e0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610160015173ffffffffffffffffffffffffffffffffffffffff16815260200185610200015173ffffffffffffffffffffffffffffffffffffffff16815260200185610340015173ffffffffffffffffffffffffffffffffffffffff16815260200185610360015173ffffffffffffffffffffffffffffffffffffffff16815260200185610380015173ffffffffffffffffffffffffffffffffffffffff168152602001856103a0015173ffffffffffffffffffffffffffffffffffffffff168152602001856103c0015173ffffffffffffffffffffffffffffffffffffffff16815250905060006040518060a00160405280856000015173ffffffffffffffffffffffffffffffffffffffff168152602001856020015173ffffffffffffffffffffffffffffffffffffffff168152602001856040015173ffffffffffffffffffffffffffffffffffffffff168152602001856060015173ffffffffffffffffffffffffffffffffffffffff168152602001856080015173ffffffffffffffffffffffffffffffffffffffff168152509050614d768686838561b71d565b614d8186868461b8c4565b614d8a8561bbfc565b614d938561bdae565b614d9c8561bee9565b60008087526020870181905260408701819052606087018190526080870181905260a0870152925050505b9392505050565b60008060405180610240016040528085610300015173ffffffffffffffffffffffffffffffffffffffff16815260200185610320015173ffffffffffffffffffffffffffffffffffffffff16815260200185610260015173ffffffffffffffffffffffffffffffffffffffff16815260200185610180015173ffffffffffffffffffffffffffffffffffffffff168152602001856101a0015173ffffffffffffffffffffffffffffffffffffffff168152602001856101c0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610220015173ffffffffffffffffffffffffffffffffffffffff168152602001856102a0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610240015173ffffffffffffffffffffffffffffffffffffffff16815260200185610280015173ffffffffffffffffffffffffffffffffffffffff168152602001856102c0015173ffffffffffffffffffffffffffffffffffffffff168152602001856102e0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610160015173ffffffffffffffffffffffffffffffffffffffff16815260200185610200015173ffffffffffffffffffffffffffffffffffffffff16815260200185610340015173ffffffffffffffffffffffffffffffffffffffff16815260200185610360015173ffffffffffffffffffffffffffffffffffffffff16815260200185610380015173ffffffffffffffffffffffffffffffffffffffff168152602001856103a0015173ffffffffffffffffffffffffffffffffffffffff16815250905061503b8585858461c0b5565b6150448461c281565b61504e858561c3e1565b6150578461c51c565b6150608461c656565b61506b85858361b8c4565b6150ae6040518060400160405280601281526020017f4f50436f6e7472616374734d616e616765720000000000000000000000000000815250610f6d878761c7b6565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4f50436f6e7472616374734d616e6167657200000000000000000000000000006064820152909250737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561516257600080fd5b505af1158015615176573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff831685525050600061012084018190526101409093019290925250919050565b6040805160078082526101008201909252606091600091906020820160e08036833701905050905088816000815181106151ea576151ea61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816001815181106152385761523861de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816002815181106152865761528661de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816003815181106152d4576152d461de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816004815181106153225761532261de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816005815181106153705761537061de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816006815181106153be576153be61de17565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101529050979650505050505050565b60408051600a80825261016082019092526060916000919060208201610140803683370190505090508b8160008151811061542d5761542d61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160018151811061547b5761547b61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505089816002815181106154c9576154c961de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505088816003815181106155175761551761de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816004815181106155655761556561de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816005815181106155b3576155b361de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816006815181106156015761560161de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160078151811061564f5761564f61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160088151811061569d5761569d61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816009815181106156eb576156eb61de17565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015290509a9950505050505050505050565b6040805160028082526060808301845292600092919060208301908036833701905050905083816000815181106157595761575961de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816001815181106157a7576157a761de17565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152905092915050565b81518151606091906157e6818361dcdc565b67ffffffffffffffff8111156157fe576157fe61d610565b604051908082528060200260200182016040528015615827578160200160208202803683370190505b50925060005b8281101561588e578581815181106158475761584761de17565b60200260200101518482815181106158615761586161de17565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161582d565b5060005b84518110156158fc57600083820190508582815181106158b4576158b461de17565b60200260200101518582815181106158ce576158ce61de17565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250600101615892565b50505092915050565b60005b815181101561594b5760008282815181106159255761592561de17565b602002602001015190506159388161c8ae565b50806159438161de46565b915050615908565b50610ecf8161c9e6565b61597760405180606001604052806040815260200161ed27604091398361cafd565b73ffffffffffffffffffffffffffffffffffffffff82166159f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d44574554482d313000000000000000000000000000000000000060448201526064016103b7565b615a02826000806000615f34565b808273ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa158015615a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615a72919061de7e565b14615ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d44574554482d353000000000000000000000000000000000000060448201526064016103b7565b5050565b615b766040518060600160405280603b815260200161eebf603b913982615b39576040518060400160405280600e81526020017f696d706c656d656e746174696f6e000000000000000000000000000000000000815250615b70565b6040518060400160405280600581526020017f70726f78790000000000000000000000000000000000000000000000000000008152505b8661cb8e565b73ffffffffffffffffffffffffffffffffffffffff8416615bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d313000000000000000000000000000000000000000000060448201526064016103b7565b615c008482600080615f34565b8015615d1c576040517f1b685b9e0000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff8084169190861690631b685b9e90602401602060405180830381865afa158015615c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615c9a919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d323000000000000000000000000000000000000000000060448201526064016103b7565b615f2e565b6040517f1b685b9e0000000000000000000000000000000000000000000000000000000081526001600482015260009073ffffffffffffffffffffffffffffffffffffffff861690631b685b9e90602401602060405180830381865afa158015615d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615dae919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d323000000000000000000000000000000000000000000060448201526064016103b7565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615eb1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615f2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d333000000000000000000000000000000000000000000060448201526064016103b7565b50505050565b6040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101839052600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa158015615fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615fe0919061de7e565b90506000615fef83600861de97565b82901c60ff16905084156162985762030d405a1161608f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f795574696c733a20696e73756666696369656e742067617320666f60448201527f7220696e697456657273696f6e28292063616c6c00000000000000000000000060648201526084016103b7565b8573ffffffffffffffffffffffffffffffffffffffff166338d38c976040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015616114575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526161119181019061dee5565b60015b6161d6578060ff166001146161d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f74207365742061742074686520676976656e20736c6f7420616e64206f66667360648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b61421b565b8060ff168260ff1614616292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f795574696c733a2073746f726167652076616c756520697320696e908201527f636f72726563742061742074686520676976656e20736c6f7420616e64206f6660648201527f6673657400000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b5061421b565b60ff8181161461421b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f7420307866662061742074686520676976656e20736c6f7420616e64206f666660648201527f7365740000000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b6163e96040518060600160405280603f815260200161f149603f9139826163ac576040518060400160405280600e81526020017f696d706c656d656e746174696f6e0000000000000000000000000000000000008152506163e3565b6040518060400160405280600581526020017f70726f78790000000000000000000000000000000000000000000000000000008152505b8561cb8e565b73ffffffffffffffffffffffffffffffffffffffff8316616466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d313000000000000000000000000000000000000060448201526064016103b7565b616474838260006014615f34565b8015616598576040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260cc60248301526000919084169063667f9d7090604401602060405180830381865afa1580156164f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616515919061de7e565b905073ffffffffffffffffffffffffffffffffffffffff811661dead14615f2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d373000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156165fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061661f919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461669c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d383000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1663db505d806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156166ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616723919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146167a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d393000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16630ff754ea6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616803573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616827919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146168a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313030000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636425666b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061692b919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146169a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313130000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616a2f919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616aac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313230000000000000000000000000000000000060448201526064016103b7565b616ad6837f54e433cd0000000000000000000000000000000000000000000000000000000061cc21565b616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313330000000000000000000000000000000000060448201526064016103b7565b505050565b616b6360405180608001604052806043815260200161eff6604391398261cafd565b616b71816000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015616bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616bf8919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3630000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015616cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616cfc919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616d79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3730000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616e00919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3830000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616f04919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3930000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616fe4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617008919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614617085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f434845434b2d4c31455243373231422d3130300000000000000000000000000060448201526064016103b7565b6170af817f54e433cd0000000000000000000000000000000000000000000000000000000061cc21565b610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313330000000000000000000000000000000000060448201526064016103b7565b61713760405180608001604052806045815260200161ed67604591398261cafd565b73ffffffffffffffffffffffffffffffffffffffff81166171b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d31300000000000000000000000000000000000000060448201526064016103b7565b6171c2816000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617225573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617249919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146172c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d37300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061734d919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146173ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d38300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561742d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617451919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146174ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d39300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015617531573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617555919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146175d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3153422d31303000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617659919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3153422d31313000000000000000000000000000000000000060448201526064016103b7565b6176f86040518060600160405280602a815260200161f11f602a91398361cafd565b73ffffffffffffffffffffffffffffffffffffffff8216617775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4d4950532d31300000000000000000000000000000000000000060448201526064016103b7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156177d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906177fb919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4d4950532d32300000000000000000000000000000000000000060448201526064016103b7565b61789a60405180606001604052806038815260200161ef83603891398361cafd565b73ffffffffffffffffffffffffffffffffffffffff8216617917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31300000000000000000000000000000000000000060448201526064016103b7565b60008273ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015617964573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526179aa919081019061dd63565b5111617a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31350000000000000000000000000000000000000060448201526064016103b7565b6040517f78ecabce00000000000000000000000000000000000000000000000000000000815262010000600482015273ffffffffffffffffffffffffffffffffffffffff8316906378ecabce90602401602060405180830381865afa158015617a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617aa3919061df00565b617cb75782610180015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636624856a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617b32919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614617baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31370000000000000000000000000000000000000060448201526064016103b7565b826101a0015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015617c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617c3a919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614617cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31390000000000000000000000000000000000000060448201526064016103b7565b60008273ffffffffffffffffffffffffffffffffffffffff166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015617d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617d29919061df22565b905084610160015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614617dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d35300000000000000000000000000000000000000060448201526064016103b7565b84610100015173ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff1614617e67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d36300000000000000000000000000000000000000060448201526064016103b7565b84610140015173ffffffffffffffffffffffffffffffffffffffff168160c0015173ffffffffffffffffffffffffffffffffffffffff1614617f05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d37300000000000000000000000000000000000000060448201526064016103b7565b8460e0015173ffffffffffffffffffffffffffffffffffffffff168160e0015173ffffffffffffffffffffffffffffffffffffffff1614617fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d38300000000000000000000000000000000000000060448201526064016103b7565b846000015173ffffffffffffffffffffffffffffffffffffffff1681610100015173ffffffffffffffffffffffffffffffffffffffff1614618040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d39300000000000000000000000000000000000000060448201526064016103b7565b846020015173ffffffffffffffffffffffffffffffffffffffff1681610120015173ffffffffffffffffffffffffffffffffffffffff16146180de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31303000000000000000000000000000000000000060448201526064016103b7565b846060015173ffffffffffffffffffffffffffffffffffffffff1681610140015173ffffffffffffffffffffffffffffffffffffffff161461817c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31313000000000000000000000000000000000000060448201526064016103b7565b846080015173ffffffffffffffffffffffffffffffffffffffff1681610180015173ffffffffffffffffffffffffffffffffffffffff161461821a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31323000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff16816101a0015173ffffffffffffffffffffffffffffffffffffffff16146182b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31333000000000000000000000000000000000000060448201526064016103b7565b846101a0015173ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614618352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31343000000000000000000000000000000000000060448201526064016103b7565b84610180015173ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16146183f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31353000000000000000000000000000000000000060448201526064016103b7565b60008373ffffffffffffffffffffffffffffffffffffffff1663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561843d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190618461919061e06f565b905060006184a4826000015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416464726573734d616e616765720000000000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa15801561853d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052618583919081019061dd63565b80519060200120816040015180519060200120146185fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31363000000000000000000000000000000000000060448201526064016103b7565b600061863e836020015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50726f78790000000000000000000000000000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa1580156186d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261871d919081019061dd63565b8051906020012081604001518051906020012014618797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31373000000000000000000000000000000000000060448201526064016103b7565b60006187d8846040015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f50726f787941646d696e000000000000000000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa158015618871573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526188b7919081019061dd63565b8051906020012081604001518051906020012014618931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31383000000000000000000000000000000000000060448201526064016103b7565b6000618972856060015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c314368756753706c61736850726f78790000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa158015618a0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052618a51919081019061dd63565b8051906020012081604001518051906020012014618acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31393000000000000000000000000000000000000060448201526064016103b7565b6000618b0c866080015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265736f6c76656444656c656761746550726f787900000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa158015618ba5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052618beb919081019061dd63565b8051906020012081604001518051906020012014618c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d32303000000000000000000000000000000000000060448201526064016103b7565b5050505050505050505050565b618c9460405180608001604052806051815260200161ef32605191398261cafd565b618ca2816000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015618d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190618d29919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614618da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f434845434b2d4d4552433230462d33300000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663e78cea926040518163ffffffff1660e01b8152600401602060405180830381865afa158015618e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190618e2d919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f434845434b2d4d4552433230462d34300000000000000000000000000000000060448201526064016103b7565b60008461010001519050618f4d60405180606001604052806038815260200161edac6038913983618f10576040518060400160405280600e81526020017f696d706c656d656e746174696f6e000000000000000000000000000000000000815250618f47565b6040518060400160405280600581526020017f70726f78790000000000000000000000000000000000000000000000000000008152505b8361cb8e565b73ffffffffffffffffffffffffffffffffffffffff8116618fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3130000000000000000000000000000000000000000060448201526064016103b7565b618fd78183600080615f34565b811561975b578460c0015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015619043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619067919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146190e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3235000000000000000000000000000000000000000060448201526064016103b7565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015619146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061916a919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146191e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f504f5254414c2d3430000000000000000000000000000000000000000000000060448201526064016103b7565b8373ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015619232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619256919061dde3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156192b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906192db919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3430000000000000000000000000000000000000000060448201526064016103b7565b84610140015173ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156193a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906193cc919061df00565b15158173ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015619419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061943d919061df00565b1515146194a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3630000000000000000000000000000000000000000060448201526064016103b7565b84610120015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa15801561950d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619531919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614806195ed5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa1580156195b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906195d5919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16145b619653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3830000000000000000000000000000000000000000060448201526064016103b7565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663dad544e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156196b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906196d9919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3930000000000000000000000000000000000000000060448201526064016103b7565b619c6f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa1580156197be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906197e2919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461985f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3830000000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156198c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906198e6919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3930000000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156199c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906199ea919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3130300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015619aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619aee919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3131300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015619bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619bf2919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3132300000000000000000000000000000000000000060448201526064016103b7565b6040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152603d6024820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa158015619cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619d1b919061de7e565b146137e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3133300000000000000000000000000000000000000060448201526064016103b7565b619da46040518060600160405280603f815260200161ece8603f91398361cafd565b619db2826000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015619e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619e39919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d454c422d3530000000000000000000000000000000000000000060448201526064016103b7565b6040517f0fd1107700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690630fd1107790602401602060405180830381865afa158015619f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619f46919061df00565b15615ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d454c422d3630000000000000000000000000000000000000000060448201526064016103b7565b60008161014001519050619fd960405180606001604052806037815260200161f0b5603791398261cafd565b619fe7816000806000615f34565b60008173ffffffffffffffffffffffffffffffffffffffff1663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa15801561a034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a058919061e11b565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a0bd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a0e1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461a15e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32323000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff16630c18c1626040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a1a9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a1cd919061de7e565b1561a234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32333000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663f45e65d86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a27f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a2a3919061de7e565b1561a30a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32343000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663bfb14fb76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a379919061e1d1565b63ffffffff161561a3e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32353000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663ec7075176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a431573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a455919061e1d1565b63ffffffff161561a4c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32363000000000000000000000000000000000000060448201526064016103b7565b6000801b8273ffffffffffffffffffffffffffffffffffffffff1663e81b2c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a535919061de7e565b1461a59c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32373000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663f68016b76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a5e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a60b919061e1ec565b67ffffffffffffffff161561a67c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32383000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16631fd19ee16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a6df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a703919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461a780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32393000000000000000000000000000000000000060448201526064016103b7565b805163ffffffff161561a7ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33303000000000000000000000000000000000000060448201526064016103b7565b602081015160ff161561a85e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33313000000000000000000000000000000000000060448201526064016103b7565b604081015160ff161561a8cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33323000000000000000000000000000000000000060448201526064016103b7565b608081015163ffffffff161561a93f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33333000000000000000000000000000000000000060448201526064016103b7565b606081015163ffffffff161561a9b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33343000000000000000000000000000000000000060448201526064016103b7565b60a08101516fffffffffffffffffffffffffffffffff161561aa2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33353000000000000000000000000000000000000060448201526064016103b7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8273ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561aa9b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061aabf919061de7e565b1461ab26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33363000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663dac6e63a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ab89573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061abad919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461ac2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33373000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ac8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061acb1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461ad2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33383000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663c4e8ddfa6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ad91573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061adb5919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461ae32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33393000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663078f29cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ae95573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061aeb9919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461af36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d34303000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa15801561af99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061afbd919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461b03a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d34323000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16639b7d7f0a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561b09d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061b0c1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d34333000000000000000000000000000000000000060448201526064016103b7565b61b1478261c8ae565b801561b1585761b1568261d215565b505b61b1658282600080615f34565b6040517f7258a8070000000000000000000000000000000000000000000000000000000081526001600482015260009073ffffffffffffffffffffffffffffffffffffffff841690637258a807906024016040805180830381865afa15801561b1d2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061b1f6919061e216565b509050811561b288577fdead0000000000000000000000000000000000000000000000000000000000008114616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f414e43484f52502d34300000000000000000000000000000000000000000000060448201526064016103b7565b8015616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f414e43484f52502d34300000000000000000000000000000000000000000000060448201526064016103b7565b60608251821061b30f5750604080516020810190915260008152612a81565b612a7e83838486516146f7919061de00565b6000818351602085016000f590508061b33f573d806000803e806000fd5b612a818161c8ae565b6060815160000361b385576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060400160405280600381526020017ffe7100000000000000000000000000000000000000000000000000000000000081525090506000818460405160200161b3d492919061ddb4565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280517f6100000000000000000000000000000000000000000000000000000000000000602085015260f01b7fffff000000000000000000000000000000000000000000000000000000000000811660218501527f3d81600a3d39f30000000000000000000000000000000000000000000000000060238501528251808503600a018152602a85019093529093509161b4a09082908590604a0161ddb4565b604051602081830303815290604052945050505050919050565b6000818351602085016000f5905073ffffffffffffffffffffffffffffffffffffffff8116612a81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f426c75657072696e743a2063726561746532206661696c65640000000000000060448201526064016103b7565b60608182601f01101561b5b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b7565b82828401101561b620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b7565b8183018451101561b68d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016103b7565b60608215801561b6ac576040519150600082526020820160405261b714565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561b6e557805183526020928301920161b6cd565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b600061b7d26040518060600160405280603b815260200161ede4603b9139610f6d85858960c0015160405160240161b7579392919061e23a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9acb7deb00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601f60448201527f4f50436f6e7472616374734d616e61676572436f6e7461696e6572496d706c006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561b88657600080fd5b505af115801561b89a573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101409390930192909252505050565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915260408083015173ffffffffffffffffffffffffffffffffffffffff9081168352606080850151821660208086019190915260808087015184168686015260a08088015185169387019390935260c08088015185168288015260e08089015186169488019490945261010080890151861691880191909152610120808901518616948801949094526101408089015186169188019190915261016080890151861694880194909452610180808901518616918801919091526101a0808901518616948801949094526101c08801518516908701526101e0870151909316918501919091528251918201909252604b80825260009261bae592919061f03990830139610f6d84886101600151896101c001518a6101e001518b600001518c60c0015160405160240161ba6a9695949392919061e52b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f936144ed00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602760448201527f4f50436f6e7472616374734d616e616765725374616e6461726456616c69646160648201527f746f72496d706c000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561bbbf57600080fd5b505af115801561bbd3573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660c09390930192909252505050565b600061bcc360405180606001604052806033815260200161f0ec6033913961014084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f038a609c00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601b60448201527f4f50436f6e7472616374734d616e616765725574696c73496d706c00000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561bd7757600080fd5b505af115801561bd8b573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660e09190910152565b600061bdfd60405180606001604052806039815260200161ee1f6039913960e084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601e60448201527f4f50436f6e7472616374734d616e616765724d69677261746f72496d706c00006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561beb157600080fd5b505af115801561bec5573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101009190910152565b604080518082018252601481527f4f50436f6e7472616374734d616e616765725632000000000000000000000000602082015260c083015161010084015160e0850151935173ffffffffffffffffffffffffffffffffffffffff928316602482015290821660448201529216606483015260009161bfe49190610f6d90608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd232b1b00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4f50436f6e7472616374734d616e6167657256320000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561c09857600080fd5b505af115801561c0ac573d6000803e3d6000fd5b50505050919050565b600061c16a6040518060600160405280603b815260200161efbb603b9139610f6d85858960c0015160405160240161c0ef9392919061e6fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f458bd2d100000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602660448201527f4f50436f6e7472616374734d616e616765724250496d706c73436f6e7461696e60648201527f6572496d706c00000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561c24457600080fd5b505af115801561c258573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660209390930192909252505050565b600061c2d060405180606001604052806036815260200161ee8960369139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602360448201527f4f50436f6e7472616374734d616e6167657247616d655479706541646465724960648201527f6d706c00000000000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561c3aa57600080fd5b505af115801561c3be573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660409190910152565b600061c43060405180606001604052806031815260200161ee5860319139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601e60448201527f4f50436f6e7472616374734d616e616765724465706c6f796572496d706c00006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561c4e457600080fd5b505af115801561c4f8573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166060919091015250565b600061c56b60405180606001604052806031815260200161f08460319139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601e60448201527f4f50436f6e7472616374734d616e616765725570677261646572496d706c00006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561c61f57600080fd5b505af115801561c633573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660809190910152565b600061c6a560405180606001604052806038815260200161eefa60389139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602560448201527f4f50436f6e7472616374734d616e61676572496e7465726f704d69677261746f60648201527f72496d706c0000000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561c77f57600080fd5b505af115801561c793573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660a09190910152565b604080820151606083810151608085015160a086015160c08701516101608901516101808a0151975173ffffffffffffffffffffffffffffffffffffffff9788166024820152948716604486015292861660648501529085166084840152841660a4830152831660c48201529190921660e4820152612a7e9061010401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f820f7f8500000000000000000000000000000000000000000000000000000000179052614223565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82160161c8ee5750565b73ffffffffffffffffffffffffffffffffffffffff811661c96b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706c6f795574696c733a207a65726f20616464726573730000000000000060448201526064016103b7565b60008173ffffffffffffffffffffffffffffffffffffffff163b1161c98f8261d312565b60405160200161c99f919061e9c2565b60405160208183030381529060405290615ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b7919061dbb0565b60005b8151811015615ad957600061c9ff82600161dcdc565b90505b825181101561caea5782818151811061ca1d5761ca1d61de17565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683838151811061ca4d5761ca4d61de17565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561ca768361d3f4565b61ca7f8361d3f4565b60405160200161ca9092919061ea07565b6040516020818303038152906040529061cad7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b7919061dbb0565b508061cae28161de46565b91505061ca02565b508061caf58161de46565b91505061c9e9565b615ad9828260405160240161cb1392919061eaae565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f319af3330000000000000000000000000000000000000000000000000000000017905261d456565b616b3c83838360405160240161cba69392919061eae6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95ed01950000000000000000000000000000000000000000000000000000000017905261d456565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3e47158c0000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff87169161cca2919061eb32565b600060405180830381855afa9150503d806000811461ccdd576040519150601f19603f3d011682016040523d82523d6000602084013e61cce2565b606091505b50915091508115801561ccf6575080516004145b801561cd4d57507fffffffff00000000000000000000000000000000000000000000000000000000841661cd298261eb4e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b95945050505050565b61cd7d6040518060600160405280600060ff16815260200160608152602001606081525090565b60028251108061cde757508160008151811061cd9b5761cd9b61de17565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061ce4c57508160018151811061ce005761ce0061de17565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b1561ce83576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028360028151811061ce9a5761ce9a61de17565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c905060008360028151811061ceca5761ceca61de17565b60209101015160f81c6003908116915081900361cf13576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff82161561cfff5760008260ff1667ffffffffffffffff81111561cf3c5761cf3c61d610565b6040519080825280601f01601f19166020018201604052801561cf66576020820181803683370190505b50905060005b8360ff1681101561cff1578661cf8382600361dcdc565b8151811061cf935761cf9361de17565b602001015160f81c60f81b82828151811061cfb05761cfb061de17565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061cfe98161de46565b91505061cf6c565b5061cffb8161d45f565b9150505b60008167ffffffffffffffff81111561d01a5761d01a61d610565b6040519080825280601f01601f19166020018201604052801561d044576020820181803683370190505b50905060ff83161561d0e957600061d05d84600361eb9e565b60ff16905060005b8381101561d0e6578761d078828461dcdc565b8151811061d0885761d08861de17565b602001015160f81c60f81b83828151811061d0a55761d0a561de17565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061d0de8161de46565b91505061d065565b50505b60008261d0f785600361eb9e565b60ff1661d104919061dcdc565b9050600081885161d115919061de00565b90508060000361d151576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561d16c5761d16c61d610565b6040519080825280601f01601f19166020018201604052801561d196576020820181803683370190505b50905060008360208b0101602083018481868460045afa925050508061d1e8576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6040517fca669fa700000000000000000000000000000000000000000000000000000000815260006004820181905290737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561d27e57600080fd5b505af115801561d292573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561d2e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061d307919061dde3565b905061029b8161c8ae565b606061d31d8261d520565b6028602282019081209192507f4040404040404040404040404040404040404040404040404040404040404040917f8888888888888888888888888888888888888888888888888888888888888880167e8800000000000000000000000000000000000000000000000000000000000060005b82811a82028180015260018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed0161d39057505050818151166000511660011c8151188152602081019050818151166020511660011c81511881525050919050565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a90048061d40f5750508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b610ecf8161d562565b600060208251111561d49d576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b835181101561d5195761d4b581600161dcdc565b845161d4c1919061de00565b61d4cc90600861de97565b61d4d790600261ecdb565b84828151811061d4e95761d4e961de17565b016020015161d4fb919060f81c61de97565b61d505908361dcdc565b91508061d5118161de46565b91505061d4a1565b5092915050565b606061d52b8261d583565b805161307882526002017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90910190815292915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b60606040519050608081016040526f30313233343536373839616263646566600f526002810190506028815260208101600060288201528260601b925060005b808101820184821a600f81165160018301538060041c518253505060018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed0161d5c3575050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610200810167ffffffffffffffff8111828210171561d6635761d66361d610565b60405290565b604051610240810167ffffffffffffffff8111828210171561d6635761d66361d610565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561d6d45761d6d461d610565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ecf57600080fd5b803561029b8161d6dc565b6000610200828403121561d71c57600080fd5b61d72461d63f565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e082015261010080840135818301525061012080840135818301525061014080840135818301525061016061d7a081850161d6fe565b9082015261018061d7b284820161d6fe565b908201526101a061d7c484820161d6fe565b908201526101c061d7d684820161d6fe565b908201526101e061d7e884820161d6fe565b908201529392505050565b815173ffffffffffffffffffffffffffffffffffffffff1681526103e08101602083015161d839602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015161d861604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161d889606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608083015161d8b1608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161d8d960a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161d90160c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161d92960e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e08085015182169084015261030080850151821690840152610320808501518216908401526103408085015182169084015261036080850151821690840152610380808501518216908401526103a0808501518216908401526103c09384015116929091019190915290565b600067ffffffffffffffff82111561da8e5761da8e61d610565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561dacc57600080fd5b813567ffffffffffffffff81111561dae357600080fd5b8201601f8101841361daf457600080fd5b803561db0761db028261da74565b61d68d565b81815285602083850101111561db1c57600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b8381101561db5557818101518382015260200161db3d565b83811115615f2e5750506000910152565b6000815180845261db7e81602086016020860161db3a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612a7e602083018461db66565b805161029b8161d6dc565b6000610200828403121561dbe157600080fd5b61dbe961d63f565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014080840151818301525061016061dc6581850161dbc3565b9082015261018061dc7784820161dbc3565b908201526101a061dc8984820161dbc3565b908201526101c061dc9b84820161dbc3565b908201526101e061d7e884820161dbc3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561dcef5761dcef61dcad565b500190565b60808101612a8182848051825260208101516020830152604081015167ffffffffffffffff808216604085015280606084015116606085015250505050565b600061dd4161db028461da74565b905082815283838301111561dd5557600080fd5b614dc783602083018461db3a565b60006020828403121561dd7557600080fd5b815167ffffffffffffffff81111561dd8c57600080fd5b8201601f8101841361dd9d57600080fd5b61ddac8482516020840161dd33565b949350505050565b6000835161ddc681846020880161db3a565b83519083019061ddda81836020880161db3a565b01949350505050565b60006020828403121561ddf557600080fd5b8151614dc78161d6dc565b60008282101561de125761de1261dcad565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361de775761de7761dcad565b5060010190565b60006020828403121561de9057600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561decf5761decf61dcad565b500290565b805160ff8116811461029b57600080fd5b60006020828403121561def757600080fd5b612a7e8261ded4565b60006020828403121561df1257600080fd5b81518015158114614dc757600080fd5b6000610240828403121561df3557600080fd5b61df3d61d669565b61df468361dbc3565b815261df546020840161dbc3565b602082015261df656040840161dbc3565b604082015261df766060840161dbc3565b606082015261df876080840161dbc3565b608082015261df9860a0840161dbc3565b60a082015261dfa960c0840161dbc3565b60c082015261dfba60e0840161dbc3565b60e082015261010061dfcd81850161dbc3565b9082015261012061dfdf84820161dbc3565b9082015261014061dff184820161dbc3565b9082015261016061e00384820161dbc3565b9082015261018061e01584820161dbc3565b908201526101a061e02784820161dbc3565b908201526101c061e03984820161dbc3565b908201526101e061e04b84820161dbc3565b9082015261020061e05d84820161dbc3565b9082015261022061d7e884820161dbc3565b600060a0828403121561e08157600080fd5b60405160a0810181811067ffffffffffffffff8211171561e0a45761e0a461d610565b604052825161e0b28161d6dc565b8152602083015161e0c28161d6dc565b6020820152604083015161e0d58161d6dc565b6040820152606083015161e0e88161d6dc565b6060820152608083015161e0fb8161d6dc565b60808201529392505050565b805163ffffffff8116811461029b57600080fd5b600060c0828403121561e12d57600080fd5b60405160c0810181811067ffffffffffffffff8211171561e1505761e15061d610565b60405261e15c8361e107565b815261e16a6020840161ded4565b602082015261e17b6040840161ded4565b604082015261e18c6060840161e107565b606082015261e19d6080840161e107565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461e1c557600080fd5b60a08201529392505050565b60006020828403121561e1e357600080fd5b612a7e8261e107565b60006020828403121561e1fe57600080fd5b815167ffffffffffffffff81168114614dc757600080fd5b6000806040838503121561e22957600080fd5b505080516020909101519092909150565b610320810161e294828673ffffffffffffffffffffffffffffffffffffffff808251168352806020830151166020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b835173ffffffffffffffffffffffffffffffffffffffff1660a0830152602084015173ffffffffffffffffffffffffffffffffffffffff811660c084015250604084015173ffffffffffffffffffffffffffffffffffffffff811660e084015250606084015161010061e31e8185018373ffffffffffffffffffffffffffffffffffffffff169052565b6080860151915061012061e3498186018473ffffffffffffffffffffffffffffffffffffffff169052565b60a0870151925061014061e3748187018573ffffffffffffffffffffffffffffffffffffffff169052565b60c0880151935061016061e39f8188018673ffffffffffffffffffffffffffffffffffffffff169052565b60e0890151945061018061e3ca8189018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015194506101a09361e3f58886018773ffffffffffffffffffffffffffffffffffffffff169052565b9289015194506101c09261e4208885018773ffffffffffffffffffffffffffffffffffffffff169052565b9189015194506101e09161e44b8884018773ffffffffffffffffffffffffffffffffffffffff169052565b9089015194506102009061e4768883018773ffffffffffffffffffffffffffffffffffffffff169052565b890151945061022061e49f8882018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015194506102409361e4ca8886018773ffffffffffffffffffffffffffffffffffffffff169052565b9289015173ffffffffffffffffffffffffffffffffffffffff90811661026089015291890151821661028088015288015181166102a08701529087015181166102c08601529501519094166102e08301526103009091019190915292915050565b865173ffffffffffffffffffffffffffffffffffffffff1681526102608101602088015161e571602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604088015161e599604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606088015161e5c1606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608088015161e5e9608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a088015161e61160a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c088015161e63960c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e088015161e66160e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008881015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808a0151821690840152610140808a0151821690840152610160808a0151821690840152610180808a01518216908401526101a0988901518116988301989098529587166101c08201529386166101e085015291909416610200830152610220820193909352610240019190915290565b610300810161e756828673ffffffffffffffffffffffffffffffffffffffff808251168352806020830151166020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b835173ffffffffffffffffffffffffffffffffffffffff1660a0830152602084015173ffffffffffffffffffffffffffffffffffffffff811660c084015250604084015173ffffffffffffffffffffffffffffffffffffffff811660e084015250606084015161010061e7e08185018373ffffffffffffffffffffffffffffffffffffffff169052565b6080860151915061012061e80b8186018473ffffffffffffffffffffffffffffffffffffffff169052565b60a0870151925061014061e8368187018573ffffffffffffffffffffffffffffffffffffffff169052565b60c0880151935061016061e8618188018673ffffffffffffffffffffffffffffffffffffffff169052565b60e0890151945061018061e88c8189018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015194506101a09361e8b78886018773ffffffffffffffffffffffffffffffffffffffff169052565b9289015194506101c09261e8e28885018773ffffffffffffffffffffffffffffffffffffffff169052565b9189015194506101e09161e90d8884018773ffffffffffffffffffffffffffffffffffffffff169052565b9089015194506102009061e9388883018773ffffffffffffffffffffffffffffffffffffffff169052565b890151945061022061e9618882018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015173ffffffffffffffffffffffffffffffffffffffff90811661024089015292890151831661026088015290880151821661028087015287015181166102a08601529501519094166102c08301526102e09091019190915292915050565b7f4465706c6f795574696c733a206e6f20636f646520617420000000000000000081526000825161e9fa81601885016020870161db3a565b9190910160180192915050565b7f4465706c6f795574696c733a20636865636b206661696c65642c206475706c6981527f636174657320617420000000000000000000000000000000000000000000000060208201526000835161ea6581602985016020880161db3a565b7f2c00000000000000000000000000000000000000000000000000000000000000602991840191820152835161eaa281602a84016020880161db3a565b01602a01949350505050565b60408152600061eac1604083018561db66565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60608152600061eaf9606083018661db66565b828103602084015261eb0b818661db66565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b6000825161eb4481846020870161db3a565b9190910192915050565b6000815160208301517fffffffff000000000000000000000000000000000000000000000000000000008082169350600483101561eb965780818460040360031b1b83161693505b505050919050565b600060ff821660ff84168060ff0382111561ebbb5761ebbb61dcad565b019392505050565b600181815b80851115614a3357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561ec025761ec0261dcad565b8085161561ec0f57918102915b93841c939080029061ebc8565b60008261ec2b57506001612a81565b8161ec3857506000612a81565b816001811461ec4e576002811461ec585761ec74565b6001915050612a81565b60ff84111561ec695761ec6961dcad565b50506001821b612a81565b5060208310610133831016604e8410600b841016171561ec97575081810a612a81565b61eca1838361ebc3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561ecd35761ecd361dcad565b029392505050565b6000612a7e838361ec1c56fe52756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204554484c6f636b626f7820696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e207468652044656c617965645745544820696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204c315374616e6461726442726964676520696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204f7074696d69736d506f7274616c322025732061742025734f50436f6e7472616374734d616e61676572436f6e7461696e65722e736f6c3a4f50436f6e7472616374734d616e61676572436f6e7461696e65724f50436f6e7472616374734d616e616765724d69677261746f722e736f6c3a4f50436f6e7472616374734d616e616765724d69677261746f724f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e616765724465706c6f7965724f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e6167657247616d6554797065416464657252756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204469737075746547616d65466163746f72792025732061742025734f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e61676572496e7465726f704d69677261746f7252756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204f7074696d69736d4d696e7461626c654552433230466163746f727920696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204f50436f6e7472616374734d616e616765722061742025734f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e61676572436f6e747261637473436f6e7461696e657252756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204c3145524337323142726964676520696d706c656d656e746174696f6e2061742025734f50436f6e7472616374734d616e616765725374616e6461726456616c696461746f722e736f6c3a4f50436f6e7472616374734d616e616765725374616e6461726456616c696461746f724f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e61676572557067726164657252756e6e696e6720636861696e20617373657274696f6e73206f6e207468652053797374656d436f6e66696720696d706c2061742025734f50436f6e7472616374734d616e616765725574696c732e736f6c3a4f50436f6e7472616374734d616e616765725574696c7352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204d49505320617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204c3143726f7373446f6d61696e4d657373656e676572202573206174202573a164736f6c634300080f000a"; + bytes internal constant acc26Code = + hex"608060405234801561001057600080fd5b50600436106103d05760003560e01c80638da5cb5b116101ff578063d220a9e01161011a578063f2c4bc9e116100ad578063f8c68de01161007c578063f8c68de014610a1a578063fd32aa0f14610a22578063fe3d571014610a2a578063ffa1ad7414610a6357600080fd5b8063f2c4bc9e146109d7578063f2fde38b146109ea578063f45e65d8146109fd578063f68016b714610a0657600080fd5b8063e0e2016d116100e9578063e0e2016d1461099e578063e81b2c6d146109a6578063ec707517146109af578063f2b4e617146109cf57600080fd5b8063d220a9e014610975578063d6ae3cd514610985578063dac6e63a1461098e578063dad544e01461099657600080fd5b8063b40a817c11610192578063c4e8ddfa11610161578063c4e8ddfa1461080e578063c9b26f6114610816578063c9ff2d1614610829578063cc731b021461084157600080fd5b8063b40a817c146107c4578063bc49ce5f146107d7578063bfb14fb7146107df578063c0fd4b41146107fb57600080fd5b80639fabcc84116101ce5780639fabcc8414610706578063a39fac121461070e578063a62611a214610790578063a7119869146107bc57600080fd5b80638da5cb5b146106c55780638ed95502146106e3578063935f029e146106eb5780639b7d7f0a146106fe57600080fd5b80632efe2c63116102ef5780634d5d9a2a116102825780635d73369c116102515780635d73369c1461069a578063715018a6146106a25780637616f0e8146106aa5780637e54b8ad146106bd57600080fd5b80634d5d9a2a146105f85780634f16540b1461062957806354fd4d50146106505780635c975abb1461069257600080fd5b8063452a9320116102be578063452a9320146105bd57806347af267b146105c557806348cd4cb1146105e85780634add321d146105f057600080fd5b80632efe2c631461055c57806335e80ab31461056457806338d38c97146105845780633e47158c146105b557600080fd5b806318d1391811610367578063213268491161033657806321326849146104cf578063215b7a1c1461052e57806321d7fde5146105365780632b598b8a1461054957600080fd5b806318d139181461049957806319f5cea8146104ac5780631fd19ee1146104b457806320f06fdc146104bc57600080fd5b80630ae14b1b116103a35780630ae14b1b1461043a5780630c18c16214610459578063155b6c6f1461046257806316d3bc7f1461047557600080fd5b806306c92657146103d5578063078f29cf146103f05780630a2ca2a91461041d5780630a49cb0314610432575b600080fd5b6103dd610a6b565b6040519081526020015b60405180910390f35b6103f8610a99565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e7565b61043061042b366004612c64565b610ad2565b005b6103f8610afc565b631dcd65005b60405167ffffffffffffffff90911681526020016103e7565b6103dd60655481565b610430610470366004612cb4565b610b2c565b606a54610440906c01000000000000000000000000900467ffffffffffffffff1681565b6104306104a7366004612c64565b610b42565b6103dd610b53565b6103f8610b7e565b6104306104ca366004612ce7565b610ba8565b7f435553544f4d5f4741535f544f4b454e00000000000000000000000000000000600052606d6020527f3ec9a18bd22a834e2a13465cc2aa2a9aebb161ffdebf39cdb0028dbb1b5394b45460ff165b60405190151581526020016103e7565b6103f8610bb9565b610430610544366004612d0b565b610be9565b610430610557366004612e59565b610bfb565b6103dd610fce565b606c546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000031681526020016103e7565b6103f8610ff9565b6103f8611204565b61051e6105d3366004612fc9565b606d6020526000908152604090205460ff1681565b6103dd611298565b6104406112c8565b606a546106149068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016103e7565b6103dd7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b60408051808201909152600681527f332e31342e30000000000000000000000000000000000000000000000000000060208201525b6040516103e7919061305c565b61051e6112ee565b6103dd6114fb565b610430611526565b6104306106b836600461306f565b61153a565b6103dd61154b565b60335473ffffffffffffffffffffffffffffffffffffffff166103f8565b6103f8611576565b6104306106f936600461308a565b6115a6565b6103f86115b8565b6106856115e8565b610716611682565b6040516103e79190600060e08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401528060c08501511660c08401525092915050565b606c546104409074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103f86117bd565b6104306107d236600461306f565b6117ed565b6103dd6117fe565b6068546106149068010000000000000000900463ffffffff1681565b610430610809366004612d0b565b611829565b6103f861183b565b610430610824366004612fc9565b61186b565b606a5461061490640100000000900463ffffffff1681565b6109056040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516103e79190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b606a546106149063ffffffff1681565b6103dd606b5481565b6103f861187c565b6103f86118ac565b6103dd611900565b6103dd60675481565b606854610614906c01000000000000000000000000900463ffffffff1681565b6103f861192b565b6104306109e53660046130ba565b6119a7565b6104306109f8366004612c64565b611bb8565b6103dd60665481565b6068546104409067ffffffffffffffff1681565b6103dd611c6c565b6103dd611c97565b606a54610a509074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016103e7565b6103dd600081565b610a9660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d613119565b81565b6000610acd610ac960017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377613119565b5490565b905090565b610ada611cc6565b610af973ffffffffffffffffffffffffffffffffffffffff8216611d47565b50565b6000610acd610ac960017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad613119565b610b34611cc6565b610b3e8282611da8565b5050565b610b4a611cc6565b610af981611eb8565b610a9660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8613119565b6000610acd7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b610bb0611cc6565b610af981611f3c565b6000610acd610ac960017f51547f31a231e1007dca33017faa3da20d959b95087c588a7768bfb922fd5900613119565b610bf1611cc6565b610b3e8282611fa9565b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff16158015610c3b575060005460ff8083169116105b610ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610d056120ae565b610d0d61212f565b610d168c611bb8565b610d1f89611d47565b610d298b8b611fa9565b610d32886121ce565b610d5b7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08889055565b610d8e610d8960017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598613119565b869055565b610dc2610dbc60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637613119565b85519055565b610df9610df060017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8613119565b60208601519055565b610e30610e2760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377613119565b60408601519055565b610e67610e5e60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad613119565b60608601519055565b610e9e610e9560017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d613119565b60808601519055565b610ed5610ecc60017f51547f31a231e1007dca33017faa3da20d959b95087c588a7768bfb922fd5900613119565b60a08601519055565b610f0c610f0360017f99f45962df4bc30de8d4c3c6d1ffc0f100edce16e80c7a5768b6d55ca463ff43613119565b60c08601519055565b610f14612324565b610f1d8661238c565b606b839055606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050505050505050565b610a9660017f99f45962df4bc30de8d4c3c6d1ffc0f100edce16e80c7a5768b6d55ca463ff43613119565b6000806110247fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561104757919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261108a9190613130565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906110e5906060015b604051602081830303815290604052805190602001205490565b1461111c576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061113e906060016110cb565b905073ffffffffffffffffffffffffffffffffffffffff8116156111d2578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cb919061316d565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606c54604080517f452a9320000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163452a93209160048083019260209291908290030181865afa158015611274573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acd919061316d565b6000610acd610ac960017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b606954600090610acd9063ffffffff6a010000000000000000000082048116911661318a565b7f4554485f4c4f434b424f580000000000000000000000000000000000000000006000908152606d6020527f58e88e949bd180ff86d6c072735c3d8d5a05a543c16130176ec0bc0adf3fd80654819060ff166113515761134c610afc565b6113c7565b611359610afc565b73ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c7919061316d565b606c546040517f2e48152c0000000000000000000000000000000000000000000000000000000081526000600482015291925073ffffffffffffffffffffffffffffffffffffffff1690632e48152c90602401602060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b91906131b6565b806114f55750606c546040517f2e48152c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015290911690632e48152c90602401602060405180830381865afa1580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f591906131b6565b91505090565b610a9660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637613119565b61152e611cc6565b6115386000612800565b565b611542611cc6565b610af981612877565b610a9660017f51547f31a231e1007dca33017faa3da20d959b95087c588a7768bfb922fd5900613119565b6000610acd610ac960017f99f45962df4bc30de8d4c3c6d1ffc0f100edce16e80c7a5768b6d55ca463ff43613119565b6115ae611cc6565b610b3e82826128ea565b6000610acd610ac960017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d613119565b60606115f2611576565b73ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561163c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610acd91908101906131d3565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052806116ce6117bd565b73ffffffffffffffffffffffffffffffffffffffff1681526020016116f161183b565b73ffffffffffffffffffffffffffffffffffffffff168152602001611714610a99565b73ffffffffffffffffffffffffffffffffffffffff168152602001611737610afc565b73ffffffffffffffffffffffffffffffffffffffff16815260200161175a6115b8565b73ffffffffffffffffffffffffffffffffffffffff16815260200161177d610bb9565b73ffffffffffffffffffffffffffffffffffffffff1681526020016117a0611576565b73ffffffffffffffffffffffffffffffffffffffff169052919050565b6000610acd610ac960017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637613119565b6117f5611cc6565b610af9816121ce565b610a9660017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598613119565b611831611cc6565b610b3e82826129c0565b6000610acd610ac960017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8613119565b611873611cc6565b610af981611d47565b6000610acd610ac960017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598613119565b60006118b6610ff9565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611274573d6000803e3d6000fd5b610a9660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b600080611936610afc565b90508073ffffffffffffffffffffffffffffffffffffffff1663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f5919061316d565b6119af6120ae565b6000828152606d602052604090205460ff161515811515036119fd576040517ff5828b0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f4554485f4c4f434b424f580000000000000000000000000000000000000000008203611b4e576000828152606d602052604090205460ff168015611a40575080155b8015611ad857506000611a51610afc565b73ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abf919061316d565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611b0f576040517ff5828b0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b176112ee565b15611b4e576040517ff5828b0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152606d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091559051909184917fb876f6594132c89891d2fd198e925e999be741ec809abb58bfe9b966876cc06c9190a35050565b611bc0611cc6565b73ffffffffffffffffffffffffffffffffffffffff8116611c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610cc3565b610af981612800565b610a9660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377613119565b610a9660017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad613119565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cc3565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051611d9c919061305c565b60405180910390a35050565b606a80547fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff166801000000000000000063ffffffff8516027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff16176c0100000000000000000000000067ffffffffffffffff841690810291909117909155604080516bffffffff000000000000000085831b16909217602083015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060055b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051611eab919061305c565b60405180910390a3505050565b611ee17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003611d6b565b606a80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000061ffff8416908102919091179091556040805160208082019390935281518082039093018352810190526007611d6b565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506001611e7a565b336120b7610ff9565b73ffffffffffffffffffffffffffffffffffffffff16141580156120f85750336120df6118ac565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611538576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff166121c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610cc3565b611538612b92565b6121d66112c8565b67ffffffffffffffff168167ffffffffffffffff161015612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610cc3565b631dcd650067ffffffffffffffff821611156122cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610cc3565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611d6b565b612352610ac960017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b6000036115385761153861238760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff16111561243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610cc3565b6001816040015160ff16116124d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610cc3565b6068546080820151825167ffffffffffffffff909216916124f4919061329e565b63ffffffff161115612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610cc3565b6000816020015160ff16116125f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610cc3565b8051602082015163ffffffff82169160ff909116906126199082906132bd565b6126239190613307565b63ffffffff16146126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610cc3565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606c80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040805160208082019390935281518082039093018352810190526006611d6b565b7fff0000000000000000000000000000000000000000000000000000000000000081161561299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610cc3565b606582905560668190556040805160208101849052908101829052600090606001612077565b60018263ffffffff161015612a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65203e3d203100000000000000000000000000000000000000000000000000006064820152608401610cc3565b60018163ffffffff161015612aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f53797374656d436f6e6669673a20656c6173746963697479206d75737420626560448201527f203e3d20310000000000000000000000000000000000000000000000000000006064820152608401610cc3565b606a805463ffffffff83811664010000000081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009093169186169190911791909117909155604051600091612b5b91602086811b67ffffffff0000000016909217910190815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506004611e7a565b600054610100900460ff16612c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610cc3565b61153833612800565b73ffffffffffffffffffffffffffffffffffffffff81168114610af957600080fd5b8035612c5f81612c32565b919050565b600060208284031215612c7657600080fd5b8135612c8181612c32565b9392505050565b803563ffffffff81168114612c5f57600080fd5b803567ffffffffffffffff81168114612c5f57600080fd5b60008060408385031215612cc757600080fd5b612cd083612c88565b9150612cde60208401612c9c565b90509250929050565b600060208284031215612cf957600080fd5b813561ffff81168114612c8157600080fd5b60008060408385031215612d1e57600080fd5b612d2783612c88565b9150612cde60208401612c88565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612d8757612d87612d35565b60405290565b803560ff81168114612c5f57600080fd5b600060e08284031215612db057600080fd5b60405160e0810181811067ffffffffffffffff82111715612dd357612dd3612d35565b6040529050808235612de481612c32565b81526020830135612df481612c32565b60208201526040830135612e0781612c32565b60408201526060830135612e1a81612c32565b6060820152612e2b60808401612c54565b6080820152612e3c60a08401612c54565b60a0820152612e4d60c08401612c54565b60c08201525092915050565b60008060008060008060008060008060008b8d036102c0811215612e7c57600080fd5b8c35612e8781612c32565b9b50612e9560208e01612c88565b9a50612ea360408e01612c88565b995060608d01359850612eb860808e01612c9c565b975060a08d0135612ec881612c32565b965060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215612efa57600080fd5b50612f03612d64565b612f0f60c08e01612c88565b8152612f1d60e08e01612d8d565b6020820152612f2f6101008e01612d8d565b6040820152612f416101208e01612c88565b6060820152612f536101408e01612c88565b60808201526101608d01356fffffffffffffffffffffffffffffffff81168114612f7c57600080fd5b60a08201529450612f906101808d01612c54565b9350612fa08d6101a08e01612d9e565b92506102808c01359150612fb76102a08d01612c54565b90509295989b509295989b9093969950565b600060208284031215612fdb57600080fd5b5035919050565b60005b83811015612ffd578181015183820152602001612fe5565b8381111561300c576000848401525b50505050565b6000815180845261302a816020860160208601612fe2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c816020830184613012565b60006020828403121561308157600080fd5b612c8182612c9c565b6000806040838503121561309d57600080fd5b50508035926020909101359150565b8015158114610af957600080fd5b600080604083850312156130cd57600080fd5b8235915060208301356130df816130ac565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561312b5761312b6130ea565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613168576131686130ea565b500290565b60006020828403121561317f57600080fd5b8151612c8181612c32565b600067ffffffffffffffff8083168185168083038211156131ad576131ad6130ea565b01949350505050565b6000602082840312156131c857600080fd5b8151612c81816130ac565b6000602082840312156131e557600080fd5b815167ffffffffffffffff808211156131fd57600080fd5b818401915084601f83011261321157600080fd5b81518181111561322357613223612d35565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561326957613269612d35565b8160405282815287602084870101111561328257600080fd5b613293836020830160208801612fe2565b979650505050505050565b600063ffffffff8083168185168083038211156131ad576131ad6130ea565b600063ffffffff808416806132fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561332a5761332a6130ea565b0294935050505056fea164736f6c634300080f000a"; + bytes internal constant acc27Code = + hex"6080604052600436106101cd5760003560e01c80635c975abb116100f7578063b1b1b20911610095578063db505d8011610064578063db505d8014610556578063ddd5a40f14610583578063e46e245a14610599578063ecc70428146105ae57600080fd5b8063b1b1b209146104de578063b28ade251461050e578063d764ad0b1461052e578063dad544e01461054157600080fd5b806383a74074116100d157806383a740741461046c5780638cbeeef2146103835780639fce812c14610483578063a4e7f8bd146104ae57600080fd5b80635c975abb146104055780636425666b1461042a5780636e296e451461045757600080fd5b806338d38c971161016f578063485cc9551161013e578063485cc955146103635780634c1d6a691461038357806354fd4d50146103995780635644cfdf146103ef57600080fd5b806338d38c97146102d35780633dbb202b146103115780633e47158c146103265780633f827a5a1461033b57600080fd5b80632828d7e8116101ab5780632828d7e8146102665780632f7d39221461027b57806333d7e2bd1461029157806335e80ab3146102be57600080fd5b8063028f85f7146101d25780630c568498146102055780630ff754ea1461021a575b600080fd5b3480156101de57600080fd5b506101e7601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561021157600080fd5b506101e7603f81565b34801561022657600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fc565b34801561027257600080fd5b506101e7604081565b34801561028757600080fd5b506101e761520881565b34801561029d57600080fd5b5060fe546102419073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ca57600080fd5b50610241610613565b3480156102df57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000031681526020016101fc565b61032461031f366004611f13565b6106ac565b005b34801561033257600080fd5b5061024161093f565b34801561034757600080fd5b50610350600181565b60405161ffff90911681526020016101fc565b34801561036f57600080fd5b5061032461037e366004611f7a565b610b4a565b34801561038f57600080fd5b506101e7619c4081565b3480156103a557600080fd5b506103e26040518060400160405280600681526020017f322e31312e31000000000000000000000000000000000000000000000000000081525081565b6040516101fc919061201e565b3480156103fb57600080fd5b506101e761138881565b34801561041157600080fd5b5061041a610da4565b60405190151581526020016101fc565b34801561043657600080fd5b5060fc546102419073ffffffffffffffffffffffffffffffffffffffff1681565b34801561046357600080fd5b50610241610e38565b34801561047857600080fd5b506101e762030d4081565b34801561048f57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff16610241565b3480156104ba57600080fd5b5061041a6104c9366004612031565b60ce6020526000908152604090205460ff1681565b3480156104ea57600080fd5b5061041a6104f9366004612031565b60cb6020526000908152604090205460ff1681565b34801561051a57600080fd5b506101e7610529366004612079565b610f1f565b61032461053c366004612159565b610fe0565b34801561054d57600080fd5b506102416118f5565b34801561056257600080fd5b5060cf546102419073ffffffffffffffffffffffffffffffffffffffff1681565b34801561058f57600080fd5b506101e761010481565b3480156105a557600080fd5b506101e7602881565b3480156105ba57600080fd5b5061060560cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101fc565b60fe54604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a791906121df565b905090565b60cf54604080516020601f86018190048102820181019092528481526108149273ffffffffffffffffffffffffffffffffffffffff169161070a91908790879081908401838280828437600092019190915250879250610f1f915050565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061077660cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016107929796959493929190612245565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611949565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561089960cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516108ab9594939291906122a4565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60008061096a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561098d57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026109d09190612321565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610a2b906060015b604051602081830303815290604052805190602001205490565b14610a62576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610a8490606001610a11565b905073ffffffffffffffffffffffffffffffffffffffff811615610b18578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1191906121df565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000036000547501000000000000000000000000000000000000000000900460ff16158015610bb6575060005460ff8083167401000000000000000000000000000000000000000090920416105b610c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60ff84167401000000000000000000000000000000000000000002167fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909116177501000000000000000000000000000000000000000000179055610ccf6119e2565b60fe805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805492851692909116919091179055610d41734200000000000000000000000000000000000007611a65565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60fe54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a7919061235e565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f742073657400000000000000000000006064820152608401610c3e565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600080603f610f35604063ffffffff8616612380565b610f3f91906123b0565b611388619c40610f528162030d406123fe565b610f5c91906123fe565b610f6691906123fe565b610f7091906123fe565b9050600061010467ffffffffffffffff168551610f8d919061242a565b9050610fcb610f9d601083612380565b610fa790846123fe565b67ffffffffffffffff16610fbc602884612380565b67ffffffffffffffff16611ba1565b610fd7906152086123fe565b95945050505050565b610fe8610da4565b1561104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a20706175736564000000006044820152606401610c3e565b60f087901c6002811061110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a401610c3e565b8061ffff166000036111ff57600061115b878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250611bba915050565b600081815260cb602052604090205490915060ff16156111fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c617965640000000000000000006064820152608401610c3e565b505b6000611245898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bd992505050565b905061124f611bfc565b156112875785341461126357611263612442565b600081815260ce602052604090205460ff161561128257611282612442565b6113d9565b341561133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a401610c3e565b600081815260ce602052604090205460ff166113d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c61796564000000000000000000000000000000006064820152608401610c3e565b6113e287611cd8565b15611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a401610c3e565b600081815260cb602052604090205460ff1615611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c61796564000000000000000000006064820152608401610c3e565b61155585611546611388619c406123fe565b67ffffffffffffffff16611d1e565b158061157b575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561169457600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610c3e565b50506118ec565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061172588619c405a6116e89190612471565b8988888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d3c92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156117db57600082815260cb602052604090205460ff161561177857611778612442565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26118e8565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016118e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610c3e565b5050505b50505050505050565b60006118ff61093f565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610683573d6000803e3d6000fd5b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c429084906119aa908890839089906000908990600401612488565b6000604051808303818588803b1580156119c357600080fd5b505af11580156119d7573d6000803e3d6000fd5b505050505050505050565b336119eb61093f565b73ffffffffffffffffffffffffffffffffffffffff1614158015611a2c575033611a136118f5565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611a63576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000547501000000000000000000000000000000000000000000900460ff16611b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610c3e565b60cc5473ffffffffffffffffffffffffffffffffffffffff16611b5a5760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081831015611bb15781611bb3565b825b9392505050565b6000611bc885858585611d54565b805190602001209050949350505050565b6000611be9878787878787611ded565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156106a7575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa158015611c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbc91906121df565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611d18575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000806000835160208501868989f195945050505050565b606084848484604051602401611d6d94939291906124e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611e0a9695949392919061252a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611eae57600080fd5b50565b60008083601f840112611ec357600080fd5b50813567ffffffffffffffff811115611edb57600080fd5b602083019150836020828501011115611ef357600080fd5b9250929050565b803563ffffffff81168114611f0e57600080fd5b919050565b60008060008060608587031215611f2957600080fd5b8435611f3481611e8c565b9350602085013567ffffffffffffffff811115611f5057600080fd5b611f5c87828801611eb1565b9094509250611f6f905060408601611efa565b905092959194509250565b60008060408385031215611f8d57600080fd5b8235611f9881611e8c565b91506020830135611fa881611e8c565b809150509250929050565b6000815180845260005b81811015611fd957602081850181015186830182015201611fbd565b81811115611feb576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611bb36020830184611fb3565b60006020828403121561204357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561208c57600080fd5b823567ffffffffffffffff808211156120a457600080fd5b818501915085601f8301126120b857600080fd5b8135818111156120ca576120ca61204a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156121105761211061204a565b8160405282815288602084870101111561212957600080fd5b82602086016020830137600060208483010152809650505050505061215060208401611efa565b90509250929050565b600080600080600080600060c0888a03121561217457600080fd5b87359650602088013561218681611e8c565b9550604088013561219681611e8c565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156121c057600080fd5b6121cc8a828b01611eb1565b989b979a50959850939692959293505050565b6000602082840312156121f157600080fd5b8151611bb381611e8c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a083015261229760c0830184866121fc565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff861681526080602082015260006122d46080830186886121fc565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612359576123596122f2565b500290565b60006020828403121561237057600080fd5b81518015158114611bb357600080fd5b600067ffffffffffffffff808316818516818304811182151516156123a7576123a76122f2565b02949350505050565b600067ffffffffffffffff808416806123f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115612421576124216122f2565b01949350505050565b6000821982111561243d5761243d6122f2565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015612483576124836122f2565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a0608082015260006124d560a0830184611fb3565b979650505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526125196080830185611fb3565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261257560c0830184611fb3565b9897505050505050505056fea164736f6c634300080f000a"; + bytes internal constant acc28Code = + hex"608060405234801561001057600080fd5b50600436106101005760003560e01c80635c975abb11610097578063927ede2d11610066578063927ede2d1461029e578063aa557452146102bc578063c89701a2146102cf578063dad544e0146102ef57600080fd5b80635c975abb146102215780635d93a3fc14610239578063761f44931461026d5780637f46ddb21461028057600080fd5b80633cb747bf116100d35780633cb747bf1461019d5780633e47158c146101bd578063485cc955146101c557806354fd4d50146101d857600080fd5b806333d7e2bd1461010557806335e80ab31461014f5780633687011a1461015757806338d38c971461016c575b600080fd5b6033546101259073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101256102f7565b61016a6101653660046113be565b610390565b005b60405160ff7f0000000000000000000000000000000000000000000000000000000000000003168152602001610146565b6001546101259073ffffffffffffffffffffffffffffffffffffffff1681565b610125610441565b61016a6101d3366004611441565b61064c565b6102146040518060400160405280600581526020017f322e392e3100000000000000000000000000000000000000000000000000000081525081565b60405161014691906114e5565b610229610812565b6040519015158152602001610146565b6102296102473660046114ff565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61016a61027b366004611540565b6108a6565b60025473ffffffffffffffffffffffffffffffffffffffff16610125565b60015473ffffffffffffffffffffffffffffffffffffffff16610125565b61016a6102ca3660046115d8565b610d4d565b6002546101259073ffffffffffffffffffffffffffffffffffffffff1681565b610125610e09565b603354604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b919061164f565b905090565b610398610e5d565b610429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104398686333388888888610e9a565b505050505050565b60008061046c7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561048f57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026104d2919061166c565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061052d906060015b604051602081830303815290604052805190602001205490565b14610564576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061058690606001610513565b905073ffffffffffffffffffffffffffffffffffffffff81161561061a578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610613919061164f565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff1615801561068c575060005460ff8083169116105b610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610420565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556107516111ca565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556107af8373420000000000000000000000000000000000001461124d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b603354604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b91906116d0565b60015473ffffffffffffffffffffffffffffffffffffffff163314801561097b5750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561093f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610963919061164f565b73ffffffffffffffffffffffffffffffffffffffff16145b610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f7468657220627269646765006064820152608401610420565b610a0f610812565b15610a76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a20706175736564000000000000000000006044820152606401610420565b3073ffffffffffffffffffffffffffffffffffffffff881603610b1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c66000000000000000000000000000000000000000000006064820152608401610420565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff161515600114610bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c3120427269646765000000000000006064820152608401610420565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610d3c949392919061173b565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f742062652061646472657373283029000000000000000000000000000000006064820152608401610420565b610e008787338888888888610e9a565b50505050505050565b6000610e13610441565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610367573d6000803e3d6000fd5b6000323303610e6c5750600190565b333b601703610e9457604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b73ffffffffffffffffffffffffffffffffffffffff8716610f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f7420626520616464726573732830290000000000000000000000000000006064820152608401610420565b600087898888888787604051602401610f5c979695949392919061177b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f761f44930000000000000000000000000000000000000000000000000000000017905273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603184528481208e8416825284528481208b82529093529183902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905591517f23b872dd000000000000000000000000000000000000000000000000000000008152918a166004830152306024830152604482018890529192506323b872dd90606401600060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b935061110b9290911690859089906004016117d8565b600060405180830381600087803b15801561112557600080fd5b505af1158015611139573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a5898988886040516111b7949392919061173b565b60405180910390a4505050505050505050565b336111d3610441565b73ffffffffffffffffffffffffffffffffffffffff16141580156112145750336111fb610e09565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561124b576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600054610100900460ff166112e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610420565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff8116811461135957600080fd5b50565b803563ffffffff8116811461137057600080fd5b919050565b60008083601f84011261138757600080fd5b50813567ffffffffffffffff81111561139f57600080fd5b6020830191508360208285010111156113b757600080fd5b9250929050565b60008060008060008060a087890312156113d757600080fd5b86356113e281611337565b955060208701356113f281611337565b9450604087013593506114076060880161135c565b9250608087013567ffffffffffffffff81111561142357600080fd5b61142f89828a01611375565b979a9699509497509295939492505050565b6000806040838503121561145457600080fd5b823561145f81611337565b9150602083013561146f81611337565b809150509250929050565b6000815180845260005b818110156114a057602081850181015186830182015201611484565b818111156114b2576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114f8602083018461147a565b9392505050565b60008060006060848603121561151457600080fd5b833561151f81611337565b9250602084013561152f81611337565b929592945050506040919091013590565b600080600080600080600060c0888a03121561155b57600080fd5b873561156681611337565b9650602088013561157681611337565b9550604088013561158681611337565b9450606088013561159681611337565b93506080880135925060a088013567ffffffffffffffff8111156115b957600080fd5b6115c58a828b01611375565b989b979a50959850939692959293505050565b600080600080600080600060c0888a0312156115f357600080fd5b87356115fe81611337565b9650602088013561160e81611337565b9550604088013561161e81611337565b9450606088013593506116336080890161135c565b925060a088013567ffffffffffffffff8111156115b957600080fd5b60006020828403121561166157600080fd5b81516114f881611337565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156116cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b6000602082840312156116e257600080fd5b815180151581146114f857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006117716060830184866116f2565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117cb60c0830184866116f2565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611807606083018561147a565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"; + bytes internal constant acc29Code = + hex"6080604052600436106101a55760003560e01c80635c975abb116100e1578063927ede2d1161008a578063b1a1a88211610064578063b1a1a88214610597578063c89701a2146105aa578063dad544e0146105d7578063e11013dd146105ec57600080fd5b8063927ede2d146105395780639a2ac6d514610564578063a9f9e6751461057757600080fd5b806387087623116100bb57806387087623146104d35780638f601f66146104f357806391c49bf81461048857600080fd5b80635c975abb146104635780637f46ddb214610488578063838b2520146104b357600080fd5b806338d38c971161014e578063485cc95511610128578063485cc955146103ad578063540abf73146103cd57806354fd4d50146103ed57806358a997f61461044357600080fd5b806338d38c971461032d5780633cb747bf1461036b5780633e47158c1461039857600080fd5b80631635f5fd1161017f5780631635f5fd146102ae57806333d7e2bd146102c157806335e80ab31461031857600080fd5b80630166a07a1461026857806309fc8843146102885780631532ec341461029b57600080fd5b36610263576101b26105ff565b610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610261333362030d406040518060200160405280600081525061063c565b005b600080fd5b34801561027457600080fd5b50610261610283366004612b73565b61064f565b610261610296366004612c24565b610a69565b6102616102a9366004612c77565b610b45565b6102616102bc366004612c77565b610b59565b3480156102cd57600080fd5b506034546102ee9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561032457600080fd5b506102ee611022565b34801561033957600080fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000316815260200161030f565b34801561037757600080fd5b506003546102ee9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a457600080fd5b506102ee6110bb565b3480156103b957600080fd5b506102616103c8366004612cea565b6112c6565b3480156103d957600080fd5b506102616103e8366004612d23565b61148c565b3480156103f957600080fd5b506104366040518060400160405280600581526020017f322e382e3100000000000000000000000000000000000000000000000000000081525081565b60405161030f9190612e10565b34801561044f57600080fd5b5061026161045e366004612e23565b6114d1565b34801561046f57600080fd5b506104786115aa565b604051901515815260200161030f565b34801561049457600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102ee565b3480156104bf57600080fd5b506102616104ce366004612d23565b61163e565b3480156104df57600080fd5b506102616104ee366004612e23565b611683565b3480156104ff57600080fd5b5061052b61050e366004612cea565b600260209081526000928352604080842090915290825290205481565b60405190815260200161030f565b34801561054557600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102ee565b610261610572366004612ea6565b61175c565b34801561058357600080fd5b50610261610592366004612b73565b61179e565b6102616105a5366004612c24565b6117ad565b3480156105b657600080fd5b506004546102ee9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105e357600080fd5b506102ee611883565b6102616105fa366004612ea6565b6118d7565b600032330361060e5750600190565b333b60170361063657604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b610649848434858561191a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610722575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a9190612f09565b73ffffffffffffffffffffffffffffffffffffffff16145b6107d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161023a565b6107dc6115aa565b15610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a2070617573656400000000000000000000604482015260640161023a565b61084c87611ae4565b1561099a5761085b8787611b46565b61090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a40161023a565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561097d57600080fd5b505af1158015610991573d6000803e3d6000fd5b50505050610a1c565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546109d8908490612f55565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610a1c908585611c66565b610a60878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d3a92505050565b50505050505050565b610a716105ff565b610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b610b403333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061191a92505050565b505050565b610b528585858585610b59565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610c2c575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190612f09565b73ffffffffffffffffffffffffffffffffffffffff16145b610cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161023a565b610ce66115aa565b15610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a2070617573656400000000000000000000604482015260640161023a565b823414610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e74207265717569726564000000000000606482015260840161023a565b3073ffffffffffffffffffffffffffffffffffffffff851603610e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c660000000000000000000000000000000000000000000000000000000000606482015260840161023a565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e676572000000000000000000000000000000000000000000000000606482015260840161023a565b610f6e85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dc892505050565b6000610f8b855a8660405180602001604052806000815250611e3b565b90508061101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161023a565b505050505050565b603454604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b69190612f09565b905090565b6000806110e67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561110957919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261114c9190612f6c565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906111a7906060015b604051602081830303815290604052805190602001205490565b146111de576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906112009060600161118d565b905073ffffffffffffffffffffffffffffffffffffffff811615611294578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128d9190612f09565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff16158015611306575060005460ff8083169116105b611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161023a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556113cb611e53565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905561142983734200000000000000000000000000000000000010611ed6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610a6087873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fc092505050565b6114d96105ff565b611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b61101a86863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237992505050565b603454604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b69190612fa9565b610a6087873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237992505050565b61168b6105ff565b611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b61101a86863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fc092505050565b61064933858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061063c92505050565b610a608787878787878761064f565b6117b56105ff565b611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b610b4033338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061063c92505050565b600061188d6110bb565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611092573d6000803e3d6000fd5b6106493385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061191a92505050565b8234146119a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c75650000606482015260840161023a565b6119b585858584612388565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611a18908b908b9086908a90602401612fcb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b9092168252611aab92918890600401613014565b6000604051808303818588803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b50505050505050505050565b6000611b10827f1d1d8b63000000000000000000000000000000000000000000000000000000006123fb565b80611b405750611b40827fec4fc8e3000000000000000000000000000000000000000000000000000000006123fb565b92915050565b6000611b72837f1d1d8b63000000000000000000000000000000000000000000000000000000006123fb565b15611c1b578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be69190612f09565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611b40565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b409084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261241e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611db293929190613059565b60405180910390a461101a86868686868661252a565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611e27929190613097565b60405180910390a3610649848484846125b2565b6000806000835160208501868989f195945050505050565b33611e5c6110bb565b73ffffffffffffffffffffffffffffffffffffffff1614158015611e9d575033611e84611883565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611ed4576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600054610100900460ff16611f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161023a565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b341561204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161023a565b61205787611ae4565b156121a5576120668787611b46565b612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a40161023a565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b15801561218857600080fd5b505af115801561219c573d6000803e3d6000fd5b50505050612239565b6121c773ffffffffffffffffffffffffffffffffffffffff881686308661261f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546122059084906130b0565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b61224787878787878661267d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a00000000000000000000000000000000000000000000000000000000906122ab908b908d908c908c908c908b906024016130c8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261233e92918790600401613014565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b5050505050505050505050565b610a6087878787878787611fc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f2384846040516123e7929190613097565b60405180910390a36106498484848461270b565b60006124068361276a565b8015612417575061241783836127ce565b9392505050565b6000612480826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661289d9092919063ffffffff16565b805190915015610b40578080602001905181019061249e9190612fa9565b610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161023a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516125a293929190613059565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612611929190613097565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526106499085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611cb8565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d03968686866040516126f593929190613059565b60405180910390a461101a8686868686866128b4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612611929190613097565b6000612796827f01ffc9a7000000000000000000000000000000000000000000000000000000006127ce565b8015611b4057506127c7827fffffffff000000000000000000000000000000000000000000000000000000006127ce565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612886575060208210155b80156128925750600081115b979650505050505050565b60606128ac848460008561292c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516125a293929190613059565b6060824710156129be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161023a565b73ffffffffffffffffffffffffffffffffffffffff85163b612a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161023a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612a659190613123565b60006040518083038185875af1925050503d8060008114612aa2576040519150601f19603f3d011682016040523d82523d6000602084013e612aa7565b606091505b509150915061289282828660608315612ac1575081612417565b825115612ad15782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023a9190612e10565b73ffffffffffffffffffffffffffffffffffffffff81168114612b2757600080fd5b50565b60008083601f840112612b3c57600080fd5b50813567ffffffffffffffff811115612b5457600080fd5b602083019150836020828501011115612b6c57600080fd5b9250929050565b600080600080600080600060c0888a031215612b8e57600080fd5b8735612b9981612b05565b96506020880135612ba981612b05565b95506040880135612bb981612b05565b94506060880135612bc981612b05565b93506080880135925060a088013567ffffffffffffffff811115612bec57600080fd5b612bf88a828b01612b2a565b989b979a50959850939692959293505050565b803563ffffffff81168114612c1f57600080fd5b919050565b600080600060408486031215612c3957600080fd5b612c4284612c0b565b9250602084013567ffffffffffffffff811115612c5e57600080fd5b612c6a86828701612b2a565b9497909650939450505050565b600080600080600060808688031215612c8f57600080fd5b8535612c9a81612b05565b94506020860135612caa81612b05565b935060408601359250606086013567ffffffffffffffff811115612ccd57600080fd5b612cd988828901612b2a565b969995985093965092949392505050565b60008060408385031215612cfd57600080fd5b8235612d0881612b05565b91506020830135612d1881612b05565b809150509250929050565b600080600080600080600060c0888a031215612d3e57600080fd5b8735612d4981612b05565b96506020880135612d5981612b05565b95506040880135612d6981612b05565b945060608801359350612d7e60808901612c0b565b925060a088013567ffffffffffffffff811115612bec57600080fd5b60005b83811015612db5578181015183820152602001612d9d565b838111156106495750506000910152565b60008151808452612dde816020860160208601612d9a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124176020830184612dc6565b60008060008060008060a08789031215612e3c57600080fd5b8635612e4781612b05565b95506020870135612e5781612b05565b945060408701359350612e6c60608801612c0b565b9250608087013567ffffffffffffffff811115612e8857600080fd5b612e9489828a01612b2a565b979a9699509497509295939492505050565b60008060008060608587031215612ebc57600080fd5b8435612ec781612b05565b9350612ed560208601612c0b565b9250604085013567ffffffffffffffff811115612ef157600080fd5b612efd87828801612b2a565b95989497509550505050565b600060208284031215612f1b57600080fd5b815161241781612b05565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612f6757612f67612f26565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fa457612fa4612f26565b500290565b600060208284031215612fbb57600080fd5b8151801515811461241757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261300a6080830184612dc6565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006130436060830185612dc6565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260606040820152600061308e6060830184612dc6565b95945050505050565b8281526040602082015260006128ac6040830184612dc6565b600082198211156130c3576130c3612f26565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261311760c0830184612dc6565b98975050505050505050565b60008251613135818460208701612d9a565b919091019291505056fea164736f6c634300080f000a"; + bytes internal constant acc30Code = + hex"60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063c4d66de81162000062578063c4d66de81462000175578063ce5ac90f146200018e578063e78cea9214620001a5578063ee9a31a214620001c657600080fd5b8063316b3739146200009857806354fd4d5014620000fb578063896f93d114620001475780638cf0629c146200015e575b600080fd5b620000d1620000a936600462000636565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620001386040518060400160405280600681526020017f312e31302e32000000000000000000000000000000000000000000000000000081525081565b604051620000f29190620006c9565b620000d162000158366004620007c0565b620001e5565b620000d16200016f3660046200083d565b620001fc565b6200018c6200018636600462000636565b6200041b565b005b620000d16200019f366004620007c0565b620005ed565b600154620000d19073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000d1565b6000620001f4848484620005ed565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8516620002a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b600085858585604051602001620002c29493929190620008d4565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888888886040516200031290620005fe565b620003229594939291906200092e565b8190604051809103906000f590508015801562000343573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff81811660008181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948d1694851790555193945090927fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf9190a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff16158080156200043c5750600054600160ff909116105b80620004585750303b15801562000458575060005460ff166001145b620004e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200029e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200054557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015620005e957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001f48484846012620001fc565b6120e0806200099483390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200063157600080fd5b919050565b6000602082840312156200064957600080fd5b62000654826200060c565b9392505050565b6000815180845260005b81811015620006835760208185018101518683018201520162000665565b8181111562000696576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200065460208301846200065b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200071f57600080fd5b813567ffffffffffffffff808211156200073d576200073d620006de565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620007865762000786620006de565b81604052838152866020858801011115620007a057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215620007d657600080fd5b620007e1846200060c565b9250602084013567ffffffffffffffff80821115620007ff57600080fd5b6200080d878388016200070d565b935060408601359150808211156200082457600080fd5b5062000833868287016200070d565b9150509250925092565b600080600080608085870312156200085457600080fd5b6200085f856200060c565b9350602085013567ffffffffffffffff808211156200087d57600080fd5b6200088b888389016200070d565b94506040870135915080821115620008a257600080fd5b50620008b1878288016200070d565b925050606085013560ff81168114620008c957600080fd5b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006200090560808301866200065b565b82810360408401526200091981866200065b565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200096960a08301866200065b565b82810360608401526200097d81866200065b565b91505060ff83166080830152969550505050505056fe6101a06040523480156200001257600080fd5b50604051620020e0380380620020e0833981016040819052620000359162000215565b6040805180820190915260018152603160f81b6020820152839081908185600362000061838262000350565b50600462000070828262000350565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060c05261012052505050506001600160a01b0394851661014052509390921661016052505060ff16610180526200041c565b80516001600160a01b03811681146200014357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200017057600080fd5b81516001600160401b03808211156200018d576200018d62000148565b604051601f8301601f19908116603f01168101908282118183101715620001b857620001b862000148565b81604052838152602092508683858801011115620001d557600080fd5b600091505b83821015620001f95785820183015181830184015290820190620001da565b838211156200020b5760008385830101525b9695505050505050565b600080600080600060a086880312156200022e57600080fd5b62000239866200012b565b945062000249602087016200012b565b60408701519094506001600160401b03808211156200026757600080fd5b6200027589838a016200015e565b945060608801519150808211156200028c57600080fd5b506200029b888289016200015e565b925050608086015160ff81168114620002b357600080fd5b809150509295509295909350565b600181811c90821680620002d657607f821691505b602082108103620002f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034b57600081815260208120601f850160051c81016020861015620003265750805b601f850160051c820191505b81811015620003475782815560010162000332565b5050505b505050565b81516001600160401b038111156200036c576200036c62000148565b62000384816200037d8454620002c1565b84620002fd565b602080601f831160018114620003bc5760008415620003a35750858301515b600019600386901b1c1916600185901b17855562000347565b600085815260208120601f198616915b82811015620003ed57888601518255948401946001909101908401620003cc565b50858210156200040c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516101005161012051610140516101605161018051611c37620004a960003960006102700152600081816103a70152818161041c0152818161064801526107aa0152600081816101d501526103cd01526000611174015260006111c30152600061119e015260006110f7015260006111210152600061114b0152611c376000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063ae1f6aaf11610097578063d6c0b2c411610071578063d6c0b2c4146103cb578063dd62ed3e14610404578063e78cea92146103a5578063ee9a31a21461041757600080fd5b8063ae1f6aaf146103a5578063c01e1bd6146103cb578063d505accf146103f157600080fd5b80639dc29fac116100c85780639dc29fac1461036c578063a457c2d71461037f578063a9059cbb1461039257600080fd5b806370a082311461031b5780637ecebe001461035157806395d89b411461036457600080fd5b8063313ce5671161015057806340c10f191161012a57806340c10f19146102b557806354fd4d50146102ca5780636afdd8501461030657600080fd5b8063313ce567146102695780633644e5151461029a57806339509351146102a257600080fd5b8063095ea7b311610181578063095ea7b31461023157806318160ddd1461024457806323b872dd1461025657600080fd5b806301ffc9a7146101a8578063033964be146101d057806306fdde031461021c575b600080fd5b6101bb6101b636600461194b565b61043e565b60405190151581526020015b60405180910390f35b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b61022461052f565b6040516101c7919061198d565b6101bb61023f366004611a29565b6105c1565b6002545b6040519081526020016101c7565b6101bb610264366004611a53565b6105db565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c7565b6102486105ff565b6101bb6102b0366004611a29565b61060e565b6102c86102c3366004611a29565b610630565b005b6102246040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b6e22d473030f116ddee9f6b43ac78ba36101f7565b610248610329366004611a8f565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61024861035f366004611a8f565b610758565b610224610783565b6102c861037a366004611a29565b610792565b6101bb61038d366004611a29565b6108a9565b6101bb6103a0366004611a29565b610956565b7f00000000000000000000000000000000000000000000000000000000000000006101f7565b7f00000000000000000000000000000000000000000000000000000000000000006101f7565b6102c86103ff366004611aaa565b610964565b610248610412366004611b1d565b610b23565b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104f757507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061052657507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461053e90611b50565b80601f016020809104026020016040519081016040528092919081815260200182805461056a90611b50565b80156105b75780601f1061058c576101008083540402835291602001916105b7565b820191906000526020600020905b81548152906001019060200180831161059a57829003601f168201915b5050505050905090565b6000336105cf818585610bc4565b60019150505b92915050565b6000336105e9858285610d78565b6105f4858585610e2a565b506001949350505050565b60006106096110dd565b905090565b6000336105cf8185856106218383610b23565b61062b9190611bcc565b610bc4565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6107048282611211565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161074c91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120546105d5565b60606004805461053e90611b50565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106f1565b6108618282611331565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161074c91815260200190565b600033816108b78286610b23565b905083811015610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106f1565b6105f48286868403610bc4565b6000336105cf818585610e2a565b834211156109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016106f1565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109fd8c611516565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610a658261154b565b90506000610a75828787876115b4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016106f1565b610b178a8a8a610bc4565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffdd2b8cfcf0ee922116094bc538745d73ffffffffffffffffffffffffffffffffffffffff831601610b8957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105d5565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160209081526040808320938616835292905220545b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff8216610d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610d848484610b23565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e245781811015610e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106f1565b610e248484848403610bc4565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff8216610f70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822085850390559185168152908120805484929061106a908490611bcc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110d091815260200190565b60405180910390a3610e24565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561114357507f000000000000000000000000000000000000000000000000000000000000000046145b1561116d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b73ffffffffffffffffffffffffffffffffffffffff821661128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f1565b80600260008282546112a09190611bcc565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040812080548392906112da908490611bcc565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166113d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906114c6908490611be4565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d6b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006105d56115586110dd565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006115c5878787876115dc565b915091506115d2816116f4565b5095945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561161357506000905060036116eb565b8460ff16601b1415801561162b57508460ff16601c14155b1561163c57506000905060046116eb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611690573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116e4576000600192509250506116eb565b9150600090505b94509492505050565b600081600481111561170857611708611bfb565b036117105750565b600181600481111561172457611724611bfb565b0361178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106f1565b600281600481111561179f5761179f611bfb565b03611806576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106f1565b600381600481111561181a5761181a611bfb565b036118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b60048160048111156118bb576118bb611bfb565b03611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b50565b60006020828403121561195d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bbd57600080fd5b600060208083528351808285015260005b818110156119ba5785810183015185820160400152820161199e565b818111156119cc576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a2457600080fd5b919050565b60008060408385031215611a3c57600080fd5b611a4583611a00565b946020939093013593505050565b600080600060608486031215611a6857600080fd5b611a7184611a00565b9250611a7f60208501611a00565b9150604084013590509250925092565b600060208284031215611aa157600080fd5b610bbd82611a00565b600080600080600080600060e0888a031215611ac557600080fd5b611ace88611a00565b9650611adc60208901611a00565b95506040880135945060608801359350608088013560ff81168114611b0057600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611b3057600080fd5b611b3983611a00565b9150611b4760208401611a00565b90509250929050565b600181811c90821680611b6457607f821691505b602082108103611545577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611bdf57611bdf611b9d565b500190565b600082821015611bf657611bf6611b9d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a"; + bytes internal constant acc31Code = + hex"6080604052600436106101d15760003560e01c806371c1566e116100f7578063a3860f4811610095578063cff0ab9611610064578063cff0ab9614610620578063dad544e0146106c1578063e9e05c42146106d6578063f2b4e617146106e957600080fd5b8063a3860f4814610520578063b682c44414610540578063bb2c727e14610560578063bf653a5c146105ed57600080fd5b8063952b2797116100d1578063952b27971461049b5780639bf62d82146104b0578063a14238e7146104d0578063a35d99df1461050057600080fd5b806371c1566e1461045b5780638b4c40b0146101f65780638c3152e91461047b57600080fd5b806345884d321161016f578063513747ab1161013e578063513747ab1461039f57806354fd4d50146103da5780635c0cba33146104265780635c975abb1461044657600080fd5b806345884d3214610301578063485cc955146103315780634870496f146103515780634fd0434c1461037157600080fd5b80633c9f397c116101ab5780633c9f397c1461028d5780633e47158c146102b757806343ca1c50146102cc578063452a9320146102ec57600080fd5b806333d7e2bd146101fd57806335e80ab31461023a57806338d38c971461024f57600080fd5b366101f8576101f63334620186a06000604051806020016040528060008152506106fe565b005b600080fd5b34801561020957600080fd5b5060375461021d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561024657600080fd5b5061021d61095b565b34801561025b57600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000003168152602001610231565b34801561029957600080fd5b506102a26109e7565b60405163ffffffff9091168152602001610231565b3480156102c357600080fd5b5061021d610a6e565b3480156102d857600080fd5b506101f66102e736600461457d565b610c52565b3480156102f857600080fd5b5061021d610fa8565b34801561030d57600080fd5b5061032161031c3660046145cf565b61100b565b6040519015158152602001610231565b34801561033d57600080fd5b506101f661034c3660046145ec565b611099565b34801561035d57600080fd5b506101f661036c36600461461a565b611281565b34801561037d57600080fd5b50610386611943565b60405167ffffffffffffffff9091168152602001610231565b3480156103ab57600080fd5b506103cc6103ba3660046146f6565b6000908152603c602052604090205490565b604051908152602001610231565b3480156103e657600080fd5b50604080518082018252600581527f352e322e31000000000000000000000000000000000000000000000000000000602082015290516102319190614767565b34801561043257600080fd5b50603e5461021d906001600160a01b031681565b34801561045257600080fd5b506103216119ca565b34801561046757600080fd5b506101f661047636600461477a565b611a51565b34801561048757600080fd5b506101f661049636600461479f565b611cfd565b3480156104a757600080fd5b506103cc611d0a565b3480156104bc57600080fd5b5060325461021d906001600160a01b031681565b3480156104dc57600080fd5b506103216104eb3660046146f6565b60336020526000908152604090205460ff1681565b34801561050c57600080fd5b5061038661051b3660046147f2565b611d91565b34801561052c57600080fd5b5061021d61053b36600461480f565b611daa565b34801561054c57600080fd5b50603f5461021d906001600160a01b031681565b34801561056c57600080fd5b506105c561057b36600461477a565b60396020908152600092835260408084209091529082529020546001600160a01b0381169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b604080516001600160a01b03909316835267ffffffffffffffff909116602083015201610231565b3480156105f957600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a806103cc565b34801561062c57600080fd5b50600154610688906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610231565b3480156106cd57600080fd5b5061021d611de2565b6101f66106e436600461483f565b6106fe565b3480156106f557600080fd5b5061021d611e29565b8260005a905061070c611e8c565b15610749573415610749576040517fbd58e0a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610751611f0e565b156107c65734156107c657603f60009054906101000a90046001600160a01b03166001600160a01b0316631ee116bf346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156107ac57600080fd5b505af11580156107c0573d6000803e3d6000fd5b50505050505b8380156107db57506001600160a01b03871615155b15610812576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61081c8351611d91565b67ffffffffffffffff168567ffffffffffffffff161015610869576040517f70c8bdbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156108a7576040517f5aa3bac900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336108b0611fcd565b6108cd575033731111000000000000000000000000000000001111015b600034888888886040516020016108e89594939291906148be565b60405160208183030381529060405290506000896001600160a01b0316836001600160a01b03167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161093e9190614767565b60405180910390a45050610952828261200a565b50505050505050565b603754604080517f35e80ab300000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916335e80ab39160048083019260209291908290030181865afa1580156109be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614923565b905090565b603e54604080517f3c9f397c00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691633c9f397c9160048083019260209291908290030181865afa158015610a4a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614952565b600080610a997fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b90506001600160a01b03811615610aaf57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002610af2919061499e565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610b4d906060015b604051602081830303815290604052805190602001205490565b14610b84576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610ba690606001610b33565b90506001600160a01b03811615610c2057806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c199190614923565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5a6122e1565b610c62611e8c565b15610ca357606082015115610ca3576040517fbd58e0a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6032546001600160a01b031661dead14610ce9576040517fdfeaaeb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf68260400151612320565b15610d2d576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d3883612349565b9050610d448183611a51565b600081815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d83611f0e565b15610e1557606083015115610e1557603f5460608401516040517f8d445bd00000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691638d445bd091610de29160040190815260200190565b600060405180830381600087803b158015610dfc57600080fd5b505af1158015610e10573d6000803e3d6000fd5b505050505b8260200151603260006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000610e5e8460400151856080015186606001518760a00151612396565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610ec390841515815260200190565b60405180910390a2610ed3611f0e565b15610f5d5780158015610eea575060008460600151115b15610f5d57603f60009054906101000a90046001600160a01b03166001600160a01b0316631ee116bf85606001516040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f4357600080fd5b505af1158015610f57573d6000803e3d6000fd5b50505050505b80158015610f6b5750326001145b15610fa2576040517fab58103600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b603754604080517f452a932000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163452a93209160048083019260209291908290030181865afa1580156109be573d6000803e3d6000fd5b603e546040517f45884d320000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906345884d3290602401602060405180830381865afa15801561106f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109391906149bd565b92915050565b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff161580156110d9575060005460ff8083169116105b6111505760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556111896123f4565b603780546001600160a01b038086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603e8054928516929091169190911790556111d961245b565b6032546001600160a01b031661121657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b61121e61260e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6112896122e1565b6112968560400151612320565b156112cd576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d5611e8c565b1561131657606085015115611316576040517fbd58e0a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611320611e29565b6001600160a01b031663bb8aa1fc866040518263ffffffff1660e01b815260040161134d91815260200190565b606060405180830381865afa15801561136a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138e91906149da565b603e546040517f496b9c160000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301529295509116925063496b9c169150602401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141991906149bd565b61144f576040517ff395240e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f04e50fed0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152909116906304e50fed90602401602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d691906149bd565b61150c576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001816001600160a01b031663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115709190614a56565b600281111561158157611581614a27565b036115b8576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162a816001600160a01b031663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d9190614a77565b67ffffffffffffffff1690565b67ffffffffffffffff16421161166c576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61168361167e36869003860186614a94565b612707565b6116eb826001600160a01b031663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e89190614afa565b90565b14611722576040517f426149af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061172d87612349565b9050600081600060405160200161174e929190918252602082015260400190565b60408051601f19818403018152828252805160209182012090830181905292506117c5910160408051601f19818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152906117bb8789614b13565b8960400135612746565b1515600003611800576040517f2e57ef3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820182526001600160a01b03808616825267ffffffffffffffff42811660208085019182526000888152603982528681203380835290835287822096518754945190951674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009094169486169490941792909217909455868152603c845284812080546001810182559082528482200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091558b840151928c01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a35050505050505050565b603e54604080517f4086d18300000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691634086d1839160048083019260209291908290030181865afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614a77565b603754604080517f5c975abb00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e291906149bd565b60008281526039602090815260408083206001600160a01b0385811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152868552603390935292205490919060ff1615611af3576040517f730a107400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816020015167ffffffffffffffff16600003611b3b576040517fcca6afda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7c816001600160a01b031663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f9573d6000803e3d6000fd5b67ffffffffffffffff16826020015167ffffffffffffffff1611611bcc576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000093a80826020015167ffffffffffffffff1642611c079190614b97565b11611c3e576040517fd9bc01be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f6c4f44670000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015290911690636c4f446790602401602060405180830381865afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc591906149bd565b610fa2576040517f332a57f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611d078133610c52565b50565b603e54604080517f952b279700000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163952b27979160048083019260209291908290030181865afa158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614afa565b6000611d9e826028614bae565b61109390615208614bde565b603c6020528160005260406000208181548110611dc657600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000611dec610a6e565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109be573d6000803e3d6000fd5b603e54604080517ff2b4e61700000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163f2b4e6179160048083019260209291908290030181865afa1580156109be573d6000803e3d6000fd5b6037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060048201526000916001600160a01b0316906347af267b90602401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b6037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201526000916001600160a01b0316906347af267b90602401602060405180830381865afa158015611f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb491906149bd565b80156109e2575050603f546001600160a01b0316151590565b6000323303611fdc5750600190565b333b60170361200457604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b600154600090612040907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614b97565b9050600061204c61276a565b90506000816020015160ff16826000015163ffffffff1661206d9190614c39565b905082156121a4576001546000906120a4908390700100000000000000000000000000000000900467ffffffffffffffff16614c83565b90506000836040015160ff16836120bb9190614cf7565b6001546120db9084906fffffffffffffffffffffffffffffffff16614cf7565b6120e59190614c39565b6001549091506000906121369061210f9084906fffffffffffffffffffffffffffffffff16614db3565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612823565b905060018611156121655761216261210f82876040015160ff1660018a61215d9190614b97565b612842565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906121d7908490700100000000000000000000000000000000900467ffffffffffffffff16614bde565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315612264576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612290906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661499e565b905060006122a248633b9aca00612897565b6122ac9083614e27565b905060005a6122bb9088614b97565b9050808211156122d7576122d76122d28284614b97565b6128ae565b5050505050505050565b6122e96119ca565b15611cfb576040517fb9c3c2ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b038216301480611093575050603f546001600160a01b0390811691161490565b80516020808301516040808501516060860151608087015160a08801519351600097612379979096959101614e3b565b604051602081830303815290604052805190602001209050919050565b60008060006123a68660006128dc565b9050806123dc576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b336123fd610a6e565b6001600160a01b031614158015612424575033612418611de2565b6001600160a01b031614155b15611cfb576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201526001600160a01b03909116906347af267b90602401602060405180830381865afa1580156124dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250091906149bd565b80156125155750603f546001600160a01b0316155b806125d757506037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201526001600160a01b03909116906347af267b90602401602060405180830381865afa15801561259c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c091906149bd565b1580156125d75750603f546001600160a01b031615155b15611cfb576040517f9c46cd7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1661268b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611147565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611cfb5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60008160000151826020015183604001518460600151604051602001612379949392919093845260208401929092526040830152606082015260800190565b600080612752866128fa565b90506127608186868661292c565b9695505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b0200000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cc731b029160048083019260c09291908290030181865afa1580156127ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110939190614e9b565b6000612838612832858561295c565b8361296c565b90505b9392505050565b6000670de0b6b3a764000061288361285a8583614c39565b61286c90670de0b6b3a7640000614c83565b61287e85670de0b6b3a7640000614cf7565b61297b565b61288d9086614cf7565b6128389190614c39565b6000818310156128a7578161283b565b5090919050565b6000805a90505b825a6128c19083614b97565b10156128d7576128d082614f57565b91506128b5565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161291691815260200190565b6040516020818303038152906040529050919050565b60006129538461293d8786866129ac565b8051602091820120825192909101919091201490565b95945050505050565b6000818312156128a7578161283b565b60008183126128a7578161283b565b600061283b670de0b6b3a764000083612993866132be565b61299d9190614cf7565b6129a79190614c39565b6134e8565b606060008451116129ff5760405162461bcd60e51b815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401611147565b6000612a0a8461370d565b90506000612a17866137f9565b9050600084604051602001612a2e91815260200190565b60405160208183030381529060405290506000805b845181101561324f576000858281518110612a6057612a60614f71565b602002602001015190508451831115612ae15760405162461bcd60e51b815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401611147565b82600003612b805780518051602091820120604051612b2f92612b0992910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612b7b5760405162461bcd60e51b815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401611147565b612ca3565b805151602011612c1c5780518051602091820120604051612baa92612b0992910190815260200190565b612b7b5760405162461bcd60e51b815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401611147565b805184516020808701919091208251919092012014612ca35760405162461bcd60e51b815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401611147565b612caf60106001614fa0565b81602001515103612e575784518303612def57612ce98160200151601081518110612cdc57612cdc614f71565b602002602001015161385c565b96506000875111612d625760405162461bcd60e51b815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401611147565b60018651612d709190614b97565b8214612de45760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401611147565b50505050505061283b565b6000858481518110612e0357612e03614f71565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612e2e57612e2e614f71565b60200260200101519050612e4181613910565b9550612e4e600186614fa0565b9450505061323c565b6002816020015151036131ce576000612e6f82613935565b9050600081600081518110612e8657612e86614f71565b016020015160f81c90506000612e9d600283614fb8565b612ea8906002614fda565b90506000612eb9848360ff16613959565b90506000612ec78a89613959565b90506000612ed5838361398f565b905080835114612f4d5760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401611147565b60ff851660021480612f62575060ff85166003145b156131035780825114612fdd5760405162461bcd60e51b815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401611147565b612ff78760200151600181518110612cdc57612cdc614f71565b9c5060008d51116130705760405162461bcd60e51b815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401611147565b60018c5161307e9190614b97565b88146130f25760405162461bcd60e51b815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401611147565b50505050505050505050505061283b565b60ff85161580613116575060ff85166001145b1561315557613142876020015160018151811061313557613135614f71565b6020026020010151613910565b995061314e818a614fa0565b98506131c3565b60405162461bcd60e51b815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401611147565b50505050505061323c565b60405162461bcd60e51b815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401611147565b508061324781614f57565b915050612a43565b5060405162461bcd60e51b815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401611147565b600080821361330f5760405162461bcd60e51b815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611147565b6000606061331c84613a43565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361351957506000919050565b680755bf798b4a1bf1e582126135715760405162461bcd60e51b815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401611147565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561372b5761372b6143e9565b60405190808252806020026020018201604052801561377057816020015b60408051808201909152606080825260208201528152602001906001900390816137495790505b50915060005b818110156137f257604051806040016040528085838151811061379b5761379b614f71565b602002602001015181526020016137ca8684815181106137bd576137bd614f71565b6020026020010151613aff565b8152508382815181106137df576137df614f71565b6020908102919091010152600101613776565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613851578060011b82018184015160001a8060041c8253600f811660018301535050600101613823565b509295945050505050565b6060600080600061386c85613b12565b91945092509050600081600181111561388757613887614a27565b146138be576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138c88284614fa0565b855114613901576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295385602001518484613fb0565b6060602082600001511061392c576139278261385c565b611093565b61109382614044565b60606110936139548360200151600081518110612cdc57612cdc614f71565b6137f9565b6060825182106139785750604080516020810190915260008152611093565b61283b838384865161398a9190614b97565b61405a565b60008082518451106139a25782516139a5565b83515b90505b8082108015613a2c57508282815181106139c4576139c4614f71565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613a0357613a03614f71565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613a3c578160010191506139a8565b5092915050565b6000808211613a945760405162461bcd60e51b815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611147565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060611093613b0d836141c6565b614233565b60008060008360000151600003613b55576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111613b7a576000600160009450945094505050613fa9565b60b78111613c90576000613b8f608083614b97565b905080876000015111613bce576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015613c4657507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15613c7d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250613fa9915050565b60bf8111613dee576000613ca560b783614b97565b905080876000015111613ce4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613d46576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111613d8e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d988184614fa0565b895111613dd1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ddc836001614fa0565b9750955060009450613fa99350505050565b60f78111613e53576000613e0360c083614b97565b905080876000015111613e42576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250613fa9915050565b6000613e6060f783614b97565b905080876000015111613e9f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613f01576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111613f49576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f538184614fa0565b895111613f8c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f97836001614fa0565b9750955060019450613fa99350505050565b9193909250565b60608167ffffffffffffffff811115613fcb57613fcb6143e9565b6040519080825280601f01601f191660200182016040528015613ff5576020820181803683370190505b509050811561283b57600061400a8486614fa0565b90506020820160005b8481101561402b578281015182820152602001614013565b8481111561403a576000858301525b5050509392505050565b6060611093826020015160008460000151613fb0565b60608182601f0110156140af5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611147565b8282840110156141015760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611147565b818301845110156141545760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401611147565b60608215801561417357604051915060008252602082016040526141bd565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141ac578051835260209283019201614194565b5050858452601f01601f1916604052505b50949350505050565b60408051808201909152600080825260208201528151600003614215576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061424385613b12565b91945092509050600181600181111561425e5761425e614a27565b14614295576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516142a18385614fa0565b146142d8576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816142ef5790505093506000835b86518110156143dd576000806143626040518060400160405280858c600001516143469190614b97565b8152602001858c6020015161435b9190614fa0565b9052613b12565b50915091506040518060400160405280838361437e9190614fa0565b8152602001848b602001516143939190614fa0565b8152508885815181106143a8576143a8614f71565b60209081029190910101526143be600185614fa0565b93506143ca8183614fa0565b6143d49084614fa0565b9250505061431c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614441576144416143e9565b604052919050565b6001600160a01b0381168114611d0757600080fd5b600082601f83011261446f57600080fd5b813567ffffffffffffffff811115614489576144896143e9565b61449c6020601f19601f84011601614418565b8181528460208386010111156144b157600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156144e057600080fd5b60405160c0810167ffffffffffffffff8282108183111715614504576145046143e9565b81604052829350843583526020850135915061451f82614449565b8160208401526040850135915061453582614449565b816040840152606085013560608401526080850135608084015260a085013591508082111561456357600080fd5b506145708582860161445e565b60a0830152505092915050565b6000806040838503121561459057600080fd5b823567ffffffffffffffff8111156145a757600080fd5b6145b3858286016144ce565b92505060208301356145c481614449565b809150509250929050565b6000602082840312156145e157600080fd5b813561283b81614449565b600080604083850312156145ff57600080fd5b823561460a81614449565b915060208301356145c481614449565b600080600080600085870360e081121561463357600080fd5b863567ffffffffffffffff8082111561464b57600080fd5b6146578a838b016144ce565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561469057600080fd5b60408901955060c08901359250808311156146aa57600080fd5b828901925089601f8401126146be57600080fd5b82359150808211156146cf57600080fd5b508860208260051b84010111156146e557600080fd5b959894975092955050506020019190565b60006020828403121561470857600080fd5b5035919050565b60005b8381101561472a578181015183820152602001614712565b83811115610fa25750506000910152565b6000815180845261475381602086016020860161470f565b601f01601f19169290920160200192915050565b60208152600061283b602083018461473b565b6000806040838503121561478d57600080fd5b8235915060208301356145c481614449565b6000602082840312156147b157600080fd5b813567ffffffffffffffff8111156147c857600080fd5b6147d4848285016144ce565b949350505050565b67ffffffffffffffff81168114611d0757600080fd5b60006020828403121561480457600080fd5b813561283b816147dc565b6000806040838503121561482257600080fd5b50508035926020909101359150565b8015158114611d0757600080fd5b600080600080600060a0868803121561485757600080fd5b853561486281614449565b9450602086013593506040860135614879816147dc565b9250606086013561488981614831565b9150608086013567ffffffffffffffff8111156148a557600080fd5b6148b18882890161445e565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b60488201526000825161491281604985016020870161470f565b919091016049019695505050505050565b60006020828403121561493557600080fd5b815161283b81614449565b63ffffffff81168114611d0757600080fd5b60006020828403121561496457600080fd5b815161283b81614940565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160001904831182151516156149b8576149b861496f565b500290565b6000602082840312156149cf57600080fd5b815161283b81614831565b6000806000606084860312156149ef57600080fd5b83516149fa81614940565b6020850151909350614a0b816147dc565b6040850151909250614a1c81614449565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215614a6857600080fd5b81516003811061283b57600080fd5b600060208284031215614a8957600080fd5b815161283b816147dc565b600060808284031215614aa657600080fd5b6040516080810181811067ffffffffffffffff82111715614ac957614ac96143e9565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600060208284031215614b0c57600080fd5b5051919050565b600067ffffffffffffffff80841115614b2e57614b2e6143e9565b8360051b6020614b3f818301614418565b868152918501918181019036841115614b5757600080fd5b865b84811015614b8b57803586811115614b715760008081fd5b614b7d36828b0161445e565b845250918301918301614b59565b50979650505050505050565b600082821015614ba957614ba961496f565b500390565b600067ffffffffffffffff80831681851681830481118215151615614bd557614bd561496f565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c0157614c0161496f565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614c4857614c48614c0a565b60001983147f800000000000000000000000000000000000000000000000000000000000000083141615614c7e57614c7e61496f565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614cbd57614cbd61496f565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614cf157614cf161496f565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614d3857614d3861496f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614d7357614d7361496f565b60008712925087820587128484161615614d8f57614d8f61496f565b87850587128184161615614da557614da561496f565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614ded57614ded61496f565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614e2157614e2161496f565b50500190565b600082614e3657614e36614c0a565b500490565b86815260006001600160a01b03808816602084015280871660408401525084606083015283608083015260c060a0830152614e7960c083018461473b565b98975050505050505050565b805160ff81168114614e9657600080fd5b919050565b600060c08284031215614ead57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ed057614ed06143e9565b6040528251614ede81614940565b8152614eec60208401614e85565b6020820152614efd60408401614e85565b60408201526060830151614f1081614940565b60608201526080830151614f2381614940565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114614f4b57600080fd5b60a08201529392505050565b60006000198203614f6a57614f6a61496f565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115614fb357614fb361496f565b500190565b600060ff831680614fcb57614fcb614c0a565b8060ff84160691505092915050565b600060ff821660ff841680821015614ff457614ff461496f565b9003939250505056fea164736f6c634300080f000a"; + bytes internal constant acc32Code = + hex"6080604052600436106102385760003560e01c80638c3152e911610138578063bb2c727e116100b0578063cff0ab961161007f578063dad544e011610064578063dad544e01461082a578063e9e05c421461083f578063f2b4e6171461085257600080fd5b8063cff0ab9614610757578063d325d3bf146107f857600080fd5b8063bb2c727e14610648578063bda204bb146106ef578063bf653a5c14610704578063c0c53b8b1461073757600080fd5b80639bf62d8211610107578063a35d99df116100ec578063a35d99df146105db578063a3860f48146105fb578063b682c4441461061b57600080fd5b80639bf62d821461057e578063a14238e7146105ab57600080fd5b80638c3152e9146105095780638c90dd6514610529578063952b27971461054957806399a88ec41461055e57600080fd5b806345884d32116101cb57806354fd4d501161019a5780635c975abb1161017f5780635c975abb146104d457806371c1566e146104e95780638b4c40b01461025d57600080fd5b806354fd4d501461045b5780635c0cba33146104a757600080fd5b806345884d32146103a25780634870496f146103d25780634fd0434c146103f2578063513747ab1461042057600080fd5b80633c9f397c116102075780633c9f397c1461032e5780633e47158c1461035857806343ca1c501461036d578063452a93201461038d57600080fd5b80632152f2be1461026457806333d7e2bd1461028457806335e80ab3146102db57806338d38c97146102f057600080fd5b3661025f5761025d3334620186a0600060405180602001604052806000815250610867565b005b600080fd5b34801561027057600080fd5b5061025d61027f366004614f47565b610ab3565b34801561029057600080fd5b506037546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102e757600080fd5b506102b1610bf9565b3480156102fc57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000041681526020016102d2565b34801561033a57600080fd5b50610343610c92565b60405163ffffffff90911681526020016102d2565b34801561036457600080fd5b506102b1610d26565b34801561037957600080fd5b5061025d610388366004615187565b610f31565b34801561039957600080fd5b506102b1611272565b3480156103ae57600080fd5b506103c26103bd3660046151ce565b6112e2565b60405190151581526020016102d2565b3480156103de57600080fd5b5061025d6103ed36600461524f565b61137d565b3480156103fe57600080fd5b506104076114ad565b60405167ffffffffffffffff90911681526020016102d2565b34801561042c57600080fd5b5061044d61043b3660046152d5565b6000908152603c602052604090205490565b6040519081526020016102d2565b34801561046757600080fd5b50604080518082018252600d81527f352e322e312b696e7465726f7000000000000000000000000000000000000000602082015290516102d29190615364565b3480156104b357600080fd5b50603e546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e057600080fd5b506103c2611541565b3480156104f557600080fd5b5061025d610504366004615377565b6115d5565b34801561051557600080fd5b5061025d61052436600461539c565b6118d9565b34801561053557600080fd5b5061025d6105443660046153d9565b6118e6565b34801561055557600080fd5b5061044d61196a565b34801561056a57600080fd5b5061025d610579366004614f47565b6119fe565b34801561058a57600080fd5b506032546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b757600080fd5b506103c26105c63660046152d5565b60336020526000908152604090205460ff1681565b3480156105e757600080fd5b506104076105f63660046154b9565b611bc0565b34801561060757600080fd5b506102b16106163660046154d6565b611bd9565b34801561062757600080fd5b50603f546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b34801561065457600080fd5b506106ba610663366004615377565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff9091166020830152016102d2565b3480156106fb57600080fd5b5061025d611c1e565b34801561071057600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a8061044d565b34801561074357600080fd5b5061025d6107523660046154f8565b611d00565b34801561076357600080fd5b506001546107bf906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016102d2565b34801561080457600080fd5b50603f546103c29074010000000000000000000000000000000000000000900460ff1681565b34801561083657600080fd5b506102b1611efd565b61025d61084d366004615551565b610867565b34801561085e57600080fd5b506102b1611f51565b8260005a905034156108f757603f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ee116bf346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108dd57600080fd5b505af11580156108f1573d6000803e3d6000fd5b50505050505b838015610919575073ffffffffffffffffffffffffffffffffffffffff871615155b15610950576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61095a8351611bc0565b67ffffffffffffffff168567ffffffffffffffff1610156109a7576040517f70c8bdbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156109e5576040517f5aa3bac900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336109ee611fc1565b610a0b575033731111000000000000000000000000000000001111015b60003488888888604051602001610a269594939291906155d0565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610a969190615364565b60405180910390a45050610aaa8282611fff565b50505050505050565b610abb6122d6565b610ac3612315565b603e5473ffffffffffffffffffffffffffffffffffffffff808316911603610b17576040517f785df91100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603f8054603e805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093557fffffffffffffffffffffff0000000000000000000000000000000000000000008416878216908117740100000000000000000000000000000000000000001790955560408051948216808652602086019690965291169083018190526060830191909152907f9e5368471a58d81987e5dc7d6374dd5ed5e756cc95a79ff726903423bce0060d906080015b60405180910390a150505050565b603754604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190615635565b905090565b603e54604080517f3c9f397c000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691633c9f397c9160048083019260209291908290030181865afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190615664565b600080610d517fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff811615610d7457919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002610db791906156b0565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610e12906060015b604051602081830303815290604052805190602001205490565b14610e49576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610e6b90606001610df8565b905073ffffffffffffffffffffffffffffffffffffffff811615610eff578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef89190615635565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f396122d6565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f8c576040517fdfeaaeb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f99826040015161236b565b15610fd0576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610fdb836123ae565b9050610fe781836115d5565b600081815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556060830151156110b857603f5460608401516040517f8d445bd000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691638d445bd0916110859160040190815260200190565b600060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050505b8260200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600061111b8460400151856080015186606001518760a001516123fb565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061118090841515815260200190565b60405180910390a28015801561119a575060008460600151115b1561122757603f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ee116bf85606001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b50505050505b801580156112355750326001145b1561126c576040517fab58103600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b603754604080517f452a9320000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163452a93209160048083019260209291908290030181865afa158015610c69573d6000803e3d6000fd5b603e546040517f45884d3200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906345884d3290602401602060405180830381865afa158015611353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137791906156ed565b92915050565b6113856122d6565b603f5474010000000000000000000000000000000000000000900460ff16156113da576040517f5e74b54200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113e4611f51565b73ffffffffffffffffffffffffffffffffffffffff1663bb8aa1fc866040518263ffffffff1660e01b815260040161141e91815260200190565b606060405180830381865afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f919061570a565b6040805160608082018352600080835260208301529181019190915290935091506114879050565b610aaa878360008461149e368b90038b018b61574c565b6114a8898b6157d6565b612459565b603e54604080517f4086d183000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691634086d1839160048083019260209291908290030181865afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d919061584f565b603754604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d91906156ed565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152868552603390935292205490919060ff1615611684576040517f730a107400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816020015167ffffffffffffffff166000036116cc576040517fcca6afda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61174b8173ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561171a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173e919061584f565b67ffffffffffffffff1690565b67ffffffffffffffff16826020015167ffffffffffffffff161161179b576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000093a80826020015167ffffffffffffffff16426117d6919061586c565b1161180d576040517fd9bc01be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f6c4f446700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015290911690636c4f446790602401602060405180830381865afa15801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a191906156ed565b61126c576040517f332a57f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6118e38133610f31565b50565b6118ee6122d6565b603f5474010000000000000000000000000000000000000000900460ff16611942576040517f5e74b54200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aaa87878761195188615883565b6119603689900389018961574c565b6114a887896157d6565b603e54604080517f952b2797000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163952b27979160048083019260209291908290030181865afa1580156119da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d919061598d565b7f0000000000000000000000000000000000000000000000000000000000000004600054610100900460ff16158015611a3e575060005460ff8083169116105b611acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611b08612cb4565b603e805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603f805492851692909116919091179055600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000611bcd8260286159a6565b611377906152086159d6565b603c6020528160005260406000208181548110611bf557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b611c26612315565b603f54604080517f1ee116bf0000000000000000000000000000000000000000000000000000000081529051479273ffffffffffffffffffffffffffffffffffffffff1691631ee116bf91849160048082019260009290919082900301818588803b158015611c9457600080fd5b505af1158015611ca8573d6000803e3d6000fd5b5050603f5460405185815273ffffffffffffffffffffffffffffffffffffffff90911693507fd893f630c6867fa43689da9ae949ebf04cac24aad3b45c759d442ed3c32e3a379250602001905060405180910390a250565b7f0000000000000000000000000000000000000000000000000000000000000004600054610100900460ff16158015611d40575060005460ff8083169116105b611dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611ac6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611e05612cb4565b6037805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603e8054868416908316179055603f8054858416921691909117905560325416611e9a57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611ea2612d35565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610beb565b6000611f07610d26565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c69573d6000803e3d6000fd5b603e54604080517ff2b4e617000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f2b4e6179160048083019260209291908290030181865afa158015610c69573d6000803e3d6000fd5b6000323303611fd05750600190565b333b601703611ff857604051602081016040526020600082333c5160e81c62ef010014905090565b5060005b90565b600154600090612035907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361586c565b90506000612041612e48565b90506000816020015160ff16826000015163ffffffff166120629190615a31565b9050821561219957600154600090612099908390700100000000000000000000000000000000900467ffffffffffffffff16615a99565b90506000836040015160ff16836120b09190615b0d565b6001546120d09084906fffffffffffffffffffffffffffffffff16615b0d565b6120da9190615a31565b60015490915060009061212b906121049084906fffffffffffffffffffffffffffffffff16615bc9565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612f0e565b9050600186111561215a5761215761210482876040015160ff1660018a612152919061586c565b612f2d565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906121cc908490700100000000000000000000000000000000900467ffffffffffffffff166159d6565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315612259576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612285906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166156b0565b9050600061229748633b9aca00612f82565b6122a19083615c3d565b905060005a6122b0908861586c565b9050808211156122cc576122cc6122c7828461586c565b612f99565b5050505050505050565b6122de611541565b156118d7576040517fb9c3c2ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361231e611efd565b73ffffffffffffffffffffffffffffffffffffffff16146118d7576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff8216301480611377575050603f5473ffffffffffffffffffffffffffffffffffffffff90811691161490565b80516020808301516040808501516060860151608087015160a088015193516000976123de979096959101615c51565b604051602081830303815290604052805190602001209050919050565b600080600061240b866000612fc7565b905080612441576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b612466866040015161236b565b1561249d576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f496b9c1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529091169063496b9c1690602401602060405180830381865afa15801561250d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253191906156ed565b612567576040517ff395240e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f04e50fed00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906304e50fed90602401602060405180830381865afa1580156125d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fb91906156ed565b612631576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561267e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a29190615cd7565b60028111156126b3576126b3615ca8565b036126ea576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127388573ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561171a573d6000803e3d6000fd5b67ffffffffffffffff16421161277a576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603f5474010000000000000000000000000000000000000000900460ff16156129c4576127a683612fe5565b6128188673ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc919061598d565b1461284f576040517f2b1a9a6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826040015151841061288d576040517f32dc285c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000836040015185815181106128a5576128a5615cf8565b60200260200101519050603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6ae3cd56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561291c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612940919061598d565b815114612979576040517f7cc2f31b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61298283612ffe565b8160200151146129be576040517f426149af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612a52565b6129cd82612ffe565b612a1b8673ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f4573d6000803e3d6000fd5b14612a52576040517f426149af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a5d876123ae565b90506000816000604051602001612a7e929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250612b299101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282018252600183527f0100000000000000000000000000000000000000000000000000000000000000602084015290870151909190869061303d565b1515600003612b64576040517f2e57ef3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808a16825267ffffffffffffffff42811660208085019182526000888152603982528681203380835290835287822096518754945190951674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009094169486169490941792909217909455868152603c845284812080546001810182559082528482200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091558b840151928c01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a35050505050505050565b33612cbd610d26565b73ffffffffffffffffffffffffffffffffffffffff1614158015612cfe575033612ce5611efd565b73ffffffffffffffffffffffffffffffffffffffff1614155b156118d7576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16612dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611ac6565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036118d75760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b02000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cc731b029160048083019260c09291908290030181865afa158015612eea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113779190615d3d565b6000612f23612f1d8585613061565b83613071565b90505b9392505050565b6000670de0b6b3a7640000612f6e612f458583615a31565b612f5790670de0b6b3a7640000615a99565b612f6985670de0b6b3a7640000615b0d565b613080565b612f789086615b0d565b612f239190615a31565b600081831015612f925781612f26565b5090919050565b6000805a90505b825a612fac908361586c565b1015612fc257612fbb82615df9565b9150612fa0565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000612ff0826130b1565b805190602001209050919050565b600081600001518260200151836040015184606001516040516020016123de949392919093845260208401929092526040830152606082015260800190565b60008061304986613267565b905061305781868686613299565b9695505050505050565b600081831215612f925781612f26565b6000818312612f925781612f26565b6000612f26670de0b6b3a764000083613098866132c9565b6130a29190615b0d565b6130ac9190615a31565b61350d565b80516060907fff00000000000000000000000000000000000000000000000000000000000000167f010000000000000000000000000000000000000000000000000000000000000014613130576040517fc06b523800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81604001515160000361316f576040517f9103e7cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000151836020015160c01b6040516020016131de9291907fff000000000000000000000000000000000000000000000000000000000000009290921682527fffffffffffffffff00000000000000000000000000000000000000000000000016600182015260090190565b604051602081830303815290604052905060005b8360400151518110156132605760008460400151828151811061321757613217615cf8565b60209081029190910181015180518183015160405192945061323b93879301615e31565b604051602081830303815290604052925050808061325890615df9565b9150506131f2565b5092915050565b6060818051906020012060405160200161328391815260200190565b6040516020818303038152906040529050919050565b60006132c0846132aa87868661374c565b8051602091820120825192909101919091201490565b95945050505050565b6000808213613334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611ac6565b60006060613341846141ca565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361353e57506000919050565b680755bf798b4a1bf1e582126135b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401611ac6565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606060008451116137b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401611ac6565b60006137c4846142a0565b905060006137d18661438c565b90506000846040516020016137e891815260200190565b60405160208183030381529060405290506000805b845181101561414157600085828151811061381a5761381a615cf8565b6020026020010151905084518311156138b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401611ac6565b8260000361396e5780518051602091820120604051613903926138dd92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401611ac6565b613ac5565b805151602011613a245780518051602091820120604051613998926138dd92910190815260200190565b613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401611ac6565b805184516020808701919091208251919092012014613ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401611ac6565b613ad160106001615e58565b81602001515103613cad5784518303613c4557613b0b8160200151601081518110613afe57613afe615cf8565b60200260200101516143ef565b96506000875111613b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401611ac6565b60018651613bac919061586c565b8214613c3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401611ac6565b505050505050612f26565b6000858481518110613c5957613c59615cf8565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110613c8457613c84615cf8565b60200260200101519050613c97816144a3565b9550613ca4600186615e58565b9450505061412e565b6002816020015151036140a6576000613cc5826144c8565b9050600081600081518110613cdc57613cdc615cf8565b016020015160f81c90506000613cf3600283615e70565b613cfe906002615e92565b90506000613d0f848360ff166144ec565b90506000613d1d8a896144ec565b90506000613d2b8383614522565b905080835114613dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401611ac6565b60ff851660021480613dd2575060ff85166003145b15613fc15780825114613e67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401611ac6565b613e818760200151600181518110613afe57613afe615cf8565b9c5060008d5111613f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401611ac6565b60018c51613f22919061586c565b8814613fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401611ac6565b505050505050505050505050612f26565b60ff85161580613fd4575060ff85166001145b15614013576140008760200151600181518110613ff357613ff3615cf8565b60200260200101516144a3565b995061400c818a615e58565b985061409b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401611ac6565b50505050505061412e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401611ac6565b508061413981615df9565b9150506137fd565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401611ac6565b6000808211614235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611ac6565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b80516060908067ffffffffffffffff8111156142be576142be614f80565b60405190808252806020026020018201604052801561430357816020015b60408051808201909152606080825260208201528152602001906001900390816142dc5790505b50915060005b8181101561438557604051806040016040528085838151811061432e5761432e615cf8565b6020026020010151815260200161435d86848151811061435057614350615cf8565b60200260200101516145cf565b81525083828151811061437257614372615cf8565b6020908102919091010152600101614309565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156143e4578060011b82018184015160001a8060041c8253600f8116600183015350506001016143b6565b509295945050505050565b606060008060006143ff856145e2565b91945092509050600081600181111561441a5761441a615ca8565b14614451576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61445b8284615e58565b855114614494576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132c085602001518484614a80565b606060208260000151106144bf576144ba826143ef565b611377565b61137782614b14565b60606113776144e78360200151600081518110613afe57613afe615cf8565b61438c565b60608251821061450b5750604080516020810190915260008152611377565b612f26838384865161451d919061586c565b614b2a565b6000808251845110614535578251614538565b83515b90505b80821080156145bf575082828151811061455757614557615cf8565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061459657614596615cf8565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156132605781600101915061453b565b60606113776145dd83614d02565b614d6f565b60008060008360000151600003614625576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f811161464a576000600160009450945094505050614a79565b60b7811161476057600061465f60808361586c565b90508087600001511161469e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214801561471657507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b1561474d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614a79915050565b60bf81116148be57600061477560b78361586c565b9050808760000151116147b4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614816576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c6037811161485e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6148688184615e58565b8951116148a1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6148ac836001615e58565b9750955060009450614a799350505050565b60f781116149235760006148d360c08361586c565b905080876000015111614912576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614a79915050565b600061493060f78361586c565b90508087600001511161496f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036149d1576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614a19576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614a238184615e58565b895111614a5c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614a67836001615e58565b9750955060019450614a799350505050565b9193909250565b60608167ffffffffffffffff811115614a9b57614a9b614f80565b6040519080825280601f01601f191660200182016040528015614ac5576020820181803683370190505b5090508115612f26576000614ada8486615e58565b90506020820160005b84811015614afb578281015182820152602001614ae3565b84811115614b0a576000858301525b5050509392505050565b6060611377826020015160008460000151614a80565b60608182601f011015614b99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611ac6565b828284011015614c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611ac6565b81830184511015614c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401611ac6565b606082158015614c915760405191506000825260208201604052614cf9565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614cca578051835260209283019201614cb2565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614d51576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000614d7f856145e2565b919450925090506001816001811115614d9a57614d9a615ca8565b14614dd1576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451614ddd8385615e58565b14614e14576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614e2b5790505093506000835b8651811015614f1957600080614e9e6040518060400160405280858c60000151614e82919061586c565b8152602001858c60200151614e979190615e58565b90526145e2565b509150915060405180604001604052808383614eba9190615e58565b8152602001848b60200151614ecf9190615e58565b815250888581518110614ee457614ee4615cf8565b6020908102919091010152614efa600185615e58565b9350614f068183615e58565b614f109084615e58565b92505050614e58565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146118e357600080fd5b60008060408385031215614f5a57600080fd5b8235614f6581614f25565b91506020830135614f7581614f25565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715614fd257614fd2614f80565b60405290565b6040805190810167ffffffffffffffff81118282101715614fd257614fd2614f80565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561504257615042614f80565b604052919050565b600082601f83011261505b57600080fd5b813567ffffffffffffffff81111561507557615075614f80565b6150a660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614ffb565b8181528460208386010111156150bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156150ea57600080fd5b60405160c0810167ffffffffffffffff828210818311171561510e5761510e614f80565b81604052829350843583526020850135915061512982614f25565b8160208401526040850135915061513f82614f25565b816040840152606085013560608401526080850135608084015260a085013591508082111561516d57600080fd5b5061517a8582860161504a565b60a0830152505092915050565b6000806040838503121561519a57600080fd5b823567ffffffffffffffff8111156151b157600080fd5b6151bd858286016150d8565b9250506020830135614f7581614f25565b6000602082840312156151e057600080fd5b8135612f2681614f25565b6000608082840312156151fd57600080fd5b50919050565b60008083601f84011261521557600080fd5b50813567ffffffffffffffff81111561522d57600080fd5b6020830191508360208260051b850101111561524857600080fd5b9250929050565b600080600080600060e0868803121561526757600080fd5b853567ffffffffffffffff8082111561527f57600080fd5b61528b89838a016150d8565b9650602088013595506152a18960408a016151eb565b945060c08801359150808211156152b757600080fd5b506152c488828901615203565b969995985093965092949392505050565b6000602082840312156152e757600080fd5b5035919050565b60005b838110156153095781810151838201526020016152f1565b8381111561126c5750506000910152565b600081518084526153328160208601602086016152ee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612f26602083018461531a565b6000806040838503121561538a57600080fd5b823591506020830135614f7581614f25565b6000602082840312156153ae57600080fd5b813567ffffffffffffffff8111156153c557600080fd5b6153d1848285016150d8565b949350505050565b6000806000806000806000610120888a0312156153f557600080fd5b873567ffffffffffffffff8082111561540d57600080fd5b6154198b838c016150d8565b985060208a0135915061542b82614f25565b909650604089013595506060890135908082111561544857600080fd5b908901906060828c03121561545c57600080fd5b81955061546c8b60808c016151eb565b94506101008a013591508082111561548357600080fd5b506154908a828b01615203565b989b979a50959850939692959293505050565b67ffffffffffffffff811681146118e357600080fd5b6000602082840312156154cb57600080fd5b8135612f26816154a3565b600080604083850312156154e957600080fd5b50508035926020909101359150565b60008060006060848603121561550d57600080fd5b833561551881614f25565b9250602084013561552881614f25565b9150604084013561553881614f25565b809150509250925092565b80151581146118e357600080fd5b600080600080600060a0868803121561556957600080fd5b853561557481614f25565b945060208601359350604086013561558b816154a3565b9250606086013561559b81615543565b9150608086013567ffffffffffffffff8111156155b757600080fd5b6155c38882890161504a565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516156248160498501602087016152ee565b919091016049019695505050505050565b60006020828403121561564757600080fd5b8151612f2681614f25565b63ffffffff811681146118e357600080fd5b60006020828403121561567657600080fd5b8151612f2681615652565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156e8576156e8615681565b500290565b6000602082840312156156ff57600080fd5b8151612f2681615543565b60008060006060848603121561571f57600080fd5b835161572a81615652565b602085015190935061573b816154a3565b604085015190925061553881614f25565b60006080828403121561575e57600080fd5b6040516080810181811067ffffffffffffffff8211171561578157615781614f80565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff8211156157cc576157cc614f80565b5060051b60200190565b60006157e96157e4846157b2565b614ffb565b80848252602080830192508560051b85013681111561580757600080fd5b855b8181101561584357803567ffffffffffffffff8111156158295760008081fd5b61583536828a0161504a565b865250938201938201615809565b50919695505050505050565b60006020828403121561586157600080fd5b8151612f26816154a3565b60008282101561587e5761587e615681565b500390565b60006060823603121561589557600080fd5b61589d614faf565b82357fff00000000000000000000000000000000000000000000000000000000000000811681146158cd57600080fd5b81526020838101356158de816154a3565b8282015260408481013567ffffffffffffffff8111156158fd57600080fd5b850136601f82011261590e57600080fd5b803561591c6157e4826157b2565b81815260069190911b8201840190848101903683111561593b57600080fd5b928501925b8284101561597b578484360312156159585760008081fd5b615960614fd8565b84358152868501358782015282529284019290850190615940565b93860193909352509295945050505050565b60006020828403121561599f57600080fd5b5051919050565b600067ffffffffffffffff808316818516818304811182151516156159cd576159cd615681565b02949350505050565b600067ffffffffffffffff8083168185168083038211156159f9576159f9615681565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a4057615a40615a02565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615a9457615a94615681565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615ad357615ad3615681565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b0757615b07615681565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615b4e57615b4e615681565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615b8957615b89615681565b60008712925087820587128484161615615ba557615ba5615681565b87850587128184161615615bbb57615bbb615681565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c0357615c03615681565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615c3757615c37615681565b50500190565b600082615c4c57615c4c615a02565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615c9c60c083018461531a565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215615ce957600080fd5b815160038110612f2657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805160ff81168114615d3857600080fd5b919050565b600060c08284031215615d4f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615d7257615d72614f80565b6040528251615d8081615652565b8152615d8e60208401615d27565b6020820152615d9f60408401615d27565b60408201526060830151615db281615652565b60608201526080830151615dc581615652565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114615ded57600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e2a57615e2a615681565b5060010190565b60008451615e438184602089016152ee565b91909101928352506020820152604001919050565b60008219821115615e6b57615e6b615681565b500190565b600060ff831680615e8357615e83615a02565b8060ff84160691505092915050565b600060ff821660ff841680821015615eac57615eac615681565b9003939250505056fea164736f6c634300080f000a"; + bytes internal constant acc33Code = + hex"6080604052600436106100f35760003560e01c8063438ab5ac1161008a5780638d445bd0116100595780638d445bd0146102e0578063946d920414610300578063b2db82f514610320578063dad544e01461034057600080fd5b8063438ab5ac1461023f57806354fd4d501461025f5780635c975abb146102ab5780635ec15d89146102c057600080fd5b806333d7e2bd116100c657806333d7e2bd1461017f57806335e80ab3146101d757806338d38c97146101ec5780633e47158c1461022a57600080fd5b80630fd11077146100f85780631ee116bf1461013d578063225ce1761461014757806330f9765d14610177575b600080fd5b34801561010457600080fd5b506101286101133660046110e0565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610145610355565b005b34801561015357600080fd5b506101286101623660046110e0565b60026020526000908152604090205460ff1681565b6101456103f1565b34801561018b57600080fd5b506000546101b29062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610134565b3480156101e357600080fd5b506101b2610482565b3480156101f857600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610134565b34801561023657600080fd5b506101b2610519565b34801561024b57600080fd5b5061014561025a3660046110e0565b610724565b34801561026b57600080fd5b50604080518082018252600581527f312e322e30000000000000000000000000000000000000000000000000000000602082015290516101349190611104565b3480156102b757600080fd5b506101286107ef565b3480156102cc57600080fd5b506101456102db3660046110e0565b610881565b3480156102ec57600080fd5b506101456102fb366004611177565b610909565b34801561030c57600080fd5b5061014561031b366004611190565b610b49565b34801561032c57600080fd5b5061014561033b3660046110e0565b610d46565b34801561034c57600080fd5b506101b2610d5a565b3360008181526001602052604090205460ff1661039e576040517f665a1d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f97efc519b9020a140ffe13878e03d340b976676090bc7fe3e33191192df7c72c346040516103e691815260200190565b60405180910390a250565b3360008181526002602052604090205460ff1661043a576040517f665a1d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fb58278ed56aa79ad2e243963b44b165a8f76d629f61c01dd3649d658e0eacca4346040516103e691815260200190565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190611218565b905090565b6000806105447fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561056757919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026105aa9190611264565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610605906060015b604051602081830303815290604052805190602001205490565b1461063c576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061065e906060016105eb565b905073ffffffffffffffffffffffffffffffffffffffff8116156106f2578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106eb9190611218565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61072c610dae565b61073581610e06565b60004790508173ffffffffffffffffffffffffffffffffffffffff166330f9765d826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561078257600080fd5b505af1158015610796573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff167f87eb4064140fbec95a8de570e01b4c650c00ecd677560af9f298a975b636c22d826040516107e391815260200190565b60405180910390a25050565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906112a1565b610889610dae565b61089281610e06565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f5d2682e700a2146c8e2381e0b407003576a54e96dd08f40f3ea0d2b8706db1069190a250565b6109116107ef565b15610948576040517f9e72994200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526001602052604090205460ff16610991576040517f665a1d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b478211156109cb576040517fe1ba922700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a539190611218565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517fd6cbd5f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16638b4c40b0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ae857600080fd5b505af1158015610afc573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167fe9512d49448b580f3d29031e9243ee81bc8789a93d6f04ec8f03b694d623637b836040516107e391815260200190565b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015610b89575060005460ff8083169116105b610c19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610c52610ee0565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8716021781555b82811015610ce157610ccf848483818110610cb557610cb56112c3565b9050602002016020810190610cca91906110e0565b610f61565b80610cd9816112f2565b915050610c98565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610d4e610dae565b610d5781610f61565b50565b6000610d64610519565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b33610db7610d5a565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff1663dad544e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e759190611218565b73ffffffffffffffffffffffffffffffffffffffff16610e93610d5a565b73ffffffffffffffffffffffffffffffffffffffff1614610d57576040517f075c431400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610ee9610519565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f2a575033610f11610d5a565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610e04576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f6a81610e06565b610f72610482565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff79190611218565b73ffffffffffffffffffffffffffffffffffffffff1614611044576040517f84ab551500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909217909155517f90a7fac2e56aebe4889351fb04eda5efb28b19dedf288bdbfd3cfd817c79630f9190a250565b73ffffffffffffffffffffffffffffffffffffffff81168114610d5757600080fd5b6000602082840312156110f257600080fd5b81356110fd816110be565b9392505050565b600060208083528351808285015260005b8181101561113157858101830151858201604001528201611115565b81811115611143576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561118957600080fd5b5035919050565b6000806000604084860312156111a557600080fd5b83356111b0816110be565b9250602084013567ffffffffffffffff808211156111cd57600080fd5b818601915086601f8301126111e157600080fd5b8135818111156111f057600080fd5b8760208260051b850101111561120557600080fd5b6020830194508093505050509250925092565b60006020828403121561122a57600080fd5b81516110fd816110be565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561129c5761129c611235565b500290565b6000602082840312156112b357600080fd5b815180151581146110fd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361132357611323611235565b506001019056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHImplCode = + hex"60806040526004361061019a5760003560e01c806370a08231116100e1578063a9059cbb1161008a578063d0e30db011610064578063d0e30db0146101a9578063dad544e014610585578063dd62ed3e1461059a578063f3fef3a3146105ed576101a9565b8063a9059cbb146104f1578063c4d66de814610511578063cd47bde114610531576101a9565b806395d89b41116100bb57806395d89b411461046b578063977a5ec5146104b1578063a7e21e80146104d1576101a9565b806370a08231146103f357806379502c55146104365780637eee288d1461044b576101a9565b8063313ce567116101435780633e47158c1161011d5780633e47158c1461036257806354fd4d50146103775780636a42b8f8146103c0576101a9565b8063313ce567146102b657806333d7e2bd146102dd57806338d38c971461032f576101a9565b806318160ddd1161017457806318160ddd1461025957806323b872dd146102765780632e1a7d4d14610296576101a9565b806306fdde03146101b1578063095ea7b3146102095780630ca3568214610239576101a9565b366101a9576101a761060d565b005b6101a761060d565b3480156101bd57600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b60405161020091906114c9565b60405180910390f35b34801561021557600080fd5b5061022961022436600461155e565b610668565b6040519015158152602001610200565b34801561024557600080fd5b506101a761025436600461158a565b6106e1565b34801561026557600080fd5b50475b604051908152602001610200565b34801561028257600080fd5b506102296102913660046115a3565b61084d565b3480156102a257600080fd5b506101a76102b136600461158a565b610a20565b3480156102c257600080fd5b506102cb601281565b60405160ff9091168152602001610200565b3480156102e957600080fd5b5060045461030a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610200565b34801561033b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000016102cb565b34801561036e57600080fd5b5061030a610a2d565b34801561038357600080fd5b506101f36040518060400160405280600581526020017f312e352e3000000000000000000000000000000000000000000000000000000081525081565b3480156103cc57600080fd5b507f0000000000000000000000000000000000000000000000000000000000049d40610268565b3480156103ff57600080fd5b5061026861040e3660046115e4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b34801561044257600080fd5b5061030a610c38565b34801561045757600080fd5b506101a761046636600461155e565b610cd0565b34801561047757600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101f3565b3480156104bd57600080fd5b506101a76104cc36600461155e565b610d24565b3480156104dd57600080fd5b506101a76104ec3660046115e4565b610e33565b3480156104fd57600080fd5b5061022961050c36600461155e565b610e63565b34801561051d57600080fd5b506101a761052c3660046115e4565b610e77565b34801561053d57600080fd5b5061057061054c366004611601565b60036020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610200565b34801561059157600080fd5b5061030a61101e565b3480156105a657600080fd5b506102686105b5366004611601565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b3480156105f957600080fd5b506101a761060836600461155e565b611072565b336000908152600160205260408120805434929061062c908490611669565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106d09086815260200190565b60405180910390a350600192915050565b6106e961101e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106107915747610793565b815b604051909150600090339083908381818185875af1925050503d80600081146107d8576040519150601f19603f3d011682016040523d82523d6000602084013e6107dd565b606091505b5050905080610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f44656c61796564574554483a207265636f766572206661696c656400000000006044820152606401610779565b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205482111561087f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660008181526002602090815260408083203380855292529091205491148015906108e057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b1561093857828110156108f257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915281208054859290610932908490611681565b90915550505b73ffffffffffffffffffffffffffffffffffffffff85166000908152600160205260408120805485929061096d908490611681565b909155505073ffffffffffffffffffffffffffffffffffffffff8416600090815260016020526040812080548592906109a7908490611669565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a0d91815260200190565b60405180910390a3506001949350505050565b610a2a3382611072565b50565b600080610a587fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff811615610a7b57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002610abe9190611698565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610b19906060015b604051602081830303815290604052805190602001205490565b14610b50576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610b7290606001610aff565b905073ffffffffffffffffffffffffffffffffffffffff811615610c06578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff91906116d5565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccb91906116d5565b905090565b33600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610d1a908490611669565b9091555050505050565b610d2c61101e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e6572000000000000000000006044820152606401610779565b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a361084882338361084d565b610a2a816104cc8373ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6000610e7033848461084d565b9392505050565b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015610eb7575060005460ff8083169116105b610f43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610779565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610f7c6113a0565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6000611028610a2d565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca7573d6000803e3d6000fd5b60048054604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692635c975abb9282820192602092908290030181865afa1580156110df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110391906116f2565b1561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e747261637420697320706175736564006044820152606401610779565b33600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020805482111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c000000000000000000000000000000000000006064820152608401610779565b60008160010154116112be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610779565b427f0000000000000000000000000000000000000000000000000000000000049d4082600101546112ef9190611669565b111561137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d65740000000000000000000000000000000000000000000000000000006064820152608401610779565b818160000160008282546113919190611681565b90915550610848905082611423565b336113a9610a2d565b73ffffffffffffffffffffffffffffffffffffffff16141580156113ea5750336113d161101e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611421576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3360009081526001602052604090205481111561143f57600080fd5b336000908152600160205260408120805483929061145e908490611681565b9091555050604051339082156108fc029083906000818181858888f19350505050158015611490573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600060208083528351808285015260005b818110156114f6578581018301518582016040015282016114da565b81811115611508576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a2a57600080fd5b6000806040838503121561157157600080fd5b823561157c8161153c565b946020939093013593505050565b60006020828403121561159c57600080fd5b5035919050565b6000806000606084860312156115b857600080fd5b83356115c38161153c565b925060208401356115d38161153c565b929592945050506040919091013590565b6000602082840312156115f657600080fd5b8135610e708161153c565b6000806040838503121561161457600080fd5b823561161f8161153c565b9150602083013561162f8161153c565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561167c5761167c61163a565b500190565b6000828210156116935761169361163a565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156116d0576116d061163a565b500290565b6000602082840312156116e757600080fd5b8151610e708161153c565b60006020828403121561170457600080fd5b81518015158114610e7057600080fdfea164736f6c634300080f000a"; + bytes internal constant preimageOracleCode = + hex"6080604052600436106101d85760003560e01c80639d53a64811610102578063ddcd58de11610095578063ec5efcbc11610064578063ec5efcbc14610681578063f3f480d9146106a1578063faf37bc7146106d4578063fef2b4ed146106e757600080fd5b8063ddcd58de146105d4578063e03110e11461060c578063e159261114610641578063ea7139501461066157600080fd5b8063b5e7154c116100d1578063b5e7154c14610555578063d18534b51461056c578063da35c6641461058c578063dd24f9bf146105a157600080fd5b80639d53a6481461048e5780639d7e8769146104dd578063b2e67ba8146104fd578063b4801e611461053557600080fd5b806361238bde1161017a5780637ac54767116101495780637ac54767146103ca5780638542cf50146103ea578063882856ef146104355780638dc4be111461046e57600080fd5b806361238bde1461031e5780636551927b146103565780637051472e1461038e5780637917de1d146103aa57600080fd5b80633909af5c116101b65780633909af5c146102715780634d52b4c91461029357806352f0f3ad146102a857806354fd4d50146102c857600080fd5b8063013cf08b146101dd5780630359a5631461022e5780632055b36b1461025c575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612ca2565b610714565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612ce4565b610759565b604051908152602001610225565b34801561026857600080fd5b5061024e601081565b34801561027d57600080fd5b5061029161028c366004612eec565b610891565b005b34801561029f57600080fd5b5061024e610ae8565b3480156102b457600080fd5b5061024e6102c3366004612fd8565b610b03565b3480156102d457600080fd5b506103116040518060400160405280600581526020017f312e312e3500000000000000000000000000000000000000000000000000000081525081565b604051610225919061303f565b34801561032a57600080fd5b5061024e610339366004613090565b600160209081526000928352604080842090915290825290205481565b34801561036257600080fd5b5061024e610371366004612ce4565b601560209081526000928352604080842090915290825290205481565b34801561039a57600080fd5b5061024e6703782dace9d9000081565b3480156103b657600080fd5b506102916103c53660046130f4565b610bd9565b3480156103d657600080fd5b5061024e6103e5366004612ca2565b6110dc565b3480156103f657600080fd5b50610425610405366004613090565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610225565b34801561044157600080fd5b50610455610450366004613190565b6110f3565b60405167ffffffffffffffff9091168152602001610225565b34801561047a57600080fd5b506102916104893660046131c3565b61114d565b34801561049a57600080fd5b5061024e6104a9366004612ce4565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104e957600080fd5b506102916104f836600461320f565b611248565b34801561050957600080fd5b5061024e610518366004612ce4565b601760209081526000928352604080842090915290825290205481565b34801561054157600080fd5b5061024e610550366004613190565b6113ff565b34801561056157600080fd5b5061024e620186a081565b34801561057857600080fd5b50610291610587366004612eec565b611431565b34801561059857600080fd5b5060135461024e565b3480156105ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000001ec3061024e565b3480156105e057600080fd5b5061024e6105ef366004612ce4565b601660209081526000928352604080842090915290825290205481565b34801561061857600080fd5b5061062c610627366004613090565b611840565b60408051928352602083019190915201610225565b34801561064d57600080fd5b5061029161065c3660046131c3565b611931565b34801561066d57600080fd5b5061029161067c36600461329b565b611a39565b34801561068d57600080fd5b5061029161069c36600461330a565b611b98565b3480156106ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000001518061024e565b6102916106e2366004613392565b611d1e565b3480156106f357600080fd5b5061024e610702366004612ca2565b60006020819052908152604090205481565b6013818154811061072457600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061079c9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610889578160011660010361082f5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107fc576107fc6133ce565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250610870565b8260038260108110610843576108436133ce565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c90806108818161342c565b9150506107a7565b505092915050565b600061089d8a8a610759565b90506108c086868360208b01356108bb6108b68d613464565b611fea565b61202a565b80156108de57506108de83838360208801356108bb6108b68a613464565b610914576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86604001358860405160200161092a9190613533565b6040516020818303038152906040528051906020012014610977576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161098d9190613571565b146109c4576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a0c886109d28680613589565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061208b92505050565b610a15886121e6565b836040013588604051602001610a2b9190613533565b6040516020818303038152906040528051906020012003610a78576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610adc8a8a33612800565b50505050505050505050565b6001610af660106002613710565b610b00919061371c565b81565b6000610b0f86866128c0565b9050610b1c836008613571565b82101580610b2a5750602083115b15610b61576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610bf257610beb868661296d565b9050610c2c565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610c5957505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610cda8260601c63ffffffff1690565b63ffffffff169050333214610d1b576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2b8260801c63ffffffff1690565b63ffffffff16600003610d6a576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d748260c01c90565b67ffffffffffffffff1615610db5576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610dee576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfb89898d88866129e6565b83516020850160888204881415608883061715610e20576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610ed0578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610ec5576001821615610ea55782818b0152610ec5565b8981015160009081526020938452604090209260019290921c9101610e88565b505050608801610e2d565b50505050600160106002610ee49190613710565b610eee919061371c565b811115610f27576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9c610f3a8360401c63ffffffff1690565b610f4a9063ffffffff168a613571565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b915084156110295777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610fd68260801c63ffffffff1690565b63ffffffff16610fec8360401c63ffffffff1690565b63ffffffff1614611029576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061104f90846010612c18565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106110ec57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061111b57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061116b5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa90508061119857600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806112705763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826112f2576309bde3396000526004601cfd5b602886106113085763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061142757600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156114a4576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114ae8160c01c90565b67ffffffffffffffff166000036114f1576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000001518061151c8260c01c90565b6115309067ffffffffffffffff164261371c565b11611567576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115738b8b610759565b905061158c87878360208c01356108bb6108b68e613464565b80156115aa57506115aa84848360208901356108bb6108b68b613464565b6115e0576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016115f69190613533565b6040516020818303038152906040528051906020012014611643576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460200135886020013560016116599190613571565b14158061168b575060016116738360601c63ffffffff1690565b61167d9190613733565b63ffffffff16856020013514155b156116c2576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116d0896109d28780613589565b6116d9896121e6565b60006116e48a612b39565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0200000000000000000000000000000000000000000000000000000000000000179050600061173b8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020546001600084815260200190815260200160002060008381526020019081526020016000208190555061180d8460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118318d8d81612800565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff166118c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546118e5816008613571565b6118f0856020613571565b1061190e5783611901826008613571565b61190b919061371c565b91505b506000938452600160209081526040808620948652939052919092205492909150565b60443560008060088301861061194f5763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b60008060008060808860601b81528760c01b6014820152858782601c0137601c860181207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0600000000000000000000000000000000000000000000000000000000000000179350604088026260216001603f5a021015611ac35763dd629f866000526004601cfd5b6000808783601c018c5afa94503d6001019150600882018a10611aee5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e89017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208d8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209c83529b81528b8220929092559384528390529790912096909655505050505050565b6000611ba48686610759565b9050611bbd83838360208801356108bb6108b68a613464565b611bf3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611c2f576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c37612c56565b611c45816109d28780613589565b611c4e816121e6565b846040013581604051602001611c649190613533565b6040516020818303038152906040528051906020012003611cb1576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611d15878733612800565b50505050505050565b6703782dace9d90000341015611d60576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d99576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611da4816008613758565b63ffffffff168263ffffffff1610611de8576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000001ec308163ffffffff161015611e48576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152601560209081526040808320868452909152902054611e738160801c63ffffffff1690565b63ffffffff1615611eb0576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608082901b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff60a085901b167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff83161717336000818152601560209081526040808320898452825280832094909455835180850185528381528082018981526013805460018101825590855291517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290930292830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015591815260168252828120968152959052909320349055505050565b600081600001518260200151836040015160405160200161200d93929190613780565b604051602081830303815290604052805190602001209050919050565b60008160005b601081101561207e578060051b880135600186831c16600181146120635760008481526020839052604090209350612074565b600082815260208590526040902093505b5050600101612030565b5090931495945050505050565b608881511461209957600080fd5b602081016020830161211a565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050612114816120ff868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b612126600083836120a6565b612132600183836120a6565b61213e600283836120a6565b61214a600383836120a6565b612156600483836120a6565b612162600583836120a6565b61216e600683836120a6565b61217a600783836120a6565b612186600883836120a6565b612192600983836120a6565b61219e600a83836120a6565b6121aa600b83836120a6565b6121b6600c83836120a6565b6121c2600d83836120a6565b6121ce600e83836120a6565b6121da600f83836120a6565b612114601083836120a6565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e001604051602081830303815290604052905060208201602082016126e0565b600583901b8101518518604085900381901c90851b1867ffffffffffffffff8116600584901b8301525b505050505050565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c6123cb8660011b67ffffffffffffffff1690565b18188584603f1c6123e68660011b67ffffffffffffffff1690565b18188584603f1c6124018660011b67ffffffffffffffff1690565b181895508483603f1c61241e8560011b67ffffffffffffffff1690565b181894508387603f1c61243b8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935087925061247b81602c60066001876122dc565b61248b87601460096006876122dc565b61249b86603d60166009876122dc565b6124ab876027600e6016876122dc565b6124bb8260126014600e876122dc565b6124cb86603e60026014876122dc565b6124db86602b600c6002876122dc565b6124eb856019600d600c876122dc565b6124fb8760086013600d876122dc565b61250b85603860176013876122dc565b61251b826029600f6017876122dc565b61252b87601b6004600f876122dc565b61253b87600e60186004876122dc565b61254b81600260156018876122dc565b61255b85603760086015876122dc565b61256b81602d60106008876122dc565b61257b82602460056010876122dc565b61258b85601c60036005876122dc565b61259b85601560126003876122dc565b6125ab86600f60116012876122dc565b6125bb81600a600b6011876122dc565b506125cc8560066007600b866122dc565b6125dc816003600a6007866122dc565b5067ffffffffffffffff8216610140820152612306565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611d15565b61267a6000826125f3565b6126856005826125f3565b612690600a826125f3565b61269b600f826125f3565b6126a66014826125f3565b50565b6126b28161230e565b6126bb8161266f565b600383901b820151815160c09190911c9061211490821867ffffffffffffffff168352565b6126ec600082846126a9565b6126f8600182846126a9565b612704600282846126a9565b612710600382846126a9565b61271c600482846126a9565b612728600582846126a9565b612734600682846126a9565b612740600782846126a9565b61274c600882846126a9565b612758600982846126a9565b612764600a82846126a9565b612770600b82846126a9565b61277c600c82846126a9565b612788600d82846126a9565b612794600e82846126a9565b6127a0600f82846126a9565b6127ac601082846126a9565b6127b8601182846126a9565b6127c4601282846126a9565b6127d0601382846126a9565b6127dc601482846126a9565b6127e8601582846126a9565b6127f4601682846126a9565b612114601782846126a9565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d8060008114612879576040519150601f19603f3d011682016040523d82523d6000602084013e61287e565b606091505b50509050806128b9576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617612966818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b60606040519050816020820181810182868337608883068080156129b65760888290038501848101848103803687375060806001820353506001845160001a17845386526129cd565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b60006129f88260a01c63ffffffff1690565b67ffffffffffffffff1690506000612a168360801c63ffffffff1690565b63ffffffff1690506000612a308460401c63ffffffff1690565b63ffffffff169050600883108015612a46575080155b15612a7a5760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612b2f565b60088310158015612a98575080612a9260088561371c565b93508310155b8015612aac5750612aa98782613571565b83105b15612b2f576000612abd828561371c565b905087612acb826020613571565b10158015612ad7575085155b15612b0e576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612bbc565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612b6a8360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612b978360101b67ffffffffffffffff1690565b1617905060008160201c612bb58360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612bd490612b40565b612b40565b6040820151612be290612b40565b60401b17612bfa612bcf60018460059190911b015190565b825160809190911b90612c0c90612b40565b60c01b17179392505050565b8260108101928215612c46579160200282015b82811115612c46578251825591602001919060010190612c2b565b50612c52929150612c6e565b5090565b6040518060200160405280612c69612c83565b905290565b5b80821115612c525760008155600101612c6f565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612cb457600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cdf57600080fd5b919050565b60008060408385031215612cf757600080fd5b612d0083612cbb565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612d6157612d61612d0e565b60405290565b6040516060810167ffffffffffffffff81118282101715612d6157612d61612d0e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612dd157612dd1612d0e565b604052919050565b803567ffffffffffffffff81168114612cdf57600080fd5b6000610320808385031215612e0557600080fd5b604051602080820182811067ffffffffffffffff82111715612e2957612e29612d0e565b806040525081935085601f860112612e4057600080fd5b612e48612d3d565b928501928087851115612e5a57600080fd5b865b85811015612e7a57612e6d81612dd9565b8352918301918301612e5c565b509092525091949350505050565b600060608284031215612e9a57600080fd5b50919050565b60008083601f840112612eb257600080fd5b50813567ffffffffffffffff811115612eca57600080fd5b6020830191508360208260051b8501011115612ee557600080fd5b9250929050565b60008060008060008060008060006103e08a8c031215612f0b57600080fd5b612f148a612cbb565b985060208a01359750612f2a8b60408c01612df1565b96506103608a013567ffffffffffffffff80821115612f4857600080fd5b612f548d838e01612e88565b97506103808c0135915080821115612f6b57600080fd5b612f778d838e01612ea0565b90975095506103a08c0135915080821115612f9157600080fd5b612f9d8d838e01612e88565b94506103c08c0135915080821115612fb457600080fd5b50612fc18c828d01612ea0565b915080935050809150509295985092959850929598565b600080600080600060a08688031215612ff057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561302e578181015183820152602001613016565b838111156121145750506000910152565b602081526000825180602084015261305e816040850160208701613013565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156130a357600080fd5b50508035926020909101359150565b60008083601f8401126130c457600080fd5b50813567ffffffffffffffff8111156130dc57600080fd5b602083019150836020828501011115612ee557600080fd5b600080600080600080600060a0888a03121561310f57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561313557600080fd5b6131418b838c016130b2565b909750955060608a013591508082111561315a57600080fd5b506131678a828b01612ea0565b9094509250506080880135801515811461318057600080fd5b8091505092959891949750929550565b6000806000606084860312156131a557600080fd5b6131ae84612cbb565b95602085013595506040909401359392505050565b6000806000604084860312156131d857600080fd5b83359250602084013567ffffffffffffffff8111156131f657600080fd5b613202868287016130b2565b9497909650939450505050565b600080600080600080600060a0888a03121561322a57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561325057600080fd5b61325c8b838c016130b2565b909750955060608a013591508082111561327557600080fd5b506132828a828b016130b2565b989b979a50959894979596608090950135949350505050565b6000806000806000608086880312156132b357600080fd5b853594506132c360208701612cbb565b93506132d160408701612dd9565b9250606086013567ffffffffffffffff8111156132ed57600080fd5b6132f9888289016130b2565b969995985093965092949392505050565b60008060008060006080868803121561332257600080fd5b61332b86612cbb565b945060208601359350604086013567ffffffffffffffff8082111561334f57600080fd5b61335b89838a01612e88565b9450606088013591508082111561337157600080fd5b506132f988828901612ea0565b803563ffffffff81168114612cdf57600080fd5b6000806000606084860312156133a757600080fd5b833592506133b76020850161337e565b91506133c56040850161337e565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361345d5761345d6133fd565b5060010190565b60006060823603121561347657600080fd5b61347e612d67565b823567ffffffffffffffff8082111561349657600080fd5b9084019036601f8301126134a957600080fd5b81356020828211156134bd576134bd612d0e565b6134ed817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612d8a565b9250818352368183860101111561350357600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b601981101561356857825167ffffffffffffffff1682526020928301929091019060010161353f565b50505092915050565b60008219821115613584576135846133fd565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135be57600080fd5b83018035915067ffffffffffffffff8211156135d957600080fd5b602001915036819003821315612ee557600080fd5b600181815b8085111561364757817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561362d5761362d6133fd565b8085161561363a57918102915b93841c93908002906135f3565b509250929050565b60008261365e5750600161370a565b8161366b5750600061370a565b8160018114613681576002811461368b576136a7565b600191505061370a565b60ff84111561369c5761369c6133fd565b50506001821b61370a565b5060208310610133831016604e8410600b84101617156136ca575081810a61370a565b6136d483836135ee565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613706576137066133fd565b0290505b92915050565b6000612966838361364f565b60008282101561372e5761372e6133fd565b500390565b600063ffffffff83811690831681811015613750576137506133fd565b039392505050565b600063ffffffff808316818516808303821115613777576137776133fd565b01949350505050565b60008451613792818460208901613013565b9190910192835250602082015260400191905056fea164736f6c634300080f000a"; + bytes internal constant mipsSingletonCode = + hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c80631219a4e41461005157806354fd4d50146100865780637dc0d1d0146100cf578063e14ced3214610113575b600080fd5b7f00000000000000000000000000000000000000000000000000000000000000085b6040519081526020015b60405180910390f35b6100c26040518060400160405280600681526020017f312e31302e31000000000000000000000000000000000000000000000000000081525081565b60405161007d9190615144565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e016815260200161007d565b6100736101213660046151f9565b60006101308686868686610143565b905061013a61066b565b95945050505050565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101c36150da565b6000608083146101d257600080fd5b61026082146101e057600080fd5b604051610760146101f057600080fd5b608489146101fd57600080fd5b610164871461020b57600080fd5b508735608052602088013560a052604088013560c090811c81526048890135811c60e052605089013560f890811c6101005260518a0135821c6101205260598a0135821c6101405260618a0135811c6101605260628a0135811c61018081905260638b0135831c6101a052606b8b0135831c6101c05260738b013590911c6101e05260748a01356102005260948a01356102205260b48a013590911c610240526102b4816107b5565b826101000151156102d1576102c76107f9565b935050505061013a565b7fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58361018001511480156103085750826101600151155b8061034457507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5836101a0015114801561034457508261016001515b156103d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4d49505336343a206163746976652074687265616420737461636b206973206560448201527f6d7074790000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6101208301805160010167ffffffffffffffff1690526103f482610919565b6103fe8383610a3d565b8160400151156104195761041183610ae1565b6102c76107f9565b620186a067ffffffffffffffff1683610140015167ffffffffffffffff161061044f576104468383610b6c565b506102c76107f9565b6101408301805160010167ffffffffffffffff16905260006102ae905060008060006104848660600151886000015186610d4a565b9250925092508163ffffffff1660001480156104a657508063ffffffff16600c145b156104c2576104b489610dd0565b97505050505050505061013a565b63ffffffff8216603014806104dd575063ffffffff82166038145b156104ee576104b487878585611f95565b63ffffffff821660341480610509575063ffffffff8216603c145b1561051a576104b487878585611f95565b60006105a4876040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b6040805160e080820183528382528a015160208201528a5191810191909152610a2e606082015263ffffffff808716608083015285811660a0830152841660c08201529091506000806105f68361224a565b918d52855167ffffffffffffffff9081166060808f01919091526020880151821660808f01526040880151821660a08f01528701511660c08d01529250905061063d6127ff565b811561064d5761064d8b826128bc565b6106556107f9565b9b50505050505050505050505095945050505050565b604080516101e0808201835260008083526020830181905292820183905260608201839052608080830184905260a0830184905260c0830184905260e08301849052610100830184905261012083018490526101408301849052610160830184905261018083018490526101a083018490526101c0909201839052519091906106f957816101800151610700565b816101a001515b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb581036107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d49505336343a20706f73742d7374617465206163746976652074687265616460448201527f20737461636b20697320656d707479000000000000000000000000000000000060648201526084016103cc565b5050565b60018163ffffffff1611156107f6576040517f0136cc7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60408051608051815260a051602082015260d8519181019190915260f851604882015261011f5160508201526101385160518201526101585160598201526101605161017f5160618301526101805161019f5160628401526101b85160638401526101d851606b8401526101ff5160738401526102005160748401526102205160948401526102585160b4840152600060bc8085018281529194929361026093929183a06000935084600181146108b357600394506108db565b8180156108cb57600181146108d457600295506108d9565b600095506108d9565b600195505b505b505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b179150610915816107b5565b5090565b3661092861012a61016461529c565b8110156109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d49505336343a20696e73756666696369656e742063616c6c6461746120666f60448201527f7220746872656164207769746e6573730000000000000000000000000000000060648201526084016103cc565b6101643560c090811c835261016c3560f890811c602085015261016d35901c604084015261016e35811c606084015261017635811c608084015261017e35811c60a084015261018635811c9083015260e082015161018e9060005b6020811015610a3657823560c01c8252600890920191602090910190600101610a12565b5050505050565b6000610a50610a4a6128f4565b836129a7565b90506000836101600151610a6957836101800151610a70565b836101a001515b9050818114610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d49505336343a20696e76616c696420746872656164207769746e657373000060448201526064016103cc565b50505050565b80610160015115610aff57610af46128f4565b6101a0820152610b0e565b610b076128f4565b6101808201525b6000816101600151610b2557816101800151610b2c565b816101a001515b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58103610b6057610160820180511590525b50600061014090910152565b600082610160015115610c30577fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5836101a0015103610c07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d49505336343a20656d7074792072696768742074687265616420737461636b60448201526064016103cc565b610c0f6128f4565b6101a0840152610180830151610c2590836129a7565b610180840152610ce3565b7fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb583610180015103610cbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d49505336343a20656d707479206c6566742074687265616420737461636b0060448201526064016103cc565b610cc66128f4565b6101808401526101a0830151610cdc90836129a7565b6101a08401525b6000836101600151610cfa57836101800151610d01565b836101a001515b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58103610d395761016084018051159052600191505b506000610140909301929092525090565b600080806003861615610d89576040517f3f8200bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610da08667fffffffffffffff88916876129e9565b9050610db0878260046000612a3b565b9350601a8463ffffffff16901c925083603f169150505b93509350939050565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101829052610e506150da565b608091506102609050600080600080610e6c8560e00151612a8b565b935093509350935060008061139163ffffffff168667ffffffffffffffff1603610eb857610e9f85858a60600151612aa7565b67ffffffffffffffff1660608b01529092509050611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6c67ffffffffffffffff871601610ef757654000000000009150611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec4167ffffffffffffffff87160161114e5762050f0067ffffffffffffffff861614610f61576001610100890152600260e0890152610f536107f9565b9a9950505050505050505050565b50506101c08601516000610f736150da565b6101c089015167ffffffffffffffff9081168252600060208301819052604083018190526080808b018051841660608601525160040183169084015260a0808b015183169084015260c0808b0151909216918301919091525b6020811015611022578860e001518160208110610feb57610feb6152b4565b60200201518260e001518260208110611006576110066152b4565b67ffffffffffffffff9092166020929092020152600101610fcc565b5060e0818101805167ffffffffffffffff8881166103a09092019190915281516000604091820181905292519093018290526101c08c018051600101821690528251608080820185528382526020808301859052828601859052606092830185905285518083018752838f015185168152918e015184169082015260a08d015183169481019490945260c08c0151909116908301529060e0808b015167ffffffffffffffff80881660408301528087169190920152602082018051808316845260040190911690529050805167ffffffffffffffff9081166060808c01919091526020830151821660808c01526040830151821660a08c01528201511660c08a015261112c6127ff565b6111368a83612b59565b61113e6107f9565b9c9b505050505050505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebab67ffffffffffffffff8716016111a057600161010089015260ff851660e08901526111986127ff565b610f536107f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7867ffffffffffffffff87160161127a57604080516101208101825267ffffffffffffffff8781168252868116602080840191909152868216838501528b01516060830152918a0151909116608082015260a081018b90527f0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e073ffffffffffffffffffffffffffffffffffffffff1660c0820152610a2e60e0820152885161010082015261126e8982612b9f565b9093509150611e8f9050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7767ffffffffffffffff871601611322576040805160e08101825267ffffffffffffffff8781168252868116602080840191909152868216838501528b01516060830152918a01519091166080820152610a2e60a0820152885160c082015261130281612be5565b67ffffffffffffffff1660408d015260208c01529093509150611e8f9050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3267ffffffffffffffff8716016113675761135d8585612d77565b9092509050611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebc667ffffffffffffffff8716016113a357505084516000611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3e67ffffffffffffffff87160161140c576001604088015260ff851660208801526113ed88612efe565b1561140457600161010089015260ff851660e08901525b6111986127ff565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebb667ffffffffffffffff87160161152d5767fffffffffffffffc85167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8067ffffffffffffffff8616016114cd57600061148482612f81565b90508463ffffffff808316908216146114ab57600b945067ffffffffffffffff93506114c6565b6114b58b8b61300b565b9d9c50505050505050505050505050565b5050611527565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f67ffffffffffffffff86160161151757611508898961300b565b9b9a5050505050505050505050565b6016925067ffffffffffffffff91505b50611e8f565b67ffffffffffffffff861661139f1480611552575067ffffffffffffffff86166113aa145b1561156157610f53888861300b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7667ffffffffffffffff8716016115a557506009905067ffffffffffffffff611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9a67ffffffffffffffff8716016117435767ffffffffffffffff851615806115f7575067ffffffffffffffff85166001145b156117305750600090508080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff8816016116575750506101208801516298968067ffffffffffffffff9091168181049190066064025b895167fffffffffffffff88716906116729082610a2e613121565b6116a8576040517f8e77b2b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b581610a2e8561312e565b8b526116c18b826128bc565b8a516116d390600883016111ae613121565b611709576040517f834c4cd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611719600882016111ae8461312e565b8b526117288b600883016128bc565b505050611e8f565b506016905067ffffffffffffffff611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5267ffffffffffffffff87160161177f57506000905080611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb3f67ffffffffffffffff8716016117c7576117bb8886866131fd565b8a529092509050611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6d67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6e67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebb467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5d67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6a67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebf767ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6b67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb4f67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7567ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6867ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7367ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb8167ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec2167ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb7767ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6967ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5b67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5967ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeba867ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb6867ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3b67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1267ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5e67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9767ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeba067ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9f67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9c67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1967ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7067ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5c67ffffffffffffffff871601611e2d5760808416600003611e2457506016905067ffffffffffffffff611e8f565b60649150611e8f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d49505336343a20756e696d706c656d656e7465642073797363616c6c00000060448201526064016103cc565b6000611f19886040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b60e0808a015167ffffffffffffffff80871660408301528086169190920152602082018051808316845260040190911690529050805167ffffffffffffffff9081166060808b01919091526020830151821660808b01526040830151821660a08b01528201511660c0890152611f8d6127ff565b6115086107f9565b60e08301516000908190601f601586901c1660208110611fb757611fb76152b4565b60200201519050601f601085901c166000611fd18661338a565b830190506001600463ffffffff871660341480611ff4575063ffffffff8716603c145b1561200157506002905060085b885160009063ffffffff891660301480612021575063ffffffff89166034145b1561205b576120338c868560016133a1565b60ff851660808e015267ffffffffffffffff80871660a08f0152821660c08e0152915061215e565b63ffffffff891660381480612076575063ffffffff8916603c145b1561212c578360ff168c6080015160ff161480156120ab57508067ffffffffffffffff168c60c0015167ffffffffffffffff16145b80156120ce57508467ffffffffffffffff168c60a0015167ffffffffffffffff16145b1561212357600060808d0181905260a08d0181905260c08d015260008b60e001518763ffffffff1660208110612106576121066152b4565b602002015190506121198d8786846133e1565b600192505061215e565b6000915061215e565b6040517fecf79d0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121e88c6040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b9050612202818d60e001518963ffffffff1686600161343b565b805167ffffffffffffffff9081166060808f01919091526020830151821660808f01526040830151821660a08f01528201511660c08d01526122426127ff565b6114b56107f9565b604081015160a0820151600090819063ffffffff166002148061227757508360a0015163ffffffff166003145b156122db57608084015160009060021b630ffffffc1661229c63f0000000602061351f565b866000015160200151161790506122d5858660a0015163ffffffff166002146122c657601f6122c9565b60005b63ffffffff1683613599565b506127f8565b60808401516020808601516000928392601f601083901c8116939260151c16908110612309576123096152b4565b6020020151925060008190508760a0015163ffffffff166027148061233857508760a0015163ffffffff16601a145b8061234d57508760a0015163ffffffff16601b145b156123815787602001518267ffffffffffffffff1660208110612372576123726152b4565b602002015192508190506124be565b60a088015163ffffffff1615806123a257508760a0015163ffffffff16601c145b156123e15787602001518267ffffffffffffffff16602081106123c7576123c76152b4565b60200201516080890151909350600b1c601f1690506124be565b60208860a0015163ffffffff161015612455578760a0015163ffffffff16600c148061241757508760a0015163ffffffff16600d145b8061242c57508760a0015163ffffffff16600e145b1561244157608088015161ffff1692506124be565b61244e886080015161338a565b92506124be565b60288860a0015163ffffffff1610158061247957508760a0015163ffffffff166022145b8061248e57508760a0015163ffffffff166026145b156124be5787602001518267ffffffffffffffff16602081106124b3576124b36152b4565b602002015192508190505b60048860a0015163ffffffff16101580156124e3575060088860a0015163ffffffff16105b806124f857508760a0015163ffffffff166001145b156125245761251b886000015189602001518a60a001518b608001518689613683565b505050506127f8565b600067ffffffffffffffff9050600060208a60a0015163ffffffff16101580612557575060a08a015163ffffffff16601a145b8061256c575060a08a015163ffffffff16601b145b156125d45761257e8a6080015161338a565b86019550600067fffffffffffffff8871690506125a48b60400151828d606001516129e9565b915060288b60a0015163ffffffff16106125d2578a60a0015163ffffffff166037146125d257809250600093505b505b60006040518060c001604052808c6080015163ffffffff1681526020018c60a0015163ffffffff1681526020018c60c0015163ffffffff1681526020018867ffffffffffffffff1681526020018767ffffffffffffffff1681526020018367ffffffffffffffff168152509050600067ffffffffffffffff612655836138f6565b60a08e01519116915060209063ffffffff1615801561267f575060088d60c0015163ffffffff1610155b801561269e57508067ffffffffffffffff168d60c0015163ffffffff16105b156127ae578c60c0015163ffffffff16600814806126c657508c60c0015163ffffffff166009145b156126fe576126f08d8e60c0015163ffffffff166008146126e757876126ea565b60005b8b613599565b5050505050505050506127f8565b8c60c0015163ffffffff16600a0361272f578c5160208e01516126f09190888c67ffffffffffffffff8d161561343b565b8c60c0015163ffffffff16600b03612761578c5160208e01516126f09190888c67ffffffffffffffff8d16151561343b565b60108d60c0015163ffffffff161015801561278f57508067ffffffffffffffff168d60c0015163ffffffff16105b156127ae576126f08d600001518e602001518f60c001518c8c8b614570565b67ffffffffffffffff858116146127d8576127ce858e606001518461312e565b9b5060019a508499505b6127ee8d600001518e602001518885600161343b565b5050505050505050505b9193909250565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101919091526128806150da565b50608090506102606000612895610a4a6128f4565b9050826101600151156128af576101a08301819052505050565b6101808301819052505050565b60a082015167fffffffffffffff81667ffffffffffffffff8216036107b15760006080830181905260a0830181905260c08301525050565b61028e353661290661012a6020615312565b6129189063ffffffff1661016461529c565b811015610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d49505336343a20696e73756666696369656e742063616c6c6461746120666f60448201527f7220746872656164207769746e6573730000000000000000000000000000000060648201526084016103cc565b6000806129b383614b4a565b60408051602081018790529081018290529091506060016040516020818303038152906040528051906020012091505092915050565b6000806129f7858585614bd3565b909250905080612a33576040517f8e77b2b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509392505050565b600080600080612a4b8887614cab565b925092509250828267ffffffffffffffff168867ffffffffffffffff16901c1693508415612a8057612a7d848261351f565b93505b505050949350505050565b6040810151608082015160a083015160c08401515b9193509193565b6000808284610fff811615612ac157610fff811661100003015b8667ffffffffffffffff16600003612b4b57849350908101906560000000000067ffffffffffffffff83161180612b0b57508467ffffffffffffffff168267ffffffffffffffff16105b80612b2957508567ffffffffffffffff168167ffffffffffffffff16105b15612b4657506016925067ffffffffffffffff9150839050610dc7565b612b4f565b8693505b5093509350939050565b81610160015115612b7e57612b73826101a00151826129a7565b6101a0830152610b60565b612b8d826101800151826129a7565b61018083015250600061014090910152565b600080600080612bae85614d2f565b918b5267ffffffffffffffff90921660408b0152929650909450925090508115612bdc57612bdc86826128bc565b50509250929050565b6060810151608082015182516000928392909167ffffffffffffffff1660011480612c1b5750845167ffffffffffffffff166002145b80612c315750845167ffffffffffffffff166004145b15612c425784604001519350612aa0565b845167ffffffffffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa01612d1c576000612c978660c0015167fffffffffffffff88860200151168860a001516129e9565b60608701516020880151604089015192935090916007821660080381811015612cbe578091505b67ffffffffffffffff821660408b018190529850600880830294851b600190951b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192909103029390931c9290921617925060009150612aa09050565b845167ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c01612d6257600b935067ffffffffffffffff9250612aa0565b60099567ffffffffffffffff95509193509150565b60008067ffffffffffffffff8316600103612e375767ffffffffffffffff84161580612dad575067ffffffffffffffff84166001145b80612dc2575067ffffffffffffffff84166002145b80612dd7575067ffffffffffffffff84166005145b80612dec575067ffffffffffffffff84166003145b80612e01575067ffffffffffffffff84166006145b80612e16575067ffffffffffffffff84166004145b15612e245760009150612ef7565b506009905067ffffffffffffffff612ef7565b8267ffffffffffffffff16600303612ee85767ffffffffffffffff84161580612e6a575067ffffffffffffffff84166005145b80612e7f575067ffffffffffffffff84166003145b15612e8d5760009150612ef7565b67ffffffffffffffff841660011480612eb0575067ffffffffffffffff84166002145b80612ec5575067ffffffffffffffff84166006145b80612eda575067ffffffffffffffff84166004145b15612e245760019150612ef7565b506016905067ffffffffffffffff5b9250929050565b600080826101600151612f1657826101a00151612f1d565b8261018001515b905060007fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5612f4a6128f4565b1490507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb582148015612f795750805b949350505050565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290525060806000612f7982856004846133a1565b6000808080613098856040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b60e08087015167ffffffffffffffff80871660408301528086169190920152602082018051808316845260040190911690529050805167ffffffffffffffff9081166060808801919091526020830151821660808801526040830151821660a08801528201511660c086015261310e8686610b6c565b506131176107f9565b9695505050505050565b600061013a848484614bd3565b60006131398361500d565b600784161561316d576040517fe6c4247b000000000000000000000000000000000000000000000000000000008152600481fd5b6020830192601f851660180360031b83811b913567ffffffffffffffff90911b191617600585901c603b60005b818110156131f15760208701963583821c60011680156131c157600181146131d6576131e7565b600086815260208390526040902095506131e7565b600082815260208790526040902095505b505060010161319a565b50919695505050505050565b6000808067fffffffffffffff885168161323061321e61012a61016461529c565b61322990602061529c565b6107800190565b90506000613243896000015184846129e9565b905060006132b38a610120015160008082679e3779b97f4a7c15019050601e8167ffffffffffffffff16901c811867bf58476d1ce4e5b9029050601b8167ffffffffffffffff16901c81186794d049bb133111eb029050601f8167ffffffffffffffff16901c8118915050919050565b905060006132c1858b61533a565b905060006132d082600861533a565b90508967ffffffffffffffff80821690831610156132eb5750805b600060016132fa836008615363565b67ffffffffffffffff166001901b6133129190615393565b905061331f82600861533a565b61332a906008615363565b67ffffffffffffffff91821691161b613344846008615363565b67ffffffffffffffff91821691161c801986168582161761336689898361312e565b99506133728f8a6128bc565b50909d60009d50979b50969950505050505050505050565b600061339b61ffff8316601061351f565b92915050565b600067fffffffffffffff88416816133c061321e61012a61016461529c565b905060006133d3886000015184846129e9565b9050612a7d87828888612a3b565b67fffffffffffffff8831660006133ff61321e61012a61016461529c565b90506000613412876000015184846129e9565b90506000613422878388886150a2565b905061342f84848361312e565b90975250505050505050565b60208367ffffffffffffffff16106134af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d49505336343a2076616c69642072656769737465720000000000000000000060448201526064016103cc565b67ffffffffffffffff8316158015906134c55750805b156134fc5781848467ffffffffffffffff16602081106134e7576134e76152b4565b67ffffffffffffffff90921660209290920201525b5050505060208101805167ffffffffffffffff8082169093526004019091169052565b6000600167ffffffffffffffff8481167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85810183169190911c83161515926040869003831681901b820192861692831b921b018261357f576000613581565b815b90861667ffffffffffffffff16179250505092915050565b8251805160209091015167ffffffffffffffff9081166004909201161461361c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d49505336343a206a756d7020696e2064656c617920736c6f7400000000000060448201526064016103cc565b8251805160208083015167ffffffffffffffff908116909352855184841691015290831615610adb578060080184602001518467ffffffffffffffff1660208110613669576136696152b4565b67ffffffffffffffff909216602092909202015250505050565b6000866000015160040167ffffffffffffffff16876020015167ffffffffffffffff161461370d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d49505336343a206272616e636820696e2064656c617920736c6f740000000060448201526064016103cc565b8463ffffffff166004148061372857508463ffffffff166005145b156137b3576000868467ffffffffffffffff166020811061374b5761374b6152b4565b602002015190508067ffffffffffffffff168367ffffffffffffffff1614801561377b57508563ffffffff166004145b806137ab57508067ffffffffffffffff168367ffffffffffffffff16141580156137ab57508563ffffffff166005145b91505061388d565b8463ffffffff166006036137d05760008260070b1315905061388d565b8463ffffffff166007036137ec5760008260070b13905061388d565b8463ffffffff1660010361388d57601f601085901c1660008190036138155760008360070b1291505b8063ffffffff1660100361384357875160080167ffffffffffffffff166103e08801526000600784900b1291505b8063ffffffff1660010361385c5760008360070b121591505b8063ffffffff1660110361388b57875160080167ffffffffffffffff166103e08801526000600784900b121591505b505b8651602088015167ffffffffffffffff16885281156138d65760026138b761ffff8716601061351f565b67ffffffffffffffff90811690911b82016004011660208901526138ec565b60208801805160040167ffffffffffffffff1690525b5050505050505050565b8051602082015160408301516060840151608085015160a0860151600095949392919063ffffffff85161580613944575060088563ffffffff16101580156139445750600f8563ffffffff16105b8061395557508463ffffffff166018145b8061396657508463ffffffff166019145b1561409a5784600881146139b957600981146139c257600a81146139cb57600b81146139d457600c81146139dd57600d81146139e657600e81146139ef57601881146139f85760198114613a0157613a06565b60209450613a06565b60219450613a06565b602a9450613a06565b602b9450613a06565b60249450613a06565b60259450613a06565b60269450613a06565b602c9450613a06565b602d94505b508363ffffffff16600003613a4757601f600687901c16613a3a67ffffffffffffffff8416821b63ffffffff16602061351f565b9998505050505050505050565b8363ffffffff16600203613a7b57613a6f63ffffffff8316601f600689901c161c602061351f565b98975050505050505050565b8363ffffffff16600303613aaa57601f600687901c16613a3a63ffffffff848116831c9060208490031661351f565b8363ffffffff16600403613ad957601f8316613a3a67ffffffffffffffff8416821b63ffffffff16602061351f565b8363ffffffff16600603613afd57613a6f63ffffffff8316601f85161c602061351f565b8363ffffffff16600703613b2557601f8316613a3a63ffffffff8416821c602083900361351f565b8363ffffffff16600803613b3f5750909695505050505050565b8363ffffffff16600903613b595750909695505050505050565b8363ffffffff16600a03613b735750909695505050505050565b8363ffffffff16600b03613b8d5750909695505050505050565b8363ffffffff16600c03613ba75750909695505050505050565b8363ffffffff16600f03613bc15750909695505050505050565b8363ffffffff16601003613bdb5750909695505050505050565b8363ffffffff16601103613bf55750909695505050505050565b8363ffffffff16601203613c0f5750909695505050505050565b8363ffffffff16601303613c295750909695505050505050565b8363ffffffff16601403613c4257509695505050505050565b8363ffffffff16601603613c5b57509695505050505050565b8363ffffffff16601703613c7457509695505050505050565b8363ffffffff16601803613c8e5750909695505050505050565b8363ffffffff16601903613ca85750909695505050505050565b8363ffffffff16601a03613cc25750909695505050505050565b8363ffffffff16601b03613cdc5750909695505050505050565b8363ffffffff16601c03613cf65750909695505050505050565b8363ffffffff16601d03613d105750909695505050505050565b8363ffffffff16601e03613d2a5750909695505050505050565b8363ffffffff16601f03613d445750909695505050505050565b8363ffffffff16602003613d6557613a6f82840163ffffffff16602061351f565b8363ffffffff16602103613d8657613a6f82840163ffffffff16602061351f565b8363ffffffff16602203613da757613a6f82840363ffffffff16602061351f565b8363ffffffff16602303613dc857613a6f82840363ffffffff16602061351f565b8363ffffffff16602403613de157501695945050505050565b8363ffffffff16602503613dfa57501795945050505050565b8363ffffffff16602603613e1357501895945050505050565b8363ffffffff16602703613e2d5750171995945050505050565b8363ffffffff16602a03613e61578160070b8360070b12613e4f576000613e52565b60015b60ff1698975050505050505050565b8363ffffffff16602b03613e91578167ffffffffffffffff168367ffffffffffffffff1610613e4f576000613e52565b8363ffffffff16602c03613eaa57500195945050505050565b8363ffffffff16602d03613ec357500195945050505050565b8363ffffffff16602e03613edd5750900395945050505050565b8363ffffffff16602f03613ef75750900395945050505050565b8363ffffffff16603803613f26575067ffffffffffffffff1660069490941c601f169390931b95945050505050565b8363ffffffff16603a03613f55575067ffffffffffffffff1660069490941c601f169390931c95945050505050565b8363ffffffff16603b03613f7d575060070b60069490941c601f169390931d95945050505050565b8363ffffffff16603c03613fbc5760068663ffffffff16901c601f1660200163ffffffff168267ffffffffffffffff16901b9650505050505050919050565b8363ffffffff16603e03613ffb5760068663ffffffff16901c601f1660200163ffffffff168267ffffffffffffffff16901c9650505050505050919050565b8363ffffffff16603f036140335760068663ffffffff16901c601f1660200163ffffffff168260070b901d9650505050505050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4d49505336343a20696e76616c696420696e737472756374696f6e000000000060448201526064016103cc565b614033565b8463ffffffff16601c0361418f578363ffffffff166002036140c957613a6f82840263ffffffff16602061351f565b8363ffffffff16602014806140e457508363ffffffff166021145b15614133578363ffffffff166020036140fb579119915b60005b6380000000841615614121576801fffffffffffffffe600194851b1693016140fe565b63ffffffff1698975050505050505050565b8363ffffffff166024148061414e57508363ffffffff166025145b15614095578363ffffffff16602403614165579119915b60005b678000000000000000841615614121576801fffffffffffffffe600194851b169301614168565b8463ffffffff16600f036141b657613a6f60108367ffffffffffffffff16901b602061351f565b8463ffffffff166020036141d157613a6f8382600180612a3b565b8463ffffffff166021036141ed57613a6f838260026001612a3b565b8463ffffffff1660220361423e57600061420b848360046000612a3b565b905063ffffffff80821660086003871602821690811b919081901b8116906115089082198716811690841617602061351f565b8463ffffffff1660230361425a57613a6f838260046001612a3b565b8463ffffffff1660240361427657613a6f838260016000612a3b565b8463ffffffff1660250361429257613a6f838260026000612a3b565b8463ffffffff1660260361430f5760006142b0848360046000612a3b565b905063ffffffff80821660038681166008810260180367ffffffffffffffff1692831c939283901c928319881685171691036142f15761113e81602061351f565b67ffffffff00000000959095169094179a9950505050505050505050565b8463ffffffff1660280361432a57613a6f83826001856150a2565b8463ffffffff1660290361434557613a6f83826002856150a2565b8463ffffffff16602a036143985763ffffffff601860039490941b93841681811c67ffffffffffffffff9081166020968716909603811695861b199390931693909116901c1690911b1795945050505050565b8463ffffffff16602b036143b357613a6f83826004856150a2565b8463ffffffff16602e036144135760006143d1848360046000612a3b565b905067ffffffffffffffff838116600860038716026018039182161b9063ffffffff90811681901b8116908119841681169083161761113e87866004846150a2565b8463ffffffff16601a036144475767ffffffffffffffff90811660039390931b60381692831b921b19161795945050505050565b8463ffffffff16601b0361448a5767ffffffffffffffff90811660039390931b60389081169081900382169390931c60089390930181161b161795945050505050565b8463ffffffff166027036144c65767ffffffffffffffff908116602060039490941b8416909303169190911c63ffffffff169695505050505050565b8463ffffffff16602c036144ff5767ffffffffffffffff91821660039390931b60381692831c9190921c19919091161795945050505050565b8463ffffffff16602d0361453e5767ffffffffffffffff603860039490941b8416909303831683811b19919091169190921690911b1795945050505050565b8463ffffffff1660370361455757979650505050505050565b8463ffffffff16603f0361403357509695505050505050565b60008463ffffffff1660100361458b57506060860151614ae2565b8463ffffffff166011036145ae5767ffffffffffffffff84166060880152614ae2565b8463ffffffff166012036145c757506040860151614ae2565b8463ffffffff166013036145ea5767ffffffffffffffff84166040880152614ae2565b8463ffffffff166018036146535760008360030b8560030b02905061461e60208267ffffffffffffffff16901c602061351f565b67ffffffffffffffff16606089015261463e63ffffffff8216602061351f565b67ffffffffffffffff16604089015250614ae2565b8463ffffffff1660190361468d5760008363ffffffff168563ffffffff1602905061461e60208267ffffffffffffffff16901c602061351f565b8463ffffffff16601a0361477b578263ffffffff1660000361470b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b6147318360030b8560030b81614723576147236152e3565b0763ffffffff16602061351f565b67ffffffffffffffff166060880152614767600384810b9086900b81614759576147596152e3565b0563ffffffff16602061351f565b67ffffffffffffffff166040880152614ae2565b8463ffffffff16601b0361485d578263ffffffff166000036147f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b6148258363ffffffff168563ffffffff1681614817576148176152e3565b0663ffffffff16602061351f565b67ffffffffffffffff16606088015261476763ffffffff8085169086168161484f5761484f6152e3565b0463ffffffff16602061351f565b8463ffffffff16601403614881575067ffffffffffffffff8216603f84161b614ae2565b8463ffffffff166016036148a5575067ffffffffffffffff8216603f84161c614ae2565b8463ffffffff166017036148c35750600782900b603f84161d614ae2565b8463ffffffff16601c036149005767ffffffffffffffff600785810b9085900b02600f81900b604090811d831660608b0152911690880152614ae2565b8463ffffffff16601d036149355767ffffffffffffffff84811681851602604081811c831660608b0152911690880152614ae2565b8463ffffffff16601e03614a07578267ffffffffffffffff166000036149b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b8260070b8460070b816149cc576149cc6152e3565b0767ffffffffffffffff166060880152600783810b9085900b816149f2576149f26152e3565b0567ffffffffffffffff166040880152614ae2565b8463ffffffff16601f03614ae2578267ffffffffffffffff16600003614a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b8267ffffffffffffffff168467ffffffffffffffff1681614aac57614aac6152e3565b0667ffffffffffffffff908116606089015283811690851681614ad157614ad16152e3565b0467ffffffffffffffff1660408801525b67ffffffffffffffff821615614b245780868367ffffffffffffffff1660208110614b0f57614b0f6152b4565b67ffffffffffffffff90921660209290920201525b50505060208401805167ffffffffffffffff808216909652600401909416909352505050565b60405160188201518152603f8201516008820152605f82015160098201526078820151600a8201526098820151601282015260b8820151601a82015260d8820151602282015260e0820151600091602a8101835b6020811015614bc25760188401518252602090930192600890910190600101614b9e565b506000815281900390209392505050565b600080614bdf8361500d565b6007841615614c13576040517fe6c4247b000000000000000000000000000000000000000000000000000000008152600481fd5b602083019235600585901c81603b60005b81811015614c7b5760208801973584821c6001168015614c4b5760018114614c6057614c71565b60008581526020839052604090209450614c71565b600082815260208690526040902094505b5050600101614c24565b505087149250508115614ca257601f851660180360031b81901c67ffffffffffffffff1692505b50935093915050565b600080806807fffffffffffffff8600385901b1681614ccb82604061533a565b67ffffffffffffffff9081161c90506000614ce760018861533a565b19881660071690506000614cfc88600861533a565b905088821660006003614d0f838561533a565b959c67ffffffffffffffff909616901b9a50949850929650505050505050565b610100810151608082015182516000928392918390819067ffffffffffffffff161561500457865167ffffffffffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb01614f7057600067fffffffffffffff888602001511690506000614db0896101000151838b60e001516129e9565b60608a015190915060001a600103614e3257614e2c89606001518a60a0015160408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b60608a01525b6000808a60c0015173ffffffffffffffffffffffffffffffffffffffff1663e03110e18c606001518d608001516040518363ffffffff1660e01b8152600401614e8f92919091825267ffffffffffffffff16602082015260400190565b6040805180830381865afa158015614eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ecf91906153aa565b60208d015160408e01519294509092509060078216600881900384811015614ef5578094505b5083821015614f02578193505b8460088502610100031c9450846008828660080303021b9450600180600883600803021b036001806008878560080303021b03915081198116905085811988161796505050614f56868e60e001518761312e565b929b50505096890196955060019450919250615004915050565b865167ffffffffffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01614fae5786604001519550615004565b865167ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c01614ff457600b955067ffffffffffffffff9450615004565b6009955067ffffffffffffffff94505b91939550919395565b3661078082018110156107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d49505336344d656d6f72793a20636865636b2074686174207468657265206960448201527f7320656e6f7567682063616c6c6461746100000000000000000000000000000060648201526084016103cc565b60008060006150b18786614cab565b5067ffffffffffffffff868316811691811691821b9216901b1987161792505050949350505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260e08101615120615125565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b8181101561517157858101830151858201604001528201615155565b81811115615183576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f8401126151c957600080fd5b50813567ffffffffffffffff8111156151e157600080fd5b602083019150836020828501011115612ef757600080fd5b60008060008060006060868803121561521157600080fd5b853567ffffffffffffffff8082111561522957600080fd5b61523589838a016151b7565b9097509550602088013591508082111561524e57600080fd5b5061525b888289016151b7565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156152af576152af61526d565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8083168185168083038211156153315761533161526d565b01949350505050565b600067ffffffffffffffff8381169083168181101561535b5761535b61526d565b039392505050565b600067ffffffffffffffff8083168185168183048111821515161561538a5761538a61526d565b02949350505050565b6000828210156153a5576153a561526d565b500390565b600080604083850312156153bd57600080fd5b50508051602090910151909290915056fea164736f6c634300080f000a"; + bytes internal constant acc34Code = + hex"60806040526004361061015f5760003560e01c8063715018a6116100c0578063b107095711610074578063c4d66de811610059578063c4d66de81461049e578063dad544e0146104be578063f2fde38b146104d357600080fd5b8063b10709571461041d578063bb8aa1fc1461043d57600080fd5b806382ecf2f6116100a557806382ecf2f6146103bf5780638da5cb5b146103d257806396cd9720146103fd57600080fd5b8063715018a61461038a57806374cc86ac1461039f57600080fd5b80633e47158c1161011757806354fd4d50116100fc57806354fd4d50146102b25780635f0150cb146103085780636593dc6e1461035d57600080fd5b80633e47158c1461027e5780634d1975b41461029357600080fd5b80631e334240116101485780631e334240146101f3578063254bd6831461021357806338d38c971461024057600080fd5b806314f6b1a3146101645780631b685b9e14610186575b600080fd5b34801561017057600080fd5b5061018461017f3660046116b9565b6104f3565b005b34801561019257600080fd5b506101c96101a13660046116f0565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ff57600080fd5b5061018461020e36600461170b565b61057d565b34801561021f57600080fd5b5061023361022e366004611735565b6105c9565b6040516101ea91906117e2565b34801561024c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000011681526020016101ea565b34801561028a57600080fd5b506101c961080d565b34801561029f57600080fd5b506068545b6040519081526020016101ea565b3480156102be57600080fd5b506102fb6040518060400160405280600581526020017f312e352e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ea919061189f565b34801561031457600080fd5b506103286103233660046118fb565b610a18565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff9091166020830152016101ea565b34801561036957600080fd5b506102a46103783660046116f0565b60666020526000908152604090205481565b34801561039657600080fd5b50610184610a6b565b3480156103ab57600080fd5b506102fb6103ba3660046116f0565b610a7f565b6101c96103cd3660046118fb565b610b19565b3480156103de57600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166101c9565b34801561040957600080fd5b506102a46104183660046118fb565b610e24565b34801561042957600080fd5b50610184610438366004611955565b610e5d565b34801561044957600080fd5b5061045d6104583660046119a0565b610f5d565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff16908201526060016101ea565b3480156104aa57600080fd5b506101846104b93660046119b9565b610fc6565b3480156104ca57600080fd5b506101c961113e565b3480156104df57600080fd5b506101846104ee3660046119b9565b6111bb565b6104fb611272565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610585611272565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806105db575081155b610806575060408051600583901b8101602001909152825b8381116108045760006068828154811061060f5761060f6119d6565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036107d5576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106ef9190810190611a34565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107629190611aff565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a516107a49190611b47565b815181106107b4576107b46119d6565b6020026020010181905250888851106107d257505050505050610804565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506105f39050565b505b9392505050565b6000806108387fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561085b57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261089e9190611b5e565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906108f9906060015b604051602081830303815290604052805190602001205490565b14610930576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610952906060016108df565b905073ffffffffffffffffffffffffffffffffffffffff8116156109e6578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190611b9b565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000610a2987878787610e24565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610a73611272565b610a7d60006112f3565b565b60696020526000908152604090208054610a9890611bb8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac490611bb8565b8015610b115780601f10610ae657610100808354040283529160200191610b11565b820191906000526020600020905b815481529060010190602001808311610af457829003601f168201915b505050505081565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b89576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610bd7576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610be4600143611b47565b63ffffffff8816600090815260696020526040902080549140925090610c0990611bb8565b9050600003610c8057610c793387838888604051602001610c2e959493929190611c0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff84169061136a565b9250610cc1565b610cbe3387838a8989606960008f63ffffffff1663ffffffff168152602001908152602001600020604051602001610c2e9796959493929190611c58565b92505b8273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b50505050506000610d3088888888610e24565b60008181526067602052604090205490915015610d7c576040517f014f6fe500000000000000000000000000000000000000000000000000000000815260048101829052602401610b80565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610e3d9493929190611db6565b604051602081830303815290604052805190602001209050949350505050565b610e65611272565b63ffffffff8416600090815260656020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff881617905560699091529020610ecd828483611e35565b5060405163ffffffff85169073ffffffffffffffffffffffffffffffffffffffff8516907fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de90600090a38363ffffffff167fa47fcdf075d680d3817bfca7973b373e1a5f6cfc3b444748299cc2b83d8348f98383604051610f4f929190611f50565b60405180910390a250505050565b600080600080600080610fb660688881548110610f7c57610f7c6119d6565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9199909850909650945050505050565b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015611006575060005460ff8083169116105b611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b80565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556110cb611378565b6110d36113f9565b6110dc826112f3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b600061114861080d565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190611b9b565b905090565b6111c3611272565b73ffffffffffffffffffffffffffffffffffffffff8116611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b80565b61126f816112f3565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b80565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061080660008484611498565b3361138161080d565b73ffffffffffffffffffffffffffffffffffffffff16141580156113c25750336113a961113e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610a7d576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b80565b610a7d6115de565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf0975050866115645763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff16611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b80565b610a7d336112f3565b803563ffffffff8116811461169257600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461126f57600080fd5b600080604083850312156116cc57600080fd5b6116d58361167e565b915060208301356116e581611697565b809150509250929050565b60006020828403121561170257600080fd5b6108068261167e565b6000806040838503121561171e57600080fd5b6117278361167e565b946020939093013593505050565b60008060006060848603121561174a57600080fd5b6117538461167e565b95602085013595506040909401359392505050565b60005b8381101561178357818101518382015260200161176b565b83811115611792576000848401525b50505050565b600081518084526117b0816020860160208601611768565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611891578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061187d81860183611798565b968901969450505090860190600101611809565b509098975050505050505050565b6020815260006108066020830184611798565b60008083601f8401126118c457600080fd5b50813567ffffffffffffffff8111156118dc57600080fd5b6020830191508360208285010111156118f457600080fd5b9250929050565b6000806000806060858703121561191157600080fd5b61191a8561167e565b935060208501359250604085013567ffffffffffffffff81111561193d57600080fd5b611949878288016118b2565b95989497509550505050565b6000806000806060858703121561196b57600080fd5b6119748561167e565b9350602085013561198481611697565b9250604085013567ffffffffffffffff81111561193d57600080fd5b6000602082840312156119b257600080fd5b5035919050565b6000602082840312156119cb57600080fd5b813561080681611697565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a4657600080fd5b815167ffffffffffffffff80821115611a5e57600080fd5b818401915084601f830112611a7257600080fd5b815181811115611a8457611a84611a05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611aca57611aca611a05565b81604052828152876020848701011115611ae357600080fd5b611af4836020830160208801611768565b979650505050505050565b600060208284031215611b1157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611b5957611b59611b18565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b9657611b96611b18565b500290565b600060208284031215611bad57600080fd5b815161080681611697565b600181811c90821680611bcc57607f821691505b602082108103611c05577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1681528660148201528560348201527fffffffff000000000000000000000000000000000000000000000000000000008560e01b166054820152600060588486828501378483018181016000815260008654611cd881611bb8565b60018281168015611cf05760018114611d2557611d58565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841686528783151584028801019450611d58565b8a60005260208060002060005b85811015611d4d5781548a82018c0152908401908201611d32565b505050878388010194505b50929f9e505050505050505050505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b63ffffffff85168152836020820152606060408201526000611ddc606083018486611d6d565b9695505050505050565b601f821115611e3057600081815260208120601f850160051c81016020861015611e0d5750805b601f850160051c820191505b81811015611e2c57828155600101611e19565b5050505b505050565b67ffffffffffffffff831115611e4d57611e4d611a05565b611e6183611e5b8354611bb8565b83611de6565b6000601f841160018114611eb35760008515611e7d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611f49565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611f025786850135825560209485019460019092019101611ee2565b5086821015611f3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b602081526000611f64602083018486611d6d565b94935050505056fea164736f6c634300080f000a"; + bytes internal constant acc35Code = + hex"608060405234801561001057600080fd5b50600436106101cf5760003560e01c80635958a19311610104578063952b2797116100a2578063e0a840eb11610071578063e0a840eb146104d5578063ee658e45146104f5578063f2b4e61714610508578063fdbb3dcf1461052857600080fd5b8063952b27971461048f578063d5a3e12e146104bd578063d83ef267146104c5578063dad544e0146104cd57600080fd5b80636c4f4467116100de5780636c4f44671461042e5780637258a807146104415780637d6be8dc146104695780637fc485041461047c57600080fd5b80635958a193146103d55780635c975abb146103e8578063664ed830146103f057600080fd5b80633c9f397c1161017157806345884d321161014b57806345884d321461034357806347a222c514610366578063496b9c161461037957806354fd4d501461038c57600080fd5b80633c9f397c146102e15780633e47158c146103065780634086d1831461030e57600080fd5b806333d7e2bd116101ad57806333d7e2bd1461022457806334a346ea1461026f57806335e80ab3146102a857806338d38c97146102b057600080fd5b80630314d2b3146101d457806304e50fed146101fc57806317cf21a91461020f575b600080fd5b6101e76101e23660046117c8565b61053b565b60405190151581526020015b60405180910390f35b6101e761020a3660046117c8565b61061b565b61022261021d3660046117c8565b610692565b005b60005461024a9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b6101e761027d3660046117c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b61024a6107f7565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000011681526020016101f3565b6006546102f19063ffffffff1681565b60405163ffffffff90911681526020016101f3565b61024a61088e565b60065461032a90640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101f3565b6101e76103513660046117c8565b60056020526000908152604090205460ff1681565b61022261037436600461187c565b610a99565b6101e76103873660046117c8565b610d15565b6103c86040518060400160405280600581526020017f332e372e3100000000000000000000000000000000000000000000000000000081525081565b6040516101f391906119ad565b6101e76103e33660046117c8565b610d8d565b6101e7610e10565b6040805180820182526000808252602091820152815180830183526003548082526004549183019182528351908152905191810191909152016101f3565b6101e761043c3660046117c8565b610ea2565b61045461044f3660046119c0565b610f72565b604080519283526020830191909152016101f3565b6102226104773660046117c8565b610f86565b61022261048a3660046119c0565b611005565b6040517f0000000000000000000000000000000000000000000000000000000000049d4081526020016101f3565b610222611076565b6104546110f6565b61024a611255565b60025461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e76105033660046117c8565b6112a9565b60015461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e76105363660046117c8565b6114b6565b6000610546826114b6565b61055257506000919050565b7f0000000000000000000000000000000000000000000000000000000000049d406105f28373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e591906119fa565b67ffffffffffffffff1690565b6106069067ffffffffffffffff1642611a44565b1161061357506000919050565b506001919050565b60008173ffffffffffffffffffffffffffffffffffffffff1663250e69bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068c9190611a5b565b92915050565b8061069c81610ea2565b6106d2576040517f47ad367a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106dc6110f6565b915050808273ffffffffffffffffffffffffffffffffffffffff166399735e326040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190611a7d565b11610786576040517f47ad367a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f474f180d74ea8751955ee261c93ff8270411b180408d1014c49f552c92a4d11e90600090a2505050565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108899190611a96565b905090565b6000806108b97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156108dc57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261091f9190611ab3565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061097a906060015b604051602081830303815290604052805190602001205490565b146109b1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906109d390606001610960565b905073ffffffffffffffffffffffffffffffffffffffff811615610a67578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190611a96565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015610ad9575060005460ff8083169116105b610b69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610ba261162b565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff88811691909102919091178255600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691871691909117905583516003556020840151600455600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff85161790819055640100000000900467ffffffffffffffff169003610cb057600680547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff166401000000004267ffffffffffffffff16021790555b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000610d20826112a9565b610d2c57506000919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090205460ff1615610d6257506000919050565b610d6b82610d8d565b15610d7857506000919050565b610d80610e10565b1561061357506000919050565b6000600660049054906101000a900467ffffffffffffffff1667ffffffffffffffff16610dfe8373ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c1573d6000803e3d6000fd5b67ffffffffffffffff16111592915050565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108899190611a5b565b6000610ead82610d15565b610eb957506000919050565b610ec28261061b565b610ece57506000919050565b610ed78261053b565b610ee357506000919050565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f549190611b1f565b6002811115610f6557610f65611af0565b1461061357506000919050565b600080610f7d6110f6565b91509150915091565b610f8e6116ae565b73ffffffffffffffffffffffffffffffffffffffff811660008181526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f192c289026d59a41a27f5aea08f3969b57931b0589202d14f4368cded95d3cda9190a250565b61100d6116ae565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83169081179091556040519081527fcee0703b5e4bad4efededab85c9fd1aec17dee7c5f6c584330e0509b677745a29060200160405180910390a150565b61107e6116ae565b600680547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff166401000000004267ffffffffffffffff811691909102919091179091556040519081527f6e5b1ba771e8e484f741ed085f039ff4e5c6e882eaf68f550fb390922d0ae4a79060200160405180910390a1565b600254600090819073ffffffffffffffffffffffffffffffffffffffff166111245750506003546004549091565b600254604080517fbcef3b5500000000000000000000000000000000000000000000000000000000815290516111bc9273ffffffffffffffffffffffffffffffffffffffff169163bcef3b559160048083019260209291908290030181865afa158015611195573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b99190611a7d565b90565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399735e326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611229573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124d9190611a7d565b915091509091565b600061125f61088e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610865573d6000803e3d6000fd5b6000806000808473ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156112fa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113409190810190611b40565b6001546040517f5f0150cb000000000000000000000000000000000000000000000000000000008152939650919450925060009173ffffffffffffffffffffffffffffffffffffffff90911690635f0150cb906113a590879087908790600401611c11565b6040805180830381865afa1580156113c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e59190611c3f565b50905060008673ffffffffffffffffffffffffffffffffffffffff16635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190611a96565b90508673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480156114ab575073ffffffffffffffffffffffffffffffffffffffff811630145b979650505050505050565b60006115068273ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c1573d6000803e3d6000fd5b67ffffffffffffffff161580159061068c575060028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190611b1f565b600281111561159b5761159b611af0565b148061068c575060018273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116139190611b1f565b600281111561162457611624611af0565b1492915050565b3361163461088e565b73ffffffffffffffffffffffffffffffffffffffff161415801561167557503361165c611255565b73ffffffffffffffffffffffffffffffffffffffff1614155b156116ac576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190611a96565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f2e5321ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811681146117c557600080fd5b50565b6000602082840312156117da57600080fd5b81356117e5816117a3565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611862576118626117ec565b604052919050565b63ffffffff811681146117c557600080fd5b60008060008084860360a081121561189357600080fd5b853561189e816117a3565b945060208601356118ae816117a3565b935060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820112156118e057600080fd5b506040516040810181811067ffffffffffffffff82111715611904576119046117ec565b6040908152860135815260608601356020820152915060808501356119288161186a565b939692955090935050565b60005b8381101561194e578181015183820152602001611936565b8381111561195d576000848401525b50505050565b6000815180845261197b816020860160208601611933565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117e56020830184611963565b6000602082840312156119d257600080fd5b81356117e58161186a565b805167ffffffffffffffff811681146119f557600080fd5b919050565b600060208284031215611a0c57600080fd5b6117e5826119dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611a5657611a56611a15565b500390565b600060208284031215611a6d57600080fd5b815180151581146117e557600080fd5b600060208284031215611a8f57600080fd5b5051919050565b600060208284031215611aa857600080fd5b81516117e5816117a3565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611aeb57611aeb611a15565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215611b3157600080fd5b8151600381106117e557600080fd5b600080600060608486031215611b5557600080fd5b8351611b608161186a565b60208501516040860151919450925067ffffffffffffffff80821115611b8557600080fd5b818601915086601f830112611b9957600080fd5b815181811115611bab57611bab6117ec565b611bdc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161181b565b9150808252876020828501011115611bf357600080fd5b611c04816020840160208601611933565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000611c366060830184611963565b95945050505050565b60008060408385031215611c5257600080fd5b8251611c5d816117a3565b9150611c6b602084016119dd565b9050925092905056fea164736f6c634300080f000a"; + bytes internal constant acc36Code = + hex"60806040526004361061034a5760003560e01c80636f034409116101bb578063c0d8bb74116100f7578063dabd396d11610095578063f8f43ff61161006f578063f8f43ff614610aee578063fa24f74314610b0e578063fa315aa914610b32578063fe2bbeb214610b6557600080fd5b8063dabd396d14610a58578063ec5e630814610a8b578063eff0f59214610abe57600080fd5b8063cf09e0d0116100d1578063cf09e0d0146109d5578063d5d44d80146109f6578063d6ae3cd514610a16578063d8cc1a3c14610a3857600080fd5b8063c0d8bb7414610914578063c395e1ca14610941578063c6f0308c1461096157600080fd5b80638b85902b11610164578063a445ece61161013e578063a445ece614610805578063bbdc02db146108a5578063bcef3b55146108d2578063bd8da956146108f457600080fd5b80638b85902b146107c15780638d450a95146107e357806399735e32146107c157600080fd5b80637b0f0adc116101955780637b0f0adc146107915780638129fc1c146107a45780638980e0cc146107ac57600080fd5b80636f0344091461075457806370872aa514610767578063786b844b1461077c57600080fd5b80633e3ac9121161028a5780635a5fa2d911610233578063609d33341161020d578063609d3334146106ca57806360e27464146106df5780636361506d146106ff5780636b6716c01461072157600080fd5b80635a5fa2d9146106655780635c0cba33146106855780635e234947146106aa57600080fd5b8063529d6a8c11610264578063529d6a8c146105b957806354fd4d50146105e657806357da950e1461063557600080fd5b80633e3ac912146105515780633fc8cef314610581578063472777c6146105a657600080fd5b806325fc2ace116102f757806330dbe570116102d157806330dbe570146104b8578063378dd48c146104f057806337b1b2291461050a5780633a7684631461052c57600080fd5b806325fc2ace146104645780632810e1d6146104835780632ad69aeb1461049857600080fd5b8063200d2ed211610328578063200d2ed2146103dc578063222abf451461040a578063250e69bd1461044a57600080fd5b8063019351301461034f57806303c2924d1461037157806319effeb414610391575b600080fd5b34801561035b57600080fd5b5061036f61036a36600461557a565b610b95565b005b34801561037d57600080fd5b5061036f61038c3660046155d5565b610e54565b34801561039d57600080fd5b506000546103be9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103e857600080fd5b506000546103fd90600160801b900460ff1681565b6040516103d3919061562e565b34801561041657600080fd5b5061043a610425366004615656565b600c6020526000908152604090205460ff1681565b60405190151581526020016103d3565b34801561045657600080fd5b50600a5461043a9060ff1681565b34801561047057600080fd5b506008545b6040519081526020016103d3565b34801561048f57600080fd5b506103fd6113dc565b3480156104a457600080fd5b506104756104b33660046155d5565b6115b4565b3480156104c457600080fd5b506001546104d8906001600160a01b031681565b6040516001600160a01b0390911681526020016103d3565b3480156104fc57600080fd5b50600d546103fd9060ff1681565b34801561051657600080fd5b503660011981013560f01c90033560601c6104d8565b34801561053857600080fd5b503660011981013560f01c90036098013560601c6104d8565b34801561055d57600080fd5b5060005461043a907201000000000000000000000000000000000000900460ff1681565b34801561058d57600080fd5b503660011981013560f01c900360c0013560601c6104d8565b61036f6105b4366004615673565b6115ea565b3480156105c557600080fd5b506104756105d4366004615656565b60036020526000908152604090205481565b3480156105f257600080fd5b5060408051808201909152600581527f322e342e3100000000000000000000000000000000000000000000000000000060208201525b6040516103d3919061570a565b34801561064157600080fd5b50600854600954610650919082565b604080519283526020830191909152016103d3565b34801561067157600080fd5b5061047561068036600461571d565b6115fc565b34801561069157600080fd5b503660011981013560f01c900360ac013560601c6104d8565b3480156106b657600080fd5b506104756106c536600461571d565b611636565b3480156106d657600080fd5b50610628611697565b3480156106eb57600080fd5b5061036f6106fa366004615656565b6116a5565b34801561070b57600080fd5b503660011981013560f01c900360340135610475565b34801561072d57600080fd5b507f0000000000000000000000000000000000000000000000000000000000002a306103be565b61036f610762366004615744565b6119b6565b34801561077357600080fd5b50600954610475565b34801561078857600080fd5b5061036f612339565b61036f61079f366004615673565b612727565b61036f612734565b3480156107b857600080fd5b50600254610475565b3480156107cd57600080fd5b503660011981013560f01c900360580135610475565b3480156107ef57600080fd5b503660011981013560f01c900360780135610475565b34801561081157600080fd5b5061086761082036600461571d565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046001600160801b0316906001600160a01b031684565b60408051941515855263ffffffff90931660208501526001600160801b03909116918301919091526001600160a01b031660608201526080016103d3565b3480156108b157600080fd5b506040513660011981013560f01c90036054013560e01c81526020016103d3565b3480156108de57600080fd5b503660011981013560f01c900360140135610475565b34801561090057600080fd5b506103be61090f36600461571d565b613006565b34801561092057600080fd5b5061047561092f366004615656565b600b6020526000908152604090205481565b34801561094d57600080fd5b5061047561095c366004615785565b6131a0565b34801561096d57600080fd5b5061098161097c36600461571d565b613361565b6040805163ffffffff90981688526001600160a01b03968716602089015295909416948601949094526001600160801b039182166060860152608085015291821660a08401521660c082015260e0016103d3565b3480156109e157600080fd5b506000546103be9067ffffffffffffffff1681565b348015610a0257600080fd5b50610475610a11366004615656565b6133d5565b348015610a2257600080fd5b503660011981013560f01c900360d40135610475565b348015610a4457600080fd5b5061036f610a533660046157ae565b61342d565b348015610a6457600080fd5b507f0000000000000000000000000000000000000000000000000000000000049d406103be565b348015610a9757600080fd5b507f000000000000000000000000000000000000000000000000000000000000001e610475565b348015610aca57600080fd5b5061043a610ad936600461571d565b60046020526000908152604090205460ff1681565b348015610afa57600080fd5b5061036f610b09366004615673565b613961565b348015610b1a57600080fd5b50610b23613d28565b6040516103d39392919061583a565b348015610b3e57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000049610475565b348015610b7157600080fd5b5061043a610b8036600461571d565b60066020526000908152604090205460ff1681565b60008054600160801b900460ff166002811115610bb457610bb46155f7565b14610bd25760405163067fe19560e41b815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c25576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3e3660011981013560f01c90036014013590565b90565b610c55610c5036869003860186615875565b613d52565b14610c8c576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610ca19291906158e9565b604051809103902014610ce0576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d29610d2484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613dae92505050565b613e1b565b90506000610d5082600881518110610d4357610d436158f9565b6020026020010151613fd1565b9050602081511115610d8e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c3660011981013560f01c9003605801358103610de5576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054600160801b900460ff166002811115610e7357610e736155f7565b14610e915760405163067fe19560e41b815260040160405180910390fd5b600060028381548110610ea657610ea66158f9565b906000526020600020906005020190506000610ec184613006565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d4081169082161015610f2a576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615610f73576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560205260409020805480158015610f9057508515155b15610ff357835464010000000090046001600160a01b031660008115610fb65781610fc5565b60018601546001600160a01b03165b9050610fd18187614085565b505050600094855250506006602052505060409020805460ff19166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046001600160801b031693810193909352600101546001600160a01b03166060830152611077576001600160801b036040820152600181526000869003611077578195505b600086826020015163ffffffff1661108f9190615925565b905060008382116110a057816110a2565b835b602084015190915063ffffffff165b818110156111c25760008682815481106110cd576110cd6158f9565b6000918252602080832090910154808352600690915260409091205490915060ff16611125576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061113a5761113a6158f9565b60009182526020909120600590910201805490915064010000000090046001600160a01b03161580156111815750600481015460408701516001600160801b039182169116115b156111ad5760018101546001600160a01b0316606087015260048101546001600160801b031660408701525b505080806111ba9061593d565b9150506110b1565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006001600160801b03909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909316929092179091558490036113d157606083015160008a8152600660205260409020805460ff191660011790558915801561130e57506000547201000000000000000000000000000000000000900460ff165b15611369576001546001600160a01b0316611329818a614085565b88546001600160a01b03909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556113cf565b6113966001600160a01b038216156113815781611390565b60018901546001600160a01b03165b89614085565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038316021788555b505b505050505050505050565b600080600054600160801b900460ff1660028111156113fd576113fd6155f7565b1461141b5760405163067fe19560e41b815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661147f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b0316600260008154811061149e5761149e6158f9565b600091825260209091206005909102015464010000000090046001600160a01b0316146114cc5760016114cf565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617600160801b836002811115611573576115736155f7565b021790556002811115611588576115886155f7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b600560205281600052604060002081815481106115d057600080fd5b90600052602060002001600091509150505481565b905090565b6115f783838360016119b6565b505050565b6000818152600760209081526040808320600590925282208054825461162d90610100900463ffffffff1682615957565b95945050505050565b60003660011981013560f01c900360d401358214611680576040517f0da789df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003601401355b92915050565b60606115e5605860206140c7565b6116ad612339565b60006002600d5460ff1660028111156116c8576116c86155f7565b036116ec57506001600160a01b0381166000908152600b602052604090205461175b565b6001600d5460ff166002811115611705576117056155f7565b0361172957506001600160a01b03811660009081526003602052604090205461175b565b6040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600c602052604090205460ff16611839576001600160a01b0382166000908152600c60205260409020805460ff191660011790556117b860c0600119369081013560f01c9003013560601c90565b6040517f7eee288d0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529190911690637eee288d90604401600060405180830381600087803b15801561181d57600080fd5b505af1158015611831573d6000803e3d6000fd5b505050505050565b80600003611873576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600b6020908152604080832083905560039091528120553660011981013560f01c900360c0013560601c6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063f3fef3a390604401600060405180830381600087803b15801561191157600080fd5b505af1158015611925573d6000803e3d6000fd5b505050506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611976576040519150601f19603f3d011682016040523d82523d6000602084013e61197b565b606091505b50509050806115f7576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054600160801b900460ff1660028111156119d5576119d56155f7565b146119f35760405163067fe19560e41b815260040160405180910390fd5b600060028481548110611a0857611a086158f9565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff811684526001600160a01b0364010000000090910481169484019490945260018101549093169082015260028201546001600160801b03908116606083015260038301546080830181905260049093015480821660a0840152600160801b90041660c082015291508514611acc576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156001600160801b0383161760011b90506000611b61826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611b9c5750611b997f000000000000000000000000000000000000000000000000000000000000001e6002615925565b81145b8015611ba6575084155b15611bdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611c03575086155b15611c3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000049811115611c94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cbf7f000000000000000000000000000000000000000000000000000000000000001e6001615925565b8103611cd157611cd1868885886140fb565b34611cdb836131a0565b14611d12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d1d88613006565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d40811690821603611d85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611db260017f0000000000000000000000000000000000000000000000000000000000000049615957565b8303611ec8573660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c919061596e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8d919061598b565b611ec1907f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166159a4565b9050611f5b565b611ef360017f000000000000000000000000000000000000000000000000000000000000001e615957565b8303611f2e57611ec17f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff1660026159d0565b507f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff165b611f8f817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615a00565b67ffffffffffffffff16611faa8367ffffffffffffffff1690565b67ffffffffffffffff161115611ff157611fee817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615a00565b91505b6000604083901b421760008a8152608087901b6001600160801b038d1617602052604081209192509060008181526004602052604090205490915060ff1615612066576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff16815260200160006001600160a01b03168152602001336001600160a01b03168152602001346001600160801b031681526020018c8152602001886001600160801b03168152602001846001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160006101000a8154816001600160801b0302191690836001600160801b031602179055506080820151816003015560a08201518160040160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160040160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600560008c8152602001908152602001600020600160028054905061225d9190615957565b81546001810183556000928352602080842090910191909155338252600b9052604081208054349290612291908490615925565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e357600080fd5b505af11580156122f7573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b6002600d5460ff166002811115612352576123526155f7565b148061237457506001600d5460ff166002811115612372576123726155f7565b145b1561237b57565b6000600d5460ff166002811115612394576123946155f7565b146123cb576040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243f9190615a29565b15612476576040517f379a7ed900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005468010000000000000000900467ffffffffffffffff1667ffffffffffffffff166000036124d2576040517fc105260a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003660011981013560f01c900360ac013560601c6040517f0314d2b30000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039190911690630314d2b390602401602060405180830381865afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190615a29565b9050806125a3576040517f4851bd9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6040517f17cf21a90000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0391909116906317cf21a990602401600060405180830381600087803b15801561261257600080fd5b505af1925050508015612623575060015b5060003660011981013560f01c900360ac013560601c6040517f496b9c160000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063496b9c1690602401602060405180830381865afa158015612698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bc9190615a29565b905080156126d657600d805460ff191660011790556126e4565b600d805460ff191660021790555b600d546040517f9908eaac0645df9d0704d06adc9e07337c951de2f06b5f2836151d48d5e4722f9161271b9160ff9091169061562e565b60405180910390a15050565b6115f783838360006119b6565b60005471010000000000000000000000000000000000900460ff1615612786576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61278e61428a565b36146127c6576040517f9824bdab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000803660011981013560f01c900360ac013560601c6001600160a01b031663d83ef2676040518163ffffffff1660e01b81526004016040805180830381865afa158015612818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283c9190615a46565b909250905081612878576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915282815260200181905260088290556009819055803660011981013560f01c900360580135116128fa573660011981013560f01c9003601401355b6040517ff40239db0000000000000000000000000000000000000000000000000000000081526004016128f191815260200190565b60405180910390fd5b67ffffffffffffffff3660011981013560f01c900360580135111561292e573660011981013560f01c9003601401356128bc565b67ffffffffffffffff3660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ab919061596e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0c919061598b565b1115612a44576040517fb4e1243300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a7b7f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166002615a6a565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af3919061596e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b54919061598b565b67ffffffffffffffff16612b8f7f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff1690565b67ffffffffffffffff16612ba39190615925565b90506000612bb18383614298565b905067ffffffffffffffff811115612bf5576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff161115612c6d576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e08101825263ffffffff808252600060208084018281523660011981013560f01c90038035606090811c8789018181526001600160801b0334818116948b0194855260149095013560808b01908152600160a08c0181815242841660c08e019081526002805493840181558c529c517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590930292830180549a5191909d167fffffffffffffffff000000000000000000000000000000000000000000000000909a16999099176401000000006001600160a01b039a8b160217909b5592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf840180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919098161790965592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0820180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001691851691909117905593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015595519651968116600160801b9790911696909602959095177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909101558154710100000000000000000000000000000000007fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff909116178255918152600b909152918220805491929091612eae908490615925565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612f0057600080fd5b505af1158015612f14573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff1617905550612f579150612ff09050565b63ffffffff163660011981013560f01c900360ac013560601c6001600160a01b0316633c9f397c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd19190615a89565b600a805460ff191663ffffffff92909216929092141790555050505050565b3660011981013560f01c90036054013560e01c90565b600080600054600160801b900460ff166002811115613027576130276155f7565b146130455760405163067fe19560e41b815260040160405180910390fd5b60006002838154811061305a5761305a6158f9565b600091825260208220600590910201805490925063ffffffff908116146130c057815460028054909163ffffffff16908110613098576130986158f9565b906000526020600020906005020160040160109054906101000a90046001600160801b031690505b60048201546000906130eb90600160801b900467ffffffffffffffff165b67ffffffffffffffff1690565b6130ff9067ffffffffffffffff1642615957565b6131156130de846001600160801b031660401c90565b67ffffffffffffffff166131299190615925565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff1611613176578061162d565b7f0000000000000000000000000000000000000000000000000000000000049d4095945050505050565b60008061321d836001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f000000000000000000000000000000000000000000000000000000000000004981111561327c576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a30060006132978383615ac5565b9050670de0b6b3a764000060006132ce827f0000000000000000000000000000000000000000000000000000000000000049615a6a565b905060006132ec6132e7670de0b6b3a764000086615a6a565b6142b1565b905060006132fa8484614503565b905060006133088383614552565b9050600061331582614580565b905060006133348261332f670de0b6b3a76400008f615a6a565b614768565b905060006133428b83614552565b905061334e818d615a6a565b9f9e505050505050505050505050505050565b6002818154811061337157600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff841695506401000000009093046001600160a01b03908116949216926001600160801b03918216929180821691600160801b90041687565b60006002600d5460ff1660028111156133f0576133f06155f7565b0361341157506001600160a01b03166000908152600b602052604090205490565b506001600160a01b031660009081526003602052604090205490565b60008054600160801b900460ff16600281111561344c5761344c6155f7565b1461346a5760405163067fe19560e41b815260040160405180910390fd5b60006002878154811061347f5761347f6158f9565b6000918252602082206005919091020160048101549092506001600160801b0316908715821760011b90506134d57f00000000000000000000000000000000000000000000000000000000000000496001615925565b61354f826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613589576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915613654576135dc7f000000000000000000000000000000000000000000000000000000000000001e7f0000000000000000000000000000000000000000000000000000000000000049615957565b6001901b6135f2846001600160801b0316614799565b6001600160801b03166136059190615ad9565b156136395761363061362160016001600160801b038716615aed565b865463ffffffff16600061481f565b6003015461364a565b3660011981013560f01c9003607801355b9150849050613675565b600385015491506136726136216001600160801b0386166001615b0d565b90505b600882901b60088a8a60405161368c9291906158e9565b6040518091039020901b146136cd576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006136d88c6148e8565b905060006136e7836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081523660011981013560f01c90036098013560601c9063e14ced329061373d908f908f908f908f908a90600401615b78565b6020604051808303816000875af115801561375c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613780919061598b565b600485015491149150600090600290613809906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613883896001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61388d9190615bb2565b6138979190615bd5565b60ff1615905081151581036138d8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875464010000000090046001600160a01b031615613922576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054600160801b900460ff166002811115613980576139806155f7565b1461399e5760405163067fe19560e41b815260040160405180910390fd5b6000806000806139ad86614917565b935093509350935060006139c385858585614c70565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3b919061596e565b905060018903613b08576001600160a01b0381166352f0f3ad8a84613a6c3660011981013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015613ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b02919061598b565b506113d1565b60028903613b27576001600160a01b0381166352f0f3ad8a8489613a6c565b60038903613b46576001600160a01b0381166352f0f3ad8a8487613a6c565b60048903613c7b576000613b836001600160801b0385167f000000000000000000000000000000000000000000000000000000000000001e614d0f565b600954613b909190615925565b613b9b906001615925565b90503660011981013560f01c9003605801358110613bc8573660011981013560f01c900360580135613bca565b805b90506001600160a01b0382166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015613c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c74919061598b565b50506113d1565b60058903613cf6576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390523660011981013560f01c900360d4013560c01b604482015260086064820152608481018890526001600160a01b038216906352f0f3ad9060a401613abf565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003605481013560e01c90601401356060613d4b611697565b9050909192565b60008160000151826020015183604001518460600151604051602001613d91949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003613dfd576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000613e2b85614da4565b919450925090506001816001811115613e4657613e466155f7565b14613e7d576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451613e898385615925565b14613ec0576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613ed75790505093506000835b8651811015613fc557600080613f4a6040518060400160405280858c60000151613f2e9190615957565b8152602001858c60200151613f439190615925565b9052614da4565b509150915060405180604001604052808383613f669190615925565b8152602001848b60200151613f7b9190615925565b815250888581518110613f9057613f906158f9565b6020908102919091010152613fa6600185615925565b9350613fb28183615925565b613fbc9084615925565b92505050613f04565b50845250919392505050565b60606000806000613fe185614da4565b919450925090506000816001811115613ffc57613ffc6155f7565b14614033576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61403d8284615925565b855114614076576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162d85602001518484615242565b60028101546001600160a01b038316600090815260036020526040812080546001600160801b03909316929091906140be908490615925565b90915550505050565b6040518181523660011981013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60006141116001600160801b0384166001615b0d565b905060006141218286600161481f565b9050600086901a83806141eb575061415a60027f000000000000000000000000000000000000000000000000000000000000001e615ad9565b60048301546002906141dc906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6141e69190615bd5565b60ff16145b156142435760ff811660011480614205575060ff81166002145b61423e576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128f1565b614281565b60ff811615614281576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128f1565b50505050505050565b60006115e560f46006615925565b6000818310156142a857816142aa565b825b9392505050565b6001600160801b03811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b176000821361430757631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261454057637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156145705763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136145ae57919050565b680755bf798b4a1bf1e582126145cc5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006142aa670de0b6b3a764000083614780866142b1565b61478a9190615bf7565b6147949190615cb3565b614580565b60008061480d837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261485f5761485a6001600160801b0386167f000000000000000000000000000000000000000000000000000000000000001e6152d6565b614871565b614871856001600160801b0316615415565b905060028481548110614886576148866158f9565b906000526020600020906005020191505b60048201546001600160801b038281169116146148e057815460028054909163ffffffff169081106148cb576148cb6158f9565b90600052602060002090600502019150614897565b509392505050565b60008060008060006148f986614917565b935093509350935061490d84848484614c70565b9695505050505050565b6000806000806000859050600060028281548110614937576149376158f9565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000001e906149ec906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614a26576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000001e90614acb906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169250821115614b4057825463ffffffff16614b0a7f000000000000000000000000000000000000000000000000000000000000001e6001615925565b8303614b14578391505b60028181548110614b2757614b276158f9565b9060005260206000209060050201935080945050614a2a565b600481810154908401546001600160801b0391821691166000816001600160801b0316614b85614b79856001600160801b031660011c90565b6001600160801b031690565b6001600160801b03161490508015614c1e576000614bab836001600160801b0316614799565b6001600160801b03161115614bfb576000614bdb614bd360016001600160801b038616615aed565b89600161481f565b6003810154600490910154909c506001600160801b03169a50614c019050565b6008549a505b600386015460048701549099506001600160801b03169750614c62565b6000614c37614bd36001600160801b0385166001615b0d565b6003808901546004808b015492840154930154909e506001600160801b039182169d50919b50169850505b505050505050509193509193565b60006001600160801b03841615614ccb5760408051602081018790526001600160801b038087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012061162d565b8282604051602001614cf09291909182526001600160801b0316602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614d83847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614de7576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614e0c57600060016000945094509450505061523b565b60b78111614f22576000614e21608083615957565b905080876000015111614e60576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614ed857507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614f0f576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061523b915050565b60bf8111615080576000614f3760b783615957565b905080876000015111614f76576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614fd8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111615020576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61502a8184615925565b895111615063576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61506e836001615925565b975095506000945061523b9350505050565b60f781116150e557600061509560c083615957565b9050808760000151116150d4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061523b915050565b60006150f260f783615957565b905080876000015111615131576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003615193576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116151db576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6151e58184615925565b89511161521e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615229836001615925565b975095506001945061523b9350505050565b9193909250565b60608167ffffffffffffffff81111561525d5761525d61585f565b6040519080825280601f01601f191660200182016040528015615287576020820181803683370190505b50905081156142aa57600061529c8486615925565b90506020820160005b848110156152bd5782810151828201526020016152a5565b848111156152cc576000858301525b5050509392505050565b600081615353846001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116153695763b34b5c226000526004601cfd5b61537283615415565b9050816153ef826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611611691576142aa615405836001615925565b6001600160801b038316906154a1565b60008119600183011681615490827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615515847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261554357600080fd5b50813567ffffffffffffffff81111561555b57600080fd5b60208301915083602082850101111561557357600080fd5b9250929050565b600080600083850360a081121561559057600080fd5b608081121561559e57600080fd5b50839250608084013567ffffffffffffffff8111156155bc57600080fd5b6155c886828701615531565b9497909650939450505050565b600080604083850312156155e857600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061562b57634e487b7160e01b600052602160045260246000fd5b50565b6020810161563b8361560d565b91905290565b6001600160a01b038116811461562b57600080fd5b60006020828403121561566857600080fd5b81356142aa81615641565b60008060006060848603121561568857600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156c5576020818501810151868301820152016156a9565b818111156156d7576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006142aa602083018461569f565b60006020828403121561572f57600080fd5b5035919050565b801515811461562b57600080fd5b6000806000806080858703121561575a57600080fd5b843593506020850135925060408501359150606085013561577a81615736565b939692955090935050565b60006020828403121561579757600080fd5b81356001600160801b03811681146142aa57600080fd5b600080600080600080608087890312156157c757600080fd5b8635955060208701356157d981615736565b9450604087013567ffffffffffffffff808211156157f657600080fd5b6158028a838b01615531565b9096509450606089013591508082111561581b57600080fd5b5061582889828a01615531565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061162d606083018461569f565b634e487b7160e01b600052604160045260246000fd5b60006080828403121561588757600080fd5b6040516080810181811067ffffffffffffffff821117156158b857634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156159385761593861590f565b500190565b600060001982036159505761595061590f565b5060010190565b6000828210156159695761596961590f565b500390565b60006020828403121561598057600080fd5b81516142aa81615641565b60006020828403121561599d57600080fd5b5051919050565b600067ffffffffffffffff8083168185168083038211156159c7576159c761590f565b01949350505050565b600067ffffffffffffffff808316818516818304811182151516156159f7576159f761590f565b02949350505050565b600067ffffffffffffffff83811690831681811015615a2157615a2161590f565b039392505050565b600060208284031215615a3b57600080fd5b81516142aa81615736565b60008060408385031215615a5957600080fd5b505080516020909101519092909150565b6000816000190483118215151615615a8457615a8461590f565b500290565b600060208284031215615a9b57600080fd5b815163ffffffff811681146142aa57600080fd5b634e487b7160e01b600052601260045260246000fd5b600082615ad457615ad4615aaf565b500490565b600082615ae857615ae8615aaf565b500690565b60006001600160801b0383811690831681811015615a2157615a2161590f565b60006001600160801b038083168185168083038211156159c7576159c761590f565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615b8c606083018789615b2f565b8281036020840152615b9f818688615b2f565b9150508260408301529695505050505050565b600060ff821660ff841680821015615bcc57615bcc61590f565b90039392505050565b600060ff831680615be857615be8615aaf565b8060ff84160691505092915050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615c3857615c3861590f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c7357615c7361590f565b60008712925087820587128484161615615c8f57615c8f61590f565b87850587128184161615615ca557615ca561590f565b505050929093029392505050565b600082615cc257615cc2615aaf565b60001983147f800000000000000000000000000000000000000000000000000000000000000083141615615cf857615cf861590f565b50059056fea164736f6c634300080f000a"; + bytes internal constant permissionedDisputeGameCode = + hex"6080604052600436106103605760003560e01c80636f034409116101c6578063c0d8bb74116100f7578063dabd396d11610095578063f8f43ff61161006f578063f8f43ff614610b3e578063fa24f74314610b5e578063fa315aa914610b82578063fe2bbeb214610bb557600080fd5b8063dabd396d14610aa8578063ec5e630814610adb578063eff0f59214610b0e57600080fd5b8063cf09e0d0116100d1578063cf09e0d014610a25578063d5d44d8014610a46578063d6ae3cd514610a66578063d8cc1a3c14610a8857600080fd5b8063c0d8bb7414610964578063c395e1ca14610991578063c6f0308c146109b157600080fd5b80638d450a9511610164578063a8e4fb901161013e578063a8e4fb90146108d0578063bbdc02db146108f5578063bcef3b5514610922578063bd8da9561461094457600080fd5b80638d450a951461080e57806399735e32146107ec578063a445ece61461083057600080fd5b80637b0f0adc116101a05780637b0f0adc146107bc5780638129fc1c146107cf5780638980e0cc146107d75780638b85902b146107ec57600080fd5b80636f0344091461077f57806370872aa514610792578063786b844b146107a757600080fd5b80633e3ac912116102a05780635a5fa2d91161023e578063609d333411610218578063609d3334146106f557806360e274641461070a5780636361506d1461072a5780636b6716c01461074c57600080fd5b80635a5fa2d9146106905780635c0cba33146106b05780635e234947146106d557600080fd5b8063529d6a8c1161027a578063529d6a8c146105cf578063534db0e2146105fc57806354fd4d501461061157806357da950e1461066057600080fd5b80633e3ac912146105675780633fc8cef314610597578063472777c6146105bc57600080fd5b806325fc2ace1161030d57806330dbe570116102e757806330dbe570146104ce578063378dd48c1461050657806337b1b229146105205780633a7684631461054257600080fd5b806325fc2ace1461047a5780632810e1d6146104995780632ad69aeb146104ae57600080fd5b8063200d2ed21161033e578063200d2ed2146103f2578063222abf4514610420578063250e69bd1461046057600080fd5b8063019351301461036557806303c2924d1461038757806319effeb4146103a7575b600080fd5b34801561037157600080fd5b5061038561038036600461575a565b610be5565b005b34801561039357600080fd5b506103856103a23660046157b5565b610ea4565b3480156103b357600080fd5b506000546103d49068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103fe57600080fd5b5060005461041390600160801b900460ff1681565b6040516103e9919061580e565b34801561042c57600080fd5b5061045061043b366004615836565b600c6020526000908152604090205460ff1681565b60405190151581526020016103e9565b34801561046c57600080fd5b50600a546104509060ff1681565b34801561048657600080fd5b506008545b6040519081526020016103e9565b3480156104a557600080fd5b5061041361142c565b3480156104ba57600080fd5b5061048b6104c93660046157b5565b611604565b3480156104da57600080fd5b506001546104ee906001600160a01b031681565b6040516001600160a01b0390911681526020016103e9565b34801561051257600080fd5b50600d546104139060ff1681565b34801561052c57600080fd5b503660011981013560f01c90033560601c6104ee565b34801561054e57600080fd5b503660011981013560f01c90036098013560601c6104ee565b34801561057357600080fd5b50600054610450907201000000000000000000000000000000000000900460ff1681565b3480156105a357600080fd5b503660011981013560f01c900360c0013560601c6104ee565b6103856105ca366004615853565b61163a565b3480156105db57600080fd5b5061048b6105ea366004615836565b60036020526000908152604090205481565b34801561060857600080fd5b506104ee61164c565b34801561061d57600080fd5b5060408051808201909152600581527f322e342e3000000000000000000000000000000000000000000000000000000060208201525b6040516103e991906158ea565b34801561066c57600080fd5b5060085460095461067b919082565b604080519283526020830191909152016103e9565b34801561069c57600080fd5b5061048b6106ab3660046158fd565b611671565b3480156106bc57600080fd5b503660011981013560f01c900360ac013560601c6104ee565b3480156106e157600080fd5b5061048b6106f03660046158fd565b6116ab565b34801561070157600080fd5b5061065361170c565b34801561071657600080fd5b50610385610725366004615836565b61171a565b34801561073657600080fd5b503660011981013560f01c90036034013561048b565b34801561075857600080fd5b507f0000000000000000000000000000000000000000000000000000000000002a306103d4565b61038561078d366004615924565b611a2b565b34801561079e57600080fd5b5060095461048b565b3480156107b357600080fd5b50610385611aab565b6103856107ca366004615853565b611e99565b610385611ea6565b3480156107e357600080fd5b5060025461048b565b3480156107f857600080fd5b503660011981013560f01c90036058013561048b565b34801561081a57600080fd5b503660011981013560f01c90036078013561048b565b34801561083c57600080fd5b5061089261084b3660046158fd565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046001600160801b0316906001600160a01b031684565b60408051941515855263ffffffff90931660208501526001600160801b03909116918301919091526001600160a01b031660608201526080016103e9565b3480156108dc57600080fd5b503660011981013560f01c900360f4013560601c6104ee565b34801561090157600080fd5b506040513660011981013560f01c90036054013560e01c81526020016103e9565b34801561092e57600080fd5b503660011981013560f01c90036014013561048b565b34801561095057600080fd5b506103d461095f3660046158fd565b611f11565b34801561097057600080fd5b5061048b61097f366004615836565b600b6020526000908152604090205481565b34801561099d57600080fd5b5061048b6109ac366004615965565b6120ab565b3480156109bd57600080fd5b506109d16109cc3660046158fd565b61226c565b6040805163ffffffff90981688526001600160a01b03968716602089015295909416948601949094526001600160801b039182166060860152608085015291821660a08401521660c082015260e0016103e9565b348015610a3157600080fd5b506000546103d49067ffffffffffffffff1681565b348015610a5257600080fd5b5061048b610a61366004615836565b6122e0565b348015610a7257600080fd5b503660011981013560f01c900360d4013561048b565b348015610a9457600080fd5b50610385610aa336600461598e565b612338565b348015610ab457600080fd5b507f0000000000000000000000000000000000000000000000000000000000049d406103d4565b348015610ae757600080fd5b507f000000000000000000000000000000000000000000000000000000000000001e61048b565b348015610b1a57600080fd5b50610450610b293660046158fd565b60046020526000908152604090205460ff1681565b348015610b4a57600080fd5b50610385610b59366004615853565b6123b4565b348015610b6a57600080fd5b50610b7361277b565b6040516103e993929190615a1a565b348015610b8e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000004961048b565b348015610bc157600080fd5b50610450610bd03660046158fd565b60066020526000908152604090205460ff1681565b60008054600160801b900460ff166002811115610c0457610c046157d7565b14610c225760405163067fe19560e41b815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c75576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8e3660011981013560f01c90036014013590565b90565b610ca5610ca036869003860186615a55565b6127a5565b14610cdc576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cf1929190615ac9565b604051809103902014610d30576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d79610d7484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280192505050565b61286e565b90506000610da082600881518110610d9357610d93615ad9565b6020026020010151612a24565b9050602081511115610dde576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c3660011981013560f01c9003605801358103610e35576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054600160801b900460ff166002811115610ec357610ec36157d7565b14610ee15760405163067fe19560e41b815260040160405180910390fd5b600060028381548110610ef657610ef6615ad9565b906000526020600020906005020190506000610f1184611f11565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d4081169082161015610f7a576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615610fc3576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560205260409020805480158015610fe057508515155b1561104357835464010000000090046001600160a01b0316600081156110065781611015565b60018601546001600160a01b03165b90506110218187612ad8565b505050600094855250506006602052505060409020805460ff19166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046001600160801b031693810193909352600101546001600160a01b031660608301526110c7576001600160801b0360408201526001815260008690036110c7578195505b600086826020015163ffffffff166110df9190615b05565b905060008382116110f057816110f2565b835b602084015190915063ffffffff165b8181101561121257600086828154811061111d5761111d615ad9565b6000918252602080832090910154808352600690915260409091205490915060ff16611175576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061118a5761118a615ad9565b60009182526020909120600590910201805490915064010000000090046001600160a01b03161580156111d15750600481015460408701516001600160801b039182169116115b156111fd5760018101546001600160a01b0316606087015260048101546001600160801b031660408701525b5050808061120a90615b1d565b915050611101565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006001600160801b03909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039093169290921790915584900361142157606083015160008a8152600660205260409020805460ff191660011790558915801561135e57506000547201000000000000000000000000000000000000900460ff165b156113b9576001546001600160a01b0316611379818a612ad8565b88546001600160a01b03909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff90911617885561141f565b6113e66001600160a01b038216156113d157816113e0565b60018901546001600160a01b03165b89612ad8565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038316021788555b505b505050505050505050565b600080600054600160801b900460ff16600281111561144d5761144d6157d7565b1461146b5760405163067fe19560e41b815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166114cf576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b031660026000815481106114ee576114ee615ad9565b600091825260209091206005909102015464010000000090046001600160a01b03161461151c57600161151f565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617600160801b8360028111156115c3576115c36157d7565b0217905560028111156115d8576115d86157d7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b6005602052816000526040600020818154811061162057600080fd5b90600052602060002001600091509150505481565b905090565b6116478383836001611a2b565b505050565b600061163561165d60f46014615b05565b3660011981013560f01c9003013560601c90565b600081815260076020908152604080832060059092528220805482546116a290610100900463ffffffff1682615b37565b95945050505050565b60003660011981013560f01c900360d4013582146116f5576040517f0da789df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003601401355b92915050565b606061163560586020612b1a565b611722611aab565b60006002600d5460ff16600281111561173d5761173d6157d7565b0361176157506001600160a01b0381166000908152600b60205260409020546117d0565b6001600d5460ff16600281111561177a5761177a6157d7565b0361179e57506001600160a01b0381166000908152600360205260409020546117d0565b6040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600c602052604090205460ff166118ae576001600160a01b0382166000908152600c60205260409020805460ff1916600117905561182d60c0600119369081013560f01c9003013560601c90565b6040517f7eee288d0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529190911690637eee288d90604401600060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050505050565b806000036118e8576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600b6020908152604080832083905560039091528120553660011981013560f01c900360c0013560601c6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063f3fef3a390604401600060405180830381600087803b15801561198657600080fd5b505af115801561199a573d6000803e3d6000fd5b505050506000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119eb576040519150601f19603f3d011682016040523d82523d6000602084013e6119f0565b606091505b5050905080611647576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360f4013560601c331480611a635750611a4e61164c565b6001600160a01b0316336001600160a01b0316145b611a99576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa584848484612b4e565b50505050565b6002600d5460ff166002811115611ac457611ac46157d7565b1480611ae657506001600d5460ff166002811115611ae457611ae46157d7565b145b15611aed57565b6000600d5460ff166002811115611b0657611b066157d7565b14611b3d576040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb19190615b4e565b15611be8576040517f379a7ed900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005468010000000000000000900467ffffffffffffffff1667ffffffffffffffff16600003611c44576040517fc105260a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003660011981013560f01c900360ac013560601c6040517f0314d2b30000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039190911690630314d2b390602401602060405180830381865afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615b4e565b905080611d15576040517f4851bd9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6040517f17cf21a90000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0391909116906317cf21a990602401600060405180830381600087803b158015611d8457600080fd5b505af1925050508015611d95575060015b5060003660011981013560f01c900360ac013560601c6040517f496b9c160000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063496b9c1690602401602060405180830381865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615b4e565b90508015611e4857600d805460ff19166001179055611e56565b600d805460ff191660021790555b600d546040517f9908eaac0645df9d0704d06adc9e07337c951de2f06b5f2836151d48d5e4722f91611e8d9160ff9091169061580e565b60405180910390a15050565b6116478383836000611a2b565b611eae6134d1565b3660011981013560f01c900360f4013560601c3214611ef9576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3660011981013560f01c90036054013560e01c90565b600080600054600160801b900460ff166002811115611f3257611f326157d7565b14611f505760405163067fe19560e41b815260040160405180910390fd5b600060028381548110611f6557611f65615ad9565b600091825260208220600590910201805490925063ffffffff90811614611fcb57815460028054909163ffffffff16908110611fa357611fa3615ad9565b906000526020600020906005020160040160109054906101000a90046001600160801b031690505b6004820154600090611ff690600160801b900467ffffffffffffffff165b67ffffffffffffffff1690565b61200a9067ffffffffffffffff1642615b37565b612020611fe9846001600160801b031660401c90565b67ffffffffffffffff166120349190615b05565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff161161208157806116a2565b7f0000000000000000000000000000000000000000000000000000000000049d4095945050505050565b600080612128836001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000049811115612187576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a30060006121a28383615b81565b9050670de0b6b3a764000060006121d9827f0000000000000000000000000000000000000000000000000000000000000049615b95565b905060006121f76121f2670de0b6b3a764000086615b95565b613d8d565b905060006122058484613fdf565b90506000612213838361402e565b905060006122208261405c565b9050600061223f8261223a670de0b6b3a76400008f615b95565b614244565b9050600061224d8b8361402e565b9050612259818d615b95565b9f9e505050505050505050505050505050565b6002818154811061227c57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff841695506401000000009093046001600160a01b03908116949216926001600160801b03918216929180821691600160801b90041687565b60006002600d5460ff1660028111156122fb576122fb6157d7565b0361231c57506001600160a01b03166000908152600b602052604090205490565b506001600160a01b031660009081526003602052604090205490565b3660011981013560f01c900360f4013560601c331480612370575061235b61164c565b6001600160a01b0316336001600160a01b0316145b6123a6576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118a686868686868661427c565b60008054600160801b900460ff1660028111156123d3576123d36157d7565b146123f15760405163067fe19560e41b815260040160405180910390fd5b600080600080612400866147b0565b9350935093509350600061241685858585614b09565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561246a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248e9190615bb4565b90506001890361255b576001600160a01b0381166352f0f3ad8a846124bf3660011981013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190615bd1565b50611421565b6002890361257a576001600160a01b0381166352f0f3ad8a84896124bf565b60038903612599576001600160a01b0381166352f0f3ad8a84876124bf565b600489036126ce5760006125d66001600160801b0385167f000000000000000000000000000000000000000000000000000000000000001e614ba8565b6009546125e39190615b05565b6125ee906001615b05565b90503660011981013560f01c900360580135811061261b573660011981013560f01c90036058013561261d565b805b90506001600160a01b0382166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af11580156126a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c79190615bd1565b5050611421565b60058903612749576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390523660011981013560f01c900360d4013560c01b604482015260086064820152608481018890526001600160a01b038216906352f0f3ad9060a401612512565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003605481013560e01c9060140135606061279e61170c565b9050909192565b600081600001518260200151836040015184606001516040516020016127e4949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612850576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061287e85614c3d565b919450925090506001816001811115612899576128996157d7565b146128d0576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516128dc8385615b05565b14612913576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161292a5790505093506000835b8651811015612a185760008061299d6040518060400160405280858c600001516129819190615b37565b8152602001858c602001516129969190615b05565b9052614c3d565b5091509150604051806040016040528083836129b99190615b05565b8152602001848b602001516129ce9190615b05565b8152508885815181106129e3576129e3615ad9565b60209081029190910101526129f9600185615b05565b9350612a058183615b05565b612a0f9084615b05565b92505050612957565b50845250919392505050565b60606000806000612a3485614c3d565b919450925090506000816001811115612a4f57612a4f6157d7565b14612a86576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a908284615b05565b855114612ac9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116a2856020015184846150db565b60028101546001600160a01b038316600090815260036020526040812080546001600160801b0390931692909190612b11908490615b05565b90915550505050565b6040518181523660011981013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054600160801b900460ff166002811115612b6d57612b6d6157d7565b14612b8b5760405163067fe19560e41b815260040160405180910390fd5b600060028481548110612ba057612ba0615ad9565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff811684526001600160a01b0364010000000090910481169484019490945260018101549093169082015260028201546001600160801b03908116606083015260038301546080830181905260049093015480821660a0840152600160801b90041660c082015291508514612c64576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156001600160801b0383161760011b90506000612cf9826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612d345750612d317f000000000000000000000000000000000000000000000000000000000000001e6002615b05565b81145b8015612d3e575084155b15612d75576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d9b575086155b15612dd2576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000049811115612e2c576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e577f000000000000000000000000000000000000000000000000000000000000001e6001615b05565b8103612e6957612e698688858861516f565b34612e73836120ab565b14612eaa576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612eb588611f11565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d40811690821603612f1d576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612f4a60017f0000000000000000000000000000000000000000000000000000000000000049615b37565b8303613060573660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc49190615bb4565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130259190615bd1565b613059907f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff16615bea565b90506130f3565b61308b60017f000000000000000000000000000000000000000000000000000000000000001e615b37565b83036130c6576130597f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166002615c16565b507f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff165b613127817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615c46565b67ffffffffffffffff166131428367ffffffffffffffff1690565b67ffffffffffffffff16111561318957613186817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615c46565b91505b6000604083901b421760008a8152608087901b6001600160801b038d1617602052604081209192509060008181526004602052604090205490915060ff16156131fe576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff16815260200160006001600160a01b03168152602001336001600160a01b03168152602001346001600160801b031681526020018c8152602001886001600160801b03168152602001846001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160006101000a8154816001600160801b0302191690836001600160801b031602179055506080820151816003015560a08201518160040160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160040160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600560008c815260200190815260200160002060016002805490506133f59190615b37565b81546001810183556000928352602080842090910191909155338252600b9052604081208054349290613429908490615b05565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561347b57600080fd5b505af115801561348f573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b60005471010000000000000000000000000000000000900460ff1615613523576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61352b6152fe565b3614613563576040517f9824bdab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000803660011981013560f01c900360ac013560601c6001600160a01b031663d83ef2676040518163ffffffff1660e01b81526004016040805180830381865afa1580156135b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d99190615c6f565b909250905081613615576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915282815260200181905260088290556009819055803660011981013560f01c90036058013511613697573660011981013560f01c9003601401355b6040517ff40239db00000000000000000000000000000000000000000000000000000000815260040161368e91815260200190565b60405180910390fd5b67ffffffffffffffff3660011981013560f01c90036058013511156136cb573660011981013560f01c900360140135613659565b67ffffffffffffffff3660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613724573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137489190615bb4565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a99190615bd1565b11156137e1576040517fb4e1243300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138187f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166002615b95565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561386c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138909190615bb4565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f19190615bd1565b67ffffffffffffffff1661392c7f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff1690565b67ffffffffffffffff166139409190615b05565b9050600061394e8383615313565b905067ffffffffffffffff811115613992576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff161115613a0a576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e08101825263ffffffff808252600060208084018281523660011981013560f01c90038035606090811c8789018181526001600160801b0334818116948b0194855260149095013560808b01908152600160a08c0181815242841660c08e019081526002805493840181558c529c517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590930292830180549a5191909d167fffffffffffffffff000000000000000000000000000000000000000000000000909a16999099176401000000006001600160a01b039a8b160217909b5592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf840180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919098161790965592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0820180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001691851691909117905593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015595519651968116600160801b9790911696909602959095177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909101558154710100000000000000000000000000000000007fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff909116178255918152600b909152918220805491929091613c4b908490615b05565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613c9d57600080fd5b505af1158015613cb1573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff1617905550613cf49150611efb9050565b63ffffffff163660011981013560f01c900360ac013560601c6001600160a01b0316633c9f397c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190615c93565b600a805460ff191663ffffffff92909216929092141790555050505050565b6001600160801b03811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613de357631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261401c57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b60008160001904831182021561404c5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d7821361408a57919050565b680755bf798b4a1bf1e582126140a85763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000614275670de0b6b3a76400008361425c86613d8d565b6142669190615cb9565b6142709190615d75565b61405c565b9392505050565b60008054600160801b900460ff16600281111561429b5761429b6157d7565b146142b95760405163067fe19560e41b815260040160405180910390fd5b6000600287815481106142ce576142ce615ad9565b6000918252602082206005919091020160048101549092506001600160801b0316908715821760011b90506143247f00000000000000000000000000000000000000000000000000000000000000496001615b05565b61439e826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16146143d8576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156144a35761442b7f000000000000000000000000000000000000000000000000000000000000001e7f0000000000000000000000000000000000000000000000000000000000000049615b37565b6001901b614441846001600160801b031661532a565b6001600160801b03166144549190615dbf565b156144885761447f61447060016001600160801b038716615dd3565b865463ffffffff1660006153b0565b60030154614499565b3660011981013560f01c9003607801355b91508490506144c4565b600385015491506144c16144706001600160801b0386166001615df3565b90505b600882901b60088a8a6040516144db929190615ac9565b6040518091039020901b1461451c576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006145278c615479565b90506000614536836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081523660011981013560f01c90036098013560601c9063e14ced329061458c908f908f908f908f908a90600401615e5e565b6020604051808303816000875af11580156145ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cf9190615bd1565b600485015491149150600090600290614658906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6146d2896001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6146dc9190615e98565b6146e69190615ebb565b60ff161590508115158103614727576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875464010000000090046001600160a01b031615614771576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008060008060008590506000600282815481106147d0576147d0615ad9565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000001e90614885906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116148bf576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000001e90614964906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156149d957825463ffffffff166149a37f000000000000000000000000000000000000000000000000000000000000001e6001615b05565b83036149ad578391505b600281815481106149c0576149c0615ad9565b90600052602060002090600502019350809450506148c3565b600481810154908401546001600160801b0391821691166000816001600160801b0316614a1e614a12856001600160801b031660011c90565b6001600160801b031690565b6001600160801b03161490508015614ab7576000614a44836001600160801b031661532a565b6001600160801b03161115614a94576000614a74614a6c60016001600160801b038616615dd3565b8960016153b0565b6003810154600490910154909c506001600160801b03169a50614a9a9050565b6008549a505b600386015460048701549099506001600160801b03169750614afb565b6000614ad0614a6c6001600160801b0385166001615df3565b6003808901546004808b015492840154930154909e506001600160801b039182169d50919b50169850505b505050505050509193509193565b60006001600160801b03841615614b645760408051602081018790526001600160801b038087169282019290925260608101859052908316608082015260a001604051602081830303815290604052805190602001206116a2565b8282604051602001614b899291909182526001600160801b0316602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614c1c847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614c80576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614ca55760006001600094509450945050506150d4565b60b78111614dbb576000614cba608083615b37565b905080876000015111614cf9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614d7157507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614da8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600195509350600092506150d4915050565b60bf8111614f19576000614dd060b783615b37565b905080876000015111614e0f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614e71576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614eb9576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614ec38184615b05565b895111614efc576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f07836001615b05565b97509550600094506150d49350505050565b60f78111614f7e576000614f2e60c083615b37565b905080876000015111614f6d576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001955093508492506150d4915050565b6000614f8b60f783615b37565b905080876000015111614fca576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361502c576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111615074576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61507e8184615b05565b8951116150b7576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6150c2836001615b05565b97509550600194506150d49350505050565b9193909250565b60608167ffffffffffffffff8111156150f6576150f6615a3f565b6040519080825280601f01601f191660200182016040528015615120576020820181803683370190505b50905081156142755760006151358486615b05565b90506020820160005b8481101561515657828101518282015260200161513e565b84811115615165576000858301525b5050509392505050565b60006151856001600160801b0384166001615df3565b90506000615195828660016153b0565b9050600086901a838061525f57506151ce60027f000000000000000000000000000000000000000000000000000000000000001e615dbf565b6004830154600290615250906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61525a9190615ebb565b60ff16145b156152b75760ff811660011480615279575060ff81166002145b6152b2576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161368e565b6152f5565b60ff8116156152f5576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161368e565b50505050505050565b60006153086154a8565b611635906006615b05565b6000818310156153235781614275565b5090919050565b60008061539e837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826153f0576153eb6001600160801b0386167f000000000000000000000000000000000000000000000000000000000000001e6154b6565b615402565b615402856001600160801b03166155f5565b90506002848154811061541757615417615ad9565b906000526020600020906005020191505b60048201546001600160801b0382811691161461547157815460028054909163ffffffff1690811061545c5761545c615ad9565b90600052602060002090600502019150615428565b509392505050565b600080600080600061548a866147b0565b935093509350935061549e84848484614b09565b9695505050505050565b600061163560f46028615b05565b600081615533846001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116155495763b34b5c226000526004601cfd5b615552836155f5565b9050816155cf826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611611706576142756155e5836001615b05565b6001600160801b03831690615681565b60008119600183011681615670827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806156f5847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261572357600080fd5b50813567ffffffffffffffff81111561573b57600080fd5b60208301915083602082850101111561575357600080fd5b9250929050565b600080600083850360a081121561577057600080fd5b608081121561577e57600080fd5b50839250608084013567ffffffffffffffff81111561579c57600080fd5b6157a886828701615711565b9497909650939450505050565b600080604083850312156157c857600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061580b57634e487b7160e01b600052602160045260246000fd5b50565b6020810161581b836157ed565b91905290565b6001600160a01b038116811461580b57600080fd5b60006020828403121561584857600080fd5b813561427581615821565b60008060006060848603121561586857600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156158a557602081850181015186830182015201615889565b818111156158b7576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000614275602083018461587f565b60006020828403121561590f57600080fd5b5035919050565b801515811461580b57600080fd5b6000806000806080858703121561593a57600080fd5b843593506020850135925060408501359150606085013561595a81615916565b939692955090935050565b60006020828403121561597757600080fd5b81356001600160801b038116811461427557600080fd5b600080600080600080608087890312156159a757600080fd5b8635955060208701356159b981615916565b9450604087013567ffffffffffffffff808211156159d657600080fd5b6159e28a838b01615711565b909650945060608901359150808211156159fb57600080fd5b50615a0889828a01615711565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006116a2606083018461587f565b634e487b7160e01b600052604160045260246000fd5b600060808284031215615a6757600080fd5b6040516080810181811067ffffffffffffffff82111715615a9857634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115615b1857615b18615aef565b500190565b60006000198203615b3057615b30615aef565b5060010190565b600082821015615b4957615b49615aef565b500390565b600060208284031215615b6057600080fd5b815161427581615916565b634e487b7160e01b600052601260045260246000fd5b600082615b9057615b90615b6b565b500490565b6000816000190483118215151615615baf57615baf615aef565b500290565b600060208284031215615bc657600080fd5b815161427581615821565b600060208284031215615be357600080fd5b5051919050565b600067ffffffffffffffff808316818516808303821115615c0d57615c0d615aef565b01949350505050565b600067ffffffffffffffff80831681851681830481118215151615615c3d57615c3d615aef565b02949350505050565b600067ffffffffffffffff83811690831681811015615c6757615c67615aef565b039392505050565b60008060408385031215615c8257600080fd5b505080516020909101519092909150565b600060208284031215615ca557600080fd5b815163ffffffff8116811461427557600080fd5b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615cfa57615cfa615aef565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615d3557615d35615aef565b60008712925087820587128484161615615d5157615d51615aef565b87850587128184161615615d6757615d67615aef565b505050929093029392505050565b600082615d8457615d84615b6b565b60001983147f800000000000000000000000000000000000000000000000000000000000000083141615615dba57615dba615aef565b500590565b600082615dce57615dce615b6b565b500690565b60006001600160801b0383811690831681811015615c6757615c67615aef565b60006001600160801b03808316818516808303821115615c0d57615c0d615aef565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615e72606083018789615e15565b8281036020840152615e85818688615e15565b9150508260408301529695505050505050565b600060ff821660ff841680821015615eb257615eb2615aef565b90039392505050565b600060ff831680615ece57615ece615b6b565b8060ff8416069150509291505056fea164736f6c634300080f000a"; + bytes internal constant acc37Code = + hex"608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a6ed563e11610076578063bd02d0f51161005b578063bd02d0f51461018e578063ca446dd9146101b8578063e2a4853a1461011557600080fd5b8063a6ed563e1461018e578063abfdcced146101aa57600080fd5b80634e91db08116100a75780634e91db081461011557806354fd4d50146101275780637ae1cfca1461017057600080fd5b80630528afe2146100c357806321f8a721146100d8575b600080fd5b6100d66100d1366004610239565b6101c6565b005b6100eb6100e63660046102ae565b610229565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d66101233660046102c7565b9055565b6101636040518060400160405280600581526020017f312e322e3200000000000000000000000000000000000000000000000000000081525081565b60405161010c91906102e9565b61017e6100e63660046102ae565b604051901515815260200161010c565b61019c6100e63660046102ae565b60405190815260200161010c565b6100d661012336600461035c565b6100d6610123366004610391565b8060005b81811015610223576102118484838181106101e7576101e76103cf565b90506040020160000135858584818110610203576102036103cf565b905060400201602001359055565b8061021b816103fe565b9150506101ca565b50505050565b6000610233825490565b92915050565b6000806020838503121561024c57600080fd5b823567ffffffffffffffff8082111561026457600080fd5b818501915085601f83011261027857600080fd5b81358181111561028757600080fd5b8660208260061b850101111561029c57600080fd5b60209290920196919550909350505050565b6000602082840312156102c057600080fd5b5035919050565b600080604083850312156102da57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015610316578581018301518582016040015282016102fa565b81811115610328576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806040838503121561036f57600080fd5b823591506020830135801515811461038657600080fd5b809150509250929050565b600080604083850312156103a457600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811461038657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610456577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + bytes internal constant acc38Code = + hex"fe7100608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105ef8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a"; + bytes internal constant acc39Code = + hex"fe7100608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + bytes internal constant acc40Code = + hex"fe710060806040523480156200001157600080fd5b5060405162001a5f38038062001a5f8339810160408190526200003491620000a1565b6200003f3362000051565b6200004a8162000051565b50620000d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b457600080fd5b81516001600160a01b0381168114620000cc57600080fd5b9392505050565b61197c80620000e36000396000f3fe60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant acc41Code = + hex"fe7100608060405234801561001057600080fd5b50604051610a44380380610a4483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109a88061009c6000396000f3fe60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a"; + bytes internal constant acc42Code = + hex"fe7100608060405234801561001057600080fd5b506040516105f03803806105f083398101604081905261002f91610088565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b03871617905590829052902061006a8282610203565b5050506102c2565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561009b57600080fd5b82516001600160a01b03811681146100b257600080fd5b602084810151919350906001600160401b03808211156100d157600080fd5b818601915086601f8301126100e557600080fd5b8151818111156100f7576100f7610072565b604051601f8201601f19908116603f0116810190838211818310171561011f5761011f610072565b81604052828152898684870101111561013757600080fd5b600093505b82841015610159578484018601518185018701529285019261013c565b8284111561016a5760008684830101525b8096505050505050509250929050565b600181811c9082168061018e57607f821691505b6020821081036101ae57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fe57600081815260208120601f850160051c810160208610156101db5750805b601f850160051c820191505b818110156101fa578281556001016101e7565b5050505b505050565b81516001600160401b0381111561021c5761021c610072565b6102308161022a845461017a565b846101b4565b602080601f831160018114610265576000841561024d5750858301515b600019600386901b1c1916600185901b1785556101fa565b600085815260208120601f198616915b8281101561029457888601518255948401946001909101908401610275565b50858210156102b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61031f806102d16000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant acc43Code = + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c806378ecabce1161005057806378ecabce1461022a578063b51f9c2b1461024d578063debc60071461032d57600080fd5b80631d8a4e921461006c57806330e9012c146100a6575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61021d6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081019190915250604080516102408101825260055473ffffffffffffffffffffffffffffffffffffffff9081168252600654811660208301526007548116928201929092526008548216606082015260095482166080820152600a54821660a0820152600b54821660c0820152600c54821660e0820152600d548216610100820152600e548216610120820152600f5482166101408201526010548216610160820152601154821661018082015260125482166101a082015260135482166101c082015260145482166101e0820152601554821661020082015260165490911661022082015290565b60405161009d9190610385565b61023d61023836600461055d565b61033a565b604051901515815260200161009d565b6102d16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260005473ffffffffffffffffffffffffffffffffffffffff90811682526001548116602083015260025481169282019290925260035482166060820152600454909116608082015290565b60405161009d9190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b63beefcafe3b151561023d565b60006103667f00000000000000000000000000000000000000000000000000000000000000008361036c565b92915050565b6000811580159061037e575081828416145b9392505050565b815173ffffffffffffffffffffffffffffffffffffffff168152610240810160208301516103cb602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516103f3604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161041b606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151610443608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161046b60a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161049360c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516104bb60e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102209384015116929091019190915290565b60006020828403121561056f57600080fd5b503591905056fea164736f6c634300080f000a"; + bytes internal constant acc44Code = + hex"608060405234801561001057600080fd5b50600436106100a35760003560e01c8063604aa62811610076578063b23cc0441161005b578063b23cc0441461016d578063b51f9c2b14610182578063b6a4cd21146101d957600080fd5b8063604aa6281461012a57806378ecabce1461014a57600080fd5b80631d8a4e92146100a857806330e9012c146100c3578063318b1b80146100d85780635a4dab3314610103575b600080fd5b6100b06101ec565b6040519081526020015b60405180910390f35b6100cb610275565b6040516100ba91906128b7565b6100eb6100e6366004612a1a565b610389565b6040516001600160a01b0390911681526020016100ba565b6100eb7f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61013d610138366004612c14565b610404565b6040516100ba9190612da9565b61015d610158366004612a1a565b610b7e565b60405190151581526020016100ba565b61018061017b366004612e05565b610c29565b005b61018a611356565b6040516100ba919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6101806101e7366004612ecc565b611403565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561024c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102709190612ee9565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610365573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102709190612f0d565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103f890613065565b60601c95945050505050565b60608151600003610441576040517fea11647200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000825167ffffffffffffffff81111561045d5761045d612a33565b6040519080825280602002602001820160405280156104a257816020015b604080518082019091526000808252602082015281526020019060019003908161047b5790505b50905060001960005b8451811015610b755760008582815181106104c8576104c86130b5565b6020026020010151905060006104e5826060015163ffffffff1690565b63ffffffff169050808412610526576040517fea11647200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b809350600082602001516001600160a01b031663d6ae3cd56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190612ee9565b60408401519091506001600160a01b03166107865761063f8184602001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061091906130e4565b855161061b8661145a565b60405160200161062b9190613131565b604051602081830303815290604052611597565b868581518110610651576106516130b5565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505061078183602001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106de91906130e4565b8786815181106106f0576106f06130b5565b6020026020010151600001516107046115f5565b610180015160208701516040516001600160a01b03909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de8000000000000000000000000000000000000000000000000000000001790526116e5565b6107b6565b826040015186858151811061079d5761079d6130b5565b60209081029190910101516001600160a01b0390911690525b60006107c5846020015161176f565b905060006107d78286606001516117d3565b90506107e68560600151611864565b806107f957506107f98560600151611897565b1561090a57600061080d86606001516118b0565b905060006108ba6040518060e0016040528061082a8a6080015190565b81526020018961014001516001600160a01b031681526020016108508a602001516119af565b6001600160a01b031681526020018c8b81518110610870576108706130b5565b6020026020010151600001516001600160a01b031681526020016108978a60600151611a50565b6108a157876108a4565b60005b8152600060208201819052604090910152611a7a565b90506108cc8488606001518484611bc2565b818a89815181106108df576108df6130b5565b6020026020010151602001906001600160a01b031690816001600160a01b0316815250505050610a5d565b606085015163ffffffff166001148061092d5750606085015163ffffffff166005145b15610a2b57600061094186606001516118b0565b905060006108ba6040518060e0016040528061095e8a6080015190565b81526020018961014001516001600160a01b031681526020016109848a602001516119af565b6001600160a01b031681526020018c8b815181106109a4576109a46130b5565b602090810291909101810151516001600160a01b0316825201600163ffffffff166109d68b6060015163ffffffff1690565b63ffffffff16146109e85760006109ea565b875b81526020016109fe87878c60600151611c0b565b6001600160a01b03168152602001610a1b87878c60600151611d26565b6001600160a01b03169052611a7a565b6040517f5d02c1fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608501516101208601516040517f1e33424000000000000000000000000000000000000000000000000000000000815263ffffffff909216600483015260248201526001600160a01b03831690631e33424090604401600060405180830381600087803b158015610ace57600080fd5b505af1158015610ae2573d6000803e3d6000fd5b50505050846060015163ffffffff16837f4b8d2d3f00ea4ebab553d99606c8aea67fd4deb9ef0abee0e7c4b246c59a0e0f8a8981518110610b2557610b256130b5565b60200260200101516020015184604051610b559291906001600160a01b0392831681529116602082015260400190565b60405180910390a350505050508080610b6d906131a5565b9150506104ab565b50909392505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906131bf565b92915050565b60005b8151811015611352576000828281518110610c4957610c496130b5565b6020026020010151600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb691906130e4565b60408051600680825260e08201909252919250600091906020820160c080368337019050509050600081600081518110610cf257610cf26130b5565b602002602001019063ffffffff16908163ffffffff1681525050600181600181518110610d2157610d216130b5565b602002602001019063ffffffff16908163ffffffff1681525050600481600281518110610d5057610d506130b5565b602002602001019063ffffffff16908163ffffffff1681525050600581600381518110610d7f57610d7f6130b5565b602002602001019063ffffffff16908163ffffffff1681525050600881600481518110610dae57610dae6130b5565b602002602001019063ffffffff16908163ffffffff1681525050600981600581518110610ddd57610ddd6130b5565b602002602001019063ffffffff16908163ffffffff168152505060008060005b835181101561133a576000848281518110610e1a57610e1a6130b5565b602002602001015190506000610e3087836117d3565b90506001600160a01b038116610e47575050611328565b63ffffffff821660041480610e62575063ffffffff82166005145b80610e73575063ffffffff82166009145b15610e815760019350610e86565b600194505b848015610e905750835b15610ec7576040517f393f5fc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600063ffffffff831660081480610ee4575063ffffffff83166009145b610f0b57898981518110610efa57610efa6130b5565b602002602001015160200151610f2a565b898981518110610f1d57610f1d6130b5565b6020026020010151604001515b905080610f63576040517fb30c83ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051806101800160405280610f978d8d81518110610f8657610f866130b5565b602002602001015160000151611e14565b81526020018c8c81518110610fae57610fae6130b5565b6020026020010151600001516001600160a01b03168152602001610fd38b8688611e30565b6001600160a01b031681526020018563ffffffff168152602001838152602001846001600160a01b031663fa315aa96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110559190612ee9565b8152602001846001600160a01b031663ec5e63086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190612ee9565b8152602001846001600160a01b0316636b6716c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906131dc565b67ffffffffffffffff168152602001846001600160a01b031663dabd396d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119491906131dc565b67ffffffffffffffff1681526040517f6593dc6e00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526020909101906001600160a01b038c1690636593dc6e90602401602060405180830381865afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190612ee9565b815260200161123d8b8688611f1e565b6001600160a01b0316815260200163ffffffff861660011480611266575063ffffffff86166005145b1515905260408051600180825281830190925291925060009190816020015b60408051610180810182526060808252600060208084018290529383018190529082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101608201528252600019909201910181611285579050509050818160008151811061130d5761130d6130b5565b602002602001018190525061132181610404565b5050505050505b80611332816131a5565b915050610dfd565b5050505050808061134a906131a5565b915050610c2c565b5050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027091906131f9565b806001600160a01b03163b600003611457576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b60608160000361149d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156114c757806114b1816131a5565b91506114c09050600a836132c0565b91506114a1565b60008167ffffffffffffffff8111156114e2576114e2612a33565b6040519080825280601f01601f19166020018201604052801561150c576020820181803683370190505b5090505b841561158f576115216001836132d4565b915061152e600a866132eb565b6115399060306132ff565b60f81b81838151811061154e5761154e6130b5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611588600a866132c0565b9450611510565b949350505050565b6000806115a586858561200c565b90506115eb6115b2612042565b6020015182876040516020016115d791906001600160a01b0391909116815260200190565b6040516020818303038152906040526120cb565b9695505050505050565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce9996001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610365573d6000803e3d6000fd5b6116ee82611403565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d9061173790869086908690600401613343565b600060405180830381600087803b15801561175157600080fd5b505af1158015611765573d6000803e3d6000fd5b5050505050505050565b6000816001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906130e4565b6040517f1b685b9e00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526000906001600160a01b03841690631b685b9e90602401602060405180830381865afa158015611839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185d91906130e4565b9392505050565b600063ffffffff82161580610c23575060045b63ffffffff1661188a8363ffffffff1690565b63ffffffff161492915050565b600063ffffffff821660081480610c2357506009611877565b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8316016118f2576118e76115f5565b610220015192915050565b60001963ffffffff831601611914576119096115f5565b6101e0015192915050565b63ffffffff82166004148061192f575063ffffffff82166009145b156119475761193c6115f5565b610200015192915050565b63ffffffff82161580611960575063ffffffff82166008145b156119785761196d6115f5565b6101c0015192915050565b6040517f45447e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000816001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1391906130e4565b6001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117af573d6000803e3d6000fd5b600063ffffffff821660041480611a6d575063ffffffff82166009145b80610c2357506005611877565b60a08101516060906001600160a01b0316158015611aa3575060c08201516001600160a01b0316155b15611b30578151602080840151604080860151606087015160808801519251611b1a96959293919201948552606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602087015292841b83166034860152921b166048830152605c820152607c0190565b6040516020818303038152906040529050919050565b8151602080840151604080860151606080880151608089015160a08a015160c08b01518651988901999099527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000096841b87169588019590955292821b85166054870152811b84166068860152607c85019190915290811b8216609c8401529290921b90911660b082015260c401611b1a565b6040517fb10709570000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063b10709579061173790869086908690600401613378565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b91908101906133a6565b90508051600003611d1057836001600160a01b031663a8e4fb906040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0891906130e4565b91505061185d565b611d1981612205565b60a0015195945050505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611d8e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db691908101906133a6565b90508051600003611dff57836001600160a01b031663534db0e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b611e0881612205565b60c0015191505061185d565b604080516001600160a01b038316602082015260609101611b1a565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ec091908101906133a6565b90508051600003611f0957836001600160a01b0316633fc8cef36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b611f1281612205565b6060015191505061185d565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611f86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fae91908101906133a6565b90508051600003611ff757836001600160a01b0316633a7684636040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b61200081612205565b6020015191505061185d565b600083838360405160200161202393929190613414565b6040516020818303038152906040528051906020012090509392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce9996001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156113df573d6000803e3d6000fd5b6000806120fc856001600160a01b0316803b806020016040519081016040528181526000908060200190933c612337565b805190915060ff16156121435780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161144e565b602081015151156121865780602001516040517f57a0583500000000000000000000000000000000000000000000000000000000815260040161144e919061343f565b600081604001518460405160200161219f929190613452565b6040516020818303038152906040529050848151602083016000f592506001600160a01b0383166121fc576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152815160a481148015906122525750607c8114155b15612289576040517fbff6e41600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151604084015160548501516068860151607c870151606093841c9392831c929190911c906000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c88016122ef575050609c88015160b0890151606091821c911c5b6040805160e0810182529788526001600160a01b0396871660208901529486169487019490945291841660608601526080850152821660a08401521660c08201529392505050565b61235e6040518060600160405280600060ff16815260200160608152602001606081525090565b6002825110806123c857508160008151811061237c5761237c6130b5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061242d5750816001815181106123e1576123e16130b5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b15612464576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028360028151811061247b5761247b6130b5565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c90506000836002815181106124ab576124ab6130b5565b60209101015160f81c600390811691508190036124f4576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156125e05760008260ff1667ffffffffffffffff81111561251d5761251d612a33565b6040519080825280601f01601f191660200182016040528015612547576020820181803683370190505b50905060005b8360ff168110156125d257866125648260036132ff565b81518110612574576125746130b5565b602001015160f81c60f81b828281518110612591576125916130b5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806125ca816131a5565b91505061254d565b506125dc816127f6565b9150505b60008167ffffffffffffffff8111156125fb576125fb612a33565b6040519080825280601f01601f191660200182016040528015612625576020820181803683370190505b50905060ff8316156126ca57600061263e846003613481565b60ff16905060005b838110156126c7578761265982846132ff565b81518110612669576126696130b5565b602001015160f81c60f81b838281518110612686576126866130b5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806126bf816131a5565b915050612646565b50505b6000826126d8856003613481565b60ff166126e591906132ff565b905060008188516126f691906132d4565b905080600003612732576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561274d5761274d612a33565b6040519080825280601f01601f191660200182016040528015612777576020820181803683370190505b50905060008360208b0101602083018481868460045afa92505050806127c9576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6000602082511115612834576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b83518110156128b05761284c8160016132ff565b845161285891906132d4565b6128639060086134a6565b61286e9060026135a9565b848281518110612880576128806130b5565b0160200151612892919060f81c6134a6565b61289c90836132ff565b9150806128a8816131a5565b915050612838565b5092915050565b81516001600160a01b03168152610240810160208301516128e360208401826001600160a01b03169052565b5060408301516128fe60408401826001600160a01b03169052565b50606083015161291960608401826001600160a01b03169052565b50608083015161293460808401826001600160a01b03169052565b5060a083015161294f60a08401826001600160a01b03169052565b5060c083015161296a60c08401826001600160a01b03169052565b5060e083015161298560e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102209384015116929091019190915290565b600060208284031215612a2c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff81118282101715612a8657612a86612a33565b60405290565b6040516060810167ffffffffffffffff81118282101715612a8657612a86612a33565b604051610240810167ffffffffffffffff81118282101715612a8657612a86612a33565b604051601f8201601f1916810167ffffffffffffffff81118282101715612afc57612afc612a33565b604052919050565b600067ffffffffffffffff821115612b1e57612b1e612a33565b5060051b60200190565b600067ffffffffffffffff821115612b4257612b42612a33565b50601f01601f191660200190565b600082601f830112612b6157600080fd5b8135612b74612b6f82612b28565b612ad3565b818152846020838601011115612b8957600080fd5b816020850160208301376000918101602001919091529392505050565b6001600160a01b038116811461145757600080fd5b80356119aa81612ba6565b803563ffffffff811681146119aa57600080fd5b67ffffffffffffffff8116811461145757600080fd5b80356119aa81612bda565b801515811461145757600080fd5b80356119aa81612bfb565b60006020808385031215612c2757600080fd5b823567ffffffffffffffff80821115612c3f57600080fd5b818501915085601f830112612c5357600080fd5b8135612c61612b6f82612b04565b81815260059190911b83018401908481019088831115612c8057600080fd5b8585015b83811015612d9c57803585811115612c9c5760008081fd5b8601610180818c03601f1901811315612cb55760008081fd5b612cbd612a62565b8983013588811115612ccf5760008081fd5b612cdd8e8c83870101612b50565b8252506040612ced818501612bbb565b8b8301526060612cfe818601612bbb565b8284015260809150612d11828601612bc6565b818401525060a0808501358284015260c0915081850135818401525060e080850135828401526101009150612d47828601612bf0565b90830152610120612d59858201612bf0565b828401526101409150818501358184015250610160612d79818601612bbb565b82840152612d88848601612c09565b908301525085525050918601918601612c84565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612df857815180516001600160a01b0390811686529087015116868501529284019290850190600101612dc6565b5091979650505050505050565b60006020808385031215612e1857600080fd5b823567ffffffffffffffff811115612e2f57600080fd5b8301601f81018513612e4057600080fd5b8035612e4e612b6f82612b04565b81815260609182028301840191848201919088841115612e6d57600080fd5b938501935b83851015612ec05780858a031215612e8a5760008081fd5b612e92612a8c565b8535612e9d81612ba6565b815285870135878201526040808701359082015283529384019391850191612e72565b50979650505050505050565b600060208284031215612ede57600080fd5b813561185d81612ba6565b600060208284031215612efb57600080fd5b5051919050565b80516119aa81612ba6565b60006102408284031215612f2057600080fd5b612f28612aaf565b612f3183612f02565b8152612f3f60208401612f02565b6020820152612f5060408401612f02565b6040820152612f6160608401612f02565b6060820152612f7260808401612f02565b6080820152612f8360a08401612f02565b60a0820152612f9460c08401612f02565b60c0820152612fa560e08401612f02565b60e0820152610100612fb8818501612f02565b90820152610120612fca848201612f02565b90820152610140612fdc848201612f02565b90820152610160612fee848201612f02565b90820152610180613000848201612f02565b908201526101a0613012848201612f02565b908201526101c0613024848201612f02565b908201526101e0613036848201612f02565b90820152610200613048848201612f02565b9082015261022061305a848201612f02565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156130ad5780818460140360031b1b83161693505b505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156130f657600080fd5b815161185d81612ba6565b60005b8381101561311c578181015183820152602001613104565b8381111561312b576000848401525b50505050565b7f44656c61796564574554482d000000000000000000000000000000000000000081526000825161316981600c850160208701613101565b91909101600c0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060001982036131b8576131b8613176565b5060010190565b6000602082840312156131d157600080fd5b815161185d81612bfb565b6000602082840312156131ee57600080fd5b815161185d81612bda565b600060a0828403121561320b57600080fd5b60405160a0810181811067ffffffffffffffff8211171561322e5761322e612a33565b604052825161323c81612ba6565b8152602083015161324c81612ba6565b6020820152604083015161325f81612ba6565b6040820152606083015161327281612ba6565b6060820152608083015161328581612ba6565b60808201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826132cf576132cf613291565b500490565b6000828210156132e6576132e6613176565b500390565b6000826132fa576132fa613291565b500690565b6000821982111561331257613312613176565b500190565b6000815180845261332f816020860160208601613101565b601f01601f19169290920160200192915050565b60006001600160a01b0380861683528085166020840152506060604083015261336f6060830184613317565b95945050505050565b63ffffffff841681526001600160a01b038316602082015260606040820152600061336f6060830184613317565b6000602082840312156133b857600080fd5b815167ffffffffffffffff8111156133cf57600080fd5b8201601f810184136133e057600080fd5b80516133ee612b6f82612b28565b81815285602083850101111561340357600080fd5b61336f826020830160208601613101565b83815260606020820152600061342d6060830185613317565b82810360408401526115eb8185613317565b60208152600061185d6020830184613317565b60008351613464818460208801613101565b835190830190613478818360208801613101565b01949350505050565b600060ff821660ff84168060ff0382111561349e5761349e613176565b019392505050565b60008160001904831182151516156134c0576134c0613176565b500290565b600181815b808511156135005781600019048211156134e6576134e6613176565b808516156134f357918102915b93841c93908002906134ca565b509250929050565b60008261351757506001610c23565b8161352457506000610c23565b816001811461353a576002811461354457613560565b6001915050610c23565b60ff84111561355557613555613176565b50506001821b610c23565b5060208310610133831016604e8410600b8410161715613583575081810a610c23565b61358d83836134c5565b80600019048211156135a1576135a1613176565b029392505050565b600061185d838361350856fea164736f6c634300080f000a"; + bytes internal constant acc45Code = + hex"608060405234801561001057600080fd5b50600436106100885760003560e01c806378ecabce1161005b57806378ecabce1461010f578063b51f9c2b14610132578063b6a4cd2114610189578063cefe12231461019e57600080fd5b80631d8a4e921461008d57806330e9012c146100a8578063318b1b80146100bd5780635a4dab33146100e8575b600080fd5b6100956101be565b6040519081526020015b60405180910390f35b6100b0610247565b60405161009f9190612988565b6100d06100cb366004612af0565b61035b565b6040516001600160a01b03909116815260200161009f565b6100d07f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61012261011d366004612af0565b6103d6565b604051901515815260200161009f565b61013a610481565b60405161009f919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b61019c610197366004612b1e565b61052e565b005b6101b16101ac366004612b42565b610585565b60405161009f9190612bac565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190612ce9565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610337573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190612d8f565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103ca90612ee7565b60601c95945050505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b9190612f45565b92915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561050a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190612f62565b806001600160a01b03163b600003610582576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101919091526106078461156e565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290529061068861195d565b905060006106946119e6565b8251909150610737906107236101008a01356106b46101408c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81527f416464726573734d616e6167657200000000000000000000000000000000000060208201529150611ad69050565b604080516000815260208101909152611b0c565b6001600160a01b0316602084015260408201516107f4906107d46101008a01356107656101408c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81527f50726f787941646d696e0000000000000000000000000000000000000000000060208201529150611ad69050565b60408051306020820152015b604051602081830303815290604052611b0c565b6001600160a01b0390811680855260208501516040517f0652b57a0000000000000000000000000000000000000000000000000000000081529216600483015290630652b57a90602401600060405180830381600087803b15801561085857600080fd5b505af115801561086c573d6000803e3d6000fd5b505050602084015184516108809250611c46565b825161090a906101008901359061089b6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81527f4c3145524337323142726964676500000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b0316604084015282516109a290610100890135906109336101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81527f4f7074696d69736d506f7274616c00000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b0316610100808501919091528351610a3c91890135906109cd6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81527f4554484c6f636b626f780000000000000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b031660e08401528251610ad49061010089013590610a656101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81527f53797374656d436f6e666967000000000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b031660608401528251610b6c9061010089013590610afd6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601c81527f4f7074696d69736d4d696e7461626c654552433230466163746f72790000000060208201529150611cbe9050565b6001600160a01b031660808401528251610c049061010089013590610b956101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527f4469737075746547616d65466163746f7279000000000000000000000000000060208201529150611cbe9050565b6001600160a01b03166101208401528251610c9d9061010089013590610c2e6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527f416e63686f72537461746552656769737472790000000000000000000000000060208201529150611cbe9050565b6001600160a01b0316610140808501919091526060830151610d5b91610d3f906101008b013590610cd0908c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081527f4c315374616e646172644272696467650000000000000000000000000000000060208201529150611ad69050565b8551604080516001600160a01b039092166020830152016107e0565b6001600160a01b0390811660a0850181905284516040517f8d52d4a0000000000000000000000000000000000000000000000000000000008152921691638d52d4a091610dad9160019060040161305f565b600060405180830381600087803b158015610dc757600080fd5b505af1158015610ddb573d6000803e3d6000fd5b505060408051808201909152601a81527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000060208201526080850151909250610eb99150610ea46101008b0135610e356101408d018d612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000060208201529150611ad69050565b6020808801516040516107e09287910161310b565b6001600160a01b0390811660c0860181905285516040517f8d52d4a0000000000000000000000000000000000000000000000000000000008152921691638d52d4a091610f0b9160029060040161305f565b600060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b5050855160c08701516040517f860f7cda0000000000000000000000000000000000000000000000000000000081526001600160a01b03909216935063860f7cda9250610f8a91859060040161310b565b600060405180830381600087803b158015610fa457600080fd5b505af1158015610fb8573d6000803e3d6000fd5b5050855161104692506101008b01359150610fd76101408c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f44656c61796564574554485065726d697373696f6e656447616d65000000000060208201529150611cbe9050565b6001600160a01b03166101a0850152606061106085611d08565b905061107a85600001518660400151856040015184611d90565b61108d6110868a6132a8565b868a611e1a565b90506110a7856000015186606001518560c0015184611d90565b6110b96102608a016102408b016133d8565b1561115e5760608501516040517ff2c4bc9e0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152600160248201526001600160a01b039091169063f2c4bc9e90604401600060405180830381600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050505b61116860016103d6565b1561120d5760608501516040517ff2c4bc9e0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f580000000000000000000000000000000000000000006004820152600160248201526001600160a01b039091169063f2c4bc9e90604401600060405180830381600087803b1580156111f457600080fd5b505af1158015611208573d6000803e3d6000fd5b505050505b61121760016103d6565b156112d6576112b68560608181015161014083015160e08401516040516001600160a01b039384166024820152918316604483015291909116606482015260840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b0000000000000000000000000000000000000000000000000000000017905292915050565b90506112d18560000151866101000151856080015184611d90565b6112fa565b6112df85611e39565b90506112fa8560000151866101000151856060015184611d90565b6040805160018082528183019092526000916020808301908036833701905050905085610100015181600081518110611335576113356133f5565b60200260200101906001600160a01b031690816001600160a01b03168152505061135f8682611e67565b915061137986600001518760e001518660a0015185611d90565b61138286611ee0565b915061139c866000015187608001518660e0015185611d90565b6113a586611f5d565b91506113c086600001518760c0015186610100015185611d90565b6113c986611d08565b91506113e486600001518760a0015186610120015185611d90565b6113ed86611f8b565b91506114098660000151876101a0015186610180015185611d90565b61147860405130602482015260609060440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052919050565b9150611494866000015187610120015186610140015185611d90565b61149f8a8588611fac565b6101208601516114bb906114b660208d018d612b1e565b611c46565b6114cd6114c78b6132a8565b87612086565b91506114e9866000015187610140015186610160015185611d90565b85516114fc906114b660208d018d612b1e565b876001600160a01b03168a61010001357fb40fb1137b92aa97efb20f29c17d36c5947aac681c3315ba854b0232f83495428860405160200161153e9190612bac565b60408051601f198184030181529082905261155891613424565b60405180910390a3509398975050505050505050565b6101008101351580611584575046816101000135145b156115bb576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ca6020830183612b1e565b6001600160a01b03160361163a576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f70436861696e50726f787941646d696e4f776e6572000000000000000000006044820152606401610579565b600061164c6040830160208401612b1e565b6001600160a01b0316036116bc576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73797374656d436f6e6669674f776e65720000000000000000000000000000006044820152606401610579565b60006116ce6060830160408401612b1e565b6001600160a01b03160361173e576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f62617463686572000000000000000000000000000000000000000000000000006044820152606401610579565b60006117506080830160608401612b1e565b6001600160a01b0316036117c0576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f756e73616665426c6f636b5369676e65720000000000000000000000000000006044820152606401610579565b60006117d260a0830160808401612b1e565b6001600160a01b031603611842576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f70726f706f7365720000000000000000000000000000000000000000000000006044820152606401610579565b600061185460c0830160a08401612b1e565b6001600160a01b0316036118c4576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6368616c6c656e676572000000000000000000000000000000000000000000006044820152606401610579565b6118d2610120820182612ffa565b905060000361190d576040517f89e0acdf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061191d610120830183612ffa565b61192691613437565b03610582576040517f89e0acdf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561050a573d6000803e3d6000fd5b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610337573d6000803e3d6000fd5b6000838383604051602001611aed93929190613455565b6040516020818303038152906040528051906020012090509392505050565b600080611b3d856001600160a01b0316803b806020016040519081016040528181526000908060200190933c612146565b805190915060ff1615611b845780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610579565b60208101515115611bc75780602001516040517f57a058350000000000000000000000000000000000000000000000000000000081526004016105799190613424565b6000816040015184604051602001611be0929190613480565b6040516020818303038152906040529050848151602083016000f592506001600160a01b038316611c3d576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b6040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b158015611ca257600080fd5b505af1158015611cb6573d6000803e3d6000fd5b505050505050565b600080611ccc868585611ad6565b9050611cfe611cd961195d565b6020015182876040516020016107e091906001600160a01b0391909116815260200190565b9695505050505050565b60c08101516060828101516040516001600160a01b03938416602482015292166044830152906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc9550000000000000000000000000000000000000000000000000000000017905292915050565b611d998261052e565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d90611de2908690869086906004016134af565b600060405180830381600087803b158015611dfc57600080fd5b505af1158015611e10573d6000803e3d6000fd5b5050505050505050565b6060600080611e298686612605565b91509150611cfe868584846127c0565b6060818101516101408301516040516001600160a01b03928316602482015291166044820152606401611d32565b6060826060015182604051602401611e809291906134e4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f946d920400000000000000000000000000000000000000000000000000000000179052905092915050565b60a08101516040516001600160a01b0390911660248201526060906044015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905292915050565b6060818101516101008301516040516001600160a01b03928316602482015291166044820152606401611d32565b6060818101516040516001600160a01b039091166024820152604401611eff565b6101a08281015161014083015183830151600093870135929190610100880135611fdc60a08a0160808b01612b1e565b611fec60c08b0160a08c01612b1e565b6040805160208101989098527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606097881b81169189019190915294861b8516605488015292851b84166068870152607c860191909152831b8216609c85015290911b1660b082015260c40160405160208183030381529060405290506120808261012001516001856101e001518461287e565b50505050565b6060600083608001518060200190518101906120a2919061353f565b60608401516101208501516040516001600160a01b039283166024820152911660448201528151606482015260208201516084820152600160a482015290915060c40160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f47a222c50000000000000000000000000000000000000000000000000000000017905291505092915050565b61216d6040518060600160405280600060ff16815260200160608152602001606081525090565b6002825110806121d757508160008151811061218b5761218b6133f5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061223c5750816001815181106121f0576121f06133f5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b15612273576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028360028151811061228a5761228a6133f5565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c90506000836002815181106122ba576122ba6133f5565b60209101015160f81c60039081169150819003612303576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156123ef5760008260ff1667ffffffffffffffff81111561232c5761232c612d02565b6040519080825280601f01601f191660200182016040528015612356576020820181803683370190505b50905060005b8360ff168110156123e157866123738260036135bd565b81518110612383576123836133f5565b602001015160f81c60f81b8282815181106123a0576123a06133f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806123d9816135d5565b91505061235c565b506123eb816128c7565b9150505b60008167ffffffffffffffff81111561240a5761240a612d02565b6040519080825280601f01601f191660200182016040528015612434576020820181803683370190505b50905060ff8316156124d957600061244d8460036135ef565b60ff16905060005b838110156124d6578761246882846135bd565b81518110612478576124786133f5565b602001015160f81c60f81b838281518110612495576124956133f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806124ce816135d5565b915050612455565b50505b6000826124e78560036135ef565b60ff166124f491906135bd565b905060008188516125059190613614565b905080600003612541576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561255c5761255c612d02565b6040519080825280601f01601f191660200182016040528015612586576020820181803683370190505b50905060008360208b0101602083018481868460045afa92505050806125d8576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6040805160c08082018352600080835260208084018290528385018290526060808501839052608080860184905260a0808701859052875160e081018952858152938401859052968301849052908201839052810182905293840181905290830152906126eb6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526301312d008152600a6020820152600891810191909152633b9aca006060820152620f424060808201526fffffffffffffffffffffffffffffffff60a082015290565b91506040518060e001604052808460c001516001600160a01b0316815260200184604001516001600160a01b031681526020018460a001516001600160a01b031681526020018461010001516001600160a01b0316815260200184608001516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152509050612785816000015161052e565b612792816020015161052e565b61279f816040015161052e565b6127ac816060015161052e565b6127b9816080015161052e565b9250929050565b8351602080820151908601516040808801519084015160c08901516060958601518a8701516001600160a01b039093169289906127fc9061035b565b60608d015160405161281c9998979695949392918c918f9060240161362b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2b598b8a000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517fb10709570000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063b107095790611de290869086908690600401613774565b6000602082511115612905576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b83518110156129815761291d8160016135bd565b84516129299190613614565b6129349060086137a2565b61293f9060026138a5565b848281518110612951576129516133f5565b0160200151612963919060f81c6137a2565b61296d90836135bd565b915080612979816135d5565b915050612909565b5092915050565b81516001600160a01b03168152610240810160208301516129b460208401826001600160a01b03169052565b5060408301516129cf60408401826001600160a01b03169052565b5060608301516129ea60608401826001600160a01b03169052565b506080830151612a0560808401826001600160a01b03169052565b5060a0830151612a2060a08401826001600160a01b03169052565b5060c0830151612a3b60c08401826001600160a01b03169052565b5060e0830151612a5660e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102208085015191821681850152905b505092915050565b600060208284031215612b0257600080fd5b5035919050565b6001600160a01b038116811461058257600080fd5b600060208284031215612b3057600080fd5b8135612b3b81612b09565b9392505050565b600080600060608486031215612b5757600080fd5b833567ffffffffffffffff811115612b6e57600080fd5b84016102608187031215612b8157600080fd5b92506020840135612b9181612b09565b91506040840135612ba181612b09565b809150509250925092565b81516001600160a01b031681526101e081016020830151612bd860208401826001600160a01b03169052565b506040830151612bf360408401826001600160a01b03169052565b506060830151612c0e60608401826001600160a01b03169052565b506080830151612c2960808401826001600160a01b03169052565b5060a0830151612c4460a08401826001600160a01b03169052565b5060c0830151612c5f60c08401826001600160a01b03169052565b5060e0830151612c7a60e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501519182168185015290612ae8565b600060208284031215612cfb57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610240810167ffffffffffffffff81118282101715612d5557612d55612d02565b60405290565b6040516101c0810167ffffffffffffffff81118282101715612d5557612d55612d02565b8051612d8a81612b09565b919050565b60006102408284031215612da257600080fd5b612daa612d31565b612db383612d7f565b8152612dc160208401612d7f565b6020820152612dd260408401612d7f565b6040820152612de360608401612d7f565b6060820152612df460808401612d7f565b6080820152612e0560a08401612d7f565b60a0820152612e1660c08401612d7f565b60c0820152612e2760e08401612d7f565b60e0820152610100612e3a818501612d7f565b90820152610120612e4c848201612d7f565b90820152610140612e5e848201612d7f565b90820152610160612e70848201612d7f565b90820152610180612e82848201612d7f565b908201526101a0612e94848201612d7f565b908201526101c0612ea6848201612d7f565b908201526101e0612eb8848201612d7f565b90820152610200612eca848201612d7f565b90820152610220612edc848201612d7f565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000080821693506014831015612f2f5780818460140360031b1b83161693505b505050919050565b801515811461058257600080fd5b600060208284031215612f5757600080fd5b8151612b3b81612f37565b600060a08284031215612f7457600080fd5b60405160a0810181811067ffffffffffffffff82111715612f9757612f97612d02565b6040528251612fa581612b09565b81526020830151612fb581612b09565b60208201526040830151612fc881612b09565b60408201526060830151612fdb81612b09565b60608201526080830151612fee81612b09565b60808201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261302f57600080fd5b83018035915067ffffffffffffffff82111561304a57600080fd5b6020019150368190038213156127b957600080fd5b6001600160a01b038316815260408101600383106130a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8260208301529392505050565b60005b838110156130ce5781810151838201526020016130b6565b838111156120805750506000910152565b600081518084526130f78160208601602086016130b3565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820152600061312d60408301846130df565b949350505050565b600060c0828403121561314757600080fd5b60405160c0810181811067ffffffffffffffff8211171561316a5761316a612d02565b604052905080823561317b81612b09565b8152602083013561318b81612b09565b6020820152604083013561319e81612b09565b604082015260608301356131b181612b09565b606082015260808301356131c481612b09565b608082015260a08301356131d781612b09565b60a0919091015292915050565b803563ffffffff81168114612d8a57600080fd5b600082601f83011261320957600080fd5b813567ffffffffffffffff8082111561322457613224612d02565b604051601f8301601f19908116603f0116810190828211818310171561324c5761324c612d02565b8160405283815286602085880101111561326557600080fd5b836020870160208301376000602085830101528094505050505092915050565b803567ffffffffffffffff81168114612d8a57600080fd5b8035612d8a81612f37565b600061026082360312156132bb57600080fd5b6132c3612d5b565b6132cd3684613135565b81526132db60c084016131e4565b60208201526132ec60e084016131e4565b60408201526101008084013560608301526101208085013567ffffffffffffffff8082111561331a57600080fd5b613326368389016131f8565b60808601526101409150818701358181111561334157600080fd5b61334d36828a016131f8565b60a08701525050610160613362818801613285565b60c08601526101806133758189016131e4565b60e08701526101a080890135868801526101c0890135858801526101e0890135848801526133a66102008a01613285565b838801526133b76102208a01613285565b828801526133c86102408a0161329d565b9087015250939695505050505050565b6000602082840312156133ea57600080fd5b8135612b3b81612f37565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602081526000612b3b60208301846130df565b8035602083101561047b57600019602084900360031b1b1692915050565b83815260606020820152600061346e60608301856130df565b8281036040840152611cfe81856130df565b600083516134928184602088016130b3565b8351908301906134a68183602088016130b3565b01949350505050565b60006001600160a01b038086168352808516602084015250606060408301526134db60608301846130df565b95945050505050565b6000604082016001600160a01b0380861684526020604081860152828651808552606087019150828801945060005b81811015613531578551851683529483019491830191600101613513565b509098975050505050505050565b60006040828403121561355157600080fd5b6040516040810181811067ffffffffffffffff8211171561357457613574612d02565b604052825181526020928301519281019290925250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156135d0576135d061358e565b500190565b600060001982036135e8576135e861358e565b5060010190565b600060ff821660ff84168060ff0382111561360c5761360c61358e565b019392505050565b6000828210156136265761362661358e565b500390565b60006102c0820190506001600160a01b03808e16835263ffffffff808e166020850152808d1660408501528b606085015267ffffffffffffffff8b166080850152818a1660a08501528089511660c085015260ff60208a01511660e085015260ff60408a0151166101008501528060608a0151166101208501528060808a01511661014085015250506fffffffffffffffffffffffffffffffff60a0880151166101608301526136e76101808301876001600160a01b03169052565b84516001600160a01b039081166101a0840152602086015181166101c0840152604086015181166101e0840152606086015181166102008401526080860151811661022084015260a0860151811661024084015260c086015116610260830152836102808301526137646102a08301846001600160a01b03169052565b9c9b505050505050505050505050565b63ffffffff841681526001600160a01b03831660208201526060604082015260006134db60608301846130df565b60008160001904831182151516156137bc576137bc61358e565b500290565b600181815b808511156137fc5781600019048211156137e2576137e261358e565b808516156137ef57918102915b93841c93908002906137c6565b509250929050565b6000826138135750600161047b565b816138205750600061047b565b816001811461383657600281146138405761385c565b600191505061047b565b60ff8411156138515761385161358e565b50506001821b61047b565b5060208310610133831016604e8410600b841016171561387f575081810a61047b565b61388983836137c1565b806000190482111561389d5761389d61358e565b029392505050565b6000612b3b838361380456fea164736f6c634300080f000a"; + bytes internal constant acc46Code = + hex"608060405234801561001057600080fd5b50600436106100a35760003560e01c806378ecabce11610076578063b6a4cd211161005b578063b6a4cd21146101a4578063c993f27c146101b9578063cbeda5a7146101cc57600080fd5b806378ecabce1461012a578063b51f9c2b1461014d57600080fd5b80631d8a4e92146100a857806330e9012c146100c3578063318b1b80146100d85780635a4dab3314610103575b600080fd5b6100b06101df565b6040519081526020015b60405180910390f35b6100cb610268565b6040516100ba9190612be7565b6100eb6100e6366004612d4b565b61037c565b6040516001600160a01b0390911681526020016100ba565b6100eb7f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61013d610138366004612d4b565b6103f7565b60405190151581526020016100ba565b6101556104a2565b6040516100ba919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6101b76101b2366004612d79565b61054f565b005b6101b76101c7366004612d79565b6105a6565b6101b76101da366004612e43565b610742565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102639190612f20565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610358573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102639190612f44565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103eb9061309c565b60601c95945050505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049c91906130ec565b92915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561052b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610263919061310e565b806001600160a01b03163b6000036105a3576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b610685816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156105e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261060f9190810190613225565b610617610a2b565b600001516001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015610658573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106809190810190613225565b610b1b565b156106bc576040517f1b44701300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106c6610a2b565b90506000826001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072c9190613276565b905061073d81848460000151610b3e565b505050565b600061074c610a2b565b905060005b825181101561073d5761077c83828151811061076f5761076f613293565b6020026020010151610bc8565b600083828151811061079057610790613293565b6020026020010151600001516001600160a01b031663d6ae3cd56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd9190612f20565b9050600084838151811061081357610813613293565b6020026020010151600001516001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108809190613276565b905061095a816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108eb9190810190613225565b85600001516001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561092d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109559190810190613225565b610bd3565b15610994576040517fccc6ea860000000000000000000000000000000000000000000000000000000081526004810184905260240161059a565b6109b8848685815181106109aa576109aa613293565b602002602001015184610c4c565b306001600160a01b03168584815181106109d4576109d4613293565b6020026020010151600001516001600160a01b0316837f78bc67b9bf548ef6410becd31a3e10b9ea6c255974ef6b4530728b431df3003060405160405180910390a450508080610a23906132f1565b915050610751565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610358573d6000803e3d6000fd5b6000610b2783836114db565b80610b375750610b378383611527565b9392505050565b610b478161054f565b6040517f99a88ec40000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301528416906399a88ec490604401600060405180830381600087803b158015610bab57600080fd5b505af1158015610bbf573d6000803e3d6000fd5b50505050505050565b80516105a39061054f565b600080610bdf8461154d565b90506000610bec8461154d565b805183519192501180610c12575080518251148015610c12575080602001518260200151105b80610c43575080518251148015610c30575080602001518260200151145b8015610c43575080604001518260400151105b95945050505050565b600082600001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190613276565b9050610cc98184600001518660c00151610b3e565b600083600001516001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d319190613276565b9050610d3d60016103f7565b1561102a57610d5182828760800151610b3e565b6000816001600160a01b031663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db59190613276565b90506001600160a01b038116610f3f57610e128484610dd78860000151611719565b6040518060400160405280600f81526020017f4554484c6f636b626f782d553136610000000000000000000000000000000000815250611747565b60408051600180825281830190925291925060009190602080830190803683370190505090508281600081518110610e4c57610e4c613293565b60200260200101906001600160a01b031690816001600160a01b031681525050610eea84838960a00151896000015185604051602401610e8d92919061330b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f946d9204000000000000000000000000000000000000000000000000000000001790526117a5565b826001600160a01b031663bda204bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b50505050505b6000826001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa39190613276565b6040517f99a88ec40000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301528481166024830152919250908416906399a88ec490604401600060405180830381600087803b15801561100b57600080fd5b505af115801561101f573d6000803e3d6000fd5b505050505050611039565b61103982828760600151610b3e565b6110aa82826001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109f9190613276565b876101600151610b3e565b61111e8285600001516001600160a01b0316639b7d7f0a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190613276565b8760e00151610b3e565b600084600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611162573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111869190613276565b90506111988382886101400151610b3e565b600085600001516001600160a01b031663a39fac126040518163ffffffff1660e01b815260040160e060405180830381865afa1580156111dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112009190613366565b9050611216848260000151896101000151610b3e565b61122a848260400151896101200151610b3e565b61123d8482602001518960400151610b3e565b50600061124b826001611825565b905061127187868361125f868660016118af565b61126b878760016119ca565b8b611ab8565b600061127e836000611825565b90506001600160a01b038116156114d157600087600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f79190613276565b905060008060001b61130a8a6020015190565b036113205761131b82846000611c2f565b611326565b88602001515b905061134e8a898361133a898860006118af565b6113468a8960006119ca565b600088611d42565b600061135b866008611825565b60408b015190915015158061137857506001600160a01b03811615155b156114cd5760408a015160009061139a5761139584836008611c2f565b6113a0565b8a604001515b90506113c88c8b836113b48b8a60006118af565b6113c08c8b60006119ca565b60088a611d42565b6040517f6593dc6e000000000000000000000000000000000000000000000000000000008152600060048201819052906001600160a01b03861690636593dc6e90602401602060405180830381865afa158015611429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144d9190612f20565b6040517f1e33424000000000000000000000000000000000000000000000000000000000815260086004820152602481018290529091506001600160a01b03861690631e33424090604401600060405180830381600087803b1580156114b257600080fd5b505af11580156114c6573d6000803e3d6000fd5b5050505050505b5050505b5050505050505050565b6000806114e78461154d565b905060006114f48461154d565b8051835191925014801561150f575080602001518260200151145b8015610c435750604090810151910151149392505050565b600061153383836114db565b158015610b3757506115458383610bd3565b159392505050565b61157160405180606001604052806000815260200160008152602001600081525090565b60006115b2836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250611df5565b90506003815110156115f0576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061164b8260028151811061160857611608613293565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250611df5565b905060006116a88260008151811061166557611665613293565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250611df5565b905060405180606001604052806116d8856000815181106116cb576116cb613293565b6020026020010151611ea0565b81526020016116f3856001815181106116cb576116cb613293565b815260200161170e836000815181106116cb576116cb613293565b905295945050505050565b604080516001600160a01b0383166020820152606091015b6040516020818303038152906040529050919050565b600080611755868585611f18565b905061179b611762611f4e565b60200151828760405160200161178791906001600160a01b0391909116815260200190565b604051602081830303815290604052611fd7565b9695505050505050565b6117ae8261054f565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d906117f79086908690869060040161344a565b600060405180830381600087803b15801561181157600080fd5b505af11580156114d1573d6000803e3d6000fd5b6040517f1b685b9e00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526000906001600160a01b03841690631b685b9e90602401602060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b379190613276565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611917573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261193f9190810190613225565b905080516000036119b457836001600160a01b0316633fc8cef36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190613276565b915050610b37565b6119bd81612111565b6060015195945050505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611a32573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a5a9190810190613225565b90508051600003611aa357836001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b611aac81612111565b60400151915050610b37565b600081600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b209190613276565b6020830151909150600090611b4257611b3b82876001611c2f565b9050611b49565b5060208201515b80611b80576040517fefc878f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000886101e0015190506000611c146040518060e00160405280611ba18690565b81526020018c6101a001516001600160a01b03168152602001886001600160a01b03168152602001896001600160a01b031681526020018b8152602001611bea878c6001612243565b6001600160a01b03168152602001611c04878c6001612331565b6001600160a01b0316905261241f565b9050611c238460018484612556565b50505050505050505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611c97573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cbf9190810190613225565b90508051600003611d2c57836001600160a01b0316638d450a956040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190612f20565b6000611d3782612111565b519250610b37915050565b84611d79576040517fefc878f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000876101c0015190506000611ddc6040518060e00160405280611d9a8a90565b81526101a08c01516001600160a01b039081166020830152888116604083015289166060820152608081018b9052600060a0820181905260c09091015261241f565b9050611dea83858484612556565b505050505050505050565b60606000611e03848461259f565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114611e6b5760405182820380825286601f8201165b8b850181015183820152870180611e435750600082820160200152603f018616810160405284525b875160209490940193019050818310611e2657505050508091508251611e9957602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110611ec857505080611f125763101827966000526004601cfd5b50919050565b6000838383604051602001611f2f93929190613476565b6040516020818303038152906040528051906020012090509392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561052b573d6000803e3d6000fd5b600080612008856001600160a01b0316803b806020016040519081016040528181526000908060200190933c61266e565b805190915060ff161561204f5780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161059a565b602081015151156120925780602001516040517f57a0583500000000000000000000000000000000000000000000000000000000815260040161059a91906134a1565b60008160400151846040516020016120ab9291906134b4565b6040516020818303038152906040529050848151602083016000f592506001600160a01b038316612108576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152815160a4811480159061215e5750607c8114155b15612195576040517fbff6e41600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151604084015160548501516068860151607c870151606093841c9392831c929190911c906000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c88016121fb575050609c88015160b0890151606091821c911c5b6040805160e0810182529788526001600160a01b0396871660208901529486169487019490945291841660608601526080850152821660a08401521660c08201529392505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa1580156122ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122d39190810190613225565b9050805160000361231c57836001600160a01b031663a8e4fb906040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b61232581612111565b60a00151915050610b37565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015612399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123c19190810190613225565b9050805160000361240a57836001600160a01b031663534db0e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b61241381612111565b60c00151915050610b37565b60a08101516060906001600160a01b0316158015612448575060c08201516001600160a01b0316155b156124bf57815160208084015160408086015160608701516080880151925161173196959293919201948552606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602087015292841b83166034860152921b166048830152605c820152607c0190565b8151602080840151604080860151606080880151608089015160a08a015160c08b01518651988901999099527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000096841b87169588019590955292821b85166054870152811b84166068860152607c85019190915290811b8216609c8401529290921b90911660b082015260c401611731565b919050565b6040517fb10709570000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063b1070957906117f7908690869086906004016134e3565b6060825182518181116126665760208501945060208401935060206040510192508460018284880103016000602084106125d857508286205b601f841660200360031b87515b8951818118831c61263a5783156126185783878c20146126185760018b019a50848b106126125750612649565b506125e5565b858b03895299860199602090980197861561263a57848b106126125750612649565b5060018a019950838a106125e5575b505060408051601f198189030160051c8152602090970190525050505b505092915050565b6126956040518060600160405280600060ff16815260200160608152602001606081525090565b6002825110806126ff5750816000815181106126b3576126b3613293565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061276457508160018151811061271857612718613293565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b1561279b576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002836002815181106127b2576127b2613293565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c90506000836002815181106127e2576127e2613293565b60209101015160f81c6003908116915081900361282b576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156129175760008260ff1667ffffffffffffffff81111561285457612854612d96565b6040519080825280601f01601f19166020018201604052801561287e576020820181803683370190505b50905060005b8360ff16811015612909578661289b826003613511565b815181106128ab576128ab613293565b602001015160f81c60f81b8282815181106128c8576128c8613293565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612901816132f1565b915050612884565b5061291381612b2d565b9150505b60008167ffffffffffffffff81111561293257612932612d96565b6040519080825280601f01601f19166020018201604052801561295c576020820181803683370190505b50905060ff831615612a01576000612975846003613529565b60ff16905060005b838110156129fe57876129908284613511565b815181106129a0576129a0613293565b602001015160f81c60f81b8382815181106129bd576129bd613293565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806129f6816132f1565b91505061297d565b50505b600082612a0f856003613529565b60ff16612a1c9190613511565b90506000818851612a2d919061354e565b905080600003612a69576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612a8457612a84612d96565b6040519080825280601f01601f191660200182016040528015612aae576020820181803683370190505b50905060008360208b0101602083018481868460045afa9250505080612b00576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6000602082511115612b6b576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8351811015611e9957612b83816001613511565b8451612b8f919061354e565b612b9a906008613565565b612ba5906002613668565b848281518110612bb757612bb7613293565b0160200151612bc9919060f81c613565565b612bd39083613511565b915080612bdf816132f1565b915050612b6f565b81516001600160a01b0316815261024081016020830151612c1360208401826001600160a01b03169052565b506040830151612c2e60408401826001600160a01b03169052565b506060830151612c4960608401826001600160a01b03169052565b506080830151612c6460808401826001600160a01b03169052565b5060a0830151612c7f60a08401826001600160a01b03169052565b5060c0830151612c9a60c08401826001600160a01b03169052565b5060e0830151612cb560e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501519182168185015290612666565b600060208284031215612d5d57600080fd5b5035919050565b6001600160a01b03811681146105a357600080fd5b600060208284031215612d8b57600080fd5b8135610b3781612d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715612de857612de8612d96565b60405290565b604051610240810167ffffffffffffffff81118282101715612de857612de8612d96565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e3b57612e3b612d96565b604052919050565b60006020808385031215612e5657600080fd5b823567ffffffffffffffff80821115612e6e57600080fd5b818501915085601f830112612e8257600080fd5b813581811115612e9457612e94612d96565b612ea2848260051b01612e12565b81815284810192506060918202840185019188831115612ec157600080fd5b938501935b82851015612f145780858a031215612ede5760008081fd5b612ee6612dc5565b8535612ef181612d64565b815285870135878201526040808701359082015284529384019392850192612ec6565b50979650505050505050565b600060208284031215612f3257600080fd5b5051919050565b805161255181612d64565b60006102408284031215612f5757600080fd5b612f5f612dee565b612f6883612f39565b8152612f7660208401612f39565b6020820152612f8760408401612f39565b6040820152612f9860608401612f39565b6060820152612fa960808401612f39565b6080820152612fba60a08401612f39565b60a0820152612fcb60c08401612f39565b60c0820152612fdc60e08401612f39565b60e0820152610100612fef818501612f39565b90820152610120613001848201612f39565b90820152610140613013848201612f39565b90820152610160613025848201612f39565b90820152610180613037848201612f39565b908201526101a0613049848201612f39565b908201526101c061305b848201612f39565b908201526101e061306d848201612f39565b9082015261020061307f848201612f39565b90820152610220613091848201612f39565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156130e45780818460140360031b1b83161693505b505050919050565b6000602082840312156130fe57600080fd5b81518015158114610b3757600080fd5b600060a0828403121561312057600080fd5b60405160a0810181811067ffffffffffffffff8211171561314357613143612d96565b604052825161315181612d64565b8152602083015161316181612d64565b6020820152604083015161317481612d64565b6040820152606083015161318781612d64565b6060820152608083015161319a81612d64565b60808201529392505050565b60005b838110156131c15781810151838201526020016131a9565b838111156131d0576000848401525b50505050565b600067ffffffffffffffff8311156131f0576131f0612d96565b6132036020601f19601f86011601612e12565b905082815283838301111561321757600080fd5b610b378360208301846131a6565b60006020828403121561323757600080fd5b815167ffffffffffffffff81111561324e57600080fd5b8201601f8101841361325f57600080fd5b61326e848251602084016131d6565b949350505050565b60006020828403121561328857600080fd5b8151610b3781612d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006000198203613304576133046132c2565b5060010190565b6000604082016001600160a01b0380861684526020604081860152828651808552606087019150828801945060005b8181101561335857855185168352948301949183019160010161333a565b509098975050505050505050565b600060e0828403121561337857600080fd5b60405160e0810181811067ffffffffffffffff8211171561339b5761339b612d96565b60405282516133a981612d64565b815260208301516133b981612d64565b602082015260408301516133cc81612d64565b604082015260608301516133df81612d64565b60608201526133f060808401612f39565b608082015261340160a08401612f39565b60a082015261341260c08401612f39565b60c08201529392505050565b600081518084526134368160208601602086016131a6565b601f01601f19169290920160200192915050565b60006001600160a01b03808616835280851660208401525060606040830152610c43606083018461341e565b83815260606020820152600061348f606083018561341e565b828103604084015261179b818561341e565b602081526000610b37602083018461341e565b600083516134c68184602088016131a6565b8351908301906134da8183602088016131a6565b01949350505050565b63ffffffff841681526001600160a01b0383166020820152606060408201526000610c43606083018461341e565b60008219821115613524576135246132c2565b500190565b600060ff821660ff84168060ff03821115613546576135466132c2565b019392505050565b600082821015613560576135606132c2565b500390565b600081600019048311821515161561357f5761357f6132c2565b500290565b600181815b808511156135bf5781600019048211156135a5576135a56132c2565b808516156135b257918102915b93841c9390800290613589565b509250929050565b6000826135d65750600161049c565b816135e35750600061049c565b81600181146135f957600281146136035761361f565b600191505061049c565b60ff841115613614576136146132c2565b50506001821b61049c565b5060208310610133831016604e8410600b8410161715613642575081810a61049c565b61364c8383613584565b8060001904821115613660576136606132c2565b029392505050565b6000610b3783836135c756fea164736f6c634300080f000a"; + bytes internal constant acc47Code = + hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635a4dab331161005b5780635a4dab33146100fd57806378ecabce14610124578063b51f9c2b14610147578063b6a4cd211461019e57600080fd5b80631d8a4e921461008d57806330e9012c146100a8578063318b1b80146100bd57806358084273146100e8575b600080fd5b6100956101b1565b6040519081526020015b60405180910390f35b6100b061023a565b60405161009f919061241a565b6100d06100cb36600461257d565b61034e565b6040516001600160a01b03909116815260200161009f565b6100fb6100f6366004612596565b6103c9565b005b6100d07f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61013761013236600461257d565b61172e565b604051901515815260200161009f565b61014f6117d9565b60405161009f919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6100fb6101ac3660046125ee565b611886565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610211573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610235919061260b565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa15801561032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023591906126af565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103bd90612807565b60601c95945050505050565b60006103d9610140830183612857565b60008181106103ea576103ea6128c5565b61040092602060609092020190810191506125ee565b6001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561043d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046191906128f4565b905060005b610474610140840184612857565b905081101561073e57816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df91906128f4565b6001600160a01b03166104f6610140850185612857565b83818110610506576105066128c5565b61051c92602060609092020190810191506125ee565b6001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d91906128f4565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de91906128f4565b6001600160a01b03161461061e576040517f513c07ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61064d61062f610140850185612857565b6000818110610640576106406128c5565b9050606002016020013590565b61066e61065e610140860186612857565b84818110610640576106406128c5565b146106a5576040517fa9ef3a7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d46106b6610140850185612857565b60008181106106c7576106c76128c5565b9050606002016040013590565b6106f56106e5610140860186612857565b848181106106c7576106c76128c5565b1461072c576040517fa9ef3a7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061073681612940565b915050610466565b50600061075261062f610140850185612857565b03610789576040517fefc878f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610799610140840184612857565b905067ffffffffffffffff8111156107b3576107b3612624565b6040519080825280602002602001820160405280156107dc578160200160208202803683370190505b50905060005b6107f0610140850185612857565b90508110156108ca57610807610140850185612857565b82818110610817576108176128c5565b61082d92602060609092020190810191506125ee565b6001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088e91906128f4565b8282815181106108a0576108a06128c5565b6001600160a01b0390921660209283029190910190910152806108c281612940565b9150506107e2565b5060005b8151811015610a2957816000815181106108ea576108ea6128c5565b60200260200101516001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095391906128f4565b6001600160a01b031682828151811061096e5761096e6128c5565b60200260200101516001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d791906128f4565b6001600160a01b031614610a17576040517f8db2d5e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610a2181612940565b9150506108ce565b506000826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e91906128f4565b90506000610b0f4285610ad4610aa86101408a018a612857565b6000818110610ab957610ab96128c5565b610acf92602060609092020190810191506125ee565b6118dd565b6040518060400160405280601281526020017f4554484c6f636b626f782d496e7465726f70000000000000000000000000000081525061190b565b905082610c0e8583610b1f611969565b60a0015187600081518110610b3657610b366128c5565b60200260200101516001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f91906128f4565b85604051602401610bb192919061295a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f946d920400000000000000000000000000000000000000000000000000000000179052611a59565b506000610c624286610c27610aa86101408b018b612857565b6040518060400160405280601a81526020017f4469737075746547616d65466163746f72792d496e7465726f7000000000000081525061190b565b9050610ce98582610c71611969565b61014001516040516001600160a01b03881660248201526044015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052611a59565b6000610d3c4287610d01610aa86101408c018c612857565b6040518060400160405280601b81526020017f416e63686f72537461746552656769737472792d496e7465726f70000000000081525061190b565b90506000610d4d60208901896129c3565b15610d5a57506004610d5e565b5060055b610e868783610d6b611969565b610160015189600081518110610d8357610d836128c5565b60200260200101516001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906128f4565b604080516001600160a01b039283166024820152918916604483015260208e013560648301528d0135608482015263ffffffff861660a482015260c40160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f47a222c500000000000000000000000000000000000000000000000000000000179052611a59565b60005b865181101561116b576000878281518110610ea657610ea66128c5565b60200260200101516001600160a01b031663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0f91906128f4565b6040517f5ec15d890000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015291925090871690635ec15d8990602401600060405180830381600087803b158015610f6f57600080fd5b505af1158015610f83573d6000803e3d6000fd5b50506040517f438ab5ac0000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528416925063438ab5ac9150602401600060405180830381600087803b158015610fe357600080fd5b505af1158015610ff7573d6000803e3d6000fd5b50505050600088838151811061100f5761100f6128c5565b60200260200101516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107891906128f4565b9050611085816000611ad9565b611090816004611ad9565b61109b816001611ad9565b6110a6816005611ad9565b6110b1816008611ad9565b6110bc816009611ad9565b8883815181106110ce576110ce6128c5565b60209081029190910101516040517f2152f2be0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152878116602483015290911690632152f2be90604401600060405180830381600087803b15801561113e57600080fd5b505af1158015611152573d6000803e3d6000fd5b505050505050808061116390612940565b915050610e89565b5060006111bf4289611184610aa86101408e018e612857565b6040518060400160405280602081526020017f44656c61796564574554482d496e7465726f702d5065726d697373696f6e656481525061190b565b905061126a88826111ce611969565b61018001518a6000815181106111e6576111e66128c5565b60200260200101516001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124f91906128f4565b6040516001600160a01b039091166024820152604401610c8c565b60006113176040518060e0016040528061128e8d80610140019061062f9190612857565b815260200161129b611969565b6101a001516001600160a01b03168152602001866001600160a01b03168152602001846001600160a01b03168152602001600081526020018c60600160000160208101906112e991906125ee565b6001600160a01b0316815260200161130760a08e0160808f016125ee565b6001600160a01b03169052611b6a565b9050846001600160a01b031663b1070957600561133261023a565b6102200151846040518463ffffffff1660e01b815260040161135693929190612a3c565b600060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b50506040517f1e3342400000000000000000000000000000000000000000000000000000000081526005600482015260e08d013560248201526001600160a01b0388169250631e3342409150604401600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b506114179450505060208b0191508a90506129c3565b156117245760006114524289611434610aa86101408e018e612857565b604051806060016040528060228152602001612d4c6022913961190b565b905061146188826111ce611969565b60006114ce6040518060e001604052806114858d80610140019061062f9190612857565b8152602001611492611969565b6101a001516001600160a01b0390811682528781166020830152851660408201526000606082018190526080820181905260a090910152611b6a565b9050846001600160a01b031663b107095760046114e961023a565b6102000151846040518463ffffffff1660e01b815260040161150d93929190612a3c565b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b50506040517f1e33424000000000000000000000000000000000000000000000000000000000815260048082015260e08d013560248201526001600160a01b0388169250631e3342409150604401600060405180830381600087803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b5050505060006115d18b8061014001906106b69190612857565b90508015611720576116316040518060e001604052808381526020016115f5611969565b6101a001516001600160a01b0390811682528881166020830152861660408201526000606082018190526080820181905260a090910152611b6a565b9150856001600160a01b031663b1070957600961164c61023a565b6102000151856040518463ffffffff1660e01b815260040161167093929190612a3c565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b50506040517f1e3342400000000000000000000000000000000000000000000000000000000081526009600482015260e08e013560248201526001600160a01b0389169250631e3342409150604401600060405180830381600087803b15801561170757600080fd5b505af115801561171b573d6000803e3d6000fd5b505050505b5050505b5050505050505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa1580156117af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d39190612a73565b92915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102359190612a90565b806001600160a01b03163b6000036118da576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b604080516001600160a01b0383166020820152606091015b6040516020818303038152906040529050919050565b600080611919868585611ca1565b905061195f611926611cd7565b60200151828760405160200161194b91906001600160a01b0391909116815260200190565b604051602081830303815290604052611d60565b9695505050505050565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa15801561032a573d6000803e3d6000fd5b611a6282611886565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d90611aab90869086908690600401612b4f565b600060405180830381600087803b158015611ac557600080fd5b505af1158015611724573d6000803e3d6000fd5b6040517fb107095700000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526000602482018190526060604483015260648201526001600160a01b0383169063b107095790608401600060405180830381600087803b158015611b4e57600080fd5b505af1158015611b62573d6000803e3d6000fd5b505050505050565b60a08101516060906001600160a01b0316158015611b93575060c08201516001600160a01b0316155b15611c0a5781516020808401516040808601516060870151608088015192516118f596959293919201948552606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602087015292841b83166034860152921b166048830152605c820152607c0190565b8151602080840151604080860151606080880151608089015160a08a015160c08b01518651988901999099527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000096841b87169588019590955292821b85166054870152811b84166068860152607c85019190915290811b8216609c8401529290921b90911660b082015260c4016118f5565b919050565b6000838383604051602001611cb893929190612b7b565b6040516020818303038152906040528051906020012090509392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611862573d6000803e3d6000fd5b600080611d91856001600160a01b0316803b806020016040519081016040528181526000908060200190933c611e9a565b805190915060ff1615611dd85780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff90911660048201526024016118d1565b60208101515115611e1b5780602001516040517f57a058350000000000000000000000000000000000000000000000000000000081526004016118d19190612ba6565b6000816040015184604051602001611e34929190612bb9565b6040516020818303038152906040529050848151602083016000f592506001600160a01b038316611e91576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b611ec16040518060600160405280600060ff16815260200160608152602001606081525090565b600282511080611f2b575081600081518110611edf57611edf6128c5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b80611f90575081600181518110611f4457611f446128c5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b15611fc7576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283600281518110611fde57611fde6128c5565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c905060008360028151811061200e5761200e6128c5565b60209101015160f81c60039081169150819003612057576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156121435760008260ff1667ffffffffffffffff81111561208057612080612624565b6040519080825280601f01601f1916602001820160405280156120aa576020820181803683370190505b50905060005b8360ff1681101561213557866120c7826003612be8565b815181106120d7576120d76128c5565b602001015160f81c60f81b8282815181106120f4576120f46128c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061212d81612940565b9150506120b0565b5061213f81612359565b9150505b60008167ffffffffffffffff81111561215e5761215e612624565b6040519080825280601f01601f191660200182016040528015612188576020820181803683370190505b50905060ff83161561222d5760006121a1846003612c00565b60ff16905060005b8381101561222a57876121bc8284612be8565b815181106121cc576121cc6128c5565b602001015160f81c60f81b8382815181106121e9576121e96128c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061222281612940565b9150506121a9565b50505b60008261223b856003612c00565b60ff166122489190612be8565b905060008188516122599190612c25565b905080600003612295576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156122b0576122b0612624565b6040519080825280601f01601f1916602001820160405280156122da576020820181803683370190505b50905060008360208b0101602083018481868460045afa925050508061232c576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6000602082511115612397576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8351811015612413576123af816001612be8565b84516123bb9190612c25565b6123c6906008612c3c565b6123d1906002612d3f565b8482815181106123e3576123e36128c5565b01602001516123f5919060f81c612c3c565b6123ff9083612be8565b91508061240b81612940565b91505061239b565b5092915050565b81516001600160a01b031681526102408101602083015161244660208401826001600160a01b03169052565b50604083015161246160408401826001600160a01b03169052565b50606083015161247c60608401826001600160a01b03169052565b50608083015161249760808401826001600160a01b03169052565b5060a08301516124b260a08401826001600160a01b03169052565b5060c08301516124cd60c08401826001600160a01b03169052565b5060e08301516124e860e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102209384015116929091019190915290565b60006020828403121561258f57600080fd5b5035919050565b6000602082840312156125a857600080fd5b813567ffffffffffffffff8111156125bf57600080fd5b820161016081850312156125d257600080fd5b9392505050565b6001600160a01b03811681146118da57600080fd5b60006020828403121561260057600080fd5b81356125d2816125d9565b60006020828403121561261d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610240810167ffffffffffffffff8111828210171561269e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b8051611c9c816125d9565b600061024082840312156126c257600080fd5b6126ca612653565b6126d3836126a4565b81526126e1602084016126a4565b60208201526126f2604084016126a4565b6040820152612703606084016126a4565b6060820152612714608084016126a4565b608082015261272560a084016126a4565b60a082015261273660c084016126a4565b60c082015261274760e084016126a4565b60e082015261010061275a8185016126a4565b9082015261012061276c8482016126a4565b9082015261014061277e8482016126a4565b908201526101606127908482016126a4565b908201526101806127a28482016126a4565b908201526101a06127b48482016126a4565b908201526101c06127c68482016126a4565b908201526101e06127d88482016126a4565b908201526102006127ea8482016126a4565b908201526102206127fc8482016126a4565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008082169350601483101561284f5780818460140360031b1b83161693505b505050919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261288c57600080fd5b83018035915067ffffffffffffffff8211156128a757600080fd5b60200191506060810236038213156128be57600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561290657600080fd5b81516125d2816125d9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000600019820361295357612953612911565b5060010190565b6000604082016001600160a01b0380861684526020604081860152828651808552606087019150828801945060005b818110156129a7578551851683529483019491830191600101612989565b509098975050505050505050565b80151581146118da57600080fd5b6000602082840312156129d557600080fd5b81356125d2816129b5565b60005b838110156129fb5781810151838201526020016129e3565b83811115612a0a576000848401525b50505050565b60008151808452612a288160208601602086016129e0565b601f01601f19169290920160200192915050565b63ffffffff841681526001600160a01b0383166020820152606060408201526000612a6a6060830184612a10565b95945050505050565b600060208284031215612a8557600080fd5b81516125d2816129b5565b600060a08284031215612aa257600080fd5b60405160a0810181811067ffffffffffffffff82111715612aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251612afa816125d9565b81526020830151612b0a816125d9565b60208201526040830151612b1d816125d9565b60408201526060830151612b30816125d9565b60608201526080830151612b43816125d9565b60808201529392505050565b60006001600160a01b03808616835280851660208401525060606040830152612a6a6060830184612a10565b838152606060208201526000612b946060830185612a10565b828103604084015261195f8185612a10565b6020815260006125d26020830184612a10565b60008351612bcb8184602088016129e0565b835190830190612bdf8183602088016129e0565b01949350505050565b60008219821115612bfb57612bfb612911565b500190565b600060ff821660ff84168060ff03821115612c1d57612c1d612911565b019392505050565b600082821015612c3757612c37612911565b500390565b6000816000190483118215151615612c5657612c56612911565b500290565b600181815b80851115612c96578160001904821115612c7c57612c7c612911565b80851615612c8957918102915b93841c9390800290612c60565b509250929050565b600082612cad575060016117d3565b81612cba575060006117d3565b8160018114612cd05760028114612cda57612cf6565b60019150506117d3565b60ff841115612ceb57612ceb612911565b50506001821b6117d3565b5060208310610133831016604e8410600b8410161715612d19575081810a6117d3565b612d238383612c5b565b8060001904821115612d3757612d37612911565b029392505050565b60006125d28383612c9e56fe44656c61796564574554482d496e7465726f702d5065726d697373696f6e6c657373a164736f6c634300080f000a"; + bytes internal constant acc48Code = + hex"608060405234801561001057600080fd5b50600436106101a35760003560e01c80637d8bd0d8116100ee578063bb98b3f411610097578063dea2198411610071578063dea21984146103ae578063e303272c146103c1578063e3fef4a8146103d4578063f3edcbe1146103e757600080fd5b8063bb98b3f414610375578063bc3f6fd414610388578063c34e047a1461039b57600080fd5b8063a38d5595116100c8578063a38d559514610316578063a4dec37a14610329578063ad7e7e401461033c57600080fd5b80637d8bd0d8146102dd5780638970ac44146102f057806398ccec3e1461030357600080fd5b806354fd4d5011610150578063718394181161012a57806371839418146102ae57806374459cf3146102b75780637b491a98146102ca57600080fd5b806354fd4d501461024c57806358256afb146102885780636c0e21701461029b57600080fd5b806335e80ab31161018157806335e80ab31461021357806341fe538514610226578063534db0e21461023957600080fd5b80630e9d5cb9146101a85780631d8a4e92146101d15780632aecd35c146101e8575b600080fd5b6101bb6101b6366004614888565b6103fa565b6040516101c891906148ff565b60405180910390f35b6101da60125481565b6040519081526020016101c8565b600d546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020016101c8565b6000546101fb906001600160a01b031681565b6101bb610234366004614932565b61047b565b6002546101fb906001600160a01b031681565b6101bb6040518060400160405280600581526020017f322e332e3100000000000000000000000000000000000000000000000000000081525081565b600a546101fb906001600160a01b031681565b6006546101fb906001600160a01b031681565b6101da60035481565b600e546101fb906001600160a01b031681565b6007546101fb906001600160a01b031681565b6004546101fb906001600160a01b031681565b6101bb6102fe3660046149ed565b6104f8565b6011546101fb906001600160a01b031681565b6005546101fb906001600160a01b031681565b6001546101fb906001600160a01b031681565b60408051808201909152600581527f312e312e3500000000000000000000000000000000000000000000000000000060208201526101bb565b600c546101fb906001600160a01b031681565b6008546101fb906001600160a01b031681565b600b546101fb906001600160a01b031681565b6010546101fb906001600160a01b031681565b600f546101fb906001600160a01b031681565b6009546101fb906001600160a01b031681565b6101bb6103f5366004614a2c565b6107a5565b6040805160a0808201835260008083526020808401829052838501829052606084810183905260809485018390528551938401865288516001600160a01b039081168552828a015192850192909252838601839052948801518386015287850151169282019290925290506104708185856104f8565b9150505b9392505050565b6040805160a0808201835260008083526020808401829052838501829052606084810183905260809485018390528551938401865287516001600160a01b0390811685528289015192850192909252838601839052948701518386015286850151169282019290925290506104f081846107a5565b949350505050565b60606000604051806020016040528060008152509050600085600001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105769190614a59565b9050610581826107da565b915061058e8282866108aa565b915061059f82876000015183610977565b91506105b08287600001518361103c565b91506105c1828760000151836115f0565b91506105d282876000015183611b9a565b91506105e382876000015183611e99565b91506105f482876000015183612443565b915061060682876000015183876128ec565b915061062782876000015188602001518960600151858b608001518a612b39565b915061067b828760000151600089602001518a60600151868a6040518060400160405280600481526020017f504c444700000000000000000000000000000000000000000000000000000000815250612d3d565b91506106cf828760000151600889604001518a60600151868a6040518060400160405280600481526020017f434b444700000000000000000000000000000000000000000000000000000000815250612d3d565b91506106e082876000015183612e47565b915060006106ed85613263565b805190915083901561072c57835115610729578184604051602001610713929190614a76565b604051602081830303815290604052905061072c565b50805b6000845111801561073b575086155b1561079a57806040516020016107519190614ace565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610791916004016148ff565b60405180910390fd5b979650505050505050565b60606104748383604051806040016040528060006001600160a01b0316815260200160006001600160a01b03168152506104f8565b600080546040517f2e48152c00000000000000000000000000000000000000000000000000000000815260048101929092526060916108a4916001600160a01b031690632e48152c90602401602060405180830381865afa158015610843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108679190614b39565b156040518060400160405280600981526020017f5350524346472d3130000000000000000000000000000000000000000000000081525084613300565b92915050565b606060006108b78361334c565b905061096e816001600160a01b0316856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109289190614a59565b6001600160a01b0316146040518060400160405280600981526020017f50524f5859412d3130000000000000000000000000000000000000000000000081525087613300565b95945050505050565b60606109ef6109b361098885613375565b60085461099d906001600160a01b0316613375565b8051602091820120825192909101919091201490565b6040518060400160405280600981526020017f535953434f4e2d3130000000000000000000000000000000000000000000000081525086613300565b9350610aad631dcd650067ffffffffffffffff16846001600160a01b031663f68016b76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a659190614b6c565b67ffffffffffffffff1611156040518060400160405280600981526020017f535953434f4e2d3230000000000000000000000000000000000000000000000081525086613300565b9350610b54836001600160a01b031663f45e65d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190614b89565b600014156040518060400160405280600981526020017f535953434f4e2d3330000000000000000000000000000000000000000000000081525086613300565b600854909450610bb7906001600160a01b0316610b7184866133dd565b6001600160a01b0316146040518060400160405280600981526020017f535953434f4e2d3430000000000000000000000000000000000000000000000081525086613300565b93506000836001600160a01b031663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d9190614bcc565b9050610c6f816000015163ffffffff166301312d00146040518060400160405280600981526020017f535953434f4e2d3530000000000000000000000000000000000000000000000081525087613300565b9450610cbb816020015160ff16600a146040518060400160405280600981526020017f535953434f4e2d3630000000000000000000000000000000000000000000000081525087613300565b9450610d07816040015160ff166008146040518060400160405280600981526020017f535953434f4e2d3730000000000000000000000000000000000000000000000081525087613300565b9450610d58816080015163ffffffff16620f4240146040518060400160405280600981526020017f535953434f4e2d3830000000000000000000000000000000000000000000000081525087613300565b9450610daa816060015163ffffffff16633b9aca00146040518060400160405280600981526020017f535953434f4e2d3930000000000000000000000000000000000000000000000081525087613300565b9450610e166fffffffffffffffffffffffffffffffff80168260a001516fffffffffffffffffffffffffffffffff16146040518060400160405280600a81526020017f535953434f4e2d3130300000000000000000000000000000000000000000000081525087613300565b9450610ec2846001600160a01b0316634d5d9a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7d9190614c82565b63ffffffff166000146040518060400160405280600a81526020017f535953434f4e2d3131300000000000000000000000000000000000000000000081525087613300565b9450610f72846001600160a01b03166316d3bc7f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190614b6c565b67ffffffffffffffff166000146040518060400160405280600a81526020017f535953434f4e2d3132300000000000000000000000000000000000000000000081525087613300565b945061096e60008054906101000a90046001600160a01b03166001600160a01b0316856001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff69190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f535953434f4e2d3133300000000000000000000000000000000000000000000081525087613300565b60606000836001600160a01b031663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a29190614a59565b90506111046110c86110b383613375565b600a5461099d906001600160a01b0316613375565b6040518060400160405280600881526020017f4c3178444d2d313000000000000000000000000000000000000000000000000081525087613300565b600a54909550611167906001600160a01b031661112185846133dd565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d323000000000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cd9190614a59565b90506112987342000000000000000000000000000000000000076001600160a01b0316836001600160a01b0316639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112529190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d333000000000000000000000000000000000000000000000000081525088613300565b95506113637342000000000000000000000000000000000000076001600160a01b0316836001600160a01b031663db505d806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131d9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d343000000000000000000000000000000000000000000000000081525088613300565b955061141a816001600160a01b0316836001600160a01b0316630ff754ea6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d49190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d353000000000000000000000000000000000000000000000000081525088613300565b95506114d1816001600160a01b0316836001600160a01b0316636425666b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148b9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d363000000000000000000000000000000000000000000000000081525088613300565b9550611588856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d373000000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b03166115a084613464565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d383000000000000000000000000000000000000000000000000081525088613300565b9695505050505050565b60606000836001600160a01b031663078f29cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611632573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116569190614a59565b90506116b861167c61166783613375565b600b5461099d906001600160a01b0316613375565b6040518060400160405280600781526020017f4c3153422d31300000000000000000000000000000000000000000000000000081525087613300565b600b5490955061171b906001600160a01b03166116d585846133dd565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d32300000000000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b031663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190614a59565b9050611838816001600160a01b0316836001600160a01b031663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f29190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d33300000000000000000000000000000000000000000000000000081525088613300565b95506118ef816001600160a01b0316836001600160a01b0316633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a99190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d34300000000000000000000000000000000000000000000000000081525088613300565b95506119ba7342000000000000000000000000000000000000106001600160a01b0316836001600160a01b0316637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119749190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d35300000000000000000000000000000000000000000000000000081525088613300565b9550611a857342000000000000000000000000000000000000106001600160a01b0316836001600160a01b031663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3f9190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d36300000000000000000000000000000000000000000000000000081525088613300565b9550611b3c856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af69190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d37300000000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b0316611b5484613464565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d38300000000000000000000000000000000000000000000000000081525088613300565b60606000836001600160a01b0316639b7d7f0a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190614a59565b9050611c62611c26611c1183613375565b60095461099d906001600160a01b0316613375565b6040518060400160405280600a81526020017f4d4552433230462d31300000000000000000000000000000000000000000000081525087613300565b600954909550611cc5906001600160a01b0316611c7f85846133dd565b6001600160a01b0316146040518060400160405280600a81526020017f4d4552433230462d32300000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b031663078f29cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b9190614a59565b9050611de2816001600160a01b0316836001600160a01b031663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c9190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f4d4552433230462d33300000000000000000000000000000000000000000000081525088613300565b95506115e6816001600160a01b0316836001600160a01b031663e78cea926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e539190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f4d4552433230462d34300000000000000000000000000000000000000000000081525088613300565b60606000836001600160a01b031663c4e8ddfa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190614a59565b9050611f61611f25611f1083613375565b60045461099d906001600160a01b0316613375565b6040518060400160405280600881526020017f4c373231422d313000000000000000000000000000000000000000000000000081525087613300565b600454909550611fc4906001600160a01b0316611f7e85846133dd565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d323000000000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b031663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a9190614a59565b90506120f57342000000000000000000000000000000000000146001600160a01b0316836001600160a01b0316637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561208b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120af9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d333000000000000000000000000000000000000000000000000081525088613300565b95506121c07342000000000000000000000000000000000000146001600160a01b0316836001600160a01b031663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217a9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d343000000000000000000000000000000000000000000000000081525088613300565b9550612277816001600160a01b0316836001600160a01b031663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561220d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122319190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d353000000000000000000000000000000000000000000000000081525088613300565b955061232e816001600160a01b0316836001600160a01b0316633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e89190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d363000000000000000000000000000000000000000000000000081525088613300565b95506123e5856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239f9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d373000000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b03166123fd84613464565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d383000000000000000000000000000000000000000000000000081525088613300565b60606000836001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a99190614a59565b90506124bb601254600160001b6134c8565b156125bf576125556125196124cf83613375565b6006546124e4906001600160a01b0316613375565b6040516020016124f49190614c9d565b6040516020818303038152906040528051602091820120825192909101919091201490565b6040518060400160405280600981526020017f504f5254414c2d3130000000000000000000000000000000000000000000000081525087613300565b6006549095506125b8906001600160a01b031661257285846133dd565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3230000000000000000000000000000000000000000000000081525087613300565b9450612603565b6125e36125196125ce83613375565b60055461099d906001600160a01b0316613375565b600554909550612600906001600160a01b031661257285846133dd565b94505b6000846001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015612643573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126679190614a59565b905061271e816001600160a01b0316836001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d89190614a59565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3330000000000000000000000000000000000000000000000081525088613300565b95506127d5856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561276b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278f9190614a59565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3430000000000000000000000000000000000000000000000081525088613300565b955061288e61dead6001600160a01b0316836001600160a01b0316639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128489190614a59565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3830000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b03166128a684613464565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3930000000000000000000000000000000000000000000000081525088613300565b606060006128f98361334c565b90506000856001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561293b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295f9190614a59565b90506129c161298561297083613375565b600c5461099d906001600160a01b0316613375565b6040518060400160405280600581526020017f44462d313000000000000000000000000000000000000000000000000000000081525089613300565b600c54909750612a24906001600160a01b03166129de87846133dd565b6001600160a01b0316146040518060400160405280600581526020017f44462d323000000000000000000000000000000000000000000000000000000081525089613300565b9650612adb826001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a959190614a59565b6001600160a01b0316146040518060400160405280600581526020017f44462d333000000000000000000000000000000000000000000000000000000081525089613300565b965061079a856001600160a01b0316612af383613464565b6001600160a01b0316146040518060400160405280600581526020017f44462d343000000000000000000000000000000000000000000000000000000081525089613300565b604080518082018252600481527f504444470000000000000000000000000000000000000000000000000000000060208083019190915282516101c081018452600080825291810182905292830181905260608084018290526080840182905260a0840182905260c0840182905260e08401829052610100840182905261012084018290526101408401829052610160840182905261018084018290526101a084018290529260019291612bef8c858d866134dc565b909d5090925090508015612c09578b94505050505061079a565b612c696040518061012001604052808e81526020018d6001600160a01b031681526020018481526020018c81526020018b81526020018a6001600160a01b031681526020018663ffffffff16815260200188815260200185815250613770565b9b506000612c7687613afe565b9050612cd1816001600160a01b03168461018001516001600160a01b0316146040518060400160405280600881526020017f504444472d3133300000000000000000000000000000000000000000000000008152508f613300565b9c50612d2c886001600160a01b0316846101a001516001600160a01b0316146040518060400160405280600881526020017f504444472d3134300000000000000000000000000000000000000000000000008152508f613300565b9d9c50505050505050505050505050565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a0820183905291612dbb8b8a8c876134dc565b909c5090925090508015612dd3578a92505050612e3b565b612e336040518061012001604052808d81526020018c6001600160a01b031681526020018481526020018a8152602001898152602001886001600160a01b031681526020018b63ffffffff16815260200187815260200186815250613770565b9a508a925050505b98975050505050505050565b60606000836001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190614a59565b90506000816001600160a01b031663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f139190614a59565b6040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201529091506001600160a01b038616906347af267b90602401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614b39565b612fc5578592505050610474565b613025612fe9612fd483613375565b60075461099d906001600160a01b0316613375565b6040518060400160405280600a81526020017f4c4f434b424f582d31300000000000000000000000000000000000000000000081525088613300565b600754909650613088906001600160a01b031661304286846133dd565b6001600160a01b0316146040518060400160405280600a81526020017f4c4f434b424f582d32300000000000000000000000000000000000000000000081525088613300565b95506130e6846001600160a01b03166130a083613464565b6001600160a01b0316146040518060400160405280600a81526020017f4c4f434b424f582d33300000000000000000000000000000000000000000000081525088613300565b955061319d856001600160a01b0316826001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613133573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131579190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f4c4f434b424f582d34300000000000000000000000000000000000000000000081525088613300565b6040517f0fd110770000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529197506115e691831690630fd1107790602401602060405180830381865afa158015613203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132279190614b39565b6040518060400160405280600a81526020017f4c4f434b424f582d35300000000000000000000000000000000000000000000081525088613300565b805160609081906001600160a01b03161561329b57806040516020016132899190614cb9565b60405160208183030381529060405290505b60208301516001600160a01b0316156108a4578051156132d857806040516020016132c69190614cfa565b60405160208183030381529060405290505b806040516020016132e99190614d3b565b604051602081830303815290604052905092915050565b6060831561330f575080610474565b815160000361332057829150613345565b8183604051602001613333929190614a76565b60405160208183030381529060405291505b5092915050565b80516000906001600160a01b03161561336457505190565b50506001546001600160a01b031690565b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156133b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108a49190810190614df0565b6040517f204e1c7a0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000919084169063204e1c7a90602401602060405180830381865afa158015613440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104749190614a59565b6000816001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190614a59565b600081158015906104745750509081161490565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810182905290859080600163ffffffff881663ffffffff161490506000866001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c69190614a59565b6040517f1b685b9e00000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529091506000906001600160a01b03831690631b685b9e90602401602060405180830381865afa15801561362f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136539190614a59565b90506001600160a01b03811661369c5761368e6000886040516020016136799190614e39565b60405160208183030381529060405287613300565b945060019350505050613766565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201526000906001600160a01b038416906374cc86ac90602401600060405180830381865afa158015613702573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261372a9190810190614df0565b9050600061373a8783878c613b2d565b9097509050801561375357600195505050505050613766565b61375e83838d613bb5565b975050505050505b9450945094915050565b805161010082015160408084015161012081015182517fd83ef267000000000000000000000000000000000000000000000000000000008152835192936000936001600160a01b039093169263d83ef2679260048082019392918290030181865afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138079190614e7a565b509050600085602001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561384e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138729190614a59565b90506138d96138c86138878560000151613375565b60c089015163ffffffff166001146138b3576010546138ae906001600160a01b0316613375565b61099d565b60115461099d906001600160a01b0316613375565b856040516020016136799190614e9e565b94506139068660c0015163ffffffff168460a0015163ffffffff1614856040516020016136799190614edf565b945061392786606001518460e0015114856040516020016136799190614f20565b9450613949866080015184610160015114856040516020016136799190614f61565b94506139678360c00151600014856040516020016136799190614fa2565b9450613990836080015167ffffffffffffffff16612a3014856040516020016136799190614fe3565b94506139ae8360400151601e14856040516020016136799190615024565b94506139cc8360200151604914856040516020016136799190615065565b94506139f6836060015167ffffffffffffffff1662049d40148560405160200161367991906150a6565b9450613a136000801b8314158560405160200161367991906150e7565b9450613a348587602001518561014001518960a001518a60e0015189613eea565b9450613a51858760200151838661012001518a60a0015189614164565b9450613a638584610100015186614399565b600f546101008501519196506001600160a01b03908116911603613af557613af2858461010001516001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec9190614a59565b866144ae565b94505b50505050919050565b60208101516000906001600160a01b031615613b1c57506020015190565b50506002546001600160a01b031690565b6060600082604051602001613b429190615128565b60405160208183030381529060405292508315613b9f576000613b66865160a41490565b9050613b928185604051602001613b7d9190614e39565b60405160208183030381529060405289613300565b9650869250159050613bac565b6000613b668651607c1490565b94509492505050565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810182905290613c2f84614625565b9050604051806101c00160405280866001600160a01b03168152602001866001600160a01b031663fa315aa96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cae9190614b89565b8152602001866001600160a01b031663ec5e63086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d159190614b89565b8152602001866001600160a01b031663dabd396d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d7c9190614b6c565b67ffffffffffffffff168152602001866001600160a01b0316636b6716c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ded9190614b6c565b67ffffffffffffffff1681526020018463ffffffff168152602001866001600160a01b03166399735e326040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6a9190614b89565b81526020018260000151815260200182602001516001600160a01b0316815260200182604001516001600160a01b0316815260200182606001516001600160a01b03168152602001826080015181526020018260c001516001600160a01b031681526020018260a001516001600160a01b03168152509150509392505050565b606081604051602001613efd9190615169565b6040516020818303038152906040529150613f43613f32613f1d87613375565b600e5461099d906001600160a01b0316613375565b83604051602001613b7d9190614e39565b600e54909750613f7b906001600160a01b0316613f6086886133dd565b6001600160a01b03161483604051602001613b7d9190614e9e565b96506000613f888461334c565b9050614029816001600160a01b0316876001600160a01b031663dad544e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff99190614a59565b6001600160a01b031614846040516020016140149190614edf565b6040516020818303038152906040528a613300565b97506140a5600354876001600160a01b0316636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561406f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140939190614b89565b14846040516020016140149190614f20565b9750614131876001600160a01b0316876001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141169190614a59565b6001600160a01b0316148460405160200161401491906151aa565b9750612e3b856001600160a01b031661414988613464565b6001600160a01b031614846040516020016140149190614f61565b60608160405160200161417791906151eb565b60405160208183030381529060405291506141ac613f3261419786613375565b600d5461099d906001600160a01b0316613375565b600d549097506141c9906001600160a01b0316613f6085876133dd565b9650614255856001600160a01b0316856001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423a9190614a59565b6001600160a01b03161483604051602001613b7d9190614edf565b96506142e1866001600160a01b0316856001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142c69190614a59565b6001600160a01b03161483604051602001613b7d9190614f20565b9650614314836001600160a01b03166142f986613464565b6001600160a01b03161483604051602001613b7d91906151aa565b965061079a6000856001600160a01b0316634086d1836040518163ffffffff1660e01b8152600401602060405180830381865afa158015614359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061437d9190614b6c565b67ffffffffffffffff161183604051602001613b7d9190614f61565b6060816040516020016143ac919061522c565b60408051601f1981840301815290829052600f549093506143fc916001600160a01b03868116921691909114906143e7908590602001614e39565b60405160208183030381529060405286613300565b935061443361442261440d85613375565b600f5461099d906001600160a01b0316613375565b836040516020016143e79190614e9e565b93506104f0836001600160a01b0316631219a4e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015614476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061449a9190614b89565b600814836040516020016143e79190614edf565b6060816040516020016144c1919061526d565b604051602081830303815290604052915061452b61451a6144e185613375565b60408051808201909152600581527f312e312e35000000000000000000000000000000000000000000000000000000602082015261099d565b836040516020016143e79190614e39565b93506145a8836001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561456e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145929190614b89565b6201518014836040516020016143e79190614e9e565b93506104f0836001600160a01b031663dd24f9bf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460f9190614b89565b6201ec3014836040516020016143e79190614edf565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152815160a481148015906146725750607c8114155b156146a9576040517fbff6e41600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151604084015160548501516068860151607c870151606093841c9392831c929190911c906000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c880161470f575050609c88015160b0890151606091821c911c5b6040805160e0810182529788526001600160a01b0396871660208901529486169487019490945291841660608601526080850152821660a08401521660c08201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461479b57600080fd5b50565b6000608082840312156147b057600080fd5b6040516080810181811067ffffffffffffffff821117156147d3576147d3614757565b60405290508082356147e481614786565b808252506020830135602082015260408301356040820152606083013561480a81614786565b6060919091015292915050565b801515811461479b57600080fd5b60006040828403121561483757600080fd5b6040516040810181811067ffffffffffffffff8211171561485a5761485a614757565b604052905080823561486b81614786565b8152602083013561487b81614786565b6020919091015292915050565b600080600060e0848603121561489d57600080fd5b6148a7858561479e565b925060808401356148b781614817565b91506148c68560a08601614825565b90509250925092565b60005b838110156148ea5781810151838201526020016148d2565b838111156148f9576000848401525b50505050565b602081526000825180602084015261491e8160408501602087016148cf565b601f01601f19169190910160400192915050565b60008060a0838503121561494557600080fd5b61494f848461479e565b9150608083013561495f81614817565b809150509250929050565b600060a0828403121561497c57600080fd5b60405160a0810181811067ffffffffffffffff8211171561499f5761499f614757565b60405290508082356149b081614786565b8082525060208301356020820152604083013560408201526060830135606082015260808301356149e081614786565b6080919091015292915050565b60008060006101008486031215614a0357600080fd5b614a0d858561496a565b925060a0840135614a1d81614817565b91506148c68560c08601614825565b60008060c08385031215614a3f57600080fd5b614a49848461496a565b915060a083013561495f81614817565b600060208284031215614a6b57600080fd5b815161047481614786565b60008351614a888184602088016148cf565b7f2c000000000000000000000000000000000000000000000000000000000000009083019081528351614ac28160018401602088016148cf565b01600101949350505050565b7f4f50436f6e7472616374734d616e616765725374616e6461726456616c69646181527f746f723a20000000000000000000000000000000000000000000000000000000602082015260008251614b2c8160258501602087016148cf565b9190910160250192915050565b600060208284031215614b4b57600080fd5b815161047481614817565b67ffffffffffffffff8116811461479b57600080fd5b600060208284031215614b7e57600080fd5b815161047481614b56565b600060208284031215614b9b57600080fd5b5051919050565b805163ffffffff81168114614bb657600080fd5b919050565b805160ff81168114614bb657600080fd5b600060c08284031215614bde57600080fd5b60405160c0810181811067ffffffffffffffff82111715614c0157614c01614757565b604052614c0d83614ba2565b8152614c1b60208401614bbb565b6020820152614c2c60408401614bbb565b6040820152614c3d60608401614ba2565b6060820152614c4e60808401614ba2565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114614c7657600080fd5b60a08201529392505050565b600060208284031215614c9457600080fd5b61047482614ba2565b60008251614caf8184602087016148cf565b9190910192915050565b60008251614ccb8184602087016148cf565b7f4f56455252494445532d4c3150414f4d554c5449534947000000000000000000920191825250601701919050565b60008251614d0c8184602087016148cf565b7f2c00000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b60008251614d4d8184602087016148cf565b7f4f56455252494445532d4348414c4c454e474552000000000000000000000000920191825250601401919050565b600067ffffffffffffffff80841115614d9757614d97614757565b604051601f8501601f19908116603f01168101908282118183101715614dbf57614dbf614757565b81604052809350858152868686011115614dd857600080fd5b614de68660208301876148cf565b5050509392505050565b600060208284031215614e0257600080fd5b815167ffffffffffffffff811115614e1957600080fd5b8201601f81018413614e2a57600080fd5b6104f084825160208401614d7c565b60008251614e4b8184602087016148cf565b7f2d31300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008060408385031215614e8d57600080fd5b505080516020909101519092909150565b60008251614eb08184602087016148cf565b7f2d32300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614ef18184602087016148cf565b7f2d33300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614f328184602087016148cf565b7f2d34300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614f738184602087016148cf565b7f2d36300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614fb48184602087016148cf565b7f2d37300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614ff58184602087016148cf565b7f2d38300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b600082516150368184602087016148cf565b7f2d39300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b600082516150778184602087016148cf565b7f2d31303000000000000000000000000000000000000000000000000000000000920191825250600401919050565b600082516150b88184602087016148cf565b7f2d31313000000000000000000000000000000000000000000000000000000000920191825250600401919050565b600082516150f98184602087016148cf565b7f2d31323000000000000000000000000000000000000000000000000000000000920191825250600401919050565b6000825161513a8184602087016148cf565b7f2d47415247530000000000000000000000000000000000000000000000000000920191825250600601919050565b6000825161517b8184602087016148cf565b7f2d44574554480000000000000000000000000000000000000000000000000000920191825250600601919050565b600082516151bc8184602087016148cf565b7f2d35300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b600082516151fd8184602087016148cf565b7f2d414e43484f5250000000000000000000000000000000000000000000000000920191825250600801919050565b6000825161523e8184602087016148cf565b7f2d564d0000000000000000000000000000000000000000000000000000000000920191825250600301919050565b6000825161527f8184602087016148cf565b7f2d50494d474f000000000000000000000000000000000000000000000000000092019182525060060191905056fea164736f6c634300080f000a"; + bytes internal constant oPContractsManagerCode = + hex"608060405234801561001057600080fd5b506004361061018d5760003560e01c8063622d56f1116100e3578063b51f9c2b1161008c578063c993f27c11610066578063c993f27c1461045f578063cbeda5a714610472578063f3edcbe11461048557600080fd5b8063b51f9c2b146103ba578063ba7903db14610411578063becbdf4a1461043857600080fd5b806378ecabce116100bd57806378ecabce146103715780638970ac4414610394578063b23cc044146103a757600080fd5b8063622d56f1146103035780636624856a1461032a5780636ab5f6611461035157600080fd5b8063318b1b801161014557806354fd4d501161011f57806354fd4d501461029557806358084273146102ce578063604aa628146102e357600080fd5b8063318b1b801461024857806335e80ab31461025b57806341fe53851461028257600080fd5b80631481a724116101765780631481a724146101f65780631d8a4e921461021d57806330e9012c1461023357600080fd5b806303dbe68c146101925780630e9d5cb9146101d6575b600080fd5b6101b97f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec81565b6040516001600160a01b0390911681526020015b60405180910390f35b6101e96101e4366004611393565b610498565b6040516101cd9190611436565b6101b97f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e81565b610225610551565b6040519081526020016101cd565b61023b6105da565b6040516101cd9190611449565b6101b96102563660046115b1565b6106ee565b6101b97f000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa81565b6101e96102903660046115ca565b610799565b60408051808201909152600581527f362e302e3400000000000000000000000000000000000000000000000000000060208201526101e9565b6102e16102dc366004611602565b61084f565b005b6102f66102f1366004611715565b610955565b6040516101cd91906118aa565b6101b97f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf81565b6101b97f000000000000000000000000856e75e9c0da547f9753c17746d6cc139b668e5c81565b61036461035f366004611906565b610a70565b6040516101cd9190611942565b61038461037f3660046115b1565b610bbe565b60405190151581526020016101cd565b6101e96103a2366004611b02565b610c63565b6102e16103b5366004611be6565b610ccf565b6103c2610dd0565b6040516101cd919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6101b97f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c981565b6101b97f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce99981565b6102e161046d366004611c2f565b610e7d565b6102e1610480366004611be6565b610f83565b6101e9610493366004611c4c565b611084565b6040517f0e9d5cb90000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c91690630e9d5cb99061050490879087908790600401611c79565b600060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105499190810190611cdb565b949350505050565b60007f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d59190611d52565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa1580156106ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d59190611d76565b6040517f318b1b80000000000000000000000000000000000000000000000000000000008152600481018290526000907f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b03169063318b1b8090602401602060405180830381865afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107939190611ece565b92915050565b6040517f41fe53850000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c916906341fe5385906108039086908690600401611eeb565b600060405180830381865afa158015610820573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108489190810190611cdb565b9392505050565b6108576110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a1630036108b9576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816040516024016108cc9190611ffd565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f580842730000000000000000000000000000000000000000000000000000000017905290506109507f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e82611133565b505050565b606061095f6110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a1630036109c1576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826040516024016109d491906120f0565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f604aa6280000000000000000000000000000000000000000000000000000000017905290506000610a5a7f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce99983611133565b9050808060200190518101906105499190612225565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c0810191909152610af16110ee565b6040517fcefe12230000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf169063cefe122390610b7a9085907f000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa90339060040161240e565b6101e0604051808303816000875af1158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906125e2565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906126f9565b6040517f8970ac440000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c91690638970ac449061050490879087908790600401612716565b610cd76110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a163003610d39576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610d4c9190612787565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb23cc0440000000000000000000000000000000000000000000000000000000017905290506109507f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce99982611133565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d591906127f2565b610e856110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a163003610ee7576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038216602482015260009060440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc993f27c0000000000000000000000000000000000000000000000000000000017905290506109507f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec82611133565b610f8b6110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a163003610fed576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401611000919061288a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbeda5a70000000000000000000000000000000000000000000000000000000017905290506109507f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec82611133565b6040517ff3edcbe10000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c9169063f3edcbe19061080390869086906004016128e9565b6110fa62010000610bbe565b15611131576040517fe232d67700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060600080846001600160a01b031684604051611150919061293e565b600060405180830381855af49150503d806000811461118b576040519150601f19603f3d011682016040523d82523d6000602084013e611190565b606091505b50915091508161054957805160208201fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156111f4576111f46111a2565b60405290565b604051610180810167ffffffffffffffff811182821017156111f4576111f46111a2565b604051610240810167ffffffffffffffff811182821017156111f4576111f46111a2565b6040516101e0810167ffffffffffffffff811182821017156111f4576111f46111a2565b604051601f8201601f1916810167ffffffffffffffff8111828210171561128f5761128f6111a2565b604052919050565b6001600160a01b03811681146112ac57600080fd5b50565b80356112ba81611297565b919050565b6000608082840312156112d157600080fd5b6040516080810181811067ffffffffffffffff821117156112f4576112f46111a2565b604052905080823561130581611297565b808252506020830135602082015260408301356040820152606083013561132b81611297565b6060919091015292915050565b80151581146112ac57600080fd5b80356112ba81611338565b60006040828403121561136357600080fd5b61136b6111d1565b9050813561137881611297565b8152602082013561138881611297565b602082015292915050565b600080600060e084860312156113a857600080fd5b6113b285856112bf565b925060808401356113c281611338565b91506113d18560a08601611351565b90509250925092565b60005b838110156113f55781810151838201526020016113dd565b83811115611404576000848401525b50505050565b600081518084526114228160208601602086016113da565b601f01601f19169290920160200192915050565b602081526000610848602083018461140a565b81516001600160a01b031681526102408101602083015161147560208401826001600160a01b03169052565b50604083015161149060408401826001600160a01b03169052565b5060608301516114ab60608401826001600160a01b03169052565b5060808301516114c660808401826001600160a01b03169052565b5060a08301516114e160a08401826001600160a01b03169052565b5060c08301516114fc60c08401826001600160a01b03169052565b5060e083015161151760e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102208085015191821681850152905b505092915050565b6000602082840312156115c357600080fd5b5035919050565b60008060a083850312156115dd57600080fd5b6115e784846112bf565b915060808301356115f781611338565b809150509250929050565b60006020828403121561161457600080fd5b813567ffffffffffffffff81111561162b57600080fd5b8201610160818503121561084857600080fd5b600067ffffffffffffffff821115611658576116586111a2565b5060051b60200190565b600067ffffffffffffffff82111561167c5761167c6111a2565b50601f01601f191660200190565b600082601f83011261169b57600080fd5b81356116ae6116a982611662565b611266565b8181528460208386010111156116c357600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146112ba57600080fd5b67ffffffffffffffff811681146112ac57600080fd5b80356112ba816116f4565b6000602080838503121561172857600080fd5b823567ffffffffffffffff8082111561174057600080fd5b818501915085601f83011261175457600080fd5b81356117626116a98261163e565b81815260059190911b8301840190848101908883111561178157600080fd5b8585015b8381101561189d5780358581111561179d5760008081fd5b8601610180818c03601f19018113156117b65760008081fd5b6117be6111fa565b89830135888111156117d05760008081fd5b6117de8e8c8387010161168a565b82525060406117ee8185016112af565b8b83015260606117ff8186016112af565b82840152608091506118128286016116e0565b818401525060a0808501358284015260c0915081850135818401525060e08085013582840152610100915061184882860161170a565b9083015261012061185a85820161170a565b82840152610140915081850135818401525061016061187a8186016112af565b82840152611889848601611346565b908301525085525050918601918601611785565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156118f957815180516001600160a01b03908116865290870151168685015292840192908501906001016118c7565b5091979650505050505050565b60006020828403121561191857600080fd5b813567ffffffffffffffff81111561192f57600080fd5b8201610260818503121561084857600080fd5b81516001600160a01b031681526101e08101602083015161196e60208401826001600160a01b03169052565b50604083015161198960408401826001600160a01b03169052565b5060608301516119a460608401826001600160a01b03169052565b5060808301516119bf60808401826001600160a01b03169052565b5060a08301516119da60a08401826001600160a01b03169052565b5060c08301516119f560c08401826001600160a01b03169052565b5060e0830151611a1060e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c08085015191821681850152906115a9565b600060a08284031215611a9157600080fd5b60405160a0810181811067ffffffffffffffff82111715611ab457611ab46111a2565b6040529050808235611ac581611297565b808252506020830135602082015260408301356040820152606083013560608201526080830135611af581611297565b6080919091015292915050565b60008060006101008486031215611b1857600080fd5b611b228585611a7f565b925060a0840135611b3281611338565b91506113d18560c08601611351565b6000611b4f6116a98461163e565b83815290506020808201906060808602850187811115611b6e57600080fd5b855b81811015611bda5782818a031215611b885760008081fd5b6040805184810181811067ffffffffffffffff82111715611bab57611bab6111a2565b82528235611bb881611297565b8152828601358682015281830135918101919091528552938301938201611b70565b50505050509392505050565b600060208284031215611bf857600080fd5b813567ffffffffffffffff811115611c0f57600080fd5b8201601f81018413611c2057600080fd5b61054984823560208401611b41565b600060208284031215611c4157600080fd5b813561084881611297565b60008060c08385031215611c5f57600080fd5b611c698484611a7f565b915060a08301356115f781611338565b60e08101611cb1828680516001600160a01b039081168352602080830151908401526040808301519084015260609182015116910152565b831515608083015282516001600160a01b0390811660a084015260208401511660c0830152610549565b600060208284031215611ced57600080fd5b815167ffffffffffffffff811115611d0457600080fd5b8201601f81018413611d1557600080fd5b8051611d236116a982611662565b818152856020838501011115611d3857600080fd5b611d498260208301602086016113da565b95945050505050565b600060208284031215611d6457600080fd5b5051919050565b80516112ba81611297565b60006102408284031215611d8957600080fd5b611d9161121e565b611d9a83611d6b565b8152611da860208401611d6b565b6020820152611db960408401611d6b565b6040820152611dca60608401611d6b565b6060820152611ddb60808401611d6b565b6080820152611dec60a08401611d6b565b60a0820152611dfd60c08401611d6b565b60c0820152611e0e60e08401611d6b565b60e0820152610100611e21818501611d6b565b90820152610120611e33848201611d6b565b90820152610140611e45848201611d6b565b90820152610160611e57848201611d6b565b90820152610180611e69848201611d6b565b908201526101a0611e7b848201611d6b565b908201526101c0611e8d848201611d6b565b908201526101e0611e9f848201611d6b565b90820152610200611eb1848201611d6b565b90820152610220611ec3848201611d6b565b908201529392505050565b600060208284031215611ee057600080fd5b815161084881611297565b60a08101611f23828580516001600160a01b039081168352602080830151908401526040808301519084015260609182015116910152565b82151560808301529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f6757600080fd5b830160208101925035905067ffffffffffffffff811115611f8757600080fd5b606081023603821315611f9957600080fd5b9250929050565b8183526000602080850194508260005b85811015611ff2578135611fc381611297565b6001600160a01b0316875281830135838801526040808301359088015260609687019690910190600101611fb0565b509495945050505050565b602081526000823561200e81611338565b8015156020840152506020830135604083015260408301356060830152606083013561203981611297565b6001600160a01b0380821660808501526080850135915061205982611297565b80821660a0850152505060a083013560c083015260c083013560e083015261010060e084013581840152808401359050612092816116f4565b61012067ffffffffffffffff8216818501526120af81860161170a565b9150506101406120ca8185018367ffffffffffffffff169052565b6120d681860186611f32565b6101608681015292509050611d4961018085018383611fa0565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015612217577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151610180815181865261215c8287018261140a565b915050888201516121778a8701826001600160a01b03169052565b50878201516001600160a01b03908116868a015260608084015163ffffffff16908701526080808401519087015260a0808401519087015260c0808401519087015260e08084015167ffffffffffffffff9081169188019190915261010080850151909116908701526101208084015190870152610140808401519091169086015261016091820151151591909401529386019390860190600101612117565b509098975050505050505050565b6000602080838503121561223857600080fd5b825167ffffffffffffffff81111561224f57600080fd5b8301601f8101851361226057600080fd5b805161226e6116a98261163e565b81815260069190911b8201830190838101908783111561228d57600080fd5b928401925b828410156122e357604084890312156122ab5760008081fd5b6122b36111d1565b84516122be81611297565b8152848601516122cd81611297565b8187015282526040939093019290840190612292565b979650505050505050565b80356122f981611297565b6001600160a01b03908116835260208201359061231582611297565b908116602084015260408201359061232c82611297565b908116604084015260608201359061234382611297565b908116606084015260808201359061235a82611297565b908116608084015260a08201359061237182611297565b80821660a085015250505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b457600080fd5b830160208101925035905067ffffffffffffffff8111156123d457600080fd5b803603821315611f9957600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815261241f60608201856122ee565b600061242d60c086016116e0565b6101206124418185018363ffffffff169052565b61244d60e088016116e0565b91506101406124638186018463ffffffff169052565b61016092506101008801358386015261247e8289018961237f565b9250610260610180818189015261249a6102c0890186856123e3565b94506124a8848c018c61237f565b945092506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089870301818a01526124e38686866123e3565b95506124f0878d0161170a565b96506101c0945061250c858a018867ffffffffffffffff169052565b612517828d016116e0565b96506101e0935061252f848a018863ffffffff169052565b6102009650808c0135878a01525050610220838b0135818901526102409350828b013584890152612561868c0161170a565b67ffffffffffffffff811689840152955061257d818c0161170a565b955050505061259961028086018467ffffffffffffffff169052565b6125a4818901611346565b9250506125b66102a085018315159052565b6001600160a01b038616602085015291506125ce9050565b6001600160a01b0383166040830152610549565b60006101e082840312156125f557600080fd5b6125fd611242565b61260683611d6b565b815261261460208401611d6b565b602082015261262560408401611d6b565b604082015261263660608401611d6b565b606082015261264760808401611d6b565b608082015261265860a08401611d6b565b60a082015261266960c08401611d6b565b60c082015261267a60e08401611d6b565b60e082015261010061268d818501611d6b565b9082015261012061269f848201611d6b565b908201526101406126b1848201611d6b565b908201526101606126c3848201611d6b565b908201526101806126d5848201611d6b565b908201526101a06126e7848201611d6b565b908201526101c0611ec3848201611d6b565b60006020828403121561270b57600080fd5b815161084881611338565b610100810161275d82866001600160a01b03808251168352602082015160208401526040820151604084015260608201516060840152806080830151166080840152505050565b83151560a083015282516001600160a01b0390811660c084015260208401511660e0830152610549565b6020808252825182820181905260009190848201906040850190845b818110156127e6576127d383855180516001600160a01b0316825260208082015190830152604090810151910152565b92840192606092909201916001016127a3565b50909695505050505050565b600060a0828403121561280457600080fd5b60405160a0810181811067ffffffffffffffff82111715612827576128276111a2565b604052825161283581611297565b8152602083015161284581611297565b6020820152604083015161285881611297565b6040820152606083015161286b81611297565b6060820152608083015161287e81611297565b60808201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156127e6576128d683855180516001600160a01b0316825260208082015190830152604090810151910152565b92840192606092909201916001016128a6565b60c0810161292f82856001600160a01b03808251168352602082015160208401526040820151604084015260608201516060840152806080830151166080840152505050565b82151560a08301529392505050565b600082516129508184602087016113da565b919091019291505056fea164736f6c634300080f000a"; + bytes internal constant addressManagerCode = + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a"; + bytes internal constant proxyAdminCode = + hex"60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant l1ERC721BridgeProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant optimismPortalProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant eTHLockboxProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant systemConfigProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant optimismMintableERC20FactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant disputeGameFactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant anchorStateRegistryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant l1StandardBridgeProxyCode = + hex"60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a"; + bytes internal constant l1CrossDomainMessengerProxyCode = + hex"608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant permissionedDelayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; +} diff --git a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh index 8a7646a0b46..35f7329008e 100755 --- a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh +++ b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh @@ -55,9 +55,11 @@ fi # Sender just needs to be anything but the default sender (0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38) # Otherwise state changes inside of Deploy.s.sol get stored in the state diff under the default script address (0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496) # Conflicts with other stuff that happens inside of Kontrol and leads to errors that are hard to debug +# +# Note: --gas-limit set to uint64 max (2^64-1) to avoid MemoryLimitOOG errors. DEPLOY_CONFIG_PATH=deploy-config/hardhat.json \ DEPLOYMENT_OUTFILE="$CONTRACT_NAMES" \ - forge script --sender 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 -vvv scripts/deploy/Deploy.s.sol:Deploy --sig runWithStateDiff + forge script --sender 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --gas-limit 18446744073709551615 -vvv scripts/deploy/Deploy.s.sol:Deploy --sig runWithStateDiff echo "Created state diff json" # Clean and store the state diff json in snapshots/state-diff/Kontrol-Deploy.json diff --git a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol index 8ac0b7b01f5..60f99bf41f0 100644 --- a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol +++ b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol @@ -89,15 +89,7 @@ contract SafeCall_Send_Test is SafeCall_TestInit { /// @notice Tests the `call` function of the `SafeCall` contract. contract SafeCall_Call_Test is SafeCall_TestInit { /// @notice Tests that `call` succeeds. - function testFuzz_call_succeeds( - address from, - address to, - uint256 gas, - uint64 value, - bytes memory data - ) - external - { + function testFuzz_call_succeeds(address from, address to, uint256 gas, uint64 value, bytes memory data) external { assumeNot(from); assumeNot(to); @@ -164,7 +156,7 @@ contract SafeCall_CallWithMinGas_Test is SafeCall_TestInit { SimpleSafeCaller caller = new SimpleSafeCaller(); for (uint64 i = 40_000; i < 100_000; i++) { - uint256 snapshot = vm.snapshot(); + uint256 snapshot = vm.snapshotState(); // The values below are best gotten by setting the value to a high number and running // the test with a verbosity of `-vvv` then setting the value to the value (gas arg) of @@ -179,7 +171,7 @@ contract SafeCall_CallWithMinGas_Test is SafeCall_TestInit { // first so that it recompiles the contracts using the foundry.toml optimizer settings. if (vm.isContext(VmSafe.ForgeContext.Coverage) || LibString.eq(Config.foundryProfile(), "lite")) { // 66_290 is the exact amount of gas required to make the safe call - // successfully with the optimizer disabled (ran via forge coverage) + // successfully with the optimizer disabled (Foundry 1.4.3+) expected = 66_290; } else if (vm.isContext(VmSafe.ForgeContext.Test) || vm.isContext(VmSafe.ForgeContext.Snapshot)) { // 65_922 is the exact amount of gas required to make the safe call @@ -196,7 +188,7 @@ contract SafeCall_CallWithMinGas_Test is SafeCall_TestInit { assertTrue(caller.makeSafeCall(i, 25_000)); } - assertTrue(vm.revertTo(snapshot)); + assertTrue(vm.revertToState(snapshot)); } } @@ -205,7 +197,7 @@ contract SafeCall_CallWithMinGas_Test is SafeCall_TestInit { SimpleSafeCaller caller = new SimpleSafeCaller(); for (uint64 i = 15_200_000; i < 15_300_000; i++) { - uint256 snapshot = vm.snapshot(); + uint256 snapshot = vm.snapshotState(); // The values below are best gotten by setting the value to a high number and running // the test with a verbosity of `-vvv` then setting the value to the value (gas arg) of @@ -237,7 +229,7 @@ contract SafeCall_CallWithMinGas_Test is SafeCall_TestInit { assertTrue(caller.makeSafeCall(i, 15_000_000)); } - assertTrue(vm.revertTo(snapshot)); + assertTrue(vm.revertToState(snapshot)); } } } From 97fb224172b46ae59f2ae10b3549e93839d8b896 Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Fri, 23 Jan 2026 18:21:08 +0100 Subject: [PATCH 4/7] fixes --- packages/contracts-bedrock/foundry.toml | 8 +- .../snapshots/semver-lock.json | 4 +- .../test/L2/CrossL2Inbox.t.sol | 7 +- .../utils/DeploymentSummaryFaultProofs.sol | 1118 ++++++++++++++++- .../DeploymentSummaryFaultProofsCode.sol | 100 +- .../scripts/make-summary-deployment.sh | 4 +- .../test/libraries/SafeCall.t.sol | 11 +- 7 files changed, 1233 insertions(+), 19 deletions(-) diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index 77258766d04..4e5ffdb6b5a 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -1,5 +1,5 @@ ################################################################ -# PROFILE: DEFAULT (local) # +# PROFILE: DEFjusLT (local) # ################################################################ [profile.default] @@ -77,9 +77,6 @@ ignored_error_codes = ["transient-storage", "code-size", "init-code-size", "too- deny = "warnings" ffi = true -[lint] -exclude_lints = ["mixed-case-function", "unsafe-typecast", "asm-keccak256", "screaming-snake-case-immutable", "mixed-case-variable", "divide-before-multiply", "unaliased-plain-import", "screaming-snake-case-const", "unsafe-cheatcode", "erc20-unchecked-transfer", "unaliased-plain-import", "named-struct-fields", "incorrect-shift", "unchecked-call", "unwrapped-modifier-logic", "unwrapped-modifier-logic", "pascal-case-struct", "unused-import"] - # We set the gas limit to max int64 to avoid running out of gas during testing, since the default # gas limit is 1B and some of our tests require more gas than that, such as # test_callWithMinGas_noLeakageLow_succeeds. We use this gas limit since it was the default gas @@ -87,6 +84,9 @@ exclude_lints = ["mixed-case-function", "unsafe-typecast", "asm-keccak256", "scr # you increase the gas limit above this value it must be a string. gas_limit = 9223372036854775807 +[lint] +exclude_lints = ["mixed-case-function", "unsafe-typecast", "asm-keccak256", "screaming-snake-case-immutable", "mixed-case-variable", "divide-before-multiply", "unaliased-plain-import", "screaming-snake-case-const", "unsafe-cheatcode", "erc20-unchecked-transfer", "unaliased-plain-import", "named-struct-fields", "incorrect-shift", "unchecked-call", "unwrapped-modifier-logic", "unwrapped-modifier-logic", "pascal-case-struct", "unused-import"] + [fuzz] runs = 64 diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index 550a3ec7154..e885312a3aa 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -28,8 +28,8 @@ "sourceCodeHash": "0x93bfc83fde2199feba8394782c7c98b47d3f96849425ab692f9d6b07ab9db2dc" }, "src/L1/OPContractsManagerStandardValidator.sol:OPContractsManagerStandardValidator": { - "initCodeHash": "0x49f1cd40b5545d345c65d56a7cdbd29b44feb545ea8cb1e8d7a78c8ad4371b46", - "sourceCodeHash": "0x182a0a1041b6d9b04827ea607b6cdffaef8386a1ff35c38c0fa0e1327c0b7066" + "initCodeHash": "0xccedabc7466a3682a885bc6ebaa58ca6c3b6cb28d40b13b69ba55f0c743d116b", + "sourceCodeHash": "0x058b42bcf3cb9a2d0abf3e3c3aa952f1c0204a181561e5ecab81cf20b55a616e" }, "src/L1/OptimismPortal2.sol:OptimismPortal2": { "initCodeHash": "0xe618d22151e72b7b0d91467a6b197a2da3a5c2bc91e6967220135885f672d0b5", diff --git a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol index 496536031bf..6be13923e96 100644 --- a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol +++ b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol @@ -176,7 +176,12 @@ contract CrossL2Inbox_ValidateMessage_Test is CrossL2Inbox_TestInit { /// @notice Test that a valid tx calling `validateMessage` doesn't warm the slot for the next /// one. /// forge-config: default.isolate = true - function test_validateMessage_validDoesntWarm_reverts(Identifier memory _id, bytes32 _messageHash) external { + function test_validateMessage_validDoesntWarm_reverts( + Identifier memory _id, + bytes32 _messageHash + ) + external + { // Bound values types to ensure they are not too large _id.blockNumber = bound(_id.blockNumber, 0, type(uint64).max); _id.logIndex = bound(_id.logIndex, 0, type(uint32).max); diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol index b502f2b2167..91be87e4518 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol @@ -8,14 +8,1120 @@ import { Vm } from "forge-std/Vm.sol"; import { DeploymentSummaryFaultProofsCode } from "./DeploymentSummaryFaultProofsCode.sol"; contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { + // Test contract address, 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 + address private constant FOUNDRY_TEST_ADDRESS = 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496; // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm private constant vm = Vm(VM_ADDRESS); - // Addresses required for compilation to work. - address l1CrossDomainMessengerProxyAddress; - address superchainConfigProxyAddress; - address l1ERC721BridgeProxyAddress; - address l1StandardBridgeProxyAddress; - address optimismPortalProxyAddress; + address internal constant addressManagerAddress = 0xD7C8F982D3046421e3865F94004dca5D6142D9AE; + address internal constant anchorStateRegistryProxyAddress = 0x70E5a9b91ef26C70E6F5D9576133dD232a86D75E; + address internal constant delayedWETHImplAddress = 0x33Dadc2d1aA9BB613A7AE6B28425eA00D44c6998; + address internal constant delayedWETHProxyAddress = 0x4a008893b348986DFCfb875Fe62e45Fd9f683142; + address internal constant disputeGameFactoryProxyAddress = 0x7b47157a2B688900b19Ee8f32129E1A032Df4538; + address internal constant eTHLockboxProxyAddress = 0x7163DF3b04d259eaCD820740E2F84e5fb9E69419; + address internal constant l1CrossDomainMessengerProxyAddress = 0x170315d0792cFcb97c096C20bB78e8B3F6004f74; + address internal constant l1ERC721BridgeProxyAddress = 0x8c8Cb1491de8E27427e2fbfd00cA091196a3D8fd; + address internal constant l1StandardBridgeProxyAddress = 0x415f79B5a2Cd916F24f112bFFadE3cDD5CA90610; + address internal constant mipsSingletonAddress = 0xaCc005DCd857B401e4732E6F7837135A22825cfA; + address internal constant oPContractsManagerAddress = 0xC46652b373bA85D829a53a74f78b54F047c8209A; + address internal constant optimismMintableERC20FactoryProxyAddress = 0x7f3FEE1c10a2607E24433c1C6474277Befb3CCF2; + address internal constant optimismPortalProxyAddress = 0xC386dEC86d0d4c3a908B4fBf788b666f20eF20dF; + address internal constant permissionedDelayedWETHProxyAddress = 0xbc00a6a65C2C3ccBB1C6647E266cfdE6f5103f07; + address internal constant permissionedDisputeGameAddress = 0xe1dFFCBE4e22B813F26d2106D943C102e7cAb87e; + address internal constant preimageOracleAddress = 0x1E1d73536A081Ef2F355d29794547a9770Aeb1E0; + address internal constant protocolVersionsImplAddress = 0x15f5edb697F980b637470AE92ba12d9EFc72A26b; + address internal constant protocolVersionsProxyAddress = 0x856e75e9c0Da547F9753c17746D6cc139b668e5c; + address internal constant proxyAdminAddress = 0xc3C08D9b183a7EEa2e9DCbc17764D502bB22aBf1; + address internal constant superchainConfigImplAddress = 0xb08Cc720F511062537ca78BdB0AE691F04F5a957; + address internal constant superchainConfigProxyAddress = 0xDc82c0362A241Aa94d53546648EACe48C9773dAa; + address internal constant superchainProxyAdminAddress = 0xdaE97900D4B184c5D2012dcdB658c008966466DD; + address internal constant systemConfigProxyAddress = 0xcfFa31d1926A1e4bfA3c2A335A28544708D2753E; + address internal constant acc23Address = 0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141; + address internal constant acc24Address = 0x36AE6478b51dafc694d56394478343C7EcfEDFb1; + address internal constant acc25Address = 0xdad56314AbA81676e2d5826fb72B2168141c0A60; + address internal constant acc26Address = 0x83A2dF4B23236DCCc59a67d289Cd5163190213ea; + address internal constant acc27Address = 0x59D497530b00062f40950ba8EaB88868bf7F86f0; + address internal constant acc28Address = 0x9F164f1d02A81e06D639E55F65a87f0070E3Cb2e; + address internal constant acc29Address = 0x6b46FCAd8279829b6E5Ba69FfD7BF210C0bf568c; + address internal constant acc30Address = 0x8ee6fB13c6c9a7e401531168E196Fbf8b05cEabB; + address internal constant acc31Address = 0xbD5A941bD30EA2438B5957660adbe1eD427993eF; + address internal constant acc32Address = 0xed8fb0c36658458D33cE07e5E00AF138874fDd3d; + address internal constant acc33Address = 0x784d2F03593A42A6E4676A012762F18775ecbBe6; + address internal constant acc34Address = 0x16622ea0ce0eA05c5B7B050AC7c5d0d2eE4F557E; + address internal constant acc35Address = 0x01347e02CDB6a7cAAeAfB8e277E4b42Aa4Bd7dF1; + address internal constant acc36Address = 0xfAEde1fA7Cb0a650393D5FdCa823e83Db3C9763e; + address internal constant acc37Address = 0x2476c911E6D4D9411E677D8Faf15a64ac1fDEEe8; + address internal constant acc38Address = 0x765c6637a370595845F637739279C353484a26A6; + address internal constant acc39Address = 0xA643EA8ee60D92f615eC70AF0248c449bBCEcF4d; + address internal constant acc40Address = 0x2Fa0D0f6d92061344Db35132379dB419bD1c56f7; + address internal constant acc41Address = 0xA5d36DEaf2267B267278a4a1458deFe0d65620eb; + address internal constant acc42Address = 0x7096758bDD076a4cC42255c278F2Cb216D6D8ce3; + address internal constant acc43Address = 0x15dDc82A2AAA23D6f631dec6a61949CB5cBF272b; + address internal constant acc44Address = 0x50E6088d25b5d7f41548D99F39Ba1c21bD4cE999; + address internal constant acc45Address = 0x1d4F0EF0eFD3Aad2B687353108667E7bD3B53bDf; + address internal constant acc46Address = 0xbd793b2B8eCa7735FfCF813c7a364e124d6EdDec; + address internal constant acc47Address = 0x470D27d713C38cB156701E6686F31e259a66aB3e; + address internal constant acc48Address = 0xAe7945920ED1C49579Aa3bfD50b11C1cd06545c9; + + function recreateState() public { + bytes32 slot; + bytes32 value; + vm.etch(acc23Address, acc23Code); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"0000000000000000000000000000000000000000000000000000000000010001"; + vm.store(acc23Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"89fca2352a158519d2daabf7e53686272e828ddbff9487204546d918490b2ecf"; + vm.store(acc23Address, slot, value); + vm.etch(superchainProxyAdminAddress, superchainProxyAdminCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000005b73c5498c1e3b4dba84de0f1833c4a029d90519"; + vm.store(superchainProxyAdminAddress, slot, value); + vm.etch(superchainConfigImplAddress, superchainConfigImplCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(superchainConfigImplAddress, slot, value); + vm.etch(protocolVersionsImplAddress, protocolVersionsImplCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(protocolVersionsImplAddress, slot, value); + vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000102"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0102"; + vm.store(superchainConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0002"; + vm.store(superchainConfigProxyAddress, slot, value); + vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"e314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(protocolVersionsProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(superchainProxyAdminAddress, slot, value); + slot = hex"24b65a6f94e32e259509ee2e63dc87d4fcbf36618c0b8609629e310e9a3fd0d5"; + value = hex"5375706572636861696e50726f787941646d696e000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"24b65a6f94e32e259509ee2e63dc87d4fcbf36618c0b8609629e310e9a3fd0d6"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6"; + value = hex"5375706572636861696e50726f787941646d696e000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7"; + value = hex"000000000000000000000000dae97900d4b184c5d2012dcdb658c008966466dd"; + vm.store(acc24Address, slot, value); + slot = hex"591eccd4639f012ad8640a57d585dea9e277ac0640d959411a3ae106d20f3f84"; + value = hex"5375706572636861696e436f6e66696750726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"591eccd4639f012ad8640a57d585dea9e277ac0640d959411a3ae106d20f3f85"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000002"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8"; + value = hex"5375706572636861696e436f6e66696750726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(acc24Address, slot, value); + slot = hex"59a10b4dcbfb6ed449f532fedb1613a8048a04e68786a4fbd792e30f8d5996c2"; + value = hex"5375706572636861696e436f6e666967496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"59a10b4dcbfb6ed449f532fedb1613a8048a04e68786a4fbd792e30f8d5996c3"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa"; + value = hex"5375706572636861696e436f6e666967496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfb"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(acc24Address, slot, value); + slot = hex"4d64f9a7b7f12fbbc6661e5cac85a76d68f9b9df6c166dbdb20968c4898cea2f"; + value = hex"50726f746f636f6c56657273696f6e7350726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"4d64f9a7b7f12fbbc6661e5cac85a76d68f9b9df6c166dbdb20968c4898cea30"; + value = hex"000000000000000000000000856e75e9c0da547f9753c17746d6cc139b668e5c"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000004"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfc"; + value = hex"50726f746f636f6c56657273696f6e7350726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfd"; + value = hex"000000000000000000000000856e75e9c0da547f9753c17746d6cc139b668e5c"; + vm.store(acc24Address, slot, value); + slot = hex"15ef12e33baecb5fcf038017416c0c7a250c3264d4209492a6155f738516695b"; + value = hex"50726f746f636f6c56657273696f6e73496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"15ef12e33baecb5fcf038017416c0c7a250c3264d4209492a6155f738516695c"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000005"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfe"; + value = hex"50726f746f636f6c56657273696f6e73496d706c000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cff"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(acc24Address, slot, value); + vm.etch(acc25Address, acc25Code); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"0000000000000000000000000000000000000000000000000000000000010001"; + vm.store(acc25Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"89fca2352a158519d2daabf7e53686272e828ddbff9487204546d918490b2ecf"; + vm.store(acc25Address, slot, value); + vm.etch(acc26Address, acc26Code); + slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; + value = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + vm.store(acc26Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc26Address, slot, value); + vm.etch(acc27Address, acc27Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000ff0000000000000000000000000000000000000000"; + vm.store(acc27Address, slot, value); + vm.etch(acc28Address, acc28Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc28Address, slot, value); + vm.etch(acc29Address, acc29Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc29Address, slot, value); + vm.etch(acc30Address, acc30Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc30Address, slot, value); + vm.etch(acc31Address, acc31Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc31Address, slot, value); + vm.etch(acc32Address, acc32Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc32Address, slot, value); + vm.etch(acc33Address, acc33Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc33Address, slot, value); + vm.etch(delayedWETHImplAddress, delayedWETHImplCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(delayedWETHImplAddress, slot, value); + vm.etch(preimageOracleAddress, preimageOracleCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000e"; + value = hex"f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000f"; + value = hex"3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000010"; + value = hex"c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000011"; + value = hex"5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc"; + vm.store(preimageOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000012"; + value = hex"da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2"; + vm.store(preimageOracleAddress, slot, value); + vm.etch(mipsSingletonAddress, mipsSingletonCode); + vm.etch(acc34Address, acc34Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc34Address, slot, value); + vm.etch(acc35Address, acc35Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(acc35Address, slot, value); + vm.etch(acc36Address, acc36Code); + vm.etch(permissionedDisputeGameAddress, permissionedDisputeGameCode); + vm.etch(acc37Address, acc37Code); + vm.etch(acc38Address, acc38Code); + vm.etch(acc39Address, acc39Code); + vm.etch(acc40Address, acc40Code); + vm.etch(acc41Address, acc41Code); + vm.etch(acc42Address, acc42Code); + vm.etch(acc43Address, acc43Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000000000765c6637a370595845f637739279c353484a26a6"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000a643ea8ee60d92f615ec70af0248c449bbcecf4d"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000002fa0d0f6d92061344db35132379db419bd1c56f7"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"000000000000000000000000a5d36deaf2267b267278a4a1458defe0d65620eb"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000007096758bdd076a4cc42255c278f2cb216d6d8ce3"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000b08cc720f511062537ca78bdb0ae691f04f5a957"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"00000000000000000000000015f5edb697f980b637470ae92ba12d9efc72a26b"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"0000000000000000000000009f164f1d02a81e06d639e55f65a87f0070e3cb2e"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"000000000000000000000000bd5a941bd30ea2438b5957660adbe1ed427993ef"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"000000000000000000000000ed8fb0c36658458d33ce07e5e00af138874fdd3d"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"000000000000000000000000784d2f03593a42a6e4676a012762f18775ecbbe6"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"00000000000000000000000083a2df4b23236dccc59a67d289cd5163190213ea"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"0000000000000000000000008ee6fb13c6c9a7e401531168e196fbf8b05ceabb"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"00000000000000000000000059d497530b00062f40950ba8eab88868bf7f86f0"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000e"; + value = hex"0000000000000000000000006b46fcad8279829b6e5ba69ffd7bf210c0bf568c"; + vm.store(acc43Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000f"; + value = hex"00000000000000000000000016622ea0ce0ea05c5b7b050ac7c5d0d2ee4f557e"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000010"; + value = hex"00000000000000000000000001347e02cdb6a7caaeafb8e277e4b42aa4bd7df1"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000011"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000012"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000013"; + value = hex"000000000000000000000000faede1fa7cb0a650393d5fdca823e83db3c9763e"; + vm.store(acc43Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000014"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc43Address, slot, value); + vm.etch(acc44Address, acc44Code); + vm.etch(acc45Address, acc45Code); + vm.etch(acc46Address, acc46Code); + vm.etch(acc47Address, acc47Code); + vm.etch(acc48Address, acc48Code); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000009ba6e03d8b90de867373db8cf1a58d2f7f006b3a"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"0000000000000000000000000000000000000000000000000000000000049d40"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000009f164f1d02a81e06d639e55f65a87f0070e3cb2e"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000bd5a941bd30ea2438b5957660adbe1ed427993ef"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"000000000000000000000000ed8fb0c36658458d33ce07e5e00af138874fdd3d"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"000000000000000000000000784d2f03593a42a6e4676a012762f18775ecbbe6"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"00000000000000000000000083a2df4b23236dccc59a67d289cd5163190213ea"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"0000000000000000000000008ee6fb13c6c9a7e401531168e196fbf8b05ceabb"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"00000000000000000000000059d497530b00062f40950ba8eab88868bf7f86f0"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"0000000000000000000000006b46fcad8279829b6e5ba69ffd7bf210c0bf568c"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"00000000000000000000000016622ea0ce0ea05c5b7b050ac7c5d0d2ee4f557e"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000d"; + value = hex"00000000000000000000000001347e02cdb6a7caaeafb8e277e4b42aa4bd7df1"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000e"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc48Address, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000000f"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000010"; + value = hex"000000000000000000000000faede1fa7cb0a650393d5fdca823e83db3c9763e"; + vm.store(acc48Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000011"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc48Address, slot, value); + vm.etch(oPContractsManagerAddress, oPContractsManagerCode); + slot = hex"3179a0ca1decdc6d32acfd94d2e8f02773d53221a36b0601c73ccf869885fd4a"; + value = hex"4d69707353696e676c65746f6e0000000000000000000000000000000000001a"; + vm.store(acc24Address, slot, value); + slot = hex"3179a0ca1decdc6d32acfd94d2e8f02773d53221a36b0601c73ccf869885fd4b"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000006"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d00"; + value = hex"4d69707353696e676c65746f6e0000000000000000000000000000000000001a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d01"; + value = hex"000000000000000000000000acc005dcd857b401e4732e6f7837135a22825cfa"; + vm.store(acc24Address, slot, value); + slot = hex"f586326a6f1afdf1a636f2ea023473af4bd79fefd4568d11d98c4859835b608d"; + value = hex"4f50436f6e7472616374734d616e616765720000000000000000000000000024"; + vm.store(acc24Address, slot, value); + slot = hex"f586326a6f1afdf1a636f2ea023473af4bd79fefd4568d11d98c4859835b608e"; + value = hex"000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000007"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d02"; + value = hex"4f50436f6e7472616374734d616e616765720000000000000000000000000024"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d03"; + value = hex"000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a"; + vm.store(acc24Address, slot, value); + slot = hex"763d0244a224d2fe2f7afc03ef2a0f29c2623e29cf918c8ea4f8f001f1e9f270"; + value = hex"44656c6179656457455448496d706c000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"763d0244a224d2fe2f7afc03ef2a0f29c2623e29cf918c8ea4f8f001f1e9f271"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000008"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d04"; + value = hex"44656c6179656457455448496d706c000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d05"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(acc24Address, slot, value); + slot = hex"81a67250c04810b4a94bf59594aa24659b3142b00d4efc51b42543c27a7080e2"; + value = hex"507265696d6167654f7261636c6500000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"81a67250c04810b4a94bf59594aa24659b3142b00d4efc51b42543c27a7080e3"; + value = hex"0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e0"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000009"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d06"; + value = hex"507265696d6167654f7261636c6500000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d07"; + value = hex"0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e0"; + vm.store(acc24Address, slot, value); + slot = hex"04e885518edc9038cab70e8d01c71a66bb227510061876ec8fcedf9d2cce258b"; + value = hex"5065726d697373696f6e65644469737075746547616d6500000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"04e885518edc9038cab70e8d01c71a66bb227510061876ec8fcedf9d2cce258c"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d08"; + value = hex"5065726d697373696f6e65644469737075746547616d6500000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d09"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(acc24Address, slot, value); + vm.etch(addressManagerAddress, addressManagerCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf"; + vm.store(addressManagerAddress, slot, value); + vm.etch(proxyAdminAddress, proxyAdminCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(addressManagerAddress, slot, value); + vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(optimismPortalProxyAddress, slot, value); + vm.etch(eTHLockboxProxyAddress, eTHLockboxProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(eTHLockboxProxyAddress, slot, value); + vm.etch(systemConfigProxyAddress, systemConfigProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(systemConfigProxyAddress, slot, value); + vm.etch(optimismMintableERC20FactoryProxyAddress, optimismMintableERC20FactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"d5538c794ce822f6578b51c514c1b5ad06a97c668cc0ea8b0d07e819badefe30"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(proxyAdminAddress, slot, value); + vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); + slot = hex"5c7ab8a0ff7087593461c3ba36cab4ce7c54b6c55334a7423a6e51d3606241f0"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"5ef907e431434b7fd9a5cf449bcbee1a430332ea5c05c55046fdd83dd8f57e1d"; + value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"5c7ab8a0ff7087593461c3ba36cab4ce7c54b6c55334a7423a6e51d3606241f0"; + value = hex"0000000000000000000000000000000000000000000000000000000000000002"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"891a9c7123617dc64d16604163be207a669607334ef9a2d03e53cfcdb82236d1"; + value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; + vm.store(proxyAdminAddress, slot, value); + vm.etch(permissionedDelayedWETHProxyAddress, permissionedDelayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000009f164f1d02a81e06d639e55f65a87f0070e3cb2e"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000004200000000000000000000000000000000000014"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(l1ERC721BridgeProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000083a2df4b23236dccc59a67d289cd5163190213ea"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000067"; + value = hex"0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"00000000000000000000000000000000000c5fc5000005580000000000000000"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000066"; + value = hex"010000000000000000000000000000000000000000000000000c5fc500000558"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"00000000000000000000000000000000000c5fc50000055800000000017d7840"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597"; + value = hex"00000000000000000000000000289c189bee4e70334629f04cd5ed602b6600eb"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; + value = hex"0000000000000000000000008c8cb1491de8e27427e2fbfd00ca091196a3d8fd"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"a04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"; + value = hex"0000000000000000000000007f3fee1c10a2607e24433c1c6474277befb3ccf2"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000069"; + value = hex"0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000006b"; + value = hex"0000000000000000000000000000000000000000000000000000000000000385"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000006c"; + value = hex"000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000bd5a941bd30ea2438b5957660adbe1ed427993ef"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"000000000000000000000000000000000000000000000000000000000000003e"; + value = hex"00000000000000000000000070e5a9b91ef26c70e6f5d9576133dd232a86d75e"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000100000000000000000000000000000000000000003b9aca00"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000784d2f03593a42a6e4676a012762f18775ecbbe6"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0101"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"d978247ca0ca005a84d2c405b59bb67f19596a91cd35fed7e4f281becc4fbd9e"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0001"; + vm.store(eTHLockboxProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000008ee6fb13c6c9a7e401531168e196fbf8b05ceabb"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"; + value = hex"00000000000000000000000059d497530b00062f40950ba8eab88868bf7f86f0"; + vm.store(addressManagerAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000001030000000000000000000000000000000000000000"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000fe"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"00000000000000000000000000000000000000000000000000000000000000cf"; + value = hex"0000000000000000000000004200000000000000000000000000000000000007"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000030000000000000000000000000000000000000000"; + vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000006b46fcad8279829b6e5ba69ffd7bf210c0bf568c"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000103"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000034"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000004200000000000000000000000000000000000010"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(l1StandardBridgeProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000016622ea0ce0ea05c5b7b050ac7c5d0d2ee4f557e"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; + value = hex"000000000000000000000000e1dffcbe4e22b813f26d2106d943c102e7cab87e"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa7d"; + value = hex"acc005dcd857b401e4732e6f7837135a22825cfa70e5a9b91ef26c70e6f5d957"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa7e"; + value = hex"6133dd232a86d75ebc00a6a65c2c3ccbb1c6647e266cfde6f5103f0700000000"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa7f"; + value = hex"0000000000000000000000000000000000000000000000000000038570997970"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa80"; + value = hex"c51812dc3a010c7d01b50e0d17dc79c89ba6e03d8b90de867373db8cf1a58d2f"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"9afb513dc3306e3bc370fea0bac86eaae93221c831ccaae670c9d4101fb0fa81"; + value = hex"7f006b3a00000000000000000000000000000000000000000000000000000000"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"c073f36c05b6a60b24c30a48974b549770d8fa354751fb3170c9dfd8ca536add"; + value = hex"0000000000000000000000000000000000000000000000000000000000000149"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000001347e02cdb6a7caaeafb8e277e4b42aa4bd7df1"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0101"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000007b47157a2b688900b19ee8f32129e1a032df4538"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000100000001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"00000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e0001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; + vm.store(proxyAdminAddress, slot, value); + slot = hex"4db57451e2a8fd1712043520adfae22d5f9123e7cdc211ef2ea3c2f9f9432973"; + value = hex"50726f787941646d696e00000000000000000000000000000000000000000014"; + vm.store(acc24Address, slot, value); + slot = hex"4db57451e2a8fd1712043520adfae22d5f9123e7cdc211ef2ea3c2f9f9432974"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000b"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0a"; + value = hex"50726f787941646d696e00000000000000000000000000000000000000000014"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0b"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(acc24Address, slot, value); + slot = hex"00623c73290f616137607214ed44adf88e2053b38076d1558bab870c725fb370"; + value = hex"416464726573734d616e6167657200000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"00623c73290f616137607214ed44adf88e2053b38076d1558bab870c725fb371"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000c"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0c"; + value = hex"416464726573734d616e6167657200000000000000000000000000000000001c"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0d"; + value = hex"000000000000000000000000d7c8f982d3046421e3865f94004dca5d6142d9ae"; + vm.store(acc24Address, slot, value); + slot = hex"b11fe4393d0477ff7d66a7c8fbc34405cdc12fe580a2fe06c7aa22f30fcbbff2"; + value = hex"4c3145524337323142726964676550726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"b11fe4393d0477ff7d66a7c8fbc34405cdc12fe580a2fe06c7aa22f30fcbbff3"; + value = hex"0000000000000000000000008c8cb1491de8e27427e2fbfd00ca091196a3d8fd"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000d"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0e"; + value = hex"4c3145524337323142726964676550726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d0f"; + value = hex"0000000000000000000000008c8cb1491de8e27427e2fbfd00ca091196a3d8fd"; + vm.store(acc24Address, slot, value); + slot = hex"803db4bb13eb6384a6d480b8b5b2e44b42a6c56fde7615abab2aff349f5b8f97"; + value = hex"53797374656d436f6e66696750726f7879000000000000000000000000000022"; + vm.store(acc24Address, slot, value); + slot = hex"803db4bb13eb6384a6d480b8b5b2e44b42a6c56fde7615abab2aff349f5b8f98"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d10"; + value = hex"53797374656d436f6e66696750726f7879000000000000000000000000000022"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d11"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(acc24Address, slot, value); + slot = hex"e973345d9cd4152a12364c797bf4520ba340cc9a0bc0cd102d97b563669e0bee"; + value = hex"4f7074696d69736d4d696e7461626c654552433230466163746f727950726f78"; + vm.store(acc24Address, slot, value); + slot = hex"e973345d9cd4152a12364c797bf4520ba340cc9a0bc0cd102d97b563669e0bef"; + value = hex"7900000000000000000000000000000000000000000000000000000000000000"; + vm.store(acc24Address, slot, value); + slot = hex"7102cb4490810454919e77f2c535d732744edb7efecdbb0c076b63709e481a95"; + value = hex"0000000000000000000000000000000000000000000000000000000000000043"; + vm.store(acc24Address, slot, value); + slot = hex"7102cb4490810454919e77f2c535d732744edb7efecdbb0c076b63709e481a96"; + value = hex"0000000000000000000000007f3fee1c10a2607e24433c1c6474277befb3ccf2"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000000000000000000000000000000000000000000000000000f"; + vm.store(acc24Address, slot, value); + slot = hex"285306a5e178e53755c7321490a9e06978263cea459835e51b2e59fc11dff695"; + value = hex"4f7074696d69736d4d696e7461626c654552433230466163746f727950726f78"; + vm.store(acc24Address, slot, value); + slot = hex"285306a5e178e53755c7321490a9e06978263cea459835e51b2e59fc11dff696"; + value = hex"7900000000000000000000000000000000000000000000000000000000000000"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d12"; + value = hex"0000000000000000000000000000000000000000000000000000000000000043"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d13"; + value = hex"0000000000000000000000007f3fee1c10a2607e24433c1c6474277befb3ccf2"; + vm.store(acc24Address, slot, value); + slot = hex"73dfdd808bf7d29fb129ecf39295db3b0b0e93836c00329ea8af1cc6a784742f"; + value = hex"4c315374616e6461726442726964676550726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"73dfdd808bf7d29fb129ecf39295db3b0b0e93836c00329ea8af1cc6a7847430"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000010"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d14"; + value = hex"4c315374616e6461726442726964676550726f7879000000000000000000002a"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d15"; + value = hex"000000000000000000000000415f79b5a2cd916f24f112bffade3cdd5ca90610"; + vm.store(acc24Address, slot, value); + slot = hex"03fcfa916057ab121cac44d6c0a435ed5ee381f0635d8b1698c62504e41f4e50"; + value = hex"4c3143726f7373446f6d61696e4d657373656e67657250726f78790000000036"; + vm.store(acc24Address, slot, value); + slot = hex"03fcfa916057ab121cac44d6c0a435ed5ee381f0635d8b1698c62504e41f4e51"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000011"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d16"; + value = hex"4c3143726f7373446f6d61696e4d657373656e67657250726f78790000000036"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d17"; + value = hex"000000000000000000000000170315d0792cfcb97c096c20bb78e8b3f6004f74"; + vm.store(acc24Address, slot, value); + slot = hex"68926df76953e8b8e08cd96615b5cd7cc3a45a9feeb41b3e06808964497cbee4"; + value = hex"4554484c6f636b626f7850726f7879000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"68926df76953e8b8e08cd96615b5cd7cc3a45a9feeb41b3e06808964497cbee5"; + value = hex"0000000000000000000000007163df3b04d259eacd820740e2f84e5fb9e69419"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000012"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d18"; + value = hex"4554484c6f636b626f7850726f7879000000000000000000000000000000001e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d19"; + value = hex"0000000000000000000000007163df3b04d259eacd820740e2f84e5fb9e69419"; + vm.store(acc24Address, slot, value); + slot = hex"09f38a27c7957cca3b027811dc616db30165b04891f5d2148b2ef7deac0fc52c"; + value = hex"4469737075746547616d65466163746f727950726f787900000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"09f38a27c7957cca3b027811dc616db30165b04891f5d2148b2ef7deac0fc52d"; + value = hex"0000000000000000000000007b47157a2b688900b19ee8f32129e1a032df4538"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000013"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1a"; + value = hex"4469737075746547616d65466163746f727950726f787900000000000000002e"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1b"; + value = hex"0000000000000000000000007b47157a2b688900b19ee8f32129e1a032df4538"; + vm.store(acc24Address, slot, value); + slot = hex"5fa099aac7d9cc1721a97b45776bcc86b85d0464b4d63954a54b49a6fd7218d7"; + value = hex"5065726d697373696f6e656444656c617965645745544850726f787900000038"; + vm.store(acc24Address, slot, value); + slot = hex"5fa099aac7d9cc1721a97b45776bcc86b85d0464b4d63954a54b49a6fd7218d8"; + value = hex"000000000000000000000000bc00a6a65c2c3ccbb1c6647e266cfde6f5103f07"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000014"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1c"; + value = hex"5065726d697373696f6e656444656c617965645745544850726f787900000038"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1d"; + value = hex"000000000000000000000000bc00a6a65c2c3ccbb1c6647e266cfde6f5103f07"; + vm.store(acc24Address, slot, value); + slot = hex"3ff2c3a4aaefcd5a8f21d8ceeed5e53b3588ab49a0f13d39f472c3d6efc0f77b"; + value = hex"416e63686f725374617465526567697374727950726f78790000000000000030"; + vm.store(acc24Address, slot, value); + slot = hex"3ff2c3a4aaefcd5a8f21d8ceeed5e53b3588ab49a0f13d39f472c3d6efc0f77c"; + value = hex"00000000000000000000000070e5a9b91ef26c70e6f5d9576133dd232a86d75e"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000015"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1e"; + value = hex"416e63686f725374617465526567697374727950726f78790000000000000030"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d1f"; + value = hex"00000000000000000000000070e5a9b91ef26c70e6f5d9576133dd232a86d75e"; + vm.store(acc24Address, slot, value); + slot = hex"d2893c711d9d933c61935345c1de77b0227a76ebcba9aa921aa901830025e584"; + value = hex"4f7074696d69736d506f7274616c50726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"d2893c711d9d933c61935345c1de77b0227a76ebcba9aa921aa901830025e585"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000016"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d20"; + value = hex"4f7074696d69736d506f7274616c50726f787900000000000000000000000026"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d21"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + slot = hex"b72ba0f0ef225d34c9541d99d4a5fc750113e9c4dc4b083ce296ccf1ce138a80"; + value = hex"4f7074696d69736d506f7274616c3250726f7879000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b72ba0f0ef225d34c9541d99d4a5fc750113e9c4dc4b083ce296ccf1ce138a81"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000017"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d22"; + value = hex"4f7074696d69736d506f7274616c3250726f7879000000000000000000000028"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d23"; + value = hex"000000000000000000000000c386dec86d0d4c3a908b4fbf788b666f20ef20df"; + vm.store(acc24Address, slot, value); + vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"000000000000000000000000c3c08d9b183a7eea2e9dcbc17764d502bb22abf1"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"daa555fac5e0d2ed3354ca00a81a4ddb8fb8489fcc3164b97d871ee94e62d077"; + value = hex"44656c617965645745544850726f787900000000000000000000000000000020"; + vm.store(acc24Address, slot, value); + slot = hex"daa555fac5e0d2ed3354ca00a81a4ddb8fb8489fcc3164b97d871ee94e62d078"; + value = hex"0000000000000000000000004a008893b348986dfcfb875fe62e45fd9f683142"; + vm.store(acc24Address, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000018"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d24"; + value = hex"44656c617965645745544850726f787900000000000000000000000000000020"; + vm.store(acc24Address, slot, value); + slot = hex"b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0d25"; + value = hex"0000000000000000000000004a008893b348986dfcfb875fe62e45fd9f683142"; + vm.store(acc24Address, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000033dadc2d1aa9bb613a7ae6b28425ea00d44c6998"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"000000000000000000000000cffa31d1926a1e4bfa3c2a335a28544708d2753e"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000100000000"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + } + + function _notExternalAddress(address user) public pure { + vm.assume(user != FOUNDRY_TEST_ADDRESS); + vm.assume(user != VM_ADDRESS); + vm.assume(user != addressManagerAddress); + vm.assume(user != anchorStateRegistryProxyAddress); + vm.assume(user != delayedWETHImplAddress); + vm.assume(user != delayedWETHProxyAddress); + vm.assume(user != disputeGameFactoryProxyAddress); + vm.assume(user != eTHLockboxProxyAddress); + vm.assume(user != l1CrossDomainMessengerProxyAddress); + vm.assume(user != l1ERC721BridgeProxyAddress); + vm.assume(user != l1StandardBridgeProxyAddress); + vm.assume(user != mipsSingletonAddress); + vm.assume(user != oPContractsManagerAddress); + vm.assume(user != optimismMintableERC20FactoryProxyAddress); + vm.assume(user != optimismPortalProxyAddress); + vm.assume(user != permissionedDelayedWETHProxyAddress); + vm.assume(user != permissionedDisputeGameAddress); + vm.assume(user != preimageOracleAddress); + vm.assume(user != protocolVersionsImplAddress); + vm.assume(user != protocolVersionsProxyAddress); + vm.assume(user != proxyAdminAddress); + vm.assume(user != superchainConfigImplAddress); + vm.assume(user != superchainConfigProxyAddress); + vm.assume(user != superchainProxyAdminAddress); + vm.assume(user != systemConfigProxyAddress); + vm.assume(user != acc23Address); + vm.assume(user != acc24Address); + vm.assume(user != acc25Address); + vm.assume(user != acc26Address); + vm.assume(user != acc27Address); + vm.assume(user != acc28Address); + vm.assume(user != acc29Address); + vm.assume(user != acc30Address); + vm.assume(user != acc31Address); + vm.assume(user != acc32Address); + vm.assume(user != acc33Address); + vm.assume(user != acc34Address); + vm.assume(user != acc35Address); + vm.assume(user != acc36Address); + vm.assume(user != acc37Address); + vm.assume(user != acc38Address); + vm.assume(user != acc39Address); + vm.assume(user != acc40Address); + vm.assume(user != acc41Address); + vm.assume(user != acc42Address); + vm.assume(user != acc43Address); + vm.assume(user != acc44Address); + vm.assume(user != acc45Address); + vm.assume(user != acc46Address); + vm.assume(user != acc47Address); + vm.assume(user != acc48Address); + } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol index 35bf8415c50..8eabca4d232 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol @@ -3,5 +3,101 @@ pragma solidity ^0.8.13; -// Will be generated by Kontrol -contract DeploymentSummaryFaultProofsCode { } +contract DeploymentSummaryFaultProofsCode { + bytes internal constant acc23Code = + hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c80638f997aaf14610051578063e0f54e861461007a578063f8ccbf471461008f578063ff07a313146100b2575b600080fd5b61006461005f3660046136ef565b610121565b60405161007191906137e9565b60405180910390f35b61008d6100883660046138c8565b6101c0565b005b600c546100a29062010000900460ff1681565b6040519015158152602001610071565b6100c56100c0366004613984565b6101ec565b6040516100719190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b60606000828060200190518101906101399190613a01565b90506000610146826101ec565b9050806040516020016101a89190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b60405160208183030381529060405292505050919050565b6101ca8282610330565b6101d4828261066a565b6101de8282610775565b6101e88282610ca3565b5050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101829052906102e3836040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c00160405280836000015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001836040015173ffffffffffffffffffffffffffffffffffffffff168152602001836060015115158152602001836080015160001c81526020018360a0015160001c8152509050919050565b90506102ee8161152e565b6102f8818361184b565b6103028183611a7e565b61030c8183611d76565b61031681836120f4565b610320818361244d565b61032a81836101c0565b50919050565b600061035382608001518360400151846060015185600001518660200151612564565b905061035e81612707565b6040517f06447d5600000000000000000000000000000000000000000000000000000000815260006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156103c457600080fd5b505af11580156103d8573d6000803e3d6000fd5b505050506000826060015173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561042f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104539190613a7e565b90506000836020015173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190613a7e565b9050737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561052a57600080fd5b505af115801561053e573d6000803e3d6000fd5b50505050836040015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f313030000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b835173ffffffffffffffffffffffffffffffffffffffff828116911614610663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f323030000000000000000000000000000000000000000000000000000000000060448201526064016105d7565b5050505050565b816040015173ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f89190613a7e565b73ffffffffffffffffffffffffffffffffffffffff16146101e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f5350412d3130000000000000000000000000000000000000000000000000000060448201526064016105d7565b6060810151610788816001600080612757565b826000015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190613a7e565b73ffffffffffffffffffffffffffffffffffffffff161461088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3130000000000000000000000000000000000000000000000060448201526064016105d7565b6040517f06447d5600000000000000000000000000000000000000000000000000000000815260006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b50505050816040015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109999190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3330000000000000000000000000000000000000000000000060448201526064016105d7565b816080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa29190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610b1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3430000000000000000000000000000000000000000000000060448201526064016105d7565b737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b7b57600080fd5b505af1158015610b8f573d6000803e3d6000fd5b5050505081604001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c219190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f535550434f4e2d3530000000000000000000000000000000000000000000000060448201526064016105d7565b505050565b6020810151610cb6816001600080612757565b826020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d313000000000000000000000000000000000000000000000000000000060448201526064016105d7565b8260a001518173ffffffffffffffffffffffffffffffffffffffff1663dc8452cd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190613a9b565b14610e98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d323000000000000000000000000000000000000000000000000000000060448201526064016105d7565b82608001518173ffffffffffffffffffffffffffffffffffffffff1663d798b1ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190613a9b565b14610f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d333000000000000000000000000000000000000000000000000000000060448201526064016105d7565b6040517f06447d5600000000000000000000000000000000000000000000000000000000815260006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015610fd957600080fd5b505af1158015610fed573d6000803e3d6000fd5b50505050816000015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613a7e565b73ffffffffffffffffffffffffffffffffffffffff16146110fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d343000000000000000000000000000000000000000000000000000000060448201526064016105d7565b816080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611162573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111869190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d353000000000000000000000000000000000000000000000000000000060448201526064016105d7565b737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561125f57600080fd5b505af1158015611273573d6000803e3d6000fd5b5050505081600001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113059190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d363000000000000000000000000000000000000000000000000000000060448201526064016105d7565b8073ffffffffffffffffffffffffffffffffffffffff1663dc8452cd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f19190613a9b565b15611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d373000000000000000000000000000000000000000000000000000000060448201526064016105d7565b8073ffffffffffffffffffffffffffffffffffffffff1663d798b1ac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c79190613a9b565b15610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50562d383000000000000000000000000000000000000000000000000000000060448201526064016105d7565b805173ffffffffffffffffffffffffffffffffffffffff166115d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4465706c6f795375706572636861696e3a20677561726469616e206e6f74207360448201527f657400000000000000000000000000000000000000000000000000000000000060648201526084016105d7565b602081015173ffffffffffffffffffffffffffffffffffffffff16611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4465706c6f795375706572636861696e3a2070726f746f636f6c56657273696f60448201527f6e734f776e6572206e6f7420736574000000000000000000000000000000000060648201526084016105d7565b8060a0015160000361170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4465706c6f795375706572636861696e3a20726571756972656450726f746f6360448201527f6f6c56657273696f6e206e6f742073657400000000000000000000000000000060648201526084016105d7565b80608001516000036117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f795375706572636861696e3a207265636f6d6d656e64656450726f60448201527f746f636f6c56657273696f6e206e6f742073657400000000000000000000000060648201526084016105d7565b604081015173ffffffffffffffffffffffffffffffffffffffff16611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4465706c6f795375706572636861696e3a207375706572636861696e50726f7860448201527f7941646d696e4f776e6572206e6f74207365740000000000000000000000000060648201526084016105d7565b50565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b1580156118b057600080fd5b505af11580156118c4573d6000803e3d6000fd5b5050604080518082018252600a81527f50726f787941646d696e000000000000000000000000000000000000000000006020820152905133602482015260009350611992925061198d906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f038a609c00000000000000000000000000000000000000000000000000000000179052612b7b565b612c20565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f5375706572636861696e50726f787941646d696e0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166080919091015250565b604080518082018252601081527f5375706572636861696e436f6e6669670000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091611b219190611b1990612b7b565b600d54612d16565b604080518082018252601081527f50726f746f636f6c56657273696f6e730000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052919250600091611bbe91611b1990612b7b565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601460448201527f5375706572636861696e436f6e666967496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b5050604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601460448201527f50726f746f636f6c56657273696f6e73496d706c0000000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c657c7189150608401600060405180830381600087803b158015611d3b57600080fd5b505af1158015611d4f573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff92831660408501525016905250565b8151608082015160408084015190517f7fec2a8d000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b158015611de757600080fd5b505af1158015611dfb573d6000803e3d6000fd5b5050604080518082018252600581527f50726f78790000000000000000000000000000000000000000000000000000006020820152905173ffffffffffffffffffffffffffffffffffffffff8616602482015260009350611e63925061198d90604401611912565b90508273ffffffffffffffffffffffffffffffffffffffff16639623609d828487604051602401611eb0919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152611f5f93929190600401613ab4565b600060405180830381600087803b158015611f7957600080fd5b505af1158015611f8d573d6000803e3d6000fd5b50505050737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611fed57600080fd5b505af1158015612001573d6000803e3d6000fd5b5050604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601560448201527f5375706572636861696e436f6e66696750726f787900000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c657c7189150608401600060405180830381600087803b1580156120b657600080fd5b505af11580156120ca573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166060949094019390935250505050565b602082015160a08301516080808501519084015184516040517f7fec2a8d000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561216f57600080fd5b505af1158015612183573d6000803e3d6000fd5b5050604080518082018252600581527f50726f78790000000000000000000000000000000000000000000000000000006020820152905173ffffffffffffffffffffffffffffffffffffffff86166024820152600093506121eb925061198d90604401611912565b6040805173ffffffffffffffffffffffffffffffffffffffff898116602483015260448201899052606480830189905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7a1ac61e0000000000000000000000000000000000000000000000000000000017905291517f9623609d00000000000000000000000000000000000000000000000000000000815292935090851691639623609d916122b69185918791600401613ab4565b600060405180830381600087803b1580156122d057600080fd5b505af11580156122e4573d6000803e3d6000fd5b50505050737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561234457600080fd5b505af1158015612358573d6000803e3d6000fd5b5050604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810191909152601560448201527f50726f746f636f6c56657273696f6e7350726f787900000000000000000000006064820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c657c7189150608401600060405180830381600087803b15801561240d57600080fd5b505af1158015612421573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660209690960195909552505050505050565b6040820151608082015161246081612f64565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b50506040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528416925063f2fde38b9150602401600060405180830381600087803b15801561254657600080fd5b505af115801561255a573d6000803e3d6000fd5b5050505050505050565b60408051600580825260c08201909252606091600091906020820160a080368337019050509050868160008151811061259f5761259f613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816001815181106125ed576125ed613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160028151811061263b5761263b613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160038151811061268957612689613af6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816004815181106126d7576126d7613af6565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152905095945050505050565b60005b815181101561274d57600082828151811061272757612727613af6565b6020026020010151905061273a81612f64565b508061274581613b54565b91505061270a565b506118488161309c565b6040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101839052600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156127df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128039190613a9b565b90506000612812836008613b8c565b82901c60ff1690508415612abb5762030d405a116128b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f795574696c733a20696e73756666696369656e742067617320666f60448201527f7220696e697456657273696f6e28292063616c6c00000000000000000000000060648201526084016105d7565b8573ffffffffffffffffffffffffffffffffffffffff166338d38c976040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612937575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261293491810190613bc9565b60015b6129f9578060ff166001146129f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f74207365742061742074686520676976656e20736c6f7420616e64206f66667360648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b612b73565b8060ff168260ff1614612ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f795574696c733a2073746f726167652076616c756520697320696e908201527f636f72726563742061742074686520676976656e20736c6f7420616e64206f6660648201527f6673657400000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b50612b73565b60ff81811614612b73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f7420307866662061742074686520676976656e20736c6f7420616e64206f666660648201527f7365740000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b505050505050565b6060600482511015612c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4465706c6f795574696c733a20656e636f6465436f6e7374727563746f72207460448201527f616b657320696e205f64617461206f66206c656e677468203e3d20340000000060648201526084016105d7565b612c1a8260046131b3565b92915050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590612c759087906004016137e9565b600060405180830381865afa158015612c92573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612cd89190810190613bec565b83604051602001612cea929190613c5a565b60405160208183030381529060405290508051602082016000f09150612d0f82612f64565b5092915050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590612d6b9088906004016137e9565b600060405180830381865afa158015612d88573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612dce9190810190613bec565b84604051602001612de0929190613c5a565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160208201207f890c283b0000000000000000000000000000000000000000000000000000000083526004830186905260248301529150600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa158015612e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eaa9190613a7e565b905073ffffffffffffffffffffffffffffffffffffffff81163b15612ed157809250612f5b565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b158015612f3657600080fd5b505af1158015612f4a573d6000803e3d6000fd5b50505050612f5882856131f0565b92505b50509392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff821601612fa45750565b73ffffffffffffffffffffffffffffffffffffffff8116613021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706c6f795574696c733a207a65726f20616464726573730000000000000060448201526064016105d7565b60008173ffffffffffffffffffffffffffffffffffffffff163b1161304582613217565b6040516020016130559190613c89565b604051602081830303815290604052906101e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d791906137e9565b60005b81518110156101e85760006130b5826001613cce565b90505b82518110156131a0578281815181106130d3576130d3613af6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683838151811061310357613103613af6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561312c836132f9565b613135836132f9565b604051602001613146929190613ce6565b6040516020818303038152906040529061318d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d791906137e9565b508061319881613b54565b9150506130b8565b50806131ab81613b54565b91505061309f565b6060825182106131d25750604080516020810190915260008152612c1a565b6131e983838486516131e49190613d8d565b61335b565b9392505050565b6000818351602085016000f590508061320e573d806000803e806000fd5b612c1a81612f64565b606061322282613533565b6028602282019081209192507f4040404040404040404040404040404040404040404040404040404040404040917f8888888888888888888888888888888888888888888888888888888888888880167e8800000000000000000000000000000000000000000000000000000000000060005b82811a82028180015260018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed0161329557505050818151166000511660011c8151188152602081019050818151166020511660011c81511881525050919050565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a9004806133145750508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b60608182601f0110156133ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105d7565b828284011015613436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105d7565b818301845110156134a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105d7565b6060821580156134c2576040519150600082526020820160405261352a565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156134fb5780518352602092830192016134e3565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061353e82613575565b805161307882526002017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90910190815292915050565b60606040519050608081016040526f30313233343536373839616263646566600f526002810190506028815260208101600060288201528260601b925060005b808101820184821a600f81165160018301538060041c518253505060018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed016135b5575050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561365457613654613602565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136a1576136a1613602565b604052919050565b600067ffffffffffffffff8211156136c3576136c3613602565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561370157600080fd5b813567ffffffffffffffff81111561371857600080fd5b8201601f8101841361372957600080fd5b803561373c613737826136a9565b61365a565b81815285602083850101111561375157600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b8381101561378a578181015183820152602001613772565b83811115613799576000848401525b50505050565b600081518084526137b781602086016020860161376f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131e9602083018461379f565b73ffffffffffffffffffffffffffffffffffffffff8116811461184857600080fd5b801515811461184857600080fd5b600060a0828403121561383e57600080fd5b60405160a0810181811067ffffffffffffffff8211171561386157613861613602565b6040529050808235613872816137fc565b81526020830135613882816137fc565b60208201526040830135613895816137fc565b604082015260608301356138a8816137fc565b606082015260808301356138bb816137fc565b6080919091015292915050565b6000808284036101608112156138dd57600080fd5b60c08112156138eb57600080fd5b5060405160c0810181811067ffffffffffffffff8211171561390f5761390f613602565b604052833561391d816137fc565b8152602084013561392d816137fc565b60208201526040840135613940816137fc565b604082015260608401356139538161381e565b60608201526080848101359082015260a08085013590820152915061397b8460c0850161382c565b90509250929050565b600060c0828403121561399657600080fd5b61399e613631565b82356139a9816137fc565b815260208301356139b9816137fc565b602082015260408301356139cc816137fc565b604082015260608301356139df8161381e565b60608201526080838101359082015260a0928301359281019290925250919050565b600060c08284031215613a1357600080fd5b613a1b613631565b8251613a26816137fc565b81526020830151613a36816137fc565b60208201526040830151613a49816137fc565b60408201526060830151613a5c8161381e565b60608201526080838101519082015260a0928301519281019290925250919050565b600060208284031215613a9057600080fd5b81516131e9816137fc565b600060208284031215613aad57600080fd5b5051919050565b600073ffffffffffffffffffffffffffffffffffffffff808616835280851660208401525060606040830152613aed606083018461379f565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b8557613b85613b25565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc457613bc4613b25565b500290565b600060208284031215613bdb57600080fd5b815160ff811681146131e957600080fd5b600060208284031215613bfe57600080fd5b815167ffffffffffffffff811115613c1557600080fd5b8201601f81018413613c2657600080fd5b8051613c34613737826136a9565b818152856020838501011115613c4957600080fd5b613aed82602083016020860161376f565b60008351613c6c81846020880161376f565b835190830190613c8081836020880161376f565b01949350505050565b7f4465706c6f795574696c733a206e6f20636f6465206174200000000000000000815260008251613cc181601885016020870161376f565b9190910160180192915050565b60008219821115613ce157613ce1613b25565b500190565b7f4465706c6f795574696c733a20636865636b206661696c65642c206475706c6981527f6361746573206174200000000000000000000000000000000000000000000000602082015260008351613d4481602985016020880161376f565b7f2c000000000000000000000000000000000000000000000000000000000000006029918401918201528351613d8181602a84016020880161376f565b01602a01949350505050565b600082821015613d9f57613d9f613b25565b50039056fea164736f6c634300080f000a"; + bytes internal constant superchainProxyAdminCode = + hex"60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant superchainConfigImplCode = + hex"608060405234801561001057600080fd5b50600436106100f55760003560e01c806354fd4d501161009757806382005715116100665780638200571514610297578063c4d66de8146102aa578063dad544e0146102bd578063f125af6b146102c557600080fd5b806354fd4d501461021e57806357b001f9146102675780635c975abb1461027c57806376a67a511461028457600080fd5b806332dfadd9116100d357806332dfadd91461016357806338d38c971461019a5780633e47158c146101cb578063452a9320146101f857600080fd5b806304dbe3fe146100fa5780630e3b6d1f146101205780632e48152c14610140575b600080fd5b61010d610108366004610af3565b6102ce565b6040519081526020015b60405180910390f35b61010d61012e366004610af3565b60016020526000908152604090205481565b61015361014e366004610af3565b610318565b6040519015158152602001610117565b610153610171366004610af3565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020541590565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000002168152602001610117565b6101d3610364565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b6000546101d39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b61025a6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101179190610b7b565b61027a610275366004610af3565b61056f565b005b6101536105d7565b61027a610292366004610af3565b6105e8565b61027a6102a5366004610af3565b6106c3565b61027a6102b8366004610af3565b610741565b6101d36108b1565b62784ce061010d565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260408120548082036103045750600092915050565b61031162784ce082610bbd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205480820361034e5750600092915050565b61035b62784ce082610bbd565b42109392505050565b60008061038f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156103b257919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026103f59190610bd5565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610450906060015b604051602081830303815290604052805190602001205490565b14610487576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906104a990606001610436565b905073ffffffffffffffffffffffffffffffffffffffff81161561053d578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610512573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105369190610c12565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610577610929565b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260408083209290925590519182527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91015b60405180910390a150565b60006105e36000610318565b905090565b6105f0610929565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260409020541561066a576040517fb7d8689400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260409182902042905590519182527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891016105cc565b6106cb610929565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054900361066a576040517f335b869500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610661565b7f0000000000000000000000000000000000000000000000000000000000000002600054610100900460ff16158015610781575060005460ff8083169116105b61080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610661565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610846610982565b61084f82610a03565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b60006108bb610364565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e39190610c12565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610980576040517fafbe9bc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3361098b610364565b73ffffffffffffffffffffffffffffffffffffffff16141580156109cc5750336109b36108b1565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610980576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8416021781556040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610ac391610b7b565b60405180910390a250565b73ffffffffffffffffffffffffffffffffffffffff81168114610af057600080fd5b50565b600060208284031215610b0557600080fd5b813561031181610ace565b6000815180845260005b81811015610b3657602081850181015186830182015201610b1a565b81811115610b48576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006103116020830184610b10565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610bd057610bd0610b8e565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610c0d57610c0d610b8e565b500290565b600060208284031215610c2457600080fd5b815161031181610ace56fea164736f6c634300080f000a"; + bytes internal constant protocolVersionsImplCode = + hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e7366004610867565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e312e3200000000000000000000000000000000000000000000000000000081525081565b60405161010091906108cd565b6100ec610160366004610867565b61021d565b6100ec61022e565b6100ec61017b366004610910565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c6366004610943565b610460565b6100f6610514565b6100f6600081565b6101e361053f565b6101ec816105c0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161095e565b81565b61022561053f565b6101ec8161065a565b61023661053f565b61024060006106b6565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61037361072d565b61037c84610460565b610385836105c0565b61038e8261065a565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61095e565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161095e565b61046861053f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec816106b6565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61095e565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b6105f36105ee60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace161095e565b829055565b60008160405160200161060891815260200190565b60408051601f19818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161064e91906108cd565b60405180910390a35050565b6106886105ee60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b61095e565b60008160405160200161069d91815260200190565b60408051601f198184030181529190529050600161061d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff1661085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240336106b6565b60006020828403121561087957600080fd5b5035919050565b6000815180845260005b818110156108a65760208185018101518683018201520161088a565b818111156108b8576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006108e06020830184610880565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461090b57600080fd5b919050565b60008060006060848603121561092557600080fd5b61092e846108e7565b95602085013595506040909401359392505050565b60006020828403121561095557600080fd5b6108e0826108e7565b600082821015610997577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; + bytes internal constant superchainConfigProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant protocolVersionsProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant acc25Code = + hex"608060405234801561001057600080fd5b50600436106100415760003560e01c8063329aa281146100465780638f997aaf1461006f578063f8ccbf471461008f575b600080fd5b61005961005436600461d709565b6100b2565b604051610066919061d7f3565b60405180910390f35b61008261007d36600461daba565b6102a0565b604051610066919061dbb0565b600c546100a29062010000900460ff1681565b6040519015158152602001610066565b604080516103e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101829052610300810182905261032081018290526103408101829052610360810182905261038081018290526103a081018290526103c08101919091526101b4826102f0565b6101bd81610ed2565b6101c681611061565b6101cf816111e8565b6101d88161136f565b6101e1816114f6565b6101ea8161167d565b6101f381611804565b6101fd828261198b565b6102078282611b47565b61021081611c8c565b61021a8282611e13565b6102248282611f55565b61022e828261212e565b610237816123ff565b6102418282612586565b61024b82826126cb565b61025582826128d9565b60c0820151610265906001612a6c565b1561027e576102748282612a87565b61027e8282612c13565b61028781612d9f565b6102918282612f26565b61029b82826137e8565b919050565b60606000828060200190518101906102b8919061dbce565b905060006102c5826100b2565b9050806040516020016102d8919061d7f3565b60405160208183030381529060405292505050919050565b60008160e001511180156103095750607d8160e0015111155b6103c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f56324d617847616d654465707468206f7574206f662076616c69642072616e6760648201527f652028312d313235290000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6002816101000151101580156103e9575060e08101516101008201516103e790600161dcdc565b105b61049b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f563253706c69744465707468206d757374206265203e3d203220616e6420737060648201527f6c69744465707468202b2031203c206d617847616d6544657074680000000000608482015260a4016103b7565b61012081015167ffffffffffffffff101561055e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f5632436c6f636b457874656e73696f6e20746f6f206c6172676520666f72207560648201527f696e743634000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b61014081015167ffffffffffffffff1015610621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f56324d6178436c6f636b4475726174696f6e20746f6f206c6172676520666f7260648201527f2075696e74363400000000000000000000000000000000000000000000000000608482015260a4016103b7565b80610120015181610140015110156106e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4465706c6f79496d706c656d656e746174696f6e733a206d6178436c6f636b4460448201527f75726174696f6e206d757374206265203e3d20636c6f636b457874656e73696f60648201527f6e00000000000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b600081610120015111610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4465706c6f79496d706c656d656e746174696f6e733a206661756c7447616d6560448201527f5632436c6f636b457874656e73696f6e206d757374206265203e20300000000060648201526084016103b7565b8051600003610807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4465706c6f79496d706c656d656e746174696f6e733a2077697468647261776160448201527f6c44656c61795365636f6e6473206e6f7420736574000000000000000000000060648201526084016103b7565b806020015160000361089b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4465706c6f79496d706c656d656e746174696f6e733a206d696e50726f706f7360448201527f616c53697a654279746573206e6f74207365740000000000000000000000000060648201526084016103b7565b806040015160000361092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4465706c6f79496d706c656d656e746174696f6e733a206368616c6c656e676560448201527f506572696f645365636f6e6473206e6f7420736574000000000000000000000060648201526084016103b7565b604081015167ffffffffffffffff10156109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4465706c6f79496d706c656d656e746174696f6e733a206368616c6c656e676560448201527f506572696f645365636f6e647320746f6f206c6172676500000000000000000060648201526084016103b7565b8060600151600003610a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4465706c6f79496d706c656d656e746174696f6e733a2070726f6f664d61747560448201527f7269747944656c61795365636f6e6473206e6f7420736574000000000000000060648201526084016103b7565b8060800151600003610af3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4465706c6f79496d706c656d656e746174696f6e733a2064697370757465476160448201527f6d6546696e616c69747944656c61795365636f6e6473206e6f7420736574000060648201526084016103b7565b8060a00151600003610b87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4465706c6f79496d706c656d656e746174696f6e733a206d697073566572736960448201527f6f6e206e6f74207365740000000000000000000000000000000000000000000060648201526084016103b7565b61016081015173ffffffffffffffffffffffffffffffffffffffff16610c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f79496d706c656d656e746174696f6e733a2073757065726368616960448201527f6e436f6e66696750726f7879206e6f742073657400000000000000000000000060648201526084016103b7565b61018081015173ffffffffffffffffffffffffffffffffffffffff16610cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f79496d706c656d656e746174696f6e733a2070726f746f636f6c5660448201527f657273696f6e7350726f7879206e6f742073657400000000000000000000000060648201526084016103b7565b6101a081015173ffffffffffffffffffffffffffffffffffffffff16610d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4465706c6f79496d706c656d656e746174696f6e733a2073757065726368616960448201527f6e50726f787941646d696e206e6f74207365740000000000000000000000000060648201526084016103b7565b6101c081015173ffffffffffffffffffffffffffffffffffffffff16610e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4465706c6f79496d706c656d656e746174696f6e733a204c3150726f7879416460448201527f6d696e4f776e6572206e6f74207365740000000000000000000000000000000060648201526084016103b7565b6101e081015173ffffffffffffffffffffffffffffffffffffffff16610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706c6f79496d706c656d656e746174696f6e733a206368616c6c656e676560448201527f72206e6f7420736574000000000000000000000000000000000000000000000060648201526084016103b7565b50565b604080518082018252601081527f5375706572636861696e436f6e6669670000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091610f759190610f6d90614223565b600d546142c2565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f5375706572636861696e436f6e666967496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103009190910152565b604080518082018252601081527f50726f746f636f6c56657273696f6e730000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916110fc9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f50726f746f636f6c56657273696f6e73496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156111b057600080fd5b505af11580156111c4573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103209190910152565b604080518082018252600c81527f53797374656d436f6e666967000000000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916112839190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601060448201527f53797374656d436f6e666967496d706c000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561133757600080fd5b505af115801561134b573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102209190910152565b604080518082018252601681527f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a30000000000000000000000000000000000000000000000000000000017905260009161140a9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601a60448201527f4c3143726f7373446f6d61696e4d657373656e676572496d706c0000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156114be57600080fd5b505af11580156114d2573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102409190910152565b604080518082018252600e81527f4c3145524337323142726964676500000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916115919190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4c31455243373231427269646765496d706c00000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102609190910152565b604080518082018252601081527f4c315374616e646172644272696467650000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a3000000000000000000000000000000000000000000000000000000001790526000916117189190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4c315374616e64617264427269646765496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156117cc57600080fd5b505af11580156117e0573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102809190910152565b604080518082018252601c81527f4f7074696d69736d4d696e7461626c654552433230466163746f72790000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a30000000000000000000000000000000000000000000000000000000017905260009161189f9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602060448201527f4f7074696d69736d4d696e7461626c654552433230466163746f7279496d706c6064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102a09190910152565b6060820151604080518082018252600f81527f4f7074696d69736d506f7274616c3200000000000000000000000000000000006020820152905160248101839052600091611a5691610f6d906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f41232a1700000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4f7074696d69736d506f7274616c496d706c00000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661018092909201919091525050565b6060820151604080518082018252601581527f4f7074696d69736d506f7274616c496e7465726f7000000000000000000000006020820152905160248101839052600091611b9b91610f6d906044016119db565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601960448201527f4f7074696d69736d506f7274616c496e7465726f70496d706c000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611c4f57600080fd5b505af1158015611c63573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101a092909201919091525050565b604080518082018252600a81527f4554484c6f636b626f780000000000000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091611d279190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152600e60448201527f4554484c6f636b626f78496d706c0000000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611ddb57600080fd5b505af1158015611def573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101c09190910152565b8151604080518082018252600b81527f44656c61796564574554480000000000000000000000000000000000000000006020820152905160248101839052600091611e6491610f6d906044016119db565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152600f60448201527f44656c6179656457455448496d706c00000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015611f1857600080fd5b505af1158015611f2c573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661016092909201919091525050565b600082602001519050600083604001519050600061203c6040518060400160405280600e81526020017f507265696d6167654f7261636c65000000000000000000000000000000000000815250610f6d8585604051602401611fc1929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6f334f5700000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601760448201527f507265696d6167654f7261636c6553696e676c65746f6e0000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156120f057600080fd5b505af1158015612104573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101e09390930192909252505050565b60a08201516101e08201516002821015612206576001461480612153575062aa36a746145b15612206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4465706c6f79496d706c656d656e746174696f6e733a204f6e6c79204d69707360448201527f36342073686f756c64206265206465706c6f796564206f6e204d61696e6e657460648201527f206f72205365706f6c6961000000000000000000000000000000000000000000608482015260a4016103b7565b604080518082018252600681527f4d495053363400000000000000000000000000000000000000000000000000006020820152905173ffffffffffffffffffffffffffffffffffffffff831660248201526044810184905260009161230d916122e790606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1605f41d00000000000000000000000000000000000000000000000000000000179052614223565b7f89fca2352a158519d2daabf7e53686272e828ddbff9487204546d918490b2ecf6142c2565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152600d60448201527f4d49505353696e676c65746f6e000000000000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156123c157600080fd5b505af11580156123d5573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102009390930192909252505050565b604080518082018252601281527f4469737075746547616d65466163746f7279000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a30000000000000000000000000000000000000000000000000000000017905260009161249a9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601660448201527f4469737075746547616d65466163746f7279496d706c000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102c09190910152565b6080820151604080518082018252601381527f416e63686f72537461746552656769737472790000000000000000000000000060208201529051602481018390526000916125da91610f6d906044016119db565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601760448201527f416e63686f7253746174655265676973747279496d706c0000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561268e57600080fd5b505af11580156126a2573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166102e092909201919091525050565b60408051608081018252600080825260208083018281528385018381526060850184815260e0890151865261010089015190925261012088015167ffffffffffffffff90811690915261014088015116905283518085018552601081527f4661756c744469737075746547616d6500000000000000000000000000000000918101919091529251919290916127e89190610f6d9061276d90869060240161dcf4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe818883400000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4661756c744469737075746547616d65496d706c0000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561289c57600080fd5b505af11580156128b0573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661034092909201919091525050565b60408051608081018252600080825260208083018281528385018381526060850184815260e0890151865261010089015190925261012088015167ffffffffffffffff90811690915261014088015116905283518085018552601781527f5065726d697373696f6e65644469737075746547616d650000000000000000009181019190915292519192909161297b9190610f6d9061276d90869060240161dcf4565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601b60448201527f5065726d697373696f6e65644469737075746547616d65496d706c00000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612a2f57600080fd5b505af1158015612a43573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661036092909201919091525050565b60008115801590612a7e575081828416145b90505b92915050565b600060405180608001604052808460e001518152602001846101000151815260200184610120015167ffffffffffffffff16815260200184610140015167ffffffffffffffff1681525090506000612b226040518060400160405280601581526020017f53757065724661756c744469737075746547616d650000000000000000000000815250610f6d8460405160240161276d919061dcf4565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601960448201527f53757065724661756c744469737075746547616d65496d706c000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612bd657600080fd5b505af1158015612bea573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1661038092909201919091525050565b600060405180608001604052808460e001518152602001846101000151815260200184610120015167ffffffffffffffff16815260200184610140015167ffffffffffffffff1681525090506000612cae6040518060400160405280601c81526020017f53757065725065726d697373696f6e65644469737075746547616d6500000000815250610f6d8460405160240161276d919061dcf4565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602060448201527f53757065725065726d697373696f6e65644469737075746547616d65496d706c6064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612d6257600080fd5b505af1158015612d76573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103a092909201919091525050565b604080518082018252600d81527f53746f726167655365747465720000000000000000000000000000000000000060208083019190915282516004815260248101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1c0082a300000000000000000000000000000000000000000000000000000000179052600091612e3a9190610f6d90614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601160448201527f53746f72616765536574746572496d706c0000000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b158015612eee57600080fd5b505af1158015612f02573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166103c09190910152565b6040805160a08101825260008082526020820181905281830181905260608201819052608082015290517f7fec2a8d000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b158015612fb257600080fd5b505af1158015612fc6573d6000803e3d6000fd5b50506040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416464726573734d616e616765720000000000000000000000000000000000006044820152600092506130b69150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906064015b600060405180830381865afa158015613068573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526130ae919081019061dd63565b600d54614510565b73ffffffffffffffffffffffffffffffffffffffff9182168452915081161561313b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d31300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50726f787900000000000000000000000000000000000000000000000000000060448201526131bd90737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff91821660208501529150811615613245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d32300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f50726f787941646d696e0000000000000000000000000000000000000000000060448201526132c790737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff9182166040850152915081161561334f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d33300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c314368756753706c61736850726f787900000000000000000000000000000060448201526133d190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff91821660608501529150811615613459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d34300000000000000000000000000000000000000000000000000060448201526064016103b7565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265736f6c76656444656c656761746550726f7879000000000000000000000060448201526134db90737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259060640161304b565b73ffffffffffffffffffffffffffffffffffffffff91821660808501529150811615613563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4f50434d2d35300000000000000000000000000000000000000000000000000060448201526064016103b7565b737109709ecfa91a80626ff3989d68f67f5b1dd12d73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156135bf57600080fd5b505af11580156135d3573d6000803e3d6000fd5b5050505060006135ed8560c001516201000060001b612a6c565b905080156136ef576000613602868686614a3b565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4f50436f6e7472616374734d616e6167657256320000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156136b657600080fd5b505af11580156136ca573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101208501526137e1565b60006136fc868686614dce565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4f50436f6e7472616374734d616e6167657200000000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b1580156137b057600080fd5b505af11580156137c4573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1684525b5050505050565b60006137fe8360c001516201000060001b612a6c565b9050600061384182613811578351613818565b8361012001515b846101800151856101600151866101e001518761020001518861030001518961032001516151ae565b90506000613889846102200151856102400151866102600151876102800151886102a00151896102c001518a6102e001518b6101c001518c61034001518d61036001516153f0565b905061389d8560c00151600160001b612a6c565b156138c85760006138b8856103800151866103a00151615720565b90506138c482826157d4565b9150505b6138da6138d583836157d4565b615905565b60c08501516138ec9062010000612a6c565b15613a915761012084015173ffffffffffffffffffffffffffffffffffffffff166139c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d2056322066908201527f6c616720656e61626c656420627574204f50434d205632206e6f74206465706c60648201527f6f79656400000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b835173ffffffffffffffffffffffffffffffffffffffff1615613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d2056322066908201527f6c616720656e61626c656420627574204f50434d20563120776173206465706c60648201527f6f79656400000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b613c2a565b835173ffffffffffffffffffffffffffffffffffffffff16613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d205632206660448201527f6c61672064697361626c656420627574204f50434d205631206e6f742064657060648201527f6c6f796564000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b61012084015173ffffffffffffffffffffffffffffffffffffffff1615613c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4465706c6f79496d706c656d656e746174696f6e733a204f50434d205632206660448201527f6c61672064697361626c656420627574204f50434d205632207761732064657060648201527f6c6f796564000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b60c0850151613c3a906001612a6c565b613e285761038084015173ffffffffffffffffffffffffffffffffffffffff1615613d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606160248201527f4465706c6f79496d706c656d656e746174696f6e733a204f7074696d69736d5060448201527f6f7274616c496e7465726f7020666c61672064697361626c656420627574205360648201527f757065724661756c744469737075746547616d6520776173206465706c6f796560848201527f640000000000000000000000000000000000000000000000000000000000000060a482015260c4016103b7565b6103a084015173ffffffffffffffffffffffffffffffffffffffff1615613e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606860248201527f4465706c6f79496d706c656d656e746174696f6e733a204f7074696d69736d5060448201527f6f7274616c496e7465726f7020666c61672064697361626c656420627574205360648201527f757065725065726d697373696f6e65644469737075746547616d65207761732060848201527f6465706c6f79656400000000000000000000000000000000000000000000000060a482015260c4016103b7565b600061407a85604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152604051806101c0016040528083610240015173ffffffffffffffffffffffffffffffffffffffff16815260200183610280015173ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001836102c0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610160015173ffffffffffffffffffffffffffffffffffffffff16815260200183610160015173ffffffffffffffffffffffffffffffffffffffff168152602001836102e0015173ffffffffffffffffffffffffffffffffffffffff168152602001836102a0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610180015173ffffffffffffffffffffffffffffffffffffffff168152602001836101c0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610220015173ffffffffffffffffffffffffffffffffffffffff16815260200183610260015173ffffffffffffffffffffffffffffffffffffffff16815260200183610320015173ffffffffffffffffffffffffffffffffffffffff16815260200183610300015173ffffffffffffffffffffffffffffffffffffffff168152509050919050565b905061408f8561016001518760000151615955565b6140a2856102c001516000806000615add565b6140b5856102e001516000806000615f34565b80516140d790737109709ecfa91a80626ff3989d68f67f5b1dd12d6000616350565b6140e5856102600151616b41565b6140f3856102800151617115565b614107856102000151866101e001516176d6565b60c08601516141199062010000612a6c565b6141cf57604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608082018390526101808083018481526101a08401948552918a015173ffffffffffffffffffffffffffffffffffffffff90811690945289015190921690915285516102008701516141cd918491849190617878565b505b6141dd856102a00151618c72565b6141ef81876101600151600080618eaa565b614203856101c00151866101800151619d82565b61420c81619fad565b61421b8160c00151600061b13e565b505050505050565b60606004825110156142b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4465706c6f795574696c733a20656e636f6465436f6e7374727563746f72207460448201527f616b657320696e205f64617461206f66206c656e677468203e3d20340000000060648201526084016103b7565b612a8182600461b2f0565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061431790889060040161dbb0565b600060405180830381865afa158015614334573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261437a919081019061dd63565b8460405160200161438c92919061ddb4565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160208201207f890c283b0000000000000000000000000000000000000000000000000000000083526004830186905260248301529150600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa158015614432573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614456919061dde3565b905073ffffffffffffffffffffffffffffffffffffffff81163b1561447d57809250614507565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152336004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b1580156144e257600080fd5b505af11580156144f6573d6000803e3d6000fd5b50505050614504828561b321565b92505b50509392505050565b81516000908190615bcc9081106146c157600061452c8661b348565b805160208201206040517f890c283b000000000000000000000000000000000000000000000000000000008152600481018890526024810191909152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa1580156145a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cb919061dde3565b93508373ffffffffffffffffffffffffffffffffffffffff163b6000036146b75760006145f8828761b4ba565b90508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146146b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4465706c6f795574696c733a20756e657870656374656420626c75657072696e60448201527f742061646472657373000000000000000000000000000000000000000000000060648201526084016103b7565b505b6000925050614a33565b60006146d58660008463ffffffff1661b545565b905060006146fc878463ffffffff168563ffffffff168a516146f7919061de00565b61b545565b905060006147098361b348565b905060006147168361b348565b825160208401206040517f890c283b000000000000000000000000000000000000000000000000000000008152600481018b90526024810191909152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063890c283b90604401602060405180830381865afa158015614791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147b5919061dde3565b96508673ffffffffffffffffffffffffffffffffffffffff163b6000036148a15760006147e2838a61b4ba565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461489f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4465706c6f795574696c733a20756e657870656374656420706172742031206260448201527f6c75657072696e7420616464726573730000000000000000000000000000000060648201526084016103b7565b505b805160208201206040517f890c283b000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d9163890c283b91614901918c91600401918252602082015260400190565b602060405180830381865afa15801561491e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614942919061dde3565b95508573ffffffffffffffffffffffffffffffffffffffff163b600003614a2e57600061496f828a61b4ba565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4465706c6f795574696c733a20756e657870656374656420706172742032206260448201527f6c75657072696e7420616464726573730000000000000000000000000000000060648201526084016103b7565b505b505050505b509250929050565b60008060405180610260016040528085610300015173ffffffffffffffffffffffffffffffffffffffff16815260200185610320015173ffffffffffffffffffffffffffffffffffffffff16815260200185610260015173ffffffffffffffffffffffffffffffffffffffff16815260200185610180015173ffffffffffffffffffffffffffffffffffffffff168152602001856101a0015173ffffffffffffffffffffffffffffffffffffffff168152602001856101c0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610220015173ffffffffffffffffffffffffffffffffffffffff168152602001856102a0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610240015173ffffffffffffffffffffffffffffffffffffffff16815260200185610280015173ffffffffffffffffffffffffffffffffffffffff168152602001856102c0015173ffffffffffffffffffffffffffffffffffffffff168152602001856102e0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610160015173ffffffffffffffffffffffffffffffffffffffff16815260200185610200015173ffffffffffffffffffffffffffffffffffffffff16815260200185610340015173ffffffffffffffffffffffffffffffffffffffff16815260200185610360015173ffffffffffffffffffffffffffffffffffffffff16815260200185610380015173ffffffffffffffffffffffffffffffffffffffff168152602001856103a0015173ffffffffffffffffffffffffffffffffffffffff168152602001856103c0015173ffffffffffffffffffffffffffffffffffffffff16815250905060006040518060a00160405280856000015173ffffffffffffffffffffffffffffffffffffffff168152602001856020015173ffffffffffffffffffffffffffffffffffffffff168152602001856040015173ffffffffffffffffffffffffffffffffffffffff168152602001856060015173ffffffffffffffffffffffffffffffffffffffff168152602001856080015173ffffffffffffffffffffffffffffffffffffffff168152509050614d768686838561b71d565b614d8186868461b8c4565b614d8a8561bbfc565b614d938561bdae565b614d9c8561bee9565b60008087526020870181905260408701819052606087018190526080870181905260a0870152925050505b9392505050565b60008060405180610240016040528085610300015173ffffffffffffffffffffffffffffffffffffffff16815260200185610320015173ffffffffffffffffffffffffffffffffffffffff16815260200185610260015173ffffffffffffffffffffffffffffffffffffffff16815260200185610180015173ffffffffffffffffffffffffffffffffffffffff168152602001856101a0015173ffffffffffffffffffffffffffffffffffffffff168152602001856101c0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610220015173ffffffffffffffffffffffffffffffffffffffff168152602001856102a0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610240015173ffffffffffffffffffffffffffffffffffffffff16815260200185610280015173ffffffffffffffffffffffffffffffffffffffff168152602001856102c0015173ffffffffffffffffffffffffffffffffffffffff168152602001856102e0015173ffffffffffffffffffffffffffffffffffffffff16815260200185610160015173ffffffffffffffffffffffffffffffffffffffff16815260200185610200015173ffffffffffffffffffffffffffffffffffffffff16815260200185610340015173ffffffffffffffffffffffffffffffffffffffff16815260200185610360015173ffffffffffffffffffffffffffffffffffffffff16815260200185610380015173ffffffffffffffffffffffffffffffffffffffff168152602001856103a0015173ffffffffffffffffffffffffffffffffffffffff16815250905061503b8585858461c0b5565b6150448461c281565b61504e858561c3e1565b6150578461c51c565b6150608461c656565b61506b85858361b8c4565b6150ae6040518060400160405280601281526020017f4f50436f6e7472616374734d616e616765720000000000000000000000000000815250610f6d878761c7b6565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601260448201527f4f50436f6e7472616374734d616e6167657200000000000000000000000000006064820152909250737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561516257600080fd5b505af1158015615176573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff831685525050600061012084018190526101409093019290925250919050565b6040805160078082526101008201909252606091600091906020820160e08036833701905050905088816000815181106151ea576151ea61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816001815181106152385761523861de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816002815181106152865761528661de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816003815181106152d4576152d461de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816004815181106153225761532261de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816005815181106153705761537061de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816006815181106153be576153be61de17565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101529050979650505050505050565b60408051600a80825261016082019092526060916000919060208201610140803683370190505090508b8160008151811061542d5761542d61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160018151811061547b5761547b61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505089816002815181106154c9576154c961de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505088816003815181106155175761551761de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816004815181106155655761556561de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816005815181106155b3576155b361de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816006815181106156015761560161de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160078151811061564f5761564f61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160088151811061569d5761569d61de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816009815181106156eb576156eb61de17565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015290509a9950505050505050505050565b6040805160028082526060808301845292600092919060208301908036833701905050905083816000815181106157595761575961de17565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816001815181106157a7576157a761de17565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152905092915050565b81518151606091906157e6818361dcdc565b67ffffffffffffffff8111156157fe576157fe61d610565b604051908082528060200260200182016040528015615827578160200160208202803683370190505b50925060005b8281101561588e578581815181106158475761584761de17565b60200260200101518482815181106158615761586161de17565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161582d565b5060005b84518110156158fc57600083820190508582815181106158b4576158b461de17565b60200260200101518582815181106158ce576158ce61de17565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250600101615892565b50505092915050565b60005b815181101561594b5760008282815181106159255761592561de17565b602002602001015190506159388161c8ae565b50806159438161de46565b915050615908565b50610ecf8161c9e6565b61597760405180606001604052806040815260200161ed27604091398361cafd565b73ffffffffffffffffffffffffffffffffffffffff82166159f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d44574554482d313000000000000000000000000000000000000060448201526064016103b7565b615a02826000806000615f34565b808273ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa158015615a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615a72919061de7e565b14615ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d44574554482d353000000000000000000000000000000000000060448201526064016103b7565b5050565b615b766040518060600160405280603b815260200161eebf603b913982615b39576040518060400160405280600e81526020017f696d706c656d656e746174696f6e000000000000000000000000000000000000815250615b70565b6040518060400160405280600581526020017f70726f78790000000000000000000000000000000000000000000000000000008152505b8661cb8e565b73ffffffffffffffffffffffffffffffffffffffff8416615bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d313000000000000000000000000000000000000000000060448201526064016103b7565b615c008482600080615f34565b8015615d1c576040517f1b685b9e0000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff8084169190861690631b685b9e90602401602060405180830381865afa158015615c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615c9a919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d323000000000000000000000000000000000000000000060448201526064016103b7565b615f2e565b6040517f1b685b9e0000000000000000000000000000000000000000000000000000000081526001600482015260009073ffffffffffffffffffffffffffffffffffffffff861690631b685b9e90602401602060405180830381865afa158015615d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615dae919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d323000000000000000000000000000000000000000000060448201526064016103b7565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615eb1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615f2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f434845434b2d44472d333000000000000000000000000000000000000000000060448201526064016103b7565b50505050565b6040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101839052600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa158015615fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615fe0919061de7e565b90506000615fef83600861de97565b82901c60ff16905084156162985762030d405a1161608f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4465706c6f795574696c733a20696e73756666696369656e742067617320666f60448201527f7220696e697456657273696f6e28292063616c6c00000000000000000000000060648201526084016103b7565b8573ffffffffffffffffffffffffffffffffffffffff166338d38c976040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015616114575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526161119181019061dee5565b60015b6161d6578060ff166001146161d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f74207365742061742074686520676976656e20736c6f7420616e64206f66667360648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b61421b565b8060ff168260ff1614616292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4465706c6f795574696c733a2073746f726167652076616c756520697320696e908201527f636f72726563742061742074686520676976656e20736c6f7420616e64206f6660648201527f6673657400000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b5061421b565b60ff8181161461421b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4465706c6f795574696c733a2073746f726167652076616c7565206973206e6f60448201527f7420307866662061742074686520676976656e20736c6f7420616e64206f666660648201527f7365740000000000000000000000000000000000000000000000000000000000608482015260a4016103b7565b6163e96040518060600160405280603f815260200161f149603f9139826163ac576040518060400160405280600e81526020017f696d706c656d656e746174696f6e0000000000000000000000000000000000008152506163e3565b6040518060400160405280600581526020017f70726f78790000000000000000000000000000000000000000000000000000008152505b8561cb8e565b73ffffffffffffffffffffffffffffffffffffffff8316616466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d313000000000000000000000000000000000000060448201526064016103b7565b616474838260006014615f34565b8015616598576040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260cc60248301526000919084169063667f9d7090604401602060405180830381865afa1580156164f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616515919061de7e565b905073ffffffffffffffffffffffffffffffffffffffff811661dead14615f2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d373000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156165fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061661f919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461669c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d383000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1663db505d806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156166ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616723919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146167a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3158444d2d393000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16630ff754ea6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616803573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616827919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146168a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313030000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636425666b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061692b919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146169a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313130000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616a2f919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616aac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313230000000000000000000000000000000000060448201526064016103b7565b616ad6837f54e433cd0000000000000000000000000000000000000000000000000000000061cc21565b616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313330000000000000000000000000000000000060448201526064016103b7565b505050565b616b6360405180608001604052806043815260200161eff6604391398261cafd565b616b71816000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015616bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616bf8919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3630000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015616cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616cfc919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616d79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3730000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616e00919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3830000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616f04919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f434845434b2d4c31455243373231422d3930000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015616fe4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617008919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614617085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f434845434b2d4c31455243373231422d3130300000000000000000000000000060448201526064016103b7565b6170af817f54e433cd0000000000000000000000000000000000000000000000000000000061cc21565b610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f434845434b2d4c3158444d2d313330000000000000000000000000000000000060448201526064016103b7565b61713760405180608001604052806045815260200161ed67604591398261cafd565b73ffffffffffffffffffffffffffffffffffffffff81166171b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d31300000000000000000000000000000000000000060448201526064016103b7565b6171c2816000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617225573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617249919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146172c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d37300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061734d919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146173ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d38300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561742d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617451919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146174ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4c3153422d39300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015617531573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617555919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146175d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3153422d31303000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617659919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4c3153422d31313000000000000000000000000000000000000060448201526064016103b7565b6176f86040518060600160405280602a815260200161f11f602a91398361cafd565b73ffffffffffffffffffffffffffffffffffffffff8216617775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4d4950532d31300000000000000000000000000000000000000060448201526064016103b7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156177d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906177fb919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614615ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4d4950532d32300000000000000000000000000000000000000060448201526064016103b7565b61789a60405180606001604052806038815260200161ef83603891398361cafd565b73ffffffffffffffffffffffffffffffffffffffff8216617917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31300000000000000000000000000000000000000060448201526064016103b7565b60008273ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015617964573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526179aa919081019061dd63565b5111617a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31350000000000000000000000000000000000000060448201526064016103b7565b6040517f78ecabce00000000000000000000000000000000000000000000000000000000815262010000600482015273ffffffffffffffffffffffffffffffffffffffff8316906378ecabce90602401602060405180830381865afa158015617a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617aa3919061df00565b617cb75782610180015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636624856a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015617b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617b32919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614617baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31370000000000000000000000000000000000000060448201526064016103b7565b826101a0015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015617c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617c3a919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614617cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d31390000000000000000000000000000000000000060448201526064016103b7565b60008273ffffffffffffffffffffffffffffffffffffffff166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015617d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617d29919061df22565b905084610160015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614617dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d35300000000000000000000000000000000000000060448201526064016103b7565b84610100015173ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff1614617e67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d36300000000000000000000000000000000000000060448201526064016103b7565b84610140015173ffffffffffffffffffffffffffffffffffffffff168160c0015173ffffffffffffffffffffffffffffffffffffffff1614617f05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d37300000000000000000000000000000000000000060448201526064016103b7565b8460e0015173ffffffffffffffffffffffffffffffffffffffff168160e0015173ffffffffffffffffffffffffffffffffffffffff1614617fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d38300000000000000000000000000000000000000060448201526064016103b7565b846000015173ffffffffffffffffffffffffffffffffffffffff1681610100015173ffffffffffffffffffffffffffffffffffffffff1614618040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50434d2d39300000000000000000000000000000000000000060448201526064016103b7565b846020015173ffffffffffffffffffffffffffffffffffffffff1681610120015173ffffffffffffffffffffffffffffffffffffffff16146180de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31303000000000000000000000000000000000000060448201526064016103b7565b846060015173ffffffffffffffffffffffffffffffffffffffff1681610140015173ffffffffffffffffffffffffffffffffffffffff161461817c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31313000000000000000000000000000000000000060448201526064016103b7565b846080015173ffffffffffffffffffffffffffffffffffffffff1681610180015173ffffffffffffffffffffffffffffffffffffffff161461821a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31323000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff16816101a0015173ffffffffffffffffffffffffffffffffffffffff16146182b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31333000000000000000000000000000000000000060448201526064016103b7565b846101a0015173ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614618352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31343000000000000000000000000000000000000060448201526064016103b7565b84610180015173ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16146183f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31353000000000000000000000000000000000000060448201526064016103b7565b60008373ffffffffffffffffffffffffffffffffffffffff1663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561843d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190618461919061e06f565b905060006184a4826000015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416464726573734d616e616765720000000000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa15801561853d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052618583919081019061dd63565b80519060200120816040015180519060200120146185fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31363000000000000000000000000000000000000060448201526064016103b7565b600061863e836020015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f50726f78790000000000000000000000000000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa1580156186d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261871d919081019061dd63565b8051906020012081604001518051906020012014618797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31373000000000000000000000000000000000000060448201526064016103b7565b60006187d8846040015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f50726f787941646d696e000000000000000000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa158015618871573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526188b7919081019061dd63565b8051906020012081604001518051906020012014618931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31383000000000000000000000000000000000000060448201526064016103b7565b6000618972856060015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c314368756753706c61736850726f78790000000000000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa158015618a0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052618a51919081019061dd63565b8051906020012081604001518051906020012014618acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d31393000000000000000000000000000000000000060448201526064016103b7565b6000618b0c866080015173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c61cd56565b6040517f8d1cc92500000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265736f6c76656444656c656761746550726f787900000000000000000000006044820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590606401600060405180830381865afa158015618ba5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052618beb919081019061dd63565b8051906020012081604001518051906020012014618c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d4f50434d2d32303000000000000000000000000000000000000060448201526064016103b7565b5050505050505050505050565b618c9460405180608001604052806051815260200161ef32605191398261cafd565b618ca2816000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015618d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190618d29919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614618da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f434845434b2d4d4552433230462d33300000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663e78cea926040518163ffffffff1660e01b8152600401602060405180830381865afa158015618e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190618e2d919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f434845434b2d4d4552433230462d34300000000000000000000000000000000060448201526064016103b7565b60008461010001519050618f4d60405180606001604052806038815260200161edac6038913983618f10576040518060400160405280600e81526020017f696d706c656d656e746174696f6e000000000000000000000000000000000000815250618f47565b6040518060400160405280600581526020017f70726f78790000000000000000000000000000000000000000000000000000008152505b8361cb8e565b73ffffffffffffffffffffffffffffffffffffffff8116618fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3130000000000000000000000000000000000000000060448201526064016103b7565b618fd78183600080615f34565b811561975b578460c0015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015619043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619067919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146190e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3235000000000000000000000000000000000000000060448201526064016103b7565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015619146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061916a919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16146191e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f504f5254414c2d3430000000000000000000000000000000000000000000000060448201526064016103b7565b8373ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015619232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619256919061dde3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156192b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906192db919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3430000000000000000000000000000000000000000060448201526064016103b7565b84610140015173ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156193a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906193cc919061df00565b15158173ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015619419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061943d919061df00565b1515146194a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3630000000000000000000000000000000000000000060448201526064016103b7565b84610120015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa15801561950d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619531919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614806195ed5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa1580156195b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906195d5919061dde3565b73ffffffffffffffffffffffffffffffffffffffff16145b619653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3830000000000000000000000000000000000000000060448201526064016103b7565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663dad544e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156196b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906196d9919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3930000000000000000000000000000000000000000060448201526064016103b7565b619c6f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa1580156197be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906197e2919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461985f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3830000000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156198c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906198e6919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d4f50322d3930000000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156199c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906199ea919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3130300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015619aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619aee919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3131300000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015619bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619bf2919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3132300000000000000000000000000000000000000060448201526064016103b7565b6040517f667f9d7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152603d6024820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa158015619cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619d1b919061de7e565b146137e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f434845434b2d4f50322d3133300000000000000000000000000000000000000060448201526064016103b7565b619da46040518060600160405280603f815260200161ece8603f91398361cafd565b619db2826000806000615f34565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015619e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619e39919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614619eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d454c422d3530000000000000000000000000000000000000000060448201526064016103b7565b6040517f0fd1107700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690630fd1107790602401602060405180830381865afa158015619f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190619f46919061df00565b15615ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f434845434b2d454c422d3630000000000000000000000000000000000000000060448201526064016103b7565b60008161014001519050619fd960405180606001604052806037815260200161f0b5603791398261cafd565b619fe7816000806000615f34565b60008173ffffffffffffffffffffffffffffffffffffffff1663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa15801561a034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a058919061e11b565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a0bd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a0e1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461a15e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32323000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff16630c18c1626040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a1a9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a1cd919061de7e565b1561a234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32333000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663f45e65d86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a27f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a2a3919061de7e565b1561a30a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32343000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663bfb14fb76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a379919061e1d1565b63ffffffff161561a3e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32353000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663ec7075176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a431573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a455919061e1d1565b63ffffffff161561a4c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32363000000000000000000000000000000000000060448201526064016103b7565b6000801b8273ffffffffffffffffffffffffffffffffffffffff1663e81b2c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a535919061de7e565b1461a59c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32373000000000000000000000000000000000000060448201526064016103b7565b8173ffffffffffffffffffffffffffffffffffffffff1663f68016b76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a5e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a60b919061e1ec565b67ffffffffffffffff161561a67c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32383000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16631fd19ee16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561a6df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061a703919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461a780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d32393000000000000000000000000000000000000060448201526064016103b7565b805163ffffffff161561a7ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33303000000000000000000000000000000000000060448201526064016103b7565b602081015160ff161561a85e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33313000000000000000000000000000000000000060448201526064016103b7565b604081015160ff161561a8cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33323000000000000000000000000000000000000060448201526064016103b7565b608081015163ffffffff161561a93f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33333000000000000000000000000000000000000060448201526064016103b7565b606081015163ffffffff161561a9b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33343000000000000000000000000000000000000060448201526064016103b7565b60a08101516fffffffffffffffffffffffffffffffff161561aa2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33353000000000000000000000000000000000000060448201526064016103b7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8273ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561aa9b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061aabf919061de7e565b1461ab26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33363000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663dac6e63a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ab89573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061abad919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461ac2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33373000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ac8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061acb1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461ad2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33383000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663c4e8ddfa6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ad91573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061adb5919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461ae32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d33393000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663078f29cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561ae95573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061aeb9919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461af36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d34303000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa15801561af99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061afbd919061dde3565b73ffffffffffffffffffffffffffffffffffffffff161461b03a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d34323000000000000000000000000000000000000060448201526064016103b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16639b7d7f0a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561b09d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061b0c1919061dde3565b73ffffffffffffffffffffffffffffffffffffffff1614616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f434845434b2d534346472d34333000000000000000000000000000000000000060448201526064016103b7565b61b1478261c8ae565b801561b1585761b1568261d215565b505b61b1658282600080615f34565b6040517f7258a8070000000000000000000000000000000000000000000000000000000081526001600482015260009073ffffffffffffffffffffffffffffffffffffffff841690637258a807906024016040805180830381865afa15801561b1d2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061b1f6919061e216565b509050811561b288577fdead0000000000000000000000000000000000000000000000000000000000008114616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f414e43484f52502d34300000000000000000000000000000000000000000000060448201526064016103b7565b8015616b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f414e43484f52502d34300000000000000000000000000000000000000000000060448201526064016103b7565b60608251821061b30f5750604080516020810190915260008152612a81565b612a7e83838486516146f7919061de00565b6000818351602085016000f590508061b33f573d806000803e806000fd5b612a818161c8ae565b6060815160000361b385576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060400160405280600381526020017ffe7100000000000000000000000000000000000000000000000000000000000081525090506000818460405160200161b3d492919061ddb4565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280517f6100000000000000000000000000000000000000000000000000000000000000602085015260f01b7fffff000000000000000000000000000000000000000000000000000000000000811660218501527f3d81600a3d39f30000000000000000000000000000000000000000000000000060238501528251808503600a018152602a85019093529093509161b4a09082908590604a0161ddb4565b604051602081830303815290604052945050505050919050565b6000818351602085016000f5905073ffffffffffffffffffffffffffffffffffffffff8116612a81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f426c75657072696e743a2063726561746532206661696c65640000000000000060448201526064016103b7565b60608182601f01101561b5b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b7565b82828401101561b620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016103b7565b8183018451101561b68d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016103b7565b60608215801561b6ac576040519150600082526020820160405261b714565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561b6e557805183526020928301920161b6cd565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b600061b7d26040518060600160405280603b815260200161ede4603b9139610f6d85858960c0015160405160240161b7579392919061e23a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9acb7deb00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601f60448201527f4f50436f6e7472616374734d616e61676572436f6e7461696e6572496d706c006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561b88657600080fd5b505af115801561b89a573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101409390930192909252505050565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915260408083015173ffffffffffffffffffffffffffffffffffffffff9081168352606080850151821660208086019190915260808087015184168686015260a08088015185169387019390935260c08088015185168288015260e08089015186169488019490945261010080890151861691880191909152610120808901518616948801949094526101408089015186169188019190915261016080890151861694880194909452610180808901518616918801919091526101a0808901518616948801949094526101c08801518516908701526101e0870151909316918501919091528251918201909252604b80825260009261bae592919061f03990830139610f6d84886101600151896101c001518a6101e001518b600001518c60c0015160405160240161ba6a9695949392919061e52b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f936144ed00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602760448201527f4f50436f6e7472616374734d616e616765725374616e6461726456616c69646160648201527f746f72496d706c000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561bbbf57600080fd5b505af115801561bbd3573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660c09390930192909252505050565b600061bcc360405180606001604052806033815260200161f0ec6033913961014084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f038a609c00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601b60448201527f4f50436f6e7472616374734d616e616765725574696c73496d706c00000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561bd7757600080fd5b505af115801561bd8b573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660e09190910152565b600061bdfd60405180606001604052806039815260200161ee1f6039913960e084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601e60448201527f4f50436f6e7472616374734d616e616765724d69677261746f72496d706c00006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561beb157600080fd5b505af115801561bec5573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166101009190910152565b604080518082018252601481527f4f50436f6e7472616374734d616e616765725632000000000000000000000000602082015260c083015161010084015160e0850151935173ffffffffffffffffffffffffffffffffffffffff928316602482015290821660448201529216606483015260009161bfe49190610f6d90608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd232b1b00000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601460448201527f4f50436f6e7472616374734d616e6167657256320000000000000000000000006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561c09857600080fd5b505af115801561c0ac573d6000803e3d6000fd5b50505050919050565b600061c16a6040518060600160405280603b815260200161efbb603b9139610f6d85858960c0015160405160240161c0ef9392919061e6fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f458bd2d100000000000000000000000000000000000000000000000000000000179052614223565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602660448201527f4f50436f6e7472616374734d616e616765724250496d706c73436f6e7461696e60648201527f6572496d706c00000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561c24457600080fd5b505af115801561c258573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660209390930192909252505050565b600061c2d060405180606001604052806036815260200161ee8960369139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602360448201527f4f50436f6e7472616374734d616e6167657247616d655479706541646465724960648201527f6d706c00000000000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561c3aa57600080fd5b505af115801561c3be573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660409190910152565b600061c43060405180606001604052806031815260200161ee5860319139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601e60448201527f4f50436f6e7472616374734d616e616765724465706c6f796572496d706c00006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561c4e457600080fd5b505af115801561c4f8573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff166060919091015250565b600061c56b60405180606001604052806031815260200161f08460319139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152601e60448201527f4f50436f6e7472616374734d616e616765725570677261646572496d706c00006064820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c71890608401600060405180830381600087803b15801561c61f57600080fd5b505af115801561c633573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660809190910152565b600061c6a560405180606001604052806038815260200161eefa60389139602084015160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f6d9060440161bc48565b604080517fc657c71800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810191909152602560448201527f4f50436f6e7472616374734d616e61676572496e7465726f704d69677261746f60648201527f72496d706c0000000000000000000000000000000000000000000000000000006084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c657c7189060a401600060405180830381600087803b15801561c77f57600080fd5b505af115801561c793573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff1660a09190910152565b604080820151606083810151608085015160a086015160c08701516101608901516101808a0151975173ffffffffffffffffffffffffffffffffffffffff9788166024820152948716604486015292861660648501529085166084840152841660a4830152831660c48201529190921660e4820152612a7e9061010401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f820f7f8500000000000000000000000000000000000000000000000000000000179052614223565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82160161c8ee5750565b73ffffffffffffffffffffffffffffffffffffffff811661c96b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706c6f795574696c733a207a65726f20616464726573730000000000000060448201526064016103b7565b60008173ffffffffffffffffffffffffffffffffffffffff163b1161c98f8261d312565b60405160200161c99f919061e9c2565b60405160208183030381529060405290615ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b7919061dbb0565b60005b8151811015615ad957600061c9ff82600161dcdc565b90505b825181101561caea5782818151811061ca1d5761ca1d61de17565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683838151811061ca4d5761ca4d61de17565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561ca768361d3f4565b61ca7f8361d3f4565b60405160200161ca9092919061ea07565b6040516020818303038152906040529061cad7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b7919061dbb0565b508061cae28161de46565b91505061ca02565b508061caf58161de46565b91505061c9e9565b615ad9828260405160240161cb1392919061eaae565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f319af3330000000000000000000000000000000000000000000000000000000017905261d456565b616b3c83838360405160240161cba69392919061eae6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95ed01950000000000000000000000000000000000000000000000000000000017905261d456565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3e47158c0000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff87169161cca2919061eb32565b600060405180830381855afa9150503d806000811461ccdd576040519150601f19603f3d011682016040523d82523d6000602084013e61cce2565b606091505b50915091508115801561ccf6575080516004145b801561cd4d57507fffffffff00000000000000000000000000000000000000000000000000000000841661cd298261eb4e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b95945050505050565b61cd7d6040518060600160405280600060ff16815260200160608152602001606081525090565b60028251108061cde757508160008151811061cd9b5761cd9b61de17565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061ce4c57508160018151811061ce005761ce0061de17565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b1561ce83576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028360028151811061ce9a5761ce9a61de17565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c905060008360028151811061ceca5761ceca61de17565b60209101015160f81c6003908116915081900361cf13576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff82161561cfff5760008260ff1667ffffffffffffffff81111561cf3c5761cf3c61d610565b6040519080825280601f01601f19166020018201604052801561cf66576020820181803683370190505b50905060005b8360ff1681101561cff1578661cf8382600361dcdc565b8151811061cf935761cf9361de17565b602001015160f81c60f81b82828151811061cfb05761cfb061de17565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061cfe98161de46565b91505061cf6c565b5061cffb8161d45f565b9150505b60008167ffffffffffffffff81111561d01a5761d01a61d610565b6040519080825280601f01601f19166020018201604052801561d044576020820181803683370190505b50905060ff83161561d0e957600061d05d84600361eb9e565b60ff16905060005b8381101561d0e6578761d078828461dcdc565b8151811061d0885761d08861de17565b602001015160f81c60f81b83828151811061d0a55761d0a561de17565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061d0de8161de46565b91505061d065565b50505b60008261d0f785600361eb9e565b60ff1661d104919061dcdc565b9050600081885161d115919061de00565b90508060000361d151576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561d16c5761d16c61d610565b6040519080825280601f01601f19166020018201604052801561d196576020820181803683370190505b50905060008360208b0101602083018481868460045afa925050508061d1e8576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6040517fca669fa700000000000000000000000000000000000000000000000000000000815260006004820181905290737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561d27e57600080fd5b505af115801561d292573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561d2e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061d307919061dde3565b905061029b8161c8ae565b606061d31d8261d520565b6028602282019081209192507f4040404040404040404040404040404040404040404040404040404040404040917f8888888888888888888888888888888888888888888888888888888888888880167e8800000000000000000000000000000000000000000000000000000000000060005b82811a82028180015260018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed0161d39057505050818151166000511660011c8151188152602081019050818151166020511660011c81511881525050919050565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a90048061d40f5750508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b610ecf8161d562565b600060208251111561d49d576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b835181101561d5195761d4b581600161dcdc565b845161d4c1919061de00565b61d4cc90600861de97565b61d4d790600261ecdb565b84828151811061d4e95761d4e961de17565b016020015161d4fb919060f81c61de97565b61d505908361dcdc565b91508061d5118161de46565b91505061d4a1565b5092915050565b606061d52b8261d583565b805161307882526002017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90910190815292915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b60606040519050608081016040526f30313233343536373839616263646566600f526002810190506028815260208101600060288201528260601b925060005b808101820184821a600f81165160018301538060041c518253505060018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed0161d5c3575050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610200810167ffffffffffffffff8111828210171561d6635761d66361d610565b60405290565b604051610240810167ffffffffffffffff8111828210171561d6635761d66361d610565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561d6d45761d6d461d610565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ecf57600080fd5b803561029b8161d6dc565b6000610200828403121561d71c57600080fd5b61d72461d63f565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e082015261010080840135818301525061012080840135818301525061014080840135818301525061016061d7a081850161d6fe565b9082015261018061d7b284820161d6fe565b908201526101a061d7c484820161d6fe565b908201526101c061d7d684820161d6fe565b908201526101e061d7e884820161d6fe565b908201529392505050565b815173ffffffffffffffffffffffffffffffffffffffff1681526103e08101602083015161d839602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015161d861604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161d889606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608083015161d8b1608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161d8d960a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161d90160c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161d92960e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e08085015182169084015261030080850151821690840152610320808501518216908401526103408085015182169084015261036080850151821690840152610380808501518216908401526103a0808501518216908401526103c09384015116929091019190915290565b600067ffffffffffffffff82111561da8e5761da8e61d610565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561dacc57600080fd5b813567ffffffffffffffff81111561dae357600080fd5b8201601f8101841361daf457600080fd5b803561db0761db028261da74565b61d68d565b81815285602083850101111561db1c57600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b8381101561db5557818101518382015260200161db3d565b83811115615f2e5750506000910152565b6000815180845261db7e81602086016020860161db3a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612a7e602083018461db66565b805161029b8161d6dc565b6000610200828403121561dbe157600080fd5b61dbe961d63f565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014080840151818301525061016061dc6581850161dbc3565b9082015261018061dc7784820161dbc3565b908201526101a061dc8984820161dbc3565b908201526101c061dc9b84820161dbc3565b908201526101e061d7e884820161dbc3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561dcef5761dcef61dcad565b500190565b60808101612a8182848051825260208101516020830152604081015167ffffffffffffffff808216604085015280606084015116606085015250505050565b600061dd4161db028461da74565b905082815283838301111561dd5557600080fd5b614dc783602083018461db3a565b60006020828403121561dd7557600080fd5b815167ffffffffffffffff81111561dd8c57600080fd5b8201601f8101841361dd9d57600080fd5b61ddac8482516020840161dd33565b949350505050565b6000835161ddc681846020880161db3a565b83519083019061ddda81836020880161db3a565b01949350505050565b60006020828403121561ddf557600080fd5b8151614dc78161d6dc565b60008282101561de125761de1261dcad565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361de775761de7761dcad565b5060010190565b60006020828403121561de9057600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561decf5761decf61dcad565b500290565b805160ff8116811461029b57600080fd5b60006020828403121561def757600080fd5b612a7e8261ded4565b60006020828403121561df1257600080fd5b81518015158114614dc757600080fd5b6000610240828403121561df3557600080fd5b61df3d61d669565b61df468361dbc3565b815261df546020840161dbc3565b602082015261df656040840161dbc3565b604082015261df766060840161dbc3565b606082015261df876080840161dbc3565b608082015261df9860a0840161dbc3565b60a082015261dfa960c0840161dbc3565b60c082015261dfba60e0840161dbc3565b60e082015261010061dfcd81850161dbc3565b9082015261012061dfdf84820161dbc3565b9082015261014061dff184820161dbc3565b9082015261016061e00384820161dbc3565b9082015261018061e01584820161dbc3565b908201526101a061e02784820161dbc3565b908201526101c061e03984820161dbc3565b908201526101e061e04b84820161dbc3565b9082015261020061e05d84820161dbc3565b9082015261022061d7e884820161dbc3565b600060a0828403121561e08157600080fd5b60405160a0810181811067ffffffffffffffff8211171561e0a45761e0a461d610565b604052825161e0b28161d6dc565b8152602083015161e0c28161d6dc565b6020820152604083015161e0d58161d6dc565b6040820152606083015161e0e88161d6dc565b6060820152608083015161e0fb8161d6dc565b60808201529392505050565b805163ffffffff8116811461029b57600080fd5b600060c0828403121561e12d57600080fd5b60405160c0810181811067ffffffffffffffff8211171561e1505761e15061d610565b60405261e15c8361e107565b815261e16a6020840161ded4565b602082015261e17b6040840161ded4565b604082015261e18c6060840161e107565b606082015261e19d6080840161e107565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461e1c557600080fd5b60a08201529392505050565b60006020828403121561e1e357600080fd5b612a7e8261e107565b60006020828403121561e1fe57600080fd5b815167ffffffffffffffff81168114614dc757600080fd5b6000806040838503121561e22957600080fd5b505080516020909101519092909150565b610320810161e294828673ffffffffffffffffffffffffffffffffffffffff808251168352806020830151166020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b835173ffffffffffffffffffffffffffffffffffffffff1660a0830152602084015173ffffffffffffffffffffffffffffffffffffffff811660c084015250604084015173ffffffffffffffffffffffffffffffffffffffff811660e084015250606084015161010061e31e8185018373ffffffffffffffffffffffffffffffffffffffff169052565b6080860151915061012061e3498186018473ffffffffffffffffffffffffffffffffffffffff169052565b60a0870151925061014061e3748187018573ffffffffffffffffffffffffffffffffffffffff169052565b60c0880151935061016061e39f8188018673ffffffffffffffffffffffffffffffffffffffff169052565b60e0890151945061018061e3ca8189018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015194506101a09361e3f58886018773ffffffffffffffffffffffffffffffffffffffff169052565b9289015194506101c09261e4208885018773ffffffffffffffffffffffffffffffffffffffff169052565b9189015194506101e09161e44b8884018773ffffffffffffffffffffffffffffffffffffffff169052565b9089015194506102009061e4768883018773ffffffffffffffffffffffffffffffffffffffff169052565b890151945061022061e49f8882018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015194506102409361e4ca8886018773ffffffffffffffffffffffffffffffffffffffff169052565b9289015173ffffffffffffffffffffffffffffffffffffffff90811661026089015291890151821661028088015288015181166102a08701529087015181166102c08601529501519094166102e08301526103009091019190915292915050565b865173ffffffffffffffffffffffffffffffffffffffff1681526102608101602088015161e571602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604088015161e599604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606088015161e5c1606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608088015161e5e9608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a088015161e61160a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c088015161e63960c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e088015161e66160e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008881015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808a0151821690840152610140808a0151821690840152610160808a0151821690840152610180808a01518216908401526101a0988901518116988301989098529587166101c08201529386166101e085015291909416610200830152610220820193909352610240019190915290565b610300810161e756828673ffffffffffffffffffffffffffffffffffffffff808251168352806020830151166020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b835173ffffffffffffffffffffffffffffffffffffffff1660a0830152602084015173ffffffffffffffffffffffffffffffffffffffff811660c084015250604084015173ffffffffffffffffffffffffffffffffffffffff811660e084015250606084015161010061e7e08185018373ffffffffffffffffffffffffffffffffffffffff169052565b6080860151915061012061e80b8186018473ffffffffffffffffffffffffffffffffffffffff169052565b60a0870151925061014061e8368187018573ffffffffffffffffffffffffffffffffffffffff169052565b60c0880151935061016061e8618188018673ffffffffffffffffffffffffffffffffffffffff169052565b60e0890151945061018061e88c8189018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015194506101a09361e8b78886018773ffffffffffffffffffffffffffffffffffffffff169052565b9289015194506101c09261e8e28885018773ffffffffffffffffffffffffffffffffffffffff169052565b9189015194506101e09161e90d8884018773ffffffffffffffffffffffffffffffffffffffff169052565b9089015194506102009061e9388883018773ffffffffffffffffffffffffffffffffffffffff169052565b890151945061022061e9618882018773ffffffffffffffffffffffffffffffffffffffff169052565b9389015173ffffffffffffffffffffffffffffffffffffffff90811661024089015292890151831661026088015290880151821661028087015287015181166102a08601529501519094166102c08301526102e09091019190915292915050565b7f4465706c6f795574696c733a206e6f20636f646520617420000000000000000081526000825161e9fa81601885016020870161db3a565b9190910160180192915050565b7f4465706c6f795574696c733a20636865636b206661696c65642c206475706c6981527f636174657320617420000000000000000000000000000000000000000000000060208201526000835161ea6581602985016020880161db3a565b7f2c00000000000000000000000000000000000000000000000000000000000000602991840191820152835161eaa281602a84016020880161db3a565b01602a01949350505050565b60408152600061eac1604083018561db66565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60608152600061eaf9606083018661db66565b828103602084015261eb0b818661db66565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b6000825161eb4481846020870161db3a565b9190910192915050565b6000815160208301517fffffffff000000000000000000000000000000000000000000000000000000008082169350600483101561eb965780818460040360031b1b83161693505b505050919050565b600060ff821660ff84168060ff0382111561ebbb5761ebbb61dcad565b019392505050565b600181815b80851115614a3357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561ec025761ec0261dcad565b8085161561ec0f57918102915b93841c939080029061ebc8565b60008261ec2b57506001612a81565b8161ec3857506000612a81565b816001811461ec4e576002811461ec585761ec74565b6001915050612a81565b60ff84111561ec695761ec6961dcad565b50506001821b612a81565b5060208310610133831016604e8410600b841016171561ec97575081810a612a81565b61eca1838361ebc3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561ecd35761ecd361dcad565b029392505050565b6000612a7e838361ec1c56fe52756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204554484c6f636b626f7820696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e207468652044656c617965645745544820696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204c315374616e6461726442726964676520696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204f7074696d69736d506f7274616c322025732061742025734f50436f6e7472616374734d616e61676572436f6e7461696e65722e736f6c3a4f50436f6e7472616374734d616e61676572436f6e7461696e65724f50436f6e7472616374734d616e616765724d69677261746f722e736f6c3a4f50436f6e7472616374734d616e616765724d69677261746f724f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e616765724465706c6f7965724f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e6167657247616d6554797065416464657252756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204469737075746547616d65466163746f72792025732061742025734f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e61676572496e7465726f704d69677261746f7252756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204f7074696d69736d4d696e7461626c654552433230466163746f727920696d706c656d656e746174696f6e20617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204f50436f6e7472616374734d616e616765722061742025734f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e61676572436f6e747261637473436f6e7461696e657252756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204c3145524337323142726964676520696d706c656d656e746174696f6e2061742025734f50436f6e7472616374734d616e616765725374616e6461726456616c696461746f722e736f6c3a4f50436f6e7472616374734d616e616765725374616e6461726456616c696461746f724f50436f6e7472616374734d616e616765722e736f6c3a4f50436f6e7472616374734d616e61676572557067726164657252756e6e696e6720636861696e20617373657274696f6e73206f6e207468652053797374656d436f6e66696720696d706c2061742025734f50436f6e7472616374734d616e616765725574696c732e736f6c3a4f50436f6e7472616374734d616e616765725574696c7352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204d49505320617420257352756e6e696e6720636861696e20617373657274696f6e73206f6e20746865204c3143726f7373446f6d61696e4d657373656e676572202573206174202573a164736f6c634300080f000a"; + bytes internal constant acc26Code = + hex"608060405234801561001057600080fd5b50600436106103d05760003560e01c80638da5cb5b116101ff578063d220a9e01161011a578063f2c4bc9e116100ad578063f8c68de01161007c578063f8c68de014610a1a578063fd32aa0f14610a22578063fe3d571014610a2a578063ffa1ad7414610a6357600080fd5b8063f2c4bc9e146109d7578063f2fde38b146109ea578063f45e65d8146109fd578063f68016b714610a0657600080fd5b8063e0e2016d116100e9578063e0e2016d1461099e578063e81b2c6d146109a6578063ec707517146109af578063f2b4e617146109cf57600080fd5b8063d220a9e014610975578063d6ae3cd514610985578063dac6e63a1461098e578063dad544e01461099657600080fd5b8063b40a817c11610192578063c4e8ddfa11610161578063c4e8ddfa1461080e578063c9b26f6114610816578063c9ff2d1614610829578063cc731b021461084157600080fd5b8063b40a817c146107c4578063bc49ce5f146107d7578063bfb14fb7146107df578063c0fd4b41146107fb57600080fd5b80639fabcc84116101ce5780639fabcc8414610706578063a39fac121461070e578063a62611a214610790578063a7119869146107bc57600080fd5b80638da5cb5b146106c55780638ed95502146106e3578063935f029e146106eb5780639b7d7f0a146106fe57600080fd5b80632efe2c63116102ef5780634d5d9a2a116102825780635d73369c116102515780635d73369c1461069a578063715018a6146106a25780637616f0e8146106aa5780637e54b8ad146106bd57600080fd5b80634d5d9a2a146105f85780634f16540b1461062957806354fd4d50146106505780635c975abb1461069257600080fd5b8063452a9320116102be578063452a9320146105bd57806347af267b146105c557806348cd4cb1146105e85780634add321d146105f057600080fd5b80632efe2c631461055c57806335e80ab31461056457806338d38c97146105845780633e47158c146105b557600080fd5b806318d1391811610367578063213268491161033657806321326849146104cf578063215b7a1c1461052e57806321d7fde5146105365780632b598b8a1461054957600080fd5b806318d139181461049957806319f5cea8146104ac5780631fd19ee1146104b457806320f06fdc146104bc57600080fd5b80630ae14b1b116103a35780630ae14b1b1461043a5780630c18c16214610459578063155b6c6f1461046257806316d3bc7f1461047557600080fd5b806306c92657146103d5578063078f29cf146103f05780630a2ca2a91461041d5780630a49cb0314610432575b600080fd5b6103dd610a6b565b6040519081526020015b60405180910390f35b6103f8610a99565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e7565b61043061042b366004612c64565b610ad2565b005b6103f8610afc565b631dcd65005b60405167ffffffffffffffff90911681526020016103e7565b6103dd60655481565b610430610470366004612cb4565b610b2c565b606a54610440906c01000000000000000000000000900467ffffffffffffffff1681565b6104306104a7366004612c64565b610b42565b6103dd610b53565b6103f8610b7e565b6104306104ca366004612ce7565b610ba8565b7f435553544f4d5f4741535f544f4b454e00000000000000000000000000000000600052606d6020527f3ec9a18bd22a834e2a13465cc2aa2a9aebb161ffdebf39cdb0028dbb1b5394b45460ff165b60405190151581526020016103e7565b6103f8610bb9565b610430610544366004612d0b565b610be9565b610430610557366004612e59565b610bfb565b6103dd610fce565b606c546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000031681526020016103e7565b6103f8610ff9565b6103f8611204565b61051e6105d3366004612fc9565b606d6020526000908152604090205460ff1681565b6103dd611298565b6104406112c8565b606a546106149068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016103e7565b6103dd7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b60408051808201909152600681527f332e31342e30000000000000000000000000000000000000000000000000000060208201525b6040516103e7919061305c565b61051e6112ee565b6103dd6114fb565b610430611526565b6104306106b836600461306f565b61153a565b6103dd61154b565b60335473ffffffffffffffffffffffffffffffffffffffff166103f8565b6103f8611576565b6104306106f936600461308a565b6115a6565b6103f86115b8565b6106856115e8565b610716611682565b6040516103e79190600060e08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401528060c08501511660c08401525092915050565b606c546104409074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103f86117bd565b6104306107d236600461306f565b6117ed565b6103dd6117fe565b6068546106149068010000000000000000900463ffffffff1681565b610430610809366004612d0b565b611829565b6103f861183b565b610430610824366004612fc9565b61186b565b606a5461061490640100000000900463ffffffff1681565b6109056040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516103e79190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b606a546106149063ffffffff1681565b6103dd606b5481565b6103f861187c565b6103f86118ac565b6103dd611900565b6103dd60675481565b606854610614906c01000000000000000000000000900463ffffffff1681565b6103f861192b565b6104306109e53660046130ba565b6119a7565b6104306109f8366004612c64565b611bb8565b6103dd60665481565b6068546104409067ffffffffffffffff1681565b6103dd611c6c565b6103dd611c97565b606a54610a509074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016103e7565b6103dd600081565b610a9660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d613119565b81565b6000610acd610ac960017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377613119565b5490565b905090565b610ada611cc6565b610af973ffffffffffffffffffffffffffffffffffffffff8216611d47565b50565b6000610acd610ac960017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad613119565b610b34611cc6565b610b3e8282611da8565b5050565b610b4a611cc6565b610af981611eb8565b610a9660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8613119565b6000610acd7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b610bb0611cc6565b610af981611f3c565b6000610acd610ac960017f51547f31a231e1007dca33017faa3da20d959b95087c588a7768bfb922fd5900613119565b610bf1611cc6565b610b3e8282611fa9565b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff16158015610c3b575060005460ff8083169116105b610ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610d056120ae565b610d0d61212f565b610d168c611bb8565b610d1f89611d47565b610d298b8b611fa9565b610d32886121ce565b610d5b7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08889055565b610d8e610d8960017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598613119565b869055565b610dc2610dbc60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637613119565b85519055565b610df9610df060017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8613119565b60208601519055565b610e30610e2760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377613119565b60408601519055565b610e67610e5e60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad613119565b60608601519055565b610e9e610e9560017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d613119565b60808601519055565b610ed5610ecc60017f51547f31a231e1007dca33017faa3da20d959b95087c588a7768bfb922fd5900613119565b60a08601519055565b610f0c610f0360017f99f45962df4bc30de8d4c3c6d1ffc0f100edce16e80c7a5768b6d55ca463ff43613119565b60c08601519055565b610f14612324565b610f1d8661238c565b606b839055606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050505050505050565b610a9660017f99f45962df4bc30de8d4c3c6d1ffc0f100edce16e80c7a5768b6d55ca463ff43613119565b6000806110247fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561104757919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261108a9190613130565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906110e5906060015b604051602081830303815290604052805190602001205490565b1461111c576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061113e906060016110cb565b905073ffffffffffffffffffffffffffffffffffffffff8116156111d2578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cb919061316d565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606c54604080517f452a9320000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163452a93209160048083019260209291908290030181865afa158015611274573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acd919061316d565b6000610acd610ac960017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b606954600090610acd9063ffffffff6a010000000000000000000082048116911661318a565b7f4554485f4c4f434b424f580000000000000000000000000000000000000000006000908152606d6020527f58e88e949bd180ff86d6c072735c3d8d5a05a543c16130176ec0bc0adf3fd80654819060ff166113515761134c610afc565b6113c7565b611359610afc565b73ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c7919061316d565b606c546040517f2e48152c0000000000000000000000000000000000000000000000000000000081526000600482015291925073ffffffffffffffffffffffffffffffffffffffff1690632e48152c90602401602060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145b91906131b6565b806114f55750606c546040517f2e48152c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015290911690632e48152c90602401602060405180830381865afa1580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f591906131b6565b91505090565b610a9660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637613119565b61152e611cc6565b6115386000612800565b565b611542611cc6565b610af981612877565b610a9660017f51547f31a231e1007dca33017faa3da20d959b95087c588a7768bfb922fd5900613119565b6000610acd610ac960017f99f45962df4bc30de8d4c3c6d1ffc0f100edce16e80c7a5768b6d55ca463ff43613119565b6115ae611cc6565b610b3e82826128ea565b6000610acd610ac960017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d613119565b60606115f2611576565b73ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561163c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610acd91908101906131d3565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052806116ce6117bd565b73ffffffffffffffffffffffffffffffffffffffff1681526020016116f161183b565b73ffffffffffffffffffffffffffffffffffffffff168152602001611714610a99565b73ffffffffffffffffffffffffffffffffffffffff168152602001611737610afc565b73ffffffffffffffffffffffffffffffffffffffff16815260200161175a6115b8565b73ffffffffffffffffffffffffffffffffffffffff16815260200161177d610bb9565b73ffffffffffffffffffffffffffffffffffffffff1681526020016117a0611576565b73ffffffffffffffffffffffffffffffffffffffff169052919050565b6000610acd610ac960017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637613119565b6117f5611cc6565b610af9816121ce565b610a9660017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598613119565b611831611cc6565b610b3e82826129c0565b6000610acd610ac960017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8613119565b611873611cc6565b610af981611d47565b6000610acd610ac960017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598613119565b60006118b6610ff9565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611274573d6000803e3d6000fd5b610a9660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b600080611936610afc565b90508073ffffffffffffffffffffffffffffffffffffffff1663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f5919061316d565b6119af6120ae565b6000828152606d602052604090205460ff161515811515036119fd576040517ff5828b0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f4554485f4c4f434b424f580000000000000000000000000000000000000000008203611b4e576000828152606d602052604090205460ff168015611a40575080155b8015611ad857506000611a51610afc565b73ffffffffffffffffffffffffffffffffffffffff1663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abf919061316d565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611b0f576040517ff5828b0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b176112ee565b15611b4e576040517ff5828b0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152606d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091559051909184917fb876f6594132c89891d2fd198e925e999be741ec809abb58bfe9b966876cc06c9190a35050565b611bc0611cc6565b73ffffffffffffffffffffffffffffffffffffffff8116611c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610cc3565b610af981612800565b610a9660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377613119565b610a9660017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad613119565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cc3565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051611d9c919061305c565b60405180910390a35050565b606a80547fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff166801000000000000000063ffffffff8516027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff16176c0100000000000000000000000067ffffffffffffffff841690810291909117909155604080516bffffffff000000000000000085831b16909217602083015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060055b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051611eab919061305c565b60405180910390a3505050565b611ee17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003611d6b565b606a80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000061ffff8416908102919091179091556040805160208082019390935281518082039093018352810190526007611d6b565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506001611e7a565b336120b7610ff9565b73ffffffffffffffffffffffffffffffffffffffff16141580156120f85750336120df6118ac565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611538576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff166121c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610cc3565b611538612b92565b6121d66112c8565b67ffffffffffffffff168167ffffffffffffffff161015612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610cc3565b631dcd650067ffffffffffffffff821611156122cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610cc3565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611d6b565b612352610ac960017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b6000036115385761153861238760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0613119565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff16111561243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610cc3565b6001816040015160ff16116124d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610cc3565b6068546080820151825167ffffffffffffffff909216916124f4919061329e565b63ffffffff161115612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610cc3565b6000816020015160ff16116125f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610cc3565b8051602082015163ffffffff82169160ff909116906126199082906132bd565b6126239190613307565b63ffffffff16146126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610cc3565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606c80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040805160208082019390935281518082039093018352810190526006611d6b565b7fff0000000000000000000000000000000000000000000000000000000000000081161561299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610cc3565b606582905560668190556040805160208101849052908101829052600090606001612077565b60018263ffffffff161015612a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65203e3d203100000000000000000000000000000000000000000000000000006064820152608401610cc3565b60018163ffffffff161015612aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f53797374656d436f6e6669673a20656c6173746963697479206d75737420626560448201527f203e3d20310000000000000000000000000000000000000000000000000000006064820152608401610cc3565b606a805463ffffffff83811664010000000081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009093169186169190911791909117909155604051600091612b5b91602086811b67ffffffff0000000016909217910190815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506004611e7a565b600054610100900460ff16612c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610cc3565b61153833612800565b73ffffffffffffffffffffffffffffffffffffffff81168114610af957600080fd5b8035612c5f81612c32565b919050565b600060208284031215612c7657600080fd5b8135612c8181612c32565b9392505050565b803563ffffffff81168114612c5f57600080fd5b803567ffffffffffffffff81168114612c5f57600080fd5b60008060408385031215612cc757600080fd5b612cd083612c88565b9150612cde60208401612c9c565b90509250929050565b600060208284031215612cf957600080fd5b813561ffff81168114612c8157600080fd5b60008060408385031215612d1e57600080fd5b612d2783612c88565b9150612cde60208401612c88565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612d8757612d87612d35565b60405290565b803560ff81168114612c5f57600080fd5b600060e08284031215612db057600080fd5b60405160e0810181811067ffffffffffffffff82111715612dd357612dd3612d35565b6040529050808235612de481612c32565b81526020830135612df481612c32565b60208201526040830135612e0781612c32565b60408201526060830135612e1a81612c32565b6060820152612e2b60808401612c54565b6080820152612e3c60a08401612c54565b60a0820152612e4d60c08401612c54565b60c08201525092915050565b60008060008060008060008060008060008b8d036102c0811215612e7c57600080fd5b8c35612e8781612c32565b9b50612e9560208e01612c88565b9a50612ea360408e01612c88565b995060608d01359850612eb860808e01612c9c565b975060a08d0135612ec881612c32565b965060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215612efa57600080fd5b50612f03612d64565b612f0f60c08e01612c88565b8152612f1d60e08e01612d8d565b6020820152612f2f6101008e01612d8d565b6040820152612f416101208e01612c88565b6060820152612f536101408e01612c88565b60808201526101608d01356fffffffffffffffffffffffffffffffff81168114612f7c57600080fd5b60a08201529450612f906101808d01612c54565b9350612fa08d6101a08e01612d9e565b92506102808c01359150612fb76102a08d01612c54565b90509295989b509295989b9093969950565b600060208284031215612fdb57600080fd5b5035919050565b60005b83811015612ffd578181015183820152602001612fe5565b8381111561300c576000848401525b50505050565b6000815180845261302a816020860160208601612fe2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c816020830184613012565b60006020828403121561308157600080fd5b612c8182612c9c565b6000806040838503121561309d57600080fd5b50508035926020909101359150565b8015158114610af957600080fd5b600080604083850312156130cd57600080fd5b8235915060208301356130df816130ac565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561312b5761312b6130ea565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613168576131686130ea565b500290565b60006020828403121561317f57600080fd5b8151612c8181612c32565b600067ffffffffffffffff8083168185168083038211156131ad576131ad6130ea565b01949350505050565b6000602082840312156131c857600080fd5b8151612c81816130ac565b6000602082840312156131e557600080fd5b815167ffffffffffffffff808211156131fd57600080fd5b818401915084601f83011261321157600080fd5b81518181111561322357613223612d35565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561326957613269612d35565b8160405282815287602084870101111561328257600080fd5b613293836020830160208801612fe2565b979650505050505050565b600063ffffffff8083168185168083038211156131ad576131ad6130ea565b600063ffffffff808416806132fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561332a5761332a6130ea565b0294935050505056fea164736f6c634300080f000a"; + bytes internal constant acc27Code = + hex"6080604052600436106101cd5760003560e01c80635c975abb116100f7578063b1b1b20911610095578063db505d8011610064578063db505d8014610556578063ddd5a40f14610583578063e46e245a14610599578063ecc70428146105ae57600080fd5b8063b1b1b209146104de578063b28ade251461050e578063d764ad0b1461052e578063dad544e01461054157600080fd5b806383a74074116100d157806383a740741461046c5780638cbeeef2146103835780639fce812c14610483578063a4e7f8bd146104ae57600080fd5b80635c975abb146104055780636425666b1461042a5780636e296e451461045757600080fd5b806338d38c971161016f578063485cc9551161013e578063485cc955146103635780634c1d6a691461038357806354fd4d50146103995780635644cfdf146103ef57600080fd5b806338d38c97146102d35780633dbb202b146103115780633e47158c146103265780633f827a5a1461033b57600080fd5b80632828d7e8116101ab5780632828d7e8146102665780632f7d39221461027b57806333d7e2bd1461029157806335e80ab3146102be57600080fd5b8063028f85f7146101d25780630c568498146102055780630ff754ea1461021a575b600080fd5b3480156101de57600080fd5b506101e7601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561021157600080fd5b506101e7603f81565b34801561022657600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fc565b34801561027257600080fd5b506101e7604081565b34801561028757600080fd5b506101e761520881565b34801561029d57600080fd5b5060fe546102419073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ca57600080fd5b50610241610613565b3480156102df57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000031681526020016101fc565b61032461031f366004611f13565b6106ac565b005b34801561033257600080fd5b5061024161093f565b34801561034757600080fd5b50610350600181565b60405161ffff90911681526020016101fc565b34801561036f57600080fd5b5061032461037e366004611f7a565b610b4a565b34801561038f57600080fd5b506101e7619c4081565b3480156103a557600080fd5b506103e26040518060400160405280600681526020017f322e31312e31000000000000000000000000000000000000000000000000000081525081565b6040516101fc919061201e565b3480156103fb57600080fd5b506101e761138881565b34801561041157600080fd5b5061041a610da4565b60405190151581526020016101fc565b34801561043657600080fd5b5060fc546102419073ffffffffffffffffffffffffffffffffffffffff1681565b34801561046357600080fd5b50610241610e38565b34801561047857600080fd5b506101e762030d4081565b34801561048f57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff16610241565b3480156104ba57600080fd5b5061041a6104c9366004612031565b60ce6020526000908152604090205460ff1681565b3480156104ea57600080fd5b5061041a6104f9366004612031565b60cb6020526000908152604090205460ff1681565b34801561051a57600080fd5b506101e7610529366004612079565b610f1f565b61032461053c366004612159565b610fe0565b34801561054d57600080fd5b506102416118f5565b34801561056257600080fd5b5060cf546102419073ffffffffffffffffffffffffffffffffffffffff1681565b34801561058f57600080fd5b506101e761010481565b3480156105a557600080fd5b506101e7602881565b3480156105ba57600080fd5b5061060560cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101fc565b60fe54604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a791906121df565b905090565b60cf54604080516020601f86018190048102820181019092528481526108149273ffffffffffffffffffffffffffffffffffffffff169161070a91908790879081908401838280828437600092019190915250879250610f1f915050565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061077660cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016107929796959493929190612245565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611949565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561089960cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516108ab9594939291906122a4565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60008061096a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561098d57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026109d09190612321565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610a2b906060015b604051602081830303815290604052805190602001205490565b14610a62576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610a8490606001610a11565b905073ffffffffffffffffffffffffffffffffffffffff811615610b18578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1191906121df565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000036000547501000000000000000000000000000000000000000000900460ff16158015610bb6575060005460ff8083167401000000000000000000000000000000000000000090920416105b610c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60ff84167401000000000000000000000000000000000000000002167fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909116177501000000000000000000000000000000000000000000179055610ccf6119e2565b60fe805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805492851692909116919091179055610d41734200000000000000000000000000000000000007611a65565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60fe54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a7919061235e565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f742073657400000000000000000000006064820152608401610c3e565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600080603f610f35604063ffffffff8616612380565b610f3f91906123b0565b611388619c40610f528162030d406123fe565b610f5c91906123fe565b610f6691906123fe565b610f7091906123fe565b9050600061010467ffffffffffffffff168551610f8d919061242a565b9050610fcb610f9d601083612380565b610fa790846123fe565b67ffffffffffffffff16610fbc602884612380565b67ffffffffffffffff16611ba1565b610fd7906152086123fe565b95945050505050565b610fe8610da4565b1561104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a20706175736564000000006044820152606401610c3e565b60f087901c6002811061110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a401610c3e565b8061ffff166000036111ff57600061115b878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250611bba915050565b600081815260cb602052604090205490915060ff16156111fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c617965640000000000000000006064820152608401610c3e565b505b6000611245898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bd992505050565b905061124f611bfc565b156112875785341461126357611263612442565b600081815260ce602052604090205460ff161561128257611282612442565b6113d9565b341561133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a401610c3e565b600081815260ce602052604090205460ff166113d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c61796564000000000000000000000000000000006064820152608401610c3e565b6113e287611cd8565b15611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a401610c3e565b600081815260cb602052604090205460ff1615611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c61796564000000000000000000006064820152608401610c3e565b61155585611546611388619c406123fe565b67ffffffffffffffff16611d1e565b158061157b575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561169457600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610c3e565b50506118ec565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061172588619c405a6116e89190612471565b8988888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d3c92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156117db57600082815260cb602052604090205460ff161561177857611778612442565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26118e8565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016118e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610c3e565b5050505b50505050505050565b60006118ff61093f565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610683573d6000803e3d6000fd5b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c429084906119aa908890839089906000908990600401612488565b6000604051808303818588803b1580156119c357600080fd5b505af11580156119d7573d6000803e3d6000fd5b505050505050505050565b336119eb61093f565b73ffffffffffffffffffffffffffffffffffffffff1614158015611a2c575033611a136118f5565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611a63576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000547501000000000000000000000000000000000000000000900460ff16611b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610c3e565b60cc5473ffffffffffffffffffffffffffffffffffffffff16611b5a5760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081831015611bb15781611bb3565b825b9392505050565b6000611bc885858585611d54565b805190602001209050949350505050565b6000611be9878787878787611ded565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156106a7575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa158015611c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbc91906121df565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611d18575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000806000835160208501868989f195945050505050565b606084848484604051602401611d6d94939291906124e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611e0a9695949392919061252a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611eae57600080fd5b50565b60008083601f840112611ec357600080fd5b50813567ffffffffffffffff811115611edb57600080fd5b602083019150836020828501011115611ef357600080fd5b9250929050565b803563ffffffff81168114611f0e57600080fd5b919050565b60008060008060608587031215611f2957600080fd5b8435611f3481611e8c565b9350602085013567ffffffffffffffff811115611f5057600080fd5b611f5c87828801611eb1565b9094509250611f6f905060408601611efa565b905092959194509250565b60008060408385031215611f8d57600080fd5b8235611f9881611e8c565b91506020830135611fa881611e8c565b809150509250929050565b6000815180845260005b81811015611fd957602081850181015186830182015201611fbd565b81811115611feb576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611bb36020830184611fb3565b60006020828403121561204357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561208c57600080fd5b823567ffffffffffffffff808211156120a457600080fd5b818501915085601f8301126120b857600080fd5b8135818111156120ca576120ca61204a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156121105761211061204a565b8160405282815288602084870101111561212957600080fd5b82602086016020830137600060208483010152809650505050505061215060208401611efa565b90509250929050565b600080600080600080600060c0888a03121561217457600080fd5b87359650602088013561218681611e8c565b9550604088013561219681611e8c565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156121c057600080fd5b6121cc8a828b01611eb1565b989b979a50959850939692959293505050565b6000602082840312156121f157600080fd5b8151611bb381611e8c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a083015261229760c0830184866121fc565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff861681526080602082015260006122d46080830186886121fc565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612359576123596122f2565b500290565b60006020828403121561237057600080fd5b81518015158114611bb357600080fd5b600067ffffffffffffffff808316818516818304811182151516156123a7576123a76122f2565b02949350505050565b600067ffffffffffffffff808416806123f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115612421576124216122f2565b01949350505050565b6000821982111561243d5761243d6122f2565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015612483576124836122f2565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a0608082015260006124d560a0830184611fb3565b979650505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526125196080830185611fb3565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261257560c0830184611fb3565b9897505050505050505056fea164736f6c634300080f000a"; + bytes internal constant acc28Code = + hex"608060405234801561001057600080fd5b50600436106101005760003560e01c80635c975abb11610097578063927ede2d11610066578063927ede2d1461029e578063aa557452146102bc578063c89701a2146102cf578063dad544e0146102ef57600080fd5b80635c975abb146102215780635d93a3fc14610239578063761f44931461026d5780637f46ddb21461028057600080fd5b80633cb747bf116100d35780633cb747bf1461019d5780633e47158c146101bd578063485cc955146101c557806354fd4d50146101d857600080fd5b806333d7e2bd1461010557806335e80ab31461014f5780633687011a1461015757806338d38c971461016c575b600080fd5b6033546101259073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101256102f7565b61016a6101653660046113be565b610390565b005b60405160ff7f0000000000000000000000000000000000000000000000000000000000000003168152602001610146565b6001546101259073ffffffffffffffffffffffffffffffffffffffff1681565b610125610441565b61016a6101d3366004611441565b61064c565b6102146040518060400160405280600581526020017f322e392e3100000000000000000000000000000000000000000000000000000081525081565b60405161014691906114e5565b610229610812565b6040519015158152602001610146565b6102296102473660046114ff565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61016a61027b366004611540565b6108a6565b60025473ffffffffffffffffffffffffffffffffffffffff16610125565b60015473ffffffffffffffffffffffffffffffffffffffff16610125565b61016a6102ca3660046115d8565b610d4d565b6002546101259073ffffffffffffffffffffffffffffffffffffffff1681565b610125610e09565b603354604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b919061164f565b905090565b610398610e5d565b610429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104398686333388888888610e9a565b505050505050565b60008061046c7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561048f57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026104d2919061166c565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061052d906060015b604051602081830303815290604052805190602001205490565b14610564576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061058690606001610513565b905073ffffffffffffffffffffffffffffffffffffffff81161561061a578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610613919061164f565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff1615801561068c575060005460ff8083169116105b610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610420565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556107516111ca565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556107af8373420000000000000000000000000000000000001461124d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b603354604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b91906116d0565b60015473ffffffffffffffffffffffffffffffffffffffff163314801561097b5750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561093f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610963919061164f565b73ffffffffffffffffffffffffffffffffffffffff16145b610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f7468657220627269646765006064820152608401610420565b610a0f610812565b15610a76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a20706175736564000000000000000000006044820152606401610420565b3073ffffffffffffffffffffffffffffffffffffffff881603610b1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c66000000000000000000000000000000000000000000006064820152608401610420565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff161515600114610bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c3120427269646765000000000000006064820152608401610420565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610d3c949392919061173b565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f742062652061646472657373283029000000000000000000000000000000006064820152608401610420565b610e008787338888888888610e9a565b50505050505050565b6000610e13610441565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610367573d6000803e3d6000fd5b6000323303610e6c5750600190565b333b601703610e9457604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b73ffffffffffffffffffffffffffffffffffffffff8716610f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f7420626520616464726573732830290000000000000000000000000000006064820152608401610420565b600087898888888787604051602401610f5c979695949392919061177b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f761f44930000000000000000000000000000000000000000000000000000000017905273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603184528481208e8416825284528481208b82529093529183902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905591517f23b872dd000000000000000000000000000000000000000000000000000000008152918a166004830152306024830152604482018890529192506323b872dd90606401600060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b935061110b9290911690859089906004016117d8565b600060405180830381600087803b15801561112557600080fd5b505af1158015611139573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a5898988886040516111b7949392919061173b565b60405180910390a4505050505050505050565b336111d3610441565b73ffffffffffffffffffffffffffffffffffffffff16141580156112145750336111fb610e09565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561124b576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600054610100900460ff166112e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610420565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff8116811461135957600080fd5b50565b803563ffffffff8116811461137057600080fd5b919050565b60008083601f84011261138757600080fd5b50813567ffffffffffffffff81111561139f57600080fd5b6020830191508360208285010111156113b757600080fd5b9250929050565b60008060008060008060a087890312156113d757600080fd5b86356113e281611337565b955060208701356113f281611337565b9450604087013593506114076060880161135c565b9250608087013567ffffffffffffffff81111561142357600080fd5b61142f89828a01611375565b979a9699509497509295939492505050565b6000806040838503121561145457600080fd5b823561145f81611337565b9150602083013561146f81611337565b809150509250929050565b6000815180845260005b818110156114a057602081850181015186830182015201611484565b818111156114b2576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114f8602083018461147a565b9392505050565b60008060006060848603121561151457600080fd5b833561151f81611337565b9250602084013561152f81611337565b929592945050506040919091013590565b600080600080600080600060c0888a03121561155b57600080fd5b873561156681611337565b9650602088013561157681611337565b9550604088013561158681611337565b9450606088013561159681611337565b93506080880135925060a088013567ffffffffffffffff8111156115b957600080fd5b6115c58a828b01611375565b989b979a50959850939692959293505050565b600080600080600080600060c0888a0312156115f357600080fd5b87356115fe81611337565b9650602088013561160e81611337565b9550604088013561161e81611337565b9450606088013593506116336080890161135c565b925060a088013567ffffffffffffffff8111156115b957600080fd5b60006020828403121561166157600080fd5b81516114f881611337565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156116cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b6000602082840312156116e257600080fd5b815180151581146114f857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006117716060830184866116f2565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526117cb60c0830184866116f2565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611807606083018561147a565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"; + bytes internal constant acc29Code = + hex"6080604052600436106101a55760003560e01c80635c975abb116100e1578063927ede2d1161008a578063b1a1a88211610064578063b1a1a88214610597578063c89701a2146105aa578063dad544e0146105d7578063e11013dd146105ec57600080fd5b8063927ede2d146105395780639a2ac6d514610564578063a9f9e6751461057757600080fd5b806387087623116100bb57806387087623146104d35780638f601f66146104f357806391c49bf81461048857600080fd5b80635c975abb146104635780637f46ddb214610488578063838b2520146104b357600080fd5b806338d38c971161014e578063485cc95511610128578063485cc955146103ad578063540abf73146103cd57806354fd4d50146103ed57806358a997f61461044357600080fd5b806338d38c971461032d5780633cb747bf1461036b5780633e47158c1461039857600080fd5b80631635f5fd1161017f5780631635f5fd146102ae57806333d7e2bd146102c157806335e80ab31461031857600080fd5b80630166a07a1461026857806309fc8843146102885780631532ec341461029b57600080fd5b36610263576101b26105ff565b610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610261333362030d406040518060200160405280600081525061063c565b005b600080fd5b34801561027457600080fd5b50610261610283366004612b73565b61064f565b610261610296366004612c24565b610a69565b6102616102a9366004612c77565b610b45565b6102616102bc366004612c77565b610b59565b3480156102cd57600080fd5b506034546102ee9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561032457600080fd5b506102ee611022565b34801561033957600080fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000316815260200161030f565b34801561037757600080fd5b506003546102ee9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a457600080fd5b506102ee6110bb565b3480156103b957600080fd5b506102616103c8366004612cea565b6112c6565b3480156103d957600080fd5b506102616103e8366004612d23565b61148c565b3480156103f957600080fd5b506104366040518060400160405280600581526020017f322e382e3100000000000000000000000000000000000000000000000000000081525081565b60405161030f9190612e10565b34801561044f57600080fd5b5061026161045e366004612e23565b6114d1565b34801561046f57600080fd5b506104786115aa565b604051901515815260200161030f565b34801561049457600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102ee565b3480156104bf57600080fd5b506102616104ce366004612d23565b61163e565b3480156104df57600080fd5b506102616104ee366004612e23565b611683565b3480156104ff57600080fd5b5061052b61050e366004612cea565b600260209081526000928352604080842090915290825290205481565b60405190815260200161030f565b34801561054557600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102ee565b610261610572366004612ea6565b61175c565b34801561058357600080fd5b50610261610592366004612b73565b61179e565b6102616105a5366004612c24565b6117ad565b3480156105b657600080fd5b506004546102ee9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105e357600080fd5b506102ee611883565b6102616105fa366004612ea6565b6118d7565b600032330361060e5750600190565b333b60170361063657604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b610649848434858561191a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610722575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a9190612f09565b73ffffffffffffffffffffffffffffffffffffffff16145b6107d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161023a565b6107dc6115aa565b15610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a2070617573656400000000000000000000604482015260640161023a565b61084c87611ae4565b1561099a5761085b8787611b46565b61090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a40161023a565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561097d57600080fd5b505af1158015610991573d6000803e3d6000fd5b50505050610a1c565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546109d8908490612f55565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610a1c908585611c66565b610a60878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d3a92505050565b50505050505050565b610a716105ff565b610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b610b403333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061191a92505050565b505050565b610b528585858585610b59565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610c2c575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190612f09565b73ffffffffffffffffffffffffffffffffffffffff16145b610cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161023a565b610ce66115aa565b15610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a2070617573656400000000000000000000604482015260640161023a565b823414610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e74207265717569726564000000000000606482015260840161023a565b3073ffffffffffffffffffffffffffffffffffffffff851603610e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c660000000000000000000000000000000000000000000000000000000000606482015260840161023a565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e676572000000000000000000000000000000000000000000000000606482015260840161023a565b610f6e85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dc892505050565b6000610f8b855a8660405180602001604052806000815250611e3b565b90508061101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161023a565b505050505050565b603454604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b69190612f09565b905090565b6000806110e67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561110957919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261114c9190612f6c565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906111a7906060015b604051602081830303815290604052805190602001205490565b146111de576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906112009060600161118d565b905073ffffffffffffffffffffffffffffffffffffffff811615611294578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128d9190612f09565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff16158015611306575060005460ff8083169116105b611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161023a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556113cb611e53565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905561142983734200000000000000000000000000000000000010611ed6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610a6087873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fc092505050565b6114d96105ff565b611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b61101a86863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237992505050565b603454604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b69190612fa9565b610a6087873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237992505050565b61168b6105ff565b611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b61101a86863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fc092505050565b61064933858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061063c92505050565b610a608787878787878761064f565b6117b56105ff565b611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161023a565b610b4033338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061063c92505050565b600061188d6110bb565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611092573d6000803e3d6000fd5b6106493385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061191a92505050565b8234146119a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c75650000606482015260840161023a565b6119b585858584612388565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611a18908b908b9086908a90602401612fcb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b9092168252611aab92918890600401613014565b6000604051808303818588803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b50505050505050505050565b6000611b10827f1d1d8b63000000000000000000000000000000000000000000000000000000006123fb565b80611b405750611b40827fec4fc8e3000000000000000000000000000000000000000000000000000000006123fb565b92915050565b6000611b72837f1d1d8b63000000000000000000000000000000000000000000000000000000006123fb565b15611c1b578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be69190612f09565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611b40565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b409084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261241e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611db293929190613059565b60405180910390a461101a86868686868661252a565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611e27929190613097565b60405180910390a3610649848484846125b2565b6000806000835160208501868989f195945050505050565b33611e5c6110bb565b73ffffffffffffffffffffffffffffffffffffffff1614158015611e9d575033611e84611883565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611ed4576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600054610100900460ff16611f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161023a565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b341561204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161023a565b61205787611ae4565b156121a5576120668787611b46565b612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a40161023a565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b15801561218857600080fd5b505af115801561219c573d6000803e3d6000fd5b50505050612239565b6121c773ffffffffffffffffffffffffffffffffffffffff881686308661261f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546122059084906130b0565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b61224787878787878661267d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a00000000000000000000000000000000000000000000000000000000906122ab908b908d908c908c908c908b906024016130c8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261233e92918790600401613014565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b5050505050505050505050565b610a6087878787878787611fc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f2384846040516123e7929190613097565b60405180910390a36106498484848461270b565b60006124068361276a565b8015612417575061241783836127ce565b9392505050565b6000612480826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661289d9092919063ffffffff16565b805190915015610b40578080602001905181019061249e9190612fa9565b610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161023a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516125a293929190613059565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612611929190613097565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526106499085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611cb8565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d03968686866040516126f593929190613059565b60405180910390a461101a8686868686866128b4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612611929190613097565b6000612796827f01ffc9a7000000000000000000000000000000000000000000000000000000006127ce565b8015611b4057506127c7827fffffffff000000000000000000000000000000000000000000000000000000006127ce565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612886575060208210155b80156128925750600081115b979650505050505050565b60606128ac848460008561292c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516125a293929190613059565b6060824710156129be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161023a565b73ffffffffffffffffffffffffffffffffffffffff85163b612a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161023a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612a659190613123565b60006040518083038185875af1925050503d8060008114612aa2576040519150601f19603f3d011682016040523d82523d6000602084013e612aa7565b606091505b509150915061289282828660608315612ac1575081612417565b825115612ad15782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023a9190612e10565b73ffffffffffffffffffffffffffffffffffffffff81168114612b2757600080fd5b50565b60008083601f840112612b3c57600080fd5b50813567ffffffffffffffff811115612b5457600080fd5b602083019150836020828501011115612b6c57600080fd5b9250929050565b600080600080600080600060c0888a031215612b8e57600080fd5b8735612b9981612b05565b96506020880135612ba981612b05565b95506040880135612bb981612b05565b94506060880135612bc981612b05565b93506080880135925060a088013567ffffffffffffffff811115612bec57600080fd5b612bf88a828b01612b2a565b989b979a50959850939692959293505050565b803563ffffffff81168114612c1f57600080fd5b919050565b600080600060408486031215612c3957600080fd5b612c4284612c0b565b9250602084013567ffffffffffffffff811115612c5e57600080fd5b612c6a86828701612b2a565b9497909650939450505050565b600080600080600060808688031215612c8f57600080fd5b8535612c9a81612b05565b94506020860135612caa81612b05565b935060408601359250606086013567ffffffffffffffff811115612ccd57600080fd5b612cd988828901612b2a565b969995985093965092949392505050565b60008060408385031215612cfd57600080fd5b8235612d0881612b05565b91506020830135612d1881612b05565b809150509250929050565b600080600080600080600060c0888a031215612d3e57600080fd5b8735612d4981612b05565b96506020880135612d5981612b05565b95506040880135612d6981612b05565b945060608801359350612d7e60808901612c0b565b925060a088013567ffffffffffffffff811115612bec57600080fd5b60005b83811015612db5578181015183820152602001612d9d565b838111156106495750506000910152565b60008151808452612dde816020860160208601612d9a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124176020830184612dc6565b60008060008060008060a08789031215612e3c57600080fd5b8635612e4781612b05565b95506020870135612e5781612b05565b945060408701359350612e6c60608801612c0b565b9250608087013567ffffffffffffffff811115612e8857600080fd5b612e9489828a01612b2a565b979a9699509497509295939492505050565b60008060008060608587031215612ebc57600080fd5b8435612ec781612b05565b9350612ed560208601612c0b565b9250604085013567ffffffffffffffff811115612ef157600080fd5b612efd87828801612b2a565b95989497509550505050565b600060208284031215612f1b57600080fd5b815161241781612b05565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612f6757612f67612f26565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fa457612fa4612f26565b500290565b600060208284031215612fbb57600080fd5b8151801515811461241757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261300a6080830184612dc6565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006130436060830185612dc6565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260606040820152600061308e6060830184612dc6565b95945050505050565b8281526040602082015260006128ac6040830184612dc6565b600082198211156130c3576130c3612f26565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261311760c0830184612dc6565b98975050505050505050565b60008251613135818460208701612d9a565b919091019291505056fea164736f6c634300080f000a"; + bytes internal constant acc30Code = + hex"60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063c4d66de81162000062578063c4d66de81462000175578063ce5ac90f146200018e578063e78cea9214620001a5578063ee9a31a214620001c657600080fd5b8063316b3739146200009857806354fd4d5014620000fb578063896f93d114620001475780638cf0629c146200015e575b600080fd5b620000d1620000a936600462000636565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620001386040518060400160405280600681526020017f312e31302e32000000000000000000000000000000000000000000000000000081525081565b604051620000f29190620006c9565b620000d162000158366004620007c0565b620001e5565b620000d16200016f3660046200083d565b620001fc565b6200018c6200018636600462000636565b6200041b565b005b620000d16200019f366004620007c0565b620005ed565b600154620000d19073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000d1565b6000620001f4848484620005ed565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8516620002a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b600085858585604051602001620002c29493929190620008d4565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888888886040516200031290620005fe565b620003229594939291906200092e565b8190604051809103906000f590508015801562000343573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff81811660008181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948d1694851790555193945090927fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf9190a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff16158080156200043c5750600054600160ff909116105b80620004585750303b15801562000458575060005460ff166001145b620004e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200029e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200054557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015620005e957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001f48484846012620001fc565b6120e0806200099483390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200063157600080fd5b919050565b6000602082840312156200064957600080fd5b62000654826200060c565b9392505050565b6000815180845260005b81811015620006835760208185018101518683018201520162000665565b8181111562000696576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200065460208301846200065b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200071f57600080fd5b813567ffffffffffffffff808211156200073d576200073d620006de565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620007865762000786620006de565b81604052838152866020858801011115620007a057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215620007d657600080fd5b620007e1846200060c565b9250602084013567ffffffffffffffff80821115620007ff57600080fd5b6200080d878388016200070d565b935060408601359150808211156200082457600080fd5b5062000833868287016200070d565b9150509250925092565b600080600080608085870312156200085457600080fd5b6200085f856200060c565b9350602085013567ffffffffffffffff808211156200087d57600080fd5b6200088b888389016200070d565b94506040870135915080821115620008a257600080fd5b50620008b1878288016200070d565b925050606085013560ff81168114620008c957600080fd5b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006200090560808301866200065b565b82810360408401526200091981866200065b565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200096960a08301866200065b565b82810360608401526200097d81866200065b565b91505060ff83166080830152969550505050505056fe6101a06040523480156200001257600080fd5b50604051620020e0380380620020e0833981016040819052620000359162000215565b6040805180820190915260018152603160f81b6020820152839081908185600362000061838262000350565b50600462000070828262000350565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060c05261012052505050506001600160a01b0394851661014052509390921661016052505060ff16610180526200041c565b80516001600160a01b03811681146200014357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200017057600080fd5b81516001600160401b03808211156200018d576200018d62000148565b604051601f8301601f19908116603f01168101908282118183101715620001b857620001b862000148565b81604052838152602092508683858801011115620001d557600080fd5b600091505b83821015620001f95785820183015181830184015290820190620001da565b838211156200020b5760008385830101525b9695505050505050565b600080600080600060a086880312156200022e57600080fd5b62000239866200012b565b945062000249602087016200012b565b60408701519094506001600160401b03808211156200026757600080fd5b6200027589838a016200015e565b945060608801519150808211156200028c57600080fd5b506200029b888289016200015e565b925050608086015160ff81168114620002b357600080fd5b809150509295509295909350565b600181811c90821680620002d657607f821691505b602082108103620002f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034b57600081815260208120601f850160051c81016020861015620003265750805b601f850160051c820191505b81811015620003475782815560010162000332565b5050505b505050565b81516001600160401b038111156200036c576200036c62000148565b62000384816200037d8454620002c1565b84620002fd565b602080601f831160018114620003bc5760008415620003a35750858301515b600019600386901b1c1916600185901b17855562000347565b600085815260208120601f198616915b82811015620003ed57888601518255948401946001909101908401620003cc565b50858210156200040c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516101005161012051610140516101605161018051611c37620004a960003960006102700152600081816103a70152818161041c0152818161064801526107aa0152600081816101d501526103cd01526000611174015260006111c30152600061119e015260006110f7015260006111210152600061114b0152611c376000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063ae1f6aaf11610097578063d6c0b2c411610071578063d6c0b2c4146103cb578063dd62ed3e14610404578063e78cea92146103a5578063ee9a31a21461041757600080fd5b8063ae1f6aaf146103a5578063c01e1bd6146103cb578063d505accf146103f157600080fd5b80639dc29fac116100c85780639dc29fac1461036c578063a457c2d71461037f578063a9059cbb1461039257600080fd5b806370a082311461031b5780637ecebe001461035157806395d89b411461036457600080fd5b8063313ce5671161015057806340c10f191161012a57806340c10f19146102b557806354fd4d50146102ca5780636afdd8501461030657600080fd5b8063313ce567146102695780633644e5151461029a57806339509351146102a257600080fd5b8063095ea7b311610181578063095ea7b31461023157806318160ddd1461024457806323b872dd1461025657600080fd5b806301ffc9a7146101a8578063033964be146101d057806306fdde031461021c575b600080fd5b6101bb6101b636600461194b565b61043e565b60405190151581526020015b60405180910390f35b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b61022461052f565b6040516101c7919061198d565b6101bb61023f366004611a29565b6105c1565b6002545b6040519081526020016101c7565b6101bb610264366004611a53565b6105db565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c7565b6102486105ff565b6101bb6102b0366004611a29565b61060e565b6102c86102c3366004611a29565b610630565b005b6102246040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b6e22d473030f116ddee9f6b43ac78ba36101f7565b610248610329366004611a8f565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61024861035f366004611a8f565b610758565b610224610783565b6102c861037a366004611a29565b610792565b6101bb61038d366004611a29565b6108a9565b6101bb6103a0366004611a29565b610956565b7f00000000000000000000000000000000000000000000000000000000000000006101f7565b7f00000000000000000000000000000000000000000000000000000000000000006101f7565b6102c86103ff366004611aaa565b610964565b610248610412366004611b1d565b610b23565b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104f757507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061052657507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461053e90611b50565b80601f016020809104026020016040519081016040528092919081815260200182805461056a90611b50565b80156105b75780601f1061058c576101008083540402835291602001916105b7565b820191906000526020600020905b81548152906001019060200180831161059a57829003601f168201915b5050505050905090565b6000336105cf818585610bc4565b60019150505b92915050565b6000336105e9858285610d78565b6105f4858585610e2a565b506001949350505050565b60006106096110dd565b905090565b6000336105cf8185856106218383610b23565b61062b9190611bcc565b610bc4565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6107048282611211565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161074c91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120546105d5565b60606004805461053e90611b50565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106f1565b6108618282611331565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161074c91815260200190565b600033816108b78286610b23565b905083811015610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106f1565b6105f48286868403610bc4565b6000336105cf818585610e2a565b834211156109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016106f1565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109fd8c611516565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610a658261154b565b90506000610a75828787876115b4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016106f1565b610b178a8a8a610bc4565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffdd2b8cfcf0ee922116094bc538745d73ffffffffffffffffffffffffffffffffffffffff831601610b8957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105d5565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160209081526040808320938616835292905220545b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff8216610d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610d848484610b23565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e245781811015610e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106f1565b610e248484848403610bc4565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff8216610f70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822085850390559185168152908120805484929061106a908490611bcc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110d091815260200190565b60405180910390a3610e24565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561114357507f000000000000000000000000000000000000000000000000000000000000000046145b1561116d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b73ffffffffffffffffffffffffffffffffffffffff821661128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f1565b80600260008282546112a09190611bcc565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040812080548392906112da908490611bcc565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166113d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906114c6908490611be4565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d6b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006105d56115586110dd565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006115c5878787876115dc565b915091506115d2816116f4565b5095945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561161357506000905060036116eb565b8460ff16601b1415801561162b57508460ff16601c14155b1561163c57506000905060046116eb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611690573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116e4576000600192509250506116eb565b9150600090505b94509492505050565b600081600481111561170857611708611bfb565b036117105750565b600181600481111561172457611724611bfb565b0361178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106f1565b600281600481111561179f5761179f611bfb565b03611806576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106f1565b600381600481111561181a5761181a611bfb565b036118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b60048160048111156118bb576118bb611bfb565b03611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b50565b60006020828403121561195d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bbd57600080fd5b600060208083528351808285015260005b818110156119ba5785810183015185820160400152820161199e565b818111156119cc576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a2457600080fd5b919050565b60008060408385031215611a3c57600080fd5b611a4583611a00565b946020939093013593505050565b600080600060608486031215611a6857600080fd5b611a7184611a00565b9250611a7f60208501611a00565b9150604084013590509250925092565b600060208284031215611aa157600080fd5b610bbd82611a00565b600080600080600080600060e0888a031215611ac557600080fd5b611ace88611a00565b9650611adc60208901611a00565b95506040880135945060608801359350608088013560ff81168114611b0057600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611b3057600080fd5b611b3983611a00565b9150611b4760208401611a00565b90509250929050565b600181811c90821680611b6457607f821691505b602082108103611545577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611bdf57611bdf611b9d565b500190565b600082821015611bf657611bf6611b9d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a"; + bytes internal constant acc31Code = + hex"6080604052600436106101d15760003560e01c806371c1566e116100f7578063a3860f4811610095578063cff0ab9611610064578063cff0ab9614610620578063dad544e0146106c1578063e9e05c42146106d6578063f2b4e617146106e957600080fd5b8063a3860f4814610520578063b682c44414610540578063bb2c727e14610560578063bf653a5c146105ed57600080fd5b8063952b2797116100d1578063952b27971461049b5780639bf62d82146104b0578063a14238e7146104d0578063a35d99df1461050057600080fd5b806371c1566e1461045b5780638b4c40b0146101f65780638c3152e91461047b57600080fd5b806345884d321161016f578063513747ab1161013e578063513747ab1461039f57806354fd4d50146103da5780635c0cba33146104265780635c975abb1461044657600080fd5b806345884d3214610301578063485cc955146103315780634870496f146103515780634fd0434c1461037157600080fd5b80633c9f397c116101ab5780633c9f397c1461028d5780633e47158c146102b757806343ca1c50146102cc578063452a9320146102ec57600080fd5b806333d7e2bd146101fd57806335e80ab31461023a57806338d38c971461024f57600080fd5b366101f8576101f63334620186a06000604051806020016040528060008152506106fe565b005b600080fd5b34801561020957600080fd5b5060375461021d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561024657600080fd5b5061021d61095b565b34801561025b57600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000003168152602001610231565b34801561029957600080fd5b506102a26109e7565b60405163ffffffff9091168152602001610231565b3480156102c357600080fd5b5061021d610a6e565b3480156102d857600080fd5b506101f66102e736600461457d565b610c52565b3480156102f857600080fd5b5061021d610fa8565b34801561030d57600080fd5b5061032161031c3660046145cf565b61100b565b6040519015158152602001610231565b34801561033d57600080fd5b506101f661034c3660046145ec565b611099565b34801561035d57600080fd5b506101f661036c36600461461a565b611281565b34801561037d57600080fd5b50610386611943565b60405167ffffffffffffffff9091168152602001610231565b3480156103ab57600080fd5b506103cc6103ba3660046146f6565b6000908152603c602052604090205490565b604051908152602001610231565b3480156103e657600080fd5b50604080518082018252600581527f352e322e31000000000000000000000000000000000000000000000000000000602082015290516102319190614767565b34801561043257600080fd5b50603e5461021d906001600160a01b031681565b34801561045257600080fd5b506103216119ca565b34801561046757600080fd5b506101f661047636600461477a565b611a51565b34801561048757600080fd5b506101f661049636600461479f565b611cfd565b3480156104a757600080fd5b506103cc611d0a565b3480156104bc57600080fd5b5060325461021d906001600160a01b031681565b3480156104dc57600080fd5b506103216104eb3660046146f6565b60336020526000908152604090205460ff1681565b34801561050c57600080fd5b5061038661051b3660046147f2565b611d91565b34801561052c57600080fd5b5061021d61053b36600461480f565b611daa565b34801561054c57600080fd5b50603f5461021d906001600160a01b031681565b34801561056c57600080fd5b506105c561057b36600461477a565b60396020908152600092835260408084209091529082529020546001600160a01b0381169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b604080516001600160a01b03909316835267ffffffffffffffff909116602083015201610231565b3480156105f957600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a806103cc565b34801561062c57600080fd5b50600154610688906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610231565b3480156106cd57600080fd5b5061021d611de2565b6101f66106e436600461483f565b6106fe565b3480156106f557600080fd5b5061021d611e29565b8260005a905061070c611e8c565b15610749573415610749576040517fbd58e0a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610751611f0e565b156107c65734156107c657603f60009054906101000a90046001600160a01b03166001600160a01b0316631ee116bf346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156107ac57600080fd5b505af11580156107c0573d6000803e3d6000fd5b50505050505b8380156107db57506001600160a01b03871615155b15610812576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61081c8351611d91565b67ffffffffffffffff168567ffffffffffffffff161015610869576040517f70c8bdbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156108a7576040517f5aa3bac900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336108b0611fcd565b6108cd575033731111000000000000000000000000000000001111015b600034888888886040516020016108e89594939291906148be565b60405160208183030381529060405290506000896001600160a01b0316836001600160a01b03167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161093e9190614767565b60405180910390a45050610952828261200a565b50505050505050565b603754604080517f35e80ab300000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916335e80ab39160048083019260209291908290030181865afa1580156109be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614923565b905090565b603e54604080517f3c9f397c00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691633c9f397c9160048083019260209291908290030181865afa158015610a4a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614952565b600080610a997fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b90506001600160a01b03811615610aaf57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002610af2919061499e565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610b4d906060015b604051602081830303815290604052805190602001205490565b14610b84576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610ba690606001610b33565b90506001600160a01b03811615610c2057806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c199190614923565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5a6122e1565b610c62611e8c565b15610ca357606082015115610ca3576040517fbd58e0a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6032546001600160a01b031661dead14610ce9576040517fdfeaaeb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf68260400151612320565b15610d2d576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d3883612349565b9050610d448183611a51565b600081815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d83611f0e565b15610e1557606083015115610e1557603f5460608401516040517f8d445bd00000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691638d445bd091610de29160040190815260200190565b600060405180830381600087803b158015610dfc57600080fd5b505af1158015610e10573d6000803e3d6000fd5b505050505b8260200151603260006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000610e5e8460400151856080015186606001518760a00151612396565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610ec390841515815260200190565b60405180910390a2610ed3611f0e565b15610f5d5780158015610eea575060008460600151115b15610f5d57603f60009054906101000a90046001600160a01b03166001600160a01b0316631ee116bf85606001516040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f4357600080fd5b505af1158015610f57573d6000803e3d6000fd5b50505050505b80158015610f6b5750326001145b15610fa2576040517fab58103600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b603754604080517f452a932000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163452a93209160048083019260209291908290030181865afa1580156109be573d6000803e3d6000fd5b603e546040517f45884d320000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906345884d3290602401602060405180830381865afa15801561106f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109391906149bd565b92915050565b7f0000000000000000000000000000000000000000000000000000000000000003600054610100900460ff161580156110d9575060005460ff8083169116105b6111505760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556111896123f4565b603780546001600160a01b038086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603e8054928516929091169190911790556111d961245b565b6032546001600160a01b031661121657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b61121e61260e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6112896122e1565b6112968560400151612320565b156112cd576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d5611e8c565b1561131657606085015115611316576040517fbd58e0a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611320611e29565b6001600160a01b031663bb8aa1fc866040518263ffffffff1660e01b815260040161134d91815260200190565b606060405180830381865afa15801561136a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138e91906149da565b603e546040517f496b9c160000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301529295509116925063496b9c169150602401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141991906149bd565b61144f576040517ff395240e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f04e50fed0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152909116906304e50fed90602401602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d691906149bd565b61150c576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001816001600160a01b031663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115709190614a56565b600281111561158157611581614a27565b036115b8576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162a816001600160a01b031663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d9190614a77565b67ffffffffffffffff1690565b67ffffffffffffffff16421161166c576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61168361167e36869003860186614a94565b612707565b6116eb826001600160a01b031663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e89190614afa565b90565b14611722576040517f426149af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061172d87612349565b9050600081600060405160200161174e929190918252602082015260400190565b60408051601f19818403018152828252805160209182012090830181905292506117c5910160408051601f19818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152906117bb8789614b13565b8960400135612746565b1515600003611800576040517f2e57ef3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820182526001600160a01b03808616825267ffffffffffffffff42811660208085019182526000888152603982528681203380835290835287822096518754945190951674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009094169486169490941792909217909455868152603c845284812080546001810182559082528482200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091558b840151928c01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a35050505050505050565b603e54604080517f4086d18300000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691634086d1839160048083019260209291908290030181865afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614a77565b603754604080517f5c975abb00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691635c975abb9160048083019260209291908290030181865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e291906149bd565b60008281526039602090815260408083206001600160a01b0385811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152868552603390935292205490919060ff1615611af3576040517f730a107400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816020015167ffffffffffffffff16600003611b3b576040517fcca6afda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7c816001600160a01b031663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f9573d6000803e3d6000fd5b67ffffffffffffffff16826020015167ffffffffffffffff1611611bcc576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000093a80826020015167ffffffffffffffff1642611c079190614b97565b11611c3e576040517fd9bc01be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f6c4f44670000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015290911690636c4f446790602401602060405180830381865afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc591906149bd565b610fa2576040517f332a57f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611d078133610c52565b50565b603e54604080517f952b279700000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163952b27979160048083019260209291908290030181865afa158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e29190614afa565b6000611d9e826028614bae565b61109390615208614bde565b603c6020528160005260406000208181548110611dc657600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000611dec610a6e565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109be573d6000803e3d6000fd5b603e54604080517ff2b4e61700000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163f2b4e6179160048083019260209291908290030181865afa1580156109be573d6000803e3d6000fd5b6037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060048201526000916001600160a01b0316906347af267b90602401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b6037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201526000916001600160a01b0316906347af267b90602401602060405180830381865afa158015611f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb491906149bd565b80156109e2575050603f546001600160a01b0316151590565b6000323303611fdc5750600190565b333b60170361200457604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b600154600090612040907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614b97565b9050600061204c61276a565b90506000816020015160ff16826000015163ffffffff1661206d9190614c39565b905082156121a4576001546000906120a4908390700100000000000000000000000000000000900467ffffffffffffffff16614c83565b90506000836040015160ff16836120bb9190614cf7565b6001546120db9084906fffffffffffffffffffffffffffffffff16614cf7565b6120e59190614c39565b6001549091506000906121369061210f9084906fffffffffffffffffffffffffffffffff16614db3565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612823565b905060018611156121655761216261210f82876040015160ff1660018a61215d9190614b97565b612842565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906121d7908490700100000000000000000000000000000000900467ffffffffffffffff16614bde565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315612264576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612290906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661499e565b905060006122a248633b9aca00612897565b6122ac9083614e27565b905060005a6122bb9088614b97565b9050808211156122d7576122d76122d28284614b97565b6128ae565b5050505050505050565b6122e96119ca565b15611cfb576040517fb9c3c2ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b038216301480611093575050603f546001600160a01b0390811691161490565b80516020808301516040808501516060860151608087015160a08801519351600097612379979096959101614e3b565b604051602081830303815290604052805190602001209050919050565b60008060006123a68660006128dc565b9050806123dc576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b336123fd610a6e565b6001600160a01b031614158015612424575033612418611de2565b6001600160a01b031614155b15611cfb576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201526001600160a01b03909116906347af267b90602401602060405180830381865afa1580156124dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250091906149bd565b80156125155750603f546001600160a01b0316155b806125d757506037546040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201526001600160a01b03909116906347af267b90602401602060405180830381865afa15801561259c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c091906149bd565b1580156125d75750603f546001600160a01b031615155b15611cfb576040517f9c46cd7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1661268b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611147565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611cfb5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60008160000151826020015183604001518460600151604051602001612379949392919093845260208401929092526040830152606082015260800190565b600080612752866128fa565b90506127608186868661292c565b9695505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b0200000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cc731b029160048083019260c09291908290030181865afa1580156127ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110939190614e9b565b6000612838612832858561295c565b8361296c565b90505b9392505050565b6000670de0b6b3a764000061288361285a8583614c39565b61286c90670de0b6b3a7640000614c83565b61287e85670de0b6b3a7640000614cf7565b61297b565b61288d9086614cf7565b6128389190614c39565b6000818310156128a7578161283b565b5090919050565b6000805a90505b825a6128c19083614b97565b10156128d7576128d082614f57565b91506128b5565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161291691815260200190565b6040516020818303038152906040529050919050565b60006129538461293d8786866129ac565b8051602091820120825192909101919091201490565b95945050505050565b6000818312156128a7578161283b565b60008183126128a7578161283b565b600061283b670de0b6b3a764000083612993866132be565b61299d9190614cf7565b6129a79190614c39565b6134e8565b606060008451116129ff5760405162461bcd60e51b815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401611147565b6000612a0a8461370d565b90506000612a17866137f9565b9050600084604051602001612a2e91815260200190565b60405160208183030381529060405290506000805b845181101561324f576000858281518110612a6057612a60614f71565b602002602001015190508451831115612ae15760405162461bcd60e51b815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401611147565b82600003612b805780518051602091820120604051612b2f92612b0992910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612b7b5760405162461bcd60e51b815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401611147565b612ca3565b805151602011612c1c5780518051602091820120604051612baa92612b0992910190815260200190565b612b7b5760405162461bcd60e51b815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401611147565b805184516020808701919091208251919092012014612ca35760405162461bcd60e51b815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401611147565b612caf60106001614fa0565b81602001515103612e575784518303612def57612ce98160200151601081518110612cdc57612cdc614f71565b602002602001015161385c565b96506000875111612d625760405162461bcd60e51b815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401611147565b60018651612d709190614b97565b8214612de45760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401611147565b50505050505061283b565b6000858481518110612e0357612e03614f71565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612e2e57612e2e614f71565b60200260200101519050612e4181613910565b9550612e4e600186614fa0565b9450505061323c565b6002816020015151036131ce576000612e6f82613935565b9050600081600081518110612e8657612e86614f71565b016020015160f81c90506000612e9d600283614fb8565b612ea8906002614fda565b90506000612eb9848360ff16613959565b90506000612ec78a89613959565b90506000612ed5838361398f565b905080835114612f4d5760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401611147565b60ff851660021480612f62575060ff85166003145b156131035780825114612fdd5760405162461bcd60e51b815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401611147565b612ff78760200151600181518110612cdc57612cdc614f71565b9c5060008d51116130705760405162461bcd60e51b815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401611147565b60018c5161307e9190614b97565b88146130f25760405162461bcd60e51b815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401611147565b50505050505050505050505061283b565b60ff85161580613116575060ff85166001145b1561315557613142876020015160018151811061313557613135614f71565b6020026020010151613910565b995061314e818a614fa0565b98506131c3565b60405162461bcd60e51b815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401611147565b50505050505061323c565b60405162461bcd60e51b815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401611147565b508061324781614f57565b915050612a43565b5060405162461bcd60e51b815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401611147565b600080821361330f5760405162461bcd60e51b815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611147565b6000606061331c84613a43565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361351957506000919050565b680755bf798b4a1bf1e582126135715760405162461bcd60e51b815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401611147565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561372b5761372b6143e9565b60405190808252806020026020018201604052801561377057816020015b60408051808201909152606080825260208201528152602001906001900390816137495790505b50915060005b818110156137f257604051806040016040528085838151811061379b5761379b614f71565b602002602001015181526020016137ca8684815181106137bd576137bd614f71565b6020026020010151613aff565b8152508382815181106137df576137df614f71565b6020908102919091010152600101613776565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613851578060011b82018184015160001a8060041c8253600f811660018301535050600101613823565b509295945050505050565b6060600080600061386c85613b12565b91945092509050600081600181111561388757613887614a27565b146138be576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138c88284614fa0565b855114613901576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295385602001518484613fb0565b6060602082600001511061392c576139278261385c565b611093565b61109382614044565b60606110936139548360200151600081518110612cdc57612cdc614f71565b6137f9565b6060825182106139785750604080516020810190915260008152611093565b61283b838384865161398a9190614b97565b61405a565b60008082518451106139a25782516139a5565b83515b90505b8082108015613a2c57508282815181106139c4576139c4614f71565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613a0357613a03614f71565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613a3c578160010191506139a8565b5092915050565b6000808211613a945760405162461bcd60e51b815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611147565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060611093613b0d836141c6565b614233565b60008060008360000151600003613b55576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111613b7a576000600160009450945094505050613fa9565b60b78111613c90576000613b8f608083614b97565b905080876000015111613bce576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015613c4657507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15613c7d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250613fa9915050565b60bf8111613dee576000613ca560b783614b97565b905080876000015111613ce4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613d46576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111613d8e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d988184614fa0565b895111613dd1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ddc836001614fa0565b9750955060009450613fa99350505050565b60f78111613e53576000613e0360c083614b97565b905080876000015111613e42576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250613fa9915050565b6000613e6060f783614b97565b905080876000015111613e9f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613f01576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111613f49576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f538184614fa0565b895111613f8c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f97836001614fa0565b9750955060019450613fa99350505050565b9193909250565b60608167ffffffffffffffff811115613fcb57613fcb6143e9565b6040519080825280601f01601f191660200182016040528015613ff5576020820181803683370190505b509050811561283b57600061400a8486614fa0565b90506020820160005b8481101561402b578281015182820152602001614013565b8481111561403a576000858301525b5050509392505050565b6060611093826020015160008460000151613fb0565b60608182601f0110156140af5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611147565b8282840110156141015760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611147565b818301845110156141545760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401611147565b60608215801561417357604051915060008252602082016040526141bd565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141ac578051835260209283019201614194565b5050858452601f01601f1916604052505b50949350505050565b60408051808201909152600080825260208201528151600003614215576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061424385613b12565b91945092509050600181600181111561425e5761425e614a27565b14614295576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516142a18385614fa0565b146142d8576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816142ef5790505093506000835b86518110156143dd576000806143626040518060400160405280858c600001516143469190614b97565b8152602001858c6020015161435b9190614fa0565b9052613b12565b50915091506040518060400160405280838361437e9190614fa0565b8152602001848b602001516143939190614fa0565b8152508885815181106143a8576143a8614f71565b60209081029190910101526143be600185614fa0565b93506143ca8183614fa0565b6143d49084614fa0565b9250505061431c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614441576144416143e9565b604052919050565b6001600160a01b0381168114611d0757600080fd5b600082601f83011261446f57600080fd5b813567ffffffffffffffff811115614489576144896143e9565b61449c6020601f19601f84011601614418565b8181528460208386010111156144b157600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156144e057600080fd5b60405160c0810167ffffffffffffffff8282108183111715614504576145046143e9565b81604052829350843583526020850135915061451f82614449565b8160208401526040850135915061453582614449565b816040840152606085013560608401526080850135608084015260a085013591508082111561456357600080fd5b506145708582860161445e565b60a0830152505092915050565b6000806040838503121561459057600080fd5b823567ffffffffffffffff8111156145a757600080fd5b6145b3858286016144ce565b92505060208301356145c481614449565b809150509250929050565b6000602082840312156145e157600080fd5b813561283b81614449565b600080604083850312156145ff57600080fd5b823561460a81614449565b915060208301356145c481614449565b600080600080600085870360e081121561463357600080fd5b863567ffffffffffffffff8082111561464b57600080fd5b6146578a838b016144ce565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561469057600080fd5b60408901955060c08901359250808311156146aa57600080fd5b828901925089601f8401126146be57600080fd5b82359150808211156146cf57600080fd5b508860208260051b84010111156146e557600080fd5b959894975092955050506020019190565b60006020828403121561470857600080fd5b5035919050565b60005b8381101561472a578181015183820152602001614712565b83811115610fa25750506000910152565b6000815180845261475381602086016020860161470f565b601f01601f19169290920160200192915050565b60208152600061283b602083018461473b565b6000806040838503121561478d57600080fd5b8235915060208301356145c481614449565b6000602082840312156147b157600080fd5b813567ffffffffffffffff8111156147c857600080fd5b6147d4848285016144ce565b949350505050565b67ffffffffffffffff81168114611d0757600080fd5b60006020828403121561480457600080fd5b813561283b816147dc565b6000806040838503121561482257600080fd5b50508035926020909101359150565b8015158114611d0757600080fd5b600080600080600060a0868803121561485757600080fd5b853561486281614449565b9450602086013593506040860135614879816147dc565b9250606086013561488981614831565b9150608086013567ffffffffffffffff8111156148a557600080fd5b6148b18882890161445e565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b60488201526000825161491281604985016020870161470f565b919091016049019695505050505050565b60006020828403121561493557600080fd5b815161283b81614449565b63ffffffff81168114611d0757600080fd5b60006020828403121561496457600080fd5b815161283b81614940565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160001904831182151516156149b8576149b861496f565b500290565b6000602082840312156149cf57600080fd5b815161283b81614831565b6000806000606084860312156149ef57600080fd5b83516149fa81614940565b6020850151909350614a0b816147dc565b6040850151909250614a1c81614449565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215614a6857600080fd5b81516003811061283b57600080fd5b600060208284031215614a8957600080fd5b815161283b816147dc565b600060808284031215614aa657600080fd5b6040516080810181811067ffffffffffffffff82111715614ac957614ac96143e9565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600060208284031215614b0c57600080fd5b5051919050565b600067ffffffffffffffff80841115614b2e57614b2e6143e9565b8360051b6020614b3f818301614418565b868152918501918181019036841115614b5757600080fd5b865b84811015614b8b57803586811115614b715760008081fd5b614b7d36828b0161445e565b845250918301918301614b59565b50979650505050505050565b600082821015614ba957614ba961496f565b500390565b600067ffffffffffffffff80831681851681830481118215151615614bd557614bd561496f565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c0157614c0161496f565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614c4857614c48614c0a565b60001983147f800000000000000000000000000000000000000000000000000000000000000083141615614c7e57614c7e61496f565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614cbd57614cbd61496f565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614cf157614cf161496f565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614d3857614d3861496f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614d7357614d7361496f565b60008712925087820587128484161615614d8f57614d8f61496f565b87850587128184161615614da557614da561496f565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614ded57614ded61496f565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614e2157614e2161496f565b50500190565b600082614e3657614e36614c0a565b500490565b86815260006001600160a01b03808816602084015280871660408401525084606083015283608083015260c060a0830152614e7960c083018461473b565b98975050505050505050565b805160ff81168114614e9657600080fd5b919050565b600060c08284031215614ead57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ed057614ed06143e9565b6040528251614ede81614940565b8152614eec60208401614e85565b6020820152614efd60408401614e85565b60408201526060830151614f1081614940565b60608201526080830151614f2381614940565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114614f4b57600080fd5b60a08201529392505050565b60006000198203614f6a57614f6a61496f565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115614fb357614fb361496f565b500190565b600060ff831680614fcb57614fcb614c0a565b8060ff84160691505092915050565b600060ff821660ff841680821015614ff457614ff461496f565b9003939250505056fea164736f6c634300080f000a"; + bytes internal constant acc32Code = + hex"6080604052600436106102385760003560e01c80638c3152e911610138578063bb2c727e116100b0578063cff0ab961161007f578063dad544e011610064578063dad544e01461082a578063e9e05c421461083f578063f2b4e6171461085257600080fd5b8063cff0ab9614610757578063d325d3bf146107f857600080fd5b8063bb2c727e14610648578063bda204bb146106ef578063bf653a5c14610704578063c0c53b8b1461073757600080fd5b80639bf62d8211610107578063a35d99df116100ec578063a35d99df146105db578063a3860f48146105fb578063b682c4441461061b57600080fd5b80639bf62d821461057e578063a14238e7146105ab57600080fd5b80638c3152e9146105095780638c90dd6514610529578063952b27971461054957806399a88ec41461055e57600080fd5b806345884d32116101cb57806354fd4d501161019a5780635c975abb1161017f5780635c975abb146104d457806371c1566e146104e95780638b4c40b01461025d57600080fd5b806354fd4d501461045b5780635c0cba33146104a757600080fd5b806345884d32146103a25780634870496f146103d25780634fd0434c146103f2578063513747ab1461042057600080fd5b80633c9f397c116102075780633c9f397c1461032e5780633e47158c1461035857806343ca1c501461036d578063452a93201461038d57600080fd5b80632152f2be1461026457806333d7e2bd1461028457806335e80ab3146102db57806338d38c97146102f057600080fd5b3661025f5761025d3334620186a0600060405180602001604052806000815250610867565b005b600080fd5b34801561027057600080fd5b5061025d61027f366004614f47565b610ab3565b34801561029057600080fd5b506037546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102e757600080fd5b506102b1610bf9565b3480156102fc57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000041681526020016102d2565b34801561033a57600080fd5b50610343610c92565b60405163ffffffff90911681526020016102d2565b34801561036457600080fd5b506102b1610d26565b34801561037957600080fd5b5061025d610388366004615187565b610f31565b34801561039957600080fd5b506102b1611272565b3480156103ae57600080fd5b506103c26103bd3660046151ce565b6112e2565b60405190151581526020016102d2565b3480156103de57600080fd5b5061025d6103ed36600461524f565b61137d565b3480156103fe57600080fd5b506104076114ad565b60405167ffffffffffffffff90911681526020016102d2565b34801561042c57600080fd5b5061044d61043b3660046152d5565b6000908152603c602052604090205490565b6040519081526020016102d2565b34801561046757600080fd5b50604080518082018252600d81527f352e322e312b696e7465726f7000000000000000000000000000000000000000602082015290516102d29190615364565b3480156104b357600080fd5b50603e546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e057600080fd5b506103c2611541565b3480156104f557600080fd5b5061025d610504366004615377565b6115d5565b34801561051557600080fd5b5061025d61052436600461539c565b6118d9565b34801561053557600080fd5b5061025d6105443660046153d9565b6118e6565b34801561055557600080fd5b5061044d61196a565b34801561056a57600080fd5b5061025d610579366004614f47565b6119fe565b34801561058a57600080fd5b506032546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b757600080fd5b506103c26105c63660046152d5565b60336020526000908152604090205460ff1681565b3480156105e757600080fd5b506104076105f63660046154b9565b611bc0565b34801561060757600080fd5b506102b16106163660046154d6565b611bd9565b34801561062757600080fd5b50603f546102b19073ffffffffffffffffffffffffffffffffffffffff1681565b34801561065457600080fd5b506106ba610663366004615377565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff9091166020830152016102d2565b3480156106fb57600080fd5b5061025d611c1e565b34801561071057600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a8061044d565b34801561074357600080fd5b5061025d6107523660046154f8565b611d00565b34801561076357600080fd5b506001546107bf906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016102d2565b34801561080457600080fd5b50603f546103c29074010000000000000000000000000000000000000000900460ff1681565b34801561083657600080fd5b506102b1611efd565b61025d61084d366004615551565b610867565b34801561085e57600080fd5b506102b1611f51565b8260005a905034156108f757603f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ee116bf346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108dd57600080fd5b505af11580156108f1573d6000803e3d6000fd5b50505050505b838015610919575073ffffffffffffffffffffffffffffffffffffffff871615155b15610950576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61095a8351611bc0565b67ffffffffffffffff168567ffffffffffffffff1610156109a7576040517f70c8bdbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156109e5576040517f5aa3bac900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336109ee611fc1565b610a0b575033731111000000000000000000000000000000001111015b60003488888888604051602001610a269594939291906155d0565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610a969190615364565b60405180910390a45050610aaa8282611fff565b50505050505050565b610abb6122d6565b610ac3612315565b603e5473ffffffffffffffffffffffffffffffffffffffff808316911603610b17576040517f785df91100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603f8054603e805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093557fffffffffffffffffffffff0000000000000000000000000000000000000000008416878216908117740100000000000000000000000000000000000000001790955560408051948216808652602086019690965291169083018190526060830191909152907f9e5368471a58d81987e5dc7d6374dd5ed5e756cc95a79ff726903423bce0060d906080015b60405180910390a150505050565b603754604080517f35e80ab3000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916335e80ab39160048083019260209291908290030181865afa158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190615635565b905090565b603e54604080517f3c9f397c000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691633c9f397c9160048083019260209291908290030181865afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190615664565b600080610d517fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff811615610d7457919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002610db791906156b0565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610e12906060015b604051602081830303815290604052805190602001205490565b14610e49576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610e6b90606001610df8565b905073ffffffffffffffffffffffffffffffffffffffff811615610eff578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef89190615635565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f396122d6565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f8c576040517fdfeaaeb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f99826040015161236b565b15610fd0576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610fdb836123ae565b9050610fe781836115d5565b600081815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556060830151156110b857603f5460608401516040517f8d445bd000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691638d445bd0916110859160040190815260200190565b600060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050505b8260200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600061111b8460400151856080015186606001518760a001516123fb565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061118090841515815260200190565b60405180910390a28015801561119a575060008460600151115b1561122757603f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ee116bf85606001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b50505050505b801580156112355750326001145b1561126c576040517fab58103600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b603754604080517f452a9320000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163452a93209160048083019260209291908290030181865afa158015610c69573d6000803e3d6000fd5b603e546040517f45884d3200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906345884d3290602401602060405180830381865afa158015611353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137791906156ed565b92915050565b6113856122d6565b603f5474010000000000000000000000000000000000000000900460ff16156113da576040517f5e74b54200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113e4611f51565b73ffffffffffffffffffffffffffffffffffffffff1663bb8aa1fc866040518263ffffffff1660e01b815260040161141e91815260200190565b606060405180830381865afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f919061570a565b6040805160608082018352600080835260208301529181019190915290935091506114879050565b610aaa878360008461149e368b90038b018b61574c565b6114a8898b6157d6565b612459565b603e54604080517f4086d183000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691634086d1839160048083019260209291908290030181865afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d919061584f565b603754604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d91906156ed565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152868552603390935292205490919060ff1615611684576040517f730a107400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816020015167ffffffffffffffff166000036116cc576040517fcca6afda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61174b8173ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561171a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173e919061584f565b67ffffffffffffffff1690565b67ffffffffffffffff16826020015167ffffffffffffffff161161179b576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000093a80826020015167ffffffffffffffff16426117d6919061586c565b1161180d576040517fd9bc01be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f6c4f446700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015290911690636c4f446790602401602060405180830381865afa15801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a191906156ed565b61126c576040517f332a57f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6118e38133610f31565b50565b6118ee6122d6565b603f5474010000000000000000000000000000000000000000900460ff16611942576040517f5e74b54200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aaa87878761195188615883565b6119603689900389018961574c565b6114a887896157d6565b603e54604080517f952b2797000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163952b27979160048083019260209291908290030181865afa1580156119da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d919061598d565b7f0000000000000000000000000000000000000000000000000000000000000004600054610100900460ff16158015611a3e575060005460ff8083169116105b611acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611b08612cb4565b603e805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603f805492851692909116919091179055600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000611bcd8260286159a6565b611377906152086159d6565b603c6020528160005260406000208181548110611bf557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b611c26612315565b603f54604080517f1ee116bf0000000000000000000000000000000000000000000000000000000081529051479273ffffffffffffffffffffffffffffffffffffffff1691631ee116bf91849160048082019260009290919082900301818588803b158015611c9457600080fd5b505af1158015611ca8573d6000803e3d6000fd5b5050603f5460405185815273ffffffffffffffffffffffffffffffffffffffff90911693507fd893f630c6867fa43689da9ae949ebf04cac24aad3b45c759d442ed3c32e3a379250602001905060405180910390a250565b7f0000000000000000000000000000000000000000000000000000000000000004600054610100900460ff16158015611d40575060005460ff8083169116105b611dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611ac6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611e05612cb4565b6037805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603e8054868416908316179055603f8054858416921691909117905560325416611e9a57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611ea2612d35565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610beb565b6000611f07610d26565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c69573d6000803e3d6000fd5b603e54604080517ff2b4e617000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f2b4e6179160048083019260209291908290030181865afa158015610c69573d6000803e3d6000fd5b6000323303611fd05750600190565b333b601703611ff857604051602081016040526020600082333c5160e81c62ef010014905090565b5060005b90565b600154600090612035907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361586c565b90506000612041612e48565b90506000816020015160ff16826000015163ffffffff166120629190615a31565b9050821561219957600154600090612099908390700100000000000000000000000000000000900467ffffffffffffffff16615a99565b90506000836040015160ff16836120b09190615b0d565b6001546120d09084906fffffffffffffffffffffffffffffffff16615b0d565b6120da9190615a31565b60015490915060009061212b906121049084906fffffffffffffffffffffffffffffffff16615bc9565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612f0e565b9050600186111561215a5761215761210482876040015160ff1660018a612152919061586c565b612f2d565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906121cc908490700100000000000000000000000000000000900467ffffffffffffffff166159d6565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315612259576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612285906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166156b0565b9050600061229748633b9aca00612f82565b6122a19083615c3d565b905060005a6122b0908861586c565b9050808211156122cc576122cc6122c7828461586c565b612f99565b5050505050505050565b6122de611541565b156118d7576040517fb9c3c2ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361231e611efd565b73ffffffffffffffffffffffffffffffffffffffff16146118d7576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff8216301480611377575050603f5473ffffffffffffffffffffffffffffffffffffffff90811691161490565b80516020808301516040808501516060860151608087015160a088015193516000976123de979096959101615c51565b604051602081830303815290604052805190602001209050919050565b600080600061240b866000612fc7565b905080612441576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b612466866040015161236b565b1561249d576040517fc5defbad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f496b9c1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529091169063496b9c1690602401602060405180830381865afa15801561250d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253191906156ed565b612567576040517ff395240e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603e546040517f04e50fed00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906304e50fed90602401602060405180830381865afa1580156125d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fb91906156ed565b612631576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561267e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a29190615cd7565b60028111156126b3576126b3615ca8565b036126ea576040517fe29927ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127388573ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561171a573d6000803e3d6000fd5b67ffffffffffffffff16421161277a576040517fb4caa4e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603f5474010000000000000000000000000000000000000000900460ff16156129c4576127a683612fe5565b6128188673ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc919061598d565b1461284f576040517f2b1a9a6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826040015151841061288d576040517f32dc285c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000836040015185815181106128a5576128a5615cf8565b60200260200101519050603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6ae3cd56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561291c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612940919061598d565b815114612979576040517f7cc2f31b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61298283612ffe565b8160200151146129be576040517f426149af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612a52565b6129cd82612ffe565b612a1b8673ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f4573d6000803e3d6000fd5b14612a52576040517f426149af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a5d876123ae565b90506000816000604051602001612a7e929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250612b299101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282018252600183527f0100000000000000000000000000000000000000000000000000000000000000602084015290870151909190869061303d565b1515600003612b64576040517f2e57ef3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808a16825267ffffffffffffffff42811660208085019182526000888152603982528681203380835290835287822096518754945190951674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009094169486169490941792909217909455868152603c845284812080546001810182559082528482200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091558b840151928c01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a35050505050505050565b33612cbd610d26565b73ffffffffffffffffffffffffffffffffffffffff1614158015612cfe575033612ce5611efd565b73ffffffffffffffffffffffffffffffffffffffff1614155b156118d7576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16612dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611ac6565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036118d75760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b02000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cc731b029160048083019260c09291908290030181865afa158015612eea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113779190615d3d565b6000612f23612f1d8585613061565b83613071565b90505b9392505050565b6000670de0b6b3a7640000612f6e612f458583615a31565b612f5790670de0b6b3a7640000615a99565b612f6985670de0b6b3a7640000615b0d565b613080565b612f789086615b0d565b612f239190615a31565b600081831015612f925781612f26565b5090919050565b6000805a90505b825a612fac908361586c565b1015612fc257612fbb82615df9565b9150612fa0565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000612ff0826130b1565b805190602001209050919050565b600081600001518260200151836040015184606001516040516020016123de949392919093845260208401929092526040830152606082015260800190565b60008061304986613267565b905061305781868686613299565b9695505050505050565b600081831215612f925781612f26565b6000818312612f925781612f26565b6000612f26670de0b6b3a764000083613098866132c9565b6130a29190615b0d565b6130ac9190615a31565b61350d565b80516060907fff00000000000000000000000000000000000000000000000000000000000000167f010000000000000000000000000000000000000000000000000000000000000014613130576040517fc06b523800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81604001515160000361316f576040517f9103e7cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000151836020015160c01b6040516020016131de9291907fff000000000000000000000000000000000000000000000000000000000000009290921682527fffffffffffffffff00000000000000000000000000000000000000000000000016600182015260090190565b604051602081830303815290604052905060005b8360400151518110156132605760008460400151828151811061321757613217615cf8565b60209081029190910181015180518183015160405192945061323b93879301615e31565b604051602081830303815290604052925050808061325890615df9565b9150506131f2565b5092915050565b6060818051906020012060405160200161328391815260200190565b6040516020818303038152906040529050919050565b60006132c0846132aa87868661374c565b8051602091820120825192909101919091201490565b95945050505050565b6000808213613334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611ac6565b60006060613341846141ca565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361353e57506000919050565b680755bf798b4a1bf1e582126135b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401611ac6565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606060008451116137b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401611ac6565b60006137c4846142a0565b905060006137d18661438c565b90506000846040516020016137e891815260200190565b60405160208183030381529060405290506000805b845181101561414157600085828151811061381a5761381a615cf8565b6020026020010151905084518311156138b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401611ac6565b8260000361396e5780518051602091820120604051613903926138dd92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401611ac6565b613ac5565b805151602011613a245780518051602091820120604051613998926138dd92910190815260200190565b613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401611ac6565b805184516020808701919091208251919092012014613ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401611ac6565b613ad160106001615e58565b81602001515103613cad5784518303613c4557613b0b8160200151601081518110613afe57613afe615cf8565b60200260200101516143ef565b96506000875111613b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401611ac6565b60018651613bac919061586c565b8214613c3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401611ac6565b505050505050612f26565b6000858481518110613c5957613c59615cf8565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110613c8457613c84615cf8565b60200260200101519050613c97816144a3565b9550613ca4600186615e58565b9450505061412e565b6002816020015151036140a6576000613cc5826144c8565b9050600081600081518110613cdc57613cdc615cf8565b016020015160f81c90506000613cf3600283615e70565b613cfe906002615e92565b90506000613d0f848360ff166144ec565b90506000613d1d8a896144ec565b90506000613d2b8383614522565b905080835114613dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401611ac6565b60ff851660021480613dd2575060ff85166003145b15613fc15780825114613e67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401611ac6565b613e818760200151600181518110613afe57613afe615cf8565b9c5060008d5111613f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401611ac6565b60018c51613f22919061586c565b8814613fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401611ac6565b505050505050505050505050612f26565b60ff85161580613fd4575060ff85166001145b15614013576140008760200151600181518110613ff357613ff3615cf8565b60200260200101516144a3565b995061400c818a615e58565b985061409b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401611ac6565b50505050505061412e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401611ac6565b508061413981615df9565b9150506137fd565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401611ac6565b6000808211614235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611ac6565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b80516060908067ffffffffffffffff8111156142be576142be614f80565b60405190808252806020026020018201604052801561430357816020015b60408051808201909152606080825260208201528152602001906001900390816142dc5790505b50915060005b8181101561438557604051806040016040528085838151811061432e5761432e615cf8565b6020026020010151815260200161435d86848151811061435057614350615cf8565b60200260200101516145cf565b81525083828151811061437257614372615cf8565b6020908102919091010152600101614309565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156143e4578060011b82018184015160001a8060041c8253600f8116600183015350506001016143b6565b509295945050505050565b606060008060006143ff856145e2565b91945092509050600081600181111561441a5761441a615ca8565b14614451576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61445b8284615e58565b855114614494576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132c085602001518484614a80565b606060208260000151106144bf576144ba826143ef565b611377565b61137782614b14565b60606113776144e78360200151600081518110613afe57613afe615cf8565b61438c565b60608251821061450b5750604080516020810190915260008152611377565b612f26838384865161451d919061586c565b614b2a565b6000808251845110614535578251614538565b83515b90505b80821080156145bf575082828151811061455757614557615cf8565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061459657614596615cf8565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156132605781600101915061453b565b60606113776145dd83614d02565b614d6f565b60008060008360000151600003614625576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f811161464a576000600160009450945094505050614a79565b60b7811161476057600061465f60808361586c565b90508087600001511161469e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214801561471657507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b1561474d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614a79915050565b60bf81116148be57600061477560b78361586c565b9050808760000151116147b4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614816576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c6037811161485e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6148688184615e58565b8951116148a1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6148ac836001615e58565b9750955060009450614a799350505050565b60f781116149235760006148d360c08361586c565b905080876000015111614912576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614a79915050565b600061493060f78361586c565b90508087600001511161496f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036149d1576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614a19576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614a238184615e58565b895111614a5c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614a67836001615e58565b9750955060019450614a799350505050565b9193909250565b60608167ffffffffffffffff811115614a9b57614a9b614f80565b6040519080825280601f01601f191660200182016040528015614ac5576020820181803683370190505b5090508115612f26576000614ada8486615e58565b90506020820160005b84811015614afb578281015182820152602001614ae3565b84811115614b0a576000858301525b5050509392505050565b6060611377826020015160008460000151614a80565b60608182601f011015614b99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611ac6565b828284011015614c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611ac6565b81830184511015614c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401611ac6565b606082158015614c915760405191506000825260208201604052614cf9565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614cca578051835260209283019201614cb2565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614d51576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000614d7f856145e2565b919450925090506001816001811115614d9a57614d9a615ca8565b14614dd1576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451614ddd8385615e58565b14614e14576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614e2b5790505093506000835b8651811015614f1957600080614e9e6040518060400160405280858c60000151614e82919061586c565b8152602001858c60200151614e979190615e58565b90526145e2565b509150915060405180604001604052808383614eba9190615e58565b8152602001848b60200151614ecf9190615e58565b815250888581518110614ee457614ee4615cf8565b6020908102919091010152614efa600185615e58565b9350614f068183615e58565b614f109084615e58565b92505050614e58565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146118e357600080fd5b60008060408385031215614f5a57600080fd5b8235614f6581614f25565b91506020830135614f7581614f25565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715614fd257614fd2614f80565b60405290565b6040805190810167ffffffffffffffff81118282101715614fd257614fd2614f80565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561504257615042614f80565b604052919050565b600082601f83011261505b57600080fd5b813567ffffffffffffffff81111561507557615075614f80565b6150a660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614ffb565b8181528460208386010111156150bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156150ea57600080fd5b60405160c0810167ffffffffffffffff828210818311171561510e5761510e614f80565b81604052829350843583526020850135915061512982614f25565b8160208401526040850135915061513f82614f25565b816040840152606085013560608401526080850135608084015260a085013591508082111561516d57600080fd5b5061517a8582860161504a565b60a0830152505092915050565b6000806040838503121561519a57600080fd5b823567ffffffffffffffff8111156151b157600080fd5b6151bd858286016150d8565b9250506020830135614f7581614f25565b6000602082840312156151e057600080fd5b8135612f2681614f25565b6000608082840312156151fd57600080fd5b50919050565b60008083601f84011261521557600080fd5b50813567ffffffffffffffff81111561522d57600080fd5b6020830191508360208260051b850101111561524857600080fd5b9250929050565b600080600080600060e0868803121561526757600080fd5b853567ffffffffffffffff8082111561527f57600080fd5b61528b89838a016150d8565b9650602088013595506152a18960408a016151eb565b945060c08801359150808211156152b757600080fd5b506152c488828901615203565b969995985093965092949392505050565b6000602082840312156152e757600080fd5b5035919050565b60005b838110156153095781810151838201526020016152f1565b8381111561126c5750506000910152565b600081518084526153328160208601602086016152ee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612f26602083018461531a565b6000806040838503121561538a57600080fd5b823591506020830135614f7581614f25565b6000602082840312156153ae57600080fd5b813567ffffffffffffffff8111156153c557600080fd5b6153d1848285016150d8565b949350505050565b6000806000806000806000610120888a0312156153f557600080fd5b873567ffffffffffffffff8082111561540d57600080fd5b6154198b838c016150d8565b985060208a0135915061542b82614f25565b909650604089013595506060890135908082111561544857600080fd5b908901906060828c03121561545c57600080fd5b81955061546c8b60808c016151eb565b94506101008a013591508082111561548357600080fd5b506154908a828b01615203565b989b979a50959850939692959293505050565b67ffffffffffffffff811681146118e357600080fd5b6000602082840312156154cb57600080fd5b8135612f26816154a3565b600080604083850312156154e957600080fd5b50508035926020909101359150565b60008060006060848603121561550d57600080fd5b833561551881614f25565b9250602084013561552881614f25565b9150604084013561553881614f25565b809150509250925092565b80151581146118e357600080fd5b600080600080600060a0868803121561556957600080fd5b853561557481614f25565b945060208601359350604086013561558b816154a3565b9250606086013561559b81615543565b9150608086013567ffffffffffffffff8111156155b757600080fd5b6155c38882890161504a565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516156248160498501602087016152ee565b919091016049019695505050505050565b60006020828403121561564757600080fd5b8151612f2681614f25565b63ffffffff811681146118e357600080fd5b60006020828403121561567657600080fd5b8151612f2681615652565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156e8576156e8615681565b500290565b6000602082840312156156ff57600080fd5b8151612f2681615543565b60008060006060848603121561571f57600080fd5b835161572a81615652565b602085015190935061573b816154a3565b604085015190925061553881614f25565b60006080828403121561575e57600080fd5b6040516080810181811067ffffffffffffffff8211171561578157615781614f80565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff8211156157cc576157cc614f80565b5060051b60200190565b60006157e96157e4846157b2565b614ffb565b80848252602080830192508560051b85013681111561580757600080fd5b855b8181101561584357803567ffffffffffffffff8111156158295760008081fd5b61583536828a0161504a565b865250938201938201615809565b50919695505050505050565b60006020828403121561586157600080fd5b8151612f26816154a3565b60008282101561587e5761587e615681565b500390565b60006060823603121561589557600080fd5b61589d614faf565b82357fff00000000000000000000000000000000000000000000000000000000000000811681146158cd57600080fd5b81526020838101356158de816154a3565b8282015260408481013567ffffffffffffffff8111156158fd57600080fd5b850136601f82011261590e57600080fd5b803561591c6157e4826157b2565b81815260069190911b8201840190848101903683111561593b57600080fd5b928501925b8284101561597b578484360312156159585760008081fd5b615960614fd8565b84358152868501358782015282529284019290850190615940565b93860193909352509295945050505050565b60006020828403121561599f57600080fd5b5051919050565b600067ffffffffffffffff808316818516818304811182151516156159cd576159cd615681565b02949350505050565b600067ffffffffffffffff8083168185168083038211156159f9576159f9615681565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a4057615a40615a02565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615a9457615a94615681565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615ad357615ad3615681565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b0757615b07615681565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615b4e57615b4e615681565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615b8957615b89615681565b60008712925087820587128484161615615ba557615ba5615681565b87850587128184161615615bbb57615bbb615681565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c0357615c03615681565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615c3757615c37615681565b50500190565b600082615c4c57615c4c615a02565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615c9c60c083018461531a565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215615ce957600080fd5b815160038110612f2657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805160ff81168114615d3857600080fd5b919050565b600060c08284031215615d4f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615d7257615d72614f80565b6040528251615d8081615652565b8152615d8e60208401615d27565b6020820152615d9f60408401615d27565b60408201526060830151615db281615652565b60608201526080830151615dc581615652565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114615ded57600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e2a57615e2a615681565b5060010190565b60008451615e438184602089016152ee565b91909101928352506020820152604001919050565b60008219821115615e6b57615e6b615681565b500190565b600060ff831680615e8357615e83615a02565b8060ff84160691505092915050565b600060ff821660ff841680821015615eac57615eac615681565b9003939250505056fea164736f6c634300080f000a"; + bytes internal constant acc33Code = + hex"6080604052600436106100f35760003560e01c8063438ab5ac1161008a5780638d445bd0116100595780638d445bd0146102e0578063946d920414610300578063b2db82f514610320578063dad544e01461034057600080fd5b8063438ab5ac1461023f57806354fd4d501461025f5780635c975abb146102ab5780635ec15d89146102c057600080fd5b806333d7e2bd116100c657806333d7e2bd1461017f57806335e80ab3146101d757806338d38c97146101ec5780633e47158c1461022a57600080fd5b80630fd11077146100f85780631ee116bf1461013d578063225ce1761461014757806330f9765d14610177575b600080fd5b34801561010457600080fd5b506101286101133660046110e0565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610145610355565b005b34801561015357600080fd5b506101286101623660046110e0565b60026020526000908152604090205460ff1681565b6101456103f1565b34801561018b57600080fd5b506000546101b29062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610134565b3480156101e357600080fd5b506101b2610482565b3480156101f857600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610134565b34801561023657600080fd5b506101b2610519565b34801561024b57600080fd5b5061014561025a3660046110e0565b610724565b34801561026b57600080fd5b50604080518082018252600581527f312e322e30000000000000000000000000000000000000000000000000000000602082015290516101349190611104565b3480156102b757600080fd5b506101286107ef565b3480156102cc57600080fd5b506101456102db3660046110e0565b610881565b3480156102ec57600080fd5b506101456102fb366004611177565b610909565b34801561030c57600080fd5b5061014561031b366004611190565b610b49565b34801561032c57600080fd5b5061014561033b3660046110e0565b610d46565b34801561034c57600080fd5b506101b2610d5a565b3360008181526001602052604090205460ff1661039e576040517f665a1d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f97efc519b9020a140ffe13878e03d340b976676090bc7fe3e33191192df7c72c346040516103e691815260200190565b60405180910390a250565b3360008181526002602052604090205460ff1661043a576040517f665a1d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fb58278ed56aa79ad2e243963b44b165a8f76d629f61c01dd3649d658e0eacca4346040516103e691815260200190565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190611218565b905090565b6000806105447fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561056757919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026105aa9190611264565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610605906060015b604051602081830303815290604052805190602001205490565b1461063c576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061065e906060016105eb565b905073ffffffffffffffffffffffffffffffffffffffff8116156106f2578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106eb9190611218565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61072c610dae565b61073581610e06565b60004790508173ffffffffffffffffffffffffffffffffffffffff166330f9765d826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561078257600080fd5b505af1158015610796573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff167f87eb4064140fbec95a8de570e01b4c650c00ecd677560af9f298a975b636c22d826040516107e391815260200190565b60405180910390a25050565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906112a1565b610889610dae565b61089281610e06565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f5d2682e700a2146c8e2381e0b407003576a54e96dd08f40f3ea0d2b8706db1069190a250565b6109116107ef565b15610948576040517f9e72994200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526001602052604090205460ff16610991576040517f665a1d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b478211156109cb576040517fe1ba922700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a539190611218565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517fd6cbd5f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16638b4c40b0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ae857600080fd5b505af1158015610afc573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167fe9512d49448b580f3d29031e9243ee81bc8789a93d6f04ec8f03b694d623637b836040516107e391815260200190565b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015610b89575060005460ff8083169116105b610c19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610c52610ee0565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8716021781555b82811015610ce157610ccf848483818110610cb557610cb56112c3565b9050602002016020810190610cca91906110e0565b610f61565b80610cd9816112f2565b915050610c98565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610d4e610dae565b610d5781610f61565b50565b6000610d64610519565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b33610db7610d5a565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff1663dad544e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e759190611218565b73ffffffffffffffffffffffffffffffffffffffff16610e93610d5a565b73ffffffffffffffffffffffffffffffffffffffff1614610d57576040517f075c431400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610ee9610519565b73ffffffffffffffffffffffffffffffffffffffff1614158015610f2a575033610f11610d5a565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610e04576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f6a81610e06565b610f72610482565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff79190611218565b73ffffffffffffffffffffffffffffffffffffffff1614611044576040517f84ab551500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909217909155517f90a7fac2e56aebe4889351fb04eda5efb28b19dedf288bdbfd3cfd817c79630f9190a250565b73ffffffffffffffffffffffffffffffffffffffff81168114610d5757600080fd5b6000602082840312156110f257600080fd5b81356110fd816110be565b9392505050565b600060208083528351808285015260005b8181101561113157858101830151858201604001528201611115565b81811115611143576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561118957600080fd5b5035919050565b6000806000604084860312156111a557600080fd5b83356111b0816110be565b9250602084013567ffffffffffffffff808211156111cd57600080fd5b818601915086601f8301126111e157600080fd5b8135818111156111f057600080fd5b8760208260051b850101111561120557600080fd5b6020830194508093505050509250925092565b60006020828403121561122a57600080fd5b81516110fd816110be565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561129c5761129c611235565b500290565b6000602082840312156112b357600080fd5b815180151581146110fd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361132357611323611235565b506001019056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHImplCode = + hex"60806040526004361061019a5760003560e01c806370a08231116100e1578063a9059cbb1161008a578063d0e30db011610064578063d0e30db0146101a9578063dad544e014610585578063dd62ed3e1461059a578063f3fef3a3146105ed576101a9565b8063a9059cbb146104f1578063c4d66de814610511578063cd47bde114610531576101a9565b806395d89b41116100bb57806395d89b411461046b578063977a5ec5146104b1578063a7e21e80146104d1576101a9565b806370a08231146103f357806379502c55146104365780637eee288d1461044b576101a9565b8063313ce567116101435780633e47158c1161011d5780633e47158c1461036257806354fd4d50146103775780636a42b8f8146103c0576101a9565b8063313ce567146102b657806333d7e2bd146102dd57806338d38c971461032f576101a9565b806318160ddd1161017457806318160ddd1461025957806323b872dd146102765780632e1a7d4d14610296576101a9565b806306fdde03146101b1578063095ea7b3146102095780630ca3568214610239576101a9565b366101a9576101a761060d565b005b6101a761060d565b3480156101bd57600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b60405161020091906114c9565b60405180910390f35b34801561021557600080fd5b5061022961022436600461155e565b610668565b6040519015158152602001610200565b34801561024557600080fd5b506101a761025436600461158a565b6106e1565b34801561026557600080fd5b50475b604051908152602001610200565b34801561028257600080fd5b506102296102913660046115a3565b61084d565b3480156102a257600080fd5b506101a76102b136600461158a565b610a20565b3480156102c257600080fd5b506102cb601281565b60405160ff9091168152602001610200565b3480156102e957600080fd5b5060045461030a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610200565b34801561033b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000016102cb565b34801561036e57600080fd5b5061030a610a2d565b34801561038357600080fd5b506101f36040518060400160405280600581526020017f312e352e3000000000000000000000000000000000000000000000000000000081525081565b3480156103cc57600080fd5b507f0000000000000000000000000000000000000000000000000000000000049d40610268565b3480156103ff57600080fd5b5061026861040e3660046115e4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b34801561044257600080fd5b5061030a610c38565b34801561045757600080fd5b506101a761046636600461155e565b610cd0565b34801561047757600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101f3565b3480156104bd57600080fd5b506101a76104cc36600461155e565b610d24565b3480156104dd57600080fd5b506101a76104ec3660046115e4565b610e33565b3480156104fd57600080fd5b5061022961050c36600461155e565b610e63565b34801561051d57600080fd5b506101a761052c3660046115e4565b610e77565b34801561053d57600080fd5b5061057061054c366004611601565b60036020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610200565b34801561059157600080fd5b5061030a61101e565b3480156105a657600080fd5b506102686105b5366004611601565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b3480156105f957600080fd5b506101a761060836600461155e565b611072565b336000908152600160205260408120805434929061062c908490611669565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106d09086815260200190565b60405180910390a350600192915050565b6106e961101e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106107915747610793565b815b604051909150600090339083908381818185875af1925050503d80600081146107d8576040519150601f19603f3d011682016040523d82523d6000602084013e6107dd565b606091505b5050905080610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f44656c61796564574554483a207265636f766572206661696c656400000000006044820152606401610779565b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205482111561087f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660008181526002602090815260408083203380855292529091205491148015906108e057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b1561093857828110156108f257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915281208054859290610932908490611681565b90915550505b73ffffffffffffffffffffffffffffffffffffffff85166000908152600160205260408120805485929061096d908490611681565b909155505073ffffffffffffffffffffffffffffffffffffffff8416600090815260016020526040812080548592906109a7908490611669565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a0d91815260200190565b60405180910390a3506001949350505050565b610a2a3382611072565b50565b600080610a587fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff811615610a7b57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002610abe9190611698565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610b19906060015b604051602081830303815290604052805190602001205490565b14610b50576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610b7290606001610aff565b905073ffffffffffffffffffffffffffffffffffffffff811615610c06578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff91906116d5565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccb91906116d5565b905090565b33600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610d1a908490611669565b9091555050505050565b610d2c61101e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e6572000000000000000000006044820152606401610779565b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a361084882338361084d565b610a2a816104cc8373ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6000610e7033848461084d565b9392505050565b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015610eb7575060005460ff8083169116105b610f43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610779565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610f7c6113a0565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6000611028610a2d565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca7573d6000803e3d6000fd5b60048054604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692635c975abb9282820192602092908290030181865afa1580156110df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110391906116f2565b1561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e747261637420697320706175736564006044820152606401610779565b33600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020805482111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c000000000000000000000000000000000000006064820152608401610779565b60008160010154116112be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b6564000000000000000000000000000000000000000000000000000000006064820152608401610779565b427f0000000000000000000000000000000000000000000000000000000000049d4082600101546112ef9190611669565b111561137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d65740000000000000000000000000000000000000000000000000000006064820152608401610779565b818160000160008282546113919190611681565b90915550610848905082611423565b336113a9610a2d565b73ffffffffffffffffffffffffffffffffffffffff16141580156113ea5750336113d161101e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611421576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3360009081526001602052604090205481111561143f57600080fd5b336000908152600160205260408120805483929061145e908490611681565b9091555050604051339082156108fc029083906000818181858888f19350505050158015611490573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600060208083528351808285015260005b818110156114f6578581018301518582016040015282016114da565b81811115611508576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a2a57600080fd5b6000806040838503121561157157600080fd5b823561157c8161153c565b946020939093013593505050565b60006020828403121561159c57600080fd5b5035919050565b6000806000606084860312156115b857600080fd5b83356115c38161153c565b925060208401356115d38161153c565b929592945050506040919091013590565b6000602082840312156115f657600080fd5b8135610e708161153c565b6000806040838503121561161457600080fd5b823561161f8161153c565b9150602083013561162f8161153c565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561167c5761167c61163a565b500190565b6000828210156116935761169361163a565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156116d0576116d061163a565b500290565b6000602082840312156116e757600080fd5b8151610e708161153c565b60006020828403121561170457600080fd5b81518015158114610e7057600080fdfea164736f6c634300080f000a"; + bytes internal constant preimageOracleCode = + hex"6080604052600436106101d85760003560e01c80639d53a64811610102578063ddcd58de11610095578063ec5efcbc11610064578063ec5efcbc14610681578063f3f480d9146106a1578063faf37bc7146106d4578063fef2b4ed146106e757600080fd5b8063ddcd58de146105d4578063e03110e11461060c578063e159261114610641578063ea7139501461066157600080fd5b8063b5e7154c116100d1578063b5e7154c14610555578063d18534b51461056c578063da35c6641461058c578063dd24f9bf146105a157600080fd5b80639d53a6481461048e5780639d7e8769146104dd578063b2e67ba8146104fd578063b4801e611461053557600080fd5b806361238bde1161017a5780637ac54767116101495780637ac54767146103ca5780638542cf50146103ea578063882856ef146104355780638dc4be111461046e57600080fd5b806361238bde1461031e5780636551927b146103565780637051472e1461038e5780637917de1d146103aa57600080fd5b80633909af5c116101b65780633909af5c146102715780634d52b4c91461029357806352f0f3ad146102a857806354fd4d50146102c857600080fd5b8063013cf08b146101dd5780630359a5631461022e5780632055b36b1461025c575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612ca2565b610714565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612ce4565b610759565b604051908152602001610225565b34801561026857600080fd5b5061024e601081565b34801561027d57600080fd5b5061029161028c366004612eec565b610891565b005b34801561029f57600080fd5b5061024e610ae8565b3480156102b457600080fd5b5061024e6102c3366004612fd8565b610b03565b3480156102d457600080fd5b506103116040518060400160405280600581526020017f312e312e3500000000000000000000000000000000000000000000000000000081525081565b604051610225919061303f565b34801561032a57600080fd5b5061024e610339366004613090565b600160209081526000928352604080842090915290825290205481565b34801561036257600080fd5b5061024e610371366004612ce4565b601560209081526000928352604080842090915290825290205481565b34801561039a57600080fd5b5061024e6703782dace9d9000081565b3480156103b657600080fd5b506102916103c53660046130f4565b610bd9565b3480156103d657600080fd5b5061024e6103e5366004612ca2565b6110dc565b3480156103f657600080fd5b50610425610405366004613090565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610225565b34801561044157600080fd5b50610455610450366004613190565b6110f3565b60405167ffffffffffffffff9091168152602001610225565b34801561047a57600080fd5b506102916104893660046131c3565b61114d565b34801561049a57600080fd5b5061024e6104a9366004612ce4565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104e957600080fd5b506102916104f836600461320f565b611248565b34801561050957600080fd5b5061024e610518366004612ce4565b601760209081526000928352604080842090915290825290205481565b34801561054157600080fd5b5061024e610550366004613190565b6113ff565b34801561056157600080fd5b5061024e620186a081565b34801561057857600080fd5b50610291610587366004612eec565b611431565b34801561059857600080fd5b5060135461024e565b3480156105ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000001ec3061024e565b3480156105e057600080fd5b5061024e6105ef366004612ce4565b601660209081526000928352604080842090915290825290205481565b34801561061857600080fd5b5061062c610627366004613090565b611840565b60408051928352602083019190915201610225565b34801561064d57600080fd5b5061029161065c3660046131c3565b611931565b34801561066d57600080fd5b5061029161067c36600461329b565b611a39565b34801561068d57600080fd5b5061029161069c36600461330a565b611b98565b3480156106ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000001518061024e565b6102916106e2366004613392565b611d1e565b3480156106f357600080fd5b5061024e610702366004612ca2565b60006020819052908152604090205481565b6013818154811061072457600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061079c9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610889578160011660010361082f5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107fc576107fc6133ce565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250610870565b8260038260108110610843576108436133ce565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c90806108818161342c565b9150506107a7565b505092915050565b600061089d8a8a610759565b90506108c086868360208b01356108bb6108b68d613464565b611fea565b61202a565b80156108de57506108de83838360208801356108bb6108b68a613464565b610914576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86604001358860405160200161092a9190613533565b6040516020818303038152906040528051906020012014610977576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161098d9190613571565b146109c4576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a0c886109d28680613589565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061208b92505050565b610a15886121e6565b836040013588604051602001610a2b9190613533565b6040516020818303038152906040528051906020012003610a78576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610adc8a8a33612800565b50505050505050505050565b6001610af660106002613710565b610b00919061371c565b81565b6000610b0f86866128c0565b9050610b1c836008613571565b82101580610b2a5750602083115b15610b61576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610bf257610beb868661296d565b9050610c2c565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610c5957505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610cda8260601c63ffffffff1690565b63ffffffff169050333214610d1b576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2b8260801c63ffffffff1690565b63ffffffff16600003610d6a576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d748260c01c90565b67ffffffffffffffff1615610db5576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610dee576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfb89898d88866129e6565b83516020850160888204881415608883061715610e20576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610ed0578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610ec5576001821615610ea55782818b0152610ec5565b8981015160009081526020938452604090209260019290921c9101610e88565b505050608801610e2d565b50505050600160106002610ee49190613710565b610eee919061371c565b811115610f27576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9c610f3a8360401c63ffffffff1690565b610f4a9063ffffffff168a613571565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b915084156110295777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610fd68260801c63ffffffff1690565b63ffffffff16610fec8360401c63ffffffff1690565b63ffffffff1614611029576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061104f90846010612c18565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106110ec57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061111b57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061116b5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa90508061119857600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806112705763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826112f2576309bde3396000526004601cfd5b602886106113085763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061142757600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156114a4576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114ae8160c01c90565b67ffffffffffffffff166000036114f1576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000001518061151c8260c01c90565b6115309067ffffffffffffffff164261371c565b11611567576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115738b8b610759565b905061158c87878360208c01356108bb6108b68e613464565b80156115aa57506115aa84848360208901356108bb6108b68b613464565b6115e0576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016115f69190613533565b6040516020818303038152906040528051906020012014611643576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460200135886020013560016116599190613571565b14158061168b575060016116738360601c63ffffffff1690565b61167d9190613733565b63ffffffff16856020013514155b156116c2576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116d0896109d28780613589565b6116d9896121e6565b60006116e48a612b39565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0200000000000000000000000000000000000000000000000000000000000000179050600061173b8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020546001600084815260200190815260200160002060008381526020019081526020016000208190555061180d8460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118318d8d81612800565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff166118c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546118e5816008613571565b6118f0856020613571565b1061190e5783611901826008613571565b61190b919061371c565b91505b506000938452600160209081526040808620948652939052919092205492909150565b60443560008060088301861061194f5763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b60008060008060808860601b81528760c01b6014820152858782601c0137601c860181207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0600000000000000000000000000000000000000000000000000000000000000179350604088026260216001603f5a021015611ac35763dd629f866000526004601cfd5b6000808783601c018c5afa94503d6001019150600882018a10611aee5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e89017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208d8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209c83529b81528b8220929092559384528390529790912096909655505050505050565b6000611ba48686610759565b9050611bbd83838360208801356108bb6108b68a613464565b611bf3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611c2f576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c37612c56565b611c45816109d28780613589565b611c4e816121e6565b846040013581604051602001611c649190613533565b6040516020818303038152906040528051906020012003611cb1576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611d15878733612800565b50505050505050565b6703782dace9d90000341015611d60576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d99576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611da4816008613758565b63ffffffff168263ffffffff1610611de8576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000001ec308163ffffffff161015611e48576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152601560209081526040808320868452909152902054611e738160801c63ffffffff1690565b63ffffffff1615611eb0576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608082901b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff60a085901b167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff83161717336000818152601560209081526040808320898452825280832094909455835180850185528381528082018981526013805460018101825590855291517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290930292830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015591815260168252828120968152959052909320349055505050565b600081600001518260200151836040015160405160200161200d93929190613780565b604051602081830303815290604052805190602001209050919050565b60008160005b601081101561207e578060051b880135600186831c16600181146120635760008481526020839052604090209350612074565b600082815260208590526040902093505b5050600101612030565b5090931495945050505050565b608881511461209957600080fd5b602081016020830161211a565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050612114816120ff868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b612126600083836120a6565b612132600183836120a6565b61213e600283836120a6565b61214a600383836120a6565b612156600483836120a6565b612162600583836120a6565b61216e600683836120a6565b61217a600783836120a6565b612186600883836120a6565b612192600983836120a6565b61219e600a83836120a6565b6121aa600b83836120a6565b6121b6600c83836120a6565b6121c2600d83836120a6565b6121ce600e83836120a6565b6121da600f83836120a6565b612114601083836120a6565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e001604051602081830303815290604052905060208201602082016126e0565b600583901b8101518518604085900381901c90851b1867ffffffffffffffff8116600584901b8301525b505050505050565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c6123cb8660011b67ffffffffffffffff1690565b18188584603f1c6123e68660011b67ffffffffffffffff1690565b18188584603f1c6124018660011b67ffffffffffffffff1690565b181895508483603f1c61241e8560011b67ffffffffffffffff1690565b181894508387603f1c61243b8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935087925061247b81602c60066001876122dc565b61248b87601460096006876122dc565b61249b86603d60166009876122dc565b6124ab876027600e6016876122dc565b6124bb8260126014600e876122dc565b6124cb86603e60026014876122dc565b6124db86602b600c6002876122dc565b6124eb856019600d600c876122dc565b6124fb8760086013600d876122dc565b61250b85603860176013876122dc565b61251b826029600f6017876122dc565b61252b87601b6004600f876122dc565b61253b87600e60186004876122dc565b61254b81600260156018876122dc565b61255b85603760086015876122dc565b61256b81602d60106008876122dc565b61257b82602460056010876122dc565b61258b85601c60036005876122dc565b61259b85601560126003876122dc565b6125ab86600f60116012876122dc565b6125bb81600a600b6011876122dc565b506125cc8560066007600b866122dc565b6125dc816003600a6007866122dc565b5067ffffffffffffffff8216610140820152612306565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611d15565b61267a6000826125f3565b6126856005826125f3565b612690600a826125f3565b61269b600f826125f3565b6126a66014826125f3565b50565b6126b28161230e565b6126bb8161266f565b600383901b820151815160c09190911c9061211490821867ffffffffffffffff168352565b6126ec600082846126a9565b6126f8600182846126a9565b612704600282846126a9565b612710600382846126a9565b61271c600482846126a9565b612728600582846126a9565b612734600682846126a9565b612740600782846126a9565b61274c600882846126a9565b612758600982846126a9565b612764600a82846126a9565b612770600b82846126a9565b61277c600c82846126a9565b612788600d82846126a9565b612794600e82846126a9565b6127a0600f82846126a9565b6127ac601082846126a9565b6127b8601182846126a9565b6127c4601282846126a9565b6127d0601382846126a9565b6127dc601482846126a9565b6127e8601582846126a9565b6127f4601682846126a9565b612114601782846126a9565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d8060008114612879576040519150601f19603f3d011682016040523d82523d6000602084013e61287e565b606091505b50509050806128b9576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617612966818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b60606040519050816020820181810182868337608883068080156129b65760888290038501848101848103803687375060806001820353506001845160001a17845386526129cd565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b60006129f88260a01c63ffffffff1690565b67ffffffffffffffff1690506000612a168360801c63ffffffff1690565b63ffffffff1690506000612a308460401c63ffffffff1690565b63ffffffff169050600883108015612a46575080155b15612a7a5760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612b2f565b60088310158015612a98575080612a9260088561371c565b93508310155b8015612aac5750612aa98782613571565b83105b15612b2f576000612abd828561371c565b905087612acb826020613571565b10158015612ad7575085155b15612b0e576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612bbc565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612b6a8360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612b978360101b67ffffffffffffffff1690565b1617905060008160201c612bb58360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612bd490612b40565b612b40565b6040820151612be290612b40565b60401b17612bfa612bcf60018460059190911b015190565b825160809190911b90612c0c90612b40565b60c01b17179392505050565b8260108101928215612c46579160200282015b82811115612c46578251825591602001919060010190612c2b565b50612c52929150612c6e565b5090565b6040518060200160405280612c69612c83565b905290565b5b80821115612c525760008155600101612c6f565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612cb457600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cdf57600080fd5b919050565b60008060408385031215612cf757600080fd5b612d0083612cbb565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612d6157612d61612d0e565b60405290565b6040516060810167ffffffffffffffff81118282101715612d6157612d61612d0e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612dd157612dd1612d0e565b604052919050565b803567ffffffffffffffff81168114612cdf57600080fd5b6000610320808385031215612e0557600080fd5b604051602080820182811067ffffffffffffffff82111715612e2957612e29612d0e565b806040525081935085601f860112612e4057600080fd5b612e48612d3d565b928501928087851115612e5a57600080fd5b865b85811015612e7a57612e6d81612dd9565b8352918301918301612e5c565b509092525091949350505050565b600060608284031215612e9a57600080fd5b50919050565b60008083601f840112612eb257600080fd5b50813567ffffffffffffffff811115612eca57600080fd5b6020830191508360208260051b8501011115612ee557600080fd5b9250929050565b60008060008060008060008060006103e08a8c031215612f0b57600080fd5b612f148a612cbb565b985060208a01359750612f2a8b60408c01612df1565b96506103608a013567ffffffffffffffff80821115612f4857600080fd5b612f548d838e01612e88565b97506103808c0135915080821115612f6b57600080fd5b612f778d838e01612ea0565b90975095506103a08c0135915080821115612f9157600080fd5b612f9d8d838e01612e88565b94506103c08c0135915080821115612fb457600080fd5b50612fc18c828d01612ea0565b915080935050809150509295985092959850929598565b600080600080600060a08688031215612ff057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561302e578181015183820152602001613016565b838111156121145750506000910152565b602081526000825180602084015261305e816040850160208701613013565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156130a357600080fd5b50508035926020909101359150565b60008083601f8401126130c457600080fd5b50813567ffffffffffffffff8111156130dc57600080fd5b602083019150836020828501011115612ee557600080fd5b600080600080600080600060a0888a03121561310f57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561313557600080fd5b6131418b838c016130b2565b909750955060608a013591508082111561315a57600080fd5b506131678a828b01612ea0565b9094509250506080880135801515811461318057600080fd5b8091505092959891949750929550565b6000806000606084860312156131a557600080fd5b6131ae84612cbb565b95602085013595506040909401359392505050565b6000806000604084860312156131d857600080fd5b83359250602084013567ffffffffffffffff8111156131f657600080fd5b613202868287016130b2565b9497909650939450505050565b600080600080600080600060a0888a03121561322a57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561325057600080fd5b61325c8b838c016130b2565b909750955060608a013591508082111561327557600080fd5b506132828a828b016130b2565b989b979a50959894979596608090950135949350505050565b6000806000806000608086880312156132b357600080fd5b853594506132c360208701612cbb565b93506132d160408701612dd9565b9250606086013567ffffffffffffffff8111156132ed57600080fd5b6132f9888289016130b2565b969995985093965092949392505050565b60008060008060006080868803121561332257600080fd5b61332b86612cbb565b945060208601359350604086013567ffffffffffffffff8082111561334f57600080fd5b61335b89838a01612e88565b9450606088013591508082111561337157600080fd5b506132f988828901612ea0565b803563ffffffff81168114612cdf57600080fd5b6000806000606084860312156133a757600080fd5b833592506133b76020850161337e565b91506133c56040850161337e565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361345d5761345d6133fd565b5060010190565b60006060823603121561347657600080fd5b61347e612d67565b823567ffffffffffffffff8082111561349657600080fd5b9084019036601f8301126134a957600080fd5b81356020828211156134bd576134bd612d0e565b6134ed817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612d8a565b9250818352368183860101111561350357600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b601981101561356857825167ffffffffffffffff1682526020928301929091019060010161353f565b50505092915050565b60008219821115613584576135846133fd565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135be57600080fd5b83018035915067ffffffffffffffff8211156135d957600080fd5b602001915036819003821315612ee557600080fd5b600181815b8085111561364757817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561362d5761362d6133fd565b8085161561363a57918102915b93841c93908002906135f3565b509250929050565b60008261365e5750600161370a565b8161366b5750600061370a565b8160018114613681576002811461368b576136a7565b600191505061370a565b60ff84111561369c5761369c6133fd565b50506001821b61370a565b5060208310610133831016604e8410600b84101617156136ca575081810a61370a565b6136d483836135ee565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613706576137066133fd565b0290505b92915050565b6000612966838361364f565b60008282101561372e5761372e6133fd565b500390565b600063ffffffff83811690831681811015613750576137506133fd565b039392505050565b600063ffffffff808316818516808303821115613777576137776133fd565b01949350505050565b60008451613792818460208901613013565b9190910192835250602082015260400191905056fea164736f6c634300080f000a"; + bytes internal constant mipsSingletonCode = + hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c80631219a4e41461005157806354fd4d50146100865780637dc0d1d0146100cf578063e14ced3214610113575b600080fd5b7f00000000000000000000000000000000000000000000000000000000000000085b6040519081526020015b60405180910390f35b6100c26040518060400160405280600681526020017f312e31302e31000000000000000000000000000000000000000000000000000081525081565b60405161007d9190615144565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e016815260200161007d565b6100736101213660046151f9565b60006101308686868686610143565b905061013a61066b565b95945050505050565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101c36150da565b6000608083146101d257600080fd5b61026082146101e057600080fd5b604051610760146101f057600080fd5b608489146101fd57600080fd5b610164871461020b57600080fd5b508735608052602088013560a052604088013560c090811c81526048890135811c60e052605089013560f890811c6101005260518a0135821c6101205260598a0135821c6101405260618a0135811c6101605260628a0135811c61018081905260638b0135831c6101a052606b8b0135831c6101c05260738b013590911c6101e05260748a01356102005260948a01356102205260b48a013590911c610240526102b4816107b5565b826101000151156102d1576102c76107f9565b935050505061013a565b7fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58361018001511480156103085750826101600151155b8061034457507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5836101a0015114801561034457508261016001515b156103d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4d49505336343a206163746976652074687265616420737461636b206973206560448201527f6d7074790000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6101208301805160010167ffffffffffffffff1690526103f482610919565b6103fe8383610a3d565b8160400151156104195761041183610ae1565b6102c76107f9565b620186a067ffffffffffffffff1683610140015167ffffffffffffffff161061044f576104468383610b6c565b506102c76107f9565b6101408301805160010167ffffffffffffffff16905260006102ae905060008060006104848660600151886000015186610d4a565b9250925092508163ffffffff1660001480156104a657508063ffffffff16600c145b156104c2576104b489610dd0565b97505050505050505061013a565b63ffffffff8216603014806104dd575063ffffffff82166038145b156104ee576104b487878585611f95565b63ffffffff821660341480610509575063ffffffff8216603c145b1561051a576104b487878585611f95565b60006105a4876040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b6040805160e080820183528382528a015160208201528a5191810191909152610a2e606082015263ffffffff808716608083015285811660a0830152841660c08201529091506000806105f68361224a565b918d52855167ffffffffffffffff9081166060808f01919091526020880151821660808f01526040880151821660a08f01528701511660c08d01529250905061063d6127ff565b811561064d5761064d8b826128bc565b6106556107f9565b9b50505050505050505050505095945050505050565b604080516101e0808201835260008083526020830181905292820183905260608201839052608080830184905260a0830184905260c0830184905260e08301849052610100830184905261012083018490526101408301849052610160830184905261018083018490526101a083018490526101c0909201839052519091906106f957816101800151610700565b816101a001515b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb581036107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4d49505336343a20706f73742d7374617465206163746976652074687265616460448201527f20737461636b20697320656d707479000000000000000000000000000000000060648201526084016103cc565b5050565b60018163ffffffff1611156107f6576040517f0136cc7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60408051608051815260a051602082015260d8519181019190915260f851604882015261011f5160508201526101385160518201526101585160598201526101605161017f5160618301526101805161019f5160628401526101b85160638401526101d851606b8401526101ff5160738401526102005160748401526102205160948401526102585160b4840152600060bc8085018281529194929361026093929183a06000935084600181146108b357600394506108db565b8180156108cb57600181146108d457600295506108d9565b600095506108d9565b600195505b505b505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b179150610915816107b5565b5090565b3661092861012a61016461529c565b8110156109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d49505336343a20696e73756666696369656e742063616c6c6461746120666f60448201527f7220746872656164207769746e6573730000000000000000000000000000000060648201526084016103cc565b6101643560c090811c835261016c3560f890811c602085015261016d35901c604084015261016e35811c606084015261017635811c608084015261017e35811c60a084015261018635811c9083015260e082015161018e9060005b6020811015610a3657823560c01c8252600890920191602090910190600101610a12565b5050505050565b6000610a50610a4a6128f4565b836129a7565b90506000836101600151610a6957836101800151610a70565b836101a001515b9050818114610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d49505336343a20696e76616c696420746872656164207769746e657373000060448201526064016103cc565b50505050565b80610160015115610aff57610af46128f4565b6101a0820152610b0e565b610b076128f4565b6101808201525b6000816101600151610b2557816101800151610b2c565b816101a001515b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58103610b6057610160820180511590525b50600061014090910152565b600082610160015115610c30577fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5836101a0015103610c07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d49505336343a20656d7074792072696768742074687265616420737461636b60448201526064016103cc565b610c0f6128f4565b6101a0840152610180830151610c2590836129a7565b610180840152610ce3565b7fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb583610180015103610cbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d49505336343a20656d707479206c6566742074687265616420737461636b0060448201526064016103cc565b610cc66128f4565b6101808401526101a0830151610cdc90836129a7565b6101a08401525b6000836101600151610cfa57836101800151610d01565b836101a001515b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58103610d395761016084018051159052600191505b506000610140909301929092525090565b600080806003861615610d89576040517f3f8200bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610da08667fffffffffffffff88916876129e9565b9050610db0878260046000612a3b565b9350601a8463ffffffff16901c925083603f169150505b93509350939050565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101829052610e506150da565b608091506102609050600080600080610e6c8560e00151612a8b565b935093509350935060008061139163ffffffff168667ffffffffffffffff1603610eb857610e9f85858a60600151612aa7565b67ffffffffffffffff1660608b01529092509050611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6c67ffffffffffffffff871601610ef757654000000000009150611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec4167ffffffffffffffff87160161114e5762050f0067ffffffffffffffff861614610f61576001610100890152600260e0890152610f536107f9565b9a9950505050505050505050565b50506101c08601516000610f736150da565b6101c089015167ffffffffffffffff9081168252600060208301819052604083018190526080808b018051841660608601525160040183169084015260a0808b015183169084015260c0808b0151909216918301919091525b6020811015611022578860e001518160208110610feb57610feb6152b4565b60200201518260e001518260208110611006576110066152b4565b67ffffffffffffffff9092166020929092020152600101610fcc565b5060e0818101805167ffffffffffffffff8881166103a09092019190915281516000604091820181905292519093018290526101c08c018051600101821690528251608080820185528382526020808301859052828601859052606092830185905285518083018752838f015185168152918e015184169082015260a08d015183169481019490945260c08c0151909116908301529060e0808b015167ffffffffffffffff80881660408301528087169190920152602082018051808316845260040190911690529050805167ffffffffffffffff9081166060808c01919091526020830151821660808c01526040830151821660a08c01528201511660c08a015261112c6127ff565b6111368a83612b59565b61113e6107f9565b9c9b505050505050505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebab67ffffffffffffffff8716016111a057600161010089015260ff851660e08901526111986127ff565b610f536107f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7867ffffffffffffffff87160161127a57604080516101208101825267ffffffffffffffff8781168252868116602080840191909152868216838501528b01516060830152918a0151909116608082015260a081018b90527f0000000000000000000000001e1d73536a081ef2f355d29794547a9770aeb1e073ffffffffffffffffffffffffffffffffffffffff1660c0820152610a2e60e0820152885161010082015261126e8982612b9f565b9093509150611e8f9050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7767ffffffffffffffff871601611322576040805160e08101825267ffffffffffffffff8781168252868116602080840191909152868216838501528b01516060830152918a01519091166080820152610a2e60a0820152885160c082015261130281612be5565b67ffffffffffffffff1660408d015260208c01529093509150611e8f9050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3267ffffffffffffffff8716016113675761135d8585612d77565b9092509050611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebc667ffffffffffffffff8716016113a357505084516000611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3e67ffffffffffffffff87160161140c576001604088015260ff851660208801526113ed88612efe565b1561140457600161010089015260ff851660e08901525b6111986127ff565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebb667ffffffffffffffff87160161152d5767fffffffffffffffc85167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8067ffffffffffffffff8616016114cd57600061148482612f81565b90508463ffffffff808316908216146114ab57600b945067ffffffffffffffff93506114c6565b6114b58b8b61300b565b9d9c50505050505050505050505050565b5050611527565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f67ffffffffffffffff86160161151757611508898961300b565b9b9a5050505050505050505050565b6016925067ffffffffffffffff91505b50611e8f565b67ffffffffffffffff861661139f1480611552575067ffffffffffffffff86166113aa145b1561156157610f53888861300b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7667ffffffffffffffff8716016115a557506009905067ffffffffffffffff611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9a67ffffffffffffffff8716016117435767ffffffffffffffff851615806115f7575067ffffffffffffffff85166001145b156117305750600090508080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff8816016116575750506101208801516298968067ffffffffffffffff9091168181049190066064025b895167fffffffffffffff88716906116729082610a2e613121565b6116a8576040517f8e77b2b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b581610a2e8561312e565b8b526116c18b826128bc565b8a516116d390600883016111ae613121565b611709576040517f834c4cd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611719600882016111ae8461312e565b8b526117288b600883016128bc565b505050611e8f565b506016905067ffffffffffffffff611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5267ffffffffffffffff87160161177f57506000905080611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb3f67ffffffffffffffff8716016117c7576117bb8886866131fd565b8a529092509050611e8f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6d67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6e67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebb467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5d67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6a67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebf767ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6b67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb4f67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7567ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6867ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7367ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb8167ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec2167ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb7767ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6967ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5b67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5967ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeba867ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb6867ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3b67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1267ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5e67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9767ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec5467ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeba067ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9f67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb9c67ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1967ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7067ffffffffffffffff87160115611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5c67ffffffffffffffff871601611e2d5760808416600003611e2457506016905067ffffffffffffffff611e8f565b60649150611e8f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d49505336343a20756e696d706c656d656e7465642073797363616c6c00000060448201526064016103cc565b6000611f19886040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b60e0808a015167ffffffffffffffff80871660408301528086169190920152602082018051808316845260040190911690529050805167ffffffffffffffff9081166060808b01919091526020830151821660808b01526040830151821660a08b01528201511660c0890152611f8d6127ff565b6115086107f9565b60e08301516000908190601f601586901c1660208110611fb757611fb76152b4565b60200201519050601f601085901c166000611fd18661338a565b830190506001600463ffffffff871660341480611ff4575063ffffffff8716603c145b1561200157506002905060085b885160009063ffffffff891660301480612021575063ffffffff89166034145b1561205b576120338c868560016133a1565b60ff851660808e015267ffffffffffffffff80871660a08f0152821660c08e0152915061215e565b63ffffffff891660381480612076575063ffffffff8916603c145b1561212c578360ff168c6080015160ff161480156120ab57508067ffffffffffffffff168c60c0015167ffffffffffffffff16145b80156120ce57508467ffffffffffffffff168c60a0015167ffffffffffffffff16145b1561212357600060808d0181905260a08d0181905260c08d015260008b60e001518763ffffffff1660208110612106576121066152b4565b602002015190506121198d8786846133e1565b600192505061215e565b6000915061215e565b6040517fecf79d0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121e88c6040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b9050612202818d60e001518963ffffffff1686600161343b565b805167ffffffffffffffff9081166060808f01919091526020830151821660808f01526040830151821660a08f01528201511660c08d01526122426127ff565b6114b56107f9565b604081015160a0820151600090819063ffffffff166002148061227757508360a0015163ffffffff166003145b156122db57608084015160009060021b630ffffffc1661229c63f0000000602061351f565b866000015160200151161790506122d5858660a0015163ffffffff166002146122c657601f6122c9565b60005b63ffffffff1683613599565b506127f8565b60808401516020808601516000928392601f601083901c8116939260151c16908110612309576123096152b4565b6020020151925060008190508760a0015163ffffffff166027148061233857508760a0015163ffffffff16601a145b8061234d57508760a0015163ffffffff16601b145b156123815787602001518267ffffffffffffffff1660208110612372576123726152b4565b602002015192508190506124be565b60a088015163ffffffff1615806123a257508760a0015163ffffffff16601c145b156123e15787602001518267ffffffffffffffff16602081106123c7576123c76152b4565b60200201516080890151909350600b1c601f1690506124be565b60208860a0015163ffffffff161015612455578760a0015163ffffffff16600c148061241757508760a0015163ffffffff16600d145b8061242c57508760a0015163ffffffff16600e145b1561244157608088015161ffff1692506124be565b61244e886080015161338a565b92506124be565b60288860a0015163ffffffff1610158061247957508760a0015163ffffffff166022145b8061248e57508760a0015163ffffffff166026145b156124be5787602001518267ffffffffffffffff16602081106124b3576124b36152b4565b602002015192508190505b60048860a0015163ffffffff16101580156124e3575060088860a0015163ffffffff16105b806124f857508760a0015163ffffffff166001145b156125245761251b886000015189602001518a60a001518b608001518689613683565b505050506127f8565b600067ffffffffffffffff9050600060208a60a0015163ffffffff16101580612557575060a08a015163ffffffff16601a145b8061256c575060a08a015163ffffffff16601b145b156125d45761257e8a6080015161338a565b86019550600067fffffffffffffff8871690506125a48b60400151828d606001516129e9565b915060288b60a0015163ffffffff16106125d2578a60a0015163ffffffff166037146125d257809250600093505b505b60006040518060c001604052808c6080015163ffffffff1681526020018c60a0015163ffffffff1681526020018c60c0015163ffffffff1681526020018867ffffffffffffffff1681526020018767ffffffffffffffff1681526020018367ffffffffffffffff168152509050600067ffffffffffffffff612655836138f6565b60a08e01519116915060209063ffffffff1615801561267f575060088d60c0015163ffffffff1610155b801561269e57508067ffffffffffffffff168d60c0015163ffffffff16105b156127ae578c60c0015163ffffffff16600814806126c657508c60c0015163ffffffff166009145b156126fe576126f08d8e60c0015163ffffffff166008146126e757876126ea565b60005b8b613599565b5050505050505050506127f8565b8c60c0015163ffffffff16600a0361272f578c5160208e01516126f09190888c67ffffffffffffffff8d161561343b565b8c60c0015163ffffffff16600b03612761578c5160208e01516126f09190888c67ffffffffffffffff8d16151561343b565b60108d60c0015163ffffffff161015801561278f57508067ffffffffffffffff168d60c0015163ffffffff16105b156127ae576126f08d600001518e602001518f60c001518c8c8b614570565b67ffffffffffffffff858116146127d8576127ce858e606001518461312e565b9b5060019a508499505b6127ee8d600001518e602001518885600161343b565b5050505050505050505b9193909250565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101919091526128806150da565b50608090506102606000612895610a4a6128f4565b9050826101600151156128af576101a08301819052505050565b6101808301819052505050565b60a082015167fffffffffffffff81667ffffffffffffffff8216036107b15760006080830181905260a0830181905260c08301525050565b61028e353661290661012a6020615312565b6129189063ffffffff1661016461529c565b811015610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d49505336343a20696e73756666696369656e742063616c6c6461746120666f60448201527f7220746872656164207769746e6573730000000000000000000000000000000060648201526084016103cc565b6000806129b383614b4a565b60408051602081018790529081018290529091506060016040516020818303038152906040528051906020012091505092915050565b6000806129f7858585614bd3565b909250905080612a33576040517f8e77b2b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509392505050565b600080600080612a4b8887614cab565b925092509250828267ffffffffffffffff168867ffffffffffffffff16901c1693508415612a8057612a7d848261351f565b93505b505050949350505050565b6040810151608082015160a083015160c08401515b9193509193565b6000808284610fff811615612ac157610fff811661100003015b8667ffffffffffffffff16600003612b4b57849350908101906560000000000067ffffffffffffffff83161180612b0b57508467ffffffffffffffff168267ffffffffffffffff16105b80612b2957508567ffffffffffffffff168167ffffffffffffffff16105b15612b4657506016925067ffffffffffffffff9150839050610dc7565b612b4f565b8693505b5093509350939050565b81610160015115612b7e57612b73826101a00151826129a7565b6101a0830152610b60565b612b8d826101800151826129a7565b61018083015250600061014090910152565b600080600080612bae85614d2f565b918b5267ffffffffffffffff90921660408b0152929650909450925090508115612bdc57612bdc86826128bc565b50509250929050565b6060810151608082015182516000928392909167ffffffffffffffff1660011480612c1b5750845167ffffffffffffffff166002145b80612c315750845167ffffffffffffffff166004145b15612c425784604001519350612aa0565b845167ffffffffffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa01612d1c576000612c978660c0015167fffffffffffffff88860200151168860a001516129e9565b60608701516020880151604089015192935090916007821660080381811015612cbe578091505b67ffffffffffffffff821660408b018190529850600880830294851b600190951b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192909103029390931c9290921617925060009150612aa09050565b845167ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c01612d6257600b935067ffffffffffffffff9250612aa0565b60099567ffffffffffffffff95509193509150565b60008067ffffffffffffffff8316600103612e375767ffffffffffffffff84161580612dad575067ffffffffffffffff84166001145b80612dc2575067ffffffffffffffff84166002145b80612dd7575067ffffffffffffffff84166005145b80612dec575067ffffffffffffffff84166003145b80612e01575067ffffffffffffffff84166006145b80612e16575067ffffffffffffffff84166004145b15612e245760009150612ef7565b506009905067ffffffffffffffff612ef7565b8267ffffffffffffffff16600303612ee85767ffffffffffffffff84161580612e6a575067ffffffffffffffff84166005145b80612e7f575067ffffffffffffffff84166003145b15612e8d5760009150612ef7565b67ffffffffffffffff841660011480612eb0575067ffffffffffffffff84166002145b80612ec5575067ffffffffffffffff84166006145b80612eda575067ffffffffffffffff84166004145b15612e245760019150612ef7565b506016905067ffffffffffffffff5b9250929050565b600080826101600151612f1657826101a00151612f1d565b8261018001515b905060007fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5612f4a6128f4565b1490507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb582148015612f795750805b949350505050565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290525060806000612f7982856004846133a1565b6000808080613098856040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015167ffffffffffffffff168152602001836080015167ffffffffffffffff1681526020018360a0015167ffffffffffffffff1681526020018360c0015167ffffffffffffffff168152509050919050565b60e08087015167ffffffffffffffff80871660408301528086169190920152602082018051808316845260040190911690529050805167ffffffffffffffff9081166060808801919091526020830151821660808801526040830151821660a08801528201511660c086015261310e8686610b6c565b506131176107f9565b9695505050505050565b600061013a848484614bd3565b60006131398361500d565b600784161561316d576040517fe6c4247b000000000000000000000000000000000000000000000000000000008152600481fd5b6020830192601f851660180360031b83811b913567ffffffffffffffff90911b191617600585901c603b60005b818110156131f15760208701963583821c60011680156131c157600181146131d6576131e7565b600086815260208390526040902095506131e7565b600082815260208790526040902095505b505060010161319a565b50919695505050505050565b6000808067fffffffffffffff885168161323061321e61012a61016461529c565b61322990602061529c565b6107800190565b90506000613243896000015184846129e9565b905060006132b38a610120015160008082679e3779b97f4a7c15019050601e8167ffffffffffffffff16901c811867bf58476d1ce4e5b9029050601b8167ffffffffffffffff16901c81186794d049bb133111eb029050601f8167ffffffffffffffff16901c8118915050919050565b905060006132c1858b61533a565b905060006132d082600861533a565b90508967ffffffffffffffff80821690831610156132eb5750805b600060016132fa836008615363565b67ffffffffffffffff166001901b6133129190615393565b905061331f82600861533a565b61332a906008615363565b67ffffffffffffffff91821691161b613344846008615363565b67ffffffffffffffff91821691161c801986168582161761336689898361312e565b99506133728f8a6128bc565b50909d60009d50979b50969950505050505050505050565b600061339b61ffff8316601061351f565b92915050565b600067fffffffffffffff88416816133c061321e61012a61016461529c565b905060006133d3886000015184846129e9565b9050612a7d87828888612a3b565b67fffffffffffffff8831660006133ff61321e61012a61016461529c565b90506000613412876000015184846129e9565b90506000613422878388886150a2565b905061342f84848361312e565b90975250505050505050565b60208367ffffffffffffffff16106134af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d49505336343a2076616c69642072656769737465720000000000000000000060448201526064016103cc565b67ffffffffffffffff8316158015906134c55750805b156134fc5781848467ffffffffffffffff16602081106134e7576134e76152b4565b67ffffffffffffffff90921660209290920201525b5050505060208101805167ffffffffffffffff8082169093526004019091169052565b6000600167ffffffffffffffff8481167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85810183169190911c83161515926040869003831681901b820192861692831b921b018261357f576000613581565b815b90861667ffffffffffffffff16179250505092915050565b8251805160209091015167ffffffffffffffff9081166004909201161461361c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d49505336343a206a756d7020696e2064656c617920736c6f7400000000000060448201526064016103cc565b8251805160208083015167ffffffffffffffff908116909352855184841691015290831615610adb578060080184602001518467ffffffffffffffff1660208110613669576136696152b4565b67ffffffffffffffff909216602092909202015250505050565b6000866000015160040167ffffffffffffffff16876020015167ffffffffffffffff161461370d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d49505336343a206272616e636820696e2064656c617920736c6f740000000060448201526064016103cc565b8463ffffffff166004148061372857508463ffffffff166005145b156137b3576000868467ffffffffffffffff166020811061374b5761374b6152b4565b602002015190508067ffffffffffffffff168367ffffffffffffffff1614801561377b57508563ffffffff166004145b806137ab57508067ffffffffffffffff168367ffffffffffffffff16141580156137ab57508563ffffffff166005145b91505061388d565b8463ffffffff166006036137d05760008260070b1315905061388d565b8463ffffffff166007036137ec5760008260070b13905061388d565b8463ffffffff1660010361388d57601f601085901c1660008190036138155760008360070b1291505b8063ffffffff1660100361384357875160080167ffffffffffffffff166103e08801526000600784900b1291505b8063ffffffff1660010361385c5760008360070b121591505b8063ffffffff1660110361388b57875160080167ffffffffffffffff166103e08801526000600784900b121591505b505b8651602088015167ffffffffffffffff16885281156138d65760026138b761ffff8716601061351f565b67ffffffffffffffff90811690911b82016004011660208901526138ec565b60208801805160040167ffffffffffffffff1690525b5050505050505050565b8051602082015160408301516060840151608085015160a0860151600095949392919063ffffffff85161580613944575060088563ffffffff16101580156139445750600f8563ffffffff16105b8061395557508463ffffffff166018145b8061396657508463ffffffff166019145b1561409a5784600881146139b957600981146139c257600a81146139cb57600b81146139d457600c81146139dd57600d81146139e657600e81146139ef57601881146139f85760198114613a0157613a06565b60209450613a06565b60219450613a06565b602a9450613a06565b602b9450613a06565b60249450613a06565b60259450613a06565b60269450613a06565b602c9450613a06565b602d94505b508363ffffffff16600003613a4757601f600687901c16613a3a67ffffffffffffffff8416821b63ffffffff16602061351f565b9998505050505050505050565b8363ffffffff16600203613a7b57613a6f63ffffffff8316601f600689901c161c602061351f565b98975050505050505050565b8363ffffffff16600303613aaa57601f600687901c16613a3a63ffffffff848116831c9060208490031661351f565b8363ffffffff16600403613ad957601f8316613a3a67ffffffffffffffff8416821b63ffffffff16602061351f565b8363ffffffff16600603613afd57613a6f63ffffffff8316601f85161c602061351f565b8363ffffffff16600703613b2557601f8316613a3a63ffffffff8416821c602083900361351f565b8363ffffffff16600803613b3f5750909695505050505050565b8363ffffffff16600903613b595750909695505050505050565b8363ffffffff16600a03613b735750909695505050505050565b8363ffffffff16600b03613b8d5750909695505050505050565b8363ffffffff16600c03613ba75750909695505050505050565b8363ffffffff16600f03613bc15750909695505050505050565b8363ffffffff16601003613bdb5750909695505050505050565b8363ffffffff16601103613bf55750909695505050505050565b8363ffffffff16601203613c0f5750909695505050505050565b8363ffffffff16601303613c295750909695505050505050565b8363ffffffff16601403613c4257509695505050505050565b8363ffffffff16601603613c5b57509695505050505050565b8363ffffffff16601703613c7457509695505050505050565b8363ffffffff16601803613c8e5750909695505050505050565b8363ffffffff16601903613ca85750909695505050505050565b8363ffffffff16601a03613cc25750909695505050505050565b8363ffffffff16601b03613cdc5750909695505050505050565b8363ffffffff16601c03613cf65750909695505050505050565b8363ffffffff16601d03613d105750909695505050505050565b8363ffffffff16601e03613d2a5750909695505050505050565b8363ffffffff16601f03613d445750909695505050505050565b8363ffffffff16602003613d6557613a6f82840163ffffffff16602061351f565b8363ffffffff16602103613d8657613a6f82840163ffffffff16602061351f565b8363ffffffff16602203613da757613a6f82840363ffffffff16602061351f565b8363ffffffff16602303613dc857613a6f82840363ffffffff16602061351f565b8363ffffffff16602403613de157501695945050505050565b8363ffffffff16602503613dfa57501795945050505050565b8363ffffffff16602603613e1357501895945050505050565b8363ffffffff16602703613e2d5750171995945050505050565b8363ffffffff16602a03613e61578160070b8360070b12613e4f576000613e52565b60015b60ff1698975050505050505050565b8363ffffffff16602b03613e91578167ffffffffffffffff168367ffffffffffffffff1610613e4f576000613e52565b8363ffffffff16602c03613eaa57500195945050505050565b8363ffffffff16602d03613ec357500195945050505050565b8363ffffffff16602e03613edd5750900395945050505050565b8363ffffffff16602f03613ef75750900395945050505050565b8363ffffffff16603803613f26575067ffffffffffffffff1660069490941c601f169390931b95945050505050565b8363ffffffff16603a03613f55575067ffffffffffffffff1660069490941c601f169390931c95945050505050565b8363ffffffff16603b03613f7d575060070b60069490941c601f169390931d95945050505050565b8363ffffffff16603c03613fbc5760068663ffffffff16901c601f1660200163ffffffff168267ffffffffffffffff16901b9650505050505050919050565b8363ffffffff16603e03613ffb5760068663ffffffff16901c601f1660200163ffffffff168267ffffffffffffffff16901c9650505050505050919050565b8363ffffffff16603f036140335760068663ffffffff16901c601f1660200163ffffffff168260070b901d9650505050505050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4d49505336343a20696e76616c696420696e737472756374696f6e000000000060448201526064016103cc565b614033565b8463ffffffff16601c0361418f578363ffffffff166002036140c957613a6f82840263ffffffff16602061351f565b8363ffffffff16602014806140e457508363ffffffff166021145b15614133578363ffffffff166020036140fb579119915b60005b6380000000841615614121576801fffffffffffffffe600194851b1693016140fe565b63ffffffff1698975050505050505050565b8363ffffffff166024148061414e57508363ffffffff166025145b15614095578363ffffffff16602403614165579119915b60005b678000000000000000841615614121576801fffffffffffffffe600194851b169301614168565b8463ffffffff16600f036141b657613a6f60108367ffffffffffffffff16901b602061351f565b8463ffffffff166020036141d157613a6f8382600180612a3b565b8463ffffffff166021036141ed57613a6f838260026001612a3b565b8463ffffffff1660220361423e57600061420b848360046000612a3b565b905063ffffffff80821660086003871602821690811b919081901b8116906115089082198716811690841617602061351f565b8463ffffffff1660230361425a57613a6f838260046001612a3b565b8463ffffffff1660240361427657613a6f838260016000612a3b565b8463ffffffff1660250361429257613a6f838260026000612a3b565b8463ffffffff1660260361430f5760006142b0848360046000612a3b565b905063ffffffff80821660038681166008810260180367ffffffffffffffff1692831c939283901c928319881685171691036142f15761113e81602061351f565b67ffffffff00000000959095169094179a9950505050505050505050565b8463ffffffff1660280361432a57613a6f83826001856150a2565b8463ffffffff1660290361434557613a6f83826002856150a2565b8463ffffffff16602a036143985763ffffffff601860039490941b93841681811c67ffffffffffffffff9081166020968716909603811695861b199390931693909116901c1690911b1795945050505050565b8463ffffffff16602b036143b357613a6f83826004856150a2565b8463ffffffff16602e036144135760006143d1848360046000612a3b565b905067ffffffffffffffff838116600860038716026018039182161b9063ffffffff90811681901b8116908119841681169083161761113e87866004846150a2565b8463ffffffff16601a036144475767ffffffffffffffff90811660039390931b60381692831b921b19161795945050505050565b8463ffffffff16601b0361448a5767ffffffffffffffff90811660039390931b60389081169081900382169390931c60089390930181161b161795945050505050565b8463ffffffff166027036144c65767ffffffffffffffff908116602060039490941b8416909303169190911c63ffffffff169695505050505050565b8463ffffffff16602c036144ff5767ffffffffffffffff91821660039390931b60381692831c9190921c19919091161795945050505050565b8463ffffffff16602d0361453e5767ffffffffffffffff603860039490941b8416909303831683811b19919091169190921690911b1795945050505050565b8463ffffffff1660370361455757979650505050505050565b8463ffffffff16603f0361403357509695505050505050565b60008463ffffffff1660100361458b57506060860151614ae2565b8463ffffffff166011036145ae5767ffffffffffffffff84166060880152614ae2565b8463ffffffff166012036145c757506040860151614ae2565b8463ffffffff166013036145ea5767ffffffffffffffff84166040880152614ae2565b8463ffffffff166018036146535760008360030b8560030b02905061461e60208267ffffffffffffffff16901c602061351f565b67ffffffffffffffff16606089015261463e63ffffffff8216602061351f565b67ffffffffffffffff16604089015250614ae2565b8463ffffffff1660190361468d5760008363ffffffff168563ffffffff1602905061461e60208267ffffffffffffffff16901c602061351f565b8463ffffffff16601a0361477b578263ffffffff1660000361470b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b6147318360030b8560030b81614723576147236152e3565b0763ffffffff16602061351f565b67ffffffffffffffff166060880152614767600384810b9086900b81614759576147596152e3565b0563ffffffff16602061351f565b67ffffffffffffffff166040880152614ae2565b8463ffffffff16601b0361485d578263ffffffff166000036147f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b6148258363ffffffff168563ffffffff1681614817576148176152e3565b0663ffffffff16602061351f565b67ffffffffffffffff16606088015261476763ffffffff8085169086168161484f5761484f6152e3565b0463ffffffff16602061351f565b8463ffffffff16601403614881575067ffffffffffffffff8216603f84161b614ae2565b8463ffffffff166016036148a5575067ffffffffffffffff8216603f84161c614ae2565b8463ffffffff166017036148c35750600782900b603f84161d614ae2565b8463ffffffff16601c036149005767ffffffffffffffff600785810b9085900b02600f81900b604090811d831660608b0152911690880152614ae2565b8463ffffffff16601d036149355767ffffffffffffffff84811681851602604081811c831660608b0152911690880152614ae2565b8463ffffffff16601e03614a07578267ffffffffffffffff166000036149b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b8260070b8460070b816149cc576149cc6152e3565b0767ffffffffffffffff166060880152600783810b9085900b816149f2576149f26152e3565b0567ffffffffffffffff166040880152614ae2565b8463ffffffff16601f03614ae2578267ffffffffffffffff16600003614a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d49505336343a206469766973696f6e206279207a65726f000000000000000060448201526064016103cc565b8267ffffffffffffffff168467ffffffffffffffff1681614aac57614aac6152e3565b0667ffffffffffffffff908116606089015283811690851681614ad157614ad16152e3565b0467ffffffffffffffff1660408801525b67ffffffffffffffff821615614b245780868367ffffffffffffffff1660208110614b0f57614b0f6152b4565b67ffffffffffffffff90921660209290920201525b50505060208401805167ffffffffffffffff808216909652600401909416909352505050565b60405160188201518152603f8201516008820152605f82015160098201526078820151600a8201526098820151601282015260b8820151601a82015260d8820151602282015260e0820151600091602a8101835b6020811015614bc25760188401518252602090930192600890910190600101614b9e565b506000815281900390209392505050565b600080614bdf8361500d565b6007841615614c13576040517fe6c4247b000000000000000000000000000000000000000000000000000000008152600481fd5b602083019235600585901c81603b60005b81811015614c7b5760208801973584821c6001168015614c4b5760018114614c6057614c71565b60008581526020839052604090209450614c71565b600082815260208690526040902094505b5050600101614c24565b505087149250508115614ca257601f851660180360031b81901c67ffffffffffffffff1692505b50935093915050565b600080806807fffffffffffffff8600385901b1681614ccb82604061533a565b67ffffffffffffffff9081161c90506000614ce760018861533a565b19881660071690506000614cfc88600861533a565b905088821660006003614d0f838561533a565b959c67ffffffffffffffff909616901b9a50949850929650505050505050565b610100810151608082015182516000928392918390819067ffffffffffffffff161561500457865167ffffffffffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb01614f7057600067fffffffffffffff888602001511690506000614db0896101000151838b60e001516129e9565b60608a015190915060001a600103614e3257614e2c89606001518a60a0015160408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b60608a01525b6000808a60c0015173ffffffffffffffffffffffffffffffffffffffff1663e03110e18c606001518d608001516040518363ffffffff1660e01b8152600401614e8f92919091825267ffffffffffffffff16602082015260400190565b6040805180830381865afa158015614eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ecf91906153aa565b60208d015160408e01519294509092509060078216600881900384811015614ef5578094505b5083821015614f02578193505b8460088502610100031c9450846008828660080303021b9450600180600883600803021b036001806008878560080303021b03915081198116905085811988161796505050614f56868e60e001518761312e565b929b50505096890196955060019450919250615004915050565b865167ffffffffffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01614fae5786604001519550615004565b865167ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c01614ff457600b955067ffffffffffffffff9450615004565b6009955067ffffffffffffffff94505b91939550919395565b3661078082018110156107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d49505336344d656d6f72793a20636865636b2074686174207468657265206960448201527f7320656e6f7567682063616c6c6461746100000000000000000000000000000060648201526084016103cc565b60008060006150b18786614cab565b5067ffffffffffffffff868316811691811691821b9216901b1987161792505050949350505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260e08101615120615125565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b8181101561517157858101830151858201604001528201615155565b81811115615183576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f8401126151c957600080fd5b50813567ffffffffffffffff8111156151e157600080fd5b602083019150836020828501011115612ef757600080fd5b60008060008060006060868803121561521157600080fd5b853567ffffffffffffffff8082111561522957600080fd5b61523589838a016151b7565b9097509550602088013591508082111561524e57600080fd5b5061525b888289016151b7565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156152af576152af61526d565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff8083168185168083038211156153315761533161526d565b01949350505050565b600067ffffffffffffffff8381169083168181101561535b5761535b61526d565b039392505050565b600067ffffffffffffffff8083168185168183048111821515161561538a5761538a61526d565b02949350505050565b6000828210156153a5576153a561526d565b500390565b600080604083850312156153bd57600080fd5b50508051602090910151909290915056fea164736f6c634300080f000a"; + bytes internal constant acc34Code = + hex"60806040526004361061015f5760003560e01c8063715018a6116100c0578063b107095711610074578063c4d66de811610059578063c4d66de81461049e578063dad544e0146104be578063f2fde38b146104d357600080fd5b8063b10709571461041d578063bb8aa1fc1461043d57600080fd5b806382ecf2f6116100a557806382ecf2f6146103bf5780638da5cb5b146103d257806396cd9720146103fd57600080fd5b8063715018a61461038a57806374cc86ac1461039f57600080fd5b80633e47158c1161011757806354fd4d50116100fc57806354fd4d50146102b25780635f0150cb146103085780636593dc6e1461035d57600080fd5b80633e47158c1461027e5780634d1975b41461029357600080fd5b80631e334240116101485780631e334240146101f3578063254bd6831461021357806338d38c971461024057600080fd5b806314f6b1a3146101645780631b685b9e14610186575b600080fd5b34801561017057600080fd5b5061018461017f3660046116b9565b6104f3565b005b34801561019257600080fd5b506101c96101a13660046116f0565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ff57600080fd5b5061018461020e36600461170b565b61057d565b34801561021f57600080fd5b5061023361022e366004611735565b6105c9565b6040516101ea91906117e2565b34801561024c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000011681526020016101ea565b34801561028a57600080fd5b506101c961080d565b34801561029f57600080fd5b506068545b6040519081526020016101ea565b3480156102be57600080fd5b506102fb6040518060400160405280600581526020017f312e352e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ea919061189f565b34801561031457600080fd5b506103286103233660046118fb565b610a18565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff9091166020830152016101ea565b34801561036957600080fd5b506102a46103783660046116f0565b60666020526000908152604090205481565b34801561039657600080fd5b50610184610a6b565b3480156103ab57600080fd5b506102fb6103ba3660046116f0565b610a7f565b6101c96103cd3660046118fb565b610b19565b3480156103de57600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166101c9565b34801561040957600080fd5b506102a46104183660046118fb565b610e24565b34801561042957600080fd5b50610184610438366004611955565b610e5d565b34801561044957600080fd5b5061045d6104583660046119a0565b610f5d565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff16908201526060016101ea565b3480156104aa57600080fd5b506101846104b93660046119b9565b610fc6565b3480156104ca57600080fd5b506101c961113e565b3480156104df57600080fd5b506101846104ee3660046119b9565b6111bb565b6104fb611272565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610585611272565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806105db575081155b610806575060408051600583901b8101602001909152825b8381116108045760006068828154811061060f5761060f6119d6565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036107d5576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106ef9190810190611a34565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107629190611aff565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a516107a49190611b47565b815181106107b4576107b46119d6565b6020026020010181905250888851106107d257505050505050610804565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506105f39050565b505b9392505050565b6000806108387fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561085b57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261089e9190611b5e565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906108f9906060015b604051602081830303815290604052805190602001205490565b14610930576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610952906060016108df565b905073ffffffffffffffffffffffffffffffffffffffff8116156109e6578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190611b9b565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000610a2987878787610e24565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610a73611272565b610a7d60006112f3565b565b60696020526000908152604090208054610a9890611bb8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac490611bb8565b8015610b115780601f10610ae657610100808354040283529160200191610b11565b820191906000526020600020905b815481529060010190602001808311610af457829003601f168201915b505050505081565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b89576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610bd7576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610be4600143611b47565b63ffffffff8816600090815260696020526040902080549140925090610c0990611bb8565b9050600003610c8057610c793387838888604051602001610c2e959493929190611c0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff84169061136a565b9250610cc1565b610cbe3387838a8989606960008f63ffffffff1663ffffffff168152602001908152602001600020604051602001610c2e9796959493929190611c58565b92505b8273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b50505050506000610d3088888888610e24565b60008181526067602052604090205490915015610d7c576040517f014f6fe500000000000000000000000000000000000000000000000000000000815260048101829052602401610b80565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610e3d9493929190611db6565b604051602081830303815290604052805190602001209050949350505050565b610e65611272565b63ffffffff8416600090815260656020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff881617905560699091529020610ecd828483611e35565b5060405163ffffffff85169073ffffffffffffffffffffffffffffffffffffffff8516907fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de90600090a38363ffffffff167fa47fcdf075d680d3817bfca7973b373e1a5f6cfc3b444748299cc2b83d8348f98383604051610f4f929190611f50565b60405180910390a250505050565b600080600080600080610fb660688881548110610f7c57610f7c6119d6565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9199909850909650945050505050565b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015611006575060005460ff8083169116105b611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b80565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556110cb611378565b6110d36113f9565b6110dc826112f3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b600061114861080d565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190611b9b565b905090565b6111c3611272565b73ffffffffffffffffffffffffffffffffffffffff8116611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b80565b61126f816112f3565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b80565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061080660008484611498565b3361138161080d565b73ffffffffffffffffffffffffffffffffffffffff16141580156113c25750336113a961113e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610a7d576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b80565b610a7d6115de565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf0975050866115645763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff16611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b80565b610a7d336112f3565b803563ffffffff8116811461169257600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461126f57600080fd5b600080604083850312156116cc57600080fd5b6116d58361167e565b915060208301356116e581611697565b809150509250929050565b60006020828403121561170257600080fd5b6108068261167e565b6000806040838503121561171e57600080fd5b6117278361167e565b946020939093013593505050565b60008060006060848603121561174a57600080fd5b6117538461167e565b95602085013595506040909401359392505050565b60005b8381101561178357818101518382015260200161176b565b83811115611792576000848401525b50505050565b600081518084526117b0816020860160208601611768565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611891578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061187d81860183611798565b968901969450505090860190600101611809565b509098975050505050505050565b6020815260006108066020830184611798565b60008083601f8401126118c457600080fd5b50813567ffffffffffffffff8111156118dc57600080fd5b6020830191508360208285010111156118f457600080fd5b9250929050565b6000806000806060858703121561191157600080fd5b61191a8561167e565b935060208501359250604085013567ffffffffffffffff81111561193d57600080fd5b611949878288016118b2565b95989497509550505050565b6000806000806060858703121561196b57600080fd5b6119748561167e565b9350602085013561198481611697565b9250604085013567ffffffffffffffff81111561193d57600080fd5b6000602082840312156119b257600080fd5b5035919050565b6000602082840312156119cb57600080fd5b813561080681611697565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a4657600080fd5b815167ffffffffffffffff80821115611a5e57600080fd5b818401915084601f830112611a7257600080fd5b815181811115611a8457611a84611a05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611aca57611aca611a05565b81604052828152876020848701011115611ae357600080fd5b611af4836020830160208801611768565b979650505050505050565b600060208284031215611b1157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611b5957611b59611b18565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b9657611b96611b18565b500290565b600060208284031215611bad57600080fd5b815161080681611697565b600181811c90821680611bcc57607f821691505b602082108103611c05577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1681528660148201528560348201527fffffffff000000000000000000000000000000000000000000000000000000008560e01b166054820152600060588486828501378483018181016000815260008654611cd881611bb8565b60018281168015611cf05760018114611d2557611d58565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841686528783151584028801019450611d58565b8a60005260208060002060005b85811015611d4d5781548a82018c0152908401908201611d32565b505050878388010194505b50929f9e505050505050505050505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b63ffffffff85168152836020820152606060408201526000611ddc606083018486611d6d565b9695505050505050565b601f821115611e3057600081815260208120601f850160051c81016020861015611e0d5750805b601f850160051c820191505b81811015611e2c57828155600101611e19565b5050505b505050565b67ffffffffffffffff831115611e4d57611e4d611a05565b611e6183611e5b8354611bb8565b83611de6565b6000601f841160018114611eb35760008515611e7d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611f49565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611f025786850135825560209485019460019092019101611ee2565b5086821015611f3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b602081526000611f64602083018486611d6d565b94935050505056fea164736f6c634300080f000a"; + bytes internal constant acc35Code = + hex"608060405234801561001057600080fd5b50600436106101cf5760003560e01c80635958a19311610104578063952b2797116100a2578063e0a840eb11610071578063e0a840eb146104d5578063ee658e45146104f5578063f2b4e61714610508578063fdbb3dcf1461052857600080fd5b8063952b27971461048f578063d5a3e12e146104bd578063d83ef267146104c5578063dad544e0146104cd57600080fd5b80636c4f4467116100de5780636c4f44671461042e5780637258a807146104415780637d6be8dc146104695780637fc485041461047c57600080fd5b80635958a193146103d55780635c975abb146103e8578063664ed830146103f057600080fd5b80633c9f397c1161017157806345884d321161014b57806345884d321461034357806347a222c514610366578063496b9c161461037957806354fd4d501461038c57600080fd5b80633c9f397c146102e15780633e47158c146103065780634086d1831461030e57600080fd5b806333d7e2bd116101ad57806333d7e2bd1461022457806334a346ea1461026f57806335e80ab3146102a857806338d38c97146102b057600080fd5b80630314d2b3146101d457806304e50fed146101fc57806317cf21a91461020f575b600080fd5b6101e76101e23660046117c8565b61053b565b60405190151581526020015b60405180910390f35b6101e761020a3660046117c8565b61061b565b61022261021d3660046117c8565b610692565b005b60005461024a9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b6101e761027d3660046117c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b61024a6107f7565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000011681526020016101f3565b6006546102f19063ffffffff1681565b60405163ffffffff90911681526020016101f3565b61024a61088e565b60065461032a90640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101f3565b6101e76103513660046117c8565b60056020526000908152604090205460ff1681565b61022261037436600461187c565b610a99565b6101e76103873660046117c8565b610d15565b6103c86040518060400160405280600581526020017f332e372e3100000000000000000000000000000000000000000000000000000081525081565b6040516101f391906119ad565b6101e76103e33660046117c8565b610d8d565b6101e7610e10565b6040805180820182526000808252602091820152815180830183526003548082526004549183019182528351908152905191810191909152016101f3565b6101e761043c3660046117c8565b610ea2565b61045461044f3660046119c0565b610f72565b604080519283526020830191909152016101f3565b6102226104773660046117c8565b610f86565b61022261048a3660046119c0565b611005565b6040517f0000000000000000000000000000000000000000000000000000000000049d4081526020016101f3565b610222611076565b6104546110f6565b61024a611255565b60025461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e76105033660046117c8565b6112a9565b60015461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e76105363660046117c8565b6114b6565b6000610546826114b6565b61055257506000919050565b7f0000000000000000000000000000000000000000000000000000000000049d406105f28373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e591906119fa565b67ffffffffffffffff1690565b6106069067ffffffffffffffff1642611a44565b1161061357506000919050565b506001919050565b60008173ffffffffffffffffffffffffffffffffffffffff1663250e69bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068c9190611a5b565b92915050565b8061069c81610ea2565b6106d2576040517f47ad367a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106dc6110f6565b915050808273ffffffffffffffffffffffffffffffffffffffff166399735e326040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190611a7d565b11610786576040517f47ad367a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f474f180d74ea8751955ee261c93ff8270411b180408d1014c49f552c92a4d11e90600090a2505050565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108899190611a96565b905090565b6000806108b97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156108dc57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261091f9190611ab3565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061097a906060015b604051602081830303815290604052805190602001205490565b146109b1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906109d390606001610960565b905073ffffffffffffffffffffffffffffffffffffffff811615610a67578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190611a96565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001600054610100900460ff16158015610ad9575060005460ff8083169116105b610b69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610ba261162b565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff88811691909102919091178255600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691871691909117905583516003556020840151600455600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff85161790819055640100000000900467ffffffffffffffff169003610cb057600680547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff166401000000004267ffffffffffffffff16021790555b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000610d20826112a9565b610d2c57506000919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090205460ff1615610d6257506000919050565b610d6b82610d8d565b15610d7857506000919050565b610d80610e10565b1561061357506000919050565b6000600660049054906101000a900467ffffffffffffffff1667ffffffffffffffff16610dfe8373ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c1573d6000803e3d6000fd5b67ffffffffffffffff16111592915050565b60008060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108899190611a5b565b6000610ead82610d15565b610eb957506000919050565b610ec28261061b565b610ece57506000919050565b610ed78261053b565b610ee357506000919050565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f549190611b1f565b6002811115610f6557610f65611af0565b1461061357506000919050565b600080610f7d6110f6565b91509150915091565b610f8e6116ae565b73ffffffffffffffffffffffffffffffffffffffff811660008181526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f192c289026d59a41a27f5aea08f3969b57931b0589202d14f4368cded95d3cda9190a250565b61100d6116ae565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83169081179091556040519081527fcee0703b5e4bad4efededab85c9fd1aec17dee7c5f6c584330e0509b677745a29060200160405180910390a150565b61107e6116ae565b600680547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff166401000000004267ffffffffffffffff811691909102919091179091556040519081527f6e5b1ba771e8e484f741ed085f039ff4e5c6e882eaf68f550fb390922d0ae4a79060200160405180910390a1565b600254600090819073ffffffffffffffffffffffffffffffffffffffff166111245750506003546004549091565b600254604080517fbcef3b5500000000000000000000000000000000000000000000000000000000815290516111bc9273ffffffffffffffffffffffffffffffffffffffff169163bcef3b559160048083019260209291908290030181865afa158015611195573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b99190611a7d565b90565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399735e326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611229573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124d9190611a7d565b915091509091565b600061125f61088e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610865573d6000803e3d6000fd5b6000806000808473ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156112fa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113409190810190611b40565b6001546040517f5f0150cb000000000000000000000000000000000000000000000000000000008152939650919450925060009173ffffffffffffffffffffffffffffffffffffffff90911690635f0150cb906113a590879087908790600401611c11565b6040805180830381865afa1580156113c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e59190611c3f565b50905060008673ffffffffffffffffffffffffffffffffffffffff16635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190611a96565b90508673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480156114ab575073ffffffffffffffffffffffffffffffffffffffff811630145b979650505050505050565b60006115068273ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c1573d6000803e3d6000fd5b67ffffffffffffffff161580159061068c575060028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190611b1f565b600281111561159b5761159b611af0565b148061068c575060018273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116139190611b1f565b600281111561162457611624611af0565b1492915050565b3361163461088e565b73ffffffffffffffffffffffffffffffffffffffff161415801561167557503361165c611255565b73ffffffffffffffffffffffffffffffffffffffff1614155b156116ac576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190611a96565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f2e5321ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811681146117c557600080fd5b50565b6000602082840312156117da57600080fd5b81356117e5816117a3565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611862576118626117ec565b604052919050565b63ffffffff811681146117c557600080fd5b60008060008084860360a081121561189357600080fd5b853561189e816117a3565b945060208601356118ae816117a3565b935060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820112156118e057600080fd5b506040516040810181811067ffffffffffffffff82111715611904576119046117ec565b6040908152860135815260608601356020820152915060808501356119288161186a565b939692955090935050565b60005b8381101561194e578181015183820152602001611936565b8381111561195d576000848401525b50505050565b6000815180845261197b816020860160208601611933565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117e56020830184611963565b6000602082840312156119d257600080fd5b81356117e58161186a565b805167ffffffffffffffff811681146119f557600080fd5b919050565b600060208284031215611a0c57600080fd5b6117e5826119dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611a5657611a56611a15565b500390565b600060208284031215611a6d57600080fd5b815180151581146117e557600080fd5b600060208284031215611a8f57600080fd5b5051919050565b600060208284031215611aa857600080fd5b81516117e5816117a3565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611aeb57611aeb611a15565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215611b3157600080fd5b8151600381106117e557600080fd5b600080600060608486031215611b5557600080fd5b8351611b608161186a565b60208501516040860151919450925067ffffffffffffffff80821115611b8557600080fd5b818601915086601f830112611b9957600080fd5b815181811115611bab57611bab6117ec565b611bdc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161181b565b9150808252876020828501011115611bf357600080fd5b611c04816020840160208601611933565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000611c366060830184611963565b95945050505050565b60008060408385031215611c5257600080fd5b8251611c5d816117a3565b9150611c6b602084016119dd565b9050925092905056fea164736f6c634300080f000a"; + bytes internal constant acc36Code = + hex"60806040526004361061034a5760003560e01c80636f034409116101bb578063c0d8bb74116100f7578063dabd396d11610095578063f8f43ff61161006f578063f8f43ff614610aee578063fa24f74314610b0e578063fa315aa914610b32578063fe2bbeb214610b6557600080fd5b8063dabd396d14610a58578063ec5e630814610a8b578063eff0f59214610abe57600080fd5b8063cf09e0d0116100d1578063cf09e0d0146109d5578063d5d44d80146109f6578063d6ae3cd514610a16578063d8cc1a3c14610a3857600080fd5b8063c0d8bb7414610914578063c395e1ca14610941578063c6f0308c1461096157600080fd5b80638b85902b11610164578063a445ece61161013e578063a445ece614610805578063bbdc02db146108a5578063bcef3b55146108d2578063bd8da956146108f457600080fd5b80638b85902b146107c15780638d450a95146107e357806399735e32146107c157600080fd5b80637b0f0adc116101955780637b0f0adc146107915780638129fc1c146107a45780638980e0cc146107ac57600080fd5b80636f0344091461075457806370872aa514610767578063786b844b1461077c57600080fd5b80633e3ac9121161028a5780635a5fa2d911610233578063609d33341161020d578063609d3334146106ca57806360e27464146106df5780636361506d146106ff5780636b6716c01461072157600080fd5b80635a5fa2d9146106655780635c0cba33146106855780635e234947146106aa57600080fd5b8063529d6a8c11610264578063529d6a8c146105b957806354fd4d50146105e657806357da950e1461063557600080fd5b80633e3ac912146105515780633fc8cef314610581578063472777c6146105a657600080fd5b806325fc2ace116102f757806330dbe570116102d157806330dbe570146104b8578063378dd48c146104f057806337b1b2291461050a5780633a7684631461052c57600080fd5b806325fc2ace146104645780632810e1d6146104835780632ad69aeb1461049857600080fd5b8063200d2ed211610328578063200d2ed2146103dc578063222abf451461040a578063250e69bd1461044a57600080fd5b8063019351301461034f57806303c2924d1461037157806319effeb414610391575b600080fd5b34801561035b57600080fd5b5061036f61036a36600461557a565b610b95565b005b34801561037d57600080fd5b5061036f61038c3660046155d5565b610e54565b34801561039d57600080fd5b506000546103be9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103e857600080fd5b506000546103fd90600160801b900460ff1681565b6040516103d3919061562e565b34801561041657600080fd5b5061043a610425366004615656565b600c6020526000908152604090205460ff1681565b60405190151581526020016103d3565b34801561045657600080fd5b50600a5461043a9060ff1681565b34801561047057600080fd5b506008545b6040519081526020016103d3565b34801561048f57600080fd5b506103fd6113dc565b3480156104a457600080fd5b506104756104b33660046155d5565b6115b4565b3480156104c457600080fd5b506001546104d8906001600160a01b031681565b6040516001600160a01b0390911681526020016103d3565b3480156104fc57600080fd5b50600d546103fd9060ff1681565b34801561051657600080fd5b503660011981013560f01c90033560601c6104d8565b34801561053857600080fd5b503660011981013560f01c90036098013560601c6104d8565b34801561055d57600080fd5b5060005461043a907201000000000000000000000000000000000000900460ff1681565b34801561058d57600080fd5b503660011981013560f01c900360c0013560601c6104d8565b61036f6105b4366004615673565b6115ea565b3480156105c557600080fd5b506104756105d4366004615656565b60036020526000908152604090205481565b3480156105f257600080fd5b5060408051808201909152600581527f322e342e3100000000000000000000000000000000000000000000000000000060208201525b6040516103d3919061570a565b34801561064157600080fd5b50600854600954610650919082565b604080519283526020830191909152016103d3565b34801561067157600080fd5b5061047561068036600461571d565b6115fc565b34801561069157600080fd5b503660011981013560f01c900360ac013560601c6104d8565b3480156106b657600080fd5b506104756106c536600461571d565b611636565b3480156106d657600080fd5b50610628611697565b3480156106eb57600080fd5b5061036f6106fa366004615656565b6116a5565b34801561070b57600080fd5b503660011981013560f01c900360340135610475565b34801561072d57600080fd5b507f0000000000000000000000000000000000000000000000000000000000002a306103be565b61036f610762366004615744565b6119b6565b34801561077357600080fd5b50600954610475565b34801561078857600080fd5b5061036f612339565b61036f61079f366004615673565b612727565b61036f612734565b3480156107b857600080fd5b50600254610475565b3480156107cd57600080fd5b503660011981013560f01c900360580135610475565b3480156107ef57600080fd5b503660011981013560f01c900360780135610475565b34801561081157600080fd5b5061086761082036600461571d565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046001600160801b0316906001600160a01b031684565b60408051941515855263ffffffff90931660208501526001600160801b03909116918301919091526001600160a01b031660608201526080016103d3565b3480156108b157600080fd5b506040513660011981013560f01c90036054013560e01c81526020016103d3565b3480156108de57600080fd5b503660011981013560f01c900360140135610475565b34801561090057600080fd5b506103be61090f36600461571d565b613006565b34801561092057600080fd5b5061047561092f366004615656565b600b6020526000908152604090205481565b34801561094d57600080fd5b5061047561095c366004615785565b6131a0565b34801561096d57600080fd5b5061098161097c36600461571d565b613361565b6040805163ffffffff90981688526001600160a01b03968716602089015295909416948601949094526001600160801b039182166060860152608085015291821660a08401521660c082015260e0016103d3565b3480156109e157600080fd5b506000546103be9067ffffffffffffffff1681565b348015610a0257600080fd5b50610475610a11366004615656565b6133d5565b348015610a2257600080fd5b503660011981013560f01c900360d40135610475565b348015610a4457600080fd5b5061036f610a533660046157ae565b61342d565b348015610a6457600080fd5b507f0000000000000000000000000000000000000000000000000000000000049d406103be565b348015610a9757600080fd5b507f000000000000000000000000000000000000000000000000000000000000001e610475565b348015610aca57600080fd5b5061043a610ad936600461571d565b60046020526000908152604090205460ff1681565b348015610afa57600080fd5b5061036f610b09366004615673565b613961565b348015610b1a57600080fd5b50610b23613d28565b6040516103d39392919061583a565b348015610b3e57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000049610475565b348015610b7157600080fd5b5061043a610b8036600461571d565b60066020526000908152604090205460ff1681565b60008054600160801b900460ff166002811115610bb457610bb46155f7565b14610bd25760405163067fe19560e41b815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c25576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3e3660011981013560f01c90036014013590565b90565b610c55610c5036869003860186615875565b613d52565b14610c8c576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610ca19291906158e9565b604051809103902014610ce0576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d29610d2484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613dae92505050565b613e1b565b90506000610d5082600881518110610d4357610d436158f9565b6020026020010151613fd1565b9050602081511115610d8e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c3660011981013560f01c9003605801358103610de5576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054600160801b900460ff166002811115610e7357610e736155f7565b14610e915760405163067fe19560e41b815260040160405180910390fd5b600060028381548110610ea657610ea66158f9565b906000526020600020906005020190506000610ec184613006565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d4081169082161015610f2a576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615610f73576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560205260409020805480158015610f9057508515155b15610ff357835464010000000090046001600160a01b031660008115610fb65781610fc5565b60018601546001600160a01b03165b9050610fd18187614085565b505050600094855250506006602052505060409020805460ff19166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046001600160801b031693810193909352600101546001600160a01b03166060830152611077576001600160801b036040820152600181526000869003611077578195505b600086826020015163ffffffff1661108f9190615925565b905060008382116110a057816110a2565b835b602084015190915063ffffffff165b818110156111c25760008682815481106110cd576110cd6158f9565b6000918252602080832090910154808352600690915260409091205490915060ff16611125576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061113a5761113a6158f9565b60009182526020909120600590910201805490915064010000000090046001600160a01b03161580156111815750600481015460408701516001600160801b039182169116115b156111ad5760018101546001600160a01b0316606087015260048101546001600160801b031660408701525b505080806111ba9061593d565b9150506110b1565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006001600160801b03909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909316929092179091558490036113d157606083015160008a8152600660205260409020805460ff191660011790558915801561130e57506000547201000000000000000000000000000000000000900460ff165b15611369576001546001600160a01b0316611329818a614085565b88546001600160a01b03909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556113cf565b6113966001600160a01b038216156113815781611390565b60018901546001600160a01b03165b89614085565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038316021788555b505b505050505050505050565b600080600054600160801b900460ff1660028111156113fd576113fd6155f7565b1461141b5760405163067fe19560e41b815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661147f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b0316600260008154811061149e5761149e6158f9565b600091825260209091206005909102015464010000000090046001600160a01b0316146114cc5760016114cf565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617600160801b836002811115611573576115736155f7565b021790556002811115611588576115886155f7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b600560205281600052604060002081815481106115d057600080fd5b90600052602060002001600091509150505481565b905090565b6115f783838360016119b6565b505050565b6000818152600760209081526040808320600590925282208054825461162d90610100900463ffffffff1682615957565b95945050505050565b60003660011981013560f01c900360d401358214611680576040517f0da789df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003601401355b92915050565b60606115e5605860206140c7565b6116ad612339565b60006002600d5460ff1660028111156116c8576116c86155f7565b036116ec57506001600160a01b0381166000908152600b602052604090205461175b565b6001600d5460ff166002811115611705576117056155f7565b0361172957506001600160a01b03811660009081526003602052604090205461175b565b6040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600c602052604090205460ff16611839576001600160a01b0382166000908152600c60205260409020805460ff191660011790556117b860c0600119369081013560f01c9003013560601c90565b6040517f7eee288d0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529190911690637eee288d90604401600060405180830381600087803b15801561181d57600080fd5b505af1158015611831573d6000803e3d6000fd5b505050505050565b80600003611873576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600b6020908152604080832083905560039091528120553660011981013560f01c900360c0013560601c6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063f3fef3a390604401600060405180830381600087803b15801561191157600080fd5b505af1158015611925573d6000803e3d6000fd5b505050506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611976576040519150601f19603f3d011682016040523d82523d6000602084013e61197b565b606091505b50509050806115f7576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054600160801b900460ff1660028111156119d5576119d56155f7565b146119f35760405163067fe19560e41b815260040160405180910390fd5b600060028481548110611a0857611a086158f9565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff811684526001600160a01b0364010000000090910481169484019490945260018101549093169082015260028201546001600160801b03908116606083015260038301546080830181905260049093015480821660a0840152600160801b90041660c082015291508514611acc576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156001600160801b0383161760011b90506000611b61826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611b9c5750611b997f000000000000000000000000000000000000000000000000000000000000001e6002615925565b81145b8015611ba6575084155b15611bdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611c03575086155b15611c3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000049811115611c94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cbf7f000000000000000000000000000000000000000000000000000000000000001e6001615925565b8103611cd157611cd1868885886140fb565b34611cdb836131a0565b14611d12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d1d88613006565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d40811690821603611d85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611db260017f0000000000000000000000000000000000000000000000000000000000000049615957565b8303611ec8573660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c919061596e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8d919061598b565b611ec1907f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166159a4565b9050611f5b565b611ef360017f000000000000000000000000000000000000000000000000000000000000001e615957565b8303611f2e57611ec17f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff1660026159d0565b507f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff165b611f8f817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615a00565b67ffffffffffffffff16611faa8367ffffffffffffffff1690565b67ffffffffffffffff161115611ff157611fee817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615a00565b91505b6000604083901b421760008a8152608087901b6001600160801b038d1617602052604081209192509060008181526004602052604090205490915060ff1615612066576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff16815260200160006001600160a01b03168152602001336001600160a01b03168152602001346001600160801b031681526020018c8152602001886001600160801b03168152602001846001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160006101000a8154816001600160801b0302191690836001600160801b031602179055506080820151816003015560a08201518160040160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160040160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600560008c8152602001908152602001600020600160028054905061225d9190615957565b81546001810183556000928352602080842090910191909155338252600b9052604081208054349290612291908490615925565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e357600080fd5b505af11580156122f7573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b6002600d5460ff166002811115612352576123526155f7565b148061237457506001600d5460ff166002811115612372576123726155f7565b145b1561237b57565b6000600d5460ff166002811115612394576123946155f7565b146123cb576040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243f9190615a29565b15612476576040517f379a7ed900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005468010000000000000000900467ffffffffffffffff1667ffffffffffffffff166000036124d2576040517fc105260a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003660011981013560f01c900360ac013560601c6040517f0314d2b30000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039190911690630314d2b390602401602060405180830381865afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190615a29565b9050806125a3576040517f4851bd9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6040517f17cf21a90000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0391909116906317cf21a990602401600060405180830381600087803b15801561261257600080fd5b505af1925050508015612623575060015b5060003660011981013560f01c900360ac013560601c6040517f496b9c160000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063496b9c1690602401602060405180830381865afa158015612698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bc9190615a29565b905080156126d657600d805460ff191660011790556126e4565b600d805460ff191660021790555b600d546040517f9908eaac0645df9d0704d06adc9e07337c951de2f06b5f2836151d48d5e4722f9161271b9160ff9091169061562e565b60405180910390a15050565b6115f783838360006119b6565b60005471010000000000000000000000000000000000900460ff1615612786576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61278e61428a565b36146127c6576040517f9824bdab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000803660011981013560f01c900360ac013560601c6001600160a01b031663d83ef2676040518163ffffffff1660e01b81526004016040805180830381865afa158015612818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283c9190615a46565b909250905081612878576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915282815260200181905260088290556009819055803660011981013560f01c900360580135116128fa573660011981013560f01c9003601401355b6040517ff40239db0000000000000000000000000000000000000000000000000000000081526004016128f191815260200190565b60405180910390fd5b67ffffffffffffffff3660011981013560f01c900360580135111561292e573660011981013560f01c9003601401356128bc565b67ffffffffffffffff3660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ab919061596e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0c919061598b565b1115612a44576040517fb4e1243300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a7b7f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166002615a6a565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af3919061596e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b54919061598b565b67ffffffffffffffff16612b8f7f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff1690565b67ffffffffffffffff16612ba39190615925565b90506000612bb18383614298565b905067ffffffffffffffff811115612bf5576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff161115612c6d576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e08101825263ffffffff808252600060208084018281523660011981013560f01c90038035606090811c8789018181526001600160801b0334818116948b0194855260149095013560808b01908152600160a08c0181815242841660c08e019081526002805493840181558c529c517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590930292830180549a5191909d167fffffffffffffffff000000000000000000000000000000000000000000000000909a16999099176401000000006001600160a01b039a8b160217909b5592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf840180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919098161790965592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0820180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001691851691909117905593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015595519651968116600160801b9790911696909602959095177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909101558154710100000000000000000000000000000000007fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff909116178255918152600b909152918220805491929091612eae908490615925565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612f0057600080fd5b505af1158015612f14573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff1617905550612f579150612ff09050565b63ffffffff163660011981013560f01c900360ac013560601c6001600160a01b0316633c9f397c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd19190615a89565b600a805460ff191663ffffffff92909216929092141790555050505050565b3660011981013560f01c90036054013560e01c90565b600080600054600160801b900460ff166002811115613027576130276155f7565b146130455760405163067fe19560e41b815260040160405180910390fd5b60006002838154811061305a5761305a6158f9565b600091825260208220600590910201805490925063ffffffff908116146130c057815460028054909163ffffffff16908110613098576130986158f9565b906000526020600020906005020160040160109054906101000a90046001600160801b031690505b60048201546000906130eb90600160801b900467ffffffffffffffff165b67ffffffffffffffff1690565b6130ff9067ffffffffffffffff1642615957565b6131156130de846001600160801b031660401c90565b67ffffffffffffffff166131299190615925565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff1611613176578061162d565b7f0000000000000000000000000000000000000000000000000000000000049d4095945050505050565b60008061321d836001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f000000000000000000000000000000000000000000000000000000000000004981111561327c576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a30060006132978383615ac5565b9050670de0b6b3a764000060006132ce827f0000000000000000000000000000000000000000000000000000000000000049615a6a565b905060006132ec6132e7670de0b6b3a764000086615a6a565b6142b1565b905060006132fa8484614503565b905060006133088383614552565b9050600061331582614580565b905060006133348261332f670de0b6b3a76400008f615a6a565b614768565b905060006133428b83614552565b905061334e818d615a6a565b9f9e505050505050505050505050505050565b6002818154811061337157600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff841695506401000000009093046001600160a01b03908116949216926001600160801b03918216929180821691600160801b90041687565b60006002600d5460ff1660028111156133f0576133f06155f7565b0361341157506001600160a01b03166000908152600b602052604090205490565b506001600160a01b031660009081526003602052604090205490565b60008054600160801b900460ff16600281111561344c5761344c6155f7565b1461346a5760405163067fe19560e41b815260040160405180910390fd5b60006002878154811061347f5761347f6158f9565b6000918252602082206005919091020160048101549092506001600160801b0316908715821760011b90506134d57f00000000000000000000000000000000000000000000000000000000000000496001615925565b61354f826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613589576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915613654576135dc7f000000000000000000000000000000000000000000000000000000000000001e7f0000000000000000000000000000000000000000000000000000000000000049615957565b6001901b6135f2846001600160801b0316614799565b6001600160801b03166136059190615ad9565b156136395761363061362160016001600160801b038716615aed565b865463ffffffff16600061481f565b6003015461364a565b3660011981013560f01c9003607801355b9150849050613675565b600385015491506136726136216001600160801b0386166001615b0d565b90505b600882901b60088a8a60405161368c9291906158e9565b6040518091039020901b146136cd576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006136d88c6148e8565b905060006136e7836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081523660011981013560f01c90036098013560601c9063e14ced329061373d908f908f908f908f908a90600401615b78565b6020604051808303816000875af115801561375c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613780919061598b565b600485015491149150600090600290613809906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613883896001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61388d9190615bb2565b6138979190615bd5565b60ff1615905081151581036138d8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875464010000000090046001600160a01b031615613922576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054600160801b900460ff166002811115613980576139806155f7565b1461399e5760405163067fe19560e41b815260040160405180910390fd5b6000806000806139ad86614917565b935093509350935060006139c385858585614c70565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3b919061596e565b905060018903613b08576001600160a01b0381166352f0f3ad8a84613a6c3660011981013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015613ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b02919061598b565b506113d1565b60028903613b27576001600160a01b0381166352f0f3ad8a8489613a6c565b60038903613b46576001600160a01b0381166352f0f3ad8a8487613a6c565b60048903613c7b576000613b836001600160801b0385167f000000000000000000000000000000000000000000000000000000000000001e614d0f565b600954613b909190615925565b613b9b906001615925565b90503660011981013560f01c9003605801358110613bc8573660011981013560f01c900360580135613bca565b805b90506001600160a01b0382166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015613c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c74919061598b565b50506113d1565b60058903613cf6576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390523660011981013560f01c900360d4013560c01b604482015260086064820152608481018890526001600160a01b038216906352f0f3ad9060a401613abf565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003605481013560e01c90601401356060613d4b611697565b9050909192565b60008160000151826020015183604001518460600151604051602001613d91949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003613dfd576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000613e2b85614da4565b919450925090506001816001811115613e4657613e466155f7565b14613e7d576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451613e898385615925565b14613ec0576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613ed75790505093506000835b8651811015613fc557600080613f4a6040518060400160405280858c60000151613f2e9190615957565b8152602001858c60200151613f439190615925565b9052614da4565b509150915060405180604001604052808383613f669190615925565b8152602001848b60200151613f7b9190615925565b815250888581518110613f9057613f906158f9565b6020908102919091010152613fa6600185615925565b9350613fb28183615925565b613fbc9084615925565b92505050613f04565b50845250919392505050565b60606000806000613fe185614da4565b919450925090506000816001811115613ffc57613ffc6155f7565b14614033576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61403d8284615925565b855114614076576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162d85602001518484615242565b60028101546001600160a01b038316600090815260036020526040812080546001600160801b03909316929091906140be908490615925565b90915550505050565b6040518181523660011981013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60006141116001600160801b0384166001615b0d565b905060006141218286600161481f565b9050600086901a83806141eb575061415a60027f000000000000000000000000000000000000000000000000000000000000001e615ad9565b60048301546002906141dc906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6141e69190615bd5565b60ff16145b156142435760ff811660011480614205575060ff81166002145b61423e576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128f1565b614281565b60ff811615614281576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128f1565b50505050505050565b60006115e560f46006615925565b6000818310156142a857816142aa565b825b9392505050565b6001600160801b03811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b176000821361430757631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261454057637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156145705763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136145ae57919050565b680755bf798b4a1bf1e582126145cc5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006142aa670de0b6b3a764000083614780866142b1565b61478a9190615bf7565b6147949190615cb3565b614580565b60008061480d837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261485f5761485a6001600160801b0386167f000000000000000000000000000000000000000000000000000000000000001e6152d6565b614871565b614871856001600160801b0316615415565b905060028481548110614886576148866158f9565b906000526020600020906005020191505b60048201546001600160801b038281169116146148e057815460028054909163ffffffff169081106148cb576148cb6158f9565b90600052602060002090600502019150614897565b509392505050565b60008060008060006148f986614917565b935093509350935061490d84848484614c70565b9695505050505050565b6000806000806000859050600060028281548110614937576149376158f9565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000001e906149ec906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614a26576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000001e90614acb906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169250821115614b4057825463ffffffff16614b0a7f000000000000000000000000000000000000000000000000000000000000001e6001615925565b8303614b14578391505b60028181548110614b2757614b276158f9565b9060005260206000209060050201935080945050614a2a565b600481810154908401546001600160801b0391821691166000816001600160801b0316614b85614b79856001600160801b031660011c90565b6001600160801b031690565b6001600160801b03161490508015614c1e576000614bab836001600160801b0316614799565b6001600160801b03161115614bfb576000614bdb614bd360016001600160801b038616615aed565b89600161481f565b6003810154600490910154909c506001600160801b03169a50614c019050565b6008549a505b600386015460048701549099506001600160801b03169750614c62565b6000614c37614bd36001600160801b0385166001615b0d565b6003808901546004808b015492840154930154909e506001600160801b039182169d50919b50169850505b505050505050509193509193565b60006001600160801b03841615614ccb5760408051602081018790526001600160801b038087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012061162d565b8282604051602001614cf09291909182526001600160801b0316602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614d83847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614de7576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614e0c57600060016000945094509450505061523b565b60b78111614f22576000614e21608083615957565b905080876000015111614e60576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614ed857507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614f0f576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061523b915050565b60bf8111615080576000614f3760b783615957565b905080876000015111614f76576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614fd8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111615020576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61502a8184615925565b895111615063576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61506e836001615925565b975095506000945061523b9350505050565b60f781116150e557600061509560c083615957565b9050808760000151116150d4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061523b915050565b60006150f260f783615957565b905080876000015111615131576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003615193576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116151db576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6151e58184615925565b89511161521e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615229836001615925565b975095506001945061523b9350505050565b9193909250565b60608167ffffffffffffffff81111561525d5761525d61585f565b6040519080825280601f01601f191660200182016040528015615287576020820181803683370190505b50905081156142aa57600061529c8486615925565b90506020820160005b848110156152bd5782810151828201526020016152a5565b848111156152cc576000858301525b5050509392505050565b600081615353846001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116153695763b34b5c226000526004601cfd5b61537283615415565b9050816153ef826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611611691576142aa615405836001615925565b6001600160801b038316906154a1565b60008119600183011681615490827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615515847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261554357600080fd5b50813567ffffffffffffffff81111561555b57600080fd5b60208301915083602082850101111561557357600080fd5b9250929050565b600080600083850360a081121561559057600080fd5b608081121561559e57600080fd5b50839250608084013567ffffffffffffffff8111156155bc57600080fd5b6155c886828701615531565b9497909650939450505050565b600080604083850312156155e857600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061562b57634e487b7160e01b600052602160045260246000fd5b50565b6020810161563b8361560d565b91905290565b6001600160a01b038116811461562b57600080fd5b60006020828403121561566857600080fd5b81356142aa81615641565b60008060006060848603121561568857600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156c5576020818501810151868301820152016156a9565b818111156156d7576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006142aa602083018461569f565b60006020828403121561572f57600080fd5b5035919050565b801515811461562b57600080fd5b6000806000806080858703121561575a57600080fd5b843593506020850135925060408501359150606085013561577a81615736565b939692955090935050565b60006020828403121561579757600080fd5b81356001600160801b03811681146142aa57600080fd5b600080600080600080608087890312156157c757600080fd5b8635955060208701356157d981615736565b9450604087013567ffffffffffffffff808211156157f657600080fd5b6158028a838b01615531565b9096509450606089013591508082111561581b57600080fd5b5061582889828a01615531565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061162d606083018461569f565b634e487b7160e01b600052604160045260246000fd5b60006080828403121561588757600080fd5b6040516080810181811067ffffffffffffffff821117156158b857634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156159385761593861590f565b500190565b600060001982036159505761595061590f565b5060010190565b6000828210156159695761596961590f565b500390565b60006020828403121561598057600080fd5b81516142aa81615641565b60006020828403121561599d57600080fd5b5051919050565b600067ffffffffffffffff8083168185168083038211156159c7576159c761590f565b01949350505050565b600067ffffffffffffffff808316818516818304811182151516156159f7576159f761590f565b02949350505050565b600067ffffffffffffffff83811690831681811015615a2157615a2161590f565b039392505050565b600060208284031215615a3b57600080fd5b81516142aa81615736565b60008060408385031215615a5957600080fd5b505080516020909101519092909150565b6000816000190483118215151615615a8457615a8461590f565b500290565b600060208284031215615a9b57600080fd5b815163ffffffff811681146142aa57600080fd5b634e487b7160e01b600052601260045260246000fd5b600082615ad457615ad4615aaf565b500490565b600082615ae857615ae8615aaf565b500690565b60006001600160801b0383811690831681811015615a2157615a2161590f565b60006001600160801b038083168185168083038211156159c7576159c761590f565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615b8c606083018789615b2f565b8281036020840152615b9f818688615b2f565b9150508260408301529695505050505050565b600060ff821660ff841680821015615bcc57615bcc61590f565b90039392505050565b600060ff831680615be857615be8615aaf565b8060ff84160691505092915050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615c3857615c3861590f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c7357615c7361590f565b60008712925087820587128484161615615c8f57615c8f61590f565b87850587128184161615615ca557615ca561590f565b505050929093029392505050565b600082615cc257615cc2615aaf565b60001983147f800000000000000000000000000000000000000000000000000000000000000083141615615cf857615cf861590f565b50059056fea164736f6c634300080f000a"; + bytes internal constant permissionedDisputeGameCode = + hex"6080604052600436106103605760003560e01c80636f034409116101c6578063c0d8bb74116100f7578063dabd396d11610095578063f8f43ff61161006f578063f8f43ff614610b3e578063fa24f74314610b5e578063fa315aa914610b82578063fe2bbeb214610bb557600080fd5b8063dabd396d14610aa8578063ec5e630814610adb578063eff0f59214610b0e57600080fd5b8063cf09e0d0116100d1578063cf09e0d014610a25578063d5d44d8014610a46578063d6ae3cd514610a66578063d8cc1a3c14610a8857600080fd5b8063c0d8bb7414610964578063c395e1ca14610991578063c6f0308c146109b157600080fd5b80638d450a9511610164578063a8e4fb901161013e578063a8e4fb90146108d0578063bbdc02db146108f5578063bcef3b5514610922578063bd8da9561461094457600080fd5b80638d450a951461080e57806399735e32146107ec578063a445ece61461083057600080fd5b80637b0f0adc116101a05780637b0f0adc146107bc5780638129fc1c146107cf5780638980e0cc146107d75780638b85902b146107ec57600080fd5b80636f0344091461077f57806370872aa514610792578063786b844b146107a757600080fd5b80633e3ac912116102a05780635a5fa2d91161023e578063609d333411610218578063609d3334146106f557806360e274641461070a5780636361506d1461072a5780636b6716c01461074c57600080fd5b80635a5fa2d9146106905780635c0cba33146106b05780635e234947146106d557600080fd5b8063529d6a8c1161027a578063529d6a8c146105cf578063534db0e2146105fc57806354fd4d501461061157806357da950e1461066057600080fd5b80633e3ac912146105675780633fc8cef314610597578063472777c6146105bc57600080fd5b806325fc2ace1161030d57806330dbe570116102e757806330dbe570146104ce578063378dd48c1461050657806337b1b229146105205780633a7684631461054257600080fd5b806325fc2ace1461047a5780632810e1d6146104995780632ad69aeb146104ae57600080fd5b8063200d2ed21161033e578063200d2ed2146103f2578063222abf4514610420578063250e69bd1461046057600080fd5b8063019351301461036557806303c2924d1461038757806319effeb4146103a7575b600080fd5b34801561037157600080fd5b5061038561038036600461575a565b610be5565b005b34801561039357600080fd5b506103856103a23660046157b5565b610ea4565b3480156103b357600080fd5b506000546103d49068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103fe57600080fd5b5060005461041390600160801b900460ff1681565b6040516103e9919061580e565b34801561042c57600080fd5b5061045061043b366004615836565b600c6020526000908152604090205460ff1681565b60405190151581526020016103e9565b34801561046c57600080fd5b50600a546104509060ff1681565b34801561048657600080fd5b506008545b6040519081526020016103e9565b3480156104a557600080fd5b5061041361142c565b3480156104ba57600080fd5b5061048b6104c93660046157b5565b611604565b3480156104da57600080fd5b506001546104ee906001600160a01b031681565b6040516001600160a01b0390911681526020016103e9565b34801561051257600080fd5b50600d546104139060ff1681565b34801561052c57600080fd5b503660011981013560f01c90033560601c6104ee565b34801561054e57600080fd5b503660011981013560f01c90036098013560601c6104ee565b34801561057357600080fd5b50600054610450907201000000000000000000000000000000000000900460ff1681565b3480156105a357600080fd5b503660011981013560f01c900360c0013560601c6104ee565b6103856105ca366004615853565b61163a565b3480156105db57600080fd5b5061048b6105ea366004615836565b60036020526000908152604090205481565b34801561060857600080fd5b506104ee61164c565b34801561061d57600080fd5b5060408051808201909152600581527f322e342e3000000000000000000000000000000000000000000000000000000060208201525b6040516103e991906158ea565b34801561066c57600080fd5b5060085460095461067b919082565b604080519283526020830191909152016103e9565b34801561069c57600080fd5b5061048b6106ab3660046158fd565b611671565b3480156106bc57600080fd5b503660011981013560f01c900360ac013560601c6104ee565b3480156106e157600080fd5b5061048b6106f03660046158fd565b6116ab565b34801561070157600080fd5b5061065361170c565b34801561071657600080fd5b50610385610725366004615836565b61171a565b34801561073657600080fd5b503660011981013560f01c90036034013561048b565b34801561075857600080fd5b507f0000000000000000000000000000000000000000000000000000000000002a306103d4565b61038561078d366004615924565b611a2b565b34801561079e57600080fd5b5060095461048b565b3480156107b357600080fd5b50610385611aab565b6103856107ca366004615853565b611e99565b610385611ea6565b3480156107e357600080fd5b5060025461048b565b3480156107f857600080fd5b503660011981013560f01c90036058013561048b565b34801561081a57600080fd5b503660011981013560f01c90036078013561048b565b34801561083c57600080fd5b5061089261084b3660046158fd565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046001600160801b0316906001600160a01b031684565b60408051941515855263ffffffff90931660208501526001600160801b03909116918301919091526001600160a01b031660608201526080016103e9565b3480156108dc57600080fd5b503660011981013560f01c900360f4013560601c6104ee565b34801561090157600080fd5b506040513660011981013560f01c90036054013560e01c81526020016103e9565b34801561092e57600080fd5b503660011981013560f01c90036014013561048b565b34801561095057600080fd5b506103d461095f3660046158fd565b611f11565b34801561097057600080fd5b5061048b61097f366004615836565b600b6020526000908152604090205481565b34801561099d57600080fd5b5061048b6109ac366004615965565b6120ab565b3480156109bd57600080fd5b506109d16109cc3660046158fd565b61226c565b6040805163ffffffff90981688526001600160a01b03968716602089015295909416948601949094526001600160801b039182166060860152608085015291821660a08401521660c082015260e0016103e9565b348015610a3157600080fd5b506000546103d49067ffffffffffffffff1681565b348015610a5257600080fd5b5061048b610a61366004615836565b6122e0565b348015610a7257600080fd5b503660011981013560f01c900360d4013561048b565b348015610a9457600080fd5b50610385610aa336600461598e565b612338565b348015610ab457600080fd5b507f0000000000000000000000000000000000000000000000000000000000049d406103d4565b348015610ae757600080fd5b507f000000000000000000000000000000000000000000000000000000000000001e61048b565b348015610b1a57600080fd5b50610450610b293660046158fd565b60046020526000908152604090205460ff1681565b348015610b4a57600080fd5b50610385610b59366004615853565b6123b4565b348015610b6a57600080fd5b50610b7361277b565b6040516103e993929190615a1a565b348015610b8e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000004961048b565b348015610bc157600080fd5b50610450610bd03660046158fd565b60066020526000908152604090205460ff1681565b60008054600160801b900460ff166002811115610c0457610c046157d7565b14610c225760405163067fe19560e41b815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c75576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8e3660011981013560f01c90036014013590565b90565b610ca5610ca036869003860186615a55565b6127a5565b14610cdc576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cf1929190615ac9565b604051809103902014610d30576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d79610d7484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280192505050565b61286e565b90506000610da082600881518110610d9357610d93615ad9565b6020026020010151612a24565b9050602081511115610dde576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c3660011981013560f01c9003605801358103610e35576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054600160801b900460ff166002811115610ec357610ec36157d7565b14610ee15760405163067fe19560e41b815260040160405180910390fd5b600060028381548110610ef657610ef6615ad9565b906000526020600020906005020190506000610f1184611f11565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d4081169082161015610f7a576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615610fc3576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560205260409020805480158015610fe057508515155b1561104357835464010000000090046001600160a01b0316600081156110065781611015565b60018601546001600160a01b03165b90506110218187612ad8565b505050600094855250506006602052505060409020805460ff19166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046001600160801b031693810193909352600101546001600160a01b031660608301526110c7576001600160801b0360408201526001815260008690036110c7578195505b600086826020015163ffffffff166110df9190615b05565b905060008382116110f057816110f2565b835b602084015190915063ffffffff165b8181101561121257600086828154811061111d5761111d615ad9565b6000918252602080832090910154808352600690915260409091205490915060ff16611175576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061118a5761118a615ad9565b60009182526020909120600590910201805490915064010000000090046001600160a01b03161580156111d15750600481015460408701516001600160801b039182169116115b156111fd5760018101546001600160a01b0316606087015260048101546001600160801b031660408701525b5050808061120a90615b1d565b915050611101565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006001600160801b03909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039093169290921790915584900361142157606083015160008a8152600660205260409020805460ff191660011790558915801561135e57506000547201000000000000000000000000000000000000900460ff165b156113b9576001546001600160a01b0316611379818a612ad8565b88546001600160a01b03909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff90911617885561141f565b6113e66001600160a01b038216156113d157816113e0565b60018901546001600160a01b03165b89612ad8565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038316021788555b505b505050505050505050565b600080600054600160801b900460ff16600281111561144d5761144d6157d7565b1461146b5760405163067fe19560e41b815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166114cf576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b031660026000815481106114ee576114ee615ad9565b600091825260209091206005909102015464010000000090046001600160a01b03161461151c57600161151f565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617600160801b8360028111156115c3576115c36157d7565b0217905560028111156115d8576115d86157d7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b6005602052816000526040600020818154811061162057600080fd5b90600052602060002001600091509150505481565b905090565b6116478383836001611a2b565b505050565b600061163561165d60f46014615b05565b3660011981013560f01c9003013560601c90565b600081815260076020908152604080832060059092528220805482546116a290610100900463ffffffff1682615b37565b95945050505050565b60003660011981013560f01c900360d4013582146116f5576040517f0da789df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003601401355b92915050565b606061163560586020612b1a565b611722611aab565b60006002600d5460ff16600281111561173d5761173d6157d7565b0361176157506001600160a01b0381166000908152600b60205260409020546117d0565b6001600d5460ff16600281111561177a5761177a6157d7565b0361179e57506001600160a01b0381166000908152600360205260409020546117d0565b6040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600c602052604090205460ff166118ae576001600160a01b0382166000908152600c60205260409020805460ff1916600117905561182d60c0600119369081013560f01c9003013560601c90565b6040517f7eee288d0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529190911690637eee288d90604401600060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050505050565b806000036118e8576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600b6020908152604080832083905560039091528120553660011981013560f01c900360c0013560601c6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063f3fef3a390604401600060405180830381600087803b15801561198657600080fd5b505af115801561199a573d6000803e3d6000fd5b505050506000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119eb576040519150601f19603f3d011682016040523d82523d6000602084013e6119f0565b606091505b5050905080611647576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360f4013560601c331480611a635750611a4e61164c565b6001600160a01b0316336001600160a01b0316145b611a99576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa584848484612b4e565b50505050565b6002600d5460ff166002811115611ac457611ac46157d7565b1480611ae657506001600d5460ff166002811115611ae457611ae46157d7565b145b15611aed57565b6000600d5460ff166002811115611b0657611b066157d7565b14611b3d576040517f078a3df400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb19190615b4e565b15611be8576040517f379a7ed900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005468010000000000000000900467ffffffffffffffff1667ffffffffffffffff16600003611c44576040517fc105260a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003660011981013560f01c900360ac013560601c6040517f0314d2b30000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039190911690630314d2b390602401602060405180830381865afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615b4e565b905080611d15576040517f4851bd9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c900360ac013560601c6040517f17cf21a90000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0391909116906317cf21a990602401600060405180830381600087803b158015611d8457600080fd5b505af1925050508015611d95575060015b5060003660011981013560f01c900360ac013560601c6040517f496b9c160000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063496b9c1690602401602060405180830381865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615b4e565b90508015611e4857600d805460ff19166001179055611e56565b600d805460ff191660021790555b600d546040517f9908eaac0645df9d0704d06adc9e07337c951de2f06b5f2836151d48d5e4722f91611e8d9160ff9091169061580e565b60405180910390a15050565b6116478383836000611a2b565b611eae6134d1565b3660011981013560f01c900360f4013560601c3214611ef9576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3660011981013560f01c90036054013560e01c90565b600080600054600160801b900460ff166002811115611f3257611f326157d7565b14611f505760405163067fe19560e41b815260040160405180910390fd5b600060028381548110611f6557611f65615ad9565b600091825260208220600590910201805490925063ffffffff90811614611fcb57815460028054909163ffffffff16908110611fa357611fa3615ad9565b906000526020600020906005020160040160109054906101000a90046001600160801b031690505b6004820154600090611ff690600160801b900467ffffffffffffffff165b67ffffffffffffffff1690565b61200a9067ffffffffffffffff1642615b37565b612020611fe9846001600160801b031660401c90565b67ffffffffffffffff166120349190615b05565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff161161208157806116a2565b7f0000000000000000000000000000000000000000000000000000000000049d4095945050505050565b600080612128836001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000049811115612187576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a30060006121a28383615b81565b9050670de0b6b3a764000060006121d9827f0000000000000000000000000000000000000000000000000000000000000049615b95565b905060006121f76121f2670de0b6b3a764000086615b95565b613d8d565b905060006122058484613fdf565b90506000612213838361402e565b905060006122208261405c565b9050600061223f8261223a670de0b6b3a76400008f615b95565b614244565b9050600061224d8b8361402e565b9050612259818d615b95565b9f9e505050505050505050505050505050565b6002818154811061227c57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff841695506401000000009093046001600160a01b03908116949216926001600160801b03918216929180821691600160801b90041687565b60006002600d5460ff1660028111156122fb576122fb6157d7565b0361231c57506001600160a01b03166000908152600b602052604090205490565b506001600160a01b031660009081526003602052604090205490565b3660011981013560f01c900360f4013560601c331480612370575061235b61164c565b6001600160a01b0316336001600160a01b0316145b6123a6576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118a686868686868661427c565b60008054600160801b900460ff1660028111156123d3576123d36157d7565b146123f15760405163067fe19560e41b815260040160405180910390fd5b600080600080612400866147b0565b9350935093509350600061241685858585614b09565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561246a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248e9190615bb4565b90506001890361255b576001600160a01b0381166352f0f3ad8a846124bf3660011981013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190615bd1565b50611421565b6002890361257a576001600160a01b0381166352f0f3ad8a84896124bf565b60038903612599576001600160a01b0381166352f0f3ad8a84876124bf565b600489036126ce5760006125d66001600160801b0385167f000000000000000000000000000000000000000000000000000000000000001e614ba8565b6009546125e39190615b05565b6125ee906001615b05565b90503660011981013560f01c900360580135811061261b573660011981013560f01c90036058013561261d565b805b90506001600160a01b0382166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af11580156126a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c79190615bd1565b5050611421565b60058903612749576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390523660011981013560f01c900360d4013560c01b604482015260086064820152608481018890526001600160a01b038216906352f0f3ad9060a401612512565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3660011981013560f01c9003605481013560e01c9060140135606061279e61170c565b9050909192565b600081600001518260200151836040015184606001516040516020016127e4949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612850576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061287e85614c3d565b919450925090506001816001811115612899576128996157d7565b146128d0576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516128dc8385615b05565b14612913576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161292a5790505093506000835b8651811015612a185760008061299d6040518060400160405280858c600001516129819190615b37565b8152602001858c602001516129969190615b05565b9052614c3d565b5091509150604051806040016040528083836129b99190615b05565b8152602001848b602001516129ce9190615b05565b8152508885815181106129e3576129e3615ad9565b60209081029190910101526129f9600185615b05565b9350612a058183615b05565b612a0f9084615b05565b92505050612957565b50845250919392505050565b60606000806000612a3485614c3d565b919450925090506000816001811115612a4f57612a4f6157d7565b14612a86576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a908284615b05565b855114612ac9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116a2856020015184846150db565b60028101546001600160a01b038316600090815260036020526040812080546001600160801b0390931692909190612b11908490615b05565b90915550505050565b6040518181523660011981013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054600160801b900460ff166002811115612b6d57612b6d6157d7565b14612b8b5760405163067fe19560e41b815260040160405180910390fd5b600060028481548110612ba057612ba0615ad9565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff811684526001600160a01b0364010000000090910481169484019490945260018101549093169082015260028201546001600160801b03908116606083015260038301546080830181905260049093015480821660a0840152600160801b90041660c082015291508514612c64576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156001600160801b0383161760011b90506000612cf9826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612d345750612d317f000000000000000000000000000000000000000000000000000000000000001e6002615b05565b81145b8015612d3e575084155b15612d75576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d9b575086155b15612dd2576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000049811115612e2c576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e577f000000000000000000000000000000000000000000000000000000000000001e6001615b05565b8103612e6957612e698688858861516f565b34612e73836120ab565b14612eaa576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612eb588611f11565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d40811690821603612f1d576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612f4a60017f0000000000000000000000000000000000000000000000000000000000000049615b37565b8303613060573660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc49190615bb4565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130259190615bd1565b613059907f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff16615bea565b90506130f3565b61308b60017f000000000000000000000000000000000000000000000000000000000000001e615b37565b83036130c6576130597f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166002615c16565b507f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff165b613127817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615c46565b67ffffffffffffffff166131428367ffffffffffffffff1690565b67ffffffffffffffff16111561318957613186817f0000000000000000000000000000000000000000000000000000000000049d4067ffffffffffffffff16615c46565b91505b6000604083901b421760008a8152608087901b6001600160801b038d1617602052604081209192509060008181526004602052604090205490915060ff16156131fe576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff16815260200160006001600160a01b03168152602001336001600160a01b03168152602001346001600160801b031681526020018c8152602001886001600160801b03168152602001846001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160006101000a8154816001600160801b0302191690836001600160801b031602179055506080820151816003015560a08201518160040160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160040160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600560008c815260200190815260200160002060016002805490506133f59190615b37565b81546001810183556000928352602080842090910191909155338252600b9052604081208054349290613429908490615b05565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561347b57600080fd5b505af115801561348f573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b60005471010000000000000000000000000000000000900460ff1615613523576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61352b6152fe565b3614613563576040517f9824bdab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000803660011981013560f01c900360ac013560601c6001600160a01b031663d83ef2676040518163ffffffff1660e01b81526004016040805180830381865afa1580156135b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d99190615c6f565b909250905081613615576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915282815260200181905260088290556009819055803660011981013560f01c90036058013511613697573660011981013560f01c9003601401355b6040517ff40239db00000000000000000000000000000000000000000000000000000000815260040161368e91815260200190565b60405180910390fd5b67ffffffffffffffff3660011981013560f01c90036058013511156136cb573660011981013560f01c900360140135613659565b67ffffffffffffffff3660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613724573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137489190615bb4565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a99190615bd1565b11156137e1576040517fb4e1243300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138187f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff166002615b95565b905060003660011981013560f01c90036098013560601c6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561386c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138909190615bb4565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f19190615bd1565b67ffffffffffffffff1661392c7f0000000000000000000000000000000000000000000000000000000000002a3067ffffffffffffffff1690565b67ffffffffffffffff166139409190615b05565b9050600061394e8383615313565b905067ffffffffffffffff811115613992576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000049d401667ffffffffffffffff168167ffffffffffffffff161115613a0a576040517f8d77ecac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e08101825263ffffffff808252600060208084018281523660011981013560f01c90038035606090811c8789018181526001600160801b0334818116948b0194855260149095013560808b01908152600160a08c0181815242841660c08e019081526002805493840181558c529c517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590930292830180549a5191909d167fffffffffffffffff000000000000000000000000000000000000000000000000909a16999099176401000000006001600160a01b039a8b160217909b5592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf840180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919098161790965592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0820180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001691851691909117905593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015595519651968116600160801b9790911696909602959095177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909101558154710100000000000000000000000000000000007fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff909116178255918152600b909152918220805491929091613c4b908490615b05565b90915550503660011981013560f01c900360c0013560601c6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613c9d57600080fd5b505af1158015613cb1573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff1617905550613cf49150611efb9050565b63ffffffff163660011981013560f01c900360ac013560601c6001600160a01b0316633c9f397c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190615c93565b600a805460ff191663ffffffff92909216929092141790555050505050565b6001600160801b03811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613de357631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261401c57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b60008160001904831182021561404c5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d7821361408a57919050565b680755bf798b4a1bf1e582126140a85763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000614275670de0b6b3a76400008361425c86613d8d565b6142669190615cb9565b6142709190615d75565b61405c565b9392505050565b60008054600160801b900460ff16600281111561429b5761429b6157d7565b146142b95760405163067fe19560e41b815260040160405180910390fd5b6000600287815481106142ce576142ce615ad9565b6000918252602082206005919091020160048101549092506001600160801b0316908715821760011b90506143247f00000000000000000000000000000000000000000000000000000000000000496001615b05565b61439e826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16146143d8576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156144a35761442b7f000000000000000000000000000000000000000000000000000000000000001e7f0000000000000000000000000000000000000000000000000000000000000049615b37565b6001901b614441846001600160801b031661532a565b6001600160801b03166144549190615dbf565b156144885761447f61447060016001600160801b038716615dd3565b865463ffffffff1660006153b0565b60030154614499565b3660011981013560f01c9003607801355b91508490506144c4565b600385015491506144c16144706001600160801b0386166001615df3565b90505b600882901b60088a8a6040516144db929190615ac9565b6040518091039020901b1461451c576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006145278c615479565b90506000614536836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081523660011981013560f01c90036098013560601c9063e14ced329061458c908f908f908f908f908a90600401615e5e565b6020604051808303816000875af11580156145ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cf9190615bd1565b600485015491149150600090600290614658906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6146d2896001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6146dc9190615e98565b6146e69190615ebb565b60ff161590508115158103614727576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875464010000000090046001600160a01b031615614771576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008060008060008590506000600282815481106147d0576147d0615ad9565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000001e90614885906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116148bf576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000001e90614964906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156149d957825463ffffffff166149a37f000000000000000000000000000000000000000000000000000000000000001e6001615b05565b83036149ad578391505b600281815481106149c0576149c0615ad9565b90600052602060002090600502019350809450506148c3565b600481810154908401546001600160801b0391821691166000816001600160801b0316614a1e614a12856001600160801b031660011c90565b6001600160801b031690565b6001600160801b03161490508015614ab7576000614a44836001600160801b031661532a565b6001600160801b03161115614a94576000614a74614a6c60016001600160801b038616615dd3565b8960016153b0565b6003810154600490910154909c506001600160801b03169a50614a9a9050565b6008549a505b600386015460048701549099506001600160801b03169750614afb565b6000614ad0614a6c6001600160801b0385166001615df3565b6003808901546004808b015492840154930154909e506001600160801b039182169d50919b50169850505b505050505050509193509193565b60006001600160801b03841615614b645760408051602081018790526001600160801b038087169282019290925260608101859052908316608082015260a001604051602081830303815290604052805190602001206116a2565b8282604051602001614b899291909182526001600160801b0316602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614c1c847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614c80576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614ca55760006001600094509450945050506150d4565b60b78111614dbb576000614cba608083615b37565b905080876000015111614cf9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614d7157507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614da8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600195509350600092506150d4915050565b60bf8111614f19576000614dd060b783615b37565b905080876000015111614e0f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614e71576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614eb9576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614ec38184615b05565b895111614efc576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f07836001615b05565b97509550600094506150d49350505050565b60f78111614f7e576000614f2e60c083615b37565b905080876000015111614f6d576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001955093508492506150d4915050565b6000614f8b60f783615b37565b905080876000015111614fca576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361502c576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111615074576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61507e8184615b05565b8951116150b7576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6150c2836001615b05565b97509550600194506150d49350505050565b9193909250565b60608167ffffffffffffffff8111156150f6576150f6615a3f565b6040519080825280601f01601f191660200182016040528015615120576020820181803683370190505b50905081156142755760006151358486615b05565b90506020820160005b8481101561515657828101518282015260200161513e565b84811115615165576000858301525b5050509392505050565b60006151856001600160801b0384166001615df3565b90506000615195828660016153b0565b9050600086901a838061525f57506151ce60027f000000000000000000000000000000000000000000000000000000000000001e615dbf565b6004830154600290615250906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61525a9190615ebb565b60ff16145b156152b75760ff811660011480615279575060ff81166002145b6152b2576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161368e565b6152f5565b60ff8116156152f5576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161368e565b50505050505050565b60006153086154a8565b611635906006615b05565b6000818310156153235781614275565b5090919050565b60008061539e837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826153f0576153eb6001600160801b0386167f000000000000000000000000000000000000000000000000000000000000001e6154b6565b615402565b615402856001600160801b03166155f5565b90506002848154811061541757615417615ad9565b906000526020600020906005020191505b60048201546001600160801b0382811691161461547157815460028054909163ffffffff1690811061545c5761545c615ad9565b90600052602060002090600502019150615428565b509392505050565b600080600080600061548a866147b0565b935093509350935061549e84848484614b09565b9695505050505050565b600061163560f46028615b05565b600081615533846001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116155495763b34b5c226000526004601cfd5b615552836155f5565b9050816155cf826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611611706576142756155e5836001615b05565b6001600160801b03831690615681565b60008119600183011681615670827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806156f5847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261572357600080fd5b50813567ffffffffffffffff81111561573b57600080fd5b60208301915083602082850101111561575357600080fd5b9250929050565b600080600083850360a081121561577057600080fd5b608081121561577e57600080fd5b50839250608084013567ffffffffffffffff81111561579c57600080fd5b6157a886828701615711565b9497909650939450505050565b600080604083850312156157c857600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061580b57634e487b7160e01b600052602160045260246000fd5b50565b6020810161581b836157ed565b91905290565b6001600160a01b038116811461580b57600080fd5b60006020828403121561584857600080fd5b813561427581615821565b60008060006060848603121561586857600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156158a557602081850181015186830182015201615889565b818111156158b7576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000614275602083018461587f565b60006020828403121561590f57600080fd5b5035919050565b801515811461580b57600080fd5b6000806000806080858703121561593a57600080fd5b843593506020850135925060408501359150606085013561595a81615916565b939692955090935050565b60006020828403121561597757600080fd5b81356001600160801b038116811461427557600080fd5b600080600080600080608087890312156159a757600080fd5b8635955060208701356159b981615916565b9450604087013567ffffffffffffffff808211156159d657600080fd5b6159e28a838b01615711565b909650945060608901359150808211156159fb57600080fd5b50615a0889828a01615711565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006116a2606083018461587f565b634e487b7160e01b600052604160045260246000fd5b600060808284031215615a6757600080fd5b6040516080810181811067ffffffffffffffff82111715615a9857634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115615b1857615b18615aef565b500190565b60006000198203615b3057615b30615aef565b5060010190565b600082821015615b4957615b49615aef565b500390565b600060208284031215615b6057600080fd5b815161427581615916565b634e487b7160e01b600052601260045260246000fd5b600082615b9057615b90615b6b565b500490565b6000816000190483118215151615615baf57615baf615aef565b500290565b600060208284031215615bc657600080fd5b815161427581615821565b600060208284031215615be357600080fd5b5051919050565b600067ffffffffffffffff808316818516808303821115615c0d57615c0d615aef565b01949350505050565b600067ffffffffffffffff80831681851681830481118215151615615c3d57615c3d615aef565b02949350505050565b600067ffffffffffffffff83811690831681811015615c6757615c67615aef565b039392505050565b60008060408385031215615c8257600080fd5b505080516020909101519092909150565b600060208284031215615ca557600080fd5b815163ffffffff8116811461427557600080fd5b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615cfa57615cfa615aef565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615d3557615d35615aef565b60008712925087820587128484161615615d5157615d51615aef565b87850587128184161615615d6757615d67615aef565b505050929093029392505050565b600082615d8457615d84615b6b565b60001983147f800000000000000000000000000000000000000000000000000000000000000083141615615dba57615dba615aef565b500590565b600082615dce57615dce615b6b565b500690565b60006001600160801b0383811690831681811015615c6757615c67615aef565b60006001600160801b03808316818516808303821115615c0d57615c0d615aef565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615e72606083018789615e15565b8281036020840152615e85818688615e15565b9150508260408301529695505050505050565b600060ff821660ff841680821015615eb257615eb2615aef565b90039392505050565b600060ff831680615ece57615ece615b6b565b8060ff8416069150509291505056fea164736f6c634300080f000a"; + bytes internal constant acc37Code = + hex"608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a6ed563e11610076578063bd02d0f51161005b578063bd02d0f51461018e578063ca446dd9146101b8578063e2a4853a1461011557600080fd5b8063a6ed563e1461018e578063abfdcced146101aa57600080fd5b80634e91db08116100a75780634e91db081461011557806354fd4d50146101275780637ae1cfca1461017057600080fd5b80630528afe2146100c357806321f8a721146100d8575b600080fd5b6100d66100d1366004610239565b6101c6565b005b6100eb6100e63660046102ae565b610229565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d66101233660046102c7565b9055565b6101636040518060400160405280600581526020017f312e322e3200000000000000000000000000000000000000000000000000000081525081565b60405161010c91906102e9565b61017e6100e63660046102ae565b604051901515815260200161010c565b61019c6100e63660046102ae565b60405190815260200161010c565b6100d661012336600461035c565b6100d6610123366004610391565b8060005b81811015610223576102118484838181106101e7576101e76103cf565b90506040020160000135858584818110610203576102036103cf565b905060400201602001359055565b8061021b816103fe565b9150506101ca565b50505050565b6000610233825490565b92915050565b6000806020838503121561024c57600080fd5b823567ffffffffffffffff8082111561026457600080fd5b818501915085601f83011261027857600080fd5b81358181111561028757600080fd5b8660208260061b850101111561029c57600080fd5b60209290920196919550909350505050565b6000602082840312156102c057600080fd5b5035919050565b600080604083850312156102da57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015610316578581018301518582016040015282016102fa565b81811115610328576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806040838503121561036f57600080fd5b823591506020830135801515811461038657600080fd5b809150509250929050565b600080604083850312156103a457600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811461038657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610456577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + bytes internal constant acc38Code = + hex"fe7100608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105ef8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a"; + bytes internal constant acc39Code = + hex"fe7100608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + bytes internal constant acc40Code = + hex"fe710060806040523480156200001157600080fd5b5060405162001a5f38038062001a5f8339810160408190526200003491620000a1565b6200003f3362000051565b6200004a8162000051565b50620000d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b457600080fd5b81516001600160a01b0381168114620000cc57600080fd5b9392505050565b61197c80620000e36000396000f3fe60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant acc41Code = + hex"fe7100608060405234801561001057600080fd5b50604051610a44380380610a4483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109a88061009c6000396000f3fe60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a"; + bytes internal constant acc42Code = + hex"fe7100608060405234801561001057600080fd5b506040516105f03803806105f083398101604081905261002f91610088565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b03871617905590829052902061006a8282610203565b5050506102c2565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561009b57600080fd5b82516001600160a01b03811681146100b257600080fd5b602084810151919350906001600160401b03808211156100d157600080fd5b818601915086601f8301126100e557600080fd5b8151818111156100f7576100f7610072565b604051601f8201601f19908116603f0116810190838211818310171561011f5761011f610072565b81604052828152898684870101111561013757600080fd5b600093505b82841015610159578484018601518185018701529285019261013c565b8284111561016a5760008684830101525b8096505050505050509250929050565b600181811c9082168061018e57607f821691505b6020821081036101ae57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fe57600081815260208120601f850160051c810160208610156101db5750805b601f850160051c820191505b818110156101fa578281556001016101e7565b5050505b505050565b81516001600160401b0381111561021c5761021c610072565b6102308161022a845461017a565b846101b4565b602080601f831160018114610265576000841561024d5750858301515b600019600386901b1c1916600185901b1785556101fa565b600085815260208120601f198616915b8281101561029457888601518255948401946001909101908401610275565b50858210156102b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61031f806102d16000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant acc43Code = + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c806378ecabce1161005057806378ecabce1461022a578063b51f9c2b1461024d578063debc60071461032d57600080fd5b80631d8a4e921461006c57806330e9012c146100a6575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61021d6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081019190915250604080516102408101825260055473ffffffffffffffffffffffffffffffffffffffff9081168252600654811660208301526007548116928201929092526008548216606082015260095482166080820152600a54821660a0820152600b54821660c0820152600c54821660e0820152600d548216610100820152600e548216610120820152600f5482166101408201526010548216610160820152601154821661018082015260125482166101a082015260135482166101c082015260145482166101e0820152601554821661020082015260165490911661022082015290565b60405161009d9190610385565b61023d61023836600461055d565b61033a565b604051901515815260200161009d565b6102d16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260005473ffffffffffffffffffffffffffffffffffffffff90811682526001548116602083015260025481169282019290925260035482166060820152600454909116608082015290565b60405161009d9190815173ffffffffffffffffffffffffffffffffffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b63beefcafe3b151561023d565b60006103667f00000000000000000000000000000000000000000000000000000000000000008361036c565b92915050565b6000811580159061037e575081828416145b9392505050565b815173ffffffffffffffffffffffffffffffffffffffff168152610240810160208301516103cb602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516103f3604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161041b606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151610443608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161046b60a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161049360c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516104bb60e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102209384015116929091019190915290565b60006020828403121561056f57600080fd5b503591905056fea164736f6c634300080f000a"; + bytes internal constant acc44Code = + hex"608060405234801561001057600080fd5b50600436106100a35760003560e01c8063604aa62811610076578063b23cc0441161005b578063b23cc0441461016d578063b51f9c2b14610182578063b6a4cd21146101d957600080fd5b8063604aa6281461012a57806378ecabce1461014a57600080fd5b80631d8a4e92146100a857806330e9012c146100c3578063318b1b80146100d85780635a4dab3314610103575b600080fd5b6100b06101ec565b6040519081526020015b60405180910390f35b6100cb610275565b6040516100ba91906128b7565b6100eb6100e6366004612a1a565b610389565b6040516001600160a01b0390911681526020016100ba565b6100eb7f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61013d610138366004612c14565b610404565b6040516100ba9190612da9565b61015d610158366004612a1a565b610b7e565b60405190151581526020016100ba565b61018061017b366004612e05565b610c29565b005b61018a611356565b6040516100ba919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6101806101e7366004612ecc565b611403565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561024c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102709190612ee9565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610365573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102709190612f0d565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103f890613065565b60601c95945050505050565b60608151600003610441576040517fea11647200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000825167ffffffffffffffff81111561045d5761045d612a33565b6040519080825280602002602001820160405280156104a257816020015b604080518082019091526000808252602082015281526020019060019003908161047b5790505b50905060001960005b8451811015610b755760008582815181106104c8576104c86130b5565b6020026020010151905060006104e5826060015163ffffffff1690565b63ffffffff169050808412610526576040517fea11647200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b809350600082602001516001600160a01b031663d6ae3cd56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190612ee9565b60408401519091506001600160a01b03166107865761063f8184602001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061091906130e4565b855161061b8661145a565b60405160200161062b9190613131565b604051602081830303815290604052611597565b868581518110610651576106516130b5565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505061078183602001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106de91906130e4565b8786815181106106f0576106f06130b5565b6020026020010151600001516107046115f5565b610180015160208701516040516001600160a01b03909116602482015260440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de8000000000000000000000000000000000000000000000000000000001790526116e5565b6107b6565b826040015186858151811061079d5761079d6130b5565b60209081029190910101516001600160a01b0390911690525b60006107c5846020015161176f565b905060006107d78286606001516117d3565b90506107e68560600151611864565b806107f957506107f98560600151611897565b1561090a57600061080d86606001516118b0565b905060006108ba6040518060e0016040528061082a8a6080015190565b81526020018961014001516001600160a01b031681526020016108508a602001516119af565b6001600160a01b031681526020018c8b81518110610870576108706130b5565b6020026020010151600001516001600160a01b031681526020016108978a60600151611a50565b6108a157876108a4565b60005b8152600060208201819052604090910152611a7a565b90506108cc8488606001518484611bc2565b818a89815181106108df576108df6130b5565b6020026020010151602001906001600160a01b031690816001600160a01b0316815250505050610a5d565b606085015163ffffffff166001148061092d5750606085015163ffffffff166005145b15610a2b57600061094186606001516118b0565b905060006108ba6040518060e0016040528061095e8a6080015190565b81526020018961014001516001600160a01b031681526020016109848a602001516119af565b6001600160a01b031681526020018c8b815181106109a4576109a46130b5565b602090810291909101810151516001600160a01b0316825201600163ffffffff166109d68b6060015163ffffffff1690565b63ffffffff16146109e85760006109ea565b875b81526020016109fe87878c60600151611c0b565b6001600160a01b03168152602001610a1b87878c60600151611d26565b6001600160a01b03169052611a7a565b6040517f5d02c1fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608501516101208601516040517f1e33424000000000000000000000000000000000000000000000000000000000815263ffffffff909216600483015260248201526001600160a01b03831690631e33424090604401600060405180830381600087803b158015610ace57600080fd5b505af1158015610ae2573d6000803e3d6000fd5b50505050846060015163ffffffff16837f4b8d2d3f00ea4ebab553d99606c8aea67fd4deb9ef0abee0e7c4b246c59a0e0f8a8981518110610b2557610b256130b5565b60200260200101516020015184604051610b559291906001600160a01b0392831681529116602082015260400190565b60405180910390a350505050508080610b6d906131a5565b9150506104ab565b50909392505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906131bf565b92915050565b60005b8151811015611352576000828281518110610c4957610c496130b5565b6020026020010151600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb691906130e4565b60408051600680825260e08201909252919250600091906020820160c080368337019050509050600081600081518110610cf257610cf26130b5565b602002602001019063ffffffff16908163ffffffff1681525050600181600181518110610d2157610d216130b5565b602002602001019063ffffffff16908163ffffffff1681525050600481600281518110610d5057610d506130b5565b602002602001019063ffffffff16908163ffffffff1681525050600581600381518110610d7f57610d7f6130b5565b602002602001019063ffffffff16908163ffffffff1681525050600881600481518110610dae57610dae6130b5565b602002602001019063ffffffff16908163ffffffff1681525050600981600581518110610ddd57610ddd6130b5565b602002602001019063ffffffff16908163ffffffff168152505060008060005b835181101561133a576000848281518110610e1a57610e1a6130b5565b602002602001015190506000610e3087836117d3565b90506001600160a01b038116610e47575050611328565b63ffffffff821660041480610e62575063ffffffff82166005145b80610e73575063ffffffff82166009145b15610e815760019350610e86565b600194505b848015610e905750835b15610ec7576040517f393f5fc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600063ffffffff831660081480610ee4575063ffffffff83166009145b610f0b57898981518110610efa57610efa6130b5565b602002602001015160200151610f2a565b898981518110610f1d57610f1d6130b5565b6020026020010151604001515b905080610f63576040517fb30c83ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051806101800160405280610f978d8d81518110610f8657610f866130b5565b602002602001015160000151611e14565b81526020018c8c81518110610fae57610fae6130b5565b6020026020010151600001516001600160a01b03168152602001610fd38b8688611e30565b6001600160a01b031681526020018563ffffffff168152602001838152602001846001600160a01b031663fa315aa96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110559190612ee9565b8152602001846001600160a01b031663ec5e63086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190612ee9565b8152602001846001600160a01b0316636b6716c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906131dc565b67ffffffffffffffff168152602001846001600160a01b031663dabd396d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119491906131dc565b67ffffffffffffffff1681526040517f6593dc6e00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526020909101906001600160a01b038c1690636593dc6e90602401602060405180830381865afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190612ee9565b815260200161123d8b8688611f1e565b6001600160a01b0316815260200163ffffffff861660011480611266575063ffffffff86166005145b1515905260408051600180825281830190925291925060009190816020015b60408051610180810182526060808252600060208084018290529383018190529082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101608201528252600019909201910181611285579050509050818160008151811061130d5761130d6130b5565b602002602001018190525061132181610404565b5050505050505b80611332816131a5565b915050610dfd565b5050505050808061134a906131a5565b915050610c2c565b5050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027091906131f9565b806001600160a01b03163b600003611457576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b60608160000361149d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156114c757806114b1816131a5565b91506114c09050600a836132c0565b91506114a1565b60008167ffffffffffffffff8111156114e2576114e2612a33565b6040519080825280601f01601f19166020018201604052801561150c576020820181803683370190505b5090505b841561158f576115216001836132d4565b915061152e600a866132eb565b6115399060306132ff565b60f81b81838151811061154e5761154e6130b5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611588600a866132c0565b9450611510565b949350505050565b6000806115a586858561200c565b90506115eb6115b2612042565b6020015182876040516020016115d791906001600160a01b0391909116815260200190565b6040516020818303038152906040526120cb565b9695505050505050565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce9996001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610365573d6000803e3d6000fd5b6116ee82611403565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d9061173790869086908690600401613343565b600060405180830381600087803b15801561175157600080fd5b505af1158015611765573d6000803e3d6000fd5b5050505050505050565b6000816001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906130e4565b6040517f1b685b9e00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526000906001600160a01b03841690631b685b9e90602401602060405180830381865afa158015611839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185d91906130e4565b9392505050565b600063ffffffff82161580610c23575060045b63ffffffff1661188a8363ffffffff1690565b63ffffffff161492915050565b600063ffffffff821660081480610c2357506009611877565b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8316016118f2576118e76115f5565b610220015192915050565b60001963ffffffff831601611914576119096115f5565b6101e0015192915050565b63ffffffff82166004148061192f575063ffffffff82166009145b156119475761193c6115f5565b610200015192915050565b63ffffffff82161580611960575063ffffffff82166008145b156119785761196d6115f5565b6101c0015192915050565b6040517f45447e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000816001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1391906130e4565b6001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117af573d6000803e3d6000fd5b600063ffffffff821660041480611a6d575063ffffffff82166009145b80610c2357506005611877565b60a08101516060906001600160a01b0316158015611aa3575060c08201516001600160a01b0316155b15611b30578151602080840151604080860151606087015160808801519251611b1a96959293919201948552606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602087015292841b83166034860152921b166048830152605c820152607c0190565b6040516020818303038152906040529050919050565b8151602080840151604080860151606080880151608089015160a08a015160c08b01518651988901999099527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000096841b87169588019590955292821b85166054870152811b84166068860152607c85019190915290811b8216609c8401529290921b90911660b082015260c401611b1a565b6040517fb10709570000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063b10709579061173790869086908690600401613378565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b91908101906133a6565b90508051600003611d1057836001600160a01b031663a8e4fb906040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0891906130e4565b91505061185d565b611d1981612205565b60a0015195945050505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611d8e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db691908101906133a6565b90508051600003611dff57836001600160a01b031663534db0e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b611e0881612205565b60c0015191505061185d565b604080516001600160a01b038316602082015260609101611b1a565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ec091908101906133a6565b90508051600003611f0957836001600160a01b0316633fc8cef36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b611f1281612205565b6060015191505061185d565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611f86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fae91908101906133a6565b90508051600003611ff757836001600160a01b0316633a7684636040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b61200081612205565b6020015191505061185d565b600083838360405160200161202393929190613414565b6040516020818303038152906040528051906020012090509392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce9996001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156113df573d6000803e3d6000fd5b6000806120fc856001600160a01b0316803b806020016040519081016040528181526000908060200190933c612337565b805190915060ff16156121435780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161144e565b602081015151156121865780602001516040517f57a0583500000000000000000000000000000000000000000000000000000000815260040161144e919061343f565b600081604001518460405160200161219f929190613452565b6040516020818303038152906040529050848151602083016000f592506001600160a01b0383166121fc576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152815160a481148015906122525750607c8114155b15612289576040517fbff6e41600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151604084015160548501516068860151607c870151606093841c9392831c929190911c906000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c88016122ef575050609c88015160b0890151606091821c911c5b6040805160e0810182529788526001600160a01b0396871660208901529486169487019490945291841660608601526080850152821660a08401521660c08201529392505050565b61235e6040518060600160405280600060ff16815260200160608152602001606081525090565b6002825110806123c857508160008151811061237c5761237c6130b5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061242d5750816001815181106123e1576123e16130b5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b15612464576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028360028151811061247b5761247b6130b5565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c90506000836002815181106124ab576124ab6130b5565b60209101015160f81c600390811691508190036124f4576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156125e05760008260ff1667ffffffffffffffff81111561251d5761251d612a33565b6040519080825280601f01601f191660200182016040528015612547576020820181803683370190505b50905060005b8360ff168110156125d257866125648260036132ff565b81518110612574576125746130b5565b602001015160f81c60f81b828281518110612591576125916130b5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806125ca816131a5565b91505061254d565b506125dc816127f6565b9150505b60008167ffffffffffffffff8111156125fb576125fb612a33565b6040519080825280601f01601f191660200182016040528015612625576020820181803683370190505b50905060ff8316156126ca57600061263e846003613481565b60ff16905060005b838110156126c7578761265982846132ff565b81518110612669576126696130b5565b602001015160f81c60f81b838281518110612686576126866130b5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806126bf816131a5565b915050612646565b50505b6000826126d8856003613481565b60ff166126e591906132ff565b905060008188516126f691906132d4565b905080600003612732576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561274d5761274d612a33565b6040519080825280601f01601f191660200182016040528015612777576020820181803683370190505b50905060008360208b0101602083018481868460045afa92505050806127c9576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6000602082511115612834576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b83518110156128b05761284c8160016132ff565b845161285891906132d4565b6128639060086134a6565b61286e9060026135a9565b848281518110612880576128806130b5565b0160200151612892919060f81c6134a6565b61289c90836132ff565b9150806128a8816131a5565b915050612838565b5092915050565b81516001600160a01b03168152610240810160208301516128e360208401826001600160a01b03169052565b5060408301516128fe60408401826001600160a01b03169052565b50606083015161291960608401826001600160a01b03169052565b50608083015161293460808401826001600160a01b03169052565b5060a083015161294f60a08401826001600160a01b03169052565b5060c083015161296a60c08401826001600160a01b03169052565b5060e083015161298560e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102209384015116929091019190915290565b600060208284031215612a2c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff81118282101715612a8657612a86612a33565b60405290565b6040516060810167ffffffffffffffff81118282101715612a8657612a86612a33565b604051610240810167ffffffffffffffff81118282101715612a8657612a86612a33565b604051601f8201601f1916810167ffffffffffffffff81118282101715612afc57612afc612a33565b604052919050565b600067ffffffffffffffff821115612b1e57612b1e612a33565b5060051b60200190565b600067ffffffffffffffff821115612b4257612b42612a33565b50601f01601f191660200190565b600082601f830112612b6157600080fd5b8135612b74612b6f82612b28565b612ad3565b818152846020838601011115612b8957600080fd5b816020850160208301376000918101602001919091529392505050565b6001600160a01b038116811461145757600080fd5b80356119aa81612ba6565b803563ffffffff811681146119aa57600080fd5b67ffffffffffffffff8116811461145757600080fd5b80356119aa81612bda565b801515811461145757600080fd5b80356119aa81612bfb565b60006020808385031215612c2757600080fd5b823567ffffffffffffffff80821115612c3f57600080fd5b818501915085601f830112612c5357600080fd5b8135612c61612b6f82612b04565b81815260059190911b83018401908481019088831115612c8057600080fd5b8585015b83811015612d9c57803585811115612c9c5760008081fd5b8601610180818c03601f1901811315612cb55760008081fd5b612cbd612a62565b8983013588811115612ccf5760008081fd5b612cdd8e8c83870101612b50565b8252506040612ced818501612bbb565b8b8301526060612cfe818601612bbb565b8284015260809150612d11828601612bc6565b818401525060a0808501358284015260c0915081850135818401525060e080850135828401526101009150612d47828601612bf0565b90830152610120612d59858201612bf0565b828401526101409150818501358184015250610160612d79818601612bbb565b82840152612d88848601612c09565b908301525085525050918601918601612c84565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612df857815180516001600160a01b0390811686529087015116868501529284019290850190600101612dc6565b5091979650505050505050565b60006020808385031215612e1857600080fd5b823567ffffffffffffffff811115612e2f57600080fd5b8301601f81018513612e4057600080fd5b8035612e4e612b6f82612b04565b81815260609182028301840191848201919088841115612e6d57600080fd5b938501935b83851015612ec05780858a031215612e8a5760008081fd5b612e92612a8c565b8535612e9d81612ba6565b815285870135878201526040808701359082015283529384019391850191612e72565b50979650505050505050565b600060208284031215612ede57600080fd5b813561185d81612ba6565b600060208284031215612efb57600080fd5b5051919050565b80516119aa81612ba6565b60006102408284031215612f2057600080fd5b612f28612aaf565b612f3183612f02565b8152612f3f60208401612f02565b6020820152612f5060408401612f02565b6040820152612f6160608401612f02565b6060820152612f7260808401612f02565b6080820152612f8360a08401612f02565b60a0820152612f9460c08401612f02565b60c0820152612fa560e08401612f02565b60e0820152610100612fb8818501612f02565b90820152610120612fca848201612f02565b90820152610140612fdc848201612f02565b90820152610160612fee848201612f02565b90820152610180613000848201612f02565b908201526101a0613012848201612f02565b908201526101c0613024848201612f02565b908201526101e0613036848201612f02565b90820152610200613048848201612f02565b9082015261022061305a848201612f02565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156130ad5780818460140360031b1b83161693505b505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156130f657600080fd5b815161185d81612ba6565b60005b8381101561311c578181015183820152602001613104565b8381111561312b576000848401525b50505050565b7f44656c61796564574554482d000000000000000000000000000000000000000081526000825161316981600c850160208701613101565b91909101600c0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060001982036131b8576131b8613176565b5060010190565b6000602082840312156131d157600080fd5b815161185d81612bfb565b6000602082840312156131ee57600080fd5b815161185d81612bda565b600060a0828403121561320b57600080fd5b60405160a0810181811067ffffffffffffffff8211171561322e5761322e612a33565b604052825161323c81612ba6565b8152602083015161324c81612ba6565b6020820152604083015161325f81612ba6565b6040820152606083015161327281612ba6565b6060820152608083015161328581612ba6565b60808201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826132cf576132cf613291565b500490565b6000828210156132e6576132e6613176565b500390565b6000826132fa576132fa613291565b500690565b6000821982111561331257613312613176565b500190565b6000815180845261332f816020860160208601613101565b601f01601f19169290920160200192915050565b60006001600160a01b0380861683528085166020840152506060604083015261336f6060830184613317565b95945050505050565b63ffffffff841681526001600160a01b038316602082015260606040820152600061336f6060830184613317565b6000602082840312156133b857600080fd5b815167ffffffffffffffff8111156133cf57600080fd5b8201601f810184136133e057600080fd5b80516133ee612b6f82612b28565b81815285602083850101111561340357600080fd5b61336f826020830160208601613101565b83815260606020820152600061342d6060830185613317565b82810360408401526115eb8185613317565b60208152600061185d6020830184613317565b60008351613464818460208801613101565b835190830190613478818360208801613101565b01949350505050565b600060ff821660ff84168060ff0382111561349e5761349e613176565b019392505050565b60008160001904831182151516156134c0576134c0613176565b500290565b600181815b808511156135005781600019048211156134e6576134e6613176565b808516156134f357918102915b93841c93908002906134ca565b509250929050565b60008261351757506001610c23565b8161352457506000610c23565b816001811461353a576002811461354457613560565b6001915050610c23565b60ff84111561355557613555613176565b50506001821b610c23565b5060208310610133831016604e8410600b8410161715613583575081810a610c23565b61358d83836134c5565b80600019048211156135a1576135a1613176565b029392505050565b600061185d838361350856fea164736f6c634300080f000a"; + bytes internal constant acc45Code = + hex"608060405234801561001057600080fd5b50600436106100885760003560e01c806378ecabce1161005b57806378ecabce1461010f578063b51f9c2b14610132578063b6a4cd2114610189578063cefe12231461019e57600080fd5b80631d8a4e921461008d57806330e9012c146100a8578063318b1b80146100bd5780635a4dab33146100e8575b600080fd5b6100956101be565b6040519081526020015b60405180910390f35b6100b0610247565b60405161009f9190612988565b6100d06100cb366004612af0565b61035b565b6040516001600160a01b03909116815260200161009f565b6100d07f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61012261011d366004612af0565b6103d6565b604051901515815260200161009f565b61013a610481565b60405161009f919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b61019c610197366004612b1e565b61052e565b005b6101b16101ac366004612b42565b610585565b60405161009f9190612bac565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190612ce9565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610337573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190612d8f565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103ca90612ee7565b60601c95945050505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b9190612f45565b92915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561050a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102429190612f62565b806001600160a01b03163b600003610582576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101919091526106078461156e565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290529061068861195d565b905060006106946119e6565b8251909150610737906107236101008a01356106b46101408c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81527f416464726573734d616e6167657200000000000000000000000000000000000060208201529150611ad69050565b604080516000815260208101909152611b0c565b6001600160a01b0316602084015260408201516107f4906107d46101008a01356107656101408c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81527f50726f787941646d696e0000000000000000000000000000000000000000000060208201529150611ad69050565b60408051306020820152015b604051602081830303815290604052611b0c565b6001600160a01b0390811680855260208501516040517f0652b57a0000000000000000000000000000000000000000000000000000000081529216600483015290630652b57a90602401600060405180830381600087803b15801561085857600080fd5b505af115801561086c573d6000803e3d6000fd5b505050602084015184516108809250611c46565b825161090a906101008901359061089b6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81527f4c3145524337323142726964676500000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b0316604084015282516109a290610100890135906109336101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81527f4f7074696d69736d506f7274616c00000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b0316610100808501919091528351610a3c91890135906109cd6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81527f4554484c6f636b626f780000000000000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b031660e08401528251610ad49061010089013590610a656101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81527f53797374656d436f6e666967000000000000000000000000000000000000000060208201529150611cbe9050565b6001600160a01b031660608401528251610b6c9061010089013590610afd6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601c81527f4f7074696d69736d4d696e7461626c654552433230466163746f72790000000060208201529150611cbe9050565b6001600160a01b031660808401528251610c049061010089013590610b956101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527f4469737075746547616d65466163746f7279000000000000000000000000000060208201529150611cbe9050565b6001600160a01b03166101208401528251610c9d9061010089013590610c2e6101408b018b612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527f416e63686f72537461746552656769737472790000000000000000000000000060208201529150611cbe9050565b6001600160a01b0316610140808501919091526060830151610d5b91610d3f906101008b013590610cd0908c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081527f4c315374616e646172644272696467650000000000000000000000000000000060208201529150611ad69050565b8551604080516001600160a01b039092166020830152016107e0565b6001600160a01b0390811660a0850181905284516040517f8d52d4a0000000000000000000000000000000000000000000000000000000008152921691638d52d4a091610dad9160019060040161305f565b600060405180830381600087803b158015610dc757600080fd5b505af1158015610ddb573d6000803e3d6000fd5b505060408051808201909152601a81527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000060208201526080850151909250610eb99150610ea46101008b0135610e356101408d018d612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000060208201529150611ad69050565b6020808801516040516107e09287910161310b565b6001600160a01b0390811660c0860181905285516040517f8d52d4a0000000000000000000000000000000000000000000000000000000008152921691638d52d4a091610f0b9160029060040161305f565b600060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b5050855160c08701516040517f860f7cda0000000000000000000000000000000000000000000000000000000081526001600160a01b03909216935063860f7cda9250610f8a91859060040161310b565b600060405180830381600087803b158015610fa457600080fd5b505af1158015610fb8573d6000803e3d6000fd5b5050855161104692506101008b01359150610fd76101408c018c612ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f44656c61796564574554485065726d697373696f6e656447616d65000000000060208201529150611cbe9050565b6001600160a01b03166101a0850152606061106085611d08565b905061107a85600001518660400151856040015184611d90565b61108d6110868a6132a8565b868a611e1a565b90506110a7856000015186606001518560c0015184611d90565b6110b96102608a016102408b016133d8565b1561115e5760608501516040517ff2c4bc9e0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152600160248201526001600160a01b039091169063f2c4bc9e90604401600060405180830381600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050505b61116860016103d6565b1561120d5760608501516040517ff2c4bc9e0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f580000000000000000000000000000000000000000006004820152600160248201526001600160a01b039091169063f2c4bc9e90604401600060405180830381600087803b1580156111f457600080fd5b505af1158015611208573d6000803e3d6000fd5b505050505b61121760016103d6565b156112d6576112b68560608181015161014083015160e08401516040516001600160a01b039384166024820152918316604483015291909116606482015260840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b0000000000000000000000000000000000000000000000000000000017905292915050565b90506112d18560000151866101000151856080015184611d90565b6112fa565b6112df85611e39565b90506112fa8560000151866101000151856060015184611d90565b6040805160018082528183019092526000916020808301908036833701905050905085610100015181600081518110611335576113356133f5565b60200260200101906001600160a01b031690816001600160a01b03168152505061135f8682611e67565b915061137986600001518760e001518660a0015185611d90565b61138286611ee0565b915061139c866000015187608001518660e0015185611d90565b6113a586611f5d565b91506113c086600001518760c0015186610100015185611d90565b6113c986611d08565b91506113e486600001518760a0015186610120015185611d90565b6113ed86611f8b565b91506114098660000151876101a0015186610180015185611d90565b61147860405130602482015260609060440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052919050565b9150611494866000015187610120015186610140015185611d90565b61149f8a8588611fac565b6101208601516114bb906114b660208d018d612b1e565b611c46565b6114cd6114c78b6132a8565b87612086565b91506114e9866000015187610140015186610160015185611d90565b85516114fc906114b660208d018d612b1e565b876001600160a01b03168a61010001357fb40fb1137b92aa97efb20f29c17d36c5947aac681c3315ba854b0232f83495428860405160200161153e9190612bac565b60408051601f198184030181529082905261155891613424565b60405180910390a3509398975050505050505050565b6101008101351580611584575046816101000135145b156115bb576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ca6020830183612b1e565b6001600160a01b03160361163a576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f70436861696e50726f787941646d696e4f776e6572000000000000000000006044820152606401610579565b600061164c6040830160208401612b1e565b6001600160a01b0316036116bc576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73797374656d436f6e6669674f776e65720000000000000000000000000000006044820152606401610579565b60006116ce6060830160408401612b1e565b6001600160a01b03160361173e576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f62617463686572000000000000000000000000000000000000000000000000006044820152606401610579565b60006117506080830160608401612b1e565b6001600160a01b0316036117c0576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f756e73616665426c6f636b5369676e65720000000000000000000000000000006044820152606401610579565b60006117d260a0830160808401612b1e565b6001600160a01b031603611842576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f70726f706f7365720000000000000000000000000000000000000000000000006044820152606401610579565b600061185460c0830160a08401612b1e565b6001600160a01b0316036118c4576040517fe646e04300000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6368616c6c656e676572000000000000000000000000000000000000000000006044820152606401610579565b6118d2610120820182612ffa565b905060000361190d576040517f89e0acdf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061191d610120830183612ffa565b61192691613437565b03610582576040517f89e0acdf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561050a573d6000803e3d6000fd5b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610337573d6000803e3d6000fd5b6000838383604051602001611aed93929190613455565b6040516020818303038152906040528051906020012090509392505050565b600080611b3d856001600160a01b0316803b806020016040519081016040528181526000908060200190933c612146565b805190915060ff1615611b845780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610579565b60208101515115611bc75780602001516040517f57a058350000000000000000000000000000000000000000000000000000000081526004016105799190613424565b6000816040015184604051602001611be0929190613480565b6040516020818303038152906040529050848151602083016000f592506001600160a01b038316611c3d576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b6040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b158015611ca257600080fd5b505af1158015611cb6573d6000803e3d6000fd5b505050505050565b600080611ccc868585611ad6565b9050611cfe611cd961195d565b6020015182876040516020016107e091906001600160a01b0391909116815260200190565b9695505050505050565b60c08101516060828101516040516001600160a01b03938416602482015292166044830152906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc9550000000000000000000000000000000000000000000000000000000017905292915050565b611d998261052e565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d90611de2908690869086906004016134af565b600060405180830381600087803b158015611dfc57600080fd5b505af1158015611e10573d6000803e3d6000fd5b5050505050505050565b6060600080611e298686612605565b91509150611cfe868584846127c0565b6060818101516101408301516040516001600160a01b03928316602482015291166044820152606401611d32565b6060826060015182604051602401611e809291906134e4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f946d920400000000000000000000000000000000000000000000000000000000179052905092915050565b60a08101516040516001600160a01b0390911660248201526060906044015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905292915050565b6060818101516101008301516040516001600160a01b03928316602482015291166044820152606401611d32565b6060818101516040516001600160a01b039091166024820152604401611eff565b6101a08281015161014083015183830151600093870135929190610100880135611fdc60a08a0160808b01612b1e565b611fec60c08b0160a08c01612b1e565b6040805160208101989098527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606097881b81169189019190915294861b8516605488015292851b84166068870152607c860191909152831b8216609c85015290911b1660b082015260c40160405160208183030381529060405290506120808261012001516001856101e001518461287e565b50505050565b6060600083608001518060200190518101906120a2919061353f565b60608401516101208501516040516001600160a01b039283166024820152911660448201528151606482015260208201516084820152600160a482015290915060c40160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f47a222c50000000000000000000000000000000000000000000000000000000017905291505092915050565b61216d6040518060600160405280600060ff16815260200160608152602001606081525090565b6002825110806121d757508160008151811061218b5761218b6133f5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061223c5750816001815181106121f0576121f06133f5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b15612273576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028360028151811061228a5761228a6133f5565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c90506000836002815181106122ba576122ba6133f5565b60209101015160f81c60039081169150819003612303576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156123ef5760008260ff1667ffffffffffffffff81111561232c5761232c612d02565b6040519080825280601f01601f191660200182016040528015612356576020820181803683370190505b50905060005b8360ff168110156123e157866123738260036135bd565b81518110612383576123836133f5565b602001015160f81c60f81b8282815181106123a0576123a06133f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806123d9816135d5565b91505061235c565b506123eb816128c7565b9150505b60008167ffffffffffffffff81111561240a5761240a612d02565b6040519080825280601f01601f191660200182016040528015612434576020820181803683370190505b50905060ff8316156124d957600061244d8460036135ef565b60ff16905060005b838110156124d6578761246882846135bd565b81518110612478576124786133f5565b602001015160f81c60f81b838281518110612495576124956133f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806124ce816135d5565b915050612455565b50505b6000826124e78560036135ef565b60ff166124f491906135bd565b905060008188516125059190613614565b905080600003612541576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561255c5761255c612d02565b6040519080825280601f01601f191660200182016040528015612586576020820181803683370190505b50905060008360208b0101602083018481868460045afa92505050806125d8576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6040805160c08082018352600080835260208084018290528385018290526060808501839052608080860184905260a0808701859052875160e081018952858152938401859052968301849052908201839052810182905293840181905290830152906126eb6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526301312d008152600a6020820152600891810191909152633b9aca006060820152620f424060808201526fffffffffffffffffffffffffffffffff60a082015290565b91506040518060e001604052808460c001516001600160a01b0316815260200184604001516001600160a01b031681526020018460a001516001600160a01b031681526020018461010001516001600160a01b0316815260200184608001516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152509050612785816000015161052e565b612792816020015161052e565b61279f816040015161052e565b6127ac816060015161052e565b6127b9816080015161052e565b9250929050565b8351602080820151908601516040808801519084015160c08901516060958601518a8701516001600160a01b039093169289906127fc9061035b565b60608d015160405161281c9998979695949392918c918f9060240161362b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2b598b8a000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517fb10709570000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063b107095790611de290869086908690600401613774565b6000602082511115612905576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b83518110156129815761291d8160016135bd565b84516129299190613614565b6129349060086137a2565b61293f9060026138a5565b848281518110612951576129516133f5565b0160200151612963919060f81c6137a2565b61296d90836135bd565b915080612979816135d5565b915050612909565b5092915050565b81516001600160a01b03168152610240810160208301516129b460208401826001600160a01b03169052565b5060408301516129cf60408401826001600160a01b03169052565b5060608301516129ea60608401826001600160a01b03169052565b506080830151612a0560808401826001600160a01b03169052565b5060a0830151612a2060a08401826001600160a01b03169052565b5060c0830151612a3b60c08401826001600160a01b03169052565b5060e0830151612a5660e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102208085015191821681850152905b505092915050565b600060208284031215612b0257600080fd5b5035919050565b6001600160a01b038116811461058257600080fd5b600060208284031215612b3057600080fd5b8135612b3b81612b09565b9392505050565b600080600060608486031215612b5757600080fd5b833567ffffffffffffffff811115612b6e57600080fd5b84016102608187031215612b8157600080fd5b92506020840135612b9181612b09565b91506040840135612ba181612b09565b809150509250925092565b81516001600160a01b031681526101e081016020830151612bd860208401826001600160a01b03169052565b506040830151612bf360408401826001600160a01b03169052565b506060830151612c0e60608401826001600160a01b03169052565b506080830151612c2960808401826001600160a01b03169052565b5060a0830151612c4460a08401826001600160a01b03169052565b5060c0830151612c5f60c08401826001600160a01b03169052565b5060e0830151612c7a60e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501519182168185015290612ae8565b600060208284031215612cfb57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610240810167ffffffffffffffff81118282101715612d5557612d55612d02565b60405290565b6040516101c0810167ffffffffffffffff81118282101715612d5557612d55612d02565b8051612d8a81612b09565b919050565b60006102408284031215612da257600080fd5b612daa612d31565b612db383612d7f565b8152612dc160208401612d7f565b6020820152612dd260408401612d7f565b6040820152612de360608401612d7f565b6060820152612df460808401612d7f565b6080820152612e0560a08401612d7f565b60a0820152612e1660c08401612d7f565b60c0820152612e2760e08401612d7f565b60e0820152610100612e3a818501612d7f565b90820152610120612e4c848201612d7f565b90820152610140612e5e848201612d7f565b90820152610160612e70848201612d7f565b90820152610180612e82848201612d7f565b908201526101a0612e94848201612d7f565b908201526101c0612ea6848201612d7f565b908201526101e0612eb8848201612d7f565b90820152610200612eca848201612d7f565b90820152610220612edc848201612d7f565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000080821693506014831015612f2f5780818460140360031b1b83161693505b505050919050565b801515811461058257600080fd5b600060208284031215612f5757600080fd5b8151612b3b81612f37565b600060a08284031215612f7457600080fd5b60405160a0810181811067ffffffffffffffff82111715612f9757612f97612d02565b6040528251612fa581612b09565b81526020830151612fb581612b09565b60208201526040830151612fc881612b09565b60408201526060830151612fdb81612b09565b60608201526080830151612fee81612b09565b60808201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261302f57600080fd5b83018035915067ffffffffffffffff82111561304a57600080fd5b6020019150368190038213156127b957600080fd5b6001600160a01b038316815260408101600383106130a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8260208301529392505050565b60005b838110156130ce5781810151838201526020016130b6565b838111156120805750506000910152565b600081518084526130f78160208601602086016130b3565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820152600061312d60408301846130df565b949350505050565b600060c0828403121561314757600080fd5b60405160c0810181811067ffffffffffffffff8211171561316a5761316a612d02565b604052905080823561317b81612b09565b8152602083013561318b81612b09565b6020820152604083013561319e81612b09565b604082015260608301356131b181612b09565b606082015260808301356131c481612b09565b608082015260a08301356131d781612b09565b60a0919091015292915050565b803563ffffffff81168114612d8a57600080fd5b600082601f83011261320957600080fd5b813567ffffffffffffffff8082111561322457613224612d02565b604051601f8301601f19908116603f0116810190828211818310171561324c5761324c612d02565b8160405283815286602085880101111561326557600080fd5b836020870160208301376000602085830101528094505050505092915050565b803567ffffffffffffffff81168114612d8a57600080fd5b8035612d8a81612f37565b600061026082360312156132bb57600080fd5b6132c3612d5b565b6132cd3684613135565b81526132db60c084016131e4565b60208201526132ec60e084016131e4565b60408201526101008084013560608301526101208085013567ffffffffffffffff8082111561331a57600080fd5b613326368389016131f8565b60808601526101409150818701358181111561334157600080fd5b61334d36828a016131f8565b60a08701525050610160613362818801613285565b60c08601526101806133758189016131e4565b60e08701526101a080890135868801526101c0890135858801526101e0890135848801526133a66102008a01613285565b838801526133b76102208a01613285565b828801526133c86102408a0161329d565b9087015250939695505050505050565b6000602082840312156133ea57600080fd5b8135612b3b81612f37565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602081526000612b3b60208301846130df565b8035602083101561047b57600019602084900360031b1b1692915050565b83815260606020820152600061346e60608301856130df565b8281036040840152611cfe81856130df565b600083516134928184602088016130b3565b8351908301906134a68183602088016130b3565b01949350505050565b60006001600160a01b038086168352808516602084015250606060408301526134db60608301846130df565b95945050505050565b6000604082016001600160a01b0380861684526020604081860152828651808552606087019150828801945060005b81811015613531578551851683529483019491830191600101613513565b509098975050505050505050565b60006040828403121561355157600080fd5b6040516040810181811067ffffffffffffffff8211171561357457613574612d02565b604052825181526020928301519281019290925250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156135d0576135d061358e565b500190565b600060001982036135e8576135e861358e565b5060010190565b600060ff821660ff84168060ff0382111561360c5761360c61358e565b019392505050565b6000828210156136265761362661358e565b500390565b60006102c0820190506001600160a01b03808e16835263ffffffff808e166020850152808d1660408501528b606085015267ffffffffffffffff8b166080850152818a1660a08501528089511660c085015260ff60208a01511660e085015260ff60408a0151166101008501528060608a0151166101208501528060808a01511661014085015250506fffffffffffffffffffffffffffffffff60a0880151166101608301526136e76101808301876001600160a01b03169052565b84516001600160a01b039081166101a0840152602086015181166101c0840152604086015181166101e0840152606086015181166102008401526080860151811661022084015260a0860151811661024084015260c086015116610260830152836102808301526137646102a08301846001600160a01b03169052565b9c9b505050505050505050505050565b63ffffffff841681526001600160a01b03831660208201526060604082015260006134db60608301846130df565b60008160001904831182151516156137bc576137bc61358e565b500290565b600181815b808511156137fc5781600019048211156137e2576137e261358e565b808516156137ef57918102915b93841c93908002906137c6565b509250929050565b6000826138135750600161047b565b816138205750600061047b565b816001811461383657600281146138405761385c565b600191505061047b565b60ff8411156138515761385161358e565b50506001821b61047b565b5060208310610133831016604e8410600b841016171561387f575081810a61047b565b61388983836137c1565b806000190482111561389d5761389d61358e565b029392505050565b6000612b3b838361380456fea164736f6c634300080f000a"; + bytes internal constant acc46Code = + hex"608060405234801561001057600080fd5b50600436106100a35760003560e01c806378ecabce11610076578063b6a4cd211161005b578063b6a4cd21146101a4578063c993f27c146101b9578063cbeda5a7146101cc57600080fd5b806378ecabce1461012a578063b51f9c2b1461014d57600080fd5b80631d8a4e92146100a857806330e9012c146100c3578063318b1b80146100d85780635a4dab3314610103575b600080fd5b6100b06101df565b6040519081526020015b60405180910390f35b6100cb610268565b6040516100ba9190612be7565b6100eb6100e6366004612d4b565b61037c565b6040516001600160a01b0390911681526020016100ba565b6100eb7f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61013d610138366004612d4b565b6103f7565b60405190151581526020016100ba565b6101556104a2565b6040516100ba919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6101b76101b2366004612d79565b61054f565b005b6101b76101c7366004612d79565b6105a6565b6101b76101da366004612e43565b610742565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102639190612f20565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610358573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102639190612f44565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103eb9061309c565b60601c95945050505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049c91906130ec565b92915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561052b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610263919061310e565b806001600160a01b03163b6000036105a3576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b610685816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156105e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261060f9190810190613225565b610617610a2b565b600001516001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015610658573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106809190810190613225565b610b1b565b156106bc576040517f1b44701300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106c6610a2b565b90506000826001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072c9190613276565b905061073d81848460000151610b3e565b505050565b600061074c610a2b565b905060005b825181101561073d5761077c83828151811061076f5761076f613293565b6020026020010151610bc8565b600083828151811061079057610790613293565b6020026020010151600001516001600160a01b031663d6ae3cd56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd9190612f20565b9050600084838151811061081357610813613293565b6020026020010151600001516001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108809190613276565b905061095a816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108eb9190810190613225565b85600001516001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561092d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109559190810190613225565b610bd3565b15610994576040517fccc6ea860000000000000000000000000000000000000000000000000000000081526004810184905260240161059a565b6109b8848685815181106109aa576109aa613293565b602002602001015184610c4c565b306001600160a01b03168584815181106109d4576109d4613293565b6020026020010151600001516001600160a01b0316837f78bc67b9bf548ef6410becd31a3e10b9ea6c255974ef6b4530728b431df3003060405160405180910390a450508080610a23906132f1565b915050610751565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610358573d6000803e3d6000fd5b6000610b2783836114db565b80610b375750610b378383611527565b9392505050565b610b478161054f565b6040517f99a88ec40000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301528416906399a88ec490604401600060405180830381600087803b158015610bab57600080fd5b505af1158015610bbf573d6000803e3d6000fd5b50505050505050565b80516105a39061054f565b600080610bdf8461154d565b90506000610bec8461154d565b805183519192501180610c12575080518251148015610c12575080602001518260200151105b80610c43575080518251148015610c30575080602001518260200151145b8015610c43575080604001518260400151105b95945050505050565b600082600001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190613276565b9050610cc98184600001518660c00151610b3e565b600083600001516001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d319190613276565b9050610d3d60016103f7565b1561102a57610d5182828760800151610b3e565b6000816001600160a01b031663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db59190613276565b90506001600160a01b038116610f3f57610e128484610dd78860000151611719565b6040518060400160405280600f81526020017f4554484c6f636b626f782d553136610000000000000000000000000000000000815250611747565b60408051600180825281830190925291925060009190602080830190803683370190505090508281600081518110610e4c57610e4c613293565b60200260200101906001600160a01b031690816001600160a01b031681525050610eea84838960a00151896000015185604051602401610e8d92919061330b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f946d9204000000000000000000000000000000000000000000000000000000001790526117a5565b826001600160a01b031663bda204bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b50505050505b6000826001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa39190613276565b6040517f99a88ec40000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301528481166024830152919250908416906399a88ec490604401600060405180830381600087803b15801561100b57600080fd5b505af115801561101f573d6000803e3d6000fd5b505050505050611039565b61103982828760600151610b3e565b6110aa82826001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109f9190613276565b876101600151610b3e565b61111e8285600001516001600160a01b0316639b7d7f0a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190613276565b8760e00151610b3e565b600084600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611162573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111869190613276565b90506111988382886101400151610b3e565b600085600001516001600160a01b031663a39fac126040518163ffffffff1660e01b815260040160e060405180830381865afa1580156111dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112009190613366565b9050611216848260000151896101000151610b3e565b61122a848260400151896101200151610b3e565b61123d8482602001518960400151610b3e565b50600061124b826001611825565b905061127187868361125f868660016118af565b61126b878760016119ca565b8b611ab8565b600061127e836000611825565b90506001600160a01b038116156114d157600087600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f79190613276565b905060008060001b61130a8a6020015190565b036113205761131b82846000611c2f565b611326565b88602001515b905061134e8a898361133a898860006118af565b6113468a8960006119ca565b600088611d42565b600061135b866008611825565b60408b015190915015158061137857506001600160a01b03811615155b156114cd5760408a015160009061139a5761139584836008611c2f565b6113a0565b8a604001515b90506113c88c8b836113b48b8a60006118af565b6113c08c8b60006119ca565b60088a611d42565b6040517f6593dc6e000000000000000000000000000000000000000000000000000000008152600060048201819052906001600160a01b03861690636593dc6e90602401602060405180830381865afa158015611429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144d9190612f20565b6040517f1e33424000000000000000000000000000000000000000000000000000000000815260086004820152602481018290529091506001600160a01b03861690631e33424090604401600060405180830381600087803b1580156114b257600080fd5b505af11580156114c6573d6000803e3d6000fd5b5050505050505b5050505b5050505050505050565b6000806114e78461154d565b905060006114f48461154d565b8051835191925014801561150f575080602001518260200151145b8015610c435750604090810151910151149392505050565b600061153383836114db565b158015610b3757506115458383610bd3565b159392505050565b61157160405180606001604052806000815260200160008152602001600081525090565b60006115b2836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250611df5565b90506003815110156115f0576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061164b8260028151811061160857611608613293565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250611df5565b905060006116a88260008151811061166557611665613293565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250611df5565b905060405180606001604052806116d8856000815181106116cb576116cb613293565b6020026020010151611ea0565b81526020016116f3856001815181106116cb576116cb613293565b815260200161170e836000815181106116cb576116cb613293565b905295945050505050565b604080516001600160a01b0383166020820152606091015b6040516020818303038152906040529050919050565b600080611755868585611f18565b905061179b611762611f4e565b60200151828760405160200161178791906001600160a01b0391909116815260200190565b604051602081830303815290604052611fd7565b9695505050505050565b6117ae8261054f565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d906117f79086908690869060040161344a565b600060405180830381600087803b15801561181157600080fd5b505af11580156114d1573d6000803e3d6000fd5b6040517f1b685b9e00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526000906001600160a01b03841690631b685b9e90602401602060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b379190613276565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611917573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261193f9190810190613225565b905080516000036119b457836001600160a01b0316633fc8cef36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190613276565b915050610b37565b6119bd81612111565b6060015195945050505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611a32573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a5a9190810190613225565b90508051600003611aa357836001600160a01b0316635c0cba336040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b611aac81612111565b60400151915050610b37565b600081600001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b209190613276565b6020830151909150600090611b4257611b3b82876001611c2f565b9050611b49565b5060208201515b80611b80576040517fefc878f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000886101e0015190506000611c146040518060e00160405280611ba18690565b81526020018c6101a001516001600160a01b03168152602001886001600160a01b03168152602001896001600160a01b031681526020018b8152602001611bea878c6001612243565b6001600160a01b03168152602001611c04878c6001612331565b6001600160a01b0316905261241f565b9050611c238460018484612556565b50505050505050505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015611c97573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cbf9190810190613225565b90508051600003611d2c57836001600160a01b0316638d450a956040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190612f20565b6000611d3782612111565b519250610b37915050565b84611d79576040517fefc878f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000876101c0015190506000611ddc6040518060e00160405280611d9a8a90565b81526101a08c01516001600160a01b039081166020830152888116604083015289166060820152608081018b9052600060a0820181905260c09091015261241f565b9050611dea83858484612556565b505050505050505050565b60606000611e03848461259f565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114611e6b5760405182820380825286601f8201165b8b850181015183820152870180611e435750600082820160200152603f018616810160405284525b875160209490940193019050818310611e2657505050508091508251611e9957602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110611ec857505080611f125763101827966000526004601cfd5b50919050565b6000838383604051602001611f2f93929190613476565b6040516020818303038152906040528051906020012090509392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561052b573d6000803e3d6000fd5b600080612008856001600160a01b0316803b806020016040519081016040528181526000908060200190933c61266e565b805190915060ff161561204f5780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161059a565b602081015151156120925780602001516040517f57a0583500000000000000000000000000000000000000000000000000000000815260040161059a91906134a1565b60008160400151846040516020016120ab9291906134b4565b6040516020818303038152906040529050848151602083016000f592506001600160a01b038316612108576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152815160a4811480159061215e5750607c8114155b15612195576040517fbff6e41600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151604084015160548501516068860151607c870151606093841c9392831c929190911c906000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c88016121fb575050609c88015160b0890151606091821c911c5b6040805160e0810182529788526001600160a01b0396871660208901529486169487019490945291841660608601526080850152821660a08401521660c08201529392505050565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa1580156122ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122d39190810190613225565b9050805160000361231c57836001600160a01b031663a8e4fb906040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b61232581612111565b60a00151915050610b37565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260009081906001600160a01b038616906374cc86ac90602401600060405180830381865afa158015612399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123c19190810190613225565b9050805160000361240a57836001600160a01b031663534db0e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b61241381612111565b60c00151915050610b37565b60a08101516060906001600160a01b0316158015612448575060c08201516001600160a01b0316155b156124bf57815160208084015160408086015160608701516080880151925161173196959293919201948552606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602087015292841b83166034860152921b166048830152605c820152607c0190565b8151602080840151604080860151606080880151608089015160a08a015160c08b01518651988901999099527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000096841b87169588019590955292821b85166054870152811b84166068860152607c85019190915290811b8216609c8401529290921b90911660b082015260c401611731565b919050565b6040517fb10709570000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063b1070957906117f7908690869086906004016134e3565b6060825182518181116126665760208501945060208401935060206040510192508460018284880103016000602084106125d857508286205b601f841660200360031b87515b8951818118831c61263a5783156126185783878c20146126185760018b019a50848b106126125750612649565b506125e5565b858b03895299860199602090980197861561263a57848b106126125750612649565b5060018a019950838a106125e5575b505060408051601f198189030160051c8152602090970190525050505b505092915050565b6126956040518060600160405280600060ff16815260200160608152602001606081525090565b6002825110806126ff5750816000815181106126b3576126b3613293565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b8061276457508160018151811061271857612718613293565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b1561279b576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002836002815181106127b2576127b2613293565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c90506000836002815181106127e2576127e2613293565b60209101015160f81c6003908116915081900361282b576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156129175760008260ff1667ffffffffffffffff81111561285457612854612d96565b6040519080825280601f01601f19166020018201604052801561287e576020820181803683370190505b50905060005b8360ff16811015612909578661289b826003613511565b815181106128ab576128ab613293565b602001015160f81c60f81b8282815181106128c8576128c8613293565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612901816132f1565b915050612884565b5061291381612b2d565b9150505b60008167ffffffffffffffff81111561293257612932612d96565b6040519080825280601f01601f19166020018201604052801561295c576020820181803683370190505b50905060ff831615612a01576000612975846003613529565b60ff16905060005b838110156129fe57876129908284613511565b815181106129a0576129a0613293565b602001015160f81c60f81b8382815181106129bd576129bd613293565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806129f6816132f1565b91505061297d565b50505b600082612a0f856003613529565b60ff16612a1c9190613511565b90506000818851612a2d919061354e565b905080600003612a69576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612a8457612a84612d96565b6040519080825280601f01601f191660200182016040528015612aae576020820181803683370190505b50905060008360208b0101602083018481868460045afa9250505080612b00576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6000602082511115612b6b576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8351811015611e9957612b83816001613511565b8451612b8f919061354e565b612b9a906008613565565b612ba5906002613668565b848281518110612bb757612bb7613293565b0160200151612bc9919060f81c613565565b612bd39083613511565b915080612bdf816132f1565b915050612b6f565b81516001600160a01b0316815261024081016020830151612c1360208401826001600160a01b03169052565b506040830151612c2e60408401826001600160a01b03169052565b506060830151612c4960608401826001600160a01b03169052565b506080830151612c6460808401826001600160a01b03169052565b5060a0830151612c7f60a08401826001600160a01b03169052565b5060c0830151612c9a60c08401826001600160a01b03169052565b5060e0830151612cb560e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501519182168185015290612666565b600060208284031215612d5d57600080fd5b5035919050565b6001600160a01b03811681146105a357600080fd5b600060208284031215612d8b57600080fd5b8135610b3781612d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715612de857612de8612d96565b60405290565b604051610240810167ffffffffffffffff81118282101715612de857612de8612d96565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e3b57612e3b612d96565b604052919050565b60006020808385031215612e5657600080fd5b823567ffffffffffffffff80821115612e6e57600080fd5b818501915085601f830112612e8257600080fd5b813581811115612e9457612e94612d96565b612ea2848260051b01612e12565b81815284810192506060918202840185019188831115612ec157600080fd5b938501935b82851015612f145780858a031215612ede5760008081fd5b612ee6612dc5565b8535612ef181612d64565b815285870135878201526040808701359082015284529384019392850192612ec6565b50979650505050505050565b600060208284031215612f3257600080fd5b5051919050565b805161255181612d64565b60006102408284031215612f5757600080fd5b612f5f612dee565b612f6883612f39565b8152612f7660208401612f39565b6020820152612f8760408401612f39565b6040820152612f9860608401612f39565b6060820152612fa960808401612f39565b6080820152612fba60a08401612f39565b60a0820152612fcb60c08401612f39565b60c0820152612fdc60e08401612f39565b60e0820152610100612fef818501612f39565b90820152610120613001848201612f39565b90820152610140613013848201612f39565b90820152610160613025848201612f39565b90820152610180613037848201612f39565b908201526101a0613049848201612f39565b908201526101c061305b848201612f39565b908201526101e061306d848201612f39565b9082015261020061307f848201612f39565b90820152610220613091848201612f39565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156130e45780818460140360031b1b83161693505b505050919050565b6000602082840312156130fe57600080fd5b81518015158114610b3757600080fd5b600060a0828403121561312057600080fd5b60405160a0810181811067ffffffffffffffff8211171561314357613143612d96565b604052825161315181612d64565b8152602083015161316181612d64565b6020820152604083015161317481612d64565b6040820152606083015161318781612d64565b6060820152608083015161319a81612d64565b60808201529392505050565b60005b838110156131c15781810151838201526020016131a9565b838111156131d0576000848401525b50505050565b600067ffffffffffffffff8311156131f0576131f0612d96565b6132036020601f19601f86011601612e12565b905082815283838301111561321757600080fd5b610b378360208301846131a6565b60006020828403121561323757600080fd5b815167ffffffffffffffff81111561324e57600080fd5b8201601f8101841361325f57600080fd5b61326e848251602084016131d6565b949350505050565b60006020828403121561328857600080fd5b8151610b3781612d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006000198203613304576133046132c2565b5060010190565b6000604082016001600160a01b0380861684526020604081860152828651808552606087019150828801945060005b8181101561335857855185168352948301949183019160010161333a565b509098975050505050505050565b600060e0828403121561337857600080fd5b60405160e0810181811067ffffffffffffffff8211171561339b5761339b612d96565b60405282516133a981612d64565b815260208301516133b981612d64565b602082015260408301516133cc81612d64565b604082015260608301516133df81612d64565b60608201526133f060808401612f39565b608082015261340160a08401612f39565b60a082015261341260c08401612f39565b60c08201529392505050565b600081518084526134368160208601602086016131a6565b601f01601f19169290920160200192915050565b60006001600160a01b03808616835280851660208401525060606040830152610c43606083018461341e565b83815260606020820152600061348f606083018561341e565b828103604084015261179b818561341e565b602081526000610b37602083018461341e565b600083516134c68184602088016131a6565b8351908301906134da8183602088016131a6565b01949350505050565b63ffffffff841681526001600160a01b0383166020820152606060408201526000610c43606083018461341e565b60008219821115613524576135246132c2565b500190565b600060ff821660ff84168060ff03821115613546576135466132c2565b019392505050565b600082821015613560576135606132c2565b500390565b600081600019048311821515161561357f5761357f6132c2565b500290565b600181815b808511156135bf5781600019048211156135a5576135a56132c2565b808516156135b257918102915b93841c9390800290613589565b509250929050565b6000826135d65750600161049c565b816135e35750600061049c565b81600181146135f957600281146136035761361f565b600191505061049c565b60ff841115613614576136146132c2565b50506001821b61049c565b5060208310610133831016604e8410600b8410161715613642575081810a61049c565b61364c8383613584565b8060001904821115613660576136606132c2565b029392505050565b6000610b3783836135c756fea164736f6c634300080f000a"; + bytes internal constant acc47Code = + hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635a4dab331161005b5780635a4dab33146100fd57806378ecabce14610124578063b51f9c2b14610147578063b6a4cd211461019e57600080fd5b80631d8a4e921461008d57806330e9012c146100a8578063318b1b80146100bd57806358084273146100e8575b600080fd5b6100956101b1565b6040519081526020015b60405180910390f35b6100b061023a565b60405161009f919061241a565b6100d06100cb36600461257d565b61034e565b6040516001600160a01b03909116815260200161009f565b6100fb6100f6366004612596565b6103c9565b005b6100d07f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b81565b61013761013236600461257d565b61172e565b604051901515815260200161009f565b61014f6117d9565b60405161009f919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6100fb6101ac3660046125ee565b611886565b60007f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610211573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610235919061260b565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa15801561032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023591906126af565b604080516020808201849052825180830382018152828401845280519101206000606083018190527fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082166061840152835160548185030181526074909301909352829181906103bd90612807565b60601c95945050505050565b60006103d9610140830183612857565b60008181106103ea576103ea6128c5565b61040092602060609092020190810191506125ee565b6001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561043d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046191906128f4565b905060005b610474610140840184612857565b905081101561073e57816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df91906128f4565b6001600160a01b03166104f6610140850185612857565b83818110610506576105066128c5565b61051c92602060609092020190810191506125ee565b6001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057d91906128f4565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de91906128f4565b6001600160a01b03161461061e576040517f513c07ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61064d61062f610140850185612857565b6000818110610640576106406128c5565b9050606002016020013590565b61066e61065e610140860186612857565b84818110610640576106406128c5565b146106a5576040517fa9ef3a7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d46106b6610140850185612857565b60008181106106c7576106c76128c5565b9050606002016040013590565b6106f56106e5610140860186612857565b848181106106c7576106c76128c5565b1461072c576040517fa9ef3a7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061073681612940565b915050610466565b50600061075261062f610140850185612857565b03610789576040517fefc878f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610799610140840184612857565b905067ffffffffffffffff8111156107b3576107b3612624565b6040519080825280602002602001820160405280156107dc578160200160208202803683370190505b50905060005b6107f0610140850185612857565b90508110156108ca57610807610140850185612857565b82818110610817576108176128c5565b61082d92602060609092020190810191506125ee565b6001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088e91906128f4565b8282815181106108a0576108a06128c5565b6001600160a01b0390921660209283029190910190910152806108c281612940565b9150506107e2565b5060005b8151811015610a2957816000815181106108ea576108ea6128c5565b60200260200101516001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095391906128f4565b6001600160a01b031682828151811061096e5761096e6128c5565b60200260200101516001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d791906128f4565b6001600160a01b031614610a17576040517f8db2d5e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610a2181612940565b9150506108ce565b506000826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e91906128f4565b90506000610b0f4285610ad4610aa86101408a018a612857565b6000818110610ab957610ab96128c5565b610acf92602060609092020190810191506125ee565b6118dd565b6040518060400160405280601281526020017f4554484c6f636b626f782d496e7465726f70000000000000000000000000000081525061190b565b905082610c0e8583610b1f611969565b60a0015187600081518110610b3657610b366128c5565b60200260200101516001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f91906128f4565b85604051602401610bb192919061295a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f946d920400000000000000000000000000000000000000000000000000000000179052611a59565b506000610c624286610c27610aa86101408b018b612857565b6040518060400160405280601a81526020017f4469737075746547616d65466163746f72792d496e7465726f7000000000000081525061190b565b9050610ce98582610c71611969565b61014001516040516001600160a01b03881660248201526044015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052611a59565b6000610d3c4287610d01610aa86101408c018c612857565b6040518060400160405280601b81526020017f416e63686f72537461746552656769737472792d496e7465726f70000000000081525061190b565b90506000610d4d60208901896129c3565b15610d5a57506004610d5e565b5060055b610e868783610d6b611969565b610160015189600081518110610d8357610d836128c5565b60200260200101516001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906128f4565b604080516001600160a01b039283166024820152918916604483015260208e013560648301528d0135608482015263ffffffff861660a482015260c40160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f47a222c500000000000000000000000000000000000000000000000000000000179052611a59565b60005b865181101561116b576000878281518110610ea657610ea66128c5565b60200260200101516001600160a01b031663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0f91906128f4565b6040517f5ec15d890000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015291925090871690635ec15d8990602401600060405180830381600087803b158015610f6f57600080fd5b505af1158015610f83573d6000803e3d6000fd5b50506040517f438ab5ac0000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528416925063438ab5ac9150602401600060405180830381600087803b158015610fe357600080fd5b505af1158015610ff7573d6000803e3d6000fd5b50505050600088838151811061100f5761100f6128c5565b60200260200101516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107891906128f4565b9050611085816000611ad9565b611090816004611ad9565b61109b816001611ad9565b6110a6816005611ad9565b6110b1816008611ad9565b6110bc816009611ad9565b8883815181106110ce576110ce6128c5565b60209081029190910101516040517f2152f2be0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152878116602483015290911690632152f2be90604401600060405180830381600087803b15801561113e57600080fd5b505af1158015611152573d6000803e3d6000fd5b505050505050808061116390612940565b915050610e89565b5060006111bf4289611184610aa86101408e018e612857565b6040518060400160405280602081526020017f44656c61796564574554482d496e7465726f702d5065726d697373696f6e656481525061190b565b905061126a88826111ce611969565b61018001518a6000815181106111e6576111e66128c5565b60200260200101516001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124f91906128f4565b6040516001600160a01b039091166024820152604401610c8c565b60006113176040518060e0016040528061128e8d80610140019061062f9190612857565b815260200161129b611969565b6101a001516001600160a01b03168152602001866001600160a01b03168152602001846001600160a01b03168152602001600081526020018c60600160000160208101906112e991906125ee565b6001600160a01b0316815260200161130760a08e0160808f016125ee565b6001600160a01b03169052611b6a565b9050846001600160a01b031663b1070957600561133261023a565b6102200151846040518463ffffffff1660e01b815260040161135693929190612a3c565b600060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b50506040517f1e3342400000000000000000000000000000000000000000000000000000000081526005600482015260e08d013560248201526001600160a01b0388169250631e3342409150604401600060405180830381600087803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b506114179450505060208b0191508a90506129c3565b156117245760006114524289611434610aa86101408e018e612857565b604051806060016040528060228152602001612d4c6022913961190b565b905061146188826111ce611969565b60006114ce6040518060e001604052806114858d80610140019061062f9190612857565b8152602001611492611969565b6101a001516001600160a01b0390811682528781166020830152851660408201526000606082018190526080820181905260a090910152611b6a565b9050846001600160a01b031663b107095760046114e961023a565b6102000151846040518463ffffffff1660e01b815260040161150d93929190612a3c565b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b50506040517f1e33424000000000000000000000000000000000000000000000000000000000815260048082015260e08d013560248201526001600160a01b0388169250631e3342409150604401600060405180830381600087803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b5050505060006115d18b8061014001906106b69190612857565b90508015611720576116316040518060e001604052808381526020016115f5611969565b6101a001516001600160a01b0390811682528881166020830152861660408201526000606082018190526080820181905260a090910152611b6a565b9150856001600160a01b031663b1070957600961164c61023a565b6102000151856040518463ffffffff1660e01b815260040161167093929190612a3c565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b50506040517f1e3342400000000000000000000000000000000000000000000000000000000081526009600482015260e08e013560248201526001600160a01b0389169250631e3342409150604401600060405180830381600087803b15801561170757600080fd5b505af115801561171b573d6000803e3d6000fd5b505050505b5050505b5050505050505050565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b0316906378ecabce90602401602060405180830381865afa1580156117af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d39190612a73565b92915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000015ddc82a2aaa23d6f631dec6a61949cb5cbf272b6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102359190612a90565b806001600160a01b03163b6000036118da576040517f86bb51b80000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b50565b604080516001600160a01b0383166020820152606091015b6040516020818303038152906040529050919050565b600080611919868585611ca1565b905061195f611926611cd7565b60200151828760405160200161194b91906001600160a01b0391909116815260200190565b604051602081830303815290604052611d60565b9695505050505050565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa15801561032a573d6000803e3d6000fd5b611a6282611886565b6040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690639623609d90611aab90869086908690600401612b4f565b600060405180830381600087803b158015611ac557600080fd5b505af1158015611724573d6000803e3d6000fd5b6040517fb107095700000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526000602482018190526060604483015260648201526001600160a01b0383169063b107095790608401600060405180830381600087803b158015611b4e57600080fd5b505af1158015611b62573d6000803e3d6000fd5b505050505050565b60a08101516060906001600160a01b0316158015611b93575060c08201516001600160a01b0316155b15611c0a5781516020808401516040808601516060870151608088015192516118f596959293919201948552606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602087015292841b83166034860152921b166048830152605c820152607c0190565b8151602080840151604080860151606080880151608089015160a08a015160c08b01518651988901999099527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000096841b87169588019590955292821b85166054870152811b84166068860152607c85019190915290811b8216609c8401529290921b90911660b082015260c4016118f5565b919050565b6000838383604051602001611cb893929190612b7b565b6040516020818303038152906040528051906020012090509392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611862573d6000803e3d6000fd5b600080611d91856001600160a01b0316803b806020016040519081016040528181526000908060200190933c611e9a565b805190915060ff1615611dd85780516040517f1a66c69200000000000000000000000000000000000000000000000000000000815260ff90911660048201526024016118d1565b60208101515115611e1b5780602001516040517f57a058350000000000000000000000000000000000000000000000000000000081526004016118d19190612ba6565b6000816040015184604051602001611e34929190612bb9565b6040516020818303038152906040529050848151602083016000f592506001600160a01b038316611e91576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509392505050565b611ec16040518060600160405280600060ff16815260200160608152602001606081525090565b600282511080611f2b575081600081518110611edf57611edf6128c5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167ffe0000000000000000000000000000000000000000000000000000000000000014155b80611f90575081600181518110611f4457611f446128c5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f710000000000000000000000000000000000000000000000000000000000000014155b15611fc7576040517f31f56e1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283600281518110611fde57611fde6128c5565b602001015160f81c60f81b60fc60f81b1660f81c60ff16901c905060008360028151811061200e5761200e6128c5565b60209101015160f81c60039081169150819003612057576040517fb214675a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff8216156121435760008260ff1667ffffffffffffffff81111561208057612080612624565b6040519080825280601f01601f1916602001820160405280156120aa576020820181803683370190505b50905060005b8360ff1681101561213557866120c7826003612be8565b815181106120d7576120d76128c5565b602001015160f81c60f81b8282815181106120f4576120f46128c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061212d81612940565b9150506120b0565b5061213f81612359565b9150505b60008167ffffffffffffffff81111561215e5761215e612624565b6040519080825280601f01601f191660200182016040528015612188576020820181803683370190505b50905060ff83161561222d5760006121a1846003612c00565b60ff16905060005b8381101561222a57876121bc8284612be8565b815181106121cc576121cc6128c5565b602001015160f81c60f81b8382815181106121e9576121e96128c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061222281612940565b9150506121a9565b50505b60008261223b856003612c00565b60ff166122489190612be8565b905060008188516122599190612c25565b905080600003612295576040517f028512d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156122b0576122b0612624565b6040519080825280601f01601f1916602001820160405280156122da576020820181803683370190505b50905060008360208b0101602083018481868460045afa925050508061232c576040517ff7046f3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052808960ff1681526020018681526020018381525098505050505050505050919050565b6000602082511115612397576040517f5623dc1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8351811015612413576123af816001612be8565b84516123bb9190612c25565b6123c6906008612c3c565b6123d1906002612d3f565b8482815181106123e3576123e36128c5565b01602001516123f5919060f81c612c3c565b6123ff9083612be8565b91508061240b81612940565b91505061239b565b5092915050565b81516001600160a01b031681526102408101602083015161244660208401826001600160a01b03169052565b50604083015161246160408401826001600160a01b03169052565b50606083015161247c60608401826001600160a01b03169052565b50608083015161249760808401826001600160a01b03169052565b5060a08301516124b260a08401826001600160a01b03169052565b5060c08301516124cd60c08401826001600160a01b03169052565b5060e08301516124e860e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102209384015116929091019190915290565b60006020828403121561258f57600080fd5b5035919050565b6000602082840312156125a857600080fd5b813567ffffffffffffffff8111156125bf57600080fd5b820161016081850312156125d257600080fd5b9392505050565b6001600160a01b03811681146118da57600080fd5b60006020828403121561260057600080fd5b81356125d2816125d9565b60006020828403121561261d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610240810167ffffffffffffffff8111828210171561269e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b8051611c9c816125d9565b600061024082840312156126c257600080fd5b6126ca612653565b6126d3836126a4565b81526126e1602084016126a4565b60208201526126f2604084016126a4565b6040820152612703606084016126a4565b6060820152612714608084016126a4565b608082015261272560a084016126a4565b60a082015261273660c084016126a4565b60c082015261274760e084016126a4565b60e082015261010061275a8185016126a4565b9082015261012061276c8482016126a4565b9082015261014061277e8482016126a4565b908201526101606127908482016126a4565b908201526101806127a28482016126a4565b908201526101a06127b48482016126a4565b908201526101c06127c68482016126a4565b908201526101e06127d88482016126a4565b908201526102006127ea8482016126a4565b908201526102206127fc8482016126a4565b908201529392505050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008082169350601483101561284f5780818460140360031b1b83161693505b505050919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261288c57600080fd5b83018035915067ffffffffffffffff8211156128a757600080fd5b60200191506060810236038213156128be57600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561290657600080fd5b81516125d2816125d9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000600019820361295357612953612911565b5060010190565b6000604082016001600160a01b0380861684526020604081860152828651808552606087019150828801945060005b818110156129a7578551851683529483019491830191600101612989565b509098975050505050505050565b80151581146118da57600080fd5b6000602082840312156129d557600080fd5b81356125d2816129b5565b60005b838110156129fb5781810151838201526020016129e3565b83811115612a0a576000848401525b50505050565b60008151808452612a288160208601602086016129e0565b601f01601f19169290920160200192915050565b63ffffffff841681526001600160a01b0383166020820152606060408201526000612a6a6060830184612a10565b95945050505050565b600060208284031215612a8557600080fd5b81516125d2816129b5565b600060a08284031215612aa257600080fd5b60405160a0810181811067ffffffffffffffff82111715612aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251612afa816125d9565b81526020830151612b0a816125d9565b60208201526040830151612b1d816125d9565b60408201526060830151612b30816125d9565b60608201526080830151612b43816125d9565b60808201529392505050565b60006001600160a01b03808616835280851660208401525060606040830152612a6a6060830184612a10565b838152606060208201526000612b946060830185612a10565b828103604084015261195f8185612a10565b6020815260006125d26020830184612a10565b60008351612bcb8184602088016129e0565b835190830190612bdf8183602088016129e0565b01949350505050565b60008219821115612bfb57612bfb612911565b500190565b600060ff821660ff84168060ff03821115612c1d57612c1d612911565b019392505050565b600082821015612c3757612c37612911565b500390565b6000816000190483118215151615612c5657612c56612911565b500290565b600181815b80851115612c96578160001904821115612c7c57612c7c612911565b80851615612c8957918102915b93841c9390800290612c60565b509250929050565b600082612cad575060016117d3565b81612cba575060006117d3565b8160018114612cd05760028114612cda57612cf6565b60019150506117d3565b60ff841115612ceb57612ceb612911565b50506001821b6117d3565b5060208310610133831016604e8410600b8410161715612d19575081810a6117d3565b612d238383612c5b565b8060001904821115612d3757612d37612911565b029392505050565b60006125d28383612c9e56fe44656c61796564574554482d496e7465726f702d5065726d697373696f6e6c657373a164736f6c634300080f000a"; + bytes internal constant acc48Code = + hex"608060405234801561001057600080fd5b50600436106101a35760003560e01c80637d8bd0d8116100ee578063bb98b3f411610097578063dea2198411610071578063dea21984146103ae578063e303272c146103c1578063e3fef4a8146103d4578063f3edcbe1146103e757600080fd5b8063bb98b3f414610375578063bc3f6fd414610388578063c34e047a1461039b57600080fd5b8063a38d5595116100c8578063a38d559514610316578063a4dec37a14610329578063ad7e7e401461033c57600080fd5b80637d8bd0d8146102dd5780638970ac44146102f057806398ccec3e1461030357600080fd5b806354fd4d5011610150578063718394181161012a57806371839418146102ae57806374459cf3146102b75780637b491a98146102ca57600080fd5b806354fd4d501461024c57806358256afb146102885780636c0e21701461029b57600080fd5b806335e80ab31161018157806335e80ab31461021357806341fe538514610226578063534db0e21461023957600080fd5b80630e9d5cb9146101a85780631d8a4e92146101d15780632aecd35c146101e8575b600080fd5b6101bb6101b6366004614888565b6103fa565b6040516101c891906148ff565b60405180910390f35b6101da60125481565b6040519081526020016101c8565b600d546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020016101c8565b6000546101fb906001600160a01b031681565b6101bb610234366004614932565b61047b565b6002546101fb906001600160a01b031681565b6101bb6040518060400160405280600581526020017f322e332e3100000000000000000000000000000000000000000000000000000081525081565b600a546101fb906001600160a01b031681565b6006546101fb906001600160a01b031681565b6101da60035481565b600e546101fb906001600160a01b031681565b6007546101fb906001600160a01b031681565b6004546101fb906001600160a01b031681565b6101bb6102fe3660046149ed565b6104f8565b6011546101fb906001600160a01b031681565b6005546101fb906001600160a01b031681565b6001546101fb906001600160a01b031681565b60408051808201909152600581527f312e312e3500000000000000000000000000000000000000000000000000000060208201526101bb565b600c546101fb906001600160a01b031681565b6008546101fb906001600160a01b031681565b600b546101fb906001600160a01b031681565b6010546101fb906001600160a01b031681565b600f546101fb906001600160a01b031681565b6009546101fb906001600160a01b031681565b6101bb6103f5366004614a2c565b6107a5565b6040805160a0808201835260008083526020808401829052838501829052606084810183905260809485018390528551938401865288516001600160a01b039081168552828a015192850192909252838601839052948801518386015287850151169282019290925290506104708185856104f8565b9150505b9392505050565b6040805160a0808201835260008083526020808401829052838501829052606084810183905260809485018390528551938401865287516001600160a01b0390811685528289015192850192909252838601839052948701518386015286850151169282019290925290506104f081846107a5565b949350505050565b60606000604051806020016040528060008152509050600085600001516001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105769190614a59565b9050610581826107da565b915061058e8282866108aa565b915061059f82876000015183610977565b91506105b08287600001518361103c565b91506105c1828760000151836115f0565b91506105d282876000015183611b9a565b91506105e382876000015183611e99565b91506105f482876000015183612443565b915061060682876000015183876128ec565b915061062782876000015188602001518960600151858b608001518a612b39565b915061067b828760000151600089602001518a60600151868a6040518060400160405280600481526020017f504c444700000000000000000000000000000000000000000000000000000000815250612d3d565b91506106cf828760000151600889604001518a60600151868a6040518060400160405280600481526020017f434b444700000000000000000000000000000000000000000000000000000000815250612d3d565b91506106e082876000015183612e47565b915060006106ed85613263565b805190915083901561072c57835115610729578184604051602001610713929190614a76565b604051602081830303815290604052905061072c565b50805b6000845111801561073b575086155b1561079a57806040516020016107519190614ace565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610791916004016148ff565b60405180910390fd5b979650505050505050565b60606104748383604051806040016040528060006001600160a01b0316815260200160006001600160a01b03168152506104f8565b600080546040517f2e48152c00000000000000000000000000000000000000000000000000000000815260048101929092526060916108a4916001600160a01b031690632e48152c90602401602060405180830381865afa158015610843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108679190614b39565b156040518060400160405280600981526020017f5350524346472d3130000000000000000000000000000000000000000000000081525084613300565b92915050565b606060006108b78361334c565b905061096e816001600160a01b0316856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109289190614a59565b6001600160a01b0316146040518060400160405280600981526020017f50524f5859412d3130000000000000000000000000000000000000000000000081525087613300565b95945050505050565b60606109ef6109b361098885613375565b60085461099d906001600160a01b0316613375565b8051602091820120825192909101919091201490565b6040518060400160405280600981526020017f535953434f4e2d3130000000000000000000000000000000000000000000000081525086613300565b9350610aad631dcd650067ffffffffffffffff16846001600160a01b031663f68016b76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a659190614b6c565b67ffffffffffffffff1611156040518060400160405280600981526020017f535953434f4e2d3230000000000000000000000000000000000000000000000081525086613300565b9350610b54836001600160a01b031663f45e65d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190614b89565b600014156040518060400160405280600981526020017f535953434f4e2d3330000000000000000000000000000000000000000000000081525086613300565b600854909450610bb7906001600160a01b0316610b7184866133dd565b6001600160a01b0316146040518060400160405280600981526020017f535953434f4e2d3430000000000000000000000000000000000000000000000081525086613300565b93506000836001600160a01b031663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d9190614bcc565b9050610c6f816000015163ffffffff166301312d00146040518060400160405280600981526020017f535953434f4e2d3530000000000000000000000000000000000000000000000081525087613300565b9450610cbb816020015160ff16600a146040518060400160405280600981526020017f535953434f4e2d3630000000000000000000000000000000000000000000000081525087613300565b9450610d07816040015160ff166008146040518060400160405280600981526020017f535953434f4e2d3730000000000000000000000000000000000000000000000081525087613300565b9450610d58816080015163ffffffff16620f4240146040518060400160405280600981526020017f535953434f4e2d3830000000000000000000000000000000000000000000000081525087613300565b9450610daa816060015163ffffffff16633b9aca00146040518060400160405280600981526020017f535953434f4e2d3930000000000000000000000000000000000000000000000081525087613300565b9450610e166fffffffffffffffffffffffffffffffff80168260a001516fffffffffffffffffffffffffffffffff16146040518060400160405280600a81526020017f535953434f4e2d3130300000000000000000000000000000000000000000000081525087613300565b9450610ec2846001600160a01b0316634d5d9a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7d9190614c82565b63ffffffff166000146040518060400160405280600a81526020017f535953434f4e2d3131300000000000000000000000000000000000000000000081525087613300565b9450610f72846001600160a01b03166316d3bc7f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190614b6c565b67ffffffffffffffff166000146040518060400160405280600a81526020017f535953434f4e2d3132300000000000000000000000000000000000000000000081525087613300565b945061096e60008054906101000a90046001600160a01b03166001600160a01b0316856001600160a01b03166335e80ab36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff69190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f535953434f4e2d3133300000000000000000000000000000000000000000000081525087613300565b60606000836001600160a01b031663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a29190614a59565b90506111046110c86110b383613375565b600a5461099d906001600160a01b0316613375565b6040518060400160405280600881526020017f4c3178444d2d313000000000000000000000000000000000000000000000000081525087613300565b600a54909550611167906001600160a01b031661112185846133dd565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d323000000000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cd9190614a59565b90506112987342000000000000000000000000000000000000076001600160a01b0316836001600160a01b0316639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112529190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d333000000000000000000000000000000000000000000000000081525088613300565b95506113637342000000000000000000000000000000000000076001600160a01b0316836001600160a01b031663db505d806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131d9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d343000000000000000000000000000000000000000000000000081525088613300565b955061141a816001600160a01b0316836001600160a01b0316630ff754ea6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d49190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d353000000000000000000000000000000000000000000000000081525088613300565b95506114d1816001600160a01b0316836001600160a01b0316636425666b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148b9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d363000000000000000000000000000000000000000000000000081525088613300565b9550611588856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d373000000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b03166115a084613464565b6001600160a01b0316146040518060400160405280600881526020017f4c3178444d2d383000000000000000000000000000000000000000000000000081525088613300565b9695505050505050565b60606000836001600160a01b031663078f29cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611632573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116569190614a59565b90506116b861167c61166783613375565b600b5461099d906001600160a01b0316613375565b6040518060400160405280600781526020017f4c3153422d31300000000000000000000000000000000000000000000000000081525087613300565b600b5490955061171b906001600160a01b03166116d585846133dd565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d32300000000000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b031663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190614a59565b9050611838816001600160a01b0316836001600160a01b031663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f29190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d33300000000000000000000000000000000000000000000000000081525088613300565b95506118ef816001600160a01b0316836001600160a01b0316633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a99190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d34300000000000000000000000000000000000000000000000000081525088613300565b95506119ba7342000000000000000000000000000000000000106001600160a01b0316836001600160a01b0316637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119749190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d35300000000000000000000000000000000000000000000000000081525088613300565b9550611a857342000000000000000000000000000000000000106001600160a01b0316836001600160a01b031663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3f9190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d36300000000000000000000000000000000000000000000000000081525088613300565b9550611b3c856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af69190614a59565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d37300000000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b0316611b5484613464565b6001600160a01b0316146040518060400160405280600781526020017f4c3153422d38300000000000000000000000000000000000000000000000000081525088613300565b60606000836001600160a01b0316639b7d7f0a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190614a59565b9050611c62611c26611c1183613375565b60095461099d906001600160a01b0316613375565b6040518060400160405280600a81526020017f4d4552433230462d31300000000000000000000000000000000000000000000081525087613300565b600954909550611cc5906001600160a01b0316611c7f85846133dd565b6001600160a01b0316146040518060400160405280600a81526020017f4d4552433230462d32300000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b031663078f29cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b9190614a59565b9050611de2816001600160a01b0316836001600160a01b031663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c9190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f4d4552433230462d33300000000000000000000000000000000000000000000081525088613300565b95506115e6816001600160a01b0316836001600160a01b031663e78cea926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e539190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f4d4552433230462d34300000000000000000000000000000000000000000000081525088613300565b60606000836001600160a01b031663c4e8ddfa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eff9190614a59565b9050611f61611f25611f1083613375565b60045461099d906001600160a01b0316613375565b6040518060400160405280600881526020017f4c373231422d313000000000000000000000000000000000000000000000000081525087613300565b600454909550611fc4906001600160a01b0316611f7e85846133dd565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d323000000000000000000000000000000000000000000000000081525087613300565b94506000846001600160a01b031663a71198696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a9190614a59565b90506120f57342000000000000000000000000000000000000146001600160a01b0316836001600160a01b0316637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561208b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120af9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d333000000000000000000000000000000000000000000000000081525088613300565b95506121c07342000000000000000000000000000000000000146001600160a01b0316836001600160a01b031663c89701a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217a9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d343000000000000000000000000000000000000000000000000081525088613300565b9550612277816001600160a01b0316836001600160a01b031663927ede2d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561220d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122319190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d353000000000000000000000000000000000000000000000000081525088613300565b955061232e816001600160a01b0316836001600160a01b0316633cb747bf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e89190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d363000000000000000000000000000000000000000000000000081525088613300565b95506123e5856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561237b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239f9190614a59565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d373000000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b03166123fd84613464565b6001600160a01b0316146040518060400160405280600881526020017f4c373231422d383000000000000000000000000000000000000000000000000081525088613300565b60606000836001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a99190614a59565b90506124bb601254600160001b6134c8565b156125bf576125556125196124cf83613375565b6006546124e4906001600160a01b0316613375565b6040516020016124f49190614c9d565b6040516020818303038152906040528051602091820120825192909101919091201490565b6040518060400160405280600981526020017f504f5254414c2d3130000000000000000000000000000000000000000000000081525087613300565b6006549095506125b8906001600160a01b031661257285846133dd565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3230000000000000000000000000000000000000000000000081525087613300565b9450612603565b6125e36125196125ce83613375565b60055461099d906001600160a01b0316613375565b600554909550612600906001600160a01b031661257285846133dd565b94505b6000846001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015612643573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126679190614a59565b905061271e816001600160a01b0316836001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d89190614a59565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3330000000000000000000000000000000000000000000000081525088613300565b95506127d5856001600160a01b0316836001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561276b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278f9190614a59565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3430000000000000000000000000000000000000000000000081525088613300565b955061288e61dead6001600160a01b0316836001600160a01b0316639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128489190614a59565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3830000000000000000000000000000000000000000000000081525088613300565b95506115e6846001600160a01b03166128a684613464565b6001600160a01b0316146040518060400160405280600981526020017f504f5254414c2d3930000000000000000000000000000000000000000000000081525088613300565b606060006128f98361334c565b90506000856001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561293b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295f9190614a59565b90506129c161298561297083613375565b600c5461099d906001600160a01b0316613375565b6040518060400160405280600581526020017f44462d313000000000000000000000000000000000000000000000000000000081525089613300565b600c54909750612a24906001600160a01b03166129de87846133dd565b6001600160a01b0316146040518060400160405280600581526020017f44462d323000000000000000000000000000000000000000000000000000000081525089613300565b9650612adb826001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a959190614a59565b6001600160a01b0316146040518060400160405280600581526020017f44462d333000000000000000000000000000000000000000000000000000000081525089613300565b965061079a856001600160a01b0316612af383613464565b6001600160a01b0316146040518060400160405280600581526020017f44462d343000000000000000000000000000000000000000000000000000000081525089613300565b604080518082018252600481527f504444470000000000000000000000000000000000000000000000000000000060208083019190915282516101c081018452600080825291810182905292830181905260608084018290526080840182905260a0840182905260c0840182905260e08401829052610100840182905261012084018290526101408401829052610160840182905261018084018290526101a084018290529260019291612bef8c858d866134dc565b909d5090925090508015612c09578b94505050505061079a565b612c696040518061012001604052808e81526020018d6001600160a01b031681526020018481526020018c81526020018b81526020018a6001600160a01b031681526020018663ffffffff16815260200188815260200185815250613770565b9b506000612c7687613afe565b9050612cd1816001600160a01b03168461018001516001600160a01b0316146040518060400160405280600881526020017f504444472d3133300000000000000000000000000000000000000000000000008152508f613300565b9c50612d2c886001600160a01b0316846101a001516001600160a01b0316146040518060400160405280600881526020017f504444472d3134300000000000000000000000000000000000000000000000008152508f613300565b9d9c50505050505050505050505050565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a0820183905291612dbb8b8a8c876134dc565b909c5090925090508015612dd3578a92505050612e3b565b612e336040518061012001604052808d81526020018c6001600160a01b031681526020018481526020018a8152602001898152602001886001600160a01b031681526020018b63ffffffff16815260200187815260200186815250613770565b9a508a925050505b98975050505050505050565b60606000836001600160a01b0316630a49cb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190614a59565b90506000816001600160a01b031663b682c4446040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f139190614a59565b6040517f47af267b0000000000000000000000000000000000000000000000000000000081527f4554485f4c4f434b424f5800000000000000000000000000000000000000000060048201529091506001600160a01b038616906347af267b90602401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614b39565b612fc5578592505050610474565b613025612fe9612fd483613375565b60075461099d906001600160a01b0316613375565b6040518060400160405280600a81526020017f4c4f434b424f582d31300000000000000000000000000000000000000000000081525088613300565b600754909650613088906001600160a01b031661304286846133dd565b6001600160a01b0316146040518060400160405280600a81526020017f4c4f434b424f582d32300000000000000000000000000000000000000000000081525088613300565b95506130e6846001600160a01b03166130a083613464565b6001600160a01b0316146040518060400160405280600a81526020017f4c4f434b424f582d33300000000000000000000000000000000000000000000081525088613300565b955061319d856001600160a01b0316826001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613133573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131579190614a59565b6001600160a01b0316146040518060400160405280600a81526020017f4c4f434b424f582d34300000000000000000000000000000000000000000000081525088613300565b6040517f0fd110770000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529197506115e691831690630fd1107790602401602060405180830381865afa158015613203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132279190614b39565b6040518060400160405280600a81526020017f4c4f434b424f582d35300000000000000000000000000000000000000000000081525088613300565b805160609081906001600160a01b03161561329b57806040516020016132899190614cb9565b60405160208183030381529060405290505b60208301516001600160a01b0316156108a4578051156132d857806040516020016132c69190614cfa565b60405160208183030381529060405290505b806040516020016132e99190614d3b565b604051602081830303815290604052905092915050565b6060831561330f575080610474565b815160000361332057829150613345565b8183604051602001613333929190614a76565b60405160208183030381529060405291505b5092915050565b80516000906001600160a01b03161561336457505190565b50506001546001600160a01b031690565b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156133b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108a49190810190614df0565b6040517f204e1c7a0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000919084169063204e1c7a90602401602060405180830381865afa158015613440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104749190614a59565b6000816001600160a01b0316633e47158c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190614a59565b600081158015906104745750509081161490565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810182905290859080600163ffffffff881663ffffffff161490506000866001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c69190614a59565b6040517f1b685b9e00000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529091506000906001600160a01b03831690631b685b9e90602401602060405180830381865afa15801561362f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136539190614a59565b90506001600160a01b03811661369c5761368e6000886040516020016136799190614e39565b60405160208183030381529060405287613300565b945060019350505050613766565b6040517f74cc86ac00000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201526000906001600160a01b038416906374cc86ac90602401600060405180830381865afa158015613702573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261372a9190810190614df0565b9050600061373a8783878c613b2d565b9097509050801561375357600195505050505050613766565b61375e83838d613bb5565b975050505050505b9450945094915050565b805161010082015160408084015161012081015182517fd83ef267000000000000000000000000000000000000000000000000000000008152835192936000936001600160a01b039093169263d83ef2679260048082019392918290030181865afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138079190614e7a565b509050600085602001516001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561384e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138729190614a59565b90506138d96138c86138878560000151613375565b60c089015163ffffffff166001146138b3576010546138ae906001600160a01b0316613375565b61099d565b60115461099d906001600160a01b0316613375565b856040516020016136799190614e9e565b94506139068660c0015163ffffffff168460a0015163ffffffff1614856040516020016136799190614edf565b945061392786606001518460e0015114856040516020016136799190614f20565b9450613949866080015184610160015114856040516020016136799190614f61565b94506139678360c00151600014856040516020016136799190614fa2565b9450613990836080015167ffffffffffffffff16612a3014856040516020016136799190614fe3565b94506139ae8360400151601e14856040516020016136799190615024565b94506139cc8360200151604914856040516020016136799190615065565b94506139f6836060015167ffffffffffffffff1662049d40148560405160200161367991906150a6565b9450613a136000801b8314158560405160200161367991906150e7565b9450613a348587602001518561014001518960a001518a60e0015189613eea565b9450613a51858760200151838661012001518a60a0015189614164565b9450613a638584610100015186614399565b600f546101008501519196506001600160a01b03908116911603613af557613af2858461010001516001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec9190614a59565b866144ae565b94505b50505050919050565b60208101516000906001600160a01b031615613b1c57506020015190565b50506002546001600160a01b031690565b6060600082604051602001613b429190615128565b60405160208183030381529060405292508315613b9f576000613b66865160a41490565b9050613b928185604051602001613b7d9190614e39565b60405160208183030381529060405289613300565b9650869250159050613bac565b6000613b668651607c1490565b94509492505050565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810182905290613c2f84614625565b9050604051806101c00160405280866001600160a01b03168152602001866001600160a01b031663fa315aa96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cae9190614b89565b8152602001866001600160a01b031663ec5e63086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d159190614b89565b8152602001866001600160a01b031663dabd396d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d7c9190614b6c565b67ffffffffffffffff168152602001866001600160a01b0316636b6716c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ded9190614b6c565b67ffffffffffffffff1681526020018463ffffffff168152602001866001600160a01b03166399735e326040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6a9190614b89565b81526020018260000151815260200182602001516001600160a01b0316815260200182604001516001600160a01b0316815260200182606001516001600160a01b03168152602001826080015181526020018260c001516001600160a01b031681526020018260a001516001600160a01b03168152509150509392505050565b606081604051602001613efd9190615169565b6040516020818303038152906040529150613f43613f32613f1d87613375565b600e5461099d906001600160a01b0316613375565b83604051602001613b7d9190614e39565b600e54909750613f7b906001600160a01b0316613f6086886133dd565b6001600160a01b03161483604051602001613b7d9190614e9e565b96506000613f888461334c565b9050614029816001600160a01b0316876001600160a01b031663dad544e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff99190614a59565b6001600160a01b031614846040516020016140149190614edf565b6040516020818303038152906040528a613300565b97506140a5600354876001600160a01b0316636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561406f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140939190614b89565b14846040516020016140149190614f20565b9750614131876001600160a01b0316876001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141169190614a59565b6001600160a01b0316148460405160200161401491906151aa565b9750612e3b856001600160a01b031661414988613464565b6001600160a01b031614846040516020016140149190614f61565b60608160405160200161417791906151eb565b60405160208183030381529060405291506141ac613f3261419786613375565b600d5461099d906001600160a01b0316613375565b600d549097506141c9906001600160a01b0316613f6085876133dd565b9650614255856001600160a01b0316856001600160a01b031663f2b4e6176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423a9190614a59565b6001600160a01b03161483604051602001613b7d9190614edf565b96506142e1866001600160a01b0316856001600160a01b03166333d7e2bd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142c69190614a59565b6001600160a01b03161483604051602001613b7d9190614f20565b9650614314836001600160a01b03166142f986613464565b6001600160a01b03161483604051602001613b7d91906151aa565b965061079a6000856001600160a01b0316634086d1836040518163ffffffff1660e01b8152600401602060405180830381865afa158015614359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061437d9190614b6c565b67ffffffffffffffff161183604051602001613b7d9190614f61565b6060816040516020016143ac919061522c565b60408051601f1981840301815290829052600f549093506143fc916001600160a01b03868116921691909114906143e7908590602001614e39565b60405160208183030381529060405286613300565b935061443361442261440d85613375565b600f5461099d906001600160a01b0316613375565b836040516020016143e79190614e9e565b93506104f0836001600160a01b0316631219a4e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015614476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061449a9190614b89565b600814836040516020016143e79190614edf565b6060816040516020016144c1919061526d565b604051602081830303815290604052915061452b61451a6144e185613375565b60408051808201909152600581527f312e312e35000000000000000000000000000000000000000000000000000000602082015261099d565b836040516020016143e79190614e39565b93506145a8836001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561456e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145929190614b89565b6201518014836040516020016143e79190614e9e565b93506104f0836001600160a01b031663dd24f9bf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460f9190614b89565b6201ec3014836040516020016143e79190614edf565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152815160a481148015906146725750607c8114155b156146a9576040517fbff6e41600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151604084015160548501516068860151607c870151606093841c9392831c929190911c906000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c880161470f575050609c88015160b0890151606091821c911c5b6040805160e0810182529788526001600160a01b0396871660208901529486169487019490945291841660608601526080850152821660a08401521660c08201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461479b57600080fd5b50565b6000608082840312156147b057600080fd5b6040516080810181811067ffffffffffffffff821117156147d3576147d3614757565b60405290508082356147e481614786565b808252506020830135602082015260408301356040820152606083013561480a81614786565b6060919091015292915050565b801515811461479b57600080fd5b60006040828403121561483757600080fd5b6040516040810181811067ffffffffffffffff8211171561485a5761485a614757565b604052905080823561486b81614786565b8152602083013561487b81614786565b6020919091015292915050565b600080600060e0848603121561489d57600080fd5b6148a7858561479e565b925060808401356148b781614817565b91506148c68560a08601614825565b90509250925092565b60005b838110156148ea5781810151838201526020016148d2565b838111156148f9576000848401525b50505050565b602081526000825180602084015261491e8160408501602087016148cf565b601f01601f19169190910160400192915050565b60008060a0838503121561494557600080fd5b61494f848461479e565b9150608083013561495f81614817565b809150509250929050565b600060a0828403121561497c57600080fd5b60405160a0810181811067ffffffffffffffff8211171561499f5761499f614757565b60405290508082356149b081614786565b8082525060208301356020820152604083013560408201526060830135606082015260808301356149e081614786565b6080919091015292915050565b60008060006101008486031215614a0357600080fd5b614a0d858561496a565b925060a0840135614a1d81614817565b91506148c68560c08601614825565b60008060c08385031215614a3f57600080fd5b614a49848461496a565b915060a083013561495f81614817565b600060208284031215614a6b57600080fd5b815161047481614786565b60008351614a888184602088016148cf565b7f2c000000000000000000000000000000000000000000000000000000000000009083019081528351614ac28160018401602088016148cf565b01600101949350505050565b7f4f50436f6e7472616374734d616e616765725374616e6461726456616c69646181527f746f723a20000000000000000000000000000000000000000000000000000000602082015260008251614b2c8160258501602087016148cf565b9190910160250192915050565b600060208284031215614b4b57600080fd5b815161047481614817565b67ffffffffffffffff8116811461479b57600080fd5b600060208284031215614b7e57600080fd5b815161047481614b56565b600060208284031215614b9b57600080fd5b5051919050565b805163ffffffff81168114614bb657600080fd5b919050565b805160ff81168114614bb657600080fd5b600060c08284031215614bde57600080fd5b60405160c0810181811067ffffffffffffffff82111715614c0157614c01614757565b604052614c0d83614ba2565b8152614c1b60208401614bbb565b6020820152614c2c60408401614bbb565b6040820152614c3d60608401614ba2565b6060820152614c4e60808401614ba2565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114614c7657600080fd5b60a08201529392505050565b600060208284031215614c9457600080fd5b61047482614ba2565b60008251614caf8184602087016148cf565b9190910192915050565b60008251614ccb8184602087016148cf565b7f4f56455252494445532d4c3150414f4d554c5449534947000000000000000000920191825250601701919050565b60008251614d0c8184602087016148cf565b7f2c00000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b60008251614d4d8184602087016148cf565b7f4f56455252494445532d4348414c4c454e474552000000000000000000000000920191825250601401919050565b600067ffffffffffffffff80841115614d9757614d97614757565b604051601f8501601f19908116603f01168101908282118183101715614dbf57614dbf614757565b81604052809350858152868686011115614dd857600080fd5b614de68660208301876148cf565b5050509392505050565b600060208284031215614e0257600080fd5b815167ffffffffffffffff811115614e1957600080fd5b8201601f81018413614e2a57600080fd5b6104f084825160208401614d7c565b60008251614e4b8184602087016148cf565b7f2d31300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008060408385031215614e8d57600080fd5b505080516020909101519092909150565b60008251614eb08184602087016148cf565b7f2d32300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614ef18184602087016148cf565b7f2d33300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614f328184602087016148cf565b7f2d34300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614f738184602087016148cf565b7f2d36300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614fb48184602087016148cf565b7f2d37300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b60008251614ff58184602087016148cf565b7f2d38300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b600082516150368184602087016148cf565b7f2d39300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b600082516150778184602087016148cf565b7f2d31303000000000000000000000000000000000000000000000000000000000920191825250600401919050565b600082516150b88184602087016148cf565b7f2d31313000000000000000000000000000000000000000000000000000000000920191825250600401919050565b600082516150f98184602087016148cf565b7f2d31323000000000000000000000000000000000000000000000000000000000920191825250600401919050565b6000825161513a8184602087016148cf565b7f2d47415247530000000000000000000000000000000000000000000000000000920191825250600601919050565b6000825161517b8184602087016148cf565b7f2d44574554480000000000000000000000000000000000000000000000000000920191825250600601919050565b600082516151bc8184602087016148cf565b7f2d35300000000000000000000000000000000000000000000000000000000000920191825250600301919050565b600082516151fd8184602087016148cf565b7f2d414e43484f5250000000000000000000000000000000000000000000000000920191825250600801919050565b6000825161523e8184602087016148cf565b7f2d564d0000000000000000000000000000000000000000000000000000000000920191825250600301919050565b6000825161527f8184602087016148cf565b7f2d50494d474f000000000000000000000000000000000000000000000000000092019182525060060191905056fea164736f6c634300080f000a"; + bytes internal constant oPContractsManagerCode = + hex"608060405234801561001057600080fd5b506004361061018d5760003560e01c8063622d56f1116100e3578063b51f9c2b1161008c578063c993f27c11610066578063c993f27c1461045f578063cbeda5a714610472578063f3edcbe11461048557600080fd5b8063b51f9c2b146103ba578063ba7903db14610411578063becbdf4a1461043857600080fd5b806378ecabce116100bd57806378ecabce146103715780638970ac4414610394578063b23cc044146103a757600080fd5b8063622d56f1146103035780636624856a1461032a5780636ab5f6611461035157600080fd5b8063318b1b801161014557806354fd4d501161011f57806354fd4d501461029557806358084273146102ce578063604aa628146102e357600080fd5b8063318b1b801461024857806335e80ab31461025b57806341fe53851461028257600080fd5b80631481a724116101765780631481a724146101f65780631d8a4e921461021d57806330e9012c1461023357600080fd5b806303dbe68c146101925780630e9d5cb9146101d6575b600080fd5b6101b97f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec81565b6040516001600160a01b0390911681526020015b60405180910390f35b6101e96101e4366004611393565b610498565b6040516101cd9190611436565b6101b97f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e81565b610225610551565b6040519081526020016101cd565b61023b6105da565b6040516101cd9190611449565b6101b96102563660046115b1565b6106ee565b6101b97f000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa81565b6101e96102903660046115ca565b610799565b60408051808201909152600581527f362e302e3400000000000000000000000000000000000000000000000000000060208201526101e9565b6102e16102dc366004611602565b61084f565b005b6102f66102f1366004611715565b610955565b6040516101cd91906118aa565b6101b97f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf81565b6101b97f000000000000000000000000856e75e9c0da547f9753c17746d6cc139b668e5c81565b61036461035f366004611906565b610a70565b6040516101cd9190611942565b61038461037f3660046115b1565b610bbe565b60405190151581526020016101cd565b6101e96103a2366004611b02565b610c63565b6102e16103b5366004611be6565b610ccf565b6103c2610dd0565b6040516101cd919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b6101b97f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c981565b6101b97f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce99981565b6102e161046d366004611c2f565b610e7d565b6102e1610480366004611be6565b610f83565b6101e9610493366004611c4c565b611084565b6040517f0e9d5cb90000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c91690630e9d5cb99061050490879087908790600401611c79565b600060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105499190810190611cdb565b949350505050565b60007f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d59190611d52565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa1580156106ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d59190611d76565b6040517f318b1b80000000000000000000000000000000000000000000000000000000008152600481018290526000907f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b03169063318b1b8090602401602060405180830381865afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107939190611ece565b92915050565b6040517f41fe53850000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c916906341fe5385906108039086908690600401611eeb565b600060405180830381865afa158015610820573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108489190810190611cdb565b9392505050565b6108576110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a1630036108b9576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816040516024016108cc9190611ffd565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f580842730000000000000000000000000000000000000000000000000000000017905290506109507f000000000000000000000000470d27d713c38cb156701e6686f31e259a66ab3e82611133565b505050565b606061095f6110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a1630036109c1576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826040516024016109d491906120f0565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f604aa6280000000000000000000000000000000000000000000000000000000017905290506000610a5a7f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce99983611133565b9050808060200190518101906105499190612225565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c0810191909152610af16110ee565b6040517fcefe12230000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf169063cefe122390610b7a9085907f000000000000000000000000dc82c0362a241aa94d53546648eace48c9773daa90339060040161240e565b6101e0604051808303816000875af1158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906125e2565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b0316906378ecabce90602401602060405180830381865afa158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906126f9565b6040517f8970ac440000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c91690638970ac449061050490879087908790600401612716565b610cd76110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a163003610d39576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610d4c9190612787565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb23cc0440000000000000000000000000000000000000000000000000000000017905290506109507f00000000000000000000000050e6088d25b5d7f41548d99f39ba1c21bd4ce99982611133565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f0000000000000000000000001d4f0ef0efd3aad2b687353108667e7bd3b53bdf6001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d591906127f2565b610e856110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a163003610ee7576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038216602482015260009060440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc993f27c0000000000000000000000000000000000000000000000000000000017905290506109507f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec82611133565b610f8b6110ee565b6001600160a01b037f000000000000000000000000c46652b373ba85d829a53a74f78b54f047c8209a163003610fed576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401611000919061288a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbeda5a70000000000000000000000000000000000000000000000000000000017905290506109507f000000000000000000000000bd793b2b8eca7735ffcf813c7a364e124d6eddec82611133565b6040517ff3edcbe10000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000ae7945920ed1c49579aa3bfd50b11c1cd06545c9169063f3edcbe19061080390869086906004016128e9565b6110fa62010000610bbe565b15611131576040517fe232d67700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060600080846001600160a01b031684604051611150919061293e565b600060405180830381855af49150503d806000811461118b576040519150601f19603f3d011682016040523d82523d6000602084013e611190565b606091505b50915091508161054957805160208201fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156111f4576111f46111a2565b60405290565b604051610180810167ffffffffffffffff811182821017156111f4576111f46111a2565b604051610240810167ffffffffffffffff811182821017156111f4576111f46111a2565b6040516101e0810167ffffffffffffffff811182821017156111f4576111f46111a2565b604051601f8201601f1916810167ffffffffffffffff8111828210171561128f5761128f6111a2565b604052919050565b6001600160a01b03811681146112ac57600080fd5b50565b80356112ba81611297565b919050565b6000608082840312156112d157600080fd5b6040516080810181811067ffffffffffffffff821117156112f4576112f46111a2565b604052905080823561130581611297565b808252506020830135602082015260408301356040820152606083013561132b81611297565b6060919091015292915050565b80151581146112ac57600080fd5b80356112ba81611338565b60006040828403121561136357600080fd5b61136b6111d1565b9050813561137881611297565b8152602082013561138881611297565b602082015292915050565b600080600060e084860312156113a857600080fd5b6113b285856112bf565b925060808401356113c281611338565b91506113d18560a08601611351565b90509250925092565b60005b838110156113f55781810151838201526020016113dd565b83811115611404576000848401525b50505050565b600081518084526114228160208601602086016113da565b601f01601f19169290920160200192915050565b602081526000610848602083018461140a565b81516001600160a01b031681526102408101602083015161147560208401826001600160a01b03169052565b50604083015161149060408401826001600160a01b03169052565b5060608301516114ab60608401826001600160a01b03169052565b5060808301516114c660808401826001600160a01b03169052565b5060a08301516114e160a08401826001600160a01b03169052565b5060c08301516114fc60c08401826001600160a01b03169052565b5060e083015161151760e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102208085015191821681850152905b505092915050565b6000602082840312156115c357600080fd5b5035919050565b60008060a083850312156115dd57600080fd5b6115e784846112bf565b915060808301356115f781611338565b809150509250929050565b60006020828403121561161457600080fd5b813567ffffffffffffffff81111561162b57600080fd5b8201610160818503121561084857600080fd5b600067ffffffffffffffff821115611658576116586111a2565b5060051b60200190565b600067ffffffffffffffff82111561167c5761167c6111a2565b50601f01601f191660200190565b600082601f83011261169b57600080fd5b81356116ae6116a982611662565b611266565b8181528460208386010111156116c357600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146112ba57600080fd5b67ffffffffffffffff811681146112ac57600080fd5b80356112ba816116f4565b6000602080838503121561172857600080fd5b823567ffffffffffffffff8082111561174057600080fd5b818501915085601f83011261175457600080fd5b81356117626116a98261163e565b81815260059190911b8301840190848101908883111561178157600080fd5b8585015b8381101561189d5780358581111561179d5760008081fd5b8601610180818c03601f19018113156117b65760008081fd5b6117be6111fa565b89830135888111156117d05760008081fd5b6117de8e8c8387010161168a565b82525060406117ee8185016112af565b8b83015260606117ff8186016112af565b82840152608091506118128286016116e0565b818401525060a0808501358284015260c0915081850135818401525060e08085013582840152610100915061184882860161170a565b9083015261012061185a85820161170a565b82840152610140915081850135818401525061016061187a8186016112af565b82840152611889848601611346565b908301525085525050918601918601611785565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156118f957815180516001600160a01b03908116865290870151168685015292840192908501906001016118c7565b5091979650505050505050565b60006020828403121561191857600080fd5b813567ffffffffffffffff81111561192f57600080fd5b8201610260818503121561084857600080fd5b81516001600160a01b031681526101e08101602083015161196e60208401826001600160a01b03169052565b50604083015161198960408401826001600160a01b03169052565b5060608301516119a460608401826001600160a01b03169052565b5060808301516119bf60808401826001600160a01b03169052565b5060a08301516119da60a08401826001600160a01b03169052565b5060c08301516119f560c08401826001600160a01b03169052565b5060e0830151611a1060e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c08085015191821681850152906115a9565b600060a08284031215611a9157600080fd5b60405160a0810181811067ffffffffffffffff82111715611ab457611ab46111a2565b6040529050808235611ac581611297565b808252506020830135602082015260408301356040820152606083013560608201526080830135611af581611297565b6080919091015292915050565b60008060006101008486031215611b1857600080fd5b611b228585611a7f565b925060a0840135611b3281611338565b91506113d18560c08601611351565b6000611b4f6116a98461163e565b83815290506020808201906060808602850187811115611b6e57600080fd5b855b81811015611bda5782818a031215611b885760008081fd5b6040805184810181811067ffffffffffffffff82111715611bab57611bab6111a2565b82528235611bb881611297565b8152828601358682015281830135918101919091528552938301938201611b70565b50505050509392505050565b600060208284031215611bf857600080fd5b813567ffffffffffffffff811115611c0f57600080fd5b8201601f81018413611c2057600080fd5b61054984823560208401611b41565b600060208284031215611c4157600080fd5b813561084881611297565b60008060c08385031215611c5f57600080fd5b611c698484611a7f565b915060a08301356115f781611338565b60e08101611cb1828680516001600160a01b039081168352602080830151908401526040808301519084015260609182015116910152565b831515608083015282516001600160a01b0390811660a084015260208401511660c0830152610549565b600060208284031215611ced57600080fd5b815167ffffffffffffffff811115611d0457600080fd5b8201601f81018413611d1557600080fd5b8051611d236116a982611662565b818152856020838501011115611d3857600080fd5b611d498260208301602086016113da565b95945050505050565b600060208284031215611d6457600080fd5b5051919050565b80516112ba81611297565b60006102408284031215611d8957600080fd5b611d9161121e565b611d9a83611d6b565b8152611da860208401611d6b565b6020820152611db960408401611d6b565b6040820152611dca60608401611d6b565b6060820152611ddb60808401611d6b565b6080820152611dec60a08401611d6b565b60a0820152611dfd60c08401611d6b565b60c0820152611e0e60e08401611d6b565b60e0820152610100611e21818501611d6b565b90820152610120611e33848201611d6b565b90820152610140611e45848201611d6b565b90820152610160611e57848201611d6b565b90820152610180611e69848201611d6b565b908201526101a0611e7b848201611d6b565b908201526101c0611e8d848201611d6b565b908201526101e0611e9f848201611d6b565b90820152610200611eb1848201611d6b565b90820152610220611ec3848201611d6b565b908201529392505050565b600060208284031215611ee057600080fd5b815161084881611297565b60a08101611f23828580516001600160a01b039081168352602080830151908401526040808301519084015260609182015116910152565b82151560808301529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f6757600080fd5b830160208101925035905067ffffffffffffffff811115611f8757600080fd5b606081023603821315611f9957600080fd5b9250929050565b8183526000602080850194508260005b85811015611ff2578135611fc381611297565b6001600160a01b0316875281830135838801526040808301359088015260609687019690910190600101611fb0565b509495945050505050565b602081526000823561200e81611338565b8015156020840152506020830135604083015260408301356060830152606083013561203981611297565b6001600160a01b0380821660808501526080850135915061205982611297565b80821660a0850152505060a083013560c083015260c083013560e083015261010060e084013581840152808401359050612092816116f4565b61012067ffffffffffffffff8216818501526120af81860161170a565b9150506101406120ca8185018367ffffffffffffffff169052565b6120d681860186611f32565b6101608681015292509050611d4961018085018383611fa0565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015612217577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151610180815181865261215c8287018261140a565b915050888201516121778a8701826001600160a01b03169052565b50878201516001600160a01b03908116868a015260608084015163ffffffff16908701526080808401519087015260a0808401519087015260c0808401519087015260e08084015167ffffffffffffffff9081169188019190915261010080850151909116908701526101208084015190870152610140808401519091169086015261016091820151151591909401529386019390860190600101612117565b509098975050505050505050565b6000602080838503121561223857600080fd5b825167ffffffffffffffff81111561224f57600080fd5b8301601f8101851361226057600080fd5b805161226e6116a98261163e565b81815260069190911b8201830190838101908783111561228d57600080fd5b928401925b828410156122e357604084890312156122ab5760008081fd5b6122b36111d1565b84516122be81611297565b8152848601516122cd81611297565b8187015282526040939093019290840190612292565b979650505050505050565b80356122f981611297565b6001600160a01b03908116835260208201359061231582611297565b908116602084015260408201359061232c82611297565b908116604084015260608201359061234382611297565b908116606084015260808201359061235a82611297565b908116608084015260a08201359061237182611297565b80821660a085015250505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b457600080fd5b830160208101925035905067ffffffffffffffff8111156123d457600080fd5b803603821315611f9957600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815261241f60608201856122ee565b600061242d60c086016116e0565b6101206124418185018363ffffffff169052565b61244d60e088016116e0565b91506101406124638186018463ffffffff169052565b61016092506101008801358386015261247e8289018961237f565b9250610260610180818189015261249a6102c0890186856123e3565b94506124a8848c018c61237f565b945092506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089870301818a01526124e38686866123e3565b95506124f0878d0161170a565b96506101c0945061250c858a018867ffffffffffffffff169052565b612517828d016116e0565b96506101e0935061252f848a018863ffffffff169052565b6102009650808c0135878a01525050610220838b0135818901526102409350828b013584890152612561868c0161170a565b67ffffffffffffffff811689840152955061257d818c0161170a565b955050505061259961028086018467ffffffffffffffff169052565b6125a4818901611346565b9250506125b66102a085018315159052565b6001600160a01b038616602085015291506125ce9050565b6001600160a01b0383166040830152610549565b60006101e082840312156125f557600080fd5b6125fd611242565b61260683611d6b565b815261261460208401611d6b565b602082015261262560408401611d6b565b604082015261263660608401611d6b565b606082015261264760808401611d6b565b608082015261265860a08401611d6b565b60a082015261266960c08401611d6b565b60c082015261267a60e08401611d6b565b60e082015261010061268d818501611d6b565b9082015261012061269f848201611d6b565b908201526101406126b1848201611d6b565b908201526101606126c3848201611d6b565b908201526101806126d5848201611d6b565b908201526101a06126e7848201611d6b565b908201526101c0611ec3848201611d6b565b60006020828403121561270b57600080fd5b815161084881611338565b610100810161275d82866001600160a01b03808251168352602082015160208401526040820151604084015260608201516060840152806080830151166080840152505050565b83151560a083015282516001600160a01b0390811660c084015260208401511660e0830152610549565b6020808252825182820181905260009190848201906040850190845b818110156127e6576127d383855180516001600160a01b0316825260208082015190830152604090810151910152565b92840192606092909201916001016127a3565b50909695505050505050565b600060a0828403121561280457600080fd5b60405160a0810181811067ffffffffffffffff82111715612827576128276111a2565b604052825161283581611297565b8152602083015161284581611297565b6020820152604083015161285881611297565b6040820152606083015161286b81611297565b6060820152608083015161287e81611297565b60808201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156127e6576128d683855180516001600160a01b0316825260208082015190830152604090810151910152565b92840192606092909201916001016128a6565b60c0810161292f82856001600160a01b03808251168352602082015160208401526040820151604084015260608201516060840152806080830151166080840152505050565b82151560a08301529392505050565b600082516129508184602087016113da565b919091019291505056fea164736f6c634300080f000a"; + bytes internal constant addressManagerCode = + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a"; + bytes internal constant proxyAdminCode = + hex"60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant l1ERC721BridgeProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant optimismPortalProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant eTHLockboxProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant systemConfigProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant optimismMintableERC20FactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant disputeGameFactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant anchorStateRegistryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant l1StandardBridgeProxyCode = + hex"60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a"; + bytes internal constant l1CrossDomainMessengerProxyCode = + hex"608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant permissionedDelayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; +} diff --git a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh index 35f7329008e..8a7646a0b46 100755 --- a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh +++ b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh @@ -55,11 +55,9 @@ fi # Sender just needs to be anything but the default sender (0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38) # Otherwise state changes inside of Deploy.s.sol get stored in the state diff under the default script address (0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496) # Conflicts with other stuff that happens inside of Kontrol and leads to errors that are hard to debug -# -# Note: --gas-limit set to uint64 max (2^64-1) to avoid MemoryLimitOOG errors. DEPLOY_CONFIG_PATH=deploy-config/hardhat.json \ DEPLOYMENT_OUTFILE="$CONTRACT_NAMES" \ - forge script --sender 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --gas-limit 18446744073709551615 -vvv scripts/deploy/Deploy.s.sol:Deploy --sig runWithStateDiff + forge script --sender 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 -vvv scripts/deploy/Deploy.s.sol:Deploy --sig runWithStateDiff echo "Created state diff json" # Clean and store the state diff json in snapshots/state-diff/Kontrol-Deploy.json diff --git a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol index 60f99bf41f0..0707cde180c 100644 --- a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol +++ b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol @@ -89,7 +89,15 @@ contract SafeCall_Send_Test is SafeCall_TestInit { /// @notice Tests the `call` function of the `SafeCall` contract. contract SafeCall_Call_Test is SafeCall_TestInit { /// @notice Tests that `call` succeeds. - function testFuzz_call_succeeds(address from, address to, uint256 gas, uint64 value, bytes memory data) external { + function testFuzz_call_succeeds( + address from, + address to, + uint256 gas, + uint64 value, + bytes memory data + ) + external + { assumeNot(from); assumeNot(to); @@ -152,6 +160,7 @@ contract SafeCall_CallWithMinGas_Test is SafeCall_TestInit { } /// @notice Tests that `callWithMinGas` succeeds for the lower gas bounds. + /// forge-config: default.gas_limit = 18446744073709551615 function test_callWithMinGas_noLeakageLow_succeeds() external { SimpleSafeCaller caller = new SimpleSafeCaller(); From fd374278c6fb09efee02e89e7c8f20a33b58074e Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Mon, 26 Jan 2026 16:01:13 +0100 Subject: [PATCH 5/7] fix checks and tests --- .../scripts/checks/check-kontrol-summaries-unchanged.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/contracts-bedrock/scripts/checks/check-kontrol-summaries-unchanged.sh b/packages/contracts-bedrock/scripts/checks/check-kontrol-summaries-unchanged.sh index 32c764c188a..4cfbe13a6e8 100755 --- a/packages/contracts-bedrock/scripts/checks/check-kontrol-summaries-unchanged.sh +++ b/packages/contracts-bedrock/scripts/checks/check-kontrol-summaries-unchanged.sh @@ -4,7 +4,7 @@ set -euo pipefail # Runs the file unchanged script for each of the Kontrol summary files. # Update these hashes if you have changed the summary files deliberately. # Use `openssl dgst -sha256` to generate the hash for a file. -./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummary.sol 73e1ed1f3c8bd9e46bb348b774443458206b2399e4eac303e2a92ac987eeefc6 -./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummaryCode.sol ffe7298024464a6a282ceb549db401cce4b36fe3342113250a6c674a3b4203ba -./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol 5ec8b19a00b47f15a2a8c8d632ab83933e19b0c2bbb04c905a2cda926e56038f -./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol 1215a561a2bffb5af62b532a2608c4048a22368e505f7ae1d237c16b4ef6a45e +./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummary.sol cb2f1d7ff9a6fb878328650114af6a6864ed6e353e1d031b5704dee75270a4b5 +./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummaryCode.sol 8cef371441261e54161645036717d3ee21f66bd638a961da698c6858250e41bc +./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol 80e9caac4deba370d01dd642401ec2e8145a1e2ae981b7e423d4de188266f87b +./scripts/checks/check-file-unchanged.sh ./test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol c4379d2232fab24bea2f55d25cef5de4d0629b8e04592f074f680a3141861d9e From 13ac65fc63a5630c3984313f7b8b160aa689a4e3 Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Tue, 27 Jan 2026 16:30:33 +0100 Subject: [PATCH 6/7] fix checks and tests --- packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol | 4 ++-- packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol b/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol index bdfb3ba0848..c52f9a21e67 100644 --- a/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol +++ b/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol @@ -427,7 +427,7 @@ contract L1ERC721Bridge_Uncategorized_Test is L1ERC721Bridge_TestInit { function test_bridgeERC721_localTokenZeroAddress_reverts() external { // Bridge the token. vm.prank(alice, alice); - vm.expectRevert(bytes("call to non-contract address 0x0000000000000000000000000000000000000000")); + vm.expectRevert(bytes("")); l1ERC721Bridge.bridgeERC721(address(0), address(remoteToken), tokenId, 1234, hex"5678"); // Token is not locked in the bridge. @@ -511,7 +511,7 @@ contract L1ERC721Bridge_Uncategorized_Test is L1ERC721Bridge_TestInit { function test_bridgeERC721To_localTokenZeroAddress_reverts() external { // Bridge the token. vm.prank(alice); - vm.expectRevert(bytes("call to non-contract address 0x0000000000000000000000000000000000000000")); + vm.expectRevert(bytes("")); l1ERC721Bridge.bridgeERC721To(address(0), address(remoteToken), bob, tokenId, 1234, hex"5678"); // Token is not locked in the bridge. diff --git a/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol b/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol index 78b8520dcc0..86266c564ff 100644 --- a/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol @@ -278,7 +278,7 @@ contract L2ERC721Bridge_Uncategorized_Test is L2ERC721Bridge_TestInit { function test_bridgeERC721_localTokenZeroAddress_reverts() external { // Bridge the token. vm.prank(alice, alice); - vm.expectRevert(bytes("call to non-contract address 0x0000000000000000000000000000000000000000")); + vm.expectRevert(bytes("")); l2ERC721Bridge.bridgeERC721(address(0), address(remoteToken), tokenId, 1234, hex"5678"); // Token is not locked in the bridge. @@ -343,7 +343,7 @@ contract L2ERC721Bridge_Uncategorized_Test is L2ERC721Bridge_TestInit { function test_bridgeERC721To_localTokenZeroAddress_reverts() external { // Bridge the token. vm.prank(alice); - vm.expectRevert(bytes("call to non-contract address 0x0000000000000000000000000000000000000000")); + vm.expectRevert(bytes("")); l2ERC721Bridge.bridgeERC721To(address(0), address(l1ERC721Bridge), bob, tokenId, 1234, hex"5678"); // Token is not locked in the bridge. From bc82ed993c5a6dfd8676b8e58c1e0cca9ea7b858 Mon Sep 17 00:00:00 2001 From: Michael Amadi Date: Thu, 29 Jan 2026 15:49:52 +0100 Subject: [PATCH 7/7] fixes --- .../test/L2/L2ToL2CrossDomainMessenger.t.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol index c76ea17cfe0..4005cc67ec7 100644 --- a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol @@ -65,6 +65,7 @@ contract L2ToL2CrossDomainMessenger_WithModifiableTransientStorage_Harness is L2 /// @notice Reusable test initialization for `L2ToL2CrossDomainMessenger` tests. abstract contract L2ToL2CrossDomainMessenger_TestInit is Test { address internal foundryVMAddress = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; + address internal consoleAddress = 0x000000000000000000636F6e736F6c652e6c6f67; /// @notice L2ToL2CrossDomainMessenger contract instance with modifiable transient storage. L2ToL2CrossDomainMessenger_WithModifiableTransientStorage_Harness l2ToL2CrossDomainMessenger; @@ -536,7 +537,7 @@ contract L2ToL2CrossDomainMessenger_RelayMessage_Test is L2ToL2CrossDomainMessen // Ensure the target is not CrossL2Inbox or L2ToL2CrossDomainMessenger or the foundry VM vm.assume( _target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER - && _target != foundryVMAddress + && _target != foundryVMAddress && _target != consoleAddress ); assumeNotForgeAddress(_target); @@ -728,7 +729,7 @@ contract L2ToL2CrossDomainMessenger_RelayMessage_Test is L2ToL2CrossDomainMessen // foundry VM vm.assume( _target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER - && _target != foundryVMAddress + && _target != foundryVMAddress && _target != consoleAddress ); // Ensure that the target contract does not revert (using the message also as the return @@ -788,7 +789,7 @@ contract L2ToL2CrossDomainMessenger_RelayMessage_Test is L2ToL2CrossDomainMessen // foundry VM vm.assume( _target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER - && _target != foundryVMAddress + && _target != foundryVMAddress && _target != consoleAddress ); // Ensure that the target call is payable if value is sent