From 34a4be61b9110ec4a13eebfebd5dd39880631c4d Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 27 Aug 2024 12:22:01 +0800 Subject: [PATCH 01/52] feat: clean deprecated code --- contracts/BSCValidatorSet.sol | 205 +------ contracts/GovHub.sol | 38 +- contracts/SlashIndicator.sol | 13 +- contracts/StakeHub.sol | 48 +- contracts/TokenHub.sol | 467 +-------------- contracts/deprecated/CrossChain.sol | 361 +----------- contracts/deprecated/RelayerHub.sol | 4 +- contracts/deprecated/RelayerIncentivize.sol | 181 +----- contracts/deprecated/Staking.sol | 465 +-------------- .../deprecated/TendermintLightClient.sol | 204 +------ contracts/deprecated/TokenManager.sol | 547 +----------------- 11 files changed, 58 insertions(+), 2475 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 07988d5f..5be72cc4 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -195,39 +195,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica uint8, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract initValidatorExtraSet returns (bytes memory responsePayload) { - (IbcValidatorSetPackage memory validatorSetPackage, bool ok) = decodeValidatorSetSynPackage(msgBytes); - if (!ok) { - return CmnPkg.encodeCommonAckPackage(ERROR_FAIL_DECODE); - } - uint32 resCode; - if (validatorSetPackage.packageType == VALIDATORS_UPDATE_MESSAGE_TYPE) { - resCode = updateValidatorSet(validatorSetPackage.validatorSet, validatorSetPackage.voteAddrs); - } else if (validatorSetPackage.packageType == JAIL_MESSAGE_TYPE) { - if (validatorSetPackage.validatorSet.length != 1) { - emit failReasonWithStr("length of jail validators must be one"); - resCode = ERROR_LEN_OF_VAL_MISMATCH; - } else { - address validator = validatorSetPackage.validatorSet[0].consensusAddress; - uint256 index = currentValidatorSetMap[validator]; - if (index == 0 || currentValidatorSet[index - 1].jailed) { - emit validatorEmptyJailed(validator); - } else { - // felony will failed if the validator is the only one in the validator set - bool success = _felony(validator, index - 1); - if (!success) { - emit validatorEmptyJailed(validator); - } - } - resCode = CODE_OK; - } - } else { - resCode = ERROR_UNKNOWN_PACKAGE_TYPE; - } - if (resCode == CODE_OK) { - return new bytes(0); - } else { - return CmnPkg.encodeCommonAckPackage(resCode); - } + revert("deprecated"); } function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external override onlyCrossChainContract { @@ -781,177 +749,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } /*----------------- Internal Functions -----------------*/ - function updateValidatorSet(Validator[] memory validatorSet, bytes[] memory voteAddrs) internal returns (uint32) { - { - // do verify. - if (validatorSet.length > MAX_NUM_OF_VALIDATORS) { - emit failReasonWithStr("the number of validators exceed the limit"); - return ERROR_FAIL_CHECK_VALIDATORS; - } - for (uint256 i; i < validatorSet.length; ++i) { - for (uint256 j; j < i; ++j) { - if (validatorSet[i].consensusAddress == validatorSet[j].consensusAddress) { - emit failReasonWithStr("duplicate consensus address of validatorSet"); - return ERROR_FAIL_CHECK_VALIDATORS; - } - } - } - } - - // step 0: force all maintaining validators to exit `Temporary Maintenance` - // - 1. validators exit maintenance - // - 2. clear all maintainInfo - // - 3. get unjailed validators from validatorSet - Validator[] memory validatorSetTemp; - bytes[] memory voteAddrsTemp; - { - // get migrated validators - Validator[] memory bscValidatorSet = _tmpMigratedValidatorSet; - bytes[] memory bscVoteAddrs = _tmpMigratedVoteAddrs; - for (uint256 i; i < bscValidatorSet.length; ++i) { - bscValidatorSet[i].votingPower = bscValidatorSet[i].votingPower * 3; // amplify the voting power for BSC validators - } - (Validator[] memory mergedValidators, bytes[] memory mergedVoteAddrs) = - _mergeValidatorSet(validatorSet, voteAddrs, bscValidatorSet, bscVoteAddrs); - - (validatorSetTemp, voteAddrsTemp) = _forceMaintainingValidatorsExit(mergedValidators, mergedVoteAddrs); - } - - { - //step 1: do calculate distribution, do not make it as an internal function for saving gas. - uint256 crossSize; - uint256 directSize; - uint256 validatorsNum = currentValidatorSet.length; - uint8[] memory isMigrated = new uint8[](validatorsNum); - for (uint256 i; i < validatorsNum; ++i) { - if ( - IStakeHub(STAKE_HUB_ADDR).consensusToOperator(currentValidatorSet[i].consensusAddress) != address(0) - ) { - isMigrated[i] = 1; - if (currentValidatorSet[i].incoming != 0) { - ++directSize; - } - } else if (currentValidatorSet[i].incoming >= DUSTY_INCOMING) { - ++crossSize; - } else if (currentValidatorSet[i].incoming != 0) { - ++directSize; - } - } - - //cross transfer - address[] memory crossAddrs = new address[](crossSize); - uint256[] memory crossAmounts = new uint256[](crossSize); - uint256[] memory crossIndexes = new uint256[](crossSize); - address[] memory crossRefundAddrs = new address[](crossSize); - uint256 crossTotal; - // direct transfer - address payable[] memory directAddrs = new address payable[](directSize); - uint256[] memory directAmounts = new uint256[](directSize); - crossSize = 0; - directSize = 0; - uint256 relayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee(); - if (relayFee > DUSTY_INCOMING) { - emit failReasonWithStr("fee is larger than DUSTY_INCOMING"); - return ERROR_RELAYFEE_TOO_LARGE; - } - for (uint256 i; i < validatorsNum; ++i) { - if (isMigrated[i] == 1) { - if (currentValidatorSet[i].incoming != 0) { - directAddrs[directSize] = payable(currentValidatorSet[i].consensusAddress); - directAmounts[directSize] = currentValidatorSet[i].incoming; - isMigrated[directSize] = 1; // directSize must be less than i. so we can use directSize as index - ++directSize; - } - } else if (currentValidatorSet[i].incoming >= DUSTY_INCOMING) { - crossAddrs[crossSize] = currentValidatorSet[i].BBCFeeAddress; - uint256 value = currentValidatorSet[i].incoming - currentValidatorSet[i].incoming % PRECISION; - crossAmounts[crossSize] = value.sub(relayFee); - crossRefundAddrs[crossSize] = currentValidatorSet[i].feeAddress; - crossIndexes[crossSize] = i; - crossTotal = crossTotal.add(value); - ++crossSize; - } else if (currentValidatorSet[i].incoming != 0) { - directAddrs[directSize] = currentValidatorSet[i].feeAddress; - directAmounts[directSize] = currentValidatorSet[i].incoming; - isMigrated[directSize] = 0; - ++directSize; - } - } - - //step 2: do cross chain transfer - bool failCross = false; - if (crossTotal > 0) { - try ITokenHub(TOKEN_HUB_ADDR).batchTransferOutBNB{ value: crossTotal }( - crossAddrs, crossAmounts, crossRefundAddrs, uint64(block.timestamp + expireTimeSecondGap) - ) returns (bool success) { - if (success) { - emit batchTransfer(crossTotal); - } else { - emit batchTransferFailed(crossTotal, "batch transfer return false"); - } - } catch Error(string memory reason) { - failCross = true; - emit batchTransferFailed(crossTotal, reason); - } catch (bytes memory lowLevelData) { - failCross = true; - emit batchTransferLowerFailed(crossTotal, lowLevelData); - } - } - - if (failCross) { - for (uint256 i; i < crossIndexes.length; ++i) { - uint256 idx = crossIndexes[i]; - bool success = currentValidatorSet[idx].feeAddress.send(currentValidatorSet[idx].incoming); - if (success) { - emit directTransfer(currentValidatorSet[idx].feeAddress, currentValidatorSet[idx].incoming); - } else { - emit directTransferFail(currentValidatorSet[idx].feeAddress, currentValidatorSet[idx].incoming); - } - } - } - - // step 3: direct transfer - if (directAddrs.length > 0) { - for (uint256 i; i < directAddrs.length; ++i) { - if (isMigrated[i] == 1) { - IStakeHub(STAKE_HUB_ADDR).distributeReward{ value: directAmounts[i] }(directAddrs[i]); - } else { - bool success = directAddrs[i].send(directAmounts[i]); - if (success) { - emit directTransfer(directAddrs[i], directAmounts[i]); - } else { - emit directTransferFail(directAddrs[i], directAmounts[i]); - } - } - } - } - } - - for (uint256 i; i < currentValidatorSet.length; ++i) { - if (currentValidatorSet[i].incoming != 0) { - currentValidatorSet[i].incoming = 0; - } - } - - // step 4: do dusk transfer - if (address(this).balance > 0) { - emit systemTransfer(address(this).balance); - address(uint160(SYSTEM_REWARD_ADDR)).transfer(address(this).balance); - } - - // step 5: do update validator set state - totalInComing = 0; - numOfJailed = 0; - if (validatorSetTemp.length > 0) { - doUpdateState(validatorSetTemp, voteAddrsTemp); - } - - // step 6: clean slash contract - ISlashIndicator(SLASH_CONTRACT_ADDR).clean(); - emit validatorSetUpdated(); - return CODE_OK; - } - function doUpdateState(Validator[] memory newValidatorSet, bytes[] memory newVoteAddrs) private { uint256 n = currentValidatorSet.length; uint256 m = newValidatorSet.length; diff --git a/contracts/GovHub.sol b/contracts/GovHub.sol index 7c50eef7..0ebc5dd5 100644 --- a/contracts/GovHub.sol +++ b/contracts/GovHub.sol @@ -31,26 +31,17 @@ contract GovHub is System, IApplication { uint8, bytes calldata msgBytes ) external override onlyCrossChainContract returns (bytes memory responsePayload) { - (ParamChangePackage memory proposal, bool success) = decodeSynPackage(msgBytes); - if (!success) { - return CmnPkg.encodeCommonAckPackage(ERROR_FAIL_DECODE); - } - uint32 resCode = notifyUpdates(proposal); - if (resCode == CODE_OK) { - return new bytes(0); - } else { - return CmnPkg.encodeCommonAckPackage(resCode); - } + revert("deprecated"); } // should not happen function handleAckPackage(uint8, bytes calldata) external override onlyCrossChainContract { - require(false, "receive unexpected ack package"); + revert("deprecated"); } // should not happen function handleFailAckPackage(uint8, bytes calldata) external override onlyCrossChainContract { - require(false, "receive unexpected fail ack package"); + revert("deprecated"); } function updateParam(string calldata key, bytes calldata value, address target) external onlyGovernorTimelock { @@ -73,27 +64,4 @@ contract GovHub is System, IApplication { } return CODE_OK; } - - //rlp encode & decode function - function decodeSynPackage(bytes memory msgBytes) internal pure returns (ParamChangePackage memory, bool) { - ParamChangePackage memory pkg; - - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - pkg.key = string(iter.next().toBytes()); - } else if (idx == 1) { - pkg.value = iter.next().toBytes(); - } else if (idx == 2) { - pkg.target = iter.next().toAddress(); - success = true; - } else { - break; - } - ++idx; - } - return (pkg, success); - } } diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index b1897f0d..c3877a4f 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -94,22 +94,15 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati uint8, bytes calldata ) external override onlyCrossChainContract onlyInit returns (bytes memory) { - require(false, "receive unexpected syn package"); + revert("deprecated"); } function handleAckPackage(uint8, bytes calldata msgBytes) external override onlyCrossChainContract onlyInit { - (CmnPkg.CommonAckPackage memory response, bool ok) = CmnPkg.decodeCommonAckPackage(msgBytes); - if (ok) { - emit knownResponse(response.code); - } else { - emit unKnownResponse(response.code); - } - return; + revert("deprecated"); } function handleFailAckPackage(uint8, bytes calldata) external override onlyCrossChainContract onlyInit { - emit crashResponse(); - return; + revert("deprecated"); } /*----------------- External func -----------------*/ diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 9a873691..06e3e283 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -8,10 +8,8 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "./SystemV2.sol"; import "./extension/Protectable.sol"; import "./interface/0.8.x/IBSCValidatorSet.sol"; -import "./interface/0.8.x/ICrossChain.sol"; import "./interface/0.8.x/IGovToken.sol"; import "./interface/0.8.x/IStakeCredit.sol"; -import "./interface/0.8.x/ITokenHub.sol"; import "./lib/0.8.x/RLPDecode.sol"; import "./lib/0.8.x/Utils.sol"; @@ -283,45 +281,15 @@ contract StakeHub is SystemV2, Initializable, Protectable { uint8, bytes calldata msgBytes ) external onlyCrossChainContract whenNotPaused enableReceivingFund returns (bytes memory) { - (StakeMigrationPackage memory migrationPkg, bool decodeSuccess) = _decodeMigrationSynPackage(msgBytes); - if (!decodeSuccess) revert InvalidSynPackage(); - - if (migrationPkg.amount == 0) { - return new bytes(0); - } - - // claim fund from TokenHub - bool claimSuccess = ITokenHub(TOKEN_HUB_ADDR).claimMigrationFund(migrationPkg.amount); - if (!claimSuccess) { - emit MigrateFailed( - migrationPkg.operatorAddress, - migrationPkg.delegator, - migrationPkg.amount, - StakeMigrationRespCode.CLAIM_FUND_FAILED - ); - return msgBytes; - } - - StakeMigrationRespCode respCode = _doMigration(migrationPkg); - - if (respCode == StakeMigrationRespCode.MIGRATE_SUCCESS) { - return new bytes(0); - } else { - (bool success,) = TOKEN_HUB_ADDR.call{ value: address(this).balance }(""); - if (!success) revert TransferFailed(); - emit MigrateFailed(migrationPkg.operatorAddress, migrationPkg.delegator, migrationPkg.amount, respCode); - return msgBytes; - } + revert("deprecated"); } function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external onlyCrossChainContract { - // should not happen - emit UnexpectedPackage(channelId, msgBytes); + revert("deprecated"); } function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) external onlyCrossChainContract { - // should not happen - emit UnexpectedPackage(channelId, msgBytes); + revert("deprecated"); } /*----------------- external functions -----------------*/ @@ -1181,14 +1149,8 @@ contract StakeHub is SystemV2, Initializable, Protectable { bool isLast = (numOfJailed >= _validatorSet.length() - 1); if (isLast) { // If staking channel is closed, then BC-fusion is finished and we should keep the last eligible validator here - if ( - !ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).registeredContractChannelMap( - VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID - ) - ) { - emit ValidatorEmptyJailed(valInfo.operatorAddress); - return; - } + emit ValidatorEmptyJailed(valInfo.operatorAddress); + return; } if (jailUntil > valInfo.jailUntil) { diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index 79db085f..864b052e 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -200,13 +200,7 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR uint8 channelId, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract returns (bytes memory) { - if (channelId == TRANSFER_IN_CHANNELID) { - return handleTransferInSynPackage(msgBytes); - } else { - // should not happen - require(false, "unrecognized syn package"); - return new bytes(0); - } + revert("deprecated"); } /** @@ -220,11 +214,7 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR uint8 channelId, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract { - if (channelId == TRANSFER_OUT_CHANNELID) { - handleTransferOutAckPackage(msgBytes); - } else { - emit unexpectedPackage(channelId, msgBytes); - } + revert("deprecated"); } /** @@ -237,124 +227,7 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR uint8 channelId, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract { - if (channelId == TRANSFER_OUT_CHANNELID) { - handleTransferOutFailAckPackage(msgBytes); - } else { - emit unexpectedPackage(channelId, msgBytes); - } - } - - function decodeTransferInSynPackage(bytes memory msgBytes) - internal - pure - returns (TransferInSynPackage memory, bool) - { - TransferInSynPackage memory transInSynPkg; - - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - transInSynPkg.bep2TokenSymbol = bytes32(iter.next().toUint()); - } else if (idx == 1) { - transInSynPkg.contractAddr = iter.next().toAddress(); - } else if (idx == 2) { - transInSynPkg.amount = iter.next().toUint(); - } else if (idx == 3) { - transInSynPkg.recipient = ((iter.next().toAddress())); - } else if (idx == 4) { - transInSynPkg.refundAddr = iter.next().toAddress(); - } else if (idx == 5) { - transInSynPkg.expireTime = uint64(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (transInSynPkg, success); - } - - function encodeTransferInRefundPackage(TransferInRefundPackage memory transInAckPkg) - internal - pure - returns (bytes memory) - { - bytes[] memory elements = new bytes[](4); - elements[0] = uint256(transInAckPkg.bep2TokenSymbol).encodeUint(); - elements[1] = transInAckPkg.refundAmount.encodeUint(); - elements[2] = transInAckPkg.refundAddr.encodeAddress(); - elements[3] = uint256(transInAckPkg.status).encodeUint(); - return elements.encodeList(); - } - - function handleTransferInSynPackage(bytes memory msgBytes) internal returns (bytes memory) { - (TransferInSynPackage memory transInSynPkg, bool success) = decodeTransferInSynPackage(msgBytes); - require(success, "unrecognized transferIn package"); - uint32 resCode = doTransferIn(transInSynPkg); - if (resCode != TRANSFER_IN_SUCCESS) { - uint256 bep2Amount = - convertToBep2Amount(transInSynPkg.amount, bep20ContractDecimals[transInSynPkg.contractAddr]); - TransferInRefundPackage memory transInAckPkg = TransferInRefundPackage({ - bep2TokenSymbol: transInSynPkg.bep2TokenSymbol, - refundAmount: bep2Amount, - refundAddr: transInSynPkg.refundAddr, - status: resCode - }); - return encodeTransferInRefundPackage(transInAckPkg); - } else { - return new bytes(0); - } - } - - function doTransferIn(TransferInSynPackage memory transInSynPkg) internal returns (uint32) { - if (transInSynPkg.contractAddr == address(0x0)) { - if (block.timestamp > transInSynPkg.expireTime) { - return TRANSFER_IN_FAILURE_TIMEOUT; - } - if (address(this).balance < transInSynPkg.amount) { - return TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE; - } - - // BEP-171: Security Enhancement for Cross-Chain Module - if (!_checkAndLockTransferIn(transInSynPkg)) { - // directly transfer to the recipient - (bool success,) = - transInSynPkg.recipient.call{ gas: MAX_GAS_FOR_TRANSFER_BNB, value: transInSynPkg.amount }(""); - if (!success) { - return TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT; - } - } - - emit transferInSuccess(transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount); - return TRANSFER_IN_SUCCESS; - } else { - if (block.timestamp > transInSynPkg.expireTime) { - return TRANSFER_IN_FAILURE_TIMEOUT; - } - if (contractAddrToBEP2Symbol[transInSynPkg.contractAddr] != transInSynPkg.bep2TokenSymbol) { - return TRANSFER_IN_FAILURE_UNBOUND_TOKEN; - } - uint256 actualBalance = - IBEP20(transInSynPkg.contractAddr).balanceOf{ gas: MAX_GAS_FOR_CALLING_BEP20 }(address(this)); - if (actualBalance < transInSynPkg.amount) { - return TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE; - } - - // BEP-171: Security Enhancement for Cross-Chain Module - if (!_checkAndLockTransferIn(transInSynPkg)) { - bool success = IBEP20(transInSynPkg.contractAddr).transfer{ gas: MAX_GAS_FOR_CALLING_BEP20 }( - transInSynPkg.recipient, transInSynPkg.amount - ); - if (!success) { - return TRANSFER_IN_FAILURE_UNKNOWN; - } - } - - emit transferInSuccess(transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount); - return TRANSFER_IN_SUCCESS; - } + revert("deprecated"); } // BEP-171: Security Enhancement for Cross-Chain Module @@ -362,11 +235,7 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR address bep20Token, uint256 largeTransferLimit ) external onlyTokenOwner(bep20Token) { - require(largeTransferLimit > 0, "zero limit not allowed"); - require(contractAddrToBEP2Symbol[bep20Token] != bytes32(0x00), "not bound"); - largeTransferLimitMap[bep20Token] = largeTransferLimit; - - emit LargeTransferLimitSet(bep20Token, msg.sender, largeTransferLimit); + revert("deprecated"); } // BEP-171: Security Enhancement for Cross-Chain Module @@ -391,221 +260,7 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR // BEP-171: Security Enhancement for Cross-Chain Module function cancelTransferIn(address tokenAddress, address attacker) external override onlyCrossChainContract { - LockInfo storage lockInfo = lockInfoMap[tokenAddress][attacker]; - require(lockInfo.amount > 0, "no locked amount"); - - uint256 _amount = lockInfo.amount; - lockInfo.amount = 0; - - emit CancelTransfer(tokenAddress, attacker, _amount); - } - - // BEP-171: Security Enhancement for Cross-Chain Module - function _checkAndLockTransferIn(TransferInSynPackage memory transInSynPkg) internal returns (bool isLocked) { - // check if BEP-171 params init - if (largeTransferLimitMap[address(0x0)] == 0 && lockPeriod == 0) { - largeTransferLimitMap[address(0x0)] = INIT_BNB_LARGE_TRANSFER_LIMIT; - lockPeriod = INIT_LOCK_PERIOD; - } - - // check if it is over large transfer limit - uint256 _limit = largeTransferLimitMap[transInSynPkg.contractAddr]; - if (_limit == 0 || transInSynPkg.amount < _limit) { - return false; - } - - // it is over the large transfer limit - // add time lock to recipient - LockInfo storage lockInfo = lockInfoMap[transInSynPkg.contractAddr][transInSynPkg.recipient]; - lockInfo.amount = lockInfo.amount.add(transInSynPkg.amount); - lockInfo.unlockAt = block.timestamp + lockPeriod; - - emit LargeTransferLocked( - transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount, lockInfo.unlockAt - ); - return true; - } - - function decodeTransferOutAckPackage(bytes memory msgBytes) - internal - pure - returns (TransferOutAckPackage memory, bool) - { - TransferOutAckPackage memory transOutAckPkg; - - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - transOutAckPkg.contractAddr = iter.next().toAddress(); - } else if (idx == 1) { - RLPDecode.RLPItem[] memory list = iter.next().toList(); - transOutAckPkg.refundAmounts = new uint256[](list.length); - for (uint256 index = 0; index < list.length; ++index) { - transOutAckPkg.refundAmounts[index] = list[index].toUint(); - } - } else if (idx == 2) { - RLPDecode.RLPItem[] memory list = iter.next().toList(); - transOutAckPkg.refundAddrs = new address[](list.length); - for (uint256 index = 0; index < list.length; ++index) { - transOutAckPkg.refundAddrs[index] = list[index].toAddress(); - } - } else if (idx == 3) { - transOutAckPkg.status = uint32(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (transOutAckPkg, success); - } - - function handleTransferOutAckPackage(bytes memory msgBytes) internal { - (TransferOutAckPackage memory transOutAckPkg, bool decodeSuccess) = decodeTransferOutAckPackage(msgBytes); - require(decodeSuccess, "unrecognized transferOut ack package"); - doRefund(transOutAckPkg); - } - - function doRefund(TransferOutAckPackage memory transOutAckPkg) internal { - if (transOutAckPkg.contractAddr == address(0x0)) { - for (uint256 index = 0; index < transOutAckPkg.refundAmounts.length; ++index) { - (bool success,) = transOutAckPkg.refundAddrs[index].call{ - gas: MAX_GAS_FOR_TRANSFER_BNB, - value: transOutAckPkg.refundAmounts[index] - }(""); - if (!success) { - emit refundFailure( - transOutAckPkg.contractAddr, - transOutAckPkg.refundAddrs[index], - transOutAckPkg.refundAmounts[index], - transOutAckPkg.status - ); - } else { - emit refundSuccess( - transOutAckPkg.contractAddr, - transOutAckPkg.refundAddrs[index], - transOutAckPkg.refundAmounts[index], - transOutAckPkg.status - ); - } - } - } else { - for (uint256 index = 0; index < transOutAckPkg.refundAmounts.length; ++index) { - bool success = IBEP20(transOutAckPkg.contractAddr).transfer{ gas: MAX_GAS_FOR_CALLING_BEP20 }( - transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index] - ); - if (success) { - emit refundSuccess( - transOutAckPkg.contractAddr, - transOutAckPkg.refundAddrs[index], - transOutAckPkg.refundAmounts[index], - transOutAckPkg.status - ); - } else { - emit refundFailure( - transOutAckPkg.contractAddr, - transOutAckPkg.refundAddrs[index], - transOutAckPkg.refundAmounts[index], - transOutAckPkg.status - ); - } - } - } - } - - function decodeTransferOutSynPackage(bytes memory msgBytes) - internal - pure - returns (TransferOutSynPackage memory, bool) - { - TransferOutSynPackage memory transOutSynPkg; - - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - transOutSynPkg.bep2TokenSymbol = bytes32(iter.next().toUint()); - } else if (idx == 1) { - transOutSynPkg.contractAddr = iter.next().toAddress(); - } else if (idx == 2) { - RLPDecode.RLPItem[] memory list = iter.next().toList(); - transOutSynPkg.amounts = new uint256[](list.length); - for (uint256 index = 0; index < list.length; ++index) { - transOutSynPkg.amounts[index] = list[index].toUint(); - } - } else if (idx == 3) { - RLPDecode.RLPItem[] memory list = iter.next().toList(); - transOutSynPkg.recipients = new address[](list.length); - for (uint256 index = 0; index < list.length; ++index) { - transOutSynPkg.recipients[index] = list[index].toAddress(); - } - } else if (idx == 4) { - RLPDecode.RLPItem[] memory list = iter.next().toList(); - transOutSynPkg.refundAddrs = new address[](list.length); - for (uint256 index = 0; index < list.length; ++index) { - transOutSynPkg.refundAddrs[index] = list[index].toAddress(); - } - } else if (idx == 5) { - transOutSynPkg.expireTime = uint64(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (transOutSynPkg, success); - } - - function handleTransferOutFailAckPackage(bytes memory msgBytes) internal { - (TransferOutSynPackage memory transOutSynPkg, bool decodeSuccess) = decodeTransferOutSynPackage(msgBytes); - require(decodeSuccess, "unrecognized transferOut syn package"); - TransferOutAckPackage memory transOutAckPkg; - transOutAckPkg.contractAddr = transOutSynPkg.contractAddr; - transOutAckPkg.refundAmounts = transOutSynPkg.amounts; - uint256 bep20TokenDecimals = bep20ContractDecimals[transOutSynPkg.contractAddr]; - for (uint256 idx = 0; idx < transOutSynPkg.amounts.length; ++idx) { - transOutSynPkg.amounts[idx] = convertFromBep2Amount(transOutSynPkg.amounts[idx], bep20TokenDecimals); - } - transOutAckPkg.refundAddrs = transOutSynPkg.refundAddrs; - transOutAckPkg.status = TRANSFER_IN_FAILURE_UNKNOWN; - doRefund(transOutAckPkg); - } - - function encodeTransferOutSynPackage(TransferOutSynPackage memory transOutSynPkg) - internal - pure - returns (bytes memory) - { - bytes[] memory elements = new bytes[](6); - - elements[0] = uint256(transOutSynPkg.bep2TokenSymbol).encodeUint(); - elements[1] = transOutSynPkg.contractAddr.encodeAddress(); - - uint256 batchLength = transOutSynPkg.amounts.length; - - bytes[] memory amountsElements = new bytes[](batchLength); - for (uint256 index = 0; index < batchLength; ++index) { - amountsElements[index] = transOutSynPkg.amounts[index].encodeUint(); - } - elements[2] = amountsElements.encodeList(); - - bytes[] memory recipientsElements = new bytes[](batchLength); - for (uint256 index = 0; index < batchLength; ++index) { - recipientsElements[index] = transOutSynPkg.recipients[index].encodeAddress(); - } - elements[3] = recipientsElements.encodeList(); - - bytes[] memory refundAddrsElements = new bytes[](batchLength); - for (uint256 index = 0; index < batchLength; ++index) { - refundAddrsElements[index] = transOutSynPkg.refundAddrs[index].encodeAddress(); - } - elements[4] = refundAddrsElements.encodeList(); - - elements[5] = uint256(transOutSynPkg.expireTime).encodeUint(); - return elements.encodeList(); + revert("deprecated"); } /** @@ -699,71 +354,11 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR address[] calldata refundAddrs, uint64 expireTime ) external payable override onlyInit returns (bool) { - require(recipientAddrs.length == amounts.length, "Length of recipientAddrs doesn't equal to length of amounts"); - require( - recipientAddrs.length == refundAddrs.length, - "Length of recipientAddrs doesn't equal to length of refundAddrs" - ); - require(expireTime >= block.timestamp + 120, "expireTime must be two minutes later"); - require(msg.value % TEN_DECIMALS == 0, "invalid received BNB amount: precision loss in amount conversion"); - uint256 batchLength = amounts.length; - uint256 totalAmount = 0; - uint256 rewardForRelayer; - uint256[] memory convertedAmounts = new uint256[](batchLength); - for (uint256 i = 0; i < batchLength; ++i) { - require(amounts[i] % TEN_DECIMALS == 0, "invalid transfer amount: precision loss in amount conversion"); - totalAmount = totalAmount.add(amounts[i]); - convertedAmounts[i] = amounts[i].div(TEN_DECIMALS); - } - require( - msg.value >= totalAmount.add(relayFee.mul(batchLength)), - "received BNB amount should be no less than the sum of transfer BNB amount and relayFee" - ); - rewardForRelayer = msg.value.sub(totalAmount); - - TransferOutSynPackage memory transOutSynPkg = TransferOutSynPackage({ - bep2TokenSymbol: BEP2_TOKEN_SYMBOL_FOR_BNB, - contractAddr: address(0x00), - amounts: convertedAmounts, - recipients: recipientAddrs, - refundAddrs: refundAddrs, - expireTime: expireTime - }); - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - TRANSFER_OUT_CHANNELID, encodeTransferOutSynPackage(transOutSynPkg), rewardForRelayer.div(TEN_DECIMALS) - ); - emit transferOutSuccess(address(0x0), msg.sender, totalAmount, rewardForRelayer); - return true; + revert("deprecated"); } function updateParam(string calldata key, bytes calldata value) external override onlyGov { - require(value.length == 32, "expected value length is 32"); - string memory localKey = key; - bytes memory localValue = value; - bytes32 bytes32Key; - assembly { - bytes32Key := mload(add(localKey, 32)) - } - if (bytes32Key == bytes32(0x72656c6179466565000000000000000000000000000000000000000000000000)) { - // relayFee - uint256 newRelayFee; - assembly { - newRelayFee := mload(add(localValue, 32)) - } - require(newRelayFee <= 1e18 && newRelayFee % (TEN_DECIMALS) == 0, "the relayFee out of range"); - relayFee = newRelayFee; - } else if (Memory.compareStrings(key, "largeTransferLockPeriod")) { - uint256 newLockPeriod = BytesToTypes.bytesToUint256(32, value); - require(newLockPeriod <= 1 weeks, "lock period too long"); - lockPeriod = newLockPeriod; - } else if (Memory.compareStrings(key, "bnbLargeTransferLimit")) { - uint256 newBNBLargeTransferLimit = BytesToTypes.bytesToUint256(32, value); - require(newBNBLargeTransferLimit >= 100 ether, "bnb large transfer limit too small"); - largeTransferLimitMap[address(0x0)] = newBNBLargeTransferLimit; - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); + revert("deprecated"); } function getContractAddrByBEP2Symbol(bytes32 bep2Symbol) external view override returns (address) { @@ -775,49 +370,11 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR } function bindToken(bytes32 bep2Symbol, address contractAddr, uint256 decimals) external override onlyTokenManager { - bep2SymbolToContractAddr[bep2Symbol] = contractAddr; - contractAddrToBEP2Symbol[contractAddr] = bep2Symbol; - bep20ContractDecimals[contractAddr] = decimals; + revert("deprecated"); } function unbindToken(bytes32 bep2Symbol, address contractAddr) external override onlyTokenManager { - delete bep2SymbolToContractAddr[bep2Symbol]; - delete contractAddrToBEP2Symbol[contractAddr]; - delete bep20ContractDecimals[contractAddr]; - } - - function isMiniBEP2Token(bytes32 symbol) internal pure returns (bool) { - bytes memory symbolBytes = new bytes(32); - assembly { - mstore(add(symbolBytes, 32), symbol) - } - uint8 symbolLength = 0; - for (uint8 j = 0; j < 32; ++j) { - if (symbolBytes[j] != 0) { - ++symbolLength; - } else { - break; - } - } - if (symbolLength < MINIMUM_BEP20_SYMBOL_LEN + 5) { - return false; - } - if (symbolBytes[symbolLength - 5] != 0x2d) { - // '-' - return false; - } - if (symbolBytes[symbolLength - 1] != "M") { - // ABC-XXXM - return false; - } - return true; - } - - function convertToBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) { - if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) { - return amount.div(10 ** (bep20TokenDecimals - BEP2_TOKEN_DECIMALS)); - } - return amount.mul(10 ** (BEP2_TOKEN_DECIMALS - bep20TokenDecimals)); + revert("deprecated"); } function convertFromBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) { @@ -857,10 +414,6 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR } function withdrawStakingBNB(uint256 amount) external override returns (bool) { - require(msg.sender == STAKING_CONTRACT_ADDR, "only staking system contract can call this function"); - if (amount != 0) { - payable(STAKING_CONTRACT_ADDR).transfer(amount); - } - return true; + revert("deprecated"); } } diff --git a/contracts/deprecated/CrossChain.sol b/contracts/deprecated/CrossChain.sol index 2bbd0200..cc38a807 100644 --- a/contracts/deprecated/CrossChain.sol +++ b/contracts/deprecated/CrossChain.sol @@ -152,62 +152,8 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { _; } - // | length | prefix | sourceChainID| destinationChainID | channelID | sequence | - // | 32 bytes | 1 byte | 2 bytes | 2 bytes | 1 bytes | 8 bytes | - function generateKey(uint64 _sequence, uint8 _channelID) internal pure returns (bytes memory) { - uint256 fullCROSS_CHAIN_KEY_PREFIX = CROSS_CHAIN_KEY_PREFIX | _channelID; - bytes memory key = new bytes(14); - - uint256 ptr; - assembly { - ptr := add(key, 14) - } - assembly { - mstore(ptr, _sequence) - } - ptr -= 8; - assembly { - mstore(ptr, fullCROSS_CHAIN_KEY_PREFIX) - } - ptr -= 6; - assembly { - mstore(ptr, 14) - } - return key; - } - function init() external onlyNotInit { - channelHandlerContractMap[BIND_CHANNELID] = TOKEN_MANAGER_ADDR; - isRelayRewardFromSystemReward[BIND_CHANNELID] = false; - registeredContractChannelMap[TOKEN_MANAGER_ADDR][BIND_CHANNELID] = true; - - channelHandlerContractMap[TRANSFER_IN_CHANNELID] = TOKEN_HUB_ADDR; - isRelayRewardFromSystemReward[TRANSFER_IN_CHANNELID] = false; - registeredContractChannelMap[TOKEN_HUB_ADDR][TRANSFER_IN_CHANNELID] = true; - - channelHandlerContractMap[TRANSFER_OUT_CHANNELID] = TOKEN_HUB_ADDR; - isRelayRewardFromSystemReward[TRANSFER_OUT_CHANNELID] = false; - registeredContractChannelMap[TOKEN_HUB_ADDR][TRANSFER_OUT_CHANNELID] = true; - - channelHandlerContractMap[STAKING_CHANNELID] = VALIDATOR_CONTRACT_ADDR; - isRelayRewardFromSystemReward[STAKING_CHANNELID] = true; - registeredContractChannelMap[VALIDATOR_CONTRACT_ADDR][STAKING_CHANNELID] = true; - - channelHandlerContractMap[GOV_CHANNELID] = GOV_HUB_ADDR; - isRelayRewardFromSystemReward[GOV_CHANNELID] = true; - registeredContractChannelMap[GOV_HUB_ADDR][GOV_CHANNELID] = true; - - channelHandlerContractMap[SLASH_CHANNELID] = SLASH_CONTRACT_ADDR; - isRelayRewardFromSystemReward[SLASH_CHANNELID] = true; - registeredContractChannelMap[SLASH_CONTRACT_ADDR][SLASH_CHANNELID] = true; - - batchSizeForOracle = INIT_BATCH_SIZE; - - oracleSequence = -1; - previousTxHeight = 0; - txCounter = 0; - - alreadyInit = true; + revert("deprecated"); } function encodePayload( @@ -244,38 +190,6 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { return payload; } - // | type | relayFee |package | - // | 1 byte | 32 bytes | bytes | - function decodePayloadHeader(bytes memory payload) internal pure returns (bool, uint8, uint256, bytes memory) { - if (payload.length < 33) { - return (false, 0, 0, new bytes(0)); - } - - uint256 ptr; - assembly { - ptr := payload - } - - uint8 packageType; - ptr += 1; - assembly { - packageType := mload(ptr) - } - - uint256 relayFee; - ptr += 32; - assembly { - relayFee := mload(ptr) - } - - ptr += 32; - bytes memory msgBytes = new bytes(payload.length - 33); - (uint256 dst,) = Memory.fromBytes(msgBytes); - Memory.copy(ptr, dst, payload.length - 33); - - return (true, packageType, relayFee, msgBytes); - } - function handlePackage( bytes calldata payload, bytes calldata proof, @@ -292,93 +206,7 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { headerInOrder(height, channelId) whenNotSuspended { - bytes memory payloadLocal = payload; // fix error: stack too deep, try removing local variables - bytes memory proofLocal = proof; // fix error: stack too deep, try removing local variables - require( - MerkleProof.validateMerkleProof( - ILightClient(LIGHT_CLIENT_ADDR).getAppHash(height), - STORE_NAME, - generateKey(packageSequence, channelId), - payloadLocal, - proofLocal - ), - "invalid merkle proof" - ); - - address payable headerRelayer = ILightClient(LIGHT_CLIENT_ADDR).getSubmitter(height); - - uint64 sequenceLocal = packageSequence; // fix error: stack too deep, try removing local variables - uint8 channelIdLocal = channelId; // fix error: stack too deep, try removing local variables - (bool success, uint8 packageType, uint256 relayFee, bytes memory msgBytes) = decodePayloadHeader(payloadLocal); - if (!success) { - emit unsupportedPackage(sequenceLocal, channelIdLocal, payloadLocal); - return; - } - emit receivedPackage(packageType, sequenceLocal, channelIdLocal); - if (packageType == SYN_PACKAGE) { - address handlerContract = channelHandlerContractMap[channelIdLocal]; - try IApplication(handlerContract).handleSynPackage(channelIdLocal, msgBytes) returns ( - bytes memory responsePayload - ) { - if (responsePayload.length != 0) { - sendPackage( - channelSendSequenceMap[channelIdLocal], - channelIdLocal, - encodePayload(ACK_PACKAGE, 0, responsePayload) - ); - channelSendSequenceMap[channelIdLocal] = channelSendSequenceMap[channelIdLocal] + 1; - } - } catch Error(string memory reason) { - sendPackage( - channelSendSequenceMap[channelIdLocal], channelIdLocal, encodePayload(FAIL_ACK_PACKAGE, 0, msgBytes) - ); - channelSendSequenceMap[channelIdLocal] = channelSendSequenceMap[channelIdLocal] + 1; - emit unexpectedRevertInPackageHandler(handlerContract, reason); - } catch (bytes memory lowLevelData) { - sendPackage( - channelSendSequenceMap[channelIdLocal], channelIdLocal, encodePayload(FAIL_ACK_PACKAGE, 0, msgBytes) - ); - channelSendSequenceMap[channelIdLocal] = channelSendSequenceMap[channelIdLocal] + 1; - emit unexpectedFailureAssertionInPackageHandler(handlerContract, lowLevelData); - } - } else if (packageType == ACK_PACKAGE) { - address handlerContract = channelHandlerContractMap[channelIdLocal]; - try IApplication(handlerContract).handleAckPackage(channelIdLocal, msgBytes) { } - catch Error(string memory reason) { - emit unexpectedRevertInPackageHandler(handlerContract, reason); - } catch (bytes memory lowLevelData) { - emit unexpectedFailureAssertionInPackageHandler(handlerContract, lowLevelData); - } - } else if (packageType == FAIL_ACK_PACKAGE) { - address handlerContract = channelHandlerContractMap[channelIdLocal]; - try IApplication(handlerContract).handleFailAckPackage(channelIdLocal, msgBytes) { } - catch Error(string memory reason) { - emit unexpectedRevertInPackageHandler(handlerContract, reason); - } catch (bytes memory lowLevelData) { - emit unexpectedFailureAssertionInPackageHandler(handlerContract, lowLevelData); - } - } - IRelayerIncentivize(INCENTIVIZE_ADDR).addReward( - headerRelayer, - msg.sender, - relayFee, - isRelayRewardFromSystemReward[channelIdLocal] || packageType != SYN_PACKAGE - ); - } - - function sendPackage(uint64 packageSequence, uint8 channelId, bytes memory payload) internal whenNotSuspended { - if (block.number > previousTxHeight) { - ++oracleSequence; - txCounter = 1; - previousTxHeight = block.number; - } else { - ++txCounter; - if (txCounter > batchSizeForOracle) { - ++oracleSequence; - txCounter = 1; - } - } - emit crossChainPackage(bscChainID, uint64(oracleSequence), packageSequence, channelId, payload); + revert("deprecated"); } function sendSynPackage( @@ -386,88 +214,11 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { bytes calldata msgBytes, uint256 relayFee ) external override onlyInit onlyRegisteredContractChannel(channelId) { - uint64 sendSequence = channelSendSequenceMap[channelId]; - sendPackage(sendSequence, channelId, encodePayload(SYN_PACKAGE, relayFee, msgBytes)); - ++sendSequence; - channelSendSequenceMap[channelId] = sendSequence; + revert("deprecated"); } function updateParam(string calldata key, bytes calldata value) external override onlyGov whenNotSuspended { - if (Memory.compareStrings(key, "batchSizeForOracle")) { - uint256 newBatchSizeForOracle = BytesToTypes.bytesToUint256(32, value); - require( - newBatchSizeForOracle <= 10000 && newBatchSizeForOracle >= 10, - "the newBatchSizeForOracle should be in [10, 10000]" - ); - batchSizeForOracle = newBatchSizeForOracle; - } else if (Memory.compareStrings(key, "addOrUpdateChannel")) { - bytes memory valueLocal = value; - require( - valueLocal.length == 22, - "length of value for addOrUpdateChannel should be 22, channelId:isFromSystem:handlerAddress" - ); - uint8 channelId; - assembly { - channelId := mload(add(valueLocal, 1)) - } - - uint8 rewardConfig; - assembly { - rewardConfig := mload(add(valueLocal, 2)) - } - bool isRewardFromSystem = (rewardConfig == 0x0); - - address handlerContract; - assembly { - handlerContract := mload(add(valueLocal, 22)) - } - - require(isContract(handlerContract), "address is not a contract"); - channelHandlerContractMap[channelId] = handlerContract; - registeredContractChannelMap[handlerContract][channelId] = true; - isRelayRewardFromSystemReward[channelId] = isRewardFromSystem; - emit addChannel(channelId, handlerContract); - } else if (Memory.compareStrings(key, "enableOrDisableChannel")) { - bytes memory valueLocal = value; - require( - valueLocal.length == 2, "length of value for enableOrDisableChannel should be 2, channelId:isEnable" - ); - - uint8 channelId; - assembly { - channelId := mload(add(valueLocal, 1)) - } - uint8 status; - assembly { - status := mload(add(valueLocal, 2)) - } - bool isEnable = (status == 1); - - address handlerContract = channelHandlerContractMap[channelId]; - if (handlerContract != address(0x00)) { - //channel existing - registeredContractChannelMap[handlerContract][channelId] = isEnable; - emit enableOrDisableChannel(channelId, isEnable); - } - } else if (Memory.compareStrings(key, "suspendQuorum")) { - require(value.length == 2, "length of value for suspendQuorum should be 2"); - uint16 suspendQuorum = BytesToTypes.bytesToUint16(2, value); - require(suspendQuorum > 0 && suspendQuorum < 100, "invalid suspend quorum"); - quorumMap[SUSPEND_PROPOSAL] = suspendQuorum; - } else if (Memory.compareStrings(key, "reopenQuorum")) { - require(value.length == 2, "length of value for reopenQuorum should be 2"); - uint16 reopenQuorum = BytesToTypes.bytesToUint16(2, value); - require(reopenQuorum > 0 && reopenQuorum < 100, "invalid reopen quorum"); - quorumMap[REOPEN_PROPOSAL] = reopenQuorum; - } else if (Memory.compareStrings(key, "cancelTransferQuorum")) { - require(value.length == 2, "length of value for cancelTransferQuorum should be 2"); - uint16 cancelTransferQuorum = BytesToTypes.bytesToUint16(2, value); - require(cancelTransferQuorum > 0 && cancelTransferQuorum < 100, "invalid cancel transfer quorum"); - quorumMap[CANCEL_TRANSFER_PROPOSAL] = cancelTransferQuorum; - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); + revert("deprecated"); } // BEP-171: Security Enhancement for Cross-Chain Module @@ -487,114 +238,18 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { channelSupported(uint8(params[3])) whenNotSuspended { - // the same key with different values (payloads) - require(keccak256(payload0) != keccak256(payload1), "same payload"); - - bytes memory _key; - uint64 _packageSequence; - uint8 _channelId; - { - _packageSequence = params[2]; - _channelId = uint8(params[3]); - _key = generateKey(_packageSequence, _channelId); - bytes32 _keyHash = keccak256(_key); - require(!challenged[_keyHash], "already challenged"); - - // if succeeding in challenge - challenged[_keyHash] = true; - } - - // verify payload0 + proof0 - { - uint64 _height0 = params[0]; - bytes memory _payload0 = payload0; - bytes memory _proof0 = proof0; - bytes32 _appHash0 = ILightClient(LIGHT_CLIENT_ADDR).getAppHash(_height0); - require( - MerkleProof.validateMerkleProof(_appHash0, STORE_NAME, _key, _payload0, _proof0), - "invalid merkle proof0" - ); - } - - // verify payload1 + proof1 - { - uint64 _height1 = params[1]; - bytes memory _payload1 = payload1; - bytes memory _proof1 = proof1; - bytes32 _appHash1 = ILightClient(LIGHT_CLIENT_ADDR).getAppHash(_height1); - require( - MerkleProof.validateMerkleProof(_appHash1, STORE_NAME, _key, _payload1, _proof1), - "invalid merkle proof1" - ); - } - - _suspend(); - emit SuccessChallenge(msg.sender, _packageSequence, _channelId); + revert("deprecated"); } function suspend() external onlyInit onlyCabinet whenNotSuspended { - bool isExecutable = _approveProposal(SUSPEND_PROPOSAL, EMPTY_CONTENT_HASH); - if (isExecutable) { - _suspend(); - } + revert("deprecated"); } function reopen() external onlyInit onlyCabinet whenSuspended { - bool isExecutable = _approveProposal(REOPEN_PROPOSAL, EMPTY_CONTENT_HASH); - if (isExecutable) { - isSuspended = false; - emit Reopened(msg.sender); - } + revert("deprecated"); } function cancelTransfer(address tokenAddr, address attacker) external onlyInit onlyCabinet { - bytes32 _contentHash = keccak256(abi.encode(tokenAddr, attacker)); - bool isExecutable = _approveProposal(CANCEL_TRANSFER_PROPOSAL, _contentHash); - if (isExecutable) { - ITokenHub(TOKEN_HUB_ADDR).cancelTransferIn(tokenAddr, attacker); - } - } - - function _approveProposal(bytes32 proposalTypeHash, bytes32 _contentHash) internal returns (bool isExecutable) { - if (quorumMap[proposalTypeHash] == 0) { - quorumMap[SUSPEND_PROPOSAL] = INIT_SUSPEND_QUORUM; - quorumMap[REOPEN_PROPOSAL] = INIT_REOPEN_QUORUM; - quorumMap[CANCEL_TRANSFER_PROPOSAL] = INIT_CANCEL_TRANSFER_QUORUM; - } - - EmergencyProposal storage p = emergencyProposals[proposalTypeHash]; - - // It is ok if there is an evil validator always cancel the previous vote, - // the credible validator could use private transaction service to send a batch tx including 2 approve transactions - if (block.timestamp >= p.expiredAt || p.contentHash != _contentHash) { - // current proposal expired / not exist or not same with the new, create a new EmergencyProposal - p.quorum = quorumMap[proposalTypeHash]; - p.expiredAt = uint128(block.timestamp + EMERGENCY_PROPOSAL_EXPIRE_PERIOD); - p.contentHash = _contentHash; - p.approvers = [msg.sender]; - - emit ProposalSubmitted(proposalTypeHash, msg.sender, p.quorum, p.expiredAt, _contentHash); - } else { - // current proposal exists - for (uint256 i = 0; i < p.approvers.length; ++i) { - require(p.approvers[i] != msg.sender, "already approved"); - } - p.approvers.push(msg.sender); - } - - if (p.approvers.length >= p.quorum) { - // 1. remove current proposal - delete emergencyProposals[proposalTypeHash]; - - // 2. exec this proposal - return true; - } - - return false; - } - - function _suspend() internal whenNotSuspended { - isSuspended = true; - emit Suspended(msg.sender); + revert("deprecated"); } } diff --git a/contracts/deprecated/RelayerHub.sol b/contracts/deprecated/RelayerHub.sol index a907fbd2..1b77825e 100644 --- a/contracts/deprecated/RelayerHub.sol +++ b/contracts/deprecated/RelayerHub.sol @@ -59,9 +59,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerAddedProvisionally(address _relayer); function init() external onlyNotInit { - requiredDeposit = INIT_REQUIRED_DEPOSIT; - dues = INIT_DUES; - alreadyInit = true; + revert("deprecated"); } function unregister() external exist onlyInit { diff --git a/contracts/deprecated/RelayerIncentivize.sol b/contracts/deprecated/RelayerIncentivize.sol index 22ba9591..9fb7477e 100644 --- a/contracts/deprecated/RelayerIncentivize.sol +++ b/contracts/deprecated/RelayerIncentivize.sol @@ -47,15 +47,12 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { event rewardToRelayer(address relayer, uint256 amount); function init() external onlyNotInit { - require(!alreadyInit, "already initialized"); - headerRelayerRewardRateMolecule = HEADER_RELAYER_REWARD_RATE_MOLECULE; - headerRelayerRewardRateDenominator = HEADER_RELAYER_REWARD_RATE_DENOMINATOR; - callerCompensationMolecule = CALLER_COMPENSATION_MOLECULE; - callerCompensationDenominator = CALLER_COMPENSATION_DENOMINATOR; - alreadyInit = true; + revert("deprecated"); } - receive() external payable { } + receive() external payable { + revert("deprecated"); + } function addReward( address payable headerRelayerAddr, @@ -63,133 +60,11 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { uint256 amount, bool fromSystemReward ) external override onlyInit onlyCrossChainContract returns (bool) { - uint256 actualAmount; - if (fromSystemReward) { - actualAmount = ISystemReward(SYSTEM_REWARD_ADDR).claimRewards( - address(uint160(INCENTIVIZE_ADDR)), amount.add(dynamicExtraIncentiveAmount) - ); - } else { - actualAmount = ISystemReward(TOKEN_HUB_ADDR).claimRewards(address(uint160(INCENTIVIZE_ADDR)), amount); - if (dynamicExtraIncentiveAmount > 0) { - actualAmount = actualAmount.add( - ISystemReward(SYSTEM_REWARD_ADDR).claimRewards( - address(uint160(INCENTIVIZE_ADDR)), dynamicExtraIncentiveAmount - ) - ); - } - } - - ++countInRound; - - uint256 reward = calculateRewardForHeaderRelayer(actualAmount); - collectedRewardForHeaderRelayer = collectedRewardForHeaderRelayer.add(reward); - collectedRewardForTransferRelayer = collectedRewardForTransferRelayer.add(actualAmount).sub(reward); - - if (headerRelayersSubmitCount[headerRelayerAddr] == 0) { - headerRelayerAddressRecord.push(headerRelayerAddr); - } - ++headerRelayersSubmitCount[headerRelayerAddr]; - - if (packageRelayersSubmitCount[packageRelayer] == 0) { - packageRelayerAddressRecord.push(packageRelayer); - } - ++packageRelayersSubmitCount[packageRelayer]; - - if (countInRound >= ROUND_SIZE) { - emit distributeCollectedReward( - roundSequence, collectedRewardForHeaderRelayer, collectedRewardForTransferRelayer - ); - - uint256 callerHeaderReward = distributeHeaderRelayerReward(); - uint256 callerPackageReward = distributePackageRelayerReward(); - - relayerRewardVault[packageRelayer] = - relayerRewardVault[packageRelayer].add(callerHeaderReward).add(callerPackageReward); - - ++roundSequence; - countInRound = 0; - } - return true; + revert("deprecated"); } function claimRelayerReward(address relayerAddr) external { - uint256 reward = relayerRewardVault[relayerAddr]; - require(reward > 0, "no relayer reward"); - relayerRewardVault[relayerAddr] = 0; - address payable recipient = address(uint160(relayerAddr)); - if (!recipient.send(reward)) { - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); - systemPayable.transfer(reward); - emit rewardToRelayer(SYSTEM_REWARD_ADDR, reward); - return; - } - emit rewardToRelayer(relayerAddr, reward); - } - - function calculateRewardForHeaderRelayer(uint256 reward) internal view returns (uint256) { - return reward.mul(headerRelayerRewardRateMolecule).div(headerRelayerRewardRateDenominator); - } - - function distributeHeaderRelayerReward() internal returns (uint256) { - uint256 totalReward = collectedRewardForHeaderRelayer; - - uint256 totalWeight = 0; - address payable[] memory relayers = headerRelayerAddressRecord; - uint256[] memory relayerWeight = new uint256[](relayers.length); - for (uint256 index = 0; index < relayers.length; ++index) { - address relayer = relayers[index]; - uint256 weight = calculateHeaderRelayerWeight(headerRelayersSubmitCount[relayer]); - relayerWeight[index] = weight; - totalWeight = totalWeight.add(weight); - } - - uint256 callerReward = totalReward.mul(callerCompensationMolecule).div(callerCompensationDenominator); - totalReward = totalReward.sub(callerReward); - uint256 remainReward = totalReward; - for (uint256 index = 1; index < relayers.length; ++index) { - uint256 reward = relayerWeight[index].mul(totalReward).div(totalWeight); - relayerRewardVault[relayers[index]] = relayerRewardVault[relayers[index]].add(reward); - remainReward = remainReward.sub(reward); - } - relayerRewardVault[relayers[0]] = relayerRewardVault[relayers[0]].add(remainReward); - - collectedRewardForHeaderRelayer = 0; - for (uint256 index = 0; index < relayers.length; ++index) { - delete headerRelayersSubmitCount[relayers[index]]; - } - delete headerRelayerAddressRecord; - return callerReward; - } - - function distributePackageRelayerReward() internal returns (uint256) { - uint256 totalReward = collectedRewardForTransferRelayer; - - uint256 totalWeight = 0; - address payable[] memory relayers = packageRelayerAddressRecord; - uint256[] memory relayerWeight = new uint256[](relayers.length); - for (uint256 index = 0; index < relayers.length; ++index) { - address relayer = relayers[index]; - uint256 weight = calculateTransferRelayerWeight(packageRelayersSubmitCount[relayer]); - relayerWeight[index] = weight; - totalWeight = totalWeight + weight; - } - - uint256 callerReward = totalReward.mul(callerCompensationMolecule).div(callerCompensationDenominator); - totalReward = totalReward.sub(callerReward); - uint256 remainReward = totalReward; - for (uint256 index = 1; index < relayers.length; ++index) { - uint256 reward = relayerWeight[index].mul(totalReward).div(totalWeight); - relayerRewardVault[relayers[index]] = relayerRewardVault[relayers[index]].add(reward); - remainReward = remainReward.sub(reward); - } - relayerRewardVault[relayers[0]] = relayerRewardVault[relayers[0]].add(remainReward); - - collectedRewardForTransferRelayer = 0; - for (uint256 index = 0; index < relayers.length; ++index) { - delete packageRelayersSubmitCount[relayers[index]]; - } - delete packageRelayerAddressRecord; - return callerReward; + revert("deprecated"); } function calculateTransferRelayerWeight(uint256 count) public pure returns (uint256) { @@ -213,48 +88,6 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { } function updateParam(string calldata key, bytes calldata value) external override onlyGov { - require(alreadyInit, "contract has not been initialized"); - if (Memory.compareStrings(key, "headerRelayerRewardRateMolecule")) { - require(value.length == 32, "length of headerRelayerRewardRateMolecule mismatch"); - uint256 newHeaderRelayerRewardRateMolecule = BytesToTypes.bytesToUint256(32, value); - require( - newHeaderRelayerRewardRateMolecule <= headerRelayerRewardRateDenominator, - "new headerRelayerRewardRateMolecule shouldn't be greater than headerRelayerRewardRateDenominator" - ); - headerRelayerRewardRateMolecule = newHeaderRelayerRewardRateMolecule; - } else if (Memory.compareStrings(key, "headerRelayerRewardRateDenominator")) { - require(value.length == 32, "length of rewardForValidatorSetChange mismatch"); - uint256 newHeaderRelayerRewardRateDenominator = BytesToTypes.bytesToUint256(32, value); - require( - newHeaderRelayerRewardRateDenominator != 0 - && newHeaderRelayerRewardRateDenominator >= headerRelayerRewardRateMolecule, - "the new headerRelayerRewardRateDenominator must not be zero and no less than headerRelayerRewardRateMolecule" - ); - headerRelayerRewardRateDenominator = newHeaderRelayerRewardRateDenominator; - } else if (Memory.compareStrings(key, "callerCompensationMolecule")) { - require(value.length == 32, "length of rewardForValidatorSetChange mismatch"); - uint256 newCallerCompensationMolecule = BytesToTypes.bytesToUint256(32, value); - require( - newCallerCompensationMolecule <= callerCompensationDenominator, - "new callerCompensationMolecule shouldn't be greater than callerCompensationDenominator" - ); - callerCompensationMolecule = newCallerCompensationMolecule; - } else if (Memory.compareStrings(key, "callerCompensationDenominator")) { - require(value.length == 32, "length of rewardForValidatorSetChange mismatch"); - uint256 newCallerCompensationDenominator = BytesToTypes.bytesToUint256(32, value); - require( - newCallerCompensationDenominator != 0 && newCallerCompensationDenominator >= callerCompensationMolecule, - "the newCallerCompensationDenominator must not be zero and no less than callerCompensationMolecule" - ); - callerCompensationDenominator = newCallerCompensationDenominator; - } else if (Memory.compareStrings(key, "dynamicExtraIncentiveAmount")) { - require(value.length == 32, "length of dynamicExtraIncentiveAmount mismatch"); - uint256 newDynamicExtraIncentiveAmount = BytesToTypes.bytesToUint256(32, value); - require(newDynamicExtraIncentiveAmount >= 0, "the newDynamicExtraIncentiveAmount must be no less than zero"); - dynamicExtraIncentiveAmount = newDynamicExtraIncentiveAmount; - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); + revert("deprecated"); } } diff --git a/contracts/deprecated/Staking.sol b/contracts/deprecated/Staking.sol index b099f7ea..3b7ddb88 100644 --- a/contracts/deprecated/Staking.sol +++ b/contracts/deprecated/Staking.sol @@ -112,94 +112,24 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { event failedSynPackage(uint8 indexed eventType, uint256 errCode); event crashResponse(uint8 indexed eventType); - receive() external payable { } + receive() external payable { + revert("deprecated"); + } /*----------------- Implement cross chain app -----------------*/ function handleSynPackage( uint8, bytes calldata msgBytes ) external override onlyCrossChainContract initParams returns (bytes memory) { - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - uint8 eventType = uint8(iter.next().toUint()); - uint32 resCode; - bytes memory ackPackage; - if (eventType == EVENT_DISTRIBUTE_REWARD) { - (resCode, ackPackage) = _handleDistributeRewardSynPackage(iter); - } else if (eventType == EVENT_DISTRIBUTE_UNDELEGATED) { - (resCode, ackPackage) = _handleDistributeUndelegatedSynPackage(iter); - } else { - revert("unknown event type"); - } - - if (resCode != CODE_OK) { - emit failedSynPackage(eventType, resCode); - } - return ackPackage; + revert("deprecated"); } function handleAckPackage(uint8, bytes calldata msgBytes) external override onlyCrossChainContract initParams { - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - - uint8 status; - uint8 errCode; - bytes memory packBytes; - bool success; - uint256 idx; - while (iter.hasNext()) { - if (idx == 0) { - status = uint8(iter.next().toUint()); - } else if (idx == 1) { - errCode = uint8(iter.next().toUint()); - } else if (idx == 2) { - packBytes = iter.next().toBytes(); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - require(_checkPackHash(packBytes), "wrong pack hash"); - iter = packBytes.toRLPItem().iterator(); - uint8 eventType = uint8(iter.next().toUint()); - RLPDecode.Iterator memory paramIter; - if (iter.hasNext()) { - paramIter = iter.next().toBytes().toRLPItem().iterator(); - } else { - revert("empty ack package"); - } - if (eventType == EVENT_DELEGATE) { - _handleDelegateAckPackage(paramIter, status, errCode); - } else if (eventType == EVENT_UNDELEGATE) { - _handleUndelegateAckPackage(paramIter, status, errCode); - } else if (eventType == EVENT_REDELEGATE) { - _handleRedelegateAckPackage(paramIter, status, errCode); - } else { - revert("unknown event type"); - } + revert("deprecated"); } function handleFailAckPackage(uint8, bytes calldata msgBytes) external override onlyCrossChainContract initParams { - require(_checkPackHash(msgBytes), "wrong pack hash"); - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - uint8 eventType = uint8(iter.next().toUint()); - RLPDecode.Iterator memory paramIter; - if (iter.hasNext()) { - paramIter = iter.next().toBytes().toRLPItem().iterator(); - } else { - revert("empty fail ack package"); - } - if (eventType == EVENT_DELEGATE) { - _handleDelegateFailAckPackage(paramIter); - } else if (eventType == EVENT_UNDELEGATE) { - _handleUndelegateFailAckPackage(paramIter); - } else if (eventType == EVENT_REDELEGATE) { - _handleRedelegateFailAckPackage(paramIter); - } else { - revert("unknown event type"); - } - return; + revert("deprecated"); } /*----------------- External functions -----------------*/ @@ -220,39 +150,7 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { address validator, uint256 amount ) external payable override noReentrant tenDecimalPrecision(amount) initParams { - require(msg.value >= relayerFee, "not enough relay fee"); - if (amount < minDelegation) { - require(amount == delegatedOfValidator[msg.sender][validator], "invalid amount"); - require(amount > bSCRelayerFee, "not enough funds"); - } - require(block.timestamp >= pendingUndelegateTime[msg.sender][validator], "pending undelegation exist"); - uint256 remainBalance = delegatedOfValidator[msg.sender][validator].sub(amount, "not enough funds"); - if (remainBalance != 0) { - require(remainBalance > bSCRelayerFee, "insufficient balance after undelegate"); - } - - uint256 convertedAmount = amount.div(TEN_DECIMALS); // native bnb decimals is 8 on BBC, while the native bnb decimals on BSC is 18 - uint256 _relayerFee = msg.value; - uint256 oracleRelayerFee = _relayerFee.sub(bSCRelayerFee); - - bytes[] memory elements = new bytes[](3); - elements[0] = msg.sender.encodeAddress(); - elements[1] = validator.encodeAddress(); - elements[2] = convertedAmount.encodeUint(); - bytes memory msgBytes = _RLPEncode(EVENT_UNDELEGATE, elements.encodeList()); - packageQueue[rightIndex] = keccak256(msgBytes); - ++rightIndex; - undelegateInFly[msg.sender] += 1; - - pendingUndelegateTime[msg.sender][validator] = block.timestamp.add(LOCK_TIME); - - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - CROSS_STAKE_CHANNELID, msgBytes, oracleRelayerFee.div(TEN_DECIMALS) - ); - payable(TOKEN_HUB_ADDR).transfer(oracleRelayerFee); - payable(SYSTEM_REWARD_ADDR).transfer(bSCRelayerFee); - - emit undelegateSubmitted(msg.sender, validator, amount, oracleRelayerFee); + revert("deprecated"); } /** @@ -335,356 +233,9 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { } /*----------------- Internal functions -----------------*/ - function _RLPEncode(uint8 eventType, bytes memory msgBytes) internal pure returns (bytes memory output) { - bytes[] memory elements = new bytes[](2); - elements[0] = eventType.encodeUint(); - elements[1] = msgBytes.encodeBytes(); - output = elements.encodeList(); - } - - function _encodeRefundPackage( - uint8 eventType, - address recipient, - uint256 amount, - uint32 errorCode - ) internal pure returns (uint32, bytes memory) { - amount = amount.div(TEN_DECIMALS); - bytes[] memory elements = new bytes[](4); - elements[0] = eventType.encodeUint(); - elements[1] = recipient.encodeAddress(); - elements[2] = amount.encodeUint(); - elements[3] = errorCode.encodeUint(); - bytes memory packageBytes = elements.encodeList(); - return (errorCode, packageBytes); - } - - function _checkPackHash(bytes memory packBytes) internal returns (bool) { - bytes32 revHash = keccak256(packBytes); - bytes32 expHash = packageQueue[leftIndex]; - if (revHash != expHash) { - return false; - } - delete packageQueue[leftIndex]; - ++leftIndex; - return true; - } /*----------------- Param update -----------------*/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { - if (Memory.compareStrings(key, "relayerFee")) { - require(value.length == 32, "length of relayerFee mismatch"); - uint256 newRelayerFee = BytesToTypes.bytesToUint256(32, value); - require(newRelayerFee < minDelegation, "the relayerFee must be less than minDelegation"); - require(newRelayerFee > bSCRelayerFee, "the relayerFee must be more than BSCRelayerFee"); - require(newRelayerFee % TEN_DECIMALS == 0, "the relayerFee mod ten decimals must be zero"); - relayerFee = newRelayerFee; - } else if (Memory.compareStrings(key, "bSCRelayerFee")) { - require(value.length == 32, "length of bSCRelayerFee mismatch"); - uint256 newBSCRelayerFee = BytesToTypes.bytesToUint256(32, value); - require(newBSCRelayerFee != 0, "the BSCRelayerFee must not be zero"); - require(newBSCRelayerFee < relayerFee, "the BSCRelayerFee must be less than relayerFee"); - require(newBSCRelayerFee % TEN_DECIMALS == 0, "the BSCRelayerFee mod ten decimals must be zero"); - bSCRelayerFee = newBSCRelayerFee; - } else if (Memory.compareStrings(key, "minDelegation")) { - require(value.length == 32, "length of minDelegation mismatch"); - uint256 newMinDelegation = BytesToTypes.bytesToUint256(32, value); - require(newMinDelegation > relayerFee, "the minDelegation must be greater than relayerFee"); - minDelegation = newMinDelegation; - } else if (Memory.compareStrings(key, "transferGas")) { - require(value.length == 32, "length of transferGas mismatch"); - uint256 newTransferGas = BytesToTypes.bytesToUint256(32, value); - require(newTransferGas > 0, "the transferGas cannot be zero"); - transferGas = newTransferGas; - } else { - revert("unknown param"); - } - emit paramChange(key, value); - } - - /*----------------- Handle cross-chain package -----------------*/ - function _handleDelegateAckPackage(RLPDecode.Iterator memory paramIter, uint8 status, uint8 errCode) internal { - bool success; - uint256 idx; - address delegator; - address validator; - uint256 bcAmount; - while (paramIter.hasNext()) { - if (idx == 0) { - delegator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 1) { - validator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 2) { - bcAmount = uint256(paramIter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - uint256 amount = bcAmount.mul(TEN_DECIMALS); - delegateInFly[delegator] -= 1; - if (status == CODE_SUCCESS) { - require(errCode == 0, "wrong status"); - delegated[delegator] = delegated[delegator].add(amount); - delegatedOfValidator[delegator][validator] = delegatedOfValidator[delegator][validator].add(amount); - - emit delegateSuccess(delegator, validator, amount); - } else if (status == CODE_FAILED) { - undelegated[delegator] = undelegated[delegator].add(amount); - require(ITokenHub(TOKEN_HUB_ADDR).withdrawStakingBNB(amount), "withdraw bnb failed"); - - emit delegateFailed(delegator, validator, amount, errCode); - } else { - revert("wrong status"); - } - } - - function _handleDelegateFailAckPackage(RLPDecode.Iterator memory paramIter) internal { - bool success; - uint256 idx; - address delegator; - address validator; - uint256 bcAmount; - while (paramIter.hasNext()) { - if (idx == 0) { - delegator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 1) { - validator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 2) { - bcAmount = uint256(paramIter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - uint256 amount = bcAmount.mul(TEN_DECIMALS); - delegateInFly[delegator] -= 1; - undelegated[delegator] = undelegated[delegator].add(amount); - require(ITokenHub(TOKEN_HUB_ADDR).withdrawStakingBNB(amount), "withdraw bnb failed"); - - emit crashResponse(EVENT_DELEGATE); - } - - function _handleUndelegateAckPackage(RLPDecode.Iterator memory paramIter, uint8 status, uint8 errCode) internal { - bool success; - uint256 idx; - address delegator; - address validator; - uint256 bcAmount; - while (paramIter.hasNext()) { - if (idx == 0) { - delegator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 1) { - validator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 2) { - bcAmount = uint256(paramIter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - uint256 amount = bcAmount.mul(TEN_DECIMALS); - undelegateInFly[delegator] -= 1; - if (status == CODE_SUCCESS) { - require(errCode == 0, "wrong status"); - delegated[delegator] = delegated[delegator].sub(amount); - delegatedOfValidator[delegator][validator] = delegatedOfValidator[delegator][validator].sub(amount); - pendingUndelegateTime[delegator][validator] = block.timestamp.add(LOCK_TIME); - - emit undelegateSuccess(delegator, validator, amount); - } else if (status == CODE_FAILED) { - pendingUndelegateTime[delegator][validator] = 0; - emit undelegateFailed(delegator, validator, amount, errCode); - } else { - revert("wrong status"); - } - } - - function _handleUndelegateFailAckPackage(RLPDecode.Iterator memory paramIter) internal { - bool success; - uint256 idx; - address delegator; - address validator; - uint256 bcAmount; - while (paramIter.hasNext()) { - if (idx == 0) { - delegator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 1) { - validator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 2) { - bcAmount = uint256(paramIter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - undelegateInFly[delegator] -= 1; - pendingUndelegateTime[delegator][validator] = 0; - - emit crashResponse(EVENT_UNDELEGATE); - } - - function _handleRedelegateAckPackage(RLPDecode.Iterator memory paramIter, uint8 status, uint8 errCode) internal { - bool success; - uint256 idx; - address delegator; - address valSrc; - address valDst; - uint256 bcAmount; - while (paramIter.hasNext()) { - if (idx == 0) { - delegator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 1) { - valSrc = address(uint160(paramIter.next().toAddress())); - } else if (idx == 2) { - valDst = address(uint160(paramIter.next().toAddress())); - } else if (idx == 3) { - bcAmount = uint256(paramIter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - uint256 amount = bcAmount.mul(TEN_DECIMALS); - redelegateInFly[delegator] -= 1; - if (status == CODE_SUCCESS) { - require(errCode == 0, "wrong status"); - delegatedOfValidator[delegator][valSrc] = delegatedOfValidator[delegator][valSrc].sub(amount); - delegatedOfValidator[delegator][valDst] = delegatedOfValidator[delegator][valDst].add(amount); - pendingRedelegateTime[delegator][valSrc][valDst] = block.timestamp.add(LOCK_TIME); - pendingRedelegateTime[delegator][valDst][valSrc] = block.timestamp.add(LOCK_TIME); - - emit redelegateSuccess(delegator, valSrc, valDst, amount); - } else if (status == CODE_FAILED) { - pendingRedelegateTime[delegator][valSrc][valDst] = 0; - pendingRedelegateTime[delegator][valDst][valSrc] = 0; - emit redelegateFailed(delegator, valSrc, valDst, amount, errCode); - } else { - revert("wrong status"); - } - } - - function _handleRedelegateFailAckPackage(RLPDecode.Iterator memory paramIter) internal { - bool success; - uint256 idx; - address delegator; - address valSrc; - address valDst; - uint256 bcAmount; - while (paramIter.hasNext()) { - if (idx == 0) { - delegator = address(uint160(paramIter.next().toAddress())); - } else if (idx == 1) { - valSrc = address(uint160(paramIter.next().toAddress())); - } else if (idx == 2) { - valDst = address(uint160(paramIter.next().toAddress())); - } else if (idx == 3) { - bcAmount = uint256(paramIter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - redelegateInFly[delegator] -= 1; - pendingRedelegateTime[delegator][valSrc][valDst] = 0; - pendingRedelegateTime[delegator][valDst][valSrc] = 0; - - emit crashResponse(EVENT_REDELEGATE); - } - - function _handleDistributeRewardSynPackage(RLPDecode.Iterator memory iter) - internal - returns (uint32, bytes memory) - { - bool success; - uint256 idx; - address recipient; - uint256 amount; - while (iter.hasNext()) { - if (idx == 0) { - recipient = address(uint160(iter.next().toAddress())); - } else if (idx == 1) { - amount = uint256(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - bool ok = ITokenHub(TOKEN_HUB_ADDR).withdrawStakingBNB(amount); - if (!ok) { - return _encodeRefundPackage(EVENT_DISTRIBUTE_REWARD, recipient, amount, ERROR_WITHDRAW_BNB); - } - - distributedReward[recipient] = distributedReward[recipient].add(amount); - - emit rewardReceived(recipient, amount); - return (CODE_OK, new bytes(0)); - } - - function _handleDistributeUndelegatedSynPackage(RLPDecode.Iterator memory iter) - internal - returns (uint32, bytes memory) - { - bool success; - uint256 idx; - address recipient; - address validator; - uint256 amount; - bool isAutoUndelegate; - while (iter.hasNext()) { - if (idx == 0) { - recipient = address(uint160(iter.next().toAddress())); - } else if (idx == 1) { - validator = address(uint160(iter.next().toAddress())); - } else if (idx == 2) { - amount = uint256(iter.next().toUint()); - success = true; - } else if (idx == 3) { - isAutoUndelegate = iter.next().toBoolean(); - } else { - break; - } - ++idx; - } - require(success, "rlp decode failed"); - - bool ok = ITokenHub(TOKEN_HUB_ADDR).withdrawStakingBNB(amount); - if (!ok) { - return _encodeRefundPackage(EVENT_DISTRIBUTE_UNDELEGATED, recipient, amount, ERROR_WITHDRAW_BNB); - } - - pendingUndelegateTime[recipient][validator] = 0; - undelegated[recipient] = undelegated[recipient].add(amount); - - // this is to address the issue that the contract state will not being updated - // when the Beacon Chain system undelegate all the funds after second sunset upgrade - if (isAutoUndelegate) { - delegated[recipient] = delegated[recipient].sub(amount); - delegatedOfValidator[recipient][validator] = delegatedOfValidator[recipient][validator].sub(amount); - emit undelegateSuccess(recipient, validator, amount); - } - - emit undelegatedReceived(recipient, validator, amount); - return (CODE_OK, new bytes(0)); + revert("deprecated"); } } diff --git a/contracts/deprecated/TendermintLightClient.sol b/contracts/deprecated/TendermintLightClient.sol index ad971bdf..c1e1f7fb 100644 --- a/contracts/deprecated/TendermintLightClient.sol +++ b/contracts/deprecated/TendermintLightClient.sol @@ -31,100 +31,11 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { event paramChange(string key, bytes value); function init() external onlyNotInit { - uint256 pointer; - uint256 length; - (pointer, length) = Memory.fromBytes(INIT_CONSENSUS_STATE_BYTES); - - /* solium-disable-next-line */ - assembly { - sstore(chainID_slot, mload(pointer)) - } - - ConsensusState memory cs; - uint64 height; - (cs, height) = decodeConsensusState(pointer, length, false); - cs.preValidatorSetChangeHeight = 0; - lightClientConsensusStates[height] = cs; - - initialHeight = height; - latestHeight = height; - alreadyInit = true; - rewardForValidatorSetChange = INIT_REWARD_FOR_VALIDATOR_SER_CHANGE; - - emit initConsensusState(initialHeight, cs.appHash); + revert("deprecated"); } function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer returns (bool) { - require(submitters[height] == address(0x0), "can't sync duplicated header"); - require(height > initialHeight, "can't sync header before initialHeight"); - - uint64 preValidatorSetChangeHeight = latestHeight; - ConsensusState memory cs = lightClientConsensusStates[preValidatorSetChangeHeight]; - for (; preValidatorSetChangeHeight >= height && preValidatorSetChangeHeight >= initialHeight;) { - preValidatorSetChangeHeight = cs.preValidatorSetChangeHeight; - cs = lightClientConsensusStates[preValidatorSetChangeHeight]; - } - if (cs.nextValidatorSet.length == 0) { - preValidatorSetChangeHeight = cs.preValidatorSetChangeHeight; - cs.nextValidatorSet = lightClientConsensusStates[preValidatorSetChangeHeight].nextValidatorSet; - require(cs.nextValidatorSet.length != 0, "failed to load validator set data"); - } - - //32 + 32 + 8 + 32 + 32 + cs.nextValidatorSet.length; - uint256 length = 136 + cs.nextValidatorSet.length; - bytes memory input = new bytes(length + header.length); - uint256 ptr = Memory.dataPtr(input); - require( - encodeConsensusState(cs, preValidatorSetChangeHeight, ptr, length), "failed to serialize consensus state" - ); - - // write header to input - uint256 src; - ptr = ptr + length; - (src, length) = Memory.fromBytes(header); - Memory.copy(src, ptr, length); - - length = input.length + 32; - // Maximum validator quantity is 99 - bytes32[128] memory result; - /* solium-disable-next-line */ - assembly { - // call validateTendermintHeader precompile contract - // Contract address: 0x64 - if iszero(staticcall(not(0), 0x64, input, length, result, 4096)) { revert(0, 0) } - } - - //Judge if the validator set is changed - /* solium-disable-next-line */ - assembly { - length := mload(add(result, 0)) - } - bool validatorChanged = false; - if ((length & (0x01 << 248)) != 0x00) { - validatorChanged = true; - ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(msg.sender, rewardForValidatorSetChange); - } - length = length & 0xffffffffffffffff; - - /* solium-disable-next-line */ - assembly { - ptr := add(result, 32) - } - - uint64 actualHeaderHeight; - (cs, actualHeaderHeight) = decodeConsensusState(ptr, length, !validatorChanged); - require(actualHeaderHeight == height, "header height doesn't equal to the specified height"); - - submitters[height] = msg.sender; - cs.preValidatorSetChangeHeight = preValidatorSetChangeHeight; - lightClientConsensusStates[height] = cs; - if (height > latestHeight) { - latestHeight = height; - } - - emit syncConsensusState(height, preValidatorSetChangeHeight, cs.appHash, validatorChanged); - - return true; + revert("deprecated"); } function isHeaderSynced(uint64 height) external view override returns (bool) { @@ -162,116 +73,7 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { return string(chainIDStr); } - // | length | chainID | height | appHash | curValidatorSetHash | [{validator pubkey, voting power}] | - // | 32 bytes | 32 bytes | 8 bytes | 32 bytes | 32 bytes | [{32 bytes, 8 bytes}] | - /* solium-disable-next-line */ - function encodeConsensusState( - ConsensusState memory cs, - uint64 height, - uint256 outputPtr, - uint256 size - ) internal view returns (bool) { - outputPtr = outputPtr + size - cs.nextValidatorSet.length; - - uint256 src; - uint256 length; - (src, length) = Memory.fromBytes(cs.nextValidatorSet); - Memory.copy(src, outputPtr, length); - outputPtr = outputPtr - 32; - - bytes32 hash = cs.curValidatorSetHash; - /* solium-disable-next-line */ - assembly { - mstore(outputPtr, hash) - } - outputPtr = outputPtr - 32; - - hash = cs.appHash; - /* solium-disable-next-line */ - assembly { - mstore(outputPtr, hash) - } - outputPtr = outputPtr - 32; - - /* solium-disable-next-line */ - assembly { - mstore(outputPtr, height) - } - outputPtr = outputPtr - 8; - - /* solium-disable-next-line */ - assembly { - mstore(outputPtr, sload(chainID_slot)) - } - outputPtr = outputPtr - 32; - - // size doesn't contain length - size = size - 32; - /* solium-disable-next-line */ - assembly { - mstore(outputPtr, size) - } - - return true; - } - - // | chainID | height | appHash | curValidatorSetHash | [{validator pubkey, voting power}] | - // | 32 bytes | 8 bytes | 32 bytes | 32 bytes | [{32 bytes, 8 bytes}] | - /* solium-disable-next-line */ - function decodeConsensusState( - uint256 ptr, - uint256 size, - bool leaveOutValidatorSet - ) internal pure returns (ConsensusState memory, uint64) { - ptr = ptr + 8; - uint64 height; - /* solium-disable-next-line */ - assembly { - height := mload(ptr) - } - - ptr = ptr + 32; - bytes32 appHash; - /* solium-disable-next-line */ - assembly { - appHash := mload(ptr) - } - - ptr = ptr + 32; - bytes32 curValidatorSetHash; - /* solium-disable-next-line */ - assembly { - curValidatorSetHash := mload(ptr) - } - - ConsensusState memory cs; - cs.appHash = appHash; - cs.curValidatorSetHash = curValidatorSetHash; - - if (!leaveOutValidatorSet) { - uint256 dest; - uint256 length; - cs.nextValidatorSet = new bytes(size - 104); - (dest, length) = Memory.fromBytes(cs.nextValidatorSet); - - Memory.copy(ptr + 32, dest, length); - } - - return (cs, height); - } - function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { - if (Memory.compareStrings(key, "rewardForValidatorSetChange")) { - require(value.length == 32, "length of rewardForValidatorSetChange mismatch"); - uint256 newRewardForValidatorSetChange = BytesToTypes.bytesToUint256(32, value); - require( - newRewardForValidatorSetChange > 0 && newRewardForValidatorSetChange <= 1e18, - "the newRewardForValidatorSetChange out of range" - ); - rewardForValidatorSetChange = newRewardForValidatorSetChange; - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); + revert("deprecated"); } } diff --git a/contracts/deprecated/TokenManager.sol b/contracts/deprecated/TokenManager.sol index 4e06cdde..3111b54b 100644 --- a/contracts/deprecated/TokenManager.sol +++ b/contracts/deprecated/TokenManager.sol @@ -127,504 +127,39 @@ contract TokenManager is System, IApplication, IParamSubscriber { uint8 channelId, bytes calldata msgBytes ) external override onlyCrossChainContract returns (bytes memory) { - if (channelId == BIND_CHANNELID) { - return handleBindSynPackage(msgBytes); - } else { - emit unexpectedPackage(channelId, msgBytes); - return new bytes(0); - } + revert("deprecated"); } function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external override onlyCrossChainContract { - if (channelId == MIRROR_CHANNELID) { - handleMirrorAckPackage(msgBytes); - } else if (channelId == SYNC_CHANNELID) { - handleSyncAckPackage(msgBytes); - } else { - emit unexpectedPackage(channelId, msgBytes); - } + revert("deprecated"); } function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) external override onlyCrossChainContract { - if (channelId == MIRROR_CHANNELID) { - handleMirrorFailAckPackage(msgBytes); - } else if (channelId == SYNC_CHANNELID) { - handleSyncFailAckPackage(msgBytes); - } else { - emit unexpectedPackage(channelId, msgBytes); - } - } - - function decodeBindSynPackage(bytes memory msgBytes) internal pure returns (BindSynPackage memory, bool) { - BindSynPackage memory bindSynPkg; - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - bindSynPkg.packageType = uint8(iter.next().toUint()); - } else if (idx == 1) { - bindSynPkg.bep2TokenSymbol = bytes32(iter.next().toUint()); - } else if (idx == 2) { - bindSynPkg.contractAddr = iter.next().toAddress(); - } else if (idx == 3) { - bindSynPkg.totalSupply = iter.next().toUint(); - } else if (idx == 4) { - bindSynPkg.peggyAmount = iter.next().toUint(); - } else if (idx == 5) { - bindSynPkg.bep20Decimals = uint8(iter.next().toUint()); - } else if (idx == 6) { - bindSynPkg.expireTime = uint64(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (bindSynPkg, success); - } - - function handleBindSynPackage(bytes memory msgBytes) internal returns (bytes memory) { - (BindSynPackage memory bindSynPkg, bool success) = decodeBindSynPackage(msgBytes); - require(success, "unrecognized transferIn package"); - if (bindSynPkg.packageType == BIND_PACKAGE) { - bindPackageRecord[bindSynPkg.bep2TokenSymbol] = bindSynPkg; - } else if (bindSynPkg.packageType == UNBIND_PACKAGE) { - address contractAddr = ITokenHub(TOKEN_HUB_ADDR).getContractAddrByBEP2Symbol(bindSynPkg.bep2TokenSymbol); - if (contractAddr != address(0x00)) { - ITokenHub(TOKEN_HUB_ADDR).unbindToken(bindSynPkg.bep2TokenSymbol, contractAddr); - } - } else { - require(false, "unrecognized bind package"); - } - return new bytes(0); - } - - function encodeReactBindSynPackage(ReactBindSynPackage memory reactBindSynPackage) - internal - pure - returns (bytes memory) - { - bytes[] memory elements = new bytes[](2); - elements[0] = reactBindSynPackage.status.encodeUint(); - elements[1] = uint256(reactBindSynPackage.bep2TokenSymbol).encodeUint(); - return elements.encodeList(); + revert("deprecated"); } function approveBind(address contractAddr, string memory bep2Symbol) public payable returns (bool) { - require(!mirrorPendingRecord[contractAddr], "the bep20 token is in mirror pending status"); - bytes32 bep2TokenSymbol = bep2TokenSymbolConvert(bep2Symbol); - BindSynPackage memory bindSynPkg = bindPackageRecord[bep2TokenSymbol]; - require(bindSynPkg.bep2TokenSymbol != bytes32(0x00), "bind request doesn't exist"); - uint256 lockedAmount = bindSynPkg.totalSupply.sub(bindSynPkg.peggyAmount); - require( - contractAddr == bindSynPkg.contractAddr, - "contact address doesn't equal to the contract address in bind request" - ); - require(IBEP20(contractAddr).getOwner() == msg.sender, "only bep20 owner can approve this bind request"); - uint256 tokenHubBalance = IBEP20(contractAddr).balanceOf(TOKEN_HUB_ADDR); - require( - IBEP20(contractAddr).allowance(msg.sender, address(this)).add(tokenHubBalance) >= lockedAmount, - "allowance is not enough" - ); - uint256 relayFee = msg.value; - uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee(); - require( - relayFee >= miniRelayFee && relayFee % TEN_DECIMALS == 0, - "relayFee must be N * 1e10 and greater than miniRelayFee" - ); - - uint32 verifyCode = verifyBindParameters(bindSynPkg, contractAddr); - if (verifyCode == CODE_OK) { - IBEP20(contractAddr).transferFrom(msg.sender, TOKEN_HUB_ADDR, lockedAmount.sub(tokenHubBalance)); - ITokenHub(TOKEN_HUB_ADDR).bindToken( - bindSynPkg.bep2TokenSymbol, bindSynPkg.contractAddr, bindSynPkg.bep20Decimals - ); - emit bindSuccess(contractAddr, bep2Symbol, bindSynPkg.totalSupply, lockedAmount); - } else { - emit bindFailure(contractAddr, bep2Symbol, verifyCode); - } - delete bindPackageRecord[bep2TokenSymbol]; - ReactBindSynPackage memory reactBindSynPackage = - ReactBindSynPackage({ status: verifyCode, bep2TokenSymbol: bep2TokenSymbol }); - address(uint160(TOKEN_HUB_ADDR)).transfer(relayFee); - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - BIND_CHANNELID, encodeReactBindSynPackage(reactBindSynPackage), relayFee.div(TEN_DECIMALS) - ); - return true; + revert("deprecated"); } function rejectBind(address contractAddr, string memory bep2Symbol) public payable returns (bool) { - bytes32 bep2TokenSymbol = bep2TokenSymbolConvert(bep2Symbol); - BindSynPackage memory bindSynPkg = bindPackageRecord[bep2TokenSymbol]; - require(bindSynPkg.bep2TokenSymbol != bytes32(0x00), "bind request doesn't exist"); - require( - contractAddr == bindSynPkg.contractAddr, - "contact address doesn't equal to the contract address in bind request" - ); - require(IBEP20(contractAddr).getOwner() == msg.sender, "only bep20 owner can reject"); - uint256 relayFee = msg.value; - uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee(); - require( - relayFee >= miniRelayFee && relayFee % TEN_DECIMALS == 0, - "relayFee must be N * 1e10 and greater than miniRelayFee" - ); - delete bindPackageRecord[bep2TokenSymbol]; - ReactBindSynPackage memory reactBindSynPackage = - ReactBindSynPackage({ status: BIND_STATUS_REJECTED, bep2TokenSymbol: bep2TokenSymbol }); - address(uint160(TOKEN_HUB_ADDR)).transfer(relayFee); - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - BIND_CHANNELID, encodeReactBindSynPackage(reactBindSynPackage), relayFee.div(TEN_DECIMALS) - ); - emit bindFailure(contractAddr, bep2Symbol, BIND_STATUS_REJECTED); - return true; + revert("deprecated"); } function expireBind(string memory bep2Symbol) public payable returns (bool) { - bytes32 bep2TokenSymbol = bep2TokenSymbolConvert(bep2Symbol); - BindSynPackage memory bindSynPkg = bindPackageRecord[bep2TokenSymbol]; - require(bindSynPkg.bep2TokenSymbol != bytes32(0x00), "bind request doesn't exist"); - require(bindSynPkg.expireTime < block.timestamp, "bind request is not expired"); - uint256 relayFee = msg.value; - uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee(); - require( - relayFee >= miniRelayFee && relayFee % TEN_DECIMALS == 0, - "relayFee must be N * 1e10 and greater than miniRelayFee" - ); - delete bindPackageRecord[bep2TokenSymbol]; - ReactBindSynPackage memory reactBindSynPackage = - ReactBindSynPackage({ status: BIND_STATUS_TIMEOUT, bep2TokenSymbol: bep2TokenSymbol }); - address(uint160(TOKEN_HUB_ADDR)).transfer(relayFee); - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - BIND_CHANNELID, encodeReactBindSynPackage(reactBindSynPackage), relayFee.div(TEN_DECIMALS) - ); - emit bindFailure(bindSynPkg.contractAddr, bep2Symbol, BIND_STATUS_TIMEOUT); - return true; - } - - function encodeMirrorSynPackage(MirrorSynPackage memory mirrorSynPackage) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](8); - elements[0] = mirrorSynPackage.mirrorSender.encodeAddress(); - elements[1] = mirrorSynPackage.bep20Addr.encodeAddress(); - elements[2] = uint256(mirrorSynPackage.bep20Name).encodeUint(); - elements[3] = uint256(mirrorSynPackage.bep20Symbol).encodeUint(); - elements[4] = mirrorSynPackage.bep20Supply.encodeUint(); - elements[5] = uint256(mirrorSynPackage.bep20Decimals).encodeUint(); - elements[6] = mirrorSynPackage.mirrorFee.encodeUint(); - elements[7] = uint256(mirrorSynPackage.expireTime).encodeUint(); - return elements.encodeList(); - } - - function decodeMirrorSynPackage(bytes memory msgBytes) internal pure returns (MirrorSynPackage memory, bool) { - MirrorSynPackage memory mirrorSynPackage; - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - mirrorSynPackage.mirrorSender = iter.next().toAddress(); - } else if (idx == 1) { - mirrorSynPackage.bep20Addr = iter.next().toAddress(); - } else if (idx == 2) { - mirrorSynPackage.bep20Name = bytes32(iter.next().toUint()); - } else if (idx == 3) { - mirrorSynPackage.bep20Symbol = bytes32(iter.next().toUint()); - } else if (idx == 4) { - mirrorSynPackage.bep20Supply = iter.next().toUint(); - } else if (idx == 5) { - mirrorSynPackage.bep20Decimals = uint8(iter.next().toUint()); - } else if (idx == 6) { - mirrorSynPackage.mirrorFee = iter.next().toUint(); - } else if (idx == 7) { - mirrorSynPackage.expireTime = uint64(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (mirrorSynPackage, success); - } - - function decodeMirrorAckPackage(bytes memory msgBytes) internal pure returns (MirrorAckPackage memory, bool) { - MirrorAckPackage memory mirrorAckPackage; - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - mirrorAckPackage.mirrorSender = iter.next().toAddress(); - } else if (idx == 1) { - mirrorAckPackage.bep20Addr = iter.next().toAddress(); - } else if (idx == 2) { - mirrorAckPackage.bep20Decimals = uint8(iter.next().toUint()); - } else if (idx == 3) { - mirrorAckPackage.bep2Symbol = bytes32(iter.next().toUint()); - } else if (idx == 4) { - mirrorAckPackage.mirrorFee = iter.next().toUint(); - } else if (idx == 5) { - mirrorAckPackage.errorCode = uint8(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (mirrorAckPackage, success); + revert("deprecated"); } function mirror(address bep20Addr, uint64 expireTime) public payable returns (bool) { - require(ITokenHub(TOKEN_HUB_ADDR).getBep2SymbolByContractAddr(bep20Addr) == bytes32(0x00), "already bound"); - require(!mirrorPendingRecord[bep20Addr], "mirror pending"); - uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee(); - require( - msg.value % TEN_DECIMALS == 0 && msg.value >= mirrorFee.add(miniRelayFee), - "msg.value must be N * 1e10 and greater than sum of miniRelayFee and mirrorFee" - ); - require( - expireTime >= block.timestamp + 120 && expireTime <= block.timestamp + 86400, - "expireTime must be two minutes later and one day earlier" - ); - uint8 decimals = IBEP20(bep20Addr).decimals(); - uint256 totalSupply = IBEP20(bep20Addr).totalSupply(); - require(convertToBep2Amount(totalSupply, decimals) <= MAX_BEP2_TOTAL_SUPPLY, "too large total supply"); - string memory name = IBEP20(bep20Addr).name(); - bytes memory nameBytes = bytes(name); - require(nameBytes.length >= 1 && nameBytes.length <= 32, "name length must be in [1,32]"); - string memory symbol = IBEP20(bep20Addr).symbol(); - bytes memory symbolBytes = bytes(symbol); - require( - symbolBytes.length >= MINIMUM_BEP20_SYMBOL_LEN && symbolBytes.length <= MAXIMUM_BEP20_SYMBOL_LEN, - "symbol length must be in [2,8]" - ); - for (uint8 i = 0; i < symbolBytes.length; ++i) { - require( - (symbolBytes[i] >= "A" && symbolBytes[i] <= "Z") || (symbolBytes[i] >= "a" && symbolBytes[i] <= "z") - || (symbolBytes[i] >= "0" && symbolBytes[i] <= "9"), - "symbol should only contain alphabet and number" - ); - } - address(uint160(TOKEN_HUB_ADDR)).transfer(msg.value.sub(mirrorFee)); - mirrorPendingRecord[bep20Addr] = true; - bytes32 bytes32Name; - assembly { - bytes32Name := mload(add(name, 32)) - } - bytes32 bytes32Symbol; - assembly { - bytes32Symbol := mload(add(symbol, 32)) - } - MirrorSynPackage memory mirrorSynPackage = MirrorSynPackage({ - mirrorSender: msg.sender, - bep20Addr: bep20Addr, - bep20Name: bytes32Name, - bep20Symbol: bytes32Symbol, - bep20Supply: totalSupply, - bep20Decimals: decimals, - mirrorFee: mirrorFee.div(TEN_DECIMALS), - expireTime: expireTime - }); - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - MIRROR_CHANNELID, encodeMirrorSynPackage(mirrorSynPackage), msg.value.sub(mirrorFee).div(TEN_DECIMALS) - ); - return true; - } - - function handleMirrorAckPackage(bytes memory msgBytes) internal { - (MirrorAckPackage memory mirrorAckPackage, bool decodeSuccess) = decodeMirrorAckPackage(msgBytes); - require(decodeSuccess, "unrecognized package"); - mirrorPendingRecord[mirrorAckPackage.bep20Addr] = false; - if (mirrorAckPackage.errorCode == CODE_OK) { - address(uint160(TOKEN_HUB_ADDR)).transfer(mirrorAckPackage.mirrorFee); - ITokenHub(TOKEN_HUB_ADDR).bindToken( - mirrorAckPackage.bep2Symbol, mirrorAckPackage.bep20Addr, mirrorAckPackage.bep20Decimals - ); - boundByMirror[mirrorAckPackage.bep20Addr] = true; - emit mirrorSuccess(mirrorAckPackage.bep20Addr, mirrorAckPackage.bep2Symbol); - return; - } else { - (bool success,) = mirrorAckPackage.mirrorSender.call{ - gas: MAX_GAS_FOR_TRANSFER_BNB, - value: mirrorAckPackage.mirrorFee - }(""); - if (!success) { - address(uint160(SYSTEM_REWARD_ADDR)).transfer(mirrorAckPackage.mirrorFee); - } - emit mirrorFailure(mirrorAckPackage.bep20Addr, mirrorAckPackage.errorCode); - } - } - - function handleMirrorFailAckPackage(bytes memory msgBytes) internal { - (MirrorSynPackage memory mirrorSynPackage, bool decodeSuccess) = decodeMirrorSynPackage(msgBytes); - require(decodeSuccess, "unrecognized package"); - mirrorPendingRecord[mirrorSynPackage.bep20Addr] = false; - (bool success,) = mirrorSynPackage.mirrorSender.call{ - gas: MAX_GAS_FOR_TRANSFER_BNB, - value: mirrorSynPackage.mirrorFee.mul(TEN_DECIMALS) - }(""); - if (!success) { - address(uint160(SYSTEM_REWARD_ADDR)).transfer(mirrorSynPackage.mirrorFee.mul(TEN_DECIMALS)); - } - } - - function encodeSyncSynPackage(SyncSynPackage memory syncSynPackage) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](6); - elements[0] = syncSynPackage.syncSender.encodeAddress(); - elements[1] = syncSynPackage.bep20Addr.encodeAddress(); - elements[2] = uint256(syncSynPackage.bep2Symbol).encodeUint(); - elements[3] = syncSynPackage.bep20Supply.encodeUint(); - elements[4] = syncSynPackage.syncFee.encodeUint(); - elements[5] = uint256(syncSynPackage.expireTime).encodeUint(); - return elements.encodeList(); - } - - function decodeSyncSynPackage(bytes memory msgBytes) internal pure returns (SyncSynPackage memory, bool) { - SyncSynPackage memory syncSynPackage; - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - syncSynPackage.syncSender = iter.next().toAddress(); - } else if (idx == 1) { - syncSynPackage.bep20Addr = iter.next().toAddress(); - } else if (idx == 2) { - syncSynPackage.bep2Symbol = bytes32(iter.next().toUint()); - } else if (idx == 3) { - syncSynPackage.bep20Supply = iter.next().toUint(); - } else if (idx == 4) { - syncSynPackage.syncFee = iter.next().toUint(); - } else if (idx == 5) { - syncSynPackage.expireTime = uint64(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (syncSynPackage, success); - } - - function decodeSyncAckPackage(bytes memory msgBytes) internal pure returns (SyncAckPackage memory, bool) { - SyncAckPackage memory syncAckPackage; - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - syncAckPackage.syncSender = iter.next().toAddress(); - } else if (idx == 1) { - syncAckPackage.bep20Addr = iter.next().toAddress(); - } else if (idx == 2) { - syncAckPackage.syncFee = iter.next().toUint(); - } else if (idx == 3) { - syncAckPackage.errorCode = uint8(iter.next().toUint()); - success = true; - } else { - break; - } - ++idx; - } - return (syncAckPackage, success); + revert("deprecated"); } function sync(address bep20Addr, uint64 expireTime) public payable returns (bool) { - bytes32 bep2Symbol = ITokenHub(TOKEN_HUB_ADDR).getBep2SymbolByContractAddr(bep20Addr); - require(bep2Symbol != bytes32(0x00), "not bound"); - require(boundByMirror[bep20Addr], "not bound by mirror"); - uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee(); - require( - msg.value % TEN_DECIMALS == 0 && msg.value >= syncFee.add(miniRelayFee), - "msg.value must be N * 1e10 and no less sum of miniRelayFee and syncFee" - ); - require( - expireTime >= block.timestamp + 120 && expireTime <= block.timestamp + 86400, - "expireTime must be two minutes later and one day earlier" - ); - uint256 totalSupply = IBEP20(bep20Addr).totalSupply(); - uint8 decimals = IBEP20(bep20Addr).decimals(); - require(convertToBep2Amount(totalSupply, decimals) <= MAX_BEP2_TOTAL_SUPPLY, "too large total supply"); - - address(uint160(TOKEN_HUB_ADDR)).transfer(msg.value.sub(syncFee)); - SyncSynPackage memory syncSynPackage = SyncSynPackage({ - syncSender: msg.sender, - bep20Addr: bep20Addr, - bep2Symbol: bep2Symbol, - bep20Supply: totalSupply, - syncFee: syncFee.div(TEN_DECIMALS), - expireTime: expireTime - }); - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - SYNC_CHANNELID, encodeSyncSynPackage(syncSynPackage), msg.value.sub(syncFee).div(TEN_DECIMALS) - ); - return true; - } - - function handleSyncAckPackage(bytes memory msgBytes) internal { - (SyncAckPackage memory syncAckPackage, bool decodeSuccess) = decodeSyncAckPackage(msgBytes); - require(decodeSuccess, "unrecognized package"); - if (syncAckPackage.errorCode == CODE_OK) { - address(uint160(TOKEN_HUB_ADDR)).transfer(syncAckPackage.syncFee); - emit syncSuccess(syncAckPackage.bep20Addr); - return; - } else { - emit syncFailure(syncAckPackage.bep20Addr, syncAckPackage.errorCode); - } - (bool success,) = - syncAckPackage.syncSender.call{ gas: MAX_GAS_FOR_TRANSFER_BNB, value: syncAckPackage.syncFee }(""); - if (!success) { - address(uint160(SYSTEM_REWARD_ADDR)).transfer(syncAckPackage.syncFee); - } - } - - function handleSyncFailAckPackage(bytes memory msgBytes) internal { - (SyncSynPackage memory syncSynPackage, bool decodeSuccess) = decodeSyncSynPackage(msgBytes); - require(decodeSuccess, "unrecognized package"); - (bool success,) = syncSynPackage.syncSender.call{ - gas: MAX_GAS_FOR_TRANSFER_BNB, - value: syncSynPackage.syncFee.mul(TEN_DECIMALS) - }(""); - if (!success) { - address(uint160(SYSTEM_REWARD_ADDR)).transfer(syncSynPackage.syncFee.mul(TEN_DECIMALS)); - } + revert("deprecated"); } function updateParam(string calldata key, bytes calldata value) external override onlyGov { - require(value.length == 32, "expected value length 32"); - string memory localKey = key; - bytes memory localValue = value; - bytes32 bytes32Key; - assembly { - bytes32Key := mload(add(localKey, 32)) - } - if (bytes32Key == bytes32(0x6d6972726f724665650000000000000000000000000000000000000000000000)) { - // mirrorFee - uint256 newMirrorFee; - assembly { - newMirrorFee := mload(add(localValue, 32)) - } - require(newMirrorFee % (TEN_DECIMALS) == 0, "mirrorFee must be N * 1e10"); - mirrorFee = newMirrorFee; - } else if (bytes32Key == bytes32(0x73796e6346656500000000000000000000000000000000000000000000000000)) { - // syncFee - uint256 newSyncFee; - assembly { - newSyncFee := mload(add(localValue, 32)) - } - require(newSyncFee % (TEN_DECIMALS) == 0, "syncFee must be N * 1e10"); - syncFee = newSyncFee; - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); - } - - function bep2TokenSymbolConvert(string memory symbol) internal pure returns (bytes32) { - bytes32 result; - assembly { - result := mload(add(symbol, 32)) - } - return result; + revert("deprecated"); } function queryRequiredLockAmountForBind(string memory symbol) public view returns (uint256) { @@ -640,68 +175,4 @@ contract TokenManager is System, IApplication, IParamSubscriber { uint256 requiredBalance = bindRequest.totalSupply.sub(bindRequest.peggyAmount); return requiredBalance.sub(tokenHubBalance); } - - function verifyBindParameters( - BindSynPackage memory bindSynPkg, - address contractAddr - ) internal view returns (uint32) { - uint256 decimals = IBEP20(contractAddr).decimals(); - string memory bep20Symbol = IBEP20(contractAddr).symbol(); - uint256 tokenHubBalance = IBEP20(contractAddr).balanceOf(TOKEN_HUB_ADDR); - uint256 lockedAmount = bindSynPkg.totalSupply.sub(bindSynPkg.peggyAmount); - if (bindSynPkg.expireTime < block.timestamp) { - return BIND_STATUS_TIMEOUT; - } - if (!checkSymbol(bep20Symbol, bindSynPkg.bep2TokenSymbol)) { - return BIND_STATUS_SYMBOL_MISMATCH; - } - if (tokenHubBalance > lockedAmount) { - return BIND_STATUS_TOO_MUCH_TOKENHUB_BALANCE; - } - if (IBEP20(bindSynPkg.contractAddr).totalSupply() != bindSynPkg.totalSupply) { - return BIND_STATUS_TOTAL_SUPPLY_MISMATCH; - } - if (decimals != bindSynPkg.bep20Decimals) { - return BIND_STATUS_DECIMALS_MISMATCH; - } - if ( - ITokenHub(TOKEN_HUB_ADDR).getContractAddrByBEP2Symbol(bindSynPkg.bep2TokenSymbol) != address(0x00) - || ITokenHub(TOKEN_HUB_ADDR).getBep2SymbolByContractAddr(bindSynPkg.contractAddr) != bytes32(0x00) - ) { - return BIND_STATUS_ALREADY_BOUND_TOKEN; - } - return CODE_OK; - } - - function checkSymbol(string memory bep20Symbol, bytes32 bep2TokenSymbol) internal pure returns (bool) { - bytes memory bep20SymbolBytes = bytes(bep20Symbol); - if (bep20SymbolBytes.length > MAXIMUM_BEP20_SYMBOL_LEN || bep20SymbolBytes.length < MINIMUM_BEP20_SYMBOL_LEN) { - return false; - } - - bytes memory bep2TokenSymbolBytes = new bytes(32); - assembly { - mstore(add(bep2TokenSymbolBytes, 32), bep2TokenSymbol) - } - if (bep2TokenSymbolBytes[bep20SymbolBytes.length] != 0x2d) { - // '-' - return false; - } - bool symbolMatch = true; - for (uint256 index = 0; index < bep20SymbolBytes.length; ++index) { - if (bep20SymbolBytes[index] != bep2TokenSymbolBytes[index]) { - symbolMatch = false; - break; - } - } - return symbolMatch; - } - - function convertToBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) { - if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) { - require(bep20TokenDecimals - BEP2_TOKEN_DECIMALS <= LOG_MAX_UINT256, "too large decimals"); - return amount.div(10 ** (bep20TokenDecimals - BEP2_TOKEN_DECIMALS)); - } - return amount.mul(10 ** (BEP2_TOKEN_DECIMALS - bep20TokenDecimals)); - } } From 73ca43df50a92de31a80c7b75aa3a719ec95b812 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 27 Aug 2024 13:46:57 +0800 Subject: [PATCH 02/52] feat: clean deprecated code more --- contracts/BSCValidatorSet.sol | 6 +- contracts/deprecated/RelayerHub.sol | 91 ++--------------------------- 2 files changed, 7 insertions(+), 90 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 5be72cc4..6686c50f 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -199,13 +199,11 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external override onlyCrossChainContract { - // should not happen - emit unexpectedPackage(channelId, msgBytes); + revert("deprecated"); } function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) external override onlyCrossChainContract { - // should not happen - emit unexpectedPackage(channelId, msgBytes); + revert("deprecated"); } /*----------------- External Functions -----------------*/ diff --git a/contracts/deprecated/RelayerHub.sol b/contracts/deprecated/RelayerHub.sol index 1b77825e..6146c306 100644 --- a/contracts/deprecated/RelayerHub.sol +++ b/contracts/deprecated/RelayerHub.sol @@ -73,109 +73,28 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function whitelistInit() external { - require(!whitelistInitDone, "the whitelists already updated"); - addInitRelayer(WHITELIST_1); - addInitRelayer(WHITELIST_2); - whitelistInitDone = true; - } - - function addInitRelayer(address addr) internal { - relayManagersExistMap[addr] = true; - managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same - currentRelayers[addr] = true; - emit managerAdded(addr); - emit relayerUpdated(address(0), addr); + revert("deprecated"); } /*----------------- Param update -----------------*/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { - if (Memory.compareStrings(key, "addManager")) { - require(value.length == 20, "length of manager address mismatch"); - address newManager = BytesToTypes.bytesToAddress(20, value); - addManagerByGov(newManager); - } else if (Memory.compareStrings(key, "removeManager")) { - require(value.length == 20, "length of manager address mismatch"); - address managerAddress = BytesToTypes.bytesToAddress(20, value); - removeManager(managerAddress); - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); + revert("deprecated"); } function removeManagerByHimself() external { - // here the manager removes himself - removeManager(msg.sender); - } - - function removeManager(address managerAddress) internal { - // check if the manager address already exists - require(relayManagersExistMap[managerAddress], "manager doesn't exist"); - - address relayerAddress = managerToRelayer[managerAddress]; - - delete (relayManagersExistMap[managerAddress]); - delete (managerToRelayer[managerAddress]); - - delete (provisionalRelayers[managerToProvisionalRelayer[managerAddress]]); - delete (managerToProvisionalRelayer[managerAddress]); - - // emit success event - emit managerRemoved(managerAddress); - if (relayerAddress != address(0)) { - delete (currentRelayers[relayerAddress]); - emit relayerUpdated(relayerAddress, address(0)); - } - } - - function addManagerByGov(address managerToBeAdded) internal { - require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); - - relayManagersExistMap[managerToBeAdded] = true; - - emit managerAdded(managerToBeAdded); + revert("deprecated"); } // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal, we set relayerToBeAdded to be address(0) function updateRelayer(address relayerToBeAdded) external onlyManager { - require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - - if (relayerToBeAdded != address(0)) { - require(!currentRelayers[relayerToBeAdded], "relayer already exists"); - provisionalRelayers[relayerToBeAdded] = true; - managerToProvisionalRelayer[msg.sender] = relayerToBeAdded; - } else { - address oldRelayer = managerToRelayer[msg.sender]; - address oldProvisionalRelayer = managerToProvisionalRelayer[msg.sender]; - delete managerToRelayer[msg.sender]; - delete currentRelayers[oldRelayer]; - delete provisionalRelayers[oldProvisionalRelayer]; - delete managerToProvisionalRelayer[msg.sender]; - emit relayerUpdated(oldRelayer, relayerToBeAdded); - return; - } - - emit relayerAddedProvisionally(relayerToBeAdded); + revert("deprecated"); } // acceptBeingRelayer needs to be called by the relayer after being added provisionally. // This 2 step process of relayer updating is required to avoid having a contract as a relayer. function acceptBeingRelayer(address manager) external onlyProvisionalRelayer { - // ensure msg.sender is not contract and it is not a proxy - require(!isContract(msg.sender), "provisional relayer is a contract"); - require(tx.origin == msg.sender, "provisional relayer is a proxy"); - require(managerToProvisionalRelayer[manager] == msg.sender, "provisional is not set for this manager"); - - address oldRelayer = managerToRelayer[manager]; - - currentRelayers[msg.sender] = true; - managerToRelayer[manager] = msg.sender; - - delete provisionalRelayers[msg.sender]; - delete managerToProvisionalRelayer[manager]; - delete currentRelayers[oldRelayer]; - emit relayerUpdated(oldRelayer, msg.sender); + revert("deprecated"); } function isRelayer(address relayerAddress) external view override returns (bool) { From e600faaf817fb5dfb7c27693ceacb84dbe69c8b3 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 27 Aug 2024 18:16:31 +0800 Subject: [PATCH 03/52] feat: recover init functions --- contracts/BSCValidatorSet.sol | 39 +---------- contracts/SlashIndicator.sol | 28 +------- contracts/deprecated/CrossChain.sol | 8 ++- contracts/deprecated/RelayerHub.sol | 4 +- contracts/deprecated/RelayerIncentivize.sol | 19 +++++- contracts/deprecated/Staking.sol | 4 +- .../deprecated/TendermintLightClient.sol | 67 ++++++++++++++++++- 7 files changed, 100 insertions(+), 69 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 6686c50f..cd4bb819 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -92,8 +92,8 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica bool public isSystemRewardIncluded; // BEP-294 BC-fusion - Validator[] private _tmpMigratedValidatorSet; - bytes[] private _tmpMigratedVoteAddrs; + Validator[] private _tmpMigratedValidatorSet; // @dev deprecated + bytes[] private _tmpMigratedVoteAddrs; // @dev deprecated // BEP-341 Validators can produce consecutive blocks uint256 public turnLength; // Consecutive number of blocks a validator receives priority for block production @@ -228,35 +228,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica }); } - // if staking channel is not closed, store the migrated validator set and return - if ( - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).registeredContractChannelMap( - VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID - ) - ) { - uint256 newLength = _validatorSet.length; - uint256 oldLength = _tmpMigratedValidatorSet.length; - if (oldLength > newLength) { - for (uint256 i = newLength; i < oldLength; ++i) { - _tmpMigratedValidatorSet.pop(); - _tmpMigratedVoteAddrs.pop(); - } - } - - for (uint256 i; i < newLength; ++i) { - if (i >= oldLength) { - _tmpMigratedValidatorSet.push(_validatorSet[i]); - _tmpMigratedVoteAddrs.push(_voteAddrs[i]); - } else { - _tmpMigratedValidatorSet[i] = _validatorSet[i]; - _tmpMigratedVoteAddrs[i] = _voteAddrs[i]; - } - } - - emit tmpValidatorSetUpdated(newLength); - return; - } - // step 0: force all maintaining validators to exit `Temporary Maintenance` // - 1. validators exit maintenance // - 2. clear all maintainInfo @@ -1118,11 +1089,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica isFelony = false; if (slashCount >= felonyThreshold) { _felony(validator, index); - if (IStakeHub(STAKE_HUB_ADDR).consensusToOperator(validator) != address(0)) { - ISlashIndicator(SLASH_CONTRACT_ADDR).downtimeSlash(validator, slashCount, shouldRevert); - } else { - ISlashIndicator(SLASH_CONTRACT_ADDR).sendFelonyPackage(validator); - } + ISlashIndicator(SLASH_CONTRACT_ADDR).downtimeSlash(validator, slashCount, shouldRevert); isFelony = true; } else if (slashCount >= misdemeanorThreshold) { _misdemeanor(validator); diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index c3877a4f..364b6fbc 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -127,16 +127,7 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati if (indicator.count % felonyThreshold == 0) { indicator.count = 0; IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(validator); - if (IStakeHub(STAKE_HUB_ADDR).consensusToOperator(validator) != address(0)) { - _downtimeSlash(validator, indicator.count, false); - } else { - // send slash msg to bc if validator is not migrated - try ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - SLASH_CHANNELID, encodeSlashPackage(validator), 0 - ) { } catch (bytes memory reason) { - emit failedFelony(validator, indicator.count, reason); - } - } + _downtimeSlash(validator, indicator.count, false); } else if (indicator.count % misdemeanorThreshold == 0) { IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).misdemeanor(validator); } @@ -277,17 +268,7 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati } } - if (IStakeHub(STAKE_HUB_ADDR).voteToOperator(_evidence.voteAddr) != address(0)) { - IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); - } else { - // send slash msg to bc if the validator not migrated - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( - SLASH_CHANNELID, encodeVoteSlashPackage(_evidence.voteAddr), 0 - ); - - bytes32 voteAddrSlice = BytesLib.toBytes32(_evidence.voteAddr, 0); - emit maliciousVoteSlashed(voteAddrSlice); - } + IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); } function submitDoubleSignEvidence(bytes memory header1, bytes memory header2) public onlyInit { @@ -336,10 +317,7 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati * @param validator Who will be jailed */ function sendFelonyPackage(address validator) external override(ISlashIndicator) onlyValidatorContract onlyInit { - try ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SLASH_CHANNELID, encodeSlashPackage(validator), 0) { } - catch (bytes memory reason) { - emit failedFelony(validator, 0, reason); - } + emit failedFelony(validator, 0, "deprecated"); } function _verifyBLSSignature(VoteData memory vote, bytes memory voteAddr) internal view returns (bool) { diff --git a/contracts/deprecated/CrossChain.sol b/contracts/deprecated/CrossChain.sol index cc38a807..af363e98 100644 --- a/contracts/deprecated/CrossChain.sol +++ b/contracts/deprecated/CrossChain.sol @@ -153,7 +153,13 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { } function init() external onlyNotInit { - revert("deprecated"); + batchSizeForOracle = INIT_BATCH_SIZE; + + oracleSequence = -1; + previousTxHeight = 0; + txCounter = 0; + + alreadyInit = true; } function encodePayload( diff --git a/contracts/deprecated/RelayerHub.sol b/contracts/deprecated/RelayerHub.sol index 6146c306..671b0d30 100644 --- a/contracts/deprecated/RelayerHub.sol +++ b/contracts/deprecated/RelayerHub.sol @@ -59,7 +59,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerAddedProvisionally(address _relayer); function init() external onlyNotInit { - revert("deprecated"); + requiredDeposit = INIT_REQUIRED_DEPOSIT; + dues = INIT_DUES; + alreadyInit = true; } function unregister() external exist onlyInit { diff --git a/contracts/deprecated/RelayerIncentivize.sol b/contracts/deprecated/RelayerIncentivize.sol index 9fb7477e..282ae807 100644 --- a/contracts/deprecated/RelayerIncentivize.sol +++ b/contracts/deprecated/RelayerIncentivize.sol @@ -47,7 +47,12 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { event rewardToRelayer(address relayer, uint256 amount); function init() external onlyNotInit { - revert("deprecated"); + require(!alreadyInit, "already initialized"); + headerRelayerRewardRateMolecule = HEADER_RELAYER_REWARD_RATE_MOLECULE; + headerRelayerRewardRateDenominator = HEADER_RELAYER_REWARD_RATE_DENOMINATOR; + callerCompensationMolecule = CALLER_COMPENSATION_MOLECULE; + callerCompensationDenominator = CALLER_COMPENSATION_DENOMINATOR; + alreadyInit = true; } receive() external payable { @@ -64,7 +69,17 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { } function claimRelayerReward(address relayerAddr) external { - revert("deprecated"); + uint256 reward = relayerRewardVault[relayerAddr]; + require(reward > 0, "no relayer reward"); + relayerRewardVault[relayerAddr] = 0; + address payable recipient = address(uint160(relayerAddr)); + if (!recipient.send(reward)) { + address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + systemPayable.transfer(reward); + emit rewardToRelayer(SYSTEM_REWARD_ADDR, reward); + return; + } + emit rewardToRelayer(relayerAddr, reward); } function calculateTransferRelayerWeight(uint256 count) public pure returns (uint256) { diff --git a/contracts/deprecated/Staking.sol b/contracts/deprecated/Staking.sol index 3b7ddb88..36d82485 100644 --- a/contracts/deprecated/Staking.sol +++ b/contracts/deprecated/Staking.sol @@ -112,9 +112,7 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { event failedSynPackage(uint8 indexed eventType, uint256 errCode); event crashResponse(uint8 indexed eventType); - receive() external payable { - revert("deprecated"); - } + receive() external payable { } /*----------------- Implement cross chain app -----------------*/ function handleSynPackage( diff --git a/contracts/deprecated/TendermintLightClient.sol b/contracts/deprecated/TendermintLightClient.sol index c1e1f7fb..c014f7f5 100644 --- a/contracts/deprecated/TendermintLightClient.sol +++ b/contracts/deprecated/TendermintLightClient.sol @@ -31,7 +31,27 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { event paramChange(string key, bytes value); function init() external onlyNotInit { - revert("deprecated"); + uint256 pointer; + uint256 length; + (pointer, length) = Memory.fromBytes(INIT_CONSENSUS_STATE_BYTES); + + /* solium-disable-next-line */ + assembly { + sstore(chainID_slot, mload(pointer)) + } + + ConsensusState memory cs; + uint64 height; + (cs, height) = decodeConsensusState(pointer, length, false); + cs.preValidatorSetChangeHeight = 0; + lightClientConsensusStates[height] = cs; + + initialHeight = height; + latestHeight = height; + alreadyInit = true; + rewardForValidatorSetChange = INIT_REWARD_FOR_VALIDATOR_SER_CHANGE; + + emit initConsensusState(initialHeight, cs.appHash); } function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer returns (bool) { @@ -73,6 +93,51 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { return string(chainIDStr); } + // | chainID | height | appHash | curValidatorSetHash | [{validator pubkey, voting power}] | + // | 32 bytes | 8 bytes | 32 bytes | 32 bytes | [{32 bytes, 8 bytes}] | + /* solium-disable-next-line */ + function decodeConsensusState( + uint256 ptr, + uint256 size, + bool leaveOutValidatorSet + ) internal pure returns (ConsensusState memory, uint64) { + ptr = ptr + 8; + uint64 height; + /* solium-disable-next-line */ + assembly { + height := mload(ptr) + } + + ptr = ptr + 32; + bytes32 appHash; + /* solium-disable-next-line */ + assembly { + appHash := mload(ptr) + } + + ptr = ptr + 32; + bytes32 curValidatorSetHash; + /* solium-disable-next-line */ + assembly { + curValidatorSetHash := mload(ptr) + } + + ConsensusState memory cs; + cs.appHash = appHash; + cs.curValidatorSetHash = curValidatorSetHash; + + if (!leaveOutValidatorSet) { + uint256 dest; + uint256 length; + cs.nextValidatorSet = new bytes(size - 104); + (dest, length) = Memory.fromBytes(cs.nextValidatorSet); + + Memory.copy(ptr + 32, dest, length); + } + + return (cs, height); + } + function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { revert("deprecated"); } From 5cf936a38aa5ce14d09076895ed0a8940ede279d Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 28 Aug 2024 16:31:51 +0800 Subject: [PATCH 04/52] feat: remove unused code --- contracts/BSCValidatorSet.sol | 65 +---------------------------------- 1 file changed, 1 insertion(+), 64 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index cd4bb819..2d228cb1 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -568,12 +568,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } function removeTmpMigratedValidator(address validator) external onlyStakeHub { - for (uint256 i; i < _tmpMigratedValidatorSet.length; ++i) { - if (_tmpMigratedValidatorSet[i].consensusAddress == validator) { - _tmpMigratedValidatorSet[i].jailed = true; - break; - } - } + revert("deprecated"); } /*----------------- For Temporary Maintenance -----------------*/ @@ -1098,64 +1093,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit validatorExitMaintenance(validator); } - function _mergeValidatorSet( - Validator[] memory validatorSet1, - bytes[] memory voteAddrSet1, - Validator[] memory validatorSet2, - bytes[] memory voteAddrSet2 - ) internal view returns (Validator[] memory, bytes[] memory) { - uint256 _length = IStakeHub(STAKE_HUB_ADDR).maxElectedValidators(); - if (validatorSet1.length + validatorSet2.length < _length) { - _length = validatorSet1.length + validatorSet2.length; - } - Validator[] memory mergedValidatorSet = new Validator[](_length); - bytes[] memory mergedVoteAddrSet = new bytes[](_length); - - uint256 i; - uint256 j; - uint256 k; - while ((i < validatorSet1.length || j < validatorSet2.length) && k < _length) { - if (i == validatorSet1.length) { - mergedValidatorSet[k] = validatorSet2[j]; - mergedVoteAddrSet[k] = voteAddrSet2[j]; - ++j; - ++k; - continue; - } - - if (j == validatorSet2.length) { - mergedValidatorSet[k] = validatorSet1[i]; - mergedVoteAddrSet[k] = voteAddrSet1[i]; - ++i; - ++k; - continue; - } - - if (validatorSet1[i].votingPower > validatorSet2[j].votingPower) { - mergedValidatorSet[k] = validatorSet1[i]; - mergedVoteAddrSet[k] = voteAddrSet1[i]; - ++i; - } else if (validatorSet1[i].votingPower < validatorSet2[j].votingPower) { - mergedValidatorSet[k] = validatorSet2[j]; - mergedVoteAddrSet[k] = voteAddrSet2[j]; - ++j; - } else { - if (validatorSet1[i].consensusAddress < validatorSet2[j].consensusAddress) { - mergedValidatorSet[k] = validatorSet1[i]; - mergedVoteAddrSet[k] = voteAddrSet1[i]; - ++i; - } else { - mergedValidatorSet[k] = validatorSet2[j]; - mergedVoteAddrSet[k] = voteAddrSet2[j]; - ++j; - } - } - ++k; - } - - return (mergedValidatorSet, mergedVoteAddrSet); - } - //rlp encode & decode function function decodeValidatorSetSynPackage(bytes memory msgBytes) internal From c6a2f857561f9d7e0911d41f361eab0cc50169d1 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 28 Aug 2024 18:58:50 +0800 Subject: [PATCH 05/52] feat: remove unused code in stakehub --- contracts/StakeHub.sol | 53 ------------------------------------------ 1 file changed, 53 deletions(-) diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 06e3e283..24b6cf61 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -999,57 +999,6 @@ contract StakeHub is SystemV2, Initializable, Protectable { } /*----------------- internal functions -----------------*/ - function _decodeMigrationSynPackage( - bytes memory msgBytes - ) internal pure returns (StakeMigrationPackage memory, bool) { - StakeMigrationPackage memory migrationPackage; - - RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); - bool success = false; - uint256 idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - migrationPackage.operatorAddress = address(uint160(iter.next().toAddress())); - } else if (idx == 1) { - migrationPackage.delegator = address(uint160(iter.next().toAddress())); - } else if (idx == 2) { - migrationPackage.refundAddress = address(uint160(iter.next().toAddress())); - } else if (idx == 3) { - migrationPackage.amount = iter.next().toUint(); - success = true; - } else { - break; - } - ++idx; - } - - return (migrationPackage, success); - } - - function _doMigration(StakeMigrationPackage memory migrationPkg) internal returns (StakeMigrationRespCode) { - if (blackList[migrationPkg.delegator] || migrationPkg.delegator == address(0)) { - return StakeMigrationRespCode.INVALID_DELEGATOR; - } - - if (!_validatorSet.contains(migrationPkg.operatorAddress)) { - return StakeMigrationRespCode.VALIDATOR_NOT_EXISTED; - } - - Validator memory valInfo = _validators[migrationPkg.operatorAddress]; - if (valInfo.jailed && migrationPkg.delegator != migrationPkg.operatorAddress) { - return StakeMigrationRespCode.VALIDATOR_JAILED; - } - - uint256 shares = - IStakeCredit(valInfo.creditContract).delegate{ value: migrationPkg.amount }(migrationPkg.delegator); - emit Delegated(migrationPkg.operatorAddress, migrationPkg.delegator, shares, migrationPkg.amount); - emit MigrateSuccess(migrationPkg.operatorAddress, migrationPkg.delegator, shares, migrationPkg.amount); - - IGovToken(GOV_TOKEN_ADDR).sync(valInfo.creditContract, migrationPkg.delegator); - - return StakeMigrationRespCode.MIGRATE_SUCCESS; - } - function _checkMoniker(string memory moniker) internal pure returns (bool) { bytes memory bz = bytes(moniker); @@ -1143,8 +1092,6 @@ contract StakeHub is SystemV2, Initializable, Protectable { } function _jailValidator(Validator storage valInfo, uint256 jailUntil) internal { - IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).removeTmpMigratedValidator(valInfo.consensusAddress); - // keep the last eligible validator bool isLast = (numOfJailed >= _validatorSet.length() - 1); if (isLast) { From 26663b0bea75b14b961f52fddb5bad087eaf38a3 Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 29 Aug 2024 10:26:40 +0800 Subject: [PATCH 06/52] feat: update genesis.json --- genesis.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/genesis.json b/genesis.json index 0e2a4a6d..cb2d78ba 100644 --- a/genesis.json +++ b/genesis.json @@ -46,11 +46,11 @@ }, "0x0000000000000000000000000000000000001000": { "balance": "0x0", - "code": "0x60806040526004361061051c5760003560e01c80638a7beb01116102a2578063c81b166211610165578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d8d578063f9a2bbc714610da2578063fc3e590814610db7578063fccc281314610dcc578063fd4ad81f14610de1578063fd6a687914610e1057610523565b8063e40716a114610cfb578063ea321e4914610d10578063eb57e20214610d30578063eda5868c14610d50578063f1fad10414610d65578063f340fa0114610d7a57610523565b8063d86222d51161011e578063d86222d514610c7d578063daacdb6614610c92578063dc927faf14610ca7578063df8079e914610cbc578063e086c7b114610cd1578063e1c7392a14610ce657610523565b8063c81b166214610c09578063c8509d81146109ae578063cb75a59214610c1e578063ce910b0c14610c33578063d58918ae14610c53578063d68fb56a14610c6857610523565b8063aa82dce111610209578063aef198a9116101c2578063aef198a914610b93578063b7ab4db514610ba8578063b8cf4ef114610bca578063bf9f499514610734578063c466689d14610bdf578063c6d3394514610bf457610523565b8063aa82dce114610aff578063aad5606314610b14578063aaf5eb6814610b29578063ab51bb9614610b3e578063ac43175114610b53578063ad3c9da614610b7357610523565b80639dc092621161025b5780639dc0926214610a815780639fe0f81614610a96578063a0dc275814610aab578063a1a11bf514610ac0578063a5422d5c14610ad5578063a78abc1614610aea57610523565b80638a7beb01146109f85780638b5ad0c914610a0d5780638c5d749d14610a225780638d19a41014610a375780639369d7de14610a5757806396713da914610a6c57610523565b80635192c82c116103ea578063718a8aa81161035157806381650b621161030a57806381650b6214610984578063820dcaa814610999578063831d65d1146109ae578063853230aa1461093057806386249882146109ce57806388b32f11146109e357610523565b8063718a8aa81461090657806375d47a0a1461091b57806378dfed4a146109305780637942fd05146109455780637a84ca2a1461095a5780637e434d541461096f57610523565b80635d77156c116103a35780635d77156c1461086057806360eba4fe1461087557806362b72cf5146108955780636969a25c146108aa5780636e47b482146108dc57806370fd5bad146108f157610523565b80635192c82c146107cc57806351b4dce3146107e157806351e80672146107f657806355614fcc1461080b578063565c56b31461082b5780635667515a1461084b57610523565b80632a0ffb6e1161048e5780633dffc387116104475780633dffc3871461073457806343756e5c1461075657806345cf9daf1461076b578063493279b1146107805780634bf6c882146107a25780634df6e0c3146107b757610523565b80632a0ffb6e14610671578063300c356714610691578063321d398a146106b15780633365af3a146106d157806335409f7f146106f15780633b071dcc1461071157610523565b8063152ad3b8116104e0578063152ad3b8146105db5780631bd14ed8146105fd5780631e4c1524146106125780631ff1806914610632578063219f22d514610647578063280870281461065c57610523565b806304c4fec61461052857806307a568471461053f5780630bee7a671461056a5780630e2374a51461058c5780631182b875146105ae57610523565b3661052357005b600080fd5b34801561053457600080fd5b5061053d610e25565b005b34801561054b57600080fd5b50610554610e99565b60405161056191906193bb565b60405180910390f35b34801561057657600080fd5b5061057f610e9f565b60405161056191906193e5565b34801561059857600080fd5b506105a1610ea4565b60405161056191906184f9565b3480156105ba57600080fd5b506105ce6105c93660046183df565b610eaa565b60405161056191906186af565b3480156105e757600080fd5b506105f06111c7565b60405161056191906186a4565b34801561060957600080fd5b506105546111d0565b34801561061e57600080fd5b5061053d61062d3660046181ed565b6111d6565b34801561063e57600080fd5b506105546118ac565b34801561065357600080fd5b5061057f6118b2565b34801561066857600080fd5b506105a16118b7565b34801561067d57600080fd5b5061053d61068c36600461814d565b6118bd565b34801561069d57600080fd5b5061053d6106ac366004618185565b61196a565b3480156106bd57600080fd5b506105f06106cc36600461838c565b611cb3565b3480156106dd57600080fd5b506105f06106ec36600461838c565b611d82565b3480156106fd57600080fd5b5061053d61070c36600461814d565b611e33565b34801561071d57600080fd5b50610726611f98565b6040516105619291906185ba565b34801561074057600080fd5b50610749612274565b60405161056191906193f6565b34801561076257600080fd5b506105a1612279565b34801561077757600080fd5b5061055461227f565b34801561078c57600080fd5b50610795612285565b60405161056191906193ac565b3480156107ae57600080fd5b5061074961228a565b3480156107c357600080fd5b5061072661228f565b3480156107d857600080fd5b5061055461241b565b3480156107ed57600080fd5b506105a1612421565b34801561080257600080fd5b506105a1612427565b34801561081757600080fd5b506105f061082636600461814d565b61242d565b34801561083757600080fd5b5061055461084636600461814d565b612462565b34801561085757600080fd5b506107496124b3565b34801561086c57600080fd5b5061057f6124b8565b34801561088157600080fd5b506105ce61089036600461838c565b6124bd565b3480156108a157600080fd5b50610554612563565b3480156108b657600080fd5b506108ca6108c536600461838c565b612569565b60405161056196959493929190618526565b3480156108e857600080fd5b506105a16125cd565b3480156108fd57600080fd5b506107496125d3565b34801561091257600080fd5b506107496125d8565b34801561092757600080fd5b506105a16125dd565b34801561093c57600080fd5b506105546125e3565b34801561095157600080fd5b506107496125e9565b34801561096657600080fd5b506105546125ee565b34801561097b57600080fd5b506105a16125f4565b34801561099057600080fd5b5061057f6125fa565b3480156109a557600080fd5b506105546125ff565b3480156109ba57600080fd5b5061053d6109c93660046183df565b612605565b3480156109da57600080fd5b50610554612666565b3480156109ef57600080fd5b5061055461266c565b348015610a0457600080fd5b506105f0612672565b348015610a1957600080fd5b5061055461267b565b348015610a2e57600080fd5b50610554612681565b348015610a4357600080fd5b50610554610a5236600461814d565b61269e565b348015610a6357600080fd5b5061053d6126de565b348015610a7857600080fd5b506107496127f2565b348015610a8d57600080fd5b506105a16127f7565b348015610aa257600080fd5b506105546127fd565b348015610ab757600080fd5b50610554612802565b348015610acc57600080fd5b506105a1612807565b348015610ae157600080fd5b506105ce61280d565b348015610af657600080fd5b506105f061282c565b348015610b0b57600080fd5b506105a1612835565b348015610b2057600080fd5b506105a161283b565b348015610b3557600080fd5b50610554612841565b348015610b4a57600080fd5b5061057f6124b3565b348015610b5f57600080fd5b5061053d610b6e366004618330565b61284a565b348015610b7f57600080fd5b50610554610b8e36600461814d565b613343565b348015610b9f57600080fd5b50610554613355565b348015610bb457600080fd5b50610bbd613362565b60405161056191906185a7565b348015610bd657600080fd5b5061055461344d565b348015610beb57600080fd5b50610554613452565b348015610c0057600080fd5b506105546125d3565b348015610c1557600080fd5b506105a1613458565b348015610c2a57600080fd5b5061055461345e565b348015610c3f57600080fd5b506105ce610c4e36600461838c565b613464565b348015610c5f57600080fd5b50610554613471565b348015610c7457600080fd5b50610554613477565b348015610c8957600080fd5b506105546134b6565b348015610c9e57600080fd5b506105546134c2565b348015610cb357600080fd5b506105a16134c8565b348015610cc857600080fd5b506105a16134ce565b348015610cdd57600080fd5b50610554610e9f565b348015610cf257600080fd5b5061053d6134d4565b348015610d0757600080fd5b50610554613683565b348015610d1c57600080fd5b506105f0610d2b3660046182f1565b613689565b348015610d3c57600080fd5b5061053d610d4b36600461814d565b61380f565b348015610d5c57600080fd5b5061057f613913565b348015610d7157600080fd5b50610749613918565b61053d610d8836600461814d565b61391d565b348015610d9957600080fd5b50610554613cd3565b348015610dae57600080fd5b506105a1613cd9565b348015610dc357600080fd5b506107496127fd565b348015610dd857600080fd5b506105a1613cdf565b348015610ded57600080fd5b50610e01610dfc36600461838c565b613ce5565b604051610561939291906193c4565b348015610e1c57600080fd5b506105a1613da7565b6000610e303361269e565b9050600b8181548110610e3f57fe5b600091825260209091206001601690920201015460ff16610e7b5760405162461bcd60e51b8152600401610e7290618fdc565b60405180910390fd5b6000610e85613477565b9050610e943383836001613dad565b505050565b60095481565b606481565b61200181565b60005460609060ff16610ecf5760405162461bcd60e51b8152600401610e729061886e565b3361200014610ef05760405162461bcd60e51b8152600401610e72906191c4565b600b54610fae57610eff617cf9565b60015460005b81811015610faa57600b805460018101825560009190915283516000805160206194c88339815191526016909202918201908155602080860151600080516020619af78339815191528401805460ff1916911515919091179055604086015180518794610f86936000805160206194e8833981519152909101920190617d28565b506060820151610f9c9060038301906013617da2565b505050806001019050610f05565b5050505b610fb6617dcf565b6000610ff785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061408292505050565b91509150806110135761100a606461423e565b925050506111c0565b815160009060ff16611038576110318360200151846040015161429f565b905061118c565b825160ff16600114156111885782602001515160011461107d576000805160206194a883398151915260405161106d90618e95565b60405180910390a1506067611183565b6000836020015160008151811061109057fe5b602090810291909101810151516001600160a01b038116600090815260049092526040909120549091508015806110f157506001808203815481106110d157fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b1561112f576040516001600160a01b038316907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a261117c565b600061113e8360018403615461565b90508061117a576040516001600160a01b038416907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a25b505b6000925050505b61118c565b5060655b63ffffffff81166111b157505060408051600081526020810190915291506111c09050565b6111ba8161423e565b93505050505b9392505050565b60075460ff1681565b600f5481565b3341146111f55760405162461bcd60e51b8152600401610e7290619213565b3a156112135760405162461bcd60e51b8152600401610e7290618f1b565b825160408051828152602080840282010190915260609082801561125157816020015b61123e617df3565b8152602001906001900390816112365790505b50905060005b828110156112fb576040518060c0016040528087838151811061127657fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020018683815181106112b857fe5b60200260200101516001600160401b0316815260200160001515815260200160008152508282815181106112e857fe5b6020908102919091010152600101611257565b5060405163d31f968d60e01b81526120009063d31f968d90611326906110009060089060040161858b565b60206040518083038186803b15801561133e57600080fd5b505afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137691906182d1565b156116995780516015548181111561141857815b8181101561141657601580548061139d57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b031916905560030155905560168054806113f057fe5b60019003818190600052602060002001600061140c9190617e28565b905560010161138a565b505b60005b828110156116585781811061154057601584828151811061143857fe5b602090810291909101810151825460018181018555600094855293839020825160049092020180546001600160a01b039283166001600160a01b0319918216178255938301519481018054958316958516959095179094556040820151600285018054606085015160808601511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590961692909716919091179290921692909217169290921790915560a00151600390910155855160169087908390811061150857fe5b6020908102919091018101518254600181018455600093845292829020815161153a9491909101929190910190617d28565b50611650565b83818151811061154c57fe5b60200260200101516015828154811061156157fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155855186908290811061161c57fe5b60200260200101516016828154811061163157fe5b90600052602060002001908051906020019061164e929190617d28565b505b60010161141b565b507fb8e726330a0dad1cf3d04e925663b17e391f1ed547d79b7f4e5f344119b442468260405161168891906193bb565b60405180910390a150505050610e94565b6060806116a68386615824565b9150915060005b60015481101561179c576000600182815481106116c657fe5b906000526020600020906004020160030154905080600014611793576000600183815481106116f157fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061172557fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b168152611760926001600160a01b0390921691016184f9565b6000604051808303818588803b15801561177957600080fd5b505af115801561178d573d6000803e3d6000fd5b50505050505b506001016116ad565b50471561180a577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516117d291906193bb565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015611808573d6000803e3d6000fd5b505b60006003819055600555815115611825576118258282615d0e565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186257600080fd5b505af1158015611876573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b33612002146118de5760405162461bcd60e51b8152600401610e7290619375565b60005b60155481101561196657816001600160a01b03166015828154811061190257fe5b60009182526020909120600490910201546001600160a01b0316141561195e5760016015828154811061193157fe5b9060005260206000209060040201600201601c6101000a81548160ff021916908315150217905550611966565b6001016118e1565b5050565b3341146119895760405162461bcd60e51b8152600401610e7290619213565b60105443116119aa5760405162461bcd60e51b8152600401610e7290618a90565b3a156119c85760405162461bcd60e51b8152600401610e7290618f1b565b60005460ff166119ea5760405162461bcd60e51b8152600401610e729061886e565b60006110023168056bc75e2d63100000811115611a2157611a1a8168056bc75e2d6310000063ffffffff6164fd16565b9150611a28565b5050611ca9565b6040516309a99b4f60e41b815261100290639a99b4f090611a4f903090869060040161850d565b602060405180830381600087803b158015611a6957600080fd5b505af1158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa191906183a4565b915081611aaf575050611ca9565b6000805b84811015611add57858582818110611ac757fe5b9050602002013582019150806001019050611ab3565b5080611aeb57505050611ca9565b6000806000805b89811015611ca15784898983818110611b0757fe5b90506020020135880281611b1757fe5b0493508a8a82818110611b2657fe5b9050602002016020810190611b3b919061814d565b6001600160a01b03811660009081526004602052604090205490935091508115611c57576000600180840381548110611b7057fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611bdd57836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8586604051611bd091906193bb565b60405180910390a2611c51565b600354611bf0908663ffffffff61653f16565b6003908155810154611c08908663ffffffff61653f16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611c489088906193bb565b60405180910390a25b50611c99565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8585604051611c9091906193bb565b60405180910390a25b600101611af2565b505050505050505b5050436010555050565b6001546000908210611cc757506000611d7d565b60006001600160a01b031660018381548110611cdf57fe5b60009182526020909120600490910201546001600160a01b03161480611d0f57506008541580611d0f5750600a54155b80611d1e575060085460095410155b80611d2f5750611d2d82611d82565b155b80611d5857506000600b8381548110611d4457fe5b906000526020600020906016020160000154115b80611d6c57506001611d68613362565b5111155b15611d7957506000611d7d565b5060015b919050565b6001546000908210611d9657506000611d7d565b600b548210611dd35760018281548110611dac57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611d7d565b60018281548110611de057fe5b9060005260206000209060040201600201601c9054906101000a900460ff16158015611e2d5750600b8281548110611e1457fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b54611ef157611e42617cf9565b60015460005b81811015611eed57600b805460018101825560009190915283516000805160206194c88339815191526016909202918201908155602080860151600080516020619af78339815191528401805460ff1916911515919091179055604086015180518794611ec9936000805160206194e8833981519152909101920190617d28565b506060820151611edf9060038301906013617da2565b505050806001019050611e48565b5050505b336110011480611f02575033612002145b611f1e5760405162461bcd60e51b8152600401610e72906188a5565b6001600160a01b03811660009081526004602052604090205480611f425750611f95565b6001810390506000600b8281548110611f5757fe5b600091825260209091206001601690920201015460ff169050611f7a8383615461565b8015611f835750805b15610e94576009805460001901905550505b50565b60015460609081906000805b82811015611feb5760018181548110611fb957fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611fe3576001909101905b600101611fa4565b50606081604051908082528060200260200182016040528015612018578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561205157816020015b606081526020019060019003908161203c5790505b50600b54600094509091508414156121cc5760005b848110156121c6576001818154811061207b57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166121be57600181815481106120ab57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106120d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061210357fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561219b5780601f106121705761010080835404028352916020019161219b565b820191906000526020600020905b81548152906001019060200180831161217e57829003601f168201915b50505050508285815181106121ac57fe5b60209081029190910101526001909301925b600101612066565b50612268565b60005b8481101561226657600181815481106121e457fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661225e576001818154811061221457fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061223f57fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016121cf565b505b909450925050505b9091565b600181565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c54116122ab5760156122af565b600c545b905060606122bb613362565b905060606122c882616564565b9050828251116122df579094509250612270915050565b838383510310156122f1578282510393505b83156123275760c8430461230d83838388880360008a8a6166d2565b6123258383838888038989038a8b8b8b5103016166d2565b505b606083604051908082528060200260200182016040528015612353578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561238c57816020015b60608152602001906001900390816123775790505b50905060005b8581101561240d578481815181106123a657fe5b60200260200101518382815181106123ba57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106123e657fe5b60200260200101518282815181106123fa57fe5b6020908102919091010152600101612392565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480612455576000915050611d7d565b600019016111c081611d82565b6001600160a01b0381166000908152600460205260408120548061248a576000915050611d7d565b60018082038154811061249957fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b601281815481106124ca57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529350909183018282801561255b5780601f106125305761010080835404028352916020019161255b565b820191906000526020600020905b81548152906001019060200180831161253e57829003601f168201915b505050505081565b60105481565b6001818154811061257657fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b33612000146126265760405162461bcd60e51b8152600401610e72906191c4565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f3890210160583838360405161265993929190619404565b60405180910390a1505050565b60025481565b60115481565b60145460ff1681565b600a5481565b6000601754600014156126965750600161269b565b506017545b90565b6001600160a01b038116600090815260046020526040812054806126d45760405162461bcd60e51b8152600401610e729061914c565b6000190192915050565b600b5461279c576126ed617cf9565b60015460005b8181101561279857600b805460018101825560009190915283516000805160206194c88339815191526016909202918201908155602080860151600080516020619af78339815191528401805460ff1916911515919091179055604086015180518794612774936000805160206194e8833981519152909101920190617d28565b50606082015161278a9060038301906013617da2565b5050508060010190506126f3565b5050505b6008546127a95760036008555b600a546127b6576002600a555b60006127c13361269e565b90506127cc81611cb3565b6127e85760405162461bcd60e51b8152600401610e7290618e52565b611f953382616829565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef81526020016195086105ef913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff1661286c5760405162461bcd60e51b8152600401610e729061886e565b336110071461288d5760405162461bcd60e51b8152600401610e7290618f49565b6128f784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506168c19050565b15612994576020811461291c5760405162461bcd60e51b8152600401610e7290619106565b604080516020601f840181900481028201810190925282815260009161295a9185858083850183828082843760009201919091525061691a92505050565b9050606481101580156129705750620186a08111155b61298c5760405162461bcd60e51b8152600401610e7290618cb3565b600255613300565b6129f484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506168c19050565b15612aa95760208114612a195760405162461bcd60e51b8152600401610e72906186f4565b604080516020601f8401819004810282018101909252828152600091612a579185858083850183828082843760009201919091525061691a92505050565b9050612710612a83601854612a77600f548561653f90919063ffffffff16565b9063ffffffff61653f16565b1115612aa15760405162461bcd60e51b8152600401610e7290618bd9565b600655613300565b612b1384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506168c19050565b15612bad5760208114612b385760405162461bcd60e51b8152600401610e729061872b565b604080516020601f8401819004810282018101909252828152600091612b769185858083850183828082843760009201919091525061691a92505050565b600c5490915080612b85575060155b808210612ba45760405162461bcd60e51b8152600401610e7290618afa565b50600855613300565b612c1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506168c19050565b15612caf5760208114612c3b5760405162461bcd60e51b8152600401610e72906187f4565b604080516020601f8401819004810282018101909252828152600091612c799185858083850183828082843760009201919091525061691a92505050565b9050600081118015612c8b5750600a81105b612ca75760405162461bcd60e51b8152600401610e72906192a8565b600a55613300565b612d2384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506168c19050565b15612db25760208114612d485760405162461bcd60e51b8152600401610e72906187a8565b604080516020601f8401819004810282018101909252828152600091612d869185858083850183828082843760009201919091525061691a92505050565b9050600d54811115612daa5760405162461bcd60e51b8152600401610e7290618d29565b600e55613300565b612e1b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506168c19050565b15612e9d5760208114612e405760405162461bcd60e51b8152600401610e7290618f97565b604080516020601f8401819004810282018101909252828152600091612e7e9185858083850183828082843760009201919091525061691a92505050565b600d819055600e54909150811015612e9757600d54600e555b50613300565b612f0184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506168c19050565b15612faf5760208114612f265760405162461bcd60e51b8152600401610e7290618839565b604080516020601f8401819004810282018101909252828152600091612f649185858083850183828082843760009201919091525061691a92505050565b905060008111612f865760405162461bcd60e51b8152600401610e72906189a2565b6064811115612fa75760405162461bcd60e51b8152600401610e72906189ea565b600c55613300565b61301b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b602082015291506168c19050565b156130c457602081146130405760405162461bcd60e51b8152600401610e7290619260565b604080516020601f840181900481028201810190925282815260009161307e9185858083850183828082843760009201919091525061691a92505050565b905061271061309e601854612a776006548561653f90919063ffffffff16565b11156130bc5760405162461bcd60e51b8152600401610e7290618913565b600f55613300565b61313884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f0000000000000000602082015291506168c19050565b156131e1576020811461315d5760405162461bcd60e51b8152600401610e7290618c68565b604080516020601f840181900481028201810190925282815260009161319b9185858083850183828082843760009201919091525061691a92505050565b90506127106131bb600f54612a776006548561653f90919063ffffffff16565b11156131d95760405162461bcd60e51b8152600401610e7290618dc3565b601855613300565b61324284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b602082015291506168c19050565b156132e857602081146132675760405162461bcd60e51b8152600401610e7290618b57565b604080516020601f84018190048102820181019092528281526000916132a59185858083850183828082843760009201919091525061691a92505050565b9050600381101580156132b9575060098111155b806132c45750806001145b6132e05760405162461bcd60e51b8152600401610e7290619080565b601755613300565b60405162461bcd60e51b8152600401610e7290619305565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161333594939291906186c2565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156133915761337d81611d82565b15613389578160010191505b60010161336c565b506060816040519080825280602002602001820160405280156133be578160200160208202803683370190505b5090506000915060005b83811015613445576133d981611d82565b1561343d57600181815481106133eb57fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061341657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b6001016133c8565b509250505090565b601581565b61027181565b61100281565b60175481565b601381815481106124ca57fe5b60185481565b6000613481613362565b519050600080600c541161349657601561349a565b600c545b9050808211156134a8578091505b816134b257600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff16156134f75760405162461bcd60e51b8152600401610e7290619049565b6134ff617dcf565b60006135256040518061062001604052806105ef81526020016195086105ef9139614082565b91509150806135465760405162461bcd60e51b8152600401610e7290619183565b60005b82602001515181101561366b5760018360200151828151811061356857fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061363e57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101613549565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b818110156137925761377a85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506013805490925085915081106136e257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156137705780601f1061374557610100808354040283529160200191613770565b820191906000526020600020905b81548152906001019060200180831161375357829003601f168201915b505050505061691f565b1561378a57600192505050611e2d565b600101613691565b5060125460005b81811015613803576137ea86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506012805490925085915081106136e257fe5b156137fb5760019350505050611e2d565b600101613799565b50600095945050505050565b33611001146138305760405162461bcd60e51b8152600401610e729061932c565b600b546138ee5761383f617cf9565b60015460005b818110156138ea57600b805460018101825560009190915283516000805160206194c88339815191526016909202918201908155602080860151600080516020619af78339815191528401805460ff19169115159190911790556040860151805187946138c6936000805160206194e8833981519152909101920190617d28565b5060608201516138dc9060038301906013617da2565b505050806001019050613845565b5050505b60006138f982616983565b905061390481611cb3565b15611966576119668282616829565b606581565b601181565b33411461393c5760405162461bcd60e51b8152600401610e7290619213565b60005460ff1661395e5760405162461bcd60e51b8152600401610e729061886e565b6000341161397e5760405162461bcd60e51b8152600401610e7290618cfa565b3a1561399c5760405162461bcd60e51b8152600401610e7290618f1b565b6001600160a01b03811660009081526004602052604090205460145434919060ff166139dc57610271600f556103e86006556014805460ff191660011790555b600f5460175460011080156139f357506000601854115b15613a18576001601754036017544381613a0957fe5b066018540281613a1557fe5b04015b600083118015613a285750600081115b15613ad5576000613a51612710613a45348563ffffffff616b0616565b9063ffffffff616b4016565b90508015613ad3576040516110029082156108fc029083906000818181858888f19350505050158015613a88573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d81604051613ab891906193bb565b60405180910390a1613ad0848263ffffffff6164fd16565b93505b505b600083118015613ae757506000600654115b15613b8d576000613b09612710613a4560065434616b0690919063ffffffff16565b90508015613b8b5760405161dead9082156108fc029083906000818181858888f19350505050158015613b40573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee581604051613b7091906193bb565b60405180910390a1613b88848263ffffffff6164fd16565b93505b505b8115613c8b576000600180840381548110613ba457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615613c1157846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051613c0491906193bb565b60405180910390a2613c85565b600354613c24908563ffffffff61653f16565b6003908155810154613c3c908563ffffffff61653f16565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590613c7c9087906193bb565b60405180910390a25b50613ccd565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051613cc491906193bb565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110613cf257fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015613d9d5780601f10613d7257610100808354040283529160200191613d9d565b820191906000526020600020905b815481529060010190602001808311613d8057829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613dbe575082155b80613dc95750600954155b15613dd65750600061407a565b60096000815460019003919050819055506000613e21600a54613a4586613a45600b8a81548110613e0357fe5b6000918252602090912060169091020154439063ffffffff6164fd16565b90506000600b8681548110613e3257fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015613e9757600080fd5b505afa158015613eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ecf91906183bc565b915091506000935080831061403057613ee88888615461565b5060405163436aa28360e11b8152600090612002906386d5450690613f11908c906004016184f9565b60206040518083038186803b158015613f2957600080fd5b505afa158015613f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f619190618169565b6001600160a01b031614613fcf576040516328aa02b160e01b8152611001906328aa02b190613f98908b9087908a90600401618568565b600060405180830381600087803b158015613fb257600080fd5b505af1158015613fc6573d6000803e3d6000fd5b50505050614027565b6040516305bfb49960e41b815261100190635bfb499090613ff4908b906004016184f9565b600060405180830381600087803b15801561400e57600080fd5b505af1158015614022573d6000803e3d6000fd5b505050505b60019350614042565b8183106140425761404088616983565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b61408a617dcf565b6000614094617dcf565b61409c617e6c565b6140ad6140a886616b82565b616ba7565b90506000805b6140bc83616bf1565b1561423057806140e1576140d76140d284616c12565b616c60565b60ff168452614228565b80600114156142235760606140fd6140f885616c12565b616ce0565b9050805160405190808252806020026020018201604052801561413a57816020015b614127617df3565b81526020019060019003908161411f5790505b508560200181905250805160405190808252806020026020018201604052801561417857816020015b60608152602001906001900390816141635790505b50604086015260005b815181101561421857614192617df3565b606060006141b28585815181106141a557fe5b6020026020010151616db1565b925092509250806141d2578860009a509a50505050505050505050614239565b82896020015185815181106141e357fe5b602002602001018190525081896040015185815181106141ff57fe5b6020026020010181905250505050806001019050614181565b506001925050614228565b614230565b6001016140b3565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b606081526020019060019003908161425857905050905061427e8363ffffffff16616ecb565b8160008151811061428b57fe5b60200260200101819052506111c081616ede565b60006064835111156142d6576000805160206194a88339815191526040516142c690618a47565b60405180910390a1506066611e2d565b60005b83518110156143745760005b8181101561436b578481815181106142f957fe5b6020026020010151600001516001600160a01b031685838151811061431a57fe5b6020026020010151600001516001600160a01b03161415614363576000805160206194a883398151915260405161435090618b8e565b60405180910390a1606692505050611e2d565b6001016142e5565b506001016142d9565b5060608060606015805480602002602001604051908101604052809291908181526020016000905b828210156144265760008481526020908190206040805160c0810182526004860290920180546001600160a01b039081168452600180830154821685870152600283015491821693850193909352600160a01b81046001600160401b03166060850152600160e01b900460ff16151560808401526003015460a0830152908352909201910161439c565b50505050905060606016805480602002602001604051908101604052809291908181526020016000905b828210156144fb5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156144e75780601f106144bc576101008083540402835291602001916144e7565b820191906000526020600020905b8154815290600101906020018083116144ca57829003601f168201915b505050505081526020019060010190614450565b50505050905060005b82518110156145585782818151811061451957fe5b60200260200101516060015160030283828151811061453457fe5b60209081029190910101516001600160401b03909116606090910152600101614504565b5060608061456889898686616f68565b915091506145768282615824565b600154604080518281526020808402820101909152929850909650600095508594509250606091508280156145b5578160200160208202803683370190505b50905060005b828110156147465760006001600160a01b03166120026001600160a01b03166386d54506600184815481106145ec57fe5b60009182526020909120600491820201546040516001600160e01b031960e085901b168152614627926001600160a01b0390921691016184f9565b60206040518083038186803b15801561463f57600080fd5b505afa158015614653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146779190618169565b6001600160a01b0316146146d957600182828151811061469357fe5b602002602001019060ff16908160ff1681525050600181815481106146b457fe5b9060005260206000209060040201600301546000146146d4578360010193505b61473e565b67016345785d8a0000600182815481106146ef57fe5b906000526020600020906004020160030154106147115784600101945061473e565b6001818154811061471e57fe5b90600052602060002090600402016003015460001461473e578360010193505b6001016145bb565b50606084604051908082528060200260200182016040528015614773578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156147a2578160200160208202803683370190505b5090506060866040519080825280602002602001820160405280156147d1578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015614800578160200160208202803683370190505b5090506000606088604051908082528060200260200182016040528015614831578160200160208202803683370190505b509050606089604051908082528060200260200182016040528015614860578160200160208202803683370190505b50905060009a506000995060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156148a857600080fd5b505afa1580156148bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148e091906183a4565b905067016345785d8a000081111561492c576000805160206194a883398151915260405161490d90619008565b60405180910390a160689e505050505050505050505050505050611e2d565b60005b8a811015614cc05789818151811061494357fe5b602002602001015160ff1660011415614a39576001818154811061496357fe5b906000526020600020906004020160030154600014614a34576001818154811061498957fe5b600091825260209091206004909102015484516001600160a01b039091169085908e9081106149b457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600181815481106149e157fe5b906000526020600020906004020160030154838d815181106149ff57fe5b60200260200101818152505060018a8d81518110614a1957fe5b602002602001019060ff16908160ff16815250508b6001019b505b614cb8565b67016345785d8a000060018281548110614a4f57fe5b90600052602060002090600402016003015410614bd45760018181548110614a7357fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898e81518110614aa457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be40060018381548110614ad957fe5b90600052602060002090600402016003015481614af257fe5b0660018381548110614b0057fe5b906000526020600020906004020160030154039050614b2883826164fd90919063ffffffff16565b898f81518110614b3457fe5b60200260200101818152505060018281548110614b4d57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878f81518110614b7e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888f81518110614bab57fe5b6020908102919091010152614bc6868263ffffffff61653f16565b95508d6001019d5050614cb8565b60018181548110614be157fe5b906000526020600020906004020160030154600014614cb85760018181548110614c0757fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848d81518110614c3857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060018181548110614c6557fe5b906000526020600020906004020160030154838d81518110614c8357fe5b60200260200101818152505060008a8d81518110614c9d57fe5b602002602001019060ff16908160ff16815250508b6001019b505b60010161492f565b5060008415614f36576002546040516303702b2960e51b815261100491636e056520918891614cfa918e918e918d9142019060040161862a565b6020604051808303818588803b158015614d1357600080fd5b505af193505050508015614d44575060408051601f3d908101601f19168201909252614d41918101906182d1565b60015b614ebb576040516000815260443d1015614d6057506000614dfb565b60046000803e60005160e01c6308c379a08114614d81576000915050614dfb565b60043d036004833e81513d60248201116001600160401b0382111715614dac57600092505050614dfb565b80830180516001600160401b03811115614dcd576000945050505050614dfb565b8060208301013d8601811115614deb57600095505050505050614dfb565b601f01601f191660405250925050505b80614e065750614e48565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051614e3a91906186af565b60405180910390a250614eb6565b3d808015614e72576040519150601f19603f3d011682016040523d82523d6000602084013e614e77565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051614eac91906186af565b60405180910390a2505b614f36565b8015614efd577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051614ef091906193bb565b60405180910390a1614f34565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051614f2b90618771565b60405180910390a25b505b80156150ec5760005b87518110156150ea576000888281518110614f5657fe5b60200260200101519050600060018281548110614f6f57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110614fa057fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f193505050509050801561505c5760018281548110614fe157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d918590811061503057fe5b90600052602060002090600402016003015460405161504f91906193bb565b60405180910390a26150e0565b6001828154811061506957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d91859081106150b857fe5b9060005260206000209060040201600301546040516150d791906193bb565b60405180910390a25b5050600101614f3f565b505b8351156152e25760005b84518110156152e0578a818151811061510b57fe5b602002602001015160ff16600114156151aa576120026001600160a01b031663092193ab85838151811061513b57fe5b602002602001015187848151811061514f57fe5b60200260200101516040518363ffffffff1660e01b815260040161517391906184f9565b6000604051808303818588803b15801561518c57600080fd5b505af11580156151a0573d6000803e3d6000fd5b50505050506152d8565b60008582815181106151b857fe5b60200260200101516001600160a01b03166108fc8684815181106151d857fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561526e5785828151811061520e57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d86848151811061524c57fe5b602002602001015160405161526191906193bb565b60405180910390a26152d6565b85828151811061527a57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d8684815181106152b857fe5b60200260200101516040516152cd91906193bb565b60405180910390a25b505b6001016150f6565b505b5050505050505050505050505060005b60015481101561534f576001818154811061530957fe5b9060005260206000209060040201600301546000146153475760006001828154811061533157fe5b9060005260206000209060040201600301819055505b6001016152f2565b5047156153bd577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d4760405161538591906193bb565b60405180910390a1604051611002904780156108fc02916000818181858888f193505050501580156153bb573d6000803e3d6000fd5b505b600060038190556005558151156153d8576153d88282615d0e565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561541557600080fd5b505af1158015615429573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b6000806001838154811061547157fe5b9060005260206000209060040201600301549050600060018080549050039050600161549b613362565b51116154d0576000600185815481106154b057fe5b906000526020600020906004020160030181905550600092505050611e2d565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a708360405161550991906193bb565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156156f6576001816001018154811061554a57fe5b90600052602060002090600402016001828154811061556557fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061562657fe5b9060005260206000209060160201600b828154811061564157fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054615698938386019390821615610100026000190190911604617e8c565b506156ab60038281019084016013617f01565b509050508060010160046000600184815481106156c457fe5b600091825260208083206004909202909101546001600160a01b0316835282019290925260400190205560010161552c565b50600180548061570257fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061575557fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906157876002830182617e28565b615795600383016000617f2b565b5050905560008183816157a457fe5b04905080156158185760015460005b81811015615815576157ec83600183815481106157cc57fe5b90600052602060002090600402016003015461653f90919063ffffffff16565b600182815481106157f957fe5b60009182526020909120600360049092020101556001016157b3565b50505b50600195945050505050565b606080600080808080615835613477565b6001549091505b8015615a6757600181039250600b838154811061585557fe5b600091825260209091206001601690920201015460ff1661587557615a5e565b6001838154811061588257fe5b600091825260208220600490910201546001600160a01b031695506158ac90869085908590613dad565b9350836158b857615a5e565b60405163436aa28360e11b81526000908190612002906386d54506906158e2908a906004016184f9565b60206040518083038186803b1580156158fa57600080fd5b505afa15801561590e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906159329190618169565b90506001600160a01b038116156159bb576040516302ceee9160e11b81526120029063059ddd22906159689084906004016184f9565b60206040518083038186803b15801561598057600080fd5b505afa158015615994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906159b89190618169565b91505b60005b8c51811015615a5a57876001600160a01b03168d82815181106159dd57fe5b6020026020010151600001516001600160a01b03161480615a265750826001600160a01b03168d8281518110615a0f57fe5b6020026020010151600001516001600160a01b0316145b15615a525760018d8281518110615a3957fe5b6020908102919091010151901515608090910152615a5a565b6001016159be565b5050505b6000190161583c565b5060005b8951811015615ad457898181518110615a8057fe5b60200260200101516080015180615ac0575060006001600160a01b03168a8281518110615aa957fe5b6020026020010151600001516001600160a01b0316145b15615acc578560010195505b600101615a6b565b5088518510615bbc5760408051600180825281830190925290816020015b615afa617df3565b815260200190600190039081615af2575050604080516001808252818301909252919850602082015b6060815260200190600190039081615b2357905050955088600081518110615b4757fe5b602002602001015187600081518110615b5c57fe5b602002602001018190525087600081518110615b7457fe5b602002602001015186600081518110615b8957fe5b6020026020010181905250600087600081518110615ba357fe5b6020908102919091010151901515608090910152615d01565b84895103604051908082528060200260200182016040528015615bf957816020015b615be6617df3565b815260200190600190039081615bde5790505b50965084895103604051908082528060200260200182016040528015615c3357816020015b6060815260200190600190039081615c1e5790505b5095506000915060005b8951811015615cff57898181518110615c5257fe5b602002602001015160800151158015615c95575060006001600160a01b03168a8281518110615c7d57fe5b6020026020010151600001516001600160a01b031614155b15615cf757898181518110615ca657fe5b6020026020010151888481518110615cba57fe5b6020026020010181905250888181518110615cd157fe5b6020026020010151878481518110615ce557fe5b60200260200101819052508260010192505b600101615c3d565b505b50505050505b9250929050565b600154825160005b82811015615e2b576001615d28617df3565b60018381548110615d3557fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015615dff57878181518110615dc557fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615df75760009250615dff565b600101615db1565b508115615e215780516001600160a01b03166000908152600460205260408120555b5050600101615d16565b5080821115615eea57805b82811015615ee8576001805480615e4957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480615e9c57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590615ece6002830182617e28565b615edc600383016000617f2b565b50509055600101615e36565b505b6000818310615ef95781615efb565b825b905060005b8181101561629f57615fad868281518110615f1757fe5b602002602001015160018381548110615f2c57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152617334565b616161578060010160046000888481518110615fc557fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061600157fe5b60200260200101516001828154811061601657fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106160d157fe5b6020026020010151600b82815481106160e657fe5b9060005260206000209060160201600201908051906020019061610a929190617d28565b506000600b828154811061611a57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061614b57fe5b6000918252602090912060169091020155616297565b85818151811061616d57fe5b6020026020010151606001516001828154811061618657fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b0316021790555061624c8582815181106161ca57fe5b6020026020010151600b83815481106161df57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156137705780601f1061374557610100808354040283529160200191613770565b6162975784818151811061625c57fe5b6020026020010151600b828154811061627157fe5b90600052602060002090601602016002019080519060200190616295929190617d28565b505b600101615f00565b5082821115616477576162b0617cf9565b835b83811015616474578581815181106162c657fe5b6020026020010151826040018190525060018782815181106162e457fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206194c8833981519152810191825585830151600080516020619af78339815191528201805491151560ff199092169190911790559285015180518694929361641a936000805160206194e883398151915201920190617d28565b5060608201516164309060038301906013617da2565b505050806001016004600089848151811061644757fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016162b2565b50505b61647f617390565b616487617572565b6000600981905560015493505b838110156164f5576000600b82815481106164ab57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106164dc57fe5b6000918252602090912060169091020155600101616494565b505050505050565b60006111c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250617760565b6000828201838110156111c05760405162461bcd60e51b8152600401610e72906188dc565b6001548151604080518281526020808402820101909152606092919083908280156165a357816020015b606081526020019060019003908161658e5790505b50600b5490915083146165ba579250611d7d915050565b60005b828110156166c957600b6001600460008985815181106165d957fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054038154811061660d57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156166a55780601f1061667a576101008083540402835291602001916166a5565b820191906000526020600020905b81548152906001019060200180831161668857829003601f168201915b50505050508282815181106166b657fe5b60209081029190910101526001016165bd565b50949350505050565b60005b8281101561681f57600082878388016040516020016166f59291906184eb565b6040516020818303038152906040528051906020012060001c8161671557fe5b06905080850182870114616816576000898388018151811061673357fe5b602002602001015190506060898489018151811061674d57fe5b602002602001015190508a8388018151811061676557fe5b60200260200101518b858a018151811061677b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b848901815181106167aa57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505089838801815181106167d857fe5b60200260200101518a858a01815181106167ee57fe5b6020026020010181905250808a8489018151811061680857fe5b602002602001018190525050505b506001016166d5565b5050505050505050565b600980546001908101909155600b80548390811061684357fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061687957fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016168d491906184cf565b60405160208183030381529060405280519060200120836040516020016168fb91906184cf565b6040516020818303038152906040528051906020012014905092915050565b015190565b81518151600091600191811480831461693b5760009250616979565b600160208701838101602088015b6002848385100114156169745780518351146169685760009650600093505b60209283019201616949565b505050505b5090949350505050565b6001600160a01b038116600090815260046020526040812054806169ac57506000199050611d7d565b6001810390506000600182815481106169c157fe5b90600052602060002090600402016003015490506000600183815481106169e457fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90616a3d9085906193bb565b60405180910390a280616a5557829350505050611d7d565b6000818381616a6057fe5b0490508015616afc5760005b84811015616aae57616a8582600183815481106157cc57fe5b60018281548110616a9257fe5b6000918252602090912060036004909202010155600101616a6c565b50600180549085015b81811015616af957616ad083600183815481106157cc57fe5b60018281548110616add57fe5b6000918252602090912060036004909202010155600101616ab7565b50505b5091949350505050565b600082616b1557506000611e2d565b82820282848281616b2257fe5b04146111c05760405162461bcd60e51b8152600401610e7290618eda565b60006111c083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061778c565b616b8a617f3a565b506040805180820190915281518152602082810190820152919050565b616baf617e6c565b616bb8826177c3565b616bc157600080fd5b6000616bd083602001516177fd565b60208085015160408051808201909152868152920190820152915050919050565b6000616bfb617f3a565b505080518051602091820151919092015191011190565b616c1a617f3a565b616c2382616bf1565b616c2c57600080fd5b60208201516000616c3c82617860565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590616c7557508151602110155b616c7e57600080fd5b6000616c8d83602001516177fd565b90508083600001511015616cb35760405162461bcd60e51b8152600401610e72906190cf565b8251602080850151830180519284900392918310156166c957506020919091036101000a90049392505050565b6060616ceb826177c3565b616cf457600080fd5b6000616cff83617941565b9050606081604051908082528060200260200182016040528015616d3d57816020015b616d2a617f3a565b815260200190600190039081616d225790505b5090506000616d4f85602001516177fd565b60208601510190506000805b84811015616da657616d6c83617860565b9150604051806040016040528083815260200184815250848281518110616d8f57fe5b602090810291909101015291810191600101616d5b565b509195945050505050565b616db9617df3565b60606000616dc5617df3565b6060616dcf617e6c565b616dd887616ba7565b90506000805b616de783616bf1565b15616ebc5780616e1257616e02616dfd84616c12565b61799d565b6001600160a01b03168552616eb4565b8060011415616e3a57616e27616dfd84616c12565b6001600160a01b03166020860152616eb4565b8060021415616e6257616e4f616dfd84616c12565b6001600160a01b03166040860152616eb4565b8060031415616e8e57616e776140d284616c12565b6001600160401b0316606086015260019150616eb4565b8060041415616eaf57616ea8616ea384616c12565b6179b7565b9350616eb4565b616ebc565b600101616dde565b50929791965091945092505050565b6060611e2d616ed983617a27565b617b0d565b6060815160001415616eff5750604080516000815260208101909152611d7d565b606082600081518110616f0e57fe5b602002602001015190506000600190505b8351811015616f4f57616f4582858381518110616f3857fe5b6020026020010151617b5f565b9150600101616f1f565b506111c0616f62825160c060ff16617bdc565b82617b5f565b60608060006120026001600160a01b031663c473318f6040518163ffffffff1660e01b815260040160206040518083038186803b158015616fa857600080fd5b505afa158015616fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616fe091906183a4565b90508085518851011015616ff5575083518651015b60608160405190808252806020026020018201604052801561703157816020015b61701e617df3565b8152602001906001900390816170165790505b50905060608260405190808252806020026020018201604052801561706a57816020015b60608152602001906001900390816170555790505b50905060008060005b8b518310806170825750895182105b801561708d57508581105b15617322578b518314156170fd578982815181106170a757fe5b60200260200101518582815181106170bb57fe5b60200260200101819052508882815181106170d257fe5b60200260200101518482815181106170e657fe5b602090810291909101015260019182019101617073565b8951821415617168578b838151811061711257fe5b602002602001015185828151811061712657fe5b60200260200101819052508a838151811061713d57fe5b602002602001015184828151811061715157fe5b602090810291909101015260019283019201617073565b89828151811061717457fe5b6020026020010151606001516001600160401b03168c848151811061719557fe5b6020026020010151606001516001600160401b03161115617211578b83815181106171bc57fe5b60200260200101518582815181106171d057fe5b60200260200101819052508a83815181106171e757fe5b60200260200101518482815181106171fb57fe5b602002602001018190525082600101925061731a565b89828151811061721d57fe5b6020026020010151606001516001600160401b03168c848151811061723e57fe5b6020026020010151606001516001600160401b031610156172ba5789828151811061726557fe5b602002602001015185828151811061727957fe5b602002602001018190525088828151811061729057fe5b60200260200101518482815181106172a457fe5b602002602001018190525081600101915061731a565b8982815181106172c657fe5b6020026020010151600001516001600160a01b03168c84815181106172e757fe5b6020026020010151600001516001600160a01b0316101561730e578b83815181106171bc57fe5b8982815181106170a757fe5b600101617073565b50929a91995090975050505050505050565b805182516000916001600160a01b03918216911614801561736e575081602001516001600160a01b031683602001516001600160a01b0316145b80156111c05750506040908101519101516001600160a01b0390811691161490565b601254601354808211156173db57805b828110156173d95760128054806173b357fe5b6001900381819060005260206000200160006173cf9190617e28565b90556001016173a0565b505b60008183106173ea57816173ec565b825b905060005b81811015617504576174a96012828154811061740957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156174975780601f1061746c57610100808354040283529160200191617497565b820191906000526020600020905b81548152906001019060200180831161747a57829003601f168201915b5050505050601383815481106136e257fe5b6174fc57601381815481106174ba57fe5b90600052602060002001601282815481106174d157fe5b9060005260206000200190805460018160011615610100020316600290046174fa929190617e8c565b505b6001016173f1565b5082821115610e9457825b82811015613ccd5760126013828154811061752657fe5b6000918252602080832084546001818101875595855291909320929091018054617569949390920192909160026101009282161592909202600019011604617e8c565b5060010161750f565b601354600b54808211156175bd57805b828110156175bb57601380548061759557fe5b6001900381819060005260206000200160006175b19190617e28565b9055600101617582565b505b60008183106175cc57816175ce565b825b905060005b818110156176ed5761768b601382815481106175eb57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156176795780601f1061764e57610100808354040283529160200191617679565b820191906000526020600020905b81548152906001019060200180831161765c57829003601f168201915b5050505050600b83815481106161df57fe5b6176e557600b818154811061769c57fe5b9060005260206000209060160201600201601382815481106176ba57fe5b9060005260206000200190805460018160011615610100020316600290046176e3929190617e8c565b505b6001016175d3565b5082821115610e9457825b82811015613ccd576013600b828154811061770f57fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461775795939094019390926000199082161561010002011604617e8c565b506001016176f8565b600081848411156177845760405162461bcd60e51b8152600401610e7291906186af565b505050900390565b600081836177ad5760405162461bcd60e51b8152600401610e7291906186af565b5060008385816177b957fe5b0495945050505050565b80516000906177d457506000611d7d565b6020820151805160001a9060c08210156177f357600092505050611d7d565b5060019392505050565b8051600090811a6080811015617817576000915050611d7d565b60b8811080617832575060c08110801590617832575060f881105b15617841576001915050611d7d565b60c08110156178555760b519019050611d7d565b60f519019050611d7d565b80516000908190811a608081101561787b576001915061793a565b60b881101561789057607e198101915061793a565b60c08110156178e157600060b78203600186019550806020036101000a8651049150600181018201935050808310156178db5760405162461bcd60e51b8152600401610e7290618d98565b5061793a565b60f88110156178f65760be198101915061793a565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156179385760405162461bcd60e51b8152600401610e7290618d98565b505b5092915050565b805160009061795257506000611d7d565b6000809050600061796684602001516177fd565b602085015185519181019250015b808210156179945761798582617860565b82019150826001019250617974565b50909392505050565b80516000906015146179ae57600080fd5b611e2d82616c60565b80516060906179c557600080fd5b60006179d483602001516177fd565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015617a0b576020820181803683370190505b50905060008160200190506166c9848760200151018285617cae565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416617a6b57506018617a8f565b6fffffffffffffffffffffffffffffffff198416617a8b57506010617a8f565b5060005b6020811015617ac557818181518110617aa457fe5b01602001516001600160f81b03191615617abd57617ac5565b600101617a8f565b60008160200390506060816040519080825280601f01601f191660200182016040528015617afa576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015617b3f5750607f60f81b82600081518110617b2d57fe5b01602001516001600160f81b03191611155b15617b4b575080611d7d565b611e2d617b5d8351608060ff16617bdc565b835b6060806040519050835180825260208201818101602087015b81831015617b90578051835260209283019201617b78565b50855184518101855292509050808201602086015b81831015617bbd578051835260209283019201617ba5565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310617c065760405162461bcd60e51b8152600401610e7290618ad2565b60408051600180825281830190925260609160208201818036833701905050905060378411617c605782840160f81b81600081518110617c4257fe5b60200101906001600160f81b031916908160001a9053509050611e2d565b6060617c6b85617a27565b90508381510160370160f81b82600081518110617c8457fe5b60200101906001600160f81b031916908160001a905350617ca58282617b5f565b95945050505050565b80617cb857610e94565b5b60208110617cd8578251825260209283019290910190601f1901617cb9565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001617d23617f54565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617d6957805160ff1916838001178555617d96565b82800160010185558215617d96579182015b82811115617d96578251825591602001919060010190617d7b565b506134b2929150617f73565b8260138101928215617d965791602002820182811115617d96578251825591602001919060010190617d7b565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b50805460018160011615610100020316600290046000825580601f10617e4e5750611f95565b601f016020900490600052602060002090810190611f959190617f73565b6040518060400160405280617e7f617f3a565b8152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617ec55780548555617d96565b82800160010185558215617d9657600052602060002091601f016020900482015b82811115617d96578254825591600101919060010190617ee6565b8260138101928215617d965791820182811115617d96578254825591600101919060010190617ee6565b50611f95906013810190617f73565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61269b91905b808211156134b25760008155600101617f79565b8035611e2d81619492565b60008083601f840112617fa9578182fd5b5081356001600160401b03811115617fbf578182fd5b6020830191508360208083028501011115615d0757600080fd5b6000601f8381840112617fea578182fd5b8235617ffd617ff882619447565b619421565b818152925060208084019085810160005b8481101561808f578135880189603f82011261802957600080fd5b838101356001600160401b0381111561804157600080fd5b618052818901601f19168601619421565b81815260408c8184860101111561806857600080fd5b8281850188840137506000918101860191909152855250928201929082019060010161800e565b50505050505092915050565b600082601f8301126180ab578081fd5b81356180b9617ff882619447565b8181529150602080830190848101818402860182018710156180da57600080fd5b6000805b8581101561808f5782356001600160401b03811681146180fc578283fd5b855293830193918301916001016180de565b60008083601f84011261811f578182fd5b5081356001600160401b03811115618135578182fd5b602083019150836020828501011115615d0757600080fd5b60006020828403121561815e578081fd5b81356111c081619492565b60006020828403121561817a578081fd5b81516111c081619492565b6000806000806040858703121561819a578283fd5b84356001600160401b03808211156181b0578485fd5b6181bc88838901617f98565b909650945060208701359150808211156181d4578384fd5b506181e187828801617f98565b95989497509550505050565b600080600060608486031215618201578283fd5b83356001600160401b0380821115618217578485fd5b81860187601f820112618228578586fd5b80359250618238617ff884619447565b80848252602080830192508084018b82838902870101111561825857898afd5b8994505b868510156182825761826e8c82617f8d565b84526001949094019392810192810161825c565b509097508801359350505080821115618299578384fd5b6182a58783880161809b565b935060408601359150808211156182ba578283fd5b506182c786828701617fd9565b9150509250925092565b6000602082840312156182e2578081fd5b815180151581146111c0578182fd5b60008060208385031215618303578182fd5b82356001600160401b03811115618318578283fd5b6183248582860161810e565b90969095509350505050565b60008060008060408587031215618345578384fd5b84356001600160401b038082111561835b578586fd5b6183678883890161810e565b9096509450602087013591508082111561837f578384fd5b506181e18782880161810e565b60006020828403121561839d578081fd5b5035919050565b6000602082840312156183b5578081fd5b5051919050565b600080604083850312156183ce578182fd5b505080516020909101519092909150565b6000806000604084860312156183f3578081fd5b833560ff81168114618403578182fd5b925060208401356001600160401b0381111561841d578182fd5b6184298682870161810e565b9497909650939450505050565b6000815180845260208085019450808401835b8381101561846e5781516001600160a01b031687529582019590820190600101618449565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526184bb816020860160208601619466565b601f01601f19169290920160200192915050565b600082516184e1818460208701619466565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6000602082526111c06020830184618436565b6000604082526185cd6040830185618436565b602083820381850152818551808452828401915082838202850101838801865b8381101561861b57601f198784030185526186098383516184a3565b948601949250908501906001016185ed565b50909998505050505050505050565b60006080825261863d6080830187618436565b828103602084810191909152865180835287820192820190845b8181101561867357845183529383019391830191600101618657565b505084810360408601526186878188618436565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b6000602082526111c060208301846184a3565b6000604082526186d6604083018688618479565b82810360208401526186e9818587618479565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152617ca560608301846184a3565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152617ca5604083018486618479565b6040518181016001600160401b038111828210171561943f57600080fd5b604052919050565b60006001600160401b0382111561945c578081fd5b5060209081020190565b60005b83811015619481578181015183820152602001619469565b83811115613ccd5750506000910152565b6001600160a01b0381168114611f9557600080fdfe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" + "code": "0x60806040526004361061051c5760003560e01c80638a7beb01116102a2578063c81b166211610165578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d8d578063f9a2bbc714610da2578063fc3e590814610db7578063fccc281314610dcc578063fd4ad81f14610de1578063fd6a687914610e1057610523565b8063e40716a114610cfb578063ea321e4914610d10578063eb57e20214610d30578063eda5868c14610d50578063f1fad10414610d65578063f340fa0114610d7a57610523565b8063d86222d51161011e578063d86222d514610c7d578063daacdb6614610c92578063dc927faf14610ca7578063df8079e914610cbc578063e086c7b114610cd1578063e1c7392a14610ce657610523565b8063c81b166214610c09578063c8509d81146109ae578063cb75a59214610c1e578063ce910b0c14610c33578063d58918ae14610c53578063d68fb56a14610c6857610523565b8063aa82dce111610209578063aef198a9116101c2578063aef198a914610b93578063b7ab4db514610ba8578063b8cf4ef114610bca578063bf9f499514610734578063c466689d14610bdf578063c6d3394514610bf457610523565b8063aa82dce114610aff578063aad5606314610b14578063aaf5eb6814610b29578063ab51bb9614610b3e578063ac43175114610b53578063ad3c9da614610b7357610523565b80639dc092621161025b5780639dc0926214610a815780639fe0f81614610a96578063a0dc275814610aab578063a1a11bf514610ac0578063a5422d5c14610ad5578063a78abc1614610aea57610523565b80638a7beb01146109f85780638b5ad0c914610a0d5780638c5d749d14610a225780638d19a41014610a375780639369d7de14610a5757806396713da914610a6c57610523565b80635192c82c116103ea578063718a8aa81161035157806381650b621161030a57806381650b6214610984578063820dcaa814610999578063831d65d1146109ae578063853230aa1461093057806386249882146109ce57806388b32f11146109e357610523565b8063718a8aa81461090657806375d47a0a1461091b57806378dfed4a146109305780637942fd05146109455780637a84ca2a1461095a5780637e434d541461096f57610523565b80635d77156c116103a35780635d77156c1461086057806360eba4fe1461087557806362b72cf5146108955780636969a25c146108aa5780636e47b482146108dc57806370fd5bad146108f157610523565b80635192c82c146107cc57806351b4dce3146107e157806351e80672146107f657806355614fcc1461080b578063565c56b31461082b5780635667515a1461084b57610523565b80632a0ffb6e1161048e5780633dffc387116104475780633dffc3871461073457806343756e5c1461075657806345cf9daf1461076b578063493279b1146107805780634bf6c882146107a25780634df6e0c3146107b757610523565b80632a0ffb6e14610671578063300c356714610691578063321d398a146106b15780633365af3a146106d157806335409f7f146106f15780633b071dcc1461071157610523565b8063152ad3b8116104e0578063152ad3b8146105db5780631bd14ed8146105fd5780631e4c1524146106125780631ff1806914610632578063219f22d514610647578063280870281461065c57610523565b806304c4fec61461052857806307a568471461053f5780630bee7a671461056a5780630e2374a51461058c5780631182b875146105ae57610523565b3661052357005b600080fd5b34801561053457600080fd5b5061053d610e25565b005b34801561054b57600080fd5b50610554610e99565b6040516105619190617156565b60405180910390f35b34801561057657600080fd5b5061057f610e9f565b6040516105619190617189565b34801561059857600080fd5b506105a1610ea4565b604051610561919061647f565b3480156105ba57600080fd5b506105ce6105c9366004616365565b610eaa565b604051610561919061659f565b3480156105e757600080fd5b506105f0610fc6565b6040516105619190616594565b34801561060957600080fd5b50610554610fcf565b34801561061e57600080fd5b5061053d61062d366004616193565b610fd5565b34801561063e57600080fd5b5061055461130e565b34801561065357600080fd5b5061057f611314565b34801561066857600080fd5b506105a1611319565b34801561067d57600080fd5b5061053d61068c3660046160f3565b61131f565b34801561069d57600080fd5b5061053d6106ac36600461612b565b611340565b3480156106bd57600080fd5b506105f06106cc366004616312565b611689565b3480156106dd57600080fd5b506105f06106ec366004616312565b611758565b3480156106fd57600080fd5b5061053d61070c3660046160f3565b611809565b34801561071d57600080fd5b5061072661196e565b604051610561929190616524565b34801561074057600080fd5b50610749611c4a565b604051610561919061719a565b34801561076257600080fd5b506105a1611c4f565b34801561077757600080fd5b50610554611c55565b34801561078c57600080fd5b50610795611c5b565b6040516105619190617147565b3480156107ae57600080fd5b50610749611c60565b3480156107c357600080fd5b50610726611c65565b3480156107d857600080fd5b50610554611df1565b3480156107ed57600080fd5b506105a1611df7565b34801561080257600080fd5b506105a1611dfd565b34801561081757600080fd5b506105f06108263660046160f3565b611e03565b34801561083757600080fd5b506105546108463660046160f3565b611e3f565b34801561085757600080fd5b50610749611e90565b34801561086c57600080fd5b5061057f611e95565b34801561088157600080fd5b506105ce610890366004616312565b611e9a565b3480156108a157600080fd5b50610554611f40565b3480156108b657600080fd5b506108ca6108c5366004616312565b611f46565b604051610561969594939291906164ac565b3480156108e857600080fd5b506105a1611faa565b3480156108fd57600080fd5b50610749611fb0565b34801561091257600080fd5b50610749611fb5565b34801561092757600080fd5b506105a1611fba565b34801561093c57600080fd5b50610554611fc0565b34801561095157600080fd5b50610749611fc6565b34801561096657600080fd5b50610554611fcb565b34801561097b57600080fd5b506105a1611fd1565b34801561099057600080fd5b5061057f611fd7565b3480156109a557600080fd5b50610554611fdc565b3480156109ba57600080fd5b5061053d6109c9366004616365565b611fe2565b3480156109da57600080fd5b50610554612003565b3480156109ef57600080fd5b50610554612009565b348015610a0457600080fd5b506105f061200f565b348015610a1957600080fd5b50610554612018565b348015610a2e57600080fd5b5061055461201e565b348015610a4357600080fd5b50610554610a523660046160f3565b61203b565b348015610a6357600080fd5b5061053d61207b565b348015610a7857600080fd5b5061074961218f565b348015610a8d57600080fd5b506105a1612194565b348015610aa257600080fd5b5061055461219a565b348015610ab757600080fd5b5061055461219f565b348015610acc57600080fd5b506105a16121a4565b348015610ae157600080fd5b506105ce6121aa565b348015610af657600080fd5b506105f06121c9565b348015610b0b57600080fd5b506105a16121d2565b348015610b2057600080fd5b506105a16121d8565b348015610b3557600080fd5b506105546121de565b348015610b4a57600080fd5b5061057f611e90565b348015610b5f57600080fd5b5061053d610b6e3660046162b6565b6121e7565b348015610b7f57600080fd5b50610554610b8e3660046160f3565b612ce0565b348015610b9f57600080fd5b50610554612cf2565b348015610bb457600080fd5b50610bbd612cff565b6040516105619190616511565b348015610bd657600080fd5b50610554612dea565b348015610beb57600080fd5b50610554612def565b348015610c0057600080fd5b50610554611fb0565b348015610c1557600080fd5b506105a1612df5565b348015610c2a57600080fd5b50610554612dfb565b348015610c3f57600080fd5b506105ce610c4e366004616312565b612e01565b348015610c5f57600080fd5b50610554612e0e565b348015610c7457600080fd5b50610554612e14565b348015610c8957600080fd5b50610554612e53565b348015610c9e57600080fd5b50610554612e5f565b348015610cb357600080fd5b506105a1612e65565b348015610cc857600080fd5b506105a1612e6b565b348015610cdd57600080fd5b50610554610e9f565b348015610cf257600080fd5b5061053d612e71565b348015610d0757600080fd5b50610554613020565b348015610d1c57600080fd5b506105f0610d2b366004616277565b613026565b348015610d3c57600080fd5b5061053d610d4b3660046160f3565b6131ac565b348015610d5c57600080fd5b5061057f6132b4565b348015610d7157600080fd5b506107496132b9565b61053d610d883660046160f3565b6132be565b348015610d9957600080fd5b50610554613674565b348015610dae57600080fd5b506105a161367a565b348015610dc357600080fd5b5061074961219a565b348015610dd857600080fd5b506105a1613680565b348015610ded57600080fd5b50610e01610dfc366004616312565b613686565b6040516105619392919061715f565b348015610e1c57600080fd5b506105a1613748565b6000610e303361203b565b9050600b8181548110610e3f57fe5b600091825260209091206001601690920201015460ff16610e7b5760405162461bcd60e51b8152600401610e7290616db8565b60405180910390fd5b6000610e85612e14565b9050610e94338383600161374e565b505050565b60095481565b606481565b61200181565b60005460609060ff16610ecf5760405162461bcd60e51b8152600401610e7290616727565b3361200014610ef05760405162461bcd60e51b8152600401610e7290616f5f565b600b54610fae57610eff615c9f565b60015460005b81811015610faa57600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff1916911515919091179055604086015180518794610f869360008051602061724f833981519152909101920190615cce565b506060820151610f9c9060038301906013615d48565b505050806001019050610f05565b5050505b60405162461bcd60e51b8152600401610e72906169d6565b60075460ff1681565b600f5481565b334114610ff45760405162461bcd60e51b8152600401610e7290616fae565b3a156110125760405162461bcd60e51b8152600401610e7290616cf7565b825160408051828152602080840282010190915260609082801561105057816020015b61103d615d75565b8152602001906001900390816110355790505b50905060005b828110156110fa576040518060c0016040528087838151811061107557fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020018683815181106110b757fe5b60200260200101516001600160401b0316815260200160001515815260200160008152508282815181106110e757fe5b6020908102919091010152600101611056565b506060806111088386613940565b9150915060005b6001548110156111fe5760006001828154811061112857fe5b9060005260206000209060040201600301549050806000146111f55760006001838154811061115357fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061118757fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526111c2926001600160a01b03909216910161647f565b6000604051808303818588803b1580156111db57600080fd5b505af11580156111ef573d6000803e3d6000fd5b50505050505b5060010161110f565b50471561126c577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516112349190617156565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561126a573d6000803e3d6000fd5b505b60006003819055600555815115611287576112878282613e2a565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112c457600080fd5b505af11580156112d8573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b3361200214610fae5760405162461bcd60e51b8152600401610e7290617110565b33411461135f5760405162461bcd60e51b8152600401610e7290616fae565b60105443116113805760405162461bcd60e51b8152600401610e7290616900565b3a1561139e5760405162461bcd60e51b8152600401610e7290616cf7565b60005460ff166113c05760405162461bcd60e51b8152600401610e7290616727565b60006110023168056bc75e2d631000008111156113f7576113f08168056bc75e2d6310000063ffffffff61461916565b91506113fe565b505061167f565b6040516309a99b4f60e41b815261100290639a99b4f0906114259030908690600401616493565b602060405180830381600087803b15801561143f57600080fd5b505af1158015611453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611477919061632a565b91508161148557505061167f565b6000805b848110156114b35785858281811061149d57fe5b9050602002013582019150806001019050611489565b50806114c15750505061167f565b6000806000805b8981101561167757848989838181106114dd57fe5b905060200201358802816114ed57fe5b0493508a8a828181106114fc57fe5b905060200201602081019061151191906160f3565b6001600160a01b0381166000908152600460205260409020549093509150811561162d57600060018084038154811061154657fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156115b357836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516115a69190617156565b60405180910390a2611627565b6003546115c6908663ffffffff61465b16565b60039081558101546115de908663ffffffff61465b16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b29061161e908890617156565b60405180910390a25b5061166f565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516116669190617156565b60405180910390a25b6001016114c8565b505050505050505b5050436010555050565b600154600090821061169d57506000611753565b60006001600160a01b0316600183815481106116b557fe5b60009182526020909120600490910201546001600160a01b031614806116e5575060085415806116e55750600a54155b806116f4575060085460095410155b80611705575061170382611758565b155b8061172e57506000600b838154811061171a57fe5b906000526020600020906016020160000154115b806117425750600161173e612cff565b5111155b1561174f57506000611753565b5060015b919050565b600154600090821061176c57506000611753565b600b5482106117a9576001828154811061178257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611753565b600182815481106117b657fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156118035750600b82815481106117ea57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b546118c757611818615c9f565b60015460005b818110156118c357600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff191691151591909117905560408601518051879461189f9360008051602061724f833981519152909101920190615cce565b5060608201516118b59060038301906013615d48565b50505080600101905061181e565b5050505b3361100114806118d8575033612002145b6118f45760405162461bcd60e51b8152600401610e729061675e565b6001600160a01b03811660009081526004602052604090205480611918575061196b565b6001810390506000600b828154811061192d57fe5b600091825260209091206001601690920201015460ff1690506119508383614680565b80156119595750805b15610e94576009805460001901905550505b50565b60015460609081906000805b828110156119c1576001818154811061198f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166119b9576001909101905b60010161197a565b506060816040519080825280602002602001820160405280156119ee578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611a2757816020015b6060815260200190600190039081611a125790505b50600b5460009450909150841415611ba25760005b84811015611b9c5760018181548110611a5157fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611b945760018181548110611a8157fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611aac57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b8181548110611ad957fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015611b715780601f10611b4657610100808354040283529160200191611b71565b820191906000526020600020905b815481529060010190602001808311611b5457829003601f168201915b5050505050828581518110611b8257fe5b60209081029190910101526001909301925b600101611a3c565b50611c3e565b60005b84811015611c3c5760018181548110611bba57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611c345760018181548110611bea57fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611c1557fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611ba5565b505b909450925050505b9091565b600181565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c5411611c81576015611c85565b600c545b90506060611c91612cff565b90506060611c9e82614a43565b905082825111611cb5579094509250611c46915050565b83838351031015611cc7578282510393505b8315611cfd5760c84304611ce383838388880360008a8a614bb1565b611cfb8383838888038989038a8b8b8b510301614bb1565b505b606083604051908082528060200260200182016040528015611d29578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611d6257816020015b6060815260200190600190039081611d4d5790505b50905060005b85811015611de357848181518110611d7c57fe5b6020026020010151838281518110611d9057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611dbc57fe5b6020026020010151828281518110611dd057fe5b6020908102919091010152600101611d68565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611e2b576000915050611753565b60001901611e3881611758565b9392505050565b6001600160a01b03811660009081526004602052604081205480611e67576000915050611753565b600180820381548110611e7657fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611ea757fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611f385780601f10611f0d57610100808354040283529160200191611f38565b820191906000526020600020905b815481529060010190602001808311611f1b57829003601f168201915b505050505081565b60105481565b60018181548110611f5357fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b3361200014610fae5760405162461bcd60e51b8152600401610e7290616f5f565b60025481565b60115481565b60145460ff1681565b600a5481565b60006017546000141561203357506001612038565b506017545b90565b6001600160a01b038116600090815260046020526040812054806120715760405162461bcd60e51b8152600401610e7290616ee7565b6000190192915050565b600b546121395761208a615c9f565b60015460005b8181101561213557600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff19169115159190911790556040860151805187946121119360008051602061724f833981519152909101920190615cce565b5060608201516121279060038301906013615d48565b505050806001019050612090565b5050505b6008546121465760036008555b600a54612153576002600a555b600061215e3361203b565b905061216981611689565b6121855760405162461bcd60e51b8152600401610e7290616c73565b61196b3382614d08565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef815260200161726f6105ef913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166122095760405162461bcd60e51b8152600401610e7290616727565b336110071461222a5760405162461bcd60e51b8152600401610e7290616d25565b61229484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150614da09050565b1561233157602081146122b95760405162461bcd60e51b8152600401610e7290616ea1565b604080516020601f84018190048102820181019092528281526000916122f791858580838501838280828437600092019190915250614df992505050565b90506064811015801561230d5750620186a08111155b6123295760405162461bcd60e51b8152600401610e7290616ad4565b600255612c9d565b61239184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614da09050565b1561244657602081146123b65760405162461bcd60e51b8152600401610e72906165e4565b604080516020601f84018190048102820181019092528281526000916123f491858580838501838280828437600092019190915250614df992505050565b9050612710612420601854612414600f548561465b90919063ffffffff16565b9063ffffffff61465b16565b111561243e5760405162461bcd60e51b8152600401610e72906169fa565b600655612c9d565b6124b084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614da09050565b1561254a57602081146124d55760405162461bcd60e51b8152600401610e729061661b565b604080516020601f840181900481028201810190925282815260009161251391858580838501838280828437600092019190915250614df992505050565b600c5490915080612522575060155b8082106125415760405162461bcd60e51b8152600401610e7290616942565b50600855612c9d565b6125b384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614da09050565b1561264c57602081146125d85760405162461bcd60e51b8152600401610e72906166ad565b604080516020601f840181900481028201810190925282815260009161261691858580838501838280828437600092019190915250614df992505050565b90506000811180156126285750600a81105b6126445760405162461bcd60e51b8152600401610e7290617043565b600a55612c9d565b6126c084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614da09050565b1561274f57602081146126e55760405162461bcd60e51b8152600401610e7290616661565b604080516020601f840181900481028201810190925282815260009161272391858580838501838280828437600092019190915250614df992505050565b9050600d548111156127475760405162461bcd60e51b8152600401610e7290616b4a565b600e55612c9d565b6127b884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614da09050565b1561283a57602081146127dd5760405162461bcd60e51b8152600401610e7290616d73565b604080516020601f840181900481028201810190925282815260009161281b91858580838501838280828437600092019190915250614df992505050565b600d819055600e5490915081101561283457600d54600e555b50612c9d565b61289e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614da09050565b1561294c57602081146128c35760405162461bcd60e51b8152600401610e72906166f2565b604080516020601f840181900481028201810190925282815260009161290191858580838501838280828437600092019190915250614df992505050565b9050600081116129235760405162461bcd60e51b8152600401610e729061685b565b60648111156129445760405162461bcd60e51b8152600401610e72906168a3565b600c55612c9d565b6129b884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614da09050565b15612a6157602081146129dd5760405162461bcd60e51b8152600401610e7290616ffb565b604080516020601f8401819004810282018101909252828152600091612a1b91858580838501838280828437600092019190915250614df992505050565b9050612710612a3b6018546124146006548561465b90919063ffffffff16565b1115612a595760405162461bcd60e51b8152600401610e72906167cc565b600f55612c9d565b612ad584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614da09050565b15612b7e5760208114612afa5760405162461bcd60e51b8152600401610e7290616a89565b604080516020601f8401819004810282018101909252828152600091612b3891858580838501838280828437600092019190915250614df992505050565b9050612710612b58600f546124146006548561465b90919063ffffffff16565b1115612b765760405162461bcd60e51b8152600401610e7290616be4565b601855612c9d565b612bdf84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614da09050565b15612c855760208114612c045760405162461bcd60e51b8152600401610e729061699f565b604080516020601f8401819004810282018101909252828152600091612c4291858580838501838280828437600092019190915250614df992505050565b905060038110158015612c56575060098111155b80612c615750806001145b612c7d5760405162461bcd60e51b8152600401610e7290616e1b565b601755612c9d565b60405162461bcd60e51b8152600401610e72906170a0565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051612cd294939291906165b2565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612d2e57612d1a81611758565b15612d26578160010191505b600101612d09565b50606081604051908082528060200260200182016040528015612d5b578160200160208202803683370190505b5090506000915060005b83811015612de257612d7681611758565b15612dda5760018181548110612d8857fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612db357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612d65565b509250505090565b601581565b61027181565b61100281565b60175481565b60138181548110611ea757fe5b60185481565b6000612e1e612cff565b519050600080600c5411612e33576015612e37565b600c545b905080821115612e45578091505b81612e4f57600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff1615612e945760405162461bcd60e51b8152600401610e7290616de4565b612e9c615daa565b6000612ec26040518061062001604052806105ef815260200161726f6105ef9139614dfe565b9150915080612ee35760405162461bcd60e51b8152600401610e7290616f1e565b60005b82602001515181101561300857600183602001518281518110612f0557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612fdb57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612ee6565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b8181101561312f5761311785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060138054909250859150811061307f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561310d5780601f106130e25761010080835404028352916020019161310d565b820191906000526020600020905b8154815290600101906020018083116130f057829003601f168201915b5050505050614fba565b1561312757600192505050611803565b60010161302e565b5060125460005b818110156131a05761318786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060128054909250859150811061307f57fe5b156131985760019350505050611803565b600101613136565b50600095945050505050565b33611001146131cd5760405162461bcd60e51b8152600401610e72906170c7565b600b5461328b576131dc615c9f565b60015460005b8181101561328757600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff19169115159190911790556040860151805187946132639360008051602061724f833981519152909101920190615cce565b5060608201516132799060038301906013615d48565b5050508060010190506131e2565b5050505b60006132968261501e565b90506132a181611689565b156132b0576132b08282614d08565b5050565b606581565b601181565b3341146132dd5760405162461bcd60e51b8152600401610e7290616fae565b60005460ff166132ff5760405162461bcd60e51b8152600401610e7290616727565b6000341161331f5760405162461bcd60e51b8152600401610e7290616b1b565b3a1561333d5760405162461bcd60e51b8152600401610e7290616cf7565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661337d57610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561339457506000601854115b156133b95760016017540360175443816133aa57fe5b0660185402816133b657fe5b04015b6000831180156133c95750600081115b156134765760006133f26127106133e6348563ffffffff6151a116565b9063ffffffff6151db16565b90508015613474576040516110029082156108fc029083906000818181858888f19350505050158015613429573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516134599190617156565b60405180910390a1613471848263ffffffff61461916565b93505b505b60008311801561348857506000600654115b1561352e5760006134aa6127106133e6600654346151a190919063ffffffff16565b9050801561352c5760405161dead9082156108fc029083906000818181858888f193505050501580156134e1573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516135119190617156565b60405180910390a1613529848263ffffffff61461916565b93505b505b811561362c57600060018084038154811061354557fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156135b257846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4856040516135a59190617156565b60405180910390a2613626565b6003546135c5908563ffffffff61465b16565b60039081558101546135dd908563ffffffff61465b16565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc0559061361d908790617156565b60405180910390a25b5061366e565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516136659190617156565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061369357fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff9091169491929183018282801561373e5780601f106137135761010080835404028352916020019161373e565b820191906000526020600020905b81548152906001019060200180831161372157829003601f168201915b5050505050905083565b61100481565b6000600a546000148061375f575082155b8061376a5750600954155b1561377757506000613938565b600960008154600190039190508190555060006137c2600a546133e6866133e6600b8a815481106137a457fe5b6000918252602090912060169091020154439063ffffffff61461916565b90506000600b86815481106137d357fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b15801561383857600080fd5b505afa15801561384c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138709190616342565b91509150600093508083106138ee576138898888614680565b506040516328aa02b160e01b8152611001906328aa02b1906138b3908b9087908a906004016164ee565b600060405180830381600087803b1580156138cd57600080fd5b505af11580156138e1573d6000803e3d6000fd5b5050505060019350613900565b818310613900576138fe8861501e565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b606080600080808080613951612e14565b6001549091505b8015613b8357600181039250600b838154811061397157fe5b600091825260209091206001601690920201015460ff1661399157613b7a565b6001838154811061399e57fe5b600091825260208220600490910201546001600160a01b031695506139c89086908590859061374e565b9350836139d457613b7a565b60405163436aa28360e11b81526000908190612002906386d54506906139fe908a9060040161647f565b60206040518083038186803b158015613a1657600080fd5b505afa158015613a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4e919061610f565b90506001600160a01b03811615613ad7576040516302ceee9160e11b81526120029063059ddd2290613a8490849060040161647f565b60206040518083038186803b158015613a9c57600080fd5b505afa158015613ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad4919061610f565b91505b60005b8c51811015613b7657876001600160a01b03168d8281518110613af957fe5b6020026020010151600001516001600160a01b03161480613b425750826001600160a01b03168d8281518110613b2b57fe5b6020026020010151600001516001600160a01b0316145b15613b6e5760018d8281518110613b5557fe5b6020908102919091010151901515608090910152613b76565b600101613ada565b5050505b60001901613958565b5060005b8951811015613bf057898181518110613b9c57fe5b60200260200101516080015180613bdc575060006001600160a01b03168a8281518110613bc557fe5b6020026020010151600001516001600160a01b0316145b15613be8578560010195505b600101613b87565b5088518510613cd85760408051600180825281830190925290816020015b613c16615d75565b815260200190600190039081613c0e575050604080516001808252818301909252919850602082015b6060815260200190600190039081613c3f57905050955088600081518110613c6357fe5b602002602001015187600081518110613c7857fe5b602002602001018190525087600081518110613c9057fe5b602002602001015186600081518110613ca557fe5b6020026020010181905250600087600081518110613cbf57fe5b6020908102919091010151901515608090910152613e1d565b84895103604051908082528060200260200182016040528015613d1557816020015b613d02615d75565b815260200190600190039081613cfa5790505b50965084895103604051908082528060200260200182016040528015613d4f57816020015b6060815260200190600190039081613d3a5790505b5095506000915060005b8951811015613e1b57898181518110613d6e57fe5b602002602001015160800151158015613db1575060006001600160a01b03168a8281518110613d9957fe5b6020026020010151600001516001600160a01b031614155b15613e1357898181518110613dc257fe5b6020026020010151888481518110613dd657fe5b6020026020010181905250888181518110613ded57fe5b6020026020010151878481518110613e0157fe5b60200260200101819052508260010192505b600101613d59565b505b50505050505b9250929050565b600154825160005b82811015613f47576001613e44615d75565b60018381548110613e5157fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613f1b57878181518110613ee157fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613f135760009250613f1b565b600101613ecd565b508115613f3d5780516001600160a01b03166000908152600460205260408120555b5050600101613e32565b508082111561400657805b82811015614004576001805480613f6557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613fb857fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613fea6002830182615dce565b613ff8600383016000615e12565b50509055600101613f52565b505b60008183106140155781614017565b825b905060005b818110156143bb576140c986828151811061403357fe5b60200260200101516001838154811061404857fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a082015261521d565b61427d5780600101600460008884815181106140e157fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061411d57fe5b60200260200101516001828154811061413257fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106141ed57fe5b6020026020010151600b828154811061420257fe5b90600052602060002090601602016002019080519060200190614226929190615cce565b506000600b828154811061423657fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061426757fe5b60009182526020909120601690910201556143b3565b85818151811061428957fe5b602002602001015160600151600182815481106142a257fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b031602179055506143688582815181106142e657fe5b6020026020010151600b83815481106142fb57fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561310d5780601f106130e25761010080835404028352916020019161310d565b6143b35784818151811061437857fe5b6020026020010151600b828154811061438d57fe5b906000526020600020906016020160020190805190602001906143b1929190615cce565b505b60010161401c565b5082821115614593576143cc615c9f565b835b83811015614590578581815181106143e257fe5b60200260200101518260400181905250600187828151811061440057fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b805492830181559093528451601690910260008051602061722f83398151915281019182558583015160008051602061785e8339815191528201805491151560ff19909216919091179055928501518051869492936145369360008051602061724f83398151915201920190615cce565b50606082015161454c9060038301906013615d48565b505050806001016004600089848151811061456357fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016143ce565b50505b61459b615279565b6145a361545b565b6000600981905560015493505b83811015614611576000600b82815481106145c757fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106145f857fe5b60009182526020909120601690910201556001016145b0565b505050505050565b6000611e3883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615649565b600082820183811015611e385760405162461bcd60e51b8152600401610e7290616795565b6000806001838154811061469057fe5b906000526020600020906004020160030154905060006001808054905003905060016146ba612cff565b51116146ef576000600185815481106146cf57fe5b906000526020600020906004020160030181905550600092505050611803565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516147289190617156565b60405180910390a26001600160a01b038516600090815260046020526040812055835b60015460001901811015614915576001816001018154811061476957fe5b90600052602060002090600402016001828154811061478457fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061484557fe5b9060005260206000209060160201600b828154811061486057fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff19909216919091179055600280840180546148b7938386019390821615610100026000190190911604615e21565b506148ca60038281019084016013615e96565b509050508060010160046000600184815481106148e357fe5b600091825260208083206004909202909101546001600160a01b0316835282019290925260400190205560010161474b565b50600180548061492157fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061497457fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906149a66002830182615dce565b6149b4600383016000615e12565b5050905560008183816149c357fe5b0490508015614a375760015460005b81811015614a3457614a0b83600183815481106149eb57fe5b90600052602060002090600402016003015461465b90919063ffffffff16565b60018281548110614a1857fe5b60009182526020909120600360049092020101556001016149d2565b50505b50600195945050505050565b600154815160408051828152602080840282010190915260609291908390828015614a8257816020015b6060815260200190600190039081614a6d5790505b50600b549091508314614a99579250611753915050565b60005b82811015614ba857600b600160046000898581518110614ab857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020540381548110614aec57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015614b845780601f10614b5957610100808354040283529160200191614b84565b820191906000526020600020905b815481529060010190602001808311614b6757829003601f168201915b5050505050828281518110614b9557fe5b6020908102919091010152600101614a9c565b50949350505050565b60005b82811015614cfe5760008287838801604051602001614bd4929190616471565b6040516020818303038152906040528051906020012060001c81614bf457fe5b06905080850182870114614cf55760008983880181518110614c1257fe5b6020026020010151905060608984890181518110614c2c57fe5b602002602001015190508a83880181518110614c4457fe5b60200260200101518b858a0181518110614c5a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b84890181518110614c8957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508983880181518110614cb757fe5b60200260200101518a858a0181518110614ccd57fe5b6020026020010181905250808a84890181518110614ce757fe5b602002602001018190525050505b50600101614bb4565b5050505050505050565b600980546001908101909155600b805483908110614d2257fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b8281548110614d5857fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614db39190616455565b6040516020818303038152906040528051906020012083604051602001614dda9190616455565b6040516020818303038152906040528051906020012014905092915050565b015190565b614e06615daa565b6000614e10615daa565b614e18615ec0565b614e29614e2486615675565b61569a565b90506000805b614e38836156e4565b15614fac5780614e5d57614e53614e4e84615705565b615753565b60ff168452614fa4565b8060011415614f9f576060614e79614e7485615705565b6157d3565b90508051604051908082528060200260200182016040528015614eb657816020015b614ea3615d75565b815260200190600190039081614e9b5790505b5085602001819052508051604051908082528060200260200182016040528015614ef457816020015b6060815260200190600190039081614edf5790505b50604086015260005b8151811015614f9457614f0e615d75565b60606000614f2e858581518110614f2157fe5b60200260200101516158a4565b92509250925080614f4e578860009a509a50505050505050505050614fb5565b8289602001518581518110614f5f57fe5b60200260200101819052508189604001518581518110614f7b57fe5b6020026020010181905250505050806001019050614efd565b506001925050614fa4565b614fac565b600101614e2f565b50919350909150505b915091565b815181516000916001918114808314614fd65760009250615014565b600160208701838101602088015b60028483851001141561500f5780518351146150035760009650600093505b60209283019201614fe4565b505050505b5090949350505050565b6001600160a01b0381166000908152600460205260408120548061504757506000199050611753565b60018103905060006001828154811061505c57fe5b906000526020600020906004020160030154905060006001838154811061507f57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d906150d8908590617156565b60405180910390a2806150f057829350505050611753565b60008183816150fb57fe5b04905080156151975760005b848110156151495761512082600183815481106149eb57fe5b6001828154811061512d57fe5b6000918252602090912060036004909202010155600101615107565b50600180549085015b818110156151945761516b83600183815481106149eb57fe5b6001828154811061517857fe5b6000918252602090912060036004909202010155600101615152565b50505b5091949350505050565b6000826151b057506000611803565b828202828482816151bd57fe5b0414611e385760405162461bcd60e51b8152600401610e7290616cb6565b6000611e3883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506159be565b805182516000916001600160a01b039182169116148015615257575081602001516001600160a01b031683602001516001600160a01b0316145b8015611e385750506040908101519101516001600160a01b0390811691161490565b601254601354808211156152c457805b828110156152c257601280548061529c57fe5b6001900381819060005260206000200160006152b89190615dce565b9055600101615289565b505b60008183106152d357816152d5565b825b905060005b818110156153ed57615392601282815481106152f257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156153805780601f1061535557610100808354040283529160200191615380565b820191906000526020600020905b81548152906001019060200180831161536357829003601f168201915b50505050506013838154811061307f57fe5b6153e557601381815481106153a357fe5b90600052602060002001601282815481106153ba57fe5b9060005260206000200190805460018160011615610100020316600290046153e3929190615e21565b505b6001016152da565b5082821115610e9457825b8281101561366e5760126013828154811061540f57fe5b6000918252602080832084546001818101875595855291909320929091018054615452949390920192909160026101009282161592909202600019011604615e21565b506001016153f8565b601354600b54808211156154a657805b828110156154a457601380548061547e57fe5b60019003818190600052602060002001600061549a9190615dce565b905560010161546b565b505b60008183106154b557816154b7565b825b905060005b818110156155d657615574601382815481106154d457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156155625780601f1061553757610100808354040283529160200191615562565b820191906000526020600020905b81548152906001019060200180831161554557829003601f168201915b5050505050600b83815481106142fb57fe5b6155ce57600b818154811061558557fe5b9060005260206000209060160201600201601382815481106155a357fe5b9060005260206000200190805460018160011615610100020316600290046155cc929190615e21565b505b6001016154bc565b5082821115610e9457825b8281101561366e576013600b82815481106155f857fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461564095939094019390926000199082161561010002011604615e21565b506001016155e1565b6000818484111561566d5760405162461bcd60e51b8152600401610e72919061659f565b505050900390565b61567d615ee0565b506040805180820190915281518152602082810190820152919050565b6156a2615ec0565b6156ab826159f5565b6156b457600080fd5b60006156c38360200151615a2f565b60208085015160408051808201909152868152920190820152915050919050565b60006156ee615ee0565b505080518051602091820151919092015191011190565b61570d615ee0565b615716826156e4565b61571f57600080fd5b6020820151600061572f82615a92565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061576857508151602110155b61577157600080fd5b60006157808360200151615a2f565b905080836000015110156157a65760405162461bcd60e51b8152600401610e7290616e6a565b825160208085015183018051928490039291831015614ba857506020919091036101000a90049392505050565b60606157de826159f5565b6157e757600080fd5b60006157f283615b73565b905060608160405190808252806020026020018201604052801561583057816020015b61581d615ee0565b8152602001906001900390816158155790505b50905060006158428560200151615a2f565b60208601510190506000805b848110156158995761585f83615a92565b915060405180604001604052808381526020018481525084828151811061588257fe5b60209081029190910101529181019160010161584e565b509195945050505050565b6158ac615d75565b606060006158b8615d75565b60606158c2615ec0565b6158cb8761569a565b90506000805b6158da836156e4565b156159af5780615905576158f56158f084615705565b615bcf565b6001600160a01b031685526159a7565b806001141561592d5761591a6158f084615705565b6001600160a01b031660208601526159a7565b8060021415615955576159426158f084615705565b6001600160a01b031660408601526159a7565b80600314156159815761596a614e4e84615705565b6001600160401b03166060860152600191506159a7565b80600414156159a25761599b61599684615705565b615be9565b93506159a7565b6159af565b6001016158d1565b50929791965091945092505050565b600081836159df5760405162461bcd60e51b8152600401610e72919061659f565b5060008385816159eb57fe5b0495945050505050565b8051600090615a0657506000611753565b6020820151805160001a9060c0821015615a2557600092505050611753565b5060019392505050565b8051600090811a6080811015615a49576000915050611753565b60b8811080615a64575060c08110801590615a64575060f881105b15615a73576001915050611753565b60c0811015615a875760b519019050611753565b60f519019050611753565b80516000908190811a6080811015615aad5760019150615b6c565b60b8811015615ac257607e1981019150615b6c565b60c0811015615b1357600060b78203600186019550806020036101000a865104915060018101820193505080831015615b0d5760405162461bcd60e51b8152600401610e7290616bb9565b50615b6c565b60f8811015615b285760be1981019150615b6c565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615b6a5760405162461bcd60e51b8152600401610e7290616bb9565b505b5092915050565b8051600090615b8457506000611753565b60008090506000615b988460200151615a2f565b602085015185519181019250015b80821015615bc657615bb782615a92565b82019150826001019250615ba6565b50909392505050565b8051600090601514615be057600080fd5b61180382615753565b8051606090615bf757600080fd5b6000615c068360200151615a2f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615c3d576020820181803683370190505b5090506000816020019050614ba884876020015101828580615c5e57610e94565b5b60208110615c7e578251825260209283019290910190601f1901615c5f565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615cc9615efa565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615d0f57805160ff1916838001178555615d3c565b82800160010185558215615d3c579182015b82811115615d3c578251825591602001919060010190615d21565b50612e4f929150615f19565b8260138101928215615d3c5791602002820182811115615d3c578251825591602001919060010190615d21565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615df4575061196b565b601f01602090049060005260206000209081019061196b9190615f19565b5061196b906013810190615f19565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615e5a5780548555615d3c565b82800160010185558215615d3c57600052602060002091601f016020900482015b82811115615d3c578254825591600101919060010190615e7b565b8260138101928215615d3c5791820182811115615d3c578254825591600101919060010190615e7b565b6040518060400160405280615ed3615ee0565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61203891905b80821115612e4f5760008155600101615f1f565b803561180381617219565b60008083601f840112615f4f578182fd5b5081356001600160401b03811115615f65578182fd5b6020830191508360208083028501011115613e2357600080fd5b6000601f8381840112615f90578182fd5b8235615fa3615f9e826171ce565b6171a8565b818152925060208084019085810160005b84811015616035578135880189603f820112615fcf57600080fd5b838101356001600160401b03811115615fe757600080fd5b615ff8818901601f191686016171a8565b81815260408c8184860101111561600e57600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615fb4565b50505050505092915050565b600082601f830112616051578081fd5b813561605f615f9e826171ce565b81815291506020808301908481018184028601820187101561608057600080fd5b6000805b858110156160355782356001600160401b03811681146160a2578283fd5b85529383019391830191600101616084565b60008083601f8401126160c5578182fd5b5081356001600160401b038111156160db578182fd5b602083019150836020828501011115613e2357600080fd5b600060208284031215616104578081fd5b8135611e3881617219565b600060208284031215616120578081fd5b8151611e3881617219565b60008060008060408587031215616140578283fd5b84356001600160401b0380821115616156578485fd5b61616288838901615f3e565b9096509450602087013591508082111561617a578384fd5b5061618787828801615f3e565b95989497509550505050565b6000806000606084860312156161a7578283fd5b83356001600160401b03808211156161bd578485fd5b81860187601f8201126161ce578586fd5b803592506161de615f9e846171ce565b80848252602080830192508084018b8283890287010111156161fe57898afd5b8994505b86851015616228576162148c82615f33565b845260019490940193928101928101616202565b50909750880135935050508082111561623f578384fd5b61624b87838801616041565b93506040860135915080821115616260578283fd5b5061626d86828701615f7f565b9150509250925092565b60008060208385031215616289578182fd5b82356001600160401b0381111561629e578283fd5b6162aa858286016160b4565b90969095509350505050565b600080600080604085870312156162cb578384fd5b84356001600160401b03808211156162e1578586fd5b6162ed888389016160b4565b90965094506020870135915080821115616305578384fd5b50616187878288016160b4565b600060208284031215616323578081fd5b5035919050565b60006020828403121561633b578081fd5b5051919050565b60008060408385031215616354578182fd5b505080516020909101519092909150565b600080600060408486031215616379578081fd5b833560ff81168114616389578182fd5b925060208401356001600160401b038111156163a3578182fd5b6163af868287016160b4565b9497909650939450505050565b6000815180845260208085019450808401835b838110156163f45781516001600160a01b0316875295820195908201906001016163cf565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526164418160208601602086016171ed565b601f01601f19169290920160200192915050565b600082516164678184602087016171ed565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611e3860208301846163bc565b60006040825261653760408301856163bc565b602083820381850152818551808452828401915082838202850101838801865b8381101561658557601f19878403018552616573838351616429565b94860194925090850190600101616557565b50909998505050505050505050565b901515815260200190565b600060208252611e386020830184616429565b6000604082526165c66040830186886163ff565b82810360208401526165d98185876163ff565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008482528315156020830152606060408301526171806060830184616429565b95945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b03811182821017156171c657600080fd5b604052919050565b60006001600160401b038211156171e3578081fd5b5060209081020190565b60005b838110156172085781810151838201526020016171f0565b8381111561366e5750506000910152565b6001600160a01b038116811461196b57600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001001": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061035d5760003560e01c80637942fd05116101d3578063c80d4b8f11610104578063df8079e9116100a2578063f9a2bbc71161007c578063f9a2bbc714610601578063fc3e590814610609578063fc4333cd14610611578063fd6a6879146106195761035d565b8063df8079e9146105e9578063e1c7392a146105f1578063f1fad104146105f95761035d565b8063c96be4cb116100de578063c96be4cb146105b3578063cc844b73146105c6578063dc927faf146105d9578063dcc6f156146105e15761035d565b8063c80d4b8f14610590578063c81b166214610598578063c8509d81146105a05761035d565b8063a1a11bf511610171578063aad560631161014b578063aad5606314610565578063ab51bb961461056d578063ac0af62914610575578063ac4317511461057d5761035d565b8063a1a11bf51461054d578063a78abc1614610555578063aa82dce11461055d5761035d565b8063831d65d1116101ad578063831d65d11461052257806396713da9146105355780639dc092621461053d5780639f804f5f146105455761035d565b80637942fd051461050a5780637e434d54146105125780638256ace61461051a5761035d565b806343756e5c116102ad5780635bfb49901161024b57806370fd5bad1161022557806370fd5bad146104ea578063718a8aa8146104f257806375d47a0a146104fa5780637912a65d146105025761035d565b80635bfb4990146104c757806362b72cf5146104da5780636e47b482146104e25761035d565b806350055f901161028757806350055f90146104a757806351b4dce3146104af57806351e80672146104b7578063567a372d146104bf5761035d565b806343756e5c14610482578063493279b11461048a5780634bf6c8821461049f5761035d565b8063280870281161031a57806335aa2e44116102f457806335aa2e441461043157806337c8dab914610444578063389f4f71146104655780633dffc3871461046d5761035d565b8063280870281461040157806328aa02b1146104095780633306ccca1461041c5761035d565b80630bee7a67146103625780630e2374a5146103805780631182b8751461039557806322d1e80b146103b557806323bac5a2146103ca57806327962118146103ec575b600080fd5b61036a610621565b6040516103779190613d96565b60405180910390f35b610388610626565b6040516103779190613574565b6103a86103a33660046134aa565b61062c565b60405161037791906135ac565b6103bd610692565b60405161037791906135a1565b6103dd6103d83660046131af565b61069b565b60405161037793929190613d7e565b6103ff6103fa366004613307565b6106be565b005b610388610a13565b6103ff6104173660046131e7565b610a19565b610424610a4a565b6040516103779190613d67565b61038861043f36600461347a565b610a50565b6104576104523660046131af565b610a77565b604051610377929190613d70565b610424610ace565b610475610ad4565b6040516103779190613da7565b610388610ad9565b610492610adf565b6040516103779190613d58565b610475610ae4565b610424610ae9565b610388610aef565b610388610af5565b610424610afb565b6103ff6104d53660046131af565b610b01565b610424610c0d565b610388610c13565b610475610c19565b610475610c1e565b610388610c23565b610424610c29565b610475610c2e565b610388610c33565b610457610c39565b6103ff6105303660046134aa565b610c43565b610475610d56565b610388610d5b565b610424610d61565b610388610d67565b6103bd610d6d565b610388610d76565b610388610d7c565b61036a610d82565b610424610d87565b6103ff61058b36600461335e565b610d8c565b610424611328565b61038861132d565b6103ff6105ae3660046134aa565b611333565b6103ff6105c13660046131af565b6113a4565b6103ff6105d43660046133c7565b611815565b610388611df4565b610424611dfa565b610388611dff565b6103ff611e05565b610475611e41565b610388611e46565b610475611e4c565b6103ff611e51565b61038861229a565b606481565b61200181565b606033612000146106585760405162461bcd60e51b815260040161064f90613bfb565b60405180910390fd5b60005460ff1661067a5760405162461bcd60e51b815260040161064f906136a1565b60405162461bcd60e51b815260040161064f90613cec565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166106e05760405162461bcd60e51b815260040161064f906136a1565b6006546106ed5760146006555b6008546106fb576170806008555b81511580159061070b5750805115155b6107275760405162461bcd60e51b815260040161064f90613b59565b60408051600380825260808201909252606091816020015b606081526020019060019003908161073f57905050905061076060386122a0565b8160008151811061076d57fe5b6020026020010181905250610781836122bb565b8160018151811061078e57fe5b60200260200101819052506107a2826122bb565b816002815181106107af57fe5b602002602001018190525060606107c582612311565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa61080657600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d5450690610839908690600401613574565b60206040518083038186803b15801561085157600080fd5b505afa158015610865573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088991906131cb565b6001600160a01b031614156108b05760405162461bcd60e51b815260040161064f90613671565b43600854820110156108d45760405162461bcd60e51b815260040161064f90613612565b604051631871f7d960e31b81526120029063c38fbec8906108f9908590600401613574565b600060405180830381600087803b15801561091357600080fd5b505af1158015610927573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f9150610950908590600401613574565b600060405180830381600087803b15801561096a57600080fd5b505af115801561097e573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906109b69033908590600401613588565b602060405180830381600087803b1580156109d057600080fd5b505af11580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190613492565b505050505050505050565b61200581565b3361100014610a3a5760405162461bcd60e51b815260040161064f906138e4565b610a458383836123a2565b505050565b61708081565b60018181548110610a5d57fe5b6000918252602090912001546001600160a01b0316905081565b600080610a82612f96565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b603881565b600881565b60065481565b61200681565b61200081565b60045481565b3361100014610b225760405162461bcd60e51b815260040161064f906138e4565b60005460ff16610b445760405162461bcd60e51b815260040161064f906136a1565b61200063f7a251d7600b610b5784612580565b60006040518463ffffffff1660e01b8152600401610b7793929190613db5565b600060405180830381600087803b158015610b9157600080fd5b505af1925050508015610ba2575060015b610c0a573d808015610bd0576040519150601f19603f3d011682016040523d82523d6000602084013e610bd5565b606091505b50816001600160a01b0316600080516020613ea0833981519152600083604051610c009291906135bf565b60405180910390a2505b50565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b61200381565b6004546005549091565b3361200014610c645760405162461bcd60e51b815260040161064f90613bfb565b60005460ff16610c865760405162461bcd60e51b815260040161064f906136a1565b610c8e612fb9565b6000610ccf84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061264992505050565b915091508015610d165781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e62996791610d0991613d96565b60405180910390a1610d4f565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e791610d4691613d96565b60405180910390a15b5050505050565b600981565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610dae5760405162461bcd60e51b815260040161064f906136a1565b3361100714610dcf5760405162461bcd60e51b815260040161064f90613a48565b610e3a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506126c99050565b15610ed55760208114610e5f5760405162461bcd60e51b815260040161064f90613870565b604080516020601f8401819004810282018101909252828152600091610e9d9185858083850183828082843760009201919091525061272392505050565b905060018110158015610eb1575060055481105b610ecd5760405162461bcd60e51b815260040161064f90613bb6565b6004556112e5565b610f3b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506126c99050565b15610fd75760208114610f605760405162461bcd60e51b815260040161064f90613a96565b604080516020601f8401819004810282018101909252828152600091610f9e9185858083850183828082843760009201919091525061272392505050565b90506103e88111158015610fb3575060045481115b610fcf5760405162461bcd60e51b815260040161064f9061375a565b6005556112e5565b61104484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b602082015291506126c99050565b156110de57602081146110695760405162461bcd60e51b815260040161064f906139d0565b604080516020601f84018190048102820181019092528281526000916110a79185858083850183828082843760009201919091525061272392505050565b9050600a81101580156110ba5750606481105b6110d65760405162461bcd60e51b815260040161064f90613ad8565b6006556112e5565b61115284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c6173680000000000000000602082015291506126c99050565b156111c957602081146111775760405162461bcd60e51b815260040161064f9061378f565b604080516020601f84018190048102820181019092528281526111b3919084848083850183828082843760009201919091525061272892505050565b6007805460ff19169115159190911790556112e5565b61123084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b602082015291506126c99050565b156112cd57602081146112555760405162461bcd60e51b815260040161064f9061395f565b604080516020601f84018190048102820181019092528281526000916112939185858083850183828082843760009201919091525061272392505050565b905061708081101580156112a95750620d2f0081105b6112c55760405162461bcd60e51b815260040161064f906136d8565b6008556112e5565b60405162461bcd60e51b815260040161064f90613c97565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161131a94939291906135e0565b60405180910390a150505050565b609681565b61100281565b33612000146113545760405162461bcd60e51b815260040161064f90613bfb565b60005460ff166113765760405162461bcd60e51b815260040161064f906136a1565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b3341146113c35760405162461bcd60e51b815260040161064f90613c4a565b60005460ff166113e55760405162461bcd60e51b815260040161064f906136a1565b60035443116114065760405162461bcd60e51b815260040161064f90613d23565b3a156114245760405162461bcd60e51b815260040161064f906139a2565b60405163155853f360e21b8152611000906355614fcc90611449908490600401613574565b60206040518083038186803b15801561146157600080fd5b505afa158015611475573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149991906132eb565b6114a25761180e565b6114aa612f96565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061150557602081018051600101905261155e565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161157057fe5b0661173c57600060208201526040516335409f7f60e01b8152611000906335409f7f906115a1908590600401613574565b600060405180830381600087803b1580156115bb57600080fd5b505af11580156115cf573d6000803e3d6000fd5b505060405163436aa28360e11b81526000925061200291506386d54506906115fb908690600401613574565b60206040518083038186803b15801561161357600080fd5b505afa158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b91906131cb565b6001600160a01b03161461166e5761166982826020015160006123a2565b611737565b61200063f7a251d7600b61168185612580565b60006040518463ffffffff1660e01b81526004016116a193929190613db5565b600060405180830381600087803b1580156116bb57600080fd5b505af19250505080156116cc575060015b611737573d8080156116fa576040519150601f19603f3d011682016040523d82523d6000602084013e6116ff565b606091505b50826001600160a01b0316600080516020613ea083398151915283602001518360405161172d9291906135bf565b60405180910390a2505b6117a8565b60045481602001518161174b57fe5b066117a8576040516375abf10160e11b81526110009063eb57e20290611775908590600401613574565b600060405180830381600087803b15801561178f57600080fd5b505af11580156117a3573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166118375760405162461bcd60e51b815260040161064f906136a1565b60075460ff166118595760405162461bcd60e51b815260040161064f9061363c565b6006546118665760146006555b600854611874576170806008555b60085481516040015143910111801561189857504360085482602001516040015101115b6118b45760405162461bcd60e51b815260040161064f90613cbe565b8060200151602001518160000151602001511480156118e25750806020015160600151816000015160600151145b156118ff5760405162461bcd60e51b815260040161064f906138b7565b80516040810151905110801561191e5750602081015160408101519051105b61193a5760405162461bcd60e51b815260040161064f90613839565b60208101515181515110801561195f5750806000015160400151816020015160400151105b8061198a575080515160208201515110801561198a5750806020015160400151816000015160400151105b806119a45750806020015160400151816000015160400151145b6119c05760405162461bcd60e51b815260040161064f90613723565b604080820151905163ea321e4960e01b81526110009163ea321e49916119e991906004016135ac565b60206040518083038186803b158015611a0157600080fd5b505afa158015611a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3991906132eb565b611a555760405162461bcd60e51b815260040161064f90613a19565b611a6781600001518260400151612750565b8015611a805750611a8081602001518260400151612750565b611a9c5760405162461bcd60e51b815260040161064f906137da565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b158015611ada57600080fd5b505afa158015611aee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b169190810190613228565b9150915060005b8151811015611c5357611b47828281518110611b3557fe5b60200260200101518560400151612928565b15611c4b576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f090611b7f9033908590600401613588565b602060405180830381600087803b158015611b9957600080fd5b505af1158015611bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd19190613492565b506110006001600160a01b03166335409f7f858481518110611bef57fe5b60200260200101516040518263ffffffff1660e01b8152600401611c139190613574565b600060405180830381600087803b158015611c2d57600080fd5b505af1158015611c41573d6000803e3d6000fd5b5050505050611c53565b600101611b1d565b5060408084015190516317b4f35360e01b8152600091612002916317b4f35391611c7f916004016135ac565b60206040518083038186803b158015611c9757600080fd5b505afa158015611cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccf91906131cb565b6001600160a01b031614611d3d576040808401519051630e9fbf5160e01b815261200291630e9fbf5191611d0691906004016135ac565b600060405180830381600087803b158015611d2057600080fd5b505af1158015611d34573d6000803e3d6000fd5b50505050610a45565b6120006001600160a01b031663f7a251d7600b611d5d866040015161298c565b60006040518463ffffffff1660e01b8152600401611d7d93929190613db5565b600060405180830381600087803b158015611d9757600080fd5b505af1158015611dab573d6000803e3d6000fd5b505050506000611dc0846040015160006129c7565b60405190915081907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a250505050565b61100381565b601481565b61200481565b60005460ff1615611e285760405162461bcd60e51b815260040161064f90613b22565b603260045560966005556000805460ff19166001179055565b601181565b61100081565b600381565b3361100014611e725760405162461bcd60e51b815260040161064f906138e4565b60005460ff16611e945760405162461bcd60e51b815260040161064f906136a1565b600154611ea057612298565b600154600090600019015b80821161226c576000805b82841015611fcf57611ec6612f96565b6002600060018781548110611ed757fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611fb957600460055481611f4457fe5b04816020015103816020018181525050806002600060018881548110611f6657fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611fc3565b6001925050611fcf565b50836001019350611eb6565b82841161216657611fde612f96565b6002600060018681548110611fef57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156120d75760046005548161205c57fe5b0481602001510381602001818152505080600260006001878154811061207e57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506121669050565b60026000600186815481106120e857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548061212c57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836121595750612166565b5060001990920191611fcf565b8180156121705750805b1561224f57600260006001868154811061218657fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054849081106121cd57fe5b600091825260209091200154600180546001600160a01b0390921691869081106121f357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600180548061222c57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b8261225b57505061226c565b505060019091019060001901611eab565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60606122b36122ae836129e3565b6122bb565b90505b919050565b6060815160011480156122ed5750607f60f81b826000815181106122db57fe5b01602001516001600160f81b03191611155b156122f95750806122b6565b6122b361230b8351608060ff16612ac9565b83612b9b565b606081516000141561233257506040805160008152602081019091526122b6565b60608260008151811061234157fe5b602002602001015190506000600190505b8351811015612382576123788285838151811061236b57fe5b6020026020010151612b9b565b9150600101612352565b5061239b612395825160c060ff16612ac9565b82612b9b565b9392505050565b80156123cd576040516375cc7d8960e01b8152612002906375cc7d8990611d06908690600401613574565b6040516375cc7d8960e01b8152612002906375cc7d89906123f2908690600401613574565b600060405180830381600087803b15801561240c57600080fd5b505af192505050801561241d575060015b610a45576040516000815260443d1015612439575060006124d6565b60046000803e60005160e01c6308c379a0811461245a5760009150506124d6565b60043d036004833e81513d602482011167ffffffffffffffff82111715612486576000925050506124d6565b808301805167ffffffffffffffff8111156124a85760009450505050506124d6565b8060208301013d86018111156124c6576000955050505050506124d6565b601f01601f191660405250925050505b806124e15750612518565b836001600160a01b0316600080516020613ea0833981519152848360405161250a9291906135bf565b60405180910390a25061257b565b3d808015612542576040519150601f19603f3d011682016040523d82523d6000602084013e612547565b606091505b50836001600160a01b0316600080516020613ea083398151915284836040516125719291906135bf565b60405180910390a2505b610a45565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161259b5790505090506125c4836001600160a01b0316612c18565b816000815181106125d157fe5b60200260200101819052506125e5436122a0565b816001815181106125f257fe5b602090810291909101015261260760386122a0565b8160028151811061261457fe5b6020026020010181905250612628426122a0565b8160038151811061263557fe5b602002602001018190525061239b81612311565b612651612fb9565b600061265b612fb9565b612663612fcb565b61267461266f86612c3b565b612c60565b90506000805b61268383612caa565b156126bc57806126af5761269e61269984612ccb565b612d19565b63ffffffff168452600191506126b4565b6126bc565b60010161267a565b5091935090915050915091565b6000816040516020016126dc9190613558565b60405160208183030381529060405280519060200120836040516020016127039190613558565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615612742576001915081612748565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b606081526020019060019003908161276c5750506040805160208082528183019092529192506060919080820181803683370190505090506127b185600001516122a0565b826000815181106127be57fe5b60200260200101819052506127d96020866020015183612d9b565b6127e2816122bb565b826001815181106127ef57fe5b602002602001018190525061280785604001516122a0565b8260028151811061281457fe5b602002602001018190525061282f6020866060015183612d9b565b612838816122bb565b8260038151811061284557fe5b602002602001018190525061286b602061285e84612311565b8051906020012083612d9b565b6040805160b080825260e0820190925260609160208201818036833701905050905061289b818360006020612dab565b6128ad81876080015160206060612dab565b6128bb818660806030612dab565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa6128f857600080fd5b506001612906826000612dfe565b60ff161461291b57600094505050505061271d565b5060019695505050505050565b8151815160009160019181148083146129445760009250612982565b600160208701838101602088015b60028483851001141561297d5780518351146129715760009650600093505b60209283019201612952565b505050505b5090949350505050565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816129a75790505090506125c4836122bb565b600081602001835110156129da57600080fd5b50016020015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612a2757506018612a4b565b6fffffffffffffffffffffffffffffffff198416612a4757506010612a4b565b5060005b6020811015612a8157818181518110612a6057fe5b01602001516001600160f81b03191615612a7957612a81565b600101612a4b565b60008160200390506060816040519080825280601f01601f191660200182016040528015612ab6576020820181803683370190505b5080830196909652508452509192915050565b6060680100000000000000008310612af35760405162461bcd60e51b815260040161064f90613811565b60408051600180825281830190925260609160208201818036833701905050905060378411612b4d5782840160f81b81600081518110612b2f57fe5b60200101906001600160f81b031916908160001a905350905061271d565b6060612b58856129e3565b90508381510160370160f81b82600081518110612b7157fe5b60200101906001600160f81b031916908160001a905350612b928282612b9b565b95945050505050565b6060806040519050835180825260208201818101602087015b81831015612bcc578051835260209283019201612bb4565b50855184518101855292509050808201602086015b81831015612bf9578051835260209283019201612be1565b508651929092011591909101601f01601f191660405250905092915050565b60408051600560a21b831860148201526034810190915260609061239b816122bb565b612c43612feb565b506040805180820190915281518152602082810190820152919050565b612c68612fcb565b612c7182612e1a565b612c7a57600080fd5b6000612c898360200151612e54565b60208085015160408051808201909152868152920190820152915050919050565b6000612cb4612feb565b505080518051602091820151919092015191011190565b612cd3612feb565b612cdc82612caa565b612ce557600080fd5b60208201516000612cf582612eb7565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612d2e57508151602110155b612d3757600080fd5b6000612d468360200151612e54565b90508083600001511015612d6c5760405162461bcd60e51b815260040161064f90613b7f565b825160208085015183018051928490039291831015612d9257826020036101000a820491505b50949350505050565b9091018181526020918201910152565b60005b81811015610d4f57838181518110612dc257fe5b602001015160f81c60f81b858480600101955081518110612ddf57fe5b60200101906001600160f81b031916908160001a905350600101612dae565b60008160010183511015612e1157600080fd5b50016001015190565b8051600090612e2b575060006122b6565b6020820151805160001a9060c0821015612e4a576000925050506122b6565b5060019392505050565b8051600090811a6080811015612e6e5760009150506122b6565b60b8811080612e89575060c08110801590612e89575060f881105b15612e985760019150506122b6565b60c0811015612eac5760b5190190506122b6565b60f5190190506122b6565b80516000908190811a6080811015612ed25760019150612f8f565b60b8811015612ee757607e1981019150612f8f565b60c0811015612f3857600060b78203600186019550806020036101000a865104915060018101820193505080831015612f325760405162461bcd60e51b815260040161064f90613934565b50612f8f565b60f8811015612f4d5760be1981019150612f8f565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156127485760405162461bcd60e51b815260040161064f90613934565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b6040518060400160405280612fde612feb565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f830112613015578081fd5b815161302861302382613e08565b613de1565b818152915060208083019084810160005b8481101561309e578151870188603f82011261305457600080fd5b8381015161306461302382613e28565b81815260408b8184860101111561307a57600080fd5b61308983888401838701613e4c565b50865250509282019290820190600101613039565b505050505092915050565b60008083601f8401126130ba578182fd5b50813567ffffffffffffffff8111156130d1578182fd5b6020830191508360208285010111156130e957600080fd5b9250929050565b600082601f830112613100578081fd5b813561310e61302382613e28565b915080825283602082850101111561312557600080fd5b8060208401602084013760009082016020015292915050565b600060a0828403121561314f578081fd5b61315960a0613de1565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561319757600080fd5b6131a3848285016130f0565b60808301525092915050565b6000602082840312156131c0578081fd5b813561239b81613e7c565b6000602082840312156131dc578081fd5b815161239b81613e7c565b6000806000606084860312156131fb578182fd5b833561320681613e7c565b925060208401359150604084013561321d81613e91565b809150509250925092565b6000806040838503121561323a578182fd5b825167ffffffffffffffff80821115613251578384fd5b81850186601f820112613262578485fd5b8051925061327261302384613e08565b80848252602080830192508084018a828389028701011115613292578889fd5b8894505b868510156132bd5780516132a981613e7c565b845260019490940193928101928101613296565b5088015190965093505050808211156132d4578283fd5b506132e185828601613005565b9150509250929050565b6000602082840312156132fc578081fd5b815161239b81613e91565b60008060408385031215613319578182fd5b823567ffffffffffffffff80821115613330578384fd5b61333c868387016130f0565b93506020850135915080821115613351578283fd5b506132e1858286016130f0565b60008060008060408587031215613373578182fd5b843567ffffffffffffffff8082111561338a578384fd5b613396888389016130a9565b909650945060208701359150808211156133ae578384fd5b506133bb878288016130a9565b95989497509550505050565b6000602082840312156133d8578081fd5b813567ffffffffffffffff808211156133ef578283fd5b81840160608187031215613401578384fd5b61340b6060613de1565b925080358281111561341b578485fd5b6134278782840161313e565b84525060208101358281111561343b578485fd5b6134478782840161313e565b60208501525060408101358281111561345e578485fd5b61346a878284016130f0565b6040850152509195945050505050565b60006020828403121561348b578081fd5b5035919050565b6000602082840312156134a3578081fd5b5051919050565b6000806000604084860312156134be578081fd5b833560ff811681146134ce578182fd5b9250602084013567ffffffffffffffff8111156134e9578182fd5b6134f5868287016130a9565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452613544816020860160208601613e4c565b601f01601f19169290920160200192915050565b6000825161356a818460208701613e4c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825261239b602083018461352c565b6000838252604060208301526135d8604083018461352c565b949350505050565b6000604082526135f4604083018688613502565b8281036020840152613607818587613502565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260606020830152613dd1606083018561352c565b9050826040830152949350505050565b60405181810167ffffffffffffffff81118282101715613e0057600080fd5b604052919050565b600067ffffffffffffffff821115613e1e578081fd5b5060209081020190565b600067ffffffffffffffff821115613e3e578081fd5b50601f01601f191660200190565b60005b83811015613e67578181015183820152602001613e4f565b83811115613e76576000848401525b50505050565b6001600160a01b0381168114610c0a57600080fd5b8015158114610c0a57600080fdfed7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1ca164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b506004361061035d5760003560e01c80637942fd05116101d3578063c80d4b8f11610104578063df8079e9116100a2578063f9a2bbc71161007c578063f9a2bbc7146105ee578063fc3e5908146105f6578063fc4333cd146105fe578063fd6a6879146106065761035d565b8063df8079e9146105d6578063e1c7392a146105de578063f1fad104146105e65761035d565b8063c96be4cb116100de578063c96be4cb146105a0578063cc844b73146105b3578063dc927faf146105c6578063dcc6f156146105ce5761035d565b8063c80d4b8f14610590578063c81b166214610598578063c8509d81146105225761035d565b8063a1a11bf511610171578063aad560631161014b578063aad5606314610565578063ab51bb961461056d578063ac0af62914610575578063ac4317511461057d5761035d565b8063a1a11bf51461054d578063a78abc1614610555578063aa82dce11461055d5761035d565b8063831d65d1116101ad578063831d65d11461052257806396713da9146105355780639dc092621461053d5780639f804f5f146105455761035d565b80637942fd051461050a5780637e434d54146105125780638256ace61461051a5761035d565b806343756e5c116102ad5780635bfb49901161024b57806370fd5bad1161022557806370fd5bad146104ea578063718a8aa8146104f257806375d47a0a146104fa5780637912a65d146105025761035d565b80635bfb4990146104c757806362b72cf5146104da5780636e47b482146104e25761035d565b806350055f901161028757806350055f90146104a757806351b4dce3146104af57806351e80672146104b7578063567a372d146104bf5761035d565b806343756e5c14610482578063493279b11461048a5780634bf6c8821461049f5761035d565b8063280870281161031a57806335aa2e44116102f457806335aa2e441461043157806337c8dab914610444578063389f4f71146104655780633dffc3871461046d5761035d565b8063280870281461040157806328aa02b1146104095780633306ccca1461041c5761035d565b80630bee7a67146103625780630e2374a5146103805780631182b8751461039557806322d1e80b146103b557806323bac5a2146103ca57806327962118146103ec575b600080fd5b61036a61060e565b604051610377919061342d565b60405180910390f35b610388610613565b6040516103779190612c7a565b6103a86103a3366004612b93565b610619565b6040516103779190612cb2565b6103bd61067f565b6040516103779190612ca7565b6103dd6103d8366004612898565b610688565b60405161037793929190613415565b6103ff6103fa3660046129f0565b6106ab565b005b610388610a00565b6103ff6104173660046128d0565b610a06565b610424610a37565b60405161037791906133dd565b61038861043f366004612b63565b610a3d565b610457610452366004612898565b610a64565b604051610377929190613407565b610424610abb565b610475610ac1565b604051610377919061343e565b610388610ac6565b610492610acc565b60405161037791906133ce565b610475610ad1565b610424610ad6565b610388610adc565b610388610ae2565b610424610ae8565b6103ff6104d5366004612898565b610aee565b610424610b76565b610388610b7c565b610475610b82565b610475610b87565b610388610b8c565b610424610b92565b610475610b97565b610388610b9c565b610457610ba2565b6103ff610530366004612b93565b610bac565b610475610bcd565b610388610bd2565b610424610bd8565b610388610bde565b6103bd610be4565b610388610bed565b610388610bf3565b61036a610bf9565b610424610bfe565b6103ff61058b366004612a47565b610c03565b61042461119f565b6103886111a4565b6103ff6105ae366004612898565b6111aa565b6103ff6105c1366004612ab0565b6114c7565b610388611966565b61042461196c565b610388611971565b6103ff611977565b6104756119b3565b6103886119b8565b6104756119be565b6103ff6119c3565b610388611e0c565b606481565b61200181565b606033612000146106455760405162461bcd60e51b815260040161063c906132a8565b60405180910390fd5b60005460ff166106675760405162461bcd60e51b815260040161063c90612d9e565b60405162461bcd60e51b815260040161063c90612f6d565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166106cd5760405162461bcd60e51b815260040161063c90612d9e565b6006546106da5760146006555b6008546106e8576170806008555b8151158015906106f85750805115155b6107145760405162461bcd60e51b815260040161063c9061323d565b60408051600380825260808201909252606091816020015b606081526020019060019003908161072c57905050905061074d6038611e12565b8160008151811061075a57fe5b602002602001018190525061076e83611e2d565b8160018151811061077b57fe5b602002602001018190525061078f82611e2d565b8160028151811061079c57fe5b602002602001018190525060606107b282611e83565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa6107f357600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d5450690610826908690600401612c7a565b60206040518083038186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087691906128b4565b6001600160a01b0316141561089d5760405162461bcd60e51b815260040161063c90612d6e565b43600854820110156108c15760405162461bcd60e51b815260040161063c90612d0f565b604051631871f7d960e31b81526120029063c38fbec8906108e6908590600401612c7a565b600060405180830381600087803b15801561090057600080fd5b505af1158015610914573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f915061093d908590600401612c7a565b600060405180830381600087803b15801561095757600080fd5b505af115801561096b573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906109a39033908590600401612c8e565b602060405180830381600087803b1580156109bd57600080fd5b505af11580156109d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f59190612b7b565b505050505050505050565b61200581565b3361100014610a275760405162461bcd60e51b815260040161063c90612ff3565b610a32838383611f14565b505050565b61708081565b60018181548110610a4a57fe5b6000918252602090912001546001600160a01b0316905081565b600080610a6f6126cb565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b603881565b600881565b60065481565b61200681565b61200081565b60045481565b3361100014610b0f5760405162461bcd60e51b815260040161063c90612ff3565b60005460ff16610b315760405162461bcd60e51b815260040161063c90612d9e565b806001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c6000604051610b6b9190612cc5565b60405180910390a250565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b61200381565b6004546005549091565b33612000146106455760405162461bcd60e51b815260040161063c906132a8565b600981565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610c255760405162461bcd60e51b815260040161063c90612d9e565b3361100714610c465760405162461bcd60e51b815260040161063c9061312c565b610cb184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b6020820152915061214d9050565b15610d4c5760208114610cd65760405162461bcd60e51b815260040161063c90612f7f565b604080516020601f8401819004810282018101909252828152600091610d14918585808385018382808284376000920191909152506121a792505050565b905060018110158015610d28575060055481105b610d445760405162461bcd60e51b815260040161063c90613263565b60045561115c565b610db284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b6020820152915061214d9050565b15610e4e5760208114610dd75760405162461bcd60e51b815260040161063c9061317a565b604080516020601f8401819004810282018101909252828152600091610e15918585808385018382808284376000920191909152506121a792505050565b90506103e88111158015610e2a575060045481115b610e465760405162461bcd60e51b815260040161063c90612e57565b60055561115c565b610ebb84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b6020820152915061214d9050565b15610f555760208114610ee05760405162461bcd60e51b815260040161063c906130b4565b604080516020601f8401819004810282018101909252828152600091610f1e918585808385018382808284376000920191909152506121a792505050565b9050600a8110158015610f315750606481105b610f4d5760405162461bcd60e51b815260040161063c906131bc565b60065561115c565b610fc984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c61736800000000000000006020820152915061214d9050565b156110405760208114610fee5760405162461bcd60e51b815260040161063c90612e8c565b604080516020601f840181900481028201810190925282815261102a91908484808385018382808284376000920191909152506121ac92505050565b6007805460ff191691151591909117905561115c565b6110a784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b6020820152915061214d9050565b1561114457602081146110cc5760405162461bcd60e51b815260040161063c90613043565b604080516020601f840181900481028201810190925282815260009161110a918585808385018382808284376000920191909152506121a792505050565b905061708081101580156111205750620d2f0081105b61113c5760405162461bcd60e51b815260040161063c90612dd5565b60085561115c565b60405162461bcd60e51b815260040161063c90613344565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516111919493929190612cdd565b60405180910390a150505050565b609681565b61100281565b3341146111c95760405162461bcd60e51b815260040161063c906132f7565b60005460ff166111eb5760405162461bcd60e51b815260040161063c90612d9e565b600354431161120c5760405162461bcd60e51b815260040161063c90613399565b3a1561122a5760405162461bcd60e51b815260040161063c90613086565b60405163155853f360e21b8152611000906355614fcc9061124f908490600401612c7a565b60206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f91906129d4565b6112a8576114c0565b6112b06126cb565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061130b576020810180516001019052611364565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161137657fe5b066113ee57600060208201526040516335409f7f60e01b8152611000906335409f7f906113a7908590600401612c7a565b600060405180830381600087803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b505050506113e98282602001516000611f14565b61145a565b6004548160200151816113fd57fe5b0661145a576040516375abf10160e11b81526110009063eb57e20290611427908590600401612c7a565b600060405180830381600087803b15801561144157600080fd5b505af1158015611455573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166114e95760405162461bcd60e51b815260040161063c90612d9e565b60075460ff1661150b5760405162461bcd60e51b815260040161063c90612d39565b6006546115185760146006555b600854611526576170806008555b60085481516040015143910111801561154a57504360085482602001516040015101115b6115665760405162461bcd60e51b815260040161063c9061336b565b8060200151602001518160000151602001511480156115945750806020015160600151816000015160600151145b156115b15760405162461bcd60e51b815260040161063c90612fc6565b8051604081015190511080156115d05750602081015160408101519051105b6115ec5760405162461bcd60e51b815260040161063c90612f36565b6020810151518151511080156116115750806000015160400151816020015160400151105b8061163c575080515160208201515110801561163c5750806020015160400151816000015160400151105b806116565750806020015160400151816000015160400151145b6116725760405162461bcd60e51b815260040161063c90612e20565b604080820151905163ea321e4960e01b81526110009163ea321e499161169b9190600401612cb2565b60206040518083038186803b1580156116b357600080fd5b505afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb91906129d4565b6117075760405162461bcd60e51b815260040161063c906130fd565b611719816000015182604001516121d4565b80156117325750611732816020015182604001516121d4565b61174e5760405162461bcd60e51b815260040161063c90612ed7565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117c89190810190612911565b9150915060005b8151811015611905576117f98282815181106117e757fe5b602002602001015185604001516123ac565b156118fd576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906118319033908590600401612c8e565b602060405180830381600087803b15801561184b57600080fd5b505af115801561185f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118839190612b7b565b506110006001600160a01b03166335409f7f8584815181106118a157fe5b60200260200101516040518263ffffffff1660e01b81526004016118c59190612c7a565b600060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b5050505050611905565b6001016117cf565b506040808401519051630e9fbf5160e01b815261200291630e9fbf519161192f9190600401612cb2565b600060405180830381600087803b15801561194957600080fd5b505af115801561195d573d6000803e3d6000fd5b50505050505050565b61100381565b601481565b61200481565b60005460ff161561199a5760405162461bcd60e51b815260040161063c90613206565b603260045560966005556000805460ff19166001179055565b601181565b61100081565b600381565b33611000146119e45760405162461bcd60e51b815260040161063c90612ff3565b60005460ff16611a065760405162461bcd60e51b815260040161063c90612d9e565b600154611a1257611e0a565b600154600090600019015b808211611dde576000805b82841015611b4157611a386126cb565b6002600060018781548110611a4957fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611b2b57600460055481611ab657fe5b04816020015103816020018181525050806002600060018881548110611ad857fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611b35565b6001925050611b41565b50836001019350611a28565b828411611cd857611b506126cb565b6002600060018681548110611b6157fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611c4957600460055481611bce57fe5b04816020015103816020018181525050806002600060018781548110611bf057fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611cd89050565b6002600060018681548110611c5a57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611c9e57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611ccb5750611cd8565b5060001990920191611b41565b818015611ce25750805b15611dc1576002600060018681548110611cf857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611d3f57fe5b600091825260209091200154600180546001600160a01b039092169186908110611d6557fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611d9e57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611dcd575050611dde565b505060019091019060001901611a1d565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b6060611e25611e2083612410565b611e2d565b90505b919050565b606081516001148015611e5f5750607f60f81b82600081518110611e4d57fe5b01602001516001600160f81b03191611155b15611e6b575080611e28565b611e25611e7d8351608060ff166124f6565b836125c8565b6060815160001415611ea45750604080516000815260208101909152611e28565b606082600081518110611eb357fe5b602002602001015190506000600190505b8351811015611ef457611eea82858381518110611edd57fe5b60200260200101516125c8565b9150600101611ec4565b50611f0d611f07825160c060ff166124f6565b826125c8565b9392505050565b8015611f76576040516375cc7d8960e01b8152612002906375cc7d8990611f3f908690600401612c7a565b600060405180830381600087803b158015611f5957600080fd5b505af1158015611f6d573d6000803e3d6000fd5b50505050610a32565b6040516375cc7d8960e01b8152612002906375cc7d8990611f9b908690600401612c7a565b600060405180830381600087803b158015611fb557600080fd5b505af1925050508015611fc6575060015b610a32576040516000815260443d1015611fe25750600061207f565b60046000803e60005160e01c6308c379a0811461200357600091505061207f565b60043d036004833e81513d602482011167ffffffffffffffff8211171561202f5760009250505061207f565b808301805167ffffffffffffffff81111561205157600094505050505061207f565b8060208301013d860181111561206f5760009550505050505061207f565b601f01601f191660405250925050505b8061208a57506120d3565b836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c84836040516120c59291906133e6565b60405180910390a250612148565b3d8080156120fd576040519150601f19603f3d011682016040523d82523d6000602084013e612102565b606091505b50836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c848360405161213e9291906133e6565b60405180910390a2505b610a32565b6000816040516020016121609190612c5e565b60405160208183030381529060405280519060200120836040516020016121879190612c5e565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff8116156121c65760019150816121cc565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b60608152602001906001900390816121f05750506040805160208082528183019092529192506060919080820181803683370190505090506122358560000151611e12565b8260008151811061224257fe5b602002602001018190525061225d6020866020015183612645565b61226681611e2d565b8260018151811061227357fe5b602002602001018190525061228b8560400151611e12565b8260028151811061229857fe5b60200260200101819052506122b36020866060015183612645565b6122bc81611e2d565b826003815181106122c957fe5b60200260200101819052506122ef60206122e284611e83565b8051906020012083612645565b6040805160b080825260e0820190925260609160208201818036833701905050905061231f818360006020612655565b61233181876080015160206060612655565b61233f818660806030612655565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa61237c57600080fd5b50600161238a8260006126af565b60ff161461239f5760009450505050506121a1565b5060019695505050505050565b8151815160009160019181148083146123c85760009250612406565b600160208701838101602088015b6002848385100114156124015780518351146123f55760009650600093505b602092830192016123d6565b505050505b5090949350505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661245457506018612478565b6fffffffffffffffffffffffffffffffff19841661247457506010612478565b5060005b60208110156124ae5781818151811061248d57fe5b01602001516001600160f81b031916156124a6576124ae565b600101612478565b60008160200390506060816040519080825280601f01601f1916602001820160405280156124e3576020820181803683370190505b5080830196909652508452509192915050565b60606801000000000000000083106125205760405162461bcd60e51b815260040161063c90612f0e565b6040805160018082528183019092526060916020820181803683370190505090506037841161257a5782840160f81b8160008151811061255c57fe5b60200101906001600160f81b031916908160001a90535090506121a1565b606061258585612410565b90508381510160370160f81b8260008151811061259e57fe5b60200101906001600160f81b031916908160001a9053506125bf82826125c8565b95945050505050565b6060806040519050835180825260208201818101602087015b818310156125f95780518352602092830192016125e1565b50855184518101855292509050808201602086015b8183101561262657805183526020928301920161260e565b508651929092011591909101601f01601f191660405250905092915050565b9091018181526020918201910152565b60005b818110156126a85783818151811061266c57fe5b602001015160f81c60f81b85848060010195508151811061268957fe5b60200101906001600160f81b031916908160001a905350600101612658565b5050505050565b600081600101835110156126c257600080fd5b50016001015190565b604051806060016040528060008152602001600081526020016000151581525090565b600082601f8301126126fe578081fd5b815161271161270c82613473565b61344c565b818152915060208083019084810160005b84811015612787578151870188603f82011261273d57600080fd5b8381015161274d61270c82613493565b81815260408b8184860101111561276357600080fd5b612772838884018387016134b7565b50865250509282019290820190600101612722565b505050505092915050565b60008083601f8401126127a3578182fd5b50813567ffffffffffffffff8111156127ba578182fd5b6020830191508360208285010111156127d257600080fd5b9250929050565b600082601f8301126127e9578081fd5b81356127f761270c82613493565b915080825283602082850101111561280e57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612838578081fd5b61284260a061344c565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561288057600080fd5b61288c848285016127d9565b60808301525092915050565b6000602082840312156128a9578081fd5b8135611f0d816134e7565b6000602082840312156128c5578081fd5b8151611f0d816134e7565b6000806000606084860312156128e4578182fd5b83356128ef816134e7565b9250602084013591506040840135612906816134ff565b809150509250925092565b60008060408385031215612923578182fd5b825167ffffffffffffffff8082111561293a578384fd5b81850186601f82011261294b578485fd5b8051925061295b61270c84613473565b80848252602080830192508084018a82838902870101111561297b578889fd5b8894505b868510156129a6578051612992816134e7565b84526001949094019392810192810161297f565b5088015190965093505050808211156129bd578283fd5b506129ca858286016126ee565b9150509250929050565b6000602082840312156129e5578081fd5b8151611f0d816134ff565b60008060408385031215612a02578182fd5b823567ffffffffffffffff80821115612a19578384fd5b612a25868387016127d9565b93506020850135915080821115612a3a578283fd5b506129ca858286016127d9565b60008060008060408587031215612a5c578182fd5b843567ffffffffffffffff80821115612a73578384fd5b612a7f88838901612792565b90965094506020870135915080821115612a97578384fd5b50612aa487828801612792565b95989497509550505050565b600060208284031215612ac1578081fd5b813567ffffffffffffffff80821115612ad8578283fd5b81840160608187031215612aea578384fd5b612af4606061344c565b9250803582811115612b04578485fd5b612b1087828401612827565b845250602081013582811115612b24578485fd5b612b3087828401612827565b602085015250604081013582811115612b47578485fd5b612b53878284016127d9565b6040850152509195945050505050565b600060208284031215612b74578081fd5b5035919050565b600060208284031215612b8c578081fd5b5051919050565b600080600060408486031215612ba7578081fd5b833560ff81168114612bb7578182fd5b9250602084013567ffffffffffffffff811115612bd2578182fd5b612bde86828701612792565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612c2d8160208601602086016134b7565b601f01601f19169290920160200192915050565b600a81526919195c1c9958d85d195960b21b602082015260400190565b60008251612c708184602087016134b7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611f0d6020830184612c15565b600082825260406020830152611f0d60408301612c41565b600060408252612cf1604083018688612beb565b8281036020840152612d04818587612beb565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b600060208252611e2560208301612c41565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526133ff6040830184612c15565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561346b57600080fd5b604052919050565b600067ffffffffffffffff821115613489578081fd5b5060209081020190565b600067ffffffffffffffff8211156134a9578081fd5b50601f01601f191660200190565b60005b838110156134d25781810151838201526020016134ba565b838111156134e1576000848401525b50505050565b6001600160a01b03811681146134fc57600080fd5b50565b80151581146134fc57600080fdfea164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001002": { "balance": "0x0", @@ -58,39 +58,39 @@ }, "0x0000000000000000000000000000000000001003": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063a78abc1611610151578063dda83148116100c3578063e405bbc311610087578063e405bbc314610724578063ea54b2aa1461072c578063f1fad10414610734578063f9a2bbc71461073c578063fc3e590814610744578063fd6a68791461074c57610274565b8063dda83148146106a4578063df5fe704146106ca578063df8079e9146106f0578063e1c7392a146106f8578063e2761af01461070057610274565b8063adc879e911610115578063adc879e9146105c7578063c81b1662146105cf578063cba510a9146105d7578063d8169879146105fd578063da8d08f014610676578063dc927faf1461069c57610274565b8063a78abc16146104cf578063aa82dce1146104eb578063aad56063146104f3578063ab51bb96146104fb578063ac4317511461050357610274565b8063564b81ef116101ea57806375d47a0a116101ae57806375d47a0a1461049f5780637942fd05146104a75780637e434d54146104af57806396713da9146104b75780639dc09262146104bf578063a1a11bf5146104c757610274565b8063564b81ef146103455780635c5ae8db146103c25780636e47b4821461048757806370fd5bad1461048f578063718a8aa81461049757610274565b80633dffc3871161023c5780633dffc387146102e857806343756e5c14610306578063493279b11461030e5780634bf6c8821461032d57806351b4dce31461033557806351e806721461033d57610274565b80630bee7a67146102795780630e2374a51461029a5780632657e9b6146102be57806328087028146102d857806333f7798d146102e0575b600080fd5b610281610754565b6040805163ffffffff9092168252519081900360200190f35b6102a2610759565b604080516001600160a01b039092168252519081900360200190f35b6102c661075f565b60408051918252519081900360200190f35b6102a261076a565b6102c6610770565b6102f0610776565b6040805160ff9092168252519081900360200190f35b6102a261077b565b610316610781565b6040805161ffff9092168252519081900360200190f35b6102f0610786565b6102a261078b565b6102a2610791565b61034d610797565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038757818101518382015260200161036f565b50505050905090810190601f1680156103b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360208110156103d857600080fd5b50356001600160401b03166108a3565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610449578181015183820152602001610431565b50505050905090810190601f1680156104765780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102a261095e565b6102f0610964565b6102f0610969565b6102a261096e565b6102f0610974565b6102a2610979565b6102f061097f565b6102a2610984565b6102a261098a565b6104d7610990565b604080519115158252519081900360200190f35b6102a2610999565b6102a261099f565b6102816109a5565b6105c56004803603604081101561051957600080fd5b81019060208101813564010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91939092909160208101903564010000000081111561058657600080fd5b82018360208201111561059857600080fd5b803590602001918460018302840111640100000000831117156105ba57600080fd5b5090925090506109aa565b005b6102c6610c63565b6102a2610c69565b6102c6600480360360208110156105ed57600080fd5b50356001600160401b0316610c6f565b6104d76004803603604081101561061357600080fd5b81019060208101813564010000000081111561062e57600080fd5b82018360208201111561064057600080fd5b8035906020019184600183028401116401000000008311171561066257600080fd5b9193509150356001600160401b0316610c8e565b6102a26004803603602081101561068c57600080fd5b50356001600160401b031661146f565b6102a261148a565b6102a2600480360360208110156106ba57600080fd5b50356001600160401b0316611490565b6104d7600480360360208110156106e057600080fd5b50356001600160401b03166114b4565b6102a26114f6565b6105c56114fc565b6107086116a3565b604080516001600160401b039092168252519081900360200190f35b6107086116b2565b61034d6116c8565b6102f06116e7565b6102a26116ec565b6102f06116f2565b6102a26116f7565b606481565b61200181565b662386f26fc1000081565b61200581565b60055481565b600181565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561080d57828160ff16815181106107e157fe5b01602001516001600160f81b0319161561080057816001019150610805565b61080d565b6001016107c6565b5060608160ff166040519080825280601f01601f19166020018201604052801561083e576020820181803683370190505b50905060005b8260ff168160ff16101561089a57838160ff168151811061086157fe5b602001015160f81c60f81b828260ff168151811061087b57fe5b60200101906001600160f81b031916908160001a905350600101610844565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610a01576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610a415760405162461bcd60e51b815260040180806020018281038252602e815260200180611ac9602e913960400191505060405180910390fd5b610ab584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e67650000000000602082015291506116fd9050565b15610b945760208114610af95760405162461bcd60e51b815260040180806020018281038252602e815260200180611a68602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610b37918585808385018382808284376000920191909152506117e492505050565b9050600081118015610b515750670de0b6b3a76400008111155b610b8c5760405162461bcd60e51b815260040180806020018281038252602f815260200180611af7602f913960400191505060405180910390fd5b600555610bd1565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610cd157600080fd5b505afa158015610ce5573d6000803e3d6000fd5b505050506040513d6020811015610cfb57600080fd5b5051610d4e576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610dc2576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610e0f5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b266026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610e2a611946565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610ef05780601f10610ec557610100808354040283529160200191610ef0565b820191906000526020600020905b815481529060010190602001808311610ed357829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610f2d57506003546001600160401b0390811690831610155b1561100e5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610ffe5780601f10610fd357610100808354040283529160200191610ffe565b820191906000526020600020905b815481529060010190602001808311610fe157829003601f168201915b5050505050815250509050610efc565b6060810151516111055780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f8101839004830284018301909452838352939550909291908301828280156110bd5780601f10611092576101008083540402835291602001916110bd565b820191906000526020600020905b8154815290600101906020018083116110a057829003601f168201915b505050506060830182905250516111055760405162461bcd60e51b8152600401808060200182810382526021815260200180611a476021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611144576020820181803683370190505b5090506000611152826117e9565b9050611160848683866117ef565b61119b5760405162461bcd60e51b8152600401808060200182810382526023815260200180611a246023913960400191505060405180910390fd5b600083820191506111e18a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061185b92505050565b945090506111f0818386611865565b825160200193506111ff61196c565b6110008186866064600019fa61121457600080fd5b805194506000600160f81b8616156112a35750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b15801561127657600080fd5b505af115801561128a573d6000803e3d6000fd5b505050506040513d60208110156112a057600080fd5b50505b856001600160401b0316955060208201935060006112c3858884156118a6565b90985090506001600160401b03808216908c16146113125760405162461bcd60e51b8152600401808060200182810382526033815260200180611a966033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b939261139992600385019291019061198b565b50506003546001600160401b03600160401b9091048116908d16111590506113e1576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b03161515806114f057506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615611554576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60008061157b6040518061024001604052806102208152602001611b4c610220913961185b565b8151600455909250905061158d611946565b600061159b848460006118a6565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261160792600385019291019061198b565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518061024001604052806102208152602001611b4c610220913981565b601181565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b602083106117325780518252601f199092019160209182019101611713565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106117a05780518252601f199092019160209182019101611781565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061180d876060015161185b565b909250905061181d828683611865565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b60208110611885578251825260209283019290910190601f1901611866565b915181516020939093036101000a6000190180199091169216919091179052565b6118ae611946565b60088401516028850151604890950180519095600092916118cd611946565b6020810183905260408101829052866119385760008060688a036040519080825280601f01601f191660200182016040528015611911576020820181803683370190505b50606084018190526119229061185b565b909250905061193560208c018383611865565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106119cc57805160ff19168380011785556119f9565b828001600101855582156119f9579182015b828111156119f95782518255916020019190600101906119de565b50611a05929150611a09565b5090565b6108a091905b80821115611a055760008155600101611a0f56fe6661696c656420746f2073657269616c697a6520636f6e73656e7375732073746174656661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c48656967687442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063a78abc1611610151578063dda83148116100c3578063e405bbc311610087578063e405bbc314610724578063ea54b2aa1461072c578063f1fad10414610734578063f9a2bbc71461073c578063fc3e590814610744578063fd6a68791461074c57610274565b8063dda83148146106a4578063df5fe704146106ca578063df8079e9146106f0578063e1c7392a146106f8578063e2761af01461070057610274565b8063adc879e911610115578063adc879e9146105c7578063c81b1662146105cf578063cba510a9146105d7578063d8169879146105fd578063da8d08f014610676578063dc927faf1461069c57610274565b8063a78abc16146104cf578063aa82dce1146104eb578063aad56063146104f3578063ab51bb96146104fb578063ac4317511461050357610274565b8063564b81ef116101ea57806375d47a0a116101ae57806375d47a0a1461049f5780637942fd05146104a75780637e434d54146104af57806396713da9146104b75780639dc09262146104bf578063a1a11bf5146104c757610274565b8063564b81ef146103455780635c5ae8db146103c25780636e47b4821461048757806370fd5bad1461048f578063718a8aa81461049757610274565b80633dffc3871161023c5780633dffc387146102e857806343756e5c14610306578063493279b11461030e5780634bf6c8821461032d57806351b4dce31461033557806351e806721461033d57610274565b80630bee7a67146102795780630e2374a51461029a5780632657e9b6146102be57806328087028146102d857806333f7798d146102e0575b600080fd5b610281610754565b6040805163ffffffff9092168252519081900360200190f35b6102a2610759565b604080516001600160a01b039092168252519081900360200190f35b6102c661075f565b60408051918252519081900360200190f35b6102a261076a565b6102c6610770565b6102f0610776565b6040805160ff9092168252519081900360200190f35b6102a261077b565b610316610781565b6040805161ffff9092168252519081900360200190f35b6102f0610786565b6102a261078b565b6102a2610791565b61034d610797565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038757818101518382015260200161036f565b50505050905090810190601f1680156103b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360208110156103d857600080fd5b50356001600160401b03166108a3565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610449578181015183820152602001610431565b50505050905090810190601f1680156104765780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102a261095e565b6102f0610964565b6102f0610969565b6102a261096e565b6102f0610974565b6102a2610979565b6102f061097f565b6102a2610984565b6102a261098a565b6104d7610990565b604080519115158252519081900360200190f35b6102a2610999565b6102a261099f565b6102816109a5565b6105c56004803603604081101561051957600080fd5b81019060208101813564010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91939092909160208101903564010000000081111561058657600080fd5b82018360208201111561059857600080fd5b803590602001918460018302840111640100000000831117156105ba57600080fd5b5090925090506109aa565b005b6102c6610a7b565b6102a2610a81565b6102c6600480360360208110156105ed57600080fd5b50356001600160401b0316610a87565b6104d76004803603604081101561061357600080fd5b81019060208101813564010000000081111561062e57600080fd5b82018360208201111561064057600080fd5b8035906020019184600183028401116401000000008311171561066257600080fd5b9193509150356001600160401b0316610aa6565b6102a26004803603602081101561068c57600080fd5b50356001600160401b0316610b66565b6102a2610b81565b6102a2600480360360208110156106ba57600080fd5b50356001600160401b0316610b87565b6104d7600480360360208110156106e057600080fd5b50356001600160401b0316610bab565b6102a2610bed565b6105c5610bf3565b610708610d9f565b604080516001600160401b039092168252519081900360200190f35b610708610dae565b61034d610dc4565b6102f0610de3565b6102a2610de8565b6102f0610dee565b6102a2610df3565b606481565b61200181565b662386f26fc1000081565b61200581565b60055481565b600181565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561080d57828160ff16815181106107e157fe5b01602001516001600160f81b0319161561080057816001019150610805565b61080d565b6001016107c6565b5060608160ff166040519080825280601f01601f19166020018201604052801561083e576020820181803683370190505b50905060005b8260ff168160ff16101561089a57838160ff168151811061086157fe5b602001015160f81c60f81b828260ff168151811061087b57fe5b60200101906001600160f81b031916908160001a905350600101610844565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610a01576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610a415760405162461bcd60e51b815260040180806020018281038252602e815260200180610fa3602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d6020811015610b1357600080fd5b5051610a41576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610be757506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610c4b576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610c726040518061024001604052806102208152602001610fd16102209139610df9565b81516004559092509050610c84610ee4565b6000610c9284846000610e03565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff1916941693909317835580860151918301919091559184015160028201556060840151805194965092945085939092610cfe926003850192910190610f0a565b50506003805467ffffffffffffffff19166001600160401b038481169182176fffffffffffffffff00000000000000001916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518061024001604052806102208152602001610fd1610220913981565b601181565b61100081565b600381565b61100481565b8051602090910191565b610e0b610ee4565b6008840151602885015160489095018051909560009291610e2a610ee4565b602081018390526040810182905286610e955760008060688a036040519080825280601f01601f191660200182016040528015610e6e576020820181803683370190505b5060608401819052610e7f90610df9565b9092509050610e9260208c018383610ea3565b50505b989297509195505050505050565b5b60208110610ec3578251825260209283019290910190601f1901610ea4565b915181516020939093036101000a6000190180199091169216919091179052565b604080516080810182526000808252602082018190529181019190915260608082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610f4b57805160ff1916838001178555610f78565b82800160010185558215610f78579182015b82811115610f78578251825591602001919060010190610f5d565b50610f84929150610f88565b5090565b6108a091905b80821115610f845760008155600101610f8e56fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001004": { "balance": "176405560900000000000000000", - "code": "0x6080604052600436106104405760003560e01c80639509b98011610234578063c81b16621161012e578063ebf71d53116100b6578063fb063e8f1161007a578063fb063e8f146110d3578063fc1a598f146110e8578063fc3e590814610cca578063fd6a68791461111b578063ff9c0027146108a057610488565b8063ebf71d531461106a578063f01484721461107f578063f1fad10414611094578063f9a2bbc7146110a9578063fa9e9159146110be57610488565b8063dc927faf116100fd578063dc927faf14610fce578063df8079e914610fe3578063e04c83a714610ff8578063e1c7392a14611022578063e8f35cea1461103757610488565b8063c81b166214610ef9578063c8509d8114610f0e578063cf41984414610f93578063d9e6dae91461080d57610488565b8063aa7415f5116101bc578063b99328c511610180578063b99328c514610e30578063b9fd21e314610e69578063ba35ead614610e7e578063bbface1f14610e93578063bd46646114610ec657610488565b8063aa7415f514610cdf578063aa82dce114610d26578063aad5606314610d3b578063ab51bb9614610d50578063ac43175114610d6557610488565b80639dc09262116102035780639dc0926214610c76578063a1a11bf514610c8b578063a496fba214610ca0578063a78abc1614610cb5578063a7c9f02d14610cca57610488565b80639509b98014610bda57806396713da914610c135780639a854bbd14610c285780639a99b4f014610c3d57610488565b806359b9278911610345578063727be1f8116102cd578063831d65d111610291578063831d65d114610ac85780638525db0314610b4d5780638b87b21f146107625780638eff336c14610b8657806393ab703f14610bc557610488565b8063727be1f814610a2057806375d47a0a14610a4a5780637942fd0514610a5f578063799758b914610a745780637e434d5414610ab357610488565b80636e056520116103145780636e056520146108b55780636e47b482146109e157806370fd5bad146108a0578063718a8aa8146109f657806371d3086314610a0b57610488565b806359b92789146108615780635d499b1b1461088b578063613684751461080d57806366dea52a146108a057610488565b80633fd8b02f116103c85780634a3acdf4116103975780634a3acdf4146107f85780634bf6c8821461080d57806350432d321461082257806351b4dce31461083757806351e806721461084c57610488565b80633fd8b02f1461078d57806343756e5c146107a257806343a368b9146107b7578063493279b1146107cc57610488565b8063149d14d91161040f578063149d14d91461062157806328087028146106485780632ae454831461065d5780633d713223146106b15780633dffc3871461076257610488565b80630bee7a671461048d5780630e2374a5146104bb5780631182b875146104ec57806312234582146105e657610488565b36610488573415610486576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561049957600080fd5b506104a2611130565b6040805163ffffffff9092168252519081900360200190f35b3480156104c757600080fd5b506104d0611135565b604080516001600160a01b039092168252519081900360200190f35b3480156104f857600080fd5b506105716004803603604081101561050f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561053357600080fd5b82018360208201111561054557600080fd5b803590602001918460018302840111600160201b8311171561056657600080fd5b50909250905061113b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ab578181015183820152602001610593565b50505050905090810190601f1680156105d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105f257600080fd5b506104866004803603604081101561060957600080fd5b506001600160a01b0381358116916020013516611269565b34801561062d57600080fd5b50610636611363565b60408051918252519081900360200190f35b34801561065457600080fd5b506104d0611369565b34801561066957600080fd5b506106986004803603604081101561068057600080fd5b506001600160a01b038135811691602001351661136f565b6040805192835260208301919091528051918290030190f35b3480156106bd57600080fd5b506104d0600480360360208110156106d457600080fd5b810190602081018135600160201b8111156106ee57600080fd5b82018360208201111561070057600080fd5b803590602001918460018302840111600160201b8311171561072157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611393945050505050565b34801561076e57600080fd5b506107776113b7565b6040805160ff9092168252519081900360200190f35b34801561079957600080fd5b506106366113bc565b3480156107ae57600080fd5b506104d06113c2565b3480156107c357600080fd5b506106366113c8565b3480156107d857600080fd5b506107e16113d4565b6040805161ffff9092168252519081900360200190f35b34801561080457600080fd5b506106366113d9565b34801561081957600080fd5b506107776113df565b34801561082e57600080fd5b506106366113e4565b34801561084357600080fd5b506104d06113ef565b34801561085857600080fd5b506104d06113f5565b34801561086d57600080fd5b506104d06004803603602081101561088457600080fd5b50356113fb565b34801561089757600080fd5b50610636611416565b3480156108ac57600080fd5b5061077761141f565b6109cd600480360360808110156108cb57600080fd5b810190602081018135600160201b8111156108e557600080fd5b8201836020820111156108f757600080fd5b803590602001918460208302840111600160201b8311171561091857600080fd5b919390929091602081019035600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b91935091503567ffffffffffffffff16611424565b604080519115158252519081900360200190f35b3480156109ed57600080fd5b506104d06118f9565b348015610a0257600080fd5b506107776118ff565b348015610a1757600080fd5b50610636611904565b348015610a2c57600080fd5b506109cd60048036036020811015610a4357600080fd5b503561190a565b348015610a5657600080fd5b506104d061198b565b348015610a6b57600080fd5b50610777611991565b348015610a8057600080fd5b5061048660048036036060811015610a9757600080fd5b508035906001600160a01b036020820135169060400135611996565b348015610abf57600080fd5b506104d0611c46565b348015610ad457600080fd5b5061048660048036036040811015610aeb57600080fd5b60ff8235169190810190604081016020820135600160201b811115610b0f57600080fd5b820183602082011115610b2157600080fd5b803590602001918460018302840111600160201b83111715610b4257600080fd5b509092509050611c4c565b348015610b5957600080fd5b5061048660048036036040811015610b7057600080fd5b50803590602001356001600160a01b0316611d94565b348015610b9257600080fd5b5061048660048036036060811015610ba957600080fd5b508035906001600160a01b036020820135169060400135611efd565b348015610bd157600080fd5b50610636611f83565b348015610be657600080fd5b5061048660048036036040811015610bfd57600080fd5b506001600160a01b038135169060200135611f8a565b348015610c1f57600080fd5b50610777612147565b348015610c3457600080fd5b5061063661214c565b348015610c4957600080fd5b5061063660048036036040811015610c6057600080fd5b506001600160a01b038135169060200135612158565b348015610c8257600080fd5b506104d0612296565b348015610c9757600080fd5b506104d061229c565b348015610cac57600080fd5b506107776122a2565b348015610cc157600080fd5b506109cd6122a7565b348015610cd657600080fd5b506107776122b0565b6109cd60048036036080811015610cf557600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166122b5565b348015610d3257600080fd5b506104d0612335565b348015610d4757600080fd5b506104d061233b565b348015610d5c57600080fd5b506104a26122a2565b348015610d7157600080fd5b5061048660048036036040811015610d8857600080fd5b810190602081018135600160201b811115610da257600080fd5b820183602082011115610db457600080fd5b803590602001918460018302840111600160201b83111715610dd557600080fd5b919390929091602081019035600160201b811115610df257600080fd5b820183602082011115610e0457600080fd5b803590602001918460018302840111600160201b83111715610e2557600080fd5b509092509050612341565b348015610e3c57600080fd5b5061048660048036036040811015610e5357600080fd5b50803590602001356001600160a01b03166127e9565b348015610e7557600080fd5b50610636612869565b348015610e8a57600080fd5b50610636612873565b348015610e9f57600080fd5b5061063660048036036020811015610eb657600080fd5b50356001600160a01b0316612879565b348015610ed257600080fd5b5061063660048036036020811015610ee957600080fd5b50356001600160a01b031661288b565b348015610f0557600080fd5b506104d06128a6565b348015610f1a57600080fd5b5061048660048036036040811015610f3157600080fd5b60ff8235169190810190604081016020820135600160201b811115610f5557600080fd5b820183602082011115610f6757600080fd5b803590602001918460018302840111600160201b83111715610f8857600080fd5b5090925090506128ac565b348015610f9f57600080fd5b5061048660048036036040811015610fb657600080fd5b506001600160a01b038135811691602001351661297c565b348015610fda57600080fd5b506104d0612c50565b348015610fef57600080fd5b506104d0612c56565b34801561100457600080fd5b506109cd6004803603602081101561101b57600080fd5b5035612c5c565b34801561102e57600080fd5b50610486612cfc565b34801561104357600080fd5b506106366004803603602081101561105a57600080fd5b50356001600160a01b0316612d9c565b34801561107657600080fd5b50610777612dae565b34801561108b57600080fd5b50610777612db3565b3480156110a057600080fd5b50610777612db8565b3480156110b557600080fd5b506104d0612dbd565b3480156110ca57600080fd5b50610636612dc3565b3480156110df57600080fd5b50610636612dc9565b3480156110f457600080fd5b506105716004803603602081101561110b57600080fd5b50356001600160a01b0316612dd7565b34801561112757600080fd5b506104d0612efe565b606481565b61200181565b60005460609060ff16611183576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33612000146111c35760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff8416600214156112155761120e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0492505050565b9050611262565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b33612000146112a95760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b6001600160a01b0380831660009081526007602090815260408083209385168352929052208054611314576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b0380861692908716917f152fb15aa5d80f843e1e4bd5f2fc9161714f169945024decec7e84fb910fdd519181900360200190a350505050565b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b603881565b61a8c081565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661146a576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b8685146114a85760405162461bcd60e51b815260040180806020018281038252603b815260200180615357603b913960400191505060405180910390fd5b8683146114e65760405162461bcd60e51b815260040180806020018281038252603f815260200180615269603f913960400191505060405180910390fd5b426078018267ffffffffffffffff1610156115325760405162461bcd60e51b81526004018080602001828103825260248152602001806151e56024913960400191505060405180910390fd5b6402540be4003406156115765760405162461bcd60e51b815260040180806020018281038252604081526020018061545a6040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156115a9578160200160208202803683370190505b50905060005b84811015611684576402540be4008b8b838181106115c957fe5b90506020020135816115d757fe5b06156116145760405162461bcd60e51b815260040180806020018281038252603c8152602001806152a8603c913960400191505060405180910390fd5b6116398b8b8381811061162357fe5b905060200201358561302890919063ffffffff16565b93506116656402540be4008c8c8481811061165057fe5b9050602002013561308290919063ffffffff16565b82828151811061167157fe5b60209081029190910101526001016115af565b506001546116a99061169c908663ffffffff6130c416565b849063ffffffff61302816565b3410156116e75760405162461bcd60e51b81526004018080602001828103825260568152602001806154046056913960600191505060405180910390fd5b6116f7348463ffffffff61311d16565b9150611701615023565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036117c58461315f565b6117da876402540be40063ffffffff61308216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611838578181015183820152602001611820565b50505050905090810190601f1680156118655780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561188657600080fd5b505af115801561189a573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b6000336120011461194c5760405162461bcd60e51b815260040180806020018281038252603381526020018061513d6033913960400191505060405180910390fd5b8115611983576040516120019083156108fc029084906000818181858888f19350505050158015611981573d6000803e3d6000fd5b505b506001919050565b61100881565b600b81565b60005460ff166119db576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b3361300014611a1b5760405162461bcd60e51b815260040180806020018281038252602b81526020018061523e602b913960400191505060405180910390fd5b677ce66c50e2840000811115611a625760405162461bcd60e51b81526004018080602001828103825260358152602001806152096035913960400191505060405180910390fd5b60006221272160e91b8414611bcc576000848152600460205260409020546001600160a01b031680611ad5576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a35050611c41565b6001600160a01b038116600090815260026020526040902054611af8848261341a565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611b4357600080fd5b505afa158015611b57573d6000803e3d6000fd5b505050506040513d6020811015611b6d57600080fd5b50511015611bb9576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b611bc58683858861345a565b5050611c3f565b611be1826402540be40063ffffffff6130c416565b905080471015611c2f576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6000611c3d8582848761345a565b505b505b505050565b61200381565b60005460ff16611c91576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b3361200014611cd15760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff831660031415611d2157611d1c82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506134f492505050565b611c41565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b3361300014611dd45760405162461bcd60e51b815260040180806020018281038252602b81526020018061523e602b913960400191505060405180910390fd5b60006221272160e91b8314611e3f57506000828152600460205260409020546001600160a01b031680611e3f576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526007602090815260408083209386168352929052208054611eaa576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814611f3d5760405162461bcd60e51b81526004018080602001828103825260238152602001806153c16023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc457600080fd5b505afa158015611fd8573d6000803e3d6000fd5b505050506040513d6020811015611fee57600080fd5b50516001600160a01b0316331461204c576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b6000821161209a576040805162461bcd60e51b81526020600482015260166024820152751e995c9bc81b1a5b5a5d081b9bdd08185b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b0383166000908152600360205260409020546120f0576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b038316600081815260066020908152604091829020859055815185815291513393927f9df3a90730dbf23b5cc18dbbd5f4af3fa94a0dffb6ff6841f98a9a9a6ac626a892908290030190a3505050565b600981565b677ce66c50e284000081565b6000805460ff1661219e576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33611005146121de5760405162461bcd60e51b815260040180806020018281038252602f815260200180615170602f913960400191505060405180910390fd5b60004783106121ed57476121ef565b825b9050670de0b6b3a764000081111561220b576000915050612290565b801561228d576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015612247573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff166122fb576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200281565b61300081565b33611007146123815760405162461bcd60e51b815260040180806020018281038252602e815260200180615305602e913960400191505060405180910390fd5b602081146123d6576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b8114156124de576020820151670de0b6b3a7640000811180159061248557506402540be4008106155b6124d6576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155612754565b61255287878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601781527f6c617267655472616e736665724c6f636b506572696f64000000000000000000602082015291506135509050565b156125ee57604080516020601f87018190048102820181019092528581526000916125959188888083850183828082843760009201919091525061363792505050565b905062093a808111156125e6576040805162461bcd60e51b81526020600482015260146024820152736c6f636b20706572696f6420746f6f206c6f6e6760601b604482015290519081900360640190fd5b600555612754565b61265a87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526015815274189b9893185c99d9551c985b9cd9995c931a5b5a5d605a1b602082015291506135509050565b1561271757604080516020601f870181900481028201810190925285815260009161269d9188888083850183828082843760009201919091525061363792505050565b905068056bc75e2d631000008110156126e75760405162461bcd60e51b815260040180806020018281038252602281526020018061519f6022913960400191505060405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855612754565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b33611008146128295760405162461bcd60e51b81526004018080602001828103825260238152602001806153c16023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b039290921683526003815281832083905560029052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff166128f1576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33612000146129315760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff831660031415611d2157611d1c82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061363c92505050565b60085460ff16600214156129c8576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054612a40576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015612a99576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516612b0c576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114612afc576040519150601f19603f3d011682016040523d82523d6000602084013e612b01565b606091505b505080915050612b9f565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612b6f57600080fd5b5087f1158015612b83573d6000803e3d6000fd5b50505050506040513d6020811015612b9a57600080fd5b505190505b80612bf1576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b61200481565b60003361200214612cb4576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710612cf4576040516120029083156108fc029084906000818181858888f19350505050158015612cea573d6000803e3d6000fd5b50600190506113b2565b506000919050565b60005460ff1615612d54576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b601181565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015612e6757828160ff1681518110612e3b57fe5b01602001516001600160f81b03191615612e5a57816001019150612e5f565b612e67565b600101612e20565b5060608160ff166040519080825280601f01601f191660200182016040528015612e98576020820181803683370190505b50905060005b8260ff168160ff161015612ef457838160ff1681518110612ebb57fe5b602001015160f81c60f81b828260ff1681518110612ed557fe5b60200101906001600160f81b031916908160001a905350600101612e9e565b5095945050505050565b61100481565b6060612f0e61506f565b6000612f1984613733565b9150915080612f6f576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b6000612f7a83613872565b905063ffffffff81161561300e576040808401516020808601516001600160a01b03166000908152600290915291822054612fb59190613bd8565b9050612fbf6150a4565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061300281613c11565b955050505050506113b2565b505060408051600081526020810190915291506113b29050565b60008282018381101561228d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061228d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ced565b6000826130d357506000612290565b828202828482816130e057fe5b041461228d5760405162461bcd60e51b81526004018080602001828103825260218152602001806152e46021913960400191505060405180910390fd5b600061228d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d8f565b60408051600680825260e08201909252606091829190816020015b606081526020019060019003908161317a575050835190915061319c90613de9565b816000815181106131a957fe5b60200260200101819052506131ca83602001516001600160a01b0316613dfc565b816001815181106131d757fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561322257816020015b606081526020019060019003908161320d5790505b50905060005b8281101561326f576132508660400151828151811061324357fe5b6020026020010151613de9565b82828151811061325c57fe5b6020908102919091010152600101613228565b5061327981613e1f565b8360028151811061328657fe5b60200260200101819052506060826040519080825280602002602001820160405280156132c757816020015b60608152602001906001900390816132b25790505b50905060005b8381101561331d576132fe876060015182815181106132e857fe5b60200260200101516001600160a01b0316613dfc565b82828151811061330a57fe5b60209081029190910101526001016132cd565b5061332781613e1f565b8460038151811061333457fe5b602002602001018190525060608360405190808252806020026020018201604052801561337557816020015b60608152602001906001900390816133605790505b50905060005b848110156133b557613396886080015182815181106132e857fe5b8282815181106133a257fe5b602090810291909101015260010161337b565b506133bf81613e1f565b856004815181106133cc57fe5b60200260200101819052506133ee8760a0015167ffffffffffffffff16613de9565b856005815181106133fb57fe5b602002602001018190525061340f85613e1f565b979650505050505050565b600060088211156134435761343c836007198401600a0a63ffffffff6130c416565b9050612290565b61228d836008849003600a0a63ffffffff61308216565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054613491908463ffffffff61302816565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b6134fc6150cb565b600061350783613ea9565b91509150806135475760405162461bcd60e51b81526004018080602001828103825260248152602001806153336024913960400191505060405180910390fd5b611c4182614074565b6000816040516020018082805190602001908083835b602083106135855780518252601f199092019160209182019101613566565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106135f35780518252601f1990920191602091820191016135d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b613644615023565b600061364f836144f8565b915091508061368f5760405162461bcd60e51b81526004018080602001828103825260248152602001806151c16024913960400191505060405180910390fd5b6136976150cb565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015613718576136f5856040015182815181106136e757fe5b60200260200101518361341a565b8560400151828151811061370557fe5b60209081029190910101526001016136c7565b506080840151604083015260056060830152611c3d82614074565b61373b61506f565b600061374561506f565b61374d615102565b61375e6137598661475c565b614781565b90506000805b61376d836147cb565b15613865578061378f57613788613783846147ec565b61483a565b845261385d565b80600114156137bc576137a96137a4846147ec565b6148f1565b6001600160a01b0316602085015261385d565b80600214156137db576137d1613783846147ec565b604085015261385d565b8060031415613803576137f06137a4846147ec565b6001600160a01b0316606085015261385d565b806004141561382b576138186137a4846147ec565b6001600160a01b0316608085015261385d565b806005141561385857613840613783846147ec565b67ffffffffffffffff1660a08501526001915061385d565b613865565b600101613764565b5091935090915050915091565b60208101516000906001600160a01b03166139b6578160a0015167ffffffffffffffff164211156138a5575060016113b2565b81604001514710156138b9575060036113b2565b6138c28261490b565b61393757606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d806000811461391d576040519150601f19603f3d011682016040523d82523d6000602084013e613922565b606091505b50509050806139355750600490506113b2565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060006113b2565b8160a0015167ffffffffffffffff164211156139d4575060016113b2565b81516020808401516001600160a01b031660009081526003909152604090205414613a01575060026113b2565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015613a5157600080fd5b5086fa158015613a65573d6000803e3d6000fd5b50505050506040513d6020811015613a7c57600080fd5b50516040840151909150811015613a975750600390506113b2565b613aa08361490b565b613b5757600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015613b1557600080fd5b5087f1158015613b29573d6000803e3d6000fd5b50505050506040513d6020811015613b4057600080fd5b5051905080613b555750600591506113b29050565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a150600090506113b2565b60006008821115613bfa5761343c836007198401600a0a63ffffffff61308216565b61228d836008849003600a0a63ffffffff6130c416565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613c2c5750508351909150613c4e90613de9565b81600081518110613c5b57fe5b6020026020010181905250613c738360200151613de9565b81600181518110613c8057fe5b6020026020010181905250613ca183604001516001600160a01b0316613dfc565b81600281518110613cae57fe5b6020026020010181905250613ccc836060015163ffffffff16613de9565b81600381518110613cd957fe5b602002602001018190525061126281613e1f565b60008183613d795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d3e578181015183820152602001613d26565b50505050905090810190601f168015613d6b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d8557fe5b0495945050505050565b60008184841115613de15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d3e578181015183820152602001613d26565b505050900390565b6060612290613df783614a79565b614b5f565b60408051600560a21b831860148201526034810190915260609061126281614b5f565b6060815160001415613e4057506040805160008152602081019091526113b2565b606082600081518110613e4f57fe5b602002602001015190506000600190505b8351811015613e9057613e8682858381518110613e7957fe5b6020026020010151614bb1565b9150600101613e60565b50611262613ea3825160c060ff16614c2e565b82614bb1565b613eb16150cb565b6000613ebb6150cb565b613ec3615102565b613ecf6137598661475c565b90506000805b613ede836147cb565b156138655780613f0457613ef46137a4846147ec565b6001600160a01b0316845261406c565b8060011415613fa5576060613f20613f1b856147ec565b614d26565b90508051604051908082528060200260200182016040528015613f4d578160200160208202803683370190505b50602086015260005b8151811015613f9e57613f7b828281518110613f6e57fe5b602002602001015161483a565b86602001518281518110613f8b57fe5b6020908102919091010152600101613f56565b505061406c565b8060021415614047576060613fbc613f1b856147ec565b90508051604051908082528060200260200182016040528015613fe9578160200160208202803683370190505b50604086015260005b8151811015613f9e5761401782828151811061400a57fe5b60200260200101516148f1565b8660400151828151811061402757fe5b6001600160a01b0390921660209283029190910190910152600101613ff2565b80600314156138585761405c613783846147ec565b63ffffffff166060850152600191505b600101613ed5565b80516001600160a01b031661429e5760005b816020015151811015614298576000826040015182815181106140a557fe5b60200260200101516001600160a01b0316612710846020015184815181106140c957fe5b60209081029190910101516040516000818181858888f193505050503d8060008114614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b50509050806141d9577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061415557fe5b60200260200101518560200151858151811061416d57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a161428f565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061420f57fe5b60200260200101518560200151858151811061422757fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101614086565b506144f5565b60005b8160200151518110156144f357600082600001516001600160a01b031663a9059cbb61c350856040015185815181106142d657fe5b6020026020010151866020015186815181106142ee57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561434557600080fd5b5087f1158015614359573d6000803e3d6000fd5b50505050506040513d602081101561437057600080fd5b505190508015614434577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106143b057fe5b6020026020010151856020015185815181106143c857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16144ea565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061446a57fe5b60200260200101518560200151858151811061448257fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016142a1565b505b50565b614500615023565b600061450a615023565b614512615102565b61451e6137598661475c565b90506000805b61452d836147cb565b15613865578061454a57614543613783846147ec565b8452614754565b80600114156145725761455f6137a4846147ec565b6001600160a01b03166020850152614754565b8060021415614601576060614589613f1b856147ec565b905080516040519080825280602002602001820160405280156145b6578160200160208202803683370190505b50604086015260005b81518110156145fa576145d7828281518110613f6e57fe5b866040015182815181106145e757fe5b60209081029190910101526001016145bf565b5050614754565b8060031415614696576060614618613f1b856147ec565b90508051604051908082528060200260200182016040528015614645578160200160208202803683370190505b50606086015260005b81518110156145fa5761466682828151811061400a57fe5b8660600151828151811061467657fe5b6001600160a01b039092166020928302919091019091015260010161464e565b806004141561472b5760606146ad613f1b856147ec565b905080516040519080825280602002602001820160405280156146da578160200160208202803683370190505b50608086015260005b81518110156145fa576146fb82828151811061400a57fe5b8660800151828151811061470b57fe5b6001600160a01b03909216602092830291909101909101526001016146e3565b806005141561385857614740613783846147ec565b67ffffffffffffffff1660a0850152600191505b600101614524565b614764615122565b506040805180820190915281518152602082810190820152919050565b614789615102565b61479282614df7565b61479b57600080fd5b60006147aa8360200151614e31565b60208085015160408051808201909152868152920190820152915050919050565b60006147d5615122565b505080518051602091820151919092015191011190565b6147f4615122565b6147fd826147cb565b61480657600080fd5b6020820151600061481682614e94565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061484f57508151602110155b61485857600080fd5b60006148678360200151614e31565b905080836000015110156148c2576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156148e857826020036101000a820491505b50949350505050565b805160009060151461490257600080fd5b6122908261483a565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8541580156149445750600554155b156149865760008052600660205269021e19e0c9bab24000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85561a8c06005555b6020808301516001600160a01b03166000908152600690915260409020548015806149b45750808360400151105b156149c35760009150506113b2565b6020808401516001600160a01b039081166000908152600783526040808220606088015190931682529190925290819020908401518154614a099163ffffffff61302816565b8155600554420160018201819055606085015160208087015160408089015181519081529283019490945283516001600160a01b039384169493909116927f3fb83143cd331170da18fb1e8564d97e8ec39264b6ecb1ba248ea7596ab07258928290030190a35060019392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614abd57506018614ae1565b6fffffffffffffffffffffffffffffffff198416614add57506010614ae1565b5060005b6020811015614b1757818181518110614af657fe5b01602001516001600160f81b03191615614b0f57614b17565b600101614ae1565b60008160200390506060816040519080825280601f01601f191660200182016040528015614b4c576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015614b915750607f60f81b82600081518110614b7f57fe5b01602001516001600160f81b03191611155b15614b9d5750806113b2565b612290614baf8351608060ff16614c2e565b835b6060806040519050835180825260208201818101602087015b81831015614be2578051835260209283019201614bca565b50855184518101855292509050808201602086015b81831015614c0f578051835260209283019201614bf7565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614c7e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614cd85782840160f81b81600081518110614cba57fe5b60200101906001600160f81b031916908160001a9053509050612290565b6060614ce385614a79565b90508381510160370160f81b82600081518110614cfc57fe5b60200101906001600160f81b031916908160001a905350614d1d8282614bb1565b95945050505050565b6060614d3182614df7565b614d3a57600080fd5b6000614d4583614fc7565b9050606081604051908082528060200260200182016040528015614d8357816020015b614d70615122565b815260200190600190039081614d685790505b5090506000614d958560200151614e31565b60208601510190506000805b84811015614dec57614db283614e94565b9150604051806040016040528083815260200184815250848281518110614dd557fe5b602090810291909101015291810191600101614da1565b509195945050505050565b8051600090614e08575060006113b2565b6020820151805160001a9060c0821015614e27576000925050506113b2565b5060019392505050565b8051600090811a6080811015614e4b5760009150506113b2565b60b8811080614e66575060c08110801590614e66575060f881105b15614e755760019150506113b2565b60c0811015614e895760b5190190506113b2565b60f5190190506113b2565b80516000908190811a6080811015614eaf5760019150614fc0565b60b8811015614ec457607e1981019150614fc0565b60c0811015614f3e57600060b78203600186019550806020036101000a865104915060018101820193505080831015614f38576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614fc0565b60f8811015614f535760be1981019150614fc0565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614fbe576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090614fd8575060006113b2565b60008090506000614fec8460200151614e31565b602085015185519181019250015b8082101561501a5761500b82614e94565b82019150826001019250614ffa565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280615115615122565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374626e62206c61726765207472616e73666572206c696d697420746f6f20736d616c6c756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c4c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea164736f6c6343000604000a" + "code": "0x6080604052600436106104405760003560e01c80639509b98011610234578063c81b16621161012e578063ebf71d53116100b6578063fb063e8f1161007a578063fb063e8f1461104e578063fc1a598f14611063578063fc3e590814610cca578063fd6a687914611096578063ff9c0027146108a057610488565b8063ebf71d5314610fe5578063f014847214610ffa578063f1fad1041461100f578063f9a2bbc714611024578063fa9e91591461103957610488565b8063dc927faf116100fd578063dc927faf14610f49578063df8079e914610f5e578063e04c83a714610f73578063e1c7392a14610f9d578063e8f35cea14610fb257610488565b8063c81b166214610ef9578063c8509d8114610ac8578063cf41984414610f0e578063d9e6dae91461080d57610488565b8063aa7415f5116101bc578063b99328c511610180578063b99328c514610e30578063b9fd21e314610e69578063ba35ead614610e7e578063bbface1f14610e93578063bd46646114610ec657610488565b8063aa7415f514610cdf578063aa82dce114610d26578063aad5606314610d3b578063ab51bb9614610d50578063ac43175114610d6557610488565b80639dc09262116102035780639dc0926214610c76578063a1a11bf514610c8b578063a496fba214610ca0578063a78abc1614610cb5578063a7c9f02d14610cca57610488565b80639509b98014610bda57806396713da914610c135780639a854bbd14610c285780639a99b4f014610c3d57610488565b806359b9278911610345578063727be1f8116102cd578063831d65d111610291578063831d65d114610ac85780638525db0314610b4d5780638b87b21f146107625780638eff336c14610b8657806393ab703f14610bc557610488565b8063727be1f814610a2057806375d47a0a14610a4a5780637942fd0514610a5f578063799758b914610a745780637e434d5414610ab357610488565b80636e056520116103145780636e056520146108b55780636e47b482146109e157806370fd5bad146108a0578063718a8aa8146109f657806371d3086314610a0b57610488565b806359b92789146108615780635d499b1b1461088b578063613684751461080d57806366dea52a146108a057610488565b80633fd8b02f116103c85780634a3acdf4116103975780634a3acdf4146107f85780634bf6c8821461080d57806350432d321461082257806351b4dce31461083757806351e806721461084c57610488565b80633fd8b02f1461078d57806343756e5c146107a257806343a368b9146107b7578063493279b1146107cc57610488565b8063149d14d91161040f578063149d14d91461062157806328087028146106485780632ae454831461065d5780633d713223146106b15780633dffc3871461076257610488565b80630bee7a671461048d5780630e2374a5146104bb5780631182b875146104ec57806312234582146105e657610488565b36610488573415610486576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561049957600080fd5b506104a26110ab565b6040805163ffffffff9092168252519081900360200190f35b3480156104c757600080fd5b506104d06110b0565b604080516001600160a01b039092168252519081900360200190f35b3480156104f857600080fd5b506105716004803603604081101561050f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561053357600080fd5b82018360208201111561054557600080fd5b803590602001918460018302840111600160201b8311171561056657600080fd5b5090925090506110b6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ab578181015183820152602001610593565b50505050905090810190601f1680156105d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105f257600080fd5b506104866004803603604081101561060957600080fd5b506001600160a01b03813581169160200135166110fe565b34801561062d57600080fd5b50610636611178565b60408051918252519081900360200190f35b34801561065457600080fd5b506104d061117e565b34801561066957600080fd5b506106986004803603604081101561068057600080fd5b506001600160a01b0381358116916020013516611184565b6040805192835260208301919091528051918290030190f35b3480156106bd57600080fd5b506104d0600480360360208110156106d457600080fd5b810190602081018135600160201b8111156106ee57600080fd5b82018360208201111561070057600080fd5b803590602001918460018302840111600160201b8311171561072157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506111a8945050505050565b34801561076e57600080fd5b506107776111cc565b6040805160ff9092168252519081900360200190f35b34801561079957600080fd5b506106366111d1565b3480156107ae57600080fd5b506104d06111d7565b3480156107c357600080fd5b506106366111dd565b3480156107d857600080fd5b506107e16111e9565b6040805161ffff9092168252519081900360200190f35b34801561080457600080fd5b506106366111ee565b34801561081957600080fd5b506107776111f4565b34801561082e57600080fd5b506106366111f9565b34801561084357600080fd5b506104d0611204565b34801561085857600080fd5b506104d061120a565b34801561086d57600080fd5b506104d06004803603602081101561088457600080fd5b5035611210565b34801561089757600080fd5b5061063661122b565b3480156108ac57600080fd5b50610777611234565b6109cd600480360360808110156108cb57600080fd5b810190602081018135600160201b8111156108e557600080fd5b8201836020820111156108f757600080fd5b803590602001918460208302840111600160201b8311171561091857600080fd5b919390929091602081019035600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b91935091503567ffffffffffffffff16611239565b604080519115158252519081900360200190f35b3480156109ed57600080fd5b506104d061127f565b348015610a0257600080fd5b50610777611285565b348015610a1757600080fd5b5061063661128a565b348015610a2c57600080fd5b506109cd60048036036020811015610a4357600080fd5b5035611290565b348015610a5657600080fd5b506104d06112cc565b348015610a6b57600080fd5b506107776112d2565b348015610a8057600080fd5b5061048660048036036060811015610a9757600080fd5b508035906001600160a01b0360208201351690604001356112d7565b348015610abf57600080fd5b506104d0611587565b348015610ad457600080fd5b5061048660048036036040811015610aeb57600080fd5b60ff8235169190810190604081016020820135600160201b811115610b0f57600080fd5b820183602082011115610b2157600080fd5b803590602001918460018302840111600160201b83111715610b4257600080fd5b50909250905061158d565b348015610b5957600080fd5b5061048660048036036040811015610b7057600080fd5b50803590602001356001600160a01b03166115d2565b348015610b9257600080fd5b5061048660048036036060811015610ba957600080fd5b508035906001600160a01b03602082013516906040013561173b565b348015610bd157600080fd5b5061063661177b565b348015610be657600080fd5b5061048660048036036040811015610bfd57600080fd5b506001600160a01b038135169060200135611782565b348015610c1f57600080fd5b50610777611844565b348015610c3457600080fd5b50610636611849565b348015610c4957600080fd5b5061063660048036036040811015610c6057600080fd5b506001600160a01b038135169060200135611855565b348015610c8257600080fd5b506104d0611993565b348015610c9757600080fd5b506104d0611999565b348015610cac57600080fd5b5061077761199f565b348015610cc157600080fd5b506109cd6119a4565b348015610cd657600080fd5b506107776119ad565b6109cd60048036036080811015610cf557600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16611239565b348015610d3257600080fd5b506104d06119b2565b348015610d4757600080fd5b506104d06119b8565b348015610d5c57600080fd5b506104a261199f565b348015610d7157600080fd5b5061048660048036036040811015610d8857600080fd5b810190602081018135600160201b811115610da257600080fd5b820183602082011115610db457600080fd5b803590602001918460018302840111600160201b83111715610dd557600080fd5b919390929091602081019035600160201b811115610df257600080fd5b820183602082011115610e0457600080fd5b803590602001918460018302840111600160201b83111715610e2557600080fd5b5090925090506119be565b348015610e3c57600080fd5b5061048660048036036040811015610e5357600080fd5b50803590602001356001600160a01b031661173b565b348015610e7557600080fd5b506106366119fe565b348015610e8a57600080fd5b50610636611a08565b348015610e9f57600080fd5b5061063660048036036020811015610eb657600080fd5b50356001600160a01b0316611a0e565b348015610ed257600080fd5b5061063660048036036020811015610ee957600080fd5b50356001600160a01b0316611a20565b348015610f0557600080fd5b506104d0611a3b565b348015610f1a57600080fd5b5061048660048036036040811015610f3157600080fd5b506001600160a01b0381358116916020013516611a41565b348015610f5557600080fd5b506104d0611d15565b348015610f6a57600080fd5b506104d0611d1b565b348015610f7f57600080fd5b506109cd60048036036020811015610f9657600080fd5b5035611d21565b348015610fa957600080fd5b50610486611dc1565b348015610fbe57600080fd5b5061063660048036036020811015610fd557600080fd5b50356001600160a01b0316611e61565b348015610ff157600080fd5b50610777611e73565b34801561100657600080fd5b50610777611e78565b34801561101b57600080fd5b50610777611e7d565b34801561103057600080fd5b506104d0611e82565b34801561104557600080fd5b50610636611e88565b34801561105a57600080fd5b50610636611e8e565b34801561106f57600080fd5b506105716004803603602081101561108657600080fd5b50356001600160a01b0316611e9c565b3480156110a257600080fd5b506104d0611fc3565b606481565b61200181565b60005460609060ff166110fe576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b336120001461113e5760405162461bcd60e51b815260040180806020018281038252602f815260200180612319602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b603881565b61a8c081565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661113e576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b61100581565b601081565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b600b81565b60005460ff1661131c576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b336130001461135c5760405162461bcd60e51b815260040180806020018281038252602b81526020018061229f602b913960400191505060405180910390fd5b677ce66c50e28400008111156113a35760405162461bcd60e51b815260040180806020018281038252603581526020018061226a6035913960400191505060405180910390fd5b60006221272160e91b841461150d576000848152600460205260409020546001600160a01b031680611416576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a35050611582565b6001600160a01b0381166000908152600260205260409020546114398482611fc9565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561148457600080fd5b505afa158015611498573d6000803e3d6000fd5b505050506040513d60208110156114ae57600080fd5b505110156114fa576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61150686838588612009565b5050611580565b611522826402540be40063ffffffff6120a316565b905080471015611570576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600061157e85828487612009565b505b505b505050565b61200381565b60005460ff166110fe576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b33613000146116125760405162461bcd60e51b815260040180806020018281038252602b81526020018061229f602b913960400191505060405180910390fd5b60006221272160e91b831461167d57506000828152600460205260409020546001600160a01b03168061167d576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b03808216600090815260076020908152604080832093861683529290522080546116e8576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b336110081461113e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123486023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156117bc57600080fd5b505afa1580156117d0573d6000803e3d6000fd5b505050506040513d60208110156117e657600080fd5b50516001600160a01b0316331461113e576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b600981565b677ce66c50e284000081565b6000805460ff1661189b576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b33611005146118db5760405162461bcd60e51b815260040180806020018281038252602f81526020018061223b602f913960400191505060405180910390fd5b60004783106118ea57476118ec565b825b9050670de0b6b3a764000081111561190857600091505061198d565b801561198a576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611944573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b61200281565b61300081565b336110071461113e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806122eb602e913960400191505060405180910390fd5b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff1660021415611a8d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054611b05576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015611b5e576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516611bd1576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114611bc1576040519150601f19603f3d011682016040523d82523d6000602084013e611bc6565b606091505b505080915050611c64565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015611c3457600080fd5b5087f1158015611c48573d6000803e3d6000fd5b50505050506040513d6020811015611c5f57600080fd5b505190505b80611cb6576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b61200481565b60003361200214611d79576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710611db9576040516120029083156108fc029084906000818181858888f19350505050158015611daf573d6000803e3d6000fd5b50600190506111c7565b506000919050565b60005460ff1615611e19576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b601181565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015611f2c57828160ff1681518110611f0057fe5b01602001516001600160f81b03191615611f1f57816001019150611f24565b611f2c565b600101611ee5565b5060608160ff166040519080825280601f01601f191660200182016040528015611f5d576020820181803683370190505b50905060005b8260ff168160ff161015611fb957838160ff1681518110611f8057fe5b602001015160f81c60f81b828260ff1681518110611f9a57fe5b60200101906001600160f81b031916908160001a905350600101611f63565b5095945050505050565b61100481565b60006008821115611ff257611feb836007198401600a0a63ffffffff6120a316565b905061198d565b61198a836008849003600a0a63ffffffff6120fc16565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054612040908463ffffffff61213e16565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b6000826120b25750600061198d565b828202828482816120bf57fe5b041461198a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ca6021913960400191505060405180910390fd5b600061198a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612198565b60008282018381101561198a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081836122245760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121e95781810151838201526020016121d1565b50505050905090810190601f1680156122165780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161223057fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001005": { "balance": "0x0", - "code": "0x6080604052600436106103545760003560e01c80637e434d54116101c6578063bd4cc830116100f7578063e75d72c711610095578063f9a2bbc71161006f578063f9a2bbc7146109a2578063fc3e5908146109b7578063fd6a6879146109cc578063fdd31fcd146109e15761035b565b8063e75d72c714610930578063e89a302014610963578063f1fad1041461098d5761035b565b8063dc927faf116100d1578063dc927faf146108dc578063dcae76ab146108f1578063df8079e914610906578063e1c7392a1461091b5761035b565b8063bd4cc83014610888578063c81b1662146108b2578063d0ab528a146108c75761035b565b8063a7c6a59d11610164578063ab51bb961161013e578063ab51bb9614610763578063ac43175114610778578063ace9fcc214610849578063af4006811461085e5761035b565b8063a7c6a59d14610724578063aa82dce114610739578063aad560631461074e5761035b565b80639dc09262116101a05780639dc09262146106d0578063a1a11bf5146106e5578063a3c3c0ad146106fa578063a78abc161461070f5761035b565b80637e434d5414610673578063930e1b091461068857806396713da9146106bb5761035b565b806343756e5c116102a05780636f93d2e61161023e57806374f2272d1161021857806374f2272d1461061f57806375d47a0a146106345780637942fd05146106495780637e146cc51461065e5761035b565b80636f93d2e61461059657806370fd5bad146105f5578063718a8aa81461060a5761035b565b806351b4dce31161027a57806351b4dce31461054257806351e8067214610557578063541333071461056c5780636e47b482146105815761035b565b806343756e5c146104ec578063493279b1146105015780634bf6c8821461052d5761035b565b806312950c461161030d57806328087028116102e757806328087028146104795780633a975612146103605780633dffc3871461048e57806340bb43c0146104b95761035b565b806312950c46146104255780631b20087c1461043a5780631c6433121461044f5761035b565b8063081e9d131461036057806308f2ec0614610387578063093f2fc41461039c5780630bee7a67146103b15780630e2374a5146103df57806310e06a76146104105761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610375610a14565b60408051918252519081900360200190f35b34801561039357600080fd5b50610375610a19565b3480156103a857600080fd5b50610375610a1e565b3480156103bd57600080fd5b506103c6610a23565b6040805163ffffffff9092168252519081900360200190f35b3480156103eb57600080fd5b506103f4610a28565b604080516001600160a01b039092168252519081900360200190f35b34801561041c57600080fd5b50610375610a2e565b34801561043157600080fd5b50610375610a34565b34801561044657600080fd5b50610375610a3a565b34801561045b57600080fd5b506103f46004803603602081101561047257600080fd5b5035610a40565b34801561048557600080fd5b506103f4610a67565b34801561049a57600080fd5b506104a3610a14565b6040805160ff9092168252519081900360200190f35b3480156104c557600080fd5b50610375600480360360208110156104dc57600080fd5b50356001600160a01b0316610a6d565b3480156104f857600080fd5b506103f4610a7f565b34801561050d57600080fd5b50610516610a85565b6040805161ffff9092168252519081900360200190f35b34801561053957600080fd5b506104a3610a8a565b34801561054e57600080fd5b506103f4610a8f565b34801561056357600080fd5b506103f4610a95565b34801561057857600080fd5b50610375610a23565b34801561058d57600080fd5b506103f4610a9b565b3480156105a257600080fd5b506105e1600480360360808110156105b957600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610aa1565b604080519115158252519081900360200190f35b34801561060157600080fd5b506104a3610f33565b34801561061657600080fd5b506104a3610f38565b34801561062b57600080fd5b50610375610f3d565b34801561064057600080fd5b506103f4610f43565b34801561065557600080fd5b506104a3610f49565b34801561066a57600080fd5b50610375610f4e565b34801561067f57600080fd5b506103f4610f53565b34801561069457600080fd5b50610375600480360360208110156106ab57600080fd5b50356001600160a01b0316610f59565b3480156106c757600080fd5b506104a3610f6b565b3480156106dc57600080fd5b506103f4610f70565b3480156106f157600080fd5b506103f4610f76565b34801561070657600080fd5b50610375610f7c565b34801561071b57600080fd5b506105e1610f82565b34801561073057600080fd5b50610375610f8b565b34801561074557600080fd5b506103f4610f91565b34801561075a57600080fd5b506103f4610f97565b34801561076f57600080fd5b506103c6610f9d565b34801561078457600080fd5b506108476004803603604081101561079b57600080fd5b8101906020810181356401000000008111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111640100000000831117156107ea57600080fd5b91939092909160208101903564010000000081111561080857600080fd5b82018360208201111561081a57600080fd5b8035906020019184600183028401116401000000008311171561083c57600080fd5b509092509050610fa2565b005b34801561085557600080fd5b506103756116f0565b34801561086a57600080fd5b506103756004803603602081101561088157600080fd5b50356116f6565b34801561089457600080fd5b50610375600480360360208110156108ab57600080fd5b5035611751565b3480156108be57600080fd5b506103f461176a565b3480156108d357600080fd5b50610375611770565b3480156108e857600080fd5b506103f4611776565b3480156108fd57600080fd5b5061037561177c565b34801561091257600080fd5b506103f4611782565b34801561092757600080fd5b50610847611788565b34801561093c57600080fd5b506108476004803603602081101561095357600080fd5b50356001600160a01b0316611851565b34801561096f57600080fd5b506103f46004803603602081101561098657600080fd5b50356119aa565b34801561099957600080fd5b506104a36119b7565b3480156109ae57600080fd5b506103f46119bc565b3480156109c357600080fd5b506104a36119c2565b3480156109d857600080fd5b506103f46119c7565b3480156109ed57600080fd5b5061037560048036036020811015610a0457600080fd5b50356001600160a01b03166119cd565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b60068181548110610a4d57fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff16610af9576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361200014610b395760405162461bcd60e51b815260040180806020018281038252602f815260200180612550602f913960400191505060405180910390fd5b60008215610bec576110026001600160a01b0316639a99b4f0611005610b6a600e54886119df90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b505050506040513d6020811015610be357600080fd5b50519050610cfb565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610c3657600080fd5b505af1158015610c4a573d6000803e3d6000fd5b505050506040513d6020811015610c6057600080fd5b5051600e5490915015610cfb57600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610cf89161100291639a99b4f0916044808201926020929091908290030181600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b505050506040513d6020811015610ce957600080fd5b5051829063ffffffff6119df16565b90505b600c805460010190556000610d0f82611a42565b600954909150610d25908263ffffffff6119df16565b600955600a54610d4d908290610d41908563ffffffff6119df16565b9063ffffffff611a6b16565b600a556001600160a01b038716600090815260056020526040902054610db957600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610e3757600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610f2657600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610eb1611aad565b90506000610ebd611d9d565b6001600160a01b0389166000908152600d6020526040902054909150610efb908290610eef908563ffffffff6119df16565b9063ffffffff6119df16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b601081565b60035481565b61100881565b600b81565b600581565b61200381565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b3361100714610fe25760405162461bcd60e51b815260040180806020018281038252602e815260200180612495602e913960400191505060405180910390fd5b60005460ff166110235760405162461bcd60e51b81526004018080602001828103825260218152602001806124c36021913960400191505060405180910390fd5b61109784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c6500602082015291506120249050565b1561116457602081146110db5760405162461bcd60e51b815260040180806020018281038252603281526020018061257f6032913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111199185858083850183828082843760009201919091525061210b92505050565b905060025481111561115c5760405162461bcd60e51b815260040180806020018281038252606081526020018061236e6060913960600191505060405180910390fd5b60015561165e565b6111bd84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506124736020830139612024565b1561129557602081146112015760405162461bcd60e51b815260040180806020018281038252602e815260200180612424602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161123f9185858083850183828082843760009201919091525061210b92505050565b9050801580159061125257506001548110155b61128d5760405162461bcd60e51b815260040180806020018281038252606c8152602001806124e4606c913960800191505060405180910390fd5b60025561165e565b61130984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c65000000000000602082015291506120249050565b156113d6576020811461134d5760405162461bcd60e51b815260040180806020018281038252602e815260200180612424602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161138b9185858083850183828082843760009201919091525061210b92505050565b90506004548111156113ce5760405162461bcd60e51b81526004018080602001828103825260568152602001806123ce6056913960600191505060405180910390fd5b60035561165e565b61144a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72000000602082015291506120249050565b15611522576020811461148e5760405162461bcd60e51b815260040180806020018281038252602e815260200180612424602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916114cc9185858083850183828082843760009201919091525061210b92505050565b905080158015906114df57506003548110155b61151a5760405162461bcd60e51b81526004018080602001828103825260618152602001806122df6061913960800191505060405180910390fd5b60045561165e565b61159684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e740000000000602082015291506120249050565b1561162157602081146115da5760405162461bcd60e51b815260040180806020018281038252602e815260200180612340602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916116189185858083850183828082843760009201919091525061210b92505050565b600e555061165e565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161170757508061174c565b816028108015611718575060508211155b156117255750602861174c565b6050821180156117365750606e8211155b156117465750607881900361174c565b50600481045b919050565b60006028821161176257508061174c565b50602861174c565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff16156117e0576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561182e576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806118b0576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506119605760405161100290819084156108fc029085906000818181858888f1935050505015801561191a573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506119a7565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b60088181548110610a4d57fe5b601181565b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611a39576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611a3c600254611a5f6001548561211090919063ffffffff16565b9063ffffffff61216916565b6000611a3983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121ab565b6009546006805460408051602080840282018101909252828152600094938593606093830182828015611b0957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611aeb575b5050505050905060608151604051908082528060200260200182016040528015611b3d578160200160208202803683370190505b50905060005b8251811015611bcd576000838281518110611b5a57fe5b602002602001015190506000611b9460056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611751565b905080848481518110611ba357fe5b6020908102919091010152611bbe868263ffffffff6119df16565b95505050806001019050611b43565b506000611beb600454611a5f6003548861211090919063ffffffff16565b9050611bfd858263ffffffff611a6b16565b94508460015b8451811015611cd4576000611c3887611a5f8a888681518110611c2257fe5b602002602001015161211090919063ffffffff16565b9050611c8581600d6000898681518110611c4e57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546119df90919063ffffffff16565b600d6000888581518110611c9557fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611cc9838263ffffffff611a6b16565b925050600101611c03565b50611cea81600d600087600081518110611c4e57fe5b600d600086600081518110611cfb57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611d855760056000868381518110611d4e57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055806001019050611d35565b50611d92600660006122a7565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611df957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ddb575b5050505050905060608151604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50905060005b8251811015611eac576000838281518110611e4a57fe5b602002602001015190506000611e8460076000846001600160a01b03166001600160a01b03168152602001908152602001600020546116f6565b905080848481518110611e9357fe5b6020908102919091010152949094019350600101611e33565b506000611eca600454611a5f6003548861211090919063ffffffff16565b9050611edc858263ffffffff611a6b16565b94508460015b8451811015611f66576000611f0187611a5f8a888681518110611c2257fe5b9050611f1781600d6000898681518110611c4e57fe5b600d6000888581518110611f2757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611f5b838263ffffffff611a6b16565b925050600101611ee2565b50611f7c81600d600087600081518110611c4e57fe5b600d600086600081518110611f8d57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b84518110156120175760076000868381518110611fe057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055806001019050611fc7565b50611d92600860006122a7565b6000816040516020018082805190602001908083835b602083106120595780518252601f19909201916020918201910161203a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106120c75780518252601f1990920191602091820191016120a8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60008261211f57506000611a3c565b8282028284828161212c57fe5b0414611a395760405162461bcd60e51b81526004018080602001828103825260218152602001806124526021913960400191505060405180910390fd5b6000611a3983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612242565b6000818484111561223a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121ff5781810151838201526020016121e7565b50505050905090810190601f16801561222c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836122915760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156121ff5781810151838201526020016121e7565b50600083858161229d57fe5b0495945050505050565b50805460008255906000526020600020908101906119a79190611d9a91905b808211156122da57600081556001016122c6565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a164736f6c6343000604000a" + "code": "0x6080604052600436106103545760003560e01c80637e434d54116101c6578063bd4cc830116100f7578063e75d72c711610095578063f9a2bbc71161006f578063f9a2bbc7146109da578063fc3e5908146109ef578063fd6a687914610a04578063fdd31fcd14610a1957610393565b8063e75d72c714610968578063e89a30201461099b578063f1fad104146109c557610393565b8063dc927faf116100d1578063dc927faf14610914578063dcae76ab14610929578063df8079e91461093e578063e1c7392a1461095357610393565b8063bd4cc830146108c0578063c81b1662146108ea578063d0ab528a146108ff57610393565b8063a7c6a59d11610164578063ab51bb961161013e578063ab51bb961461079b578063ac431751146107b0578063ace9fcc214610881578063af4006811461089657610393565b8063a7c6a59d1461075c578063aa82dce114610771578063aad560631461078657610393565b80639dc09262116101a05780639dc0926214610708578063a1a11bf51461071d578063a3c3c0ad14610732578063a78abc161461074757610393565b80637e434d54146106ab578063930e1b09146106c057806396713da9146106f357610393565b806343756e5c116102a05780636f93d2e61161023e57806374f2272d1161021857806374f2272d1461065757806375d47a0a1461066c5780637942fd05146106815780637e146cc51461069657610393565b80636f93d2e6146105ce57806370fd5bad1461062d578063718a8aa81461064257610393565b806351b4dce31161027a57806351b4dce31461057a57806351e806721461058f57806354133307146105a45780636e47b482146105b957610393565b806343756e5c14610524578063493279b1146105395780634bf6c8821461056557610393565b806312950c461161030d57806328087028116102e757806328087028146104b15780633a975612146103985780633dffc387146104c657806340bb43c0146104f157610393565b806312950c461461045d5780631b20087c146104725780631c6433121461048757610393565b8063081e9d131461039857806308f2ec06146103bf578063093f2fc4146103d45780630bee7a67146103e95780630e2374a51461041757806310e06a761461044857610393565b36610393576040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600080fd5b3480156103a457600080fd5b506103ad610a4c565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506103ad610a51565b3480156103e057600080fd5b506103ad610a56565b3480156103f557600080fd5b506103fe610a5b565b6040805163ffffffff9092168252519081900360200190f35b34801561042357600080fd5b5061042c610a60565b604080516001600160a01b039092168252519081900360200190f35b34801561045457600080fd5b506103ad610a66565b34801561046957600080fd5b506103ad610a6c565b34801561047e57600080fd5b506103ad610a72565b34801561049357600080fd5b5061042c600480360360208110156104aa57600080fd5b5035610a78565b3480156104bd57600080fd5b5061042c610a9f565b3480156104d257600080fd5b506104db610a4c565b6040805160ff9092168252519081900360200190f35b3480156104fd57600080fd5b506103ad6004803603602081101561051457600080fd5b50356001600160a01b0316610aa5565b34801561053057600080fd5b5061042c610ab7565b34801561054557600080fd5b5061054e610abd565b6040805161ffff9092168252519081900360200190f35b34801561057157600080fd5b506104db610ac2565b34801561058657600080fd5b5061042c610ac7565b34801561059b57600080fd5b5061042c610acd565b3480156105b057600080fd5b506103ad610a5b565b3480156105c557600080fd5b5061042c610ad3565b3480156105da57600080fd5b50610619600480360360808110156105f157600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610ad9565b604080519115158252519081900360200190f35b34801561063957600080fd5b506104db610bab565b34801561064e57600080fd5b506104db610bb0565b34801561066357600080fd5b506103ad610bb5565b34801561067857600080fd5b5061042c610bbb565b34801561068d57600080fd5b506104db610bc1565b3480156106a257600080fd5b506103ad610bc6565b3480156106b757600080fd5b5061042c610bcb565b3480156106cc57600080fd5b506103ad600480360360208110156106e357600080fd5b50356001600160a01b0316610bd1565b3480156106ff57600080fd5b506104db610be3565b34801561071457600080fd5b5061042c610be8565b34801561072957600080fd5b5061042c610bee565b34801561073e57600080fd5b506103ad610bf4565b34801561075357600080fd5b50610619610bfa565b34801561076857600080fd5b506103ad610c03565b34801561077d57600080fd5b5061042c610c09565b34801561079257600080fd5b5061042c610c0f565b3480156107a757600080fd5b506103fe610c15565b3480156107bc57600080fd5b5061087f600480360360408110156107d357600080fd5b8101906020810181356401000000008111156107ee57600080fd5b82018360208201111561080057600080fd5b8035906020019184600183028401116401000000008311171561082257600080fd5b91939092909160208101903564010000000081111561084057600080fd5b82018360208201111561085257600080fd5b8035906020019184600183028401116401000000008311171561087457600080fd5b509092509050610c1a565b005b34801561088d57600080fd5b506103ad610c5a565b3480156108a257600080fd5b506103ad600480360360208110156108b957600080fd5b5035610c60565b3480156108cc57600080fd5b506103ad600480360360208110156108e357600080fd5b5035610cbb565b3480156108f657600080fd5b5061042c610cd4565b34801561090b57600080fd5b506103ad610cda565b34801561092057600080fd5b5061042c610ce0565b34801561093557600080fd5b506103ad610ce6565b34801561094a57600080fd5b5061042c610cec565b34801561095f57600080fd5b5061087f610cf2565b34801561097457600080fd5b5061087f6004803603602081101561098b57600080fd5b50356001600160a01b0316610dbb565b3480156109a757600080fd5b5061042c600480360360208110156109be57600080fd5b5035610f14565b3480156109d157600080fd5b506104db610f21565b3480156109e657600080fd5b5061042c610f26565b3480156109fb57600080fd5b506104db610f2c565b348015610a1057600080fd5b5061042c610f31565b348015610a2557600080fd5b506103ad60048036036020811015610a3c57600080fd5b50356001600160a01b0316610f37565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b60068181548110610a8557fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff16610b31576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361200014610b715760405162461bcd60e51b815260040180806020018281038252602f815260200180610f78602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600281565b601081565b60035481565b61100881565b600b81565b600581565b61200381565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b3361100714610b715760405162461bcd60e51b815260040180806020018281038252602e815260200180610f4a602e913960400191505060405180910390fd5b60025481565b600060288211610c71575080610cb6565b816028108015610c82575060508211155b15610c8f57506028610cb6565b605082118015610ca05750606e8211155b15610cb057506078819003610cb6565b50600481045b919050565b600060288211610ccc575080610cb6565b506028610cb6565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff1615610d4a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610d98576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480610e1a576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f19350505050610eca5760405161100290819084156108fc029085906000818181858888f19350505050158015610e84573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050610f11565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b60088181548110610a8557fe5b601181565b61100081565b600381565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001006": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c806395468d2611610151578063dc927faf116100c3578063f1fad10411610087578063f1fad10414610565578063f3ae24151461056d578063f9a2bbc714610593578063fc3e59081461059b578063fd30d9b8146105a3578063fd6a6879146105ab57610274565b8063dc927faf1461053d578063dd91d1c514610545578063df8079e91461054d578063e1c7392a14610555578063e79a198f1461055d57610274565b8063a78abc1611610115578063a78abc1614610453578063aa82dce11461045b578063aad5606314610463578063ab51bb961461046b578063ac43175114610473578063c81b16621461053557610274565b806395468d261461042b57806396713da9146104335780639dc092621461043b578063a1a11bf514610443578063a74b83ca1461044b57610274565b8063541d5548116101ea57806375d47a0a116101ae57806375d47a0a146103ad57806378beee67146103b55780637942fd05146103db5780637ae23088146103e35780637e434d54146103fd5780638f83ab131461040557610274565b8063541d5548146103355780636a6a419e1461036f5780636e47b4821461039557806370fd5bad1461039d578063718a8aa8146103a557610274565b80633dffc3871161023c5780633dffc387146102d857806343756e5c146102f6578063493279b1146102fe5780634bf6c8821461031d57806351b4dce31461032557806351e806721461032d57610274565b806303aff02b14610279578063049a5716146102835780630bee7a67146102a75780630e2374a5146102c857806328087028146102d0575b600080fd5b6102816105b3565b005b61028b6105be565b604080516001600160a01b039092168252519081900360200190f35b6102af6105d6565b6040805163ffffffff9092168252519081900360200190f35b61028b6105db565b61028b6105e1565b6102e06105e7565b6040805160ff9092168252519081900360200190f35b61028b6105ec565b6103066105f2565b6040805161ffff9092168252519081900360200190f35b6102e06105f7565b61028b6105fc565b61028b610602565b61035b6004803603602081101561034b57600080fd5b50356001600160a01b0316610608565b604080519115158252519081900360200190f35b61035b6004803603602081101561038557600080fd5b50356001600160a01b0316610626565b61028b610644565b6102e061064a565b6102e061064f565b61028b610654565b610281600480360360208110156103cb57600080fd5b50356001600160a01b031661065a565b6102e0610842565b6103eb610847565b60408051918252519081900360200190f35b61028b610854565b6102816004803603602081101561041b57600080fd5b50356001600160a01b031661085a565b6103eb610a99565b6102e0610aa5565b61028b610aaa565b61028b610ab0565b61028b610ab6565b61035b610ace565b61028b610ad7565b61028b610add565b6102af610ae3565b6102816004803603604081101561048957600080fd5b8101906020810181356401000000008111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460018302840111640100000000831117156104d857600080fd5b9193909290916020810190356401000000008111156104f657600080fd5b82018360208201111561050857600080fd5b8035906020019184600183028401116401000000008311171561052a57600080fd5b509092509050610ae8565b61028b610e39565b61028b610e3f565b610281610e45565b61028b610ee6565b610281610eec565b610281610f6e565b6102e0611127565b61035b6004803603602081101561058357600080fd5b50356001600160a01b031661112c565b61028b61114a565b6102e0611150565b61035b611155565b61028b61115e565b6105bc33611164565b565b73b005741528b86f5952469d80a8614591e3c5b63281565b606481565b61200181565b61200581565b600181565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b3360009081526008602052604090205460ff166106a85760405162461bcd60e51b81526004018080602001828103825260248152602001806116706024913960400191505060405180910390fd5b6106b1336112c6565b156106ed5760405162461bcd60e51b815260040180806020018281038252602181526020018061162d6021913960400191505060405180910390fd5b323314610741576040805162461bcd60e51b815260206004820152601e60248201527f70726f766973696f6e616c2072656c6179657220697320612070726f78790000604482015290519081900360640190fd5b6001600160a01b038181166000908152600960205260409020541633146107995760405162461bcd60e51b81526004018080602001828103825260278152602001806116e96027913960400191505060405180910390fd5b6001600160a01b03818116600081815260066020908152604080832080543380865260078086528487208054600160ff199182161790915584546001600160a01b031990811684179095556008875285882080548216905597875260098652848720805490941690935596168085529083529281902080549094169093558251828152908101939093528151909260008051602061171083398151915292908290030190a15050565b600b81565b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166108b7576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6108c0816112c6565b156108fc5760405162461bcd60e51b81526004018080602001828103825260278152602001806116946027913960400191505060405180910390fd5b6001600160a01b038116156109b8576001600160a01b03811660009081526007602052604090205460ff1615610972576040805162461bcd60e51b815260206004820152601660248201527572656c6179657220616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b0381166000818152600860209081526040808320805460ff191660011790553383526009909152902080546001600160a01b0319169091179055610a59565b3360008181526006602090815260408083208054600980855283862080546001600160a01b03198085169095556001600160a01b0393841680895260078852868920805460ff19908116909155918516808a5260088952878a20805490931690925598909752908552805490921690915581518581529086169281019290925280516000805160206117108339815191529281900390910190a15050610a96565b604080516001600160a01b038316815290517ffba56633276570c7d3120d4535bf3bce26523da53958e40734210b9fd99b36939181900360200190a15b50565b67016345785d8a000081565b600981565b61100781565b61100681565b73446aa6e0dc65690403df3f127750da1322941f3e81565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610b3b576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361100714610b7b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806116bb602e913960400191505060405180910390fd5b610bdc84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526930b23226b0b730b3b2b960b11b602082015291506112cc9050565b15610c745760148114610c205760405162461bcd60e51b815260040180806020018281038252602281526020018061164e6022913960400191505060405180910390fd5b6000610c63601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113b392505050565b9050610c6e816113b8565b50610da7565b610cd884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c3932b6b7bb32a6b0b730b3b2b960991b602082015291506112cc9050565b15610d6a5760148114610d1c5760405162461bcd60e51b815260040180806020018281038252602281526020018061164e6022913960400191505060405180910390fd5b6000610d5f601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113b392505050565b9050610c6e81611164565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b600a5460ff1615610e9d576040805162461bcd60e51b815260206004820152601e60248201527f7468652077686974656c6973747320616c726561647920757064617465640000604482015290519081900360640190fd5b610eba73b005741528b86f5952469d80a8614591e3c5b63261147a565b610ed773446aa6e0dc65690403df3f127750da1322941f3e61147a565b600a805460ff19166001179055565b61200481565b60005460ff1615610f44576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610fc9576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff1661101c576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b611024611612565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91611068919063ffffffff61153216565b6040518115909202916000818181858888f19350505050158015611090573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f193505050501580156110c6573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b601181565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600381565b600a5460ff1681565b61100481565b6001600160a01b03811660009081526005602052604090205460ff166111c9576040805162461bcd60e51b81526020600482015260156024820152741b585b9859d95c88191bd95cdb89dd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b038082166000818152600660209081526040808320805460058452828520805460ff1990811690915582546001600160a01b0319908116909355600980865284872080548a16885260088752858820805490931690925595879052948452845490911690935580519384525191909316927f2002866d443ac6c241fecaaa2af4895828c7de2cc423b9d01f7969650f557c76928290030190a16001600160a01b038116156112c2576001600160a01b0381166000818152600760209081526040808320805460ff1916905580519384529083019190915280516000805160206117108339815191529281900390910190a15b5050565b3b151590565b6000816040516020018082805190602001908083835b602083106113015780518252601f1990920191602091820191016112e2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b6020831061136f5780518252601f199092019160209182019101611350565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b03811660009081526005602052604090205460ff161561141f576040805162461bcd60e51b81526020600482015260166024820152756d616e6167657220616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19166001179055815192835290517fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575179281900390910190a150565b6001600160a01b03811660008181526005602090815260408083208054600160ff1991821681179092556006845282852080546001600160a01b031916871790556007845293829020805490941617909255815192835290517fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575179281900390910190a160408051600081526001600160a01b03831660208201528151600080516020611710833981519152929181900390910190a150565b600061157483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061157b565b9392505050565b6000818484111561160a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156115cf5781810151838201526020016115b7565b50505050905090810190601f1680156115fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe70726f766973696f6e616c2072656c61796572206973206120636f6e74726163746c656e677468206f66206d616e616765722061646472657373206d69736d6174636872656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637470726f766973696f6e616c206973206e6f742073657420666f722074686973206d616e61676572a5a19d7e9dab30a215022382d7abe782b579986fcbedec9942ecd0db9510a148a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c806395468d2611610151578063dc927faf116100c3578063f1fad10411610087578063f1fad1041461055d578063f3ae241514610565578063f9a2bbc71461058b578063fc3e590814610593578063fd30d9b81461059b578063fd6a6879146105a357610274565b8063dc927faf1461053d578063dd91d1c514610279578063df8079e914610545578063e1c7392a1461054d578063e79a198f1461055557610274565b8063a78abc1611610115578063a78abc1614610453578063aa82dce11461045b578063aad5606314610463578063ab51bb961461046b578063ac43175114610473578063c81b16621461053557610274565b806395468d261461042b57806396713da9146104335780639dc092621461043b578063a1a11bf514610443578063a74b83ca1461044b57610274565b8063541d5548116101ea57806375d47a0a116101ae57806375d47a0a146103ad57806378beee67146103b55780637942fd05146103db5780637ae23088146103e35780637e434d54146103fd5780638f83ab131461040557610274565b8063541d5548146103355780636a6a419e1461036f5780636e47b4821461039557806370fd5bad1461039d578063718a8aa8146103a557610274565b80633dffc3871161023c5780633dffc387146102d857806343756e5c146102f6578063493279b1146102fe5780634bf6c8821461031d57806351b4dce31461032557806351e806721461032d57610274565b806303aff02b14610279578063049a5716146102835780630bee7a67146102a75780630e2374a5146102c857806328087028146102d0575b600080fd5b6102816105ab565b005b61028b6105e5565b604080516001600160a01b039092168252519081900360200190f35b6102af6105fd565b6040805163ffffffff9092168252519081900360200190f35b61028b610602565b61028b610608565b6102e061060e565b6040805160ff9092168252519081900360200190f35b61028b610613565b610306610619565b6040805161ffff9092168252519081900360200190f35b6102e061061e565b61028b610623565b61028b610629565b61035b6004803603602081101561034b57600080fd5b50356001600160a01b031661062f565b604080519115158252519081900360200190f35b61035b6004803603602081101561038557600080fd5b50356001600160a01b031661064d565b61028b61066b565b6102e0610671565b6102e0610676565b61028b61067b565b610281600480360360208110156103cb57600080fd5b50356001600160a01b0316610681565b6102e06106cf565b6103eb6106d4565b60408051918252519081900360200190f35b61028b6106e1565b6102816004803603602081101561041b57600080fd5b50356001600160a01b03166106e7565b6103eb610744565b6102e0610750565b61028b610755565b61028b61075b565b61028b610761565b61035b610779565b61028b610782565b61028b610788565b6102af61078e565b6102816004803603604081101561048957600080fd5b8101906020810181356401000000008111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460018302840111640100000000831117156104d857600080fd5b9193909290916020810190356401000000008111156104f657600080fd5b82018360208201111561050857600080fd5b8035906020019184600183028401116401000000008311171561052a57600080fd5b509092509050610793565b61028b610826565b61028b61082c565b61028b610832565b610281610838565b6102816108ba565b6102e0610a73565b61035b6004803603602081101561057b57600080fd5b50356001600160a01b0316610a78565b61028b610a96565b6102e0610a9c565b61035b610aa1565b61028b610aaa565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b73b005741528b86f5952469d80a8614591e3c5b63281565b606481565b61200181565b61200581565b600181565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b3360009081526008602052604090205460ff166105ab5760405162461bcd60e51b8152600401808060200182810382526024815260200180610bab6024913960400191505060405180910390fd5b600b81565b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166105ab576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b67016345785d8a000081565b600981565b61100781565b61100681565b73446aa6e0dc65690403df3f127750da1322941f3e81565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff166107e6576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146105ab5760405162461bcd60e51b815260040180806020018281038252602e815260200180610bcf602e913960400191505060405180910390fd5b61100281565b61100381565b61200481565b60005460ff1615610890576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610915576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610968576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610970610b90565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc916109b4919063ffffffff610ab016565b6040518115909202916000818181858888f193505050501580156109dc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610a12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b601181565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600381565b600a5460ff1681565b61100481565b6000610af283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610af9565b9392505050565b60008184841115610b885760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610b4d578181015183820152602001610b35565b50505050905090810190601f168015610b7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe72656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001007": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063831d65d111610125578063ab51bb96116100ad578063df8079e91161007c578063df8079e914610615578063f1fad1041461061d578063f9a2bbc714610625578063fc3e59081461062d578063fd6a6879146106355761021c565b8063ab51bb9614610585578063c81b16621461058d578063c8509d8114610595578063dc927faf1461060d5761021c565b80639dc09262116100f45780639dc0926214610549578063a1a11bf514610551578063a78abc1614610559578063aa82dce114610575578063aad560631461057d5761021c565b8063831d65d1146103f857806388e4194e1461047257806396713da9146105395780639ab1a373146105415761021c565b80634bf6c882116101a857806370fd5bad1161017757806370fd5bad146103d0578063718a8aa8146103d857806375d47a0a146103e05780637942fd05146103e85780637e434d54146103f05761021c565b80634bf6c882146103b057806351b4dce3146103b857806351e80672146103c05780636e47b482146103c85761021c565b80633a21baae116101ef5780633a21baae1461035b5780633dffc3871461036357806343756e5c146103815780634900c4ea14610389578063493279b1146103915761021c565b80630bee7a67146102215780630e2374a5146102425780631182b875146102665780632808702814610353575b600080fd5b61022961063d565b6040805163ffffffff9092168252519081900360200190f35b61024a610642565b604080516001600160a01b039092168252519081900360200190f35b6102de6004803603604081101561027c57600080fd5b60ff8235169190810190604081016020820135600160201b8111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111600160201b831117156102d357600080fd5b509092509050610648565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610318578181015183820152602001610300565b50505050905090810190601f1680156103455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a610737565b61022961073d565b61036b610742565b6040805160ff9092168252519081900360200190f35b61024a610747565b61036b61074d565b610399610752565b6040805161ffff9092168252519081900360200190f35b61036b610757565b61024a61075c565b61024a610762565b61024a610768565b61036b61076e565b61036b610773565b61024a610778565b61036b61077e565b61024a610783565b6104706004803603604081101561040e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561043257600080fd5b82018360208201111561044457600080fd5b803590602001918460018302840111600160201b8311171561046557600080fd5b509092509050610789565b005b6104706004803603606081101561048857600080fd5b810190602081018135600160201b8111156104a257600080fd5b8201836020820111156104b457600080fd5b803590602001918460018302840111600160201b831117156104d557600080fd5b919390929091602081019035600160201b8111156104f257600080fd5b82018360208201111561050457600080fd5b803590602001918460018302840111600160201b8311171561052557600080fd5b9193509150356001600160a01b031661081b565b61036b610906565b61022961090b565b61024a610910565b61024a610916565b61056161091c565b604080519115158252519081900360200190f35b61024a610925565b61024a61092b565b61022961074d565b61024a610931565b610470600480360360408110156105ab57600080fd5b60ff8235169190810190604081016020820135600160201b8111156105cf57600080fd5b8201836020820111156105e157600080fd5b803590602001918460018302840111600160201b8311171561060257600080fd5b509092509050610937565b61024a6109ae565b61024a6109b4565b61036b6109ba565b61024a6109bf565b61036b6109c5565b61024a6109ca565b606481565b61200181565b6060336120001461068a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061169d602f913960400191505060405180910390fd5b610692611638565b60006106d385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109d092505050565b91509150806106ef576106e66064610a96565b92505050610730565b60006106fa83610b00565b905063ffffffff811661072157505060408051600081526020810190915291506107309050565b61072a81610a96565b93505050505b9392505050565b61200581565b606681565b600181565b61100181565b600081565b603881565b600881565b61200681565b61200081565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b33612000146107c95760405162461bcd60e51b815260040180806020018281038252602f81526020018061169d602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b336120061461085b5760405162461bcd60e51b81526004018080602001828103825260318152602001806116cc6031913960400191505060405180910390fd5b610863611638565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506108fd81610b00565b50505050505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b61100281565b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f81526020018061169d602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806116fd6023913960400191505060405180910390fd5b61100381565b61200481565b601181565b61100081565b600381565b61100481565b6109d8611638565b60006109e2611638565b6109ea611662565b6109fb6109f686610ea1565b610ec6565b90506000805b610a0a83610f10565b15610a895780610a2c57610a25610a2084610f31565b610f7f565b8452610a81565b8060011415610a4b57610a41610a2084610f31565b6020850152610a81565b8060021415610a7c57610a65610a6084610f31565b610ff8565b6001600160a01b0316604085015260019150610a81565b610a89565b600101610a01565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081610ab0579050509050610ad68363ffffffff16611018565b81600081518110610ae357fe5b6020026020010181905250610af78161102b565b9150505b919050565b6000610b0f82604001516110b5565b610b7b57604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610afb565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015610be8578181015183820152602001610bd0565b50505050905090810190601f168015610c155780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015610c48578181015183820152602001610c30565b50505050905090810190601f168015610c755780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610c9657600080fd5b505af1925050508015610ca7575060015b610e99576040516000815260443d1015610cc357506000610d60565b60046000803e60005160e01c6308c379a08114610ce4576000915050610d60565b60043d036004833e81513d602482011167ffffffffffffffff82111715610d1057600092505050610d60565b808301805167ffffffffffffffff811115610d32576000945050505050610d60565b8060208301013d8601811115610d5057600095505050505050610d60565b601f01601f191660405250925050505b80610d6b5750610e0e565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dca578181015183820152602001610db2565b50505050905090810190601f168015610df75780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610afb565b3d808015610e38576040519150601f19603f3d011682016040523d82523d6000602084013e610e3d565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610dca578181015183820152602001610db2565b506000919050565b610ea9611682565b506040805180820190915281518152602082810190820152919050565b610ece611662565b610ed7826110bb565b610ee057600080fd5b6000610eef83602001516110f5565b60208085015160408051808201909152868152920190820152915050919050565b6000610f1a611682565b505080518051602091820151919092015191011190565b610f39611682565b610f4282610f10565b610f4b57600080fd5b60208201516000610f5b82611158565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610f8d57600080fd5b6000610f9c83602001516110f5565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610fd3576020820181803683370190505b5090506000816020019050610fef84876020015101828561128b565b50949350505050565b805160009060151461100957600080fd5b611012826112d6565b92915050565b60606110126110268361138b565b611471565b606081516000141561104c5750604080516000815260208101909152610afb565b60608260008151811061105b57fe5b602002602001015190506000600190505b835181101561109c576110928285838151811061108557fe5b60200260200101516114c3565b915060010161106c565b50610af76110af825160c060ff16611540565b826114c3565b3b151590565b80516000906110cc57506000610afb565b6020820151805160001a9060c08210156110eb57600092505050610afb565b5060019392505050565b8051600090811a608081101561110f576000915050610afb565b60b881108061112a575060c0811080159061112a575060f881105b15611139576001915050610afb565b60c081101561114d5760b519019050610afb565b60f519019050610afb565b80516000908190811a60808110156111735760019150611284565b60b881101561118857607e1981019150611284565b60c081101561120257600060b78203600186019550806020036101000a8651049150600181018201935050808310156111fc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611284565b60f88110156112175760be1981019150611284565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611282576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8061129557610816565b5b602081106112b5578251825260209283019290910190601f1901611296565b915181516020939093036101000a6000190180199091169216919091179052565b8051600090158015906112eb57508151602110155b6112f457600080fd5b600061130383602001516110f5565b9050808360000151101561135e576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610fef57506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166113cf575060186113f3565b6fffffffffffffffffffffffffffffffff1984166113ef575060106113f3565b5060005b60208110156114295781818151811061140857fe5b01602001516001600160f81b0319161561142157611429565b6001016113f3565b60008160200390506060816040519080825280601f01601f19166020018201604052801561145e576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156114a35750607f60f81b8260008151811061149157fe5b01602001516001600160f81b03191611155b156114af575080610afb565b6110126114c18351608060ff16611540565b835b6060806040519050835180825260208201818101602087015b818310156114f45780518352602092830192016114dc565b50855184518101855292509050808201602086015b81831015611521578051835260209283019201611509565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310611590576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116115ea5782840160f81b816000815181106115cc57fe5b60200101906001600160f81b031916908160001a9053509050611012565b60606115f58561138b565b90508381510160370160f81b8260008151811061160e57fe5b60200101906001600160f81b031916908160001a90535061162f82826114c3565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b6040518060400160405280611675611682565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063831d65d111610125578063ab51bb96116100ad578063df8079e91161007c578063df8079e91461059d578063f1fad104146105a5578063f9a2bbc7146105ad578063fc3e5908146105b5578063fd6a6879146105bd5761021c565b8063ab51bb9614610585578063c81b16621461058d578063c8509d81146103f8578063dc927faf146105955761021c565b80639dc09262116100f45780639dc0926214610549578063a1a11bf514610551578063a78abc1614610559578063aa82dce114610575578063aad560631461057d5761021c565b8063831d65d1146103f857806388e4194e1461047257806396713da9146105395780639ab1a373146105415761021c565b80634bf6c882116101a857806370fd5bad1161017757806370fd5bad146103d0578063718a8aa8146103d857806375d47a0a146103e05780637942fd05146103e85780637e434d54146103f05761021c565b80634bf6c882146103b057806351b4dce3146103b857806351e80672146103c05780636e47b482146103c85761021c565b80633a21baae116101ef5780633a21baae1461035b5780633dffc3871461036357806343756e5c146103815780634900c4ea14610389578063493279b1146103915761021c565b80630bee7a67146102215780630e2374a5146102425780631182b875146102665780632808702814610353575b600080fd5b6102296105c5565b6040805163ffffffff9092168252519081900360200190f35b61024a6105ca565b604080516001600160a01b039092168252519081900360200190f35b6102de6004803603604081101561027c57600080fd5b60ff8235169190810190604081016020820135600160201b8111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111600160201b831117156102d357600080fd5b5090925090506105d0565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610318578181015183820152602001610300565b50505050905090810190601f1680156103455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a61064c565b610229610652565b61036b610657565b6040805160ff9092168252519081900360200190f35b61024a61065c565b61036b610662565b610399610667565b6040805161ffff9092168252519081900360200190f35b61036b61066c565b61024a610671565b61024a610677565b61024a61067d565b61036b610683565b61036b610688565b61024a61068d565b61036b610693565b61024a610698565b6104706004803603604081101561040e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561043257600080fd5b82018360208201111561044457600080fd5b803590602001918460018302840111600160201b8311171561046557600080fd5b50909250905061069e565b005b6104706004803603606081101561048857600080fd5b810190602081018135600160201b8111156104a257600080fd5b8201836020820111156104b457600080fd5b803590602001918460018302840111600160201b831117156104d557600080fd5b919390929091602081019035600160201b8111156104f257600080fd5b82018360208201111561050457600080fd5b803590602001918460018302840111600160201b8311171561052557600080fd5b9193509150356001600160a01b03166106de565b61036b6107c9565b6102296107ce565b61024a6107d3565b61024a6107d9565b6105616107df565b604080519115158252519081900360200190f35b61024a6107e8565b61024a6107ee565b610229610662565b61024a6107f4565b61024a6107fa565b61024a610800565b61036b610806565b61024a61080b565b61036b610811565b61024a610816565b606481565b61200181565b606033612000146106125760405162461bcd60e51b815260040180806020018281038252602f815260200180610bef602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200581565b606681565b600181565b61100181565b600081565b603881565b600881565b61200681565b61200081565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b33612000146106125760405162461bcd60e51b815260040180806020018281038252602f815260200180610bef602f913960400191505060405180910390fd5b336120061461071e5760405162461bcd60e51b8152600401808060200182810382526031815260200180610c1e6031913960400191505060405180910390fd5b610726610bc4565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506107c08161081c565b50505050505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b61100281565b61100381565b61200481565b601181565b61100081565b600381565b61100481565b600061082b8260400151610bbe565b61089757604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610bb9565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b838110156109045781810151838201526020016108ec565b50505050905090810190601f1680156109315780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561096457818101518382015260200161094c565b50505050905090810190601f1680156109915780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109b257600080fd5b505af19250505080156109c3575060015b610bb5576040516000815260443d10156109df57506000610a7c565b60046000803e60005160e01c6308c379a08114610a00576000915050610a7c565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a2c57600092505050610a7c565b808301805167ffffffffffffffff811115610a4e576000945050505050610a7c565b8060208301013d8601811115610a6c57600095505050505050610a7c565b601f01601f191660405250925050505b80610a875750610b2a565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae6578181015183820152602001610ace565b50505050905090810190601f168015610b135780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610bb9565b3d808015610b54576040519150601f19603f3d011682016040523d82523d6000602084013e610b59565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610ae6578181015183820152602001610ace565b5060005b919050565b3b151590565b6040518060600160405280606081526020016060815260200160006001600160a01b03168152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001008": { "balance": "0x0", - "code": "0x6080604052600436106103e45760003560e01c80637d078e1311610208578063b795031711610118578063dc927faf116100ab578063f9a2bbc71161007a578063f9a2bbc714610e43578063fa9e915914610e58578063fc3e59081461065b578063fd6a687914610e6d578063fe3a2af514610e82576103e4565b8063dc927faf14610def578063df8079e914610e04578063e605bca014610e19578063f1fad10414610e2e576103e4565b8063c8e704a4116100e7578063c8e704a41461065b578063d117a11014610d5a578063d7109ce614610dda578063d9e6dae914610789576103e4565b8063b7950317146107dd578063bd32d3f91461056d578063c81b166214610cc0578063c8509d8114610cd5576103e4565b80639a854bbd1161019b578063aa82dce11161016a578063aa82dce114610bb6578063aad5606314610bcb578063ab51bb9614610be0578063ab67a485146107dd578063ac43175114610bf5576103e4565b80639a854bbd14610b625780639dc0926214610b77578063a1a11bf514610b8c578063a78abc1614610ba1576103e4565b8063859180fb116101d7578063859180fb1461077457806394553a4e14610b0357806395b9ad2614610b3857806396713da914610b4d576103e4565b80637d078e13146105825780637e434d5414610a525780637ec816dd14610a67578063831d65d114610a7c576103e4565b8063493279b11161030357806366dea52a11610296578063718a8aa811610265578063718a8aa8146108bb57806372c4e086146108d057806375d47a0a1461097457806377d9dae8146109895780637942fd0514610a3d576103e4565b806366dea52a146107dd5780636b3f1307146107f25780636e47b482146108a657806370fd5bad146107dd576103e4565b806351e80672116102d257806351e80672146107b35780635d499b1b146107c85780635f558f86146107dd5780636136847514610789576103e4565b8063493279b1146107485780634bc81c00146107745780634bf6c8821461078957806351b4dce31461079e576103e4565b80632d89ac321161037b578063401809f91161034a578063401809f91461065b57806343756e5c14610670578063445fcefe14610685578063487c88ac14610582576103e4565b80632d89ac32146105825780632e02d776146105f557806337e6ecda146106285780633dffc38714610582576103e4565b80631f91600b116103b75780631f91600b1461056d57806323996b531461058257806325c751b71461059757806328087028146105e0576103e4565b80630bee7a67146103e95780630e2374a5146104175780630f212b1b146104485780631182b87514610473575b600080fd5b3480156103f557600080fd5b506103fe610e97565b6040805163ffffffff9092168252519081900360200190f35b34801561042357600080fd5b5061042c610e9c565b604080516001600160a01b039092168252519081900360200190f35b34801561045457600080fd5b5061045d610ea2565b6040805160ff9092168252519081900360200190f35b34801561047f57600080fd5b506104f86004803603604081101561049657600080fd5b60ff8235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460018302840111600160201b831117156104ed57600080fd5b509092509050610ea7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053257818101518382015260200161051a565b50505050905090810190601f16801561055f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057957600080fd5b5061045d610fc1565b34801561058e57600080fd5b5061045d610fc6565b6105cc600480360360408110156105ad57600080fd5b5080356001600160a01b031690602001356001600160401b0316610fcb565b604080519115158252519081900360200190f35b3480156105ec57600080fd5b5061042c611517565b34801561060157600080fd5b506105cc6004803603602081101561061857600080fd5b50356001600160a01b031661151d565b34801561063457600080fd5b506105cc6004803603602081101561064b57600080fd5b50356001600160a01b0316611532565b34801561066757600080fd5b5061045d611547565b34801561067c57600080fd5b5061042c61154c565b34801561069157600080fd5b50610736600480360360208110156106a857600080fd5b810190602081018135600160201b8111156106c257600080fd5b8201836020820111156106d457600080fd5b803590602001918460018302840111600160201b831117156106f557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611552945050505050565b60408051918252519081900360200190f35b34801561075457600080fd5b5061075d6116b0565b6040805161ffff9092168252519081900360200190f35b34801561078057600080fd5b5061045d6116b5565b34801561079557600080fd5b5061045d6116ba565b3480156107aa57600080fd5b5061042c6116bf565b3480156107bf57600080fd5b5061042c6116c5565b3480156107d457600080fd5b506107366116cb565b3480156107e957600080fd5b5061045d6116d4565b6105cc6004803603604081101561080857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561083257600080fd5b82018360208201111561084457600080fd5b803590602001918460018302840111600160201b8311171561086557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116d9945050505050565b3480156108b257600080fd5b5061042c611faf565b3480156108c757600080fd5b5061045d611fb5565b6105cc600480360360208110156108e657600080fd5b810190602081018135600160201b81111561090057600080fd5b82018360208201111561091257600080fd5b803590602001918460018302840111600160201b8311171561093357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611fba945050505050565b34801561098057600080fd5b5061042c612406565b6105cc6004803603604081101561099f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156109c957600080fd5b8201836020820111156109db57600080fd5b803590602001918460018302840111600160201b831117156109fc57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061240c945050505050565b348015610a4957600080fd5b5061045d612912565b348015610a5e57600080fd5b5061042c612917565b348015610a7357600080fd5b5061073661291d565b348015610a8857600080fd5b50610b0160048036036040811015610a9f57600080fd5b60ff8235169190810190604081016020820135600160201b811115610ac357600080fd5b820183602082011115610ad557600080fd5b803590602001918460018302840111600160201b83111715610af657600080fd5b509092509050612923565b005b6105cc60048036036040811015610b1957600080fd5b5080356001600160a01b031690602001356001600160401b0316612a72565b348015610b4457600080fd5b5061045d613469565b348015610b5957600080fd5b5061045d61346e565b348015610b6e57600080fd5b50610736613473565b348015610b8357600080fd5b5061042c61347f565b348015610b9857600080fd5b5061042c613485565b348015610bad57600080fd5b506105cc61348b565b348015610bc257600080fd5b5061042c613494565b348015610bd757600080fd5b5061042c61349a565b348015610bec57600080fd5b506103fe6134a0565b348015610c0157600080fd5b50610b0160048036036040811015610c1857600080fd5b810190602081018135600160201b811115610c3257600080fd5b820183602082011115610c4457600080fd5b803590602001918460018302840111600160201b83111715610c6557600080fd5b919390929091602081019035600160201b811115610c8257600080fd5b820183602082011115610c9457600080fd5b803590602001918460018302840111600160201b83111715610cb557600080fd5b5090925090506134a5565b348015610ccc57600080fd5b5061042c61377a565b348015610ce157600080fd5b50610b0160048036036040811015610cf857600080fd5b60ff8235169190810190604081016020820135600160201b811115610d1c57600080fd5b820183602082011115610d2e57600080fd5b803590602001918460018302840111600160201b83111715610d4f57600080fd5b509092509050613780565b348015610d6657600080fd5b50610d8460048036036020811015610d7d57600080fd5b5035613856565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610de657600080fd5b506107366138ad565b348015610dfb57600080fd5b5061042c6138b2565b348015610e1057600080fd5b5061042c6138b8565b348015610e2557600080fd5b506107366138be565b348015610e3a57600080fd5b5061045d6138c4565b348015610e4f57600080fd5b5061042c6138c9565b348015610e6457600080fd5b506107366138cf565b348015610e7957600080fd5b5061042c6138d5565b348015610e8e57600080fd5b5061045d6134a0565b606481565b61200181565b600681565b60603361200014610ee95760405162461bcd60e51b815260040180806020018281038252602f815260200180615cdd602f913960400191505060405180910390fd5b60ff841660011415610f3b57610f3483838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138db92505050565b9050610fba565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561101857600080fd5b505afa15801561102c573d6000803e3d6000fd5b505050506040513d602081101561104257600080fd5b5051905080611084576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff166110e7576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b505190506402540be40034061580156111795750600554611175908263ffffffff613b6b16565b3410155b6111b45760405162461bcd60e51b8152600401808060200182810382526046815260200180615c696046913960600191505060405180910390fd5b42607801846001600160401b0316101580156111de5750426201518001846001600160401b031611155b6112195760405162461bcd60e51b8152600401808060200182810382526038815260200180615b666038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d602081101561127e57600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156112c657600080fd5b505afa1580156112da573d6000803e3d6000fd5b505050506040513d60208110156112f057600080fd5b50519050677ce66c50e284000061130a8360ff8416613bc5565b1115611356576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061137290349063ffffffff613c5416565b6040518115909202916000818181858888f1935050505015801561139a573d6000803e3d6000fd5b506113a36159bd565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016113f26402540be400600554613c9690919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d7600561141984613cd8565b6114436402540be40061143760055434613c5490919063ffffffff16565b9063ffffffff613c9616565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156114a1578181015183820152602001611489565b50505050905090810190601f1680156114ce5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506001955050505050505b92915050565b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b60208101516000906115626159f2565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906115e9576000925050506116ab565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561164757600080fd5b505afa15801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b5051608083015160608401519192506000916116929163ffffffff613c5416565b90506116a4818363ffffffff613c5416565b9450505050505b919050565b603881565b600581565b600881565b61200681565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156117315760405162461bcd60e51b815260040180806020018281038252602b815260200180615d0c602b913960400191505060405180910390fd5b600061173c83613e0d565b90506117466159f2565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c083015261180b576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b600061182882608001518360600151613c5490919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461187e5760405162461bcd60e51b8152600401808060200182810382526045815260200180615bd56045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c157600080fd5b505afa1580156118d5573d6000803e3d6000fd5b505050506040513d60208110156118eb57600080fd5b50516001600160a01b0316146119325760405162461bcd60e51b815260040180806020018281038252602e815260200180615b38602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561197e57600080fd5b505afa158015611992573d6000803e3d6000fd5b505050506040513d60208110156119a857600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391611a399184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015611a0157600080fd5b505afa158015611a15573d6000803e3d6000fd5b505050506040513d6020811015611a2b57600080fd5b50519063ffffffff613b6b16565b1015611a8c576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611ace57600080fd5b505afa158015611ae2573d6000803e3d6000fd5b505050506040513d6020811015611af857600080fd5b50519050808210801590611b1157506402540be4008206155b611b4c5760405162461bcd60e51b8152600401808060200182810382526037815260200180615b9e6037913960400191505060405180910390fd5b6000611b58868b613e14565b905063ffffffff8116611d57576001600160a01b038a166323b872dd33611004611b88898963ffffffff613c5416565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611bf057600080fd5b505af1158015611c04573d6000803e3d6000fd5b505050506040513d6020811015611c1a57600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611c8357600080fd5b505af1158015611c97573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611d16578181015183820152602001611cfe565b50505050905090810190601f168015611d435780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611e0f565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611dd3578181015183820152602001611dbb565b50505050905090810190601f168015611e005780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611e69615a2e565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611eb1573d6000803e3d6000fd5b5061200063f7a251d76001611ec58461426e565b611eda886402540be40063ffffffff613c9616565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611f38578181015183820152602001611f20565b50505050905090810190601f168015611f655780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b601081565b600080611fc683613e0d565b9050611fd06159f2565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152612095576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b0316106120f6576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561213857600080fd5b505afa15801561214c573d6000803e3d6000fd5b505050506040513d602081101561216257600080fd5b5051905080821080159061217b57506402540be4008206155b6121b65760405162461bcd60e51b8152600401808060200182810382526037815260200180615b9e6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055612210615a2e565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015612253573d6000803e3d6000fd5b5061200063f7a251d760016122678461426e565b61227c876402540be40063ffffffff613c9616565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156122da5781810151838201526020016122c2565b50505050905090810190601f1680156123075780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156123be5781810151838201526020016123a6565b50505050905090810190601f1680156123eb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b60008061241883613e0d565b90506124226159f2565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526124e7576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b03161461253b5760405162461bcd60e51b8152600401808060200182810382526045815260200180615bd56045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561257e57600080fd5b505afa158015612592573d6000803e3d6000fd5b505050506040513d60208110156125a857600080fd5b50516001600160a01b031614612605576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561264757600080fd5b505afa15801561265b573d6000803e3d6000fd5b505050506040513d602081101561267157600080fd5b5051905080821080159061268a57506402540be4008206155b6126c55760405162461bcd60e51b8152600401808060200182810382526037815260200180615b9e6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff1916905561271f615a2e565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015612762573d6000803e3d6000fd5b5061200063f7a251d760016127768461426e565b61278b876402540be40063ffffffff613c9616565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156127e95781810151838201526020016127d1565b50505050905090810190601f1680156128165780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561283757600080fd5b505af115801561284b573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156128c95781810151838201526020016128b1565b50505050905090810190601f1680156128f65780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b61200381565b60045481565b33612000146129635760405162461bcd60e51b815260040180806020018281038252602f815260200180615cdd602f913960400191505060405180910390fd5b60ff8316600414156129b3576129ae82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506142e492505050565b612a6d565b60ff8316600514156129fe576129ae82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061459192505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015612abf57600080fd5b505afa158015612ad3573d6000803e3d6000fd5b505050506040513d6020811015612ae957600080fd5b505114612b2d576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612b8c576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612bc957600080fd5b505afa158015612bdd573d6000803e3d6000fd5b505050506040513d6020811015612bf357600080fd5b505190506402540be4003406158015612c1e5750600454612c1a908263ffffffff613b6b16565b3410155b612c595760405162461bcd60e51b815260040180806020018281038252604d815260200180615aeb604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612c835750426201518001836001600160401b031611155b612cbe5760405162461bcd60e51b8152600401808060200182810382526038815260200180615b666038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d6020811015612d2357600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612d6b57600080fd5b505afa158015612d7f573d6000803e3d6000fd5b505050506040513d6020811015612d9557600080fd5b50519050677ce66c50e2840000612daf8260ff8516613bc5565b1115612dfb576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612e3657600080fd5b505afa158015612e4a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612e7357600080fd5b8101908080516040519392919084600160201b821115612e9257600080fd5b908301906020820185811115612ea757600080fd5b8251600160201b811182820188101715612ec057600080fd5b82525081516020918201929091019080838360005b83811015612eed578181015183820152602001612ed5565b50505050905090810190601f168015612f1a5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612f3c57506020815111155b612f8d576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612fc857600080fd5b505afa158015612fdc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561300557600080fd5b8101908080516040519392919084600160201b82111561302457600080fd5b90830190602082018581111561303957600080fd5b8251600160201b81118282018810171561305257600080fd5b82525081516020918201929091019080838360005b8381101561307f578181015183820152602001613067565b50505050905090810190601f1680156130ac5780820380516001836020036101000a031916815260200191505b50604052505081519192508291600211801591506130cc57508051600810155b61311d576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561327157604160f81b828260ff168151811061314057fe5b01602001516001600160f81b0319161080159061317e5750602d60f91b828260ff168151811061316c57fe5b01602001516001600160f81b03191611155b806131d65750606160f81b828260ff168151811061319857fe5b01602001516001600160f81b031916108015906131d65750603d60f91b828260ff16815181106131c457fe5b01602001516001600160f81b03191611155b8061322e5750600360fc1b828260ff16815181106131f057fe5b01602001516001600160f81b0319161080159061322e5750603960f81b828260ff168151811061321c57fe5b01602001516001600160f81b03191611155b6132695760405162461bcd60e51b815260040180806020018281038252602e815260200180615c1a602e913960400191505060405180910390fd5b600101613120565b50600454611004906108fc9061328e90349063ffffffff613c5416565b6040518115909202916000818181858888f193505050501580156132b6573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516132ed615a45565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161334c6402540be400600454613c9690919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d760046133738461475c565b6133916402540be40061143760045434613c5490919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156133ef5781810151838201526020016133d7565b50505050905090810190601f16801561341c5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146134e55760405162461bcd60e51b815260040180806020018281038252602e815260200180615caf602e913960400191505060405180910390fd5b6020811461353a576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b81141561362f5760208201516402540be400810615613627576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b6004556136e5565b6673796e6346656560c81b8114156136a85760208201516402540be4008106156136a0576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b6005556136e5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146137c05760405162461bcd60e51b815260040180806020018281038252602f815260200180615cdd602f913960400191505060405180910390fd5b60ff83166004141561380b576129ae82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148ce92505050565b60ff8316600514156129fe576129ae82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250614a0d92505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b61200481565b60055481565b601181565b61100081565b61271081565b61100481565b60606138e56159f2565b60006138f084614b07565b9150915080613946576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166139f9576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b0390921691909102179055613b50565b815160ff1660011415613b035760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613a5257600080fd5b505afa158015613a66573d6000803e3d6000fd5b505050506040513d6020811015613a7c57600080fd5b505190506001600160a01b03811615613afd5760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b158015613ae457600080fd5b505af1158015613af8573d6000803e3d6000fd5b505050505b50613b50565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610fba576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613c3d57604d60071983011115613c1f576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613c36836007198401600a0a63ffffffff613c9616565b9050611511565b610fba836008849003600a0a63ffffffff614c5816565b6000610fba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614cb1565b6000610fba83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d48565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613cf35750508351909150613d1e906001600160a01b0316614dad565b81600081518110613d2b57fe5b6020026020010181905250613d4c83602001516001600160a01b0316614dad565b81600181518110613d5957fe5b6020026020010181905250613d74836040015160001c614dd0565b81600281518110613d8157fe5b6020026020010181905250613d998360600151614dd0565b81600381518110613da657fe5b6020026020010181905250613dbe8360800151614dd0565b81600481518110613dcb57fe5b6020026020010181905250613dec8360a001516001600160401b0316614dd0565b81600581518110613df957fe5b6020026020010181905250610fba81614de3565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613e5057600080fd5b505afa158015613e64573d6000803e3d6000fd5b505050506040513d6020811015613e7a57600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613ec657600080fd5b505afa158015613eda573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613f0357600080fd5b8101908080516040519392919084600160201b821115613f2257600080fd5b908301906020820185811115613f3757600080fd5b8251600160201b811182820188101715613f5057600080fd5b82525081516020918201929091019080838360005b83811015613f7d578181015183820152602001613f65565b50505050905090810190601f168015613faa5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ffa57600080fd5b505afa15801561400e573d6000803e3d6000fd5b505050506040513d602081101561402457600080fd5b5051608087015160608801519192506000916140459163ffffffff613c5416565b9050428760c001516001600160401b0316101561406a57506001935061151192505050565b614078838860200151614e6d565b61408a57506002935061151192505050565b808211156140a057506003935061151192505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156140e257600080fd5b505afa1580156140f6573d6000803e3d6000fd5b505050506040513d602081101561410c57600080fd5b50511461412157506004935061151192505050565b8660a0015160ff16841461413d57506005935061151192505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561418257600080fd5b505afa158015614196573d6000803e3d6000fd5b505050506040513d60208110156141ac57600080fd5b50516001600160a01b031614158061424e57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561421f57600080fd5b505afa158015614233573d6000803e3d6000fd5b505050506040513d602081101561424957600080fd5b505114155b1561426157506006935061151192505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b606081526020019060019003908161428757505083519091506142af9063ffffffff16614dd0565b816000815181106142bc57fe5b60200260200101819052506142d7836020015160001c614dd0565b81600181518110613df957fe5b6142ec6159bd565b60006142f783614f55565b9150915080614344576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166144a55760808201516040516110049180156108fc02916000818181858888f193505050501580156143a7573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b15801561442157600080fd5b505af1158015614435573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061458e565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146144f9576040519150601f19603f3d011682016040523d82523d6000602084013e6144fe565b606091505b505090508061453b5760808301516040516110029180156108fc02916000818181858888f19350505050158015614539573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614599615a89565b60006145a483615062565b91509150806145f1576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff166146715760408083015190516110049180156108fc02916000818181858888f1935050505015801561462f573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061458e565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114614714576040519150601f19603f3d011682016040523d82523d6000602084013e614719565b606091505b50509050806147565760408084015190516110029180156108fc02916000818181858888f19350505050158015614754573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b606081526020019060019003908161477857505083519091506147a3906001600160a01b0316614dad565b816000815181106147b057fe5b60200260200101819052506147d183602001516001600160a01b0316614dad565b816001815181106147de57fe5b60200260200101819052506147f9836040015160001c614dd0565b8160028151811061480657fe5b6020026020010181905250614821836060015160001c614dd0565b8160038151811061482e57fe5b60200260200101819052506148468360800151614dd0565b8160048151811061485357fe5b602002602001018190525061486e8360a0015160ff16614dd0565b8160058151811061487b57fe5b60200260200101819052506148938360c00151614dd0565b816006815181106148a057fe5b60200260200101819052506148c18360e001516001600160401b0316614dd0565b81600781518110613df957fe5b6148d6615a45565b60006148e18361512e565b915091508061492e576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614978906402540be40063ffffffff614c5816565b6040516000818181858888f193505050503d80600081146149b5576040519150601f19603f3d011682016040523d82523d6000602084013e6149ba565b606091505b50509050806147565760c0830151611002906108fc906149e5906402540be40063ffffffff614c5816565b6040518115909202916000818181858888f19350505050158015614754573d6000803e3d6000fd5b614a156159bd565b6000614a208361527f565b9150915080614a6d576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614a9a906402540be40063ffffffff614c5816565b6040516000818181858888f193505050503d8060008114614ad7576040519150601f19603f3d011682016040523d82523d6000602084013e614adc565b606091505b5050905080614756576080830151611002906108fc906149e5906402540be40063ffffffff614c5816565b614b0f6159f2565b6000614b196159f2565b614b21615ab0565b614b32614b2d8661538f565b6153b4565b90506000805b614b41836153fe565b15614c4b5780614b6657614b5c614b578461541f565b61546d565b60ff168452614c43565b8060011415614b8557614b7b614b578461541f565b6020850152614c43565b8060021415614bb257614b9f614b9a8461541f565b615522565b6001600160a01b03166040850152614c43565b8060031415614bd157614bc7614b578461541f565b6060850152614c43565b8060041415614bf057614be6614b578461541f565b6080850152614c43565b8060051415614c1257614c05614b578461541f565b60ff1660a0850152614c43565b8060061415614c3e57614c27614b578461541f565b6001600160401b031660c085015260019150614c43565b614c4b565b600101614b38565b5091935090915050915091565b600082614c6757506000611511565b82820282848281614c7457fe5b0414610fba5760405162461bcd60e51b8152600401808060200182810382526021815260200180615c486021913960400191505060405180910390fd5b60008184841115614d405760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d05578181015183820152602001614ced565b50505050905090810190601f168015614d325780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614d975760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614d05578181015183820152602001614ced565b506000838581614da357fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610fba8161553c565b6060611511614dde83615592565b61553c565b6060815160001415614e0457506040805160008152602081019091526116ab565b606082600081518110614e1357fe5b602002602001015190506000600190505b8351811015614e5457614e4a82858381518110614e3d57fe5b6020026020010151615678565b9150600101614e24565b50610fba614e67825160c060ff166156f5565b82615678565b8151600090839060081080614e83575080516002115b15614e92576000915050611511565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614ec657fe5b6020910101516001600160f81b031916602d60f81b14614eeb57600092505050611511565b600160005b8351811015614f4b57828181518110614f0557fe5b602001015160f81c60f81b6001600160f81b031916848281518110614f2657fe5b01602001516001600160f81b03191614614f435760009150614f4b565b600101614ef0565b5095945050505050565b614f5d6159bd565b6000614f676159bd565b614f6f615ab0565b614f7b614b2d8661538f565b90506000805b614f8a836153fe565b15614c4b5780614fb057614fa0614b9a8461541f565b6001600160a01b0316845261505a565b8060011415614fd857614fc5614b9a8461541f565b6001600160a01b0316602085015261505a565b8060021415614ffa57614fed614b578461541f565b60ff16604085015261505a565b80600314156150195761500f614b578461541f565b606085015261505a565b80600414156150385761502e614b578461541f565b608085015261505a565b8060051415614c3e5761504d614b578461541f565b60ff1660a0850152600191505b600101614f81565b61506a615a89565b6000615074615a89565b61507c615ab0565b615088614b2d8661538f565b90506000805b615097836153fe565b15614c4b57806150bd576150ad614b9a8461541f565b6001600160a01b03168452615126565b80600114156150e5576150d2614b9a8461541f565b6001600160a01b03166020850152615126565b8060021415615104576150fa614b578461541f565b6040850152615126565b8060031415614c3e57615119614b578461541f565b60ff166060850152600191505b60010161508e565b615136615a45565b6000615140615a45565b615148615ab0565b615154614b2d8661538f565b90506000805b615163836153fe565b15614c4b578061518957615179614b9a8461541f565b6001600160a01b03168452615277565b80600114156151b15761519e614b9a8461541f565b6001600160a01b03166020850152615277565b80600214156151d0576151c6614b578461541f565b6040850152615277565b80600314156151ef576151e5614b578461541f565b6060850152615277565b806004141561520e57615204614b578461541f565b6080850152615277565b806005141561523057615223614b578461541f565b60ff1660a0850152615277565b806006141561524f57615245614b578461541f565b60c0850152615277565b8060071415614c3e57615264614b578461541f565b6001600160401b031660e0850152600191505b60010161515a565b6152876159bd565b60006152916159bd565b615299615ab0565b6152a5614b2d8661538f565b90506000805b6152b4836153fe565b15614c4b57806152da576152ca614b9a8461541f565b6001600160a01b03168452615387565b8060011415615302576152ef614b9a8461541f565b6001600160a01b03166020850152615387565b806002141561532157615317614b578461541f565b6040850152615387565b806003141561534057615336614b578461541f565b6060850152615387565b806004141561535f57615355614b578461541f565b6080850152615387565b8060051415614c3e57615374614b578461541f565b6001600160401b031660a0850152600191505b6001016152ab565b615397615ad0565b506040805180820190915281518152602082810190820152919050565b6153bc615ab0565b6153c5826157ed565b6153ce57600080fd5b60006153dd8360200151615827565b60208085015160408051808201909152868152920190820152915050919050565b6000615408615ad0565b505080518051602091820151919092015191011190565b615427615ad0565b615430826153fe565b61543957600080fd5b602082015160006154498261588a565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061548257508151602110155b61548b57600080fd5b600061549a8360200151615827565b905080836000015110156154f5576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613b6257506020919091036101000a90049392505050565b805160009060151461553357600080fd5b6115118261546d565b60608151600114801561556e5750607f60f81b8260008151811061555c57fe5b01602001516001600160f81b03191611155b1561557a5750806116ab565b61151161558c8351608060ff166156f5565b83615678565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166155d6575060186155fa565b6fffffffffffffffffffffffffffffffff1984166155f6575060106155fa565b5060005b60208110156156305781818151811061560f57fe5b01602001516001600160f81b0319161561562857615630565b6001016155fa565b60008160200390506060816040519080825280601f01601f191660200182016040528015615665576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b818310156156a9578051835260209283019201615691565b50855184518101855292509050808201602086015b818310156156d65780518352602092830192016156be565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310615745576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161579f5782840160f81b8160008151811061578157fe5b60200101906001600160f81b031916908160001a9053509050611511565b60606157aa85615592565b90508381510160370160f81b826000815181106157c357fe5b60200101906001600160f81b031916908160001a9053506157e48282615678565b95945050505050565b80516000906157fe575060006116ab565b6020820151805160001a9060c082101561581d576000925050506116ab565b5060019392505050565b8051600090811a60808110156158415760009150506116ab565b60b881108061585c575060c0811080159061585c575060f881105b1561586b5760019150506116ab565b60c081101561587f5760b5190190506116ab565b60f5190190506116ab565b80516000908190811a60808110156158a557600191506159b6565b60b88110156158ba57607e19810191506159b6565b60c081101561593457600060b78203600186019550806020036101000a86510491506001810182019350508083101561592e576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506159b6565b60f88110156159495760be19810191506159b6565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156159b4576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040518060400160405280615ac3615ad0565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a164736f6c6343000604000a" + "code": "0x6080604052600436106103e45760003560e01c80637d078e1311610208578063b795031711610118578063dc927faf116100ab578063f9a2bbc71161007a578063f9a2bbc714610c63578063fa9e915914610c78578063fc3e59081461065c578063fd6a687914610c8d578063fe3a2af514610ca2576103e4565b8063dc927faf14610c0f578063df8079e914610c24578063e605bca014610c39578063f1fad10414610c4e576103e4565b8063c8e704a4116100e7578063c8e704a41461065c578063d117a11014610b79578063d7109ce614610bfa578063d9e6dae91461078a576103e4565b8063b7950317146107de578063bd32d3f91461056d578063c81b166214610b64578063c8509d8114610955576103e4565b80639a854bbd1161019b578063aa82dce11161016a578063aa82dce114610a5a578063aad5606314610a6f578063ab51bb9614610a84578063ab67a485146107de578063ac43175114610a99576103e4565b80639a854bbd14610a065780639dc0926214610a1b578063a1a11bf514610a30578063a78abc1614610a45576103e4565b8063859180fb116101d7578063859180fb1461077557806394553a4e1461059757806395b9ad26146109dc57806396713da9146109f1576103e4565b80637d078e13146105825780637e434d541461092b5780637ec816dd14610940578063831d65d114610955576103e4565b8063493279b11161030357806366dea52a11610296578063718a8aa811610265578063718a8aa8146108bc57806372c4e086146108d157806375d47a0a1461090157806377d9dae8146107f35780637942fd0514610916576103e4565b806366dea52a146107de5780636b3f1307146107f35780636e47b482146108a757806370fd5bad146107de576103e4565b806351e80672116102d257806351e80672146107b45780635d499b1b146107c95780635f558f86146107de578063613684751461078a576103e4565b8063493279b1146107495780634bc81c00146107755780634bf6c8821461078a57806351b4dce31461079f576103e4565b80632d89ac321161037b578063401809f91161034a578063401809f91461065c57806343756e5c14610671578063445fcefe14610686578063487c88ac14610582576103e4565b80632d89ac32146105825780632e02d776146105f657806337e6ecda146106295780633dffc38714610582576103e4565b80631f91600b116103b75780631f91600b1461056d57806323996b531461058257806325c751b71461059757806328087028146105e1576103e4565b80630bee7a67146103e95780630e2374a5146104175780630f212b1b146104485780631182b87514610473575b600080fd5b3480156103f557600080fd5b506103fe610cb7565b6040805163ffffffff9092168252519081900360200190f35b34801561042357600080fd5b5061042c610cbc565b604080516001600160a01b039092168252519081900360200190f35b34801561045457600080fd5b5061045d610cc2565b6040805160ff9092168252519081900360200190f35b34801561047f57600080fd5b506104f86004803603604081101561049657600080fd5b60ff8235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460018302840111600160201b831117156104ed57600080fd5b509092509050610cc7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053257818101518382015260200161051a565b50505050905090810190601f16801561055f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057957600080fd5b5061045d610d43565b34801561058e57600080fd5b5061045d610d48565b6105cd600480360360408110156105ad57600080fd5b5080356001600160a01b0316906020013567ffffffffffffffff16610d4d565b604080519115158252519081900360200190f35b3480156105ed57600080fd5b5061042c610d89565b34801561060257600080fd5b506105cd6004803603602081101561061957600080fd5b50356001600160a01b0316610d8f565b34801561063557600080fd5b506105cd6004803603602081101561064c57600080fd5b50356001600160a01b0316610da4565b34801561066857600080fd5b5061045d610db9565b34801561067d57600080fd5b5061042c610dbe565b34801561069257600080fd5b50610737600480360360208110156106a957600080fd5b810190602081018135600160201b8111156106c357600080fd5b8201836020820111156106d557600080fd5b803590602001918460018302840111600160201b831117156106f657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc4945050505050565b60408051918252519081900360200190f35b34801561075557600080fd5b5061075e610f23565b6040805161ffff9092168252519081900360200190f35b34801561078157600080fd5b5061045d610f28565b34801561079657600080fd5b5061045d610f2d565b3480156107ab57600080fd5b5061042c610f32565b3480156107c057600080fd5b5061042c610f38565b3480156107d557600080fd5b50610737610f3e565b3480156107ea57600080fd5b5061045d610f47565b6105cd6004803603604081101561080957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460018302840111600160201b8311171561086657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d4d945050505050565b3480156108b357600080fd5b5061042c610f4c565b3480156108c857600080fd5b5061045d610f52565b6105cd600480360360208110156108e757600080fd5b810190602081018135600160201b81111561083357600080fd5b34801561090d57600080fd5b5061042c610f57565b34801561092257600080fd5b5061045d610f5d565b34801561093757600080fd5b5061042c610f62565b34801561094c57600080fd5b50610737610f68565b34801561096157600080fd5b506109da6004803603604081101561097857600080fd5b60ff8235169190810190604081016020820135600160201b81111561099c57600080fd5b8201836020820111156109ae57600080fd5b803590602001918460018302840111600160201b831117156109cf57600080fd5b509092509050610f6e565b005b3480156109e857600080fd5b5061045d610fae565b3480156109fd57600080fd5b5061045d610fb3565b348015610a1257600080fd5b50610737610fb8565b348015610a2757600080fd5b5061042c610fc4565b348015610a3c57600080fd5b5061042c610fca565b348015610a5157600080fd5b506105cd610fd0565b348015610a6657600080fd5b5061042c610fd9565b348015610a7b57600080fd5b5061042c610fdf565b348015610a9057600080fd5b506103fe610fe5565b348015610aa557600080fd5b506109da60048036036040811015610abc57600080fd5b810190602081018135600160201b811115610ad657600080fd5b820183602082011115610ae857600080fd5b803590602001918460018302840111600160201b83111715610b0957600080fd5b919390929091602081019035600160201b811115610b2657600080fd5b820183602082011115610b3857600080fd5b803590602001918460018302840111600160201b83111715610b5957600080fd5b509092509050610fea565b348015610b7057600080fd5b5061042c61102a565b348015610b8557600080fd5b50610ba360048036036020811015610b9c57600080fd5b5035611030565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b348015610c0657600080fd5b50610737611088565b348015610c1b57600080fd5b5061042c61108d565b348015610c3057600080fd5b5061042c611093565b348015610c4557600080fd5b50610737611099565b348015610c5a57600080fd5b5061045d61109f565b348015610c6f57600080fd5b5061042c6110a4565b348015610c8457600080fd5b506107376110aa565b348015610c9957600080fd5b5061042c6110b0565b348015610cae57600080fd5b5061045d610fe5565b606481565b61200181565b600681565b60603361200014610d095760405162461bcd60e51b815260040180806020018281038252602f815260200180611201602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600481565b600181565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b6020810151600090610dd4611196565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610e5c57600092505050610f1e565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610eba57600080fd5b505afa158015610ece573d6000803e3d6000fd5b505050506040513d6020811015610ee457600080fd5b505160808301516060840151919250600091610f059163ffffffff6110b616565b9050610f17818363ffffffff6110b616565b9450505050505b919050565b603881565b600581565b600881565b61200681565b61200081565b6402540be40081565b600281565b61100581565b601081565b61100881565b600b81565b61200381565b60045481565b3361200014610d095760405162461bcd60e51b815260040180806020018281038252602f815260200180611201602f913960400191505060405180910390fd5b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610d095760405162461bcd60e51b815260040180806020018281038252602e8152602001806111d3602e913960400191505060405180910390fd5b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b604d81565b61100381565b61200481565b60055481565b601181565b61100081565b61271081565b61100481565b60006110f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110ff565b9392505050565b6000818484111561118e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561115357818101518382015260200161113b565b50505050905090810190601f1680156111805780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002000": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106103e65760003560e01c806374f079b81161020a578063c27cdcfb11610125578063df8079e9116100b8578063f1fad10411610087578063f1fad10414610bac578063f7a251d714610bb4578063f9a2bbc714610c2c578063fc3e590814610c34578063fd6a687914610c3c576103e6565b8063df8079e914610b74578063e1c7392a14610b7c578063e3b0480514610b84578063e6400bbe14610ba4576103e6565b8063d31f968d116100f4578063d31f968d14610b2d578063d76a867514610b5c578063dc40433114610b64578063dc927faf14610b6c576103e6565b8063c27cdcfb14610af5578063c780e9de14610b15578063c81b166214610b1d578063ccc108d714610b25576103e6565b80639dc092621161019d578063aad560631161016c578063aad5606314610a27578063ab51bb9614610a2f578063ac43175114610a37578063b0355f5b146107d6576103e6565b80639dc0926214610a07578063a1a11bf514610a0f578063a78abc1614610a17578063aa82dce114610a1f576103e6565b806384013b6a116101d957806384013b6a1461091c578063863fe4ab146109f75780638cc8f561146108e457806396713da9146109ff576103e6565b806374f079b8146108fc57806375d47a0a146109045780637942fd051461090c5780637e434d5414610914576103e6565b806343756e5c116103055780636a3cb34d116102985780636e47a51a116102675780636e47a51a146108bc5780636e47b482146108dc57806370fd5bad146108e4578063718a8aa8146108ec578063719482d5146108f4576103e6565b80636a3cb34d146108645780636bacff2c1461086c5780636c46aa68146108645780636de380bd146108b4576103e6565b806351e80672116102d457806351e806721461081e5780635692ddd3146108265780635f8321771461082e57806363e1394e1461085c576103e6565b806343756e5c146107fe578063493279b1146108065780634bf6c8821461080e57806351b4dce314610816576103e6565b8063299b533d1161037d5780633a648b151161034c5780633a648b15146106725780633bdc47a6146106ae5780633dffc387146107d6578063422f9050146107de576103e6565b8063299b533d146105f85780632af6f3991461062c5780632ff32aea14610649578063308325f41461066a576103e6565b80631d130935116103b95780631d130935146104685780631e275ae11461048457806322556cdc146105e857806328087028146105f0576103e6565b806305e68258146103eb5780630bee7a67146104095780630e2374a51461042a57806314b3023b1461044e575b600080fd5b6103f3610c44565b6040805160ff9092168252519081900360200190f35b610411610c49565b6040805163ffffffff9092168252519081900360200190f35b610432610c4e565b604080516001600160a01b039092168252519081900360200190f35b610456610c54565b60408051918252519081900360200190f35b610470610c5a565b604080519115158252519081900360200190f35b6105e6600480360361010081101561049b57600080fd5b81018160a081016080820135600160201b8111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111600160201b831117156104eb57600080fd5b919390929091602081019035600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460018302840111600160201b8311171561053b57600080fd5b919390929091602081019035600160201b81111561055857600080fd5b82018360208201111561056a57600080fd5b803590602001918460018302840111600160201b8311171561058b57600080fd5b919390929091602081019035600160201b8111156105a857600080fd5b8201836020820111156105ba57600080fd5b803590602001918460018302840111600160201b831117156105db57600080fd5b509092509050610c63565b005b610456611347565b61043261134c565b6106156004803603602081101561060e57600080fd5b5035611352565b6040805161ffff9092168252519081900360200190f35b6104706004803603602081101561064257600080fd5b5035611368565b61065161137d565b60408051600792830b90920b8252519081900360200190f35b610456611386565b6106926004803603602081101561068857600080fd5b503560ff1661138c565b604080516001600160401b039092168252519081900360200190f35b610761600480360360608110156106c457600080fd5b60ff82351691602081013591810190606081016040820135600160201b8111156106ed57600080fd5b8201836020820111156106ff57600080fd5b803590602001918460018302840111600160201b8311171561072057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113a7945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561079b578181015183820152602001610783565b50505050905090810190601f1680156107c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f361141d565b610470600480360360208110156107f457600080fd5b503560ff16611422565b610432611437565b61061561143d565b6103f3611442565b610432611447565b61043261144d565b610456611453565b6105e66004803603604081101561084457600080fd5b506001600160a01b0381358116916020013516611483565b6104566116e3565b61061561170b565b6108896004803603602081101561088257600080fd5b5035611710565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b61045661173f565b610432600480360360208110156108d257600080fd5b503560ff16611766565b610432611781565b6103f361170b565b6103f3611787565b61061561141d565b61045661178c565b610432611792565b6103f3611798565b61043261179d565b6105e6600480360360a081101561093257600080fd5b810190602081018135600160201b81111561094c57600080fd5b82018360208201111561095e57600080fd5b803590602001918460018302840111600160201b8311171561097f57600080fd5b919390929091602081019035600160201b81111561099c57600080fd5b8201836020820111156109ae57600080fd5b803590602001918460018302840111600160201b831117156109cf57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166117a3565b610456612a5d565b6103f3612a65565b610432612a6a565b610432612a70565b610470612a76565b610432612a7f565b610432612a85565b610411610c44565b6105e660048036036040811015610a4d57600080fd5b810190602081018135600160201b811115610a6757600080fd5b820183602082011115610a7957600080fd5b803590602001918460018302840111600160201b83111715610a9a57600080fd5b919390929091602081019035600160201b811115610ab757600080fd5b820183602082011115610ac957600080fd5b803590602001918460018302840111600160201b83111715610aea57600080fd5b509092509050612a8b565b61069260048036036020811015610b0b57600080fd5b503560ff1661354f565b61045661356a565b61043261358e565b6105e6613594565b61047060048036036040811015610b4357600080fd5b5080356001600160a01b0316906020013560ff166137e8565b610761613808565b610456613827565b61043261382d565b610432613833565b6105e6613839565b61069260048036036020811015610b9a57600080fd5b503560ff16613bf0565b6105e6613c0b565b6103f3613e2a565b6105e660048036036060811015610bca57600080fd5b60ff8235169190810190604081016020820135600160201b811115610bee57600080fd5b820183602082011115610c0057600080fd5b803590602001918460018302840111600160201b83111715610c2157600080fd5b919350915035613e2f565b610432613f72565b6103f3613f78565b610432613f7d565b600081565b606481565b61200181565b60015481565b600b5460ff1681565b60005460ff16610ca8576040805162461bcd60e51b81526020600482015260196024820152600080516020614a60833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b158015610cf357600080fd5b505afa158015610d07573d6000803e3d6000fd5b505050506040513d6020811015610d1d57600080fd5b5051610d5a5760405162461bcd60e51b8152600401808060200182810382526023815260200180614a806023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610da657600080fd5b505afa158015610dba573d6000803e3d6000fd5b505050506040513d6020811015610dd057600080fd5b5051610e0d5760405162461bcd60e51b8152600401808060200182810382526023815260200180614a806023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610e86576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610eca576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b8888604051808383808284376040519201829003822094508f93508e9250819050838380828437808301925050509250505060405180910390201415610f46576040805162461bcd60e51b815260206004820152600c60248201526b1cd85b59481c185e5b1bd85960a21b604482015290519081900360640190fd5b60606001600160401b0360408e01358116908e83013516610f678282613f83565b80516020808301919091206000818152600e9092526040909120549194509060ff1615610fd0576040805162461bcd60e51b8152602060048201526012602482015271185b1c9958591e4818da185b1b195b99d95960721b604482015290519081900360640190fd5b6000908152600e60205260408120805460ff191660011790558f8160200201356001600160401b0316905060608f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b1580156110c657600080fd5b505afa1580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b505160408051808201909152600381526269626360e81b602082015290915061111d908290898686613fcb565b611166576040805162461bcd60e51b81526020600482015260156024820152740696e76616c6964206d65726b6c652070726f6f663605c1b604482015290519081900360640190fd5b5050505060008f60016004811061117957fe5b60200201356001600160401b0316905060608d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815293945060609392508d91508c908190840183828082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b505160408051808201909152600381526269626360e81b602082015290915061129c908290898686613fcb565b6112e5576040805162461bcd60e51b8152602060048201526015602482015274696e76616c6964206d65726b6c652070726f6f663160581b604482015290519081900360640190fd5b505050506112f16140c8565b604080516001600160401b038416815260ff83166020820152815133927f039eb91179ffd7d3b6e97f8ea106e748e827f910b872375dbc9c14a362319c3c928290030190a2505050505050505050505050505050565b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60606000825160210190506060816040519080825280601f01601f1916602001820160405280156113df576020820181803683370190505b506021810186905260018101879052828152905060418101600061140286614146565b50905061141181838851614150565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b603881565b600881565b61200681565b61200081565b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b8152905190819003601801902081565b60005460ff166114c8576040805162461bcd60e51b81526020600482015260196024820152600080516020614a60833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d60208110156115a057600080fd5b50519050806115ad575060155b6000821180156115bd5750808211155b6115fc576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b604080516001600160a01b038087166020808401919091529086168284015282518083038401815260608301808552815191909201207710d05390d15317d514905394d1915497d41493d413d4d05360421b90915291519081900360780190206000906116699083614191565b905080156116db5760408051630911a2c160e11b81526001600160a01b03888116600483015287166024820152905161100491631223458291604480830192600092919082900301818387803b1580156116c257600080fd5b505af11580156116d6573d6000803e3d6000fd5b505050505b505050505050565b604080516f14d554d411539117d41493d413d4d05360821b8152905190819003601001902081565b600281565b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f01902081565b6005602052600090815260409020546001600160a01b031681565b61100581565b601081565b60035481565b61100881565b600b81565b61200381565b60005460ff166117e8576040805162461bcd60e51b81526020600482015260196024820152600080516020614a60833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d602081101561185157600080fd5b50516118a4576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114611914576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b15801561198957600080fd5b505afa15801561199d573d6000803e3d6000fd5b505050506040513d60208110156119b357600080fd5b50516119f05760405162461bcd60e51b8152600401808060200182810382526023815260200180614a806023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316611a5a576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b039081169083161015611ac3576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614611b155760ff81166000908152600a60205260409020805467ffffffffffffffff19166001600160401b0384161790555b600b5460ff1615611b59576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b60608e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050611c9d6110036001600160a01b031663cba510a98e6040518263ffffffff1660e01b815260040180826001600160401b03166001600160401b0316815260200191505060206040518083038186803b158015611c4657600080fd5b505afa158015611c5a573d6000803e3d6000fd5b505050506040513d6020811015611c7057600080fd5b505160408051808201909152600381526269626360e81b6020820152611c968e8e613f83565b8585613fcb565b611ce5576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038e16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015611d3157600080fd5b505afa158015611d45573d6000803e3d6000fd5b505050506040513d6020811015611d5b57600080fd5b505190508b8b600080806060611d7089614476565b935093509350935083611e32578460ff16866001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611dea578181015183820152602001611dd2565b50505050905090810190601f168015611e175780820380516001836020036101000a031916815260200191505b509250505060405180910390a3505050505050505050612a4d565b6040805160ff85811682529151918716916001600160401b038916917f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad40919081900360200190a360ff83166123b75760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015611eff578181015183820152602001611ee7565b50505050905090810190601f168015611f2c5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015611f4c57600080fd5b505af192505050801561203057506040513d6000823e601f3d908101601f191682016040526020811015611f7f57600080fd5b8101908080516040519392919084600160201b821115611f9e57600080fd5b908301906020820185811115611fb357600080fd5b8251600160201b811182820188101715611fcc57600080fd5b82525081516020918201929091019080838360005b83811015611ff9578181015183820152602001611fe1565b50505050905090810190601f1680156120265780820380516001836020036101000a031916815260200191505b5060405250505060015b612342576040516000815260443d101561204c575060006120e7565b60046000803e60005160e01c6308c379a0811461206d5760009150506120e7565b60043d036004833e81513d60248201116001600160401b0382111715612098576000925050506120e7565b80830180516001600160401b038111156120b95760009450505050506120e7565b8060208301013d86018111156120d7576000955050505050506120e7565b601f01601f191660405250925050505b806120f25750612204565b60ff8716600090815260076020526040812054612129916001600160401b0390911690899061212490600290886113a7565b614526565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156121c45781810151838201526020016121ac565b50505050905090810190601f1680156121f15780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061233d565b3d80801561222e576040519150601f19603f3d011682016040523d82523d6000602084013e612233565b606091505b5060ff8716600090815260076020526040812054612266916001600160401b0390911690899061212490600290886113a7565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b838110156123015781810151838201526020016122e9565b50505050905090810190601f16801561232e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6123b1565b8051156123af5760ff871660009081526007602052604081205461237b916001600160401b0390911690899061212490600190866113a7565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b50612985565b60ff83166001141561265b5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b83811015612441578181015183820152602001612429565b50505050905090810190601f16801561246e5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561248e57600080fd5b505af192505050801561249f575060015b6123b1576040516000815260443d10156124bb57506000612556565b60046000803e60005160e01c6308c379a081146124dc576000915050612556565b60043d036004833e81513d60248201116001600160401b038211171561250757600092505050612556565b80830180516001600160401b03811115612528576000945050505050612556565b8060208301013d860181111561254657600095505050505050612556565b601f01601f191660405250925050505b8061256157506125c6565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156121c45781810151838201526020016121ac565b3d8080156125f0576040519150601f19603f3d011682016040523d82523d6000602084013e6125f5565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd297735193869390928392830191850190808383600083156123015781810151838201526020016122e9565b60ff8316600214156129855760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b838110156126e55781810151838201526020016126cd565b50505050905090810190601f1680156127125780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561273257600080fd5b505af1925050508015612743575060015b612983576040516000815260443d101561275f575060006127fa565b60046000803e60005160e01c6308c379a081146127805760009150506127fa565b60043d036004833e81513d60248201116001600160401b03821117156127ab576000925050506127fa565b80830180516001600160401b038111156127cc5760009450505050506127fa565b8060208301013d86018111156127ea576000955050505050506127fa565b601f01601f191660405250925050505b8061280557506128ae565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561286e578181015183820152602001612856565b50505050905090810190601f16801561289b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612983565b3d8080156128d8576040519150601f19603f3d011682016040523d82523d6000602084013e6128dd565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561294757818101518382015260200161292f565b50505050905090810190601f1680156129745780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e6918a913391879116806129b7575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015612a1757600080fd5b505af1158015612a2b573d6000803e3d6000fd5b505050506040513d6020811015612a4157600080fd5b50505050505050505050505b5050505050505050505050505050565b630100380081565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b3361100714612acb5760405162461bcd60e51b815260040180806020018281038252602e8152602001806149b6602e913960400191505060405180910390fd5b600b5460ff1615612b0f576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b612b7884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506146c09050565b15612c1357604080516020601f8401819004810282018101909252828152600091612bbb918585808385018382808284376000920191909152506147a792505050565b90506127108111158015612bd05750600a8110155b612c0b5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a2e6032913960400191505060405180910390fd5b6001556134bd565b612c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506146c09050565b15612e0457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050612cff5760405162461bcd60e51b815260040180806020018281038252605a8152602001806148cf605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590612d1d816147ac565b612d6e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a350505050506134bd565b612e7184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506146c09050565b15612fa257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050612ef45760405162461bcd60e51b815260040180806020018281038252604a8152602001806149e4604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015612f98576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b50505050506134bd565b61300684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c73757370656e6451756f72756d60981b602082015291506146c09050565b1561313b576002811461304a5760405162461bcd60e51b815260040180806020018281038252602d81526020018061495d602d913960400191505060405180910390fd5b600061308d600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a792505050565b905060008161ffff161180156130a7575060648161ffff16105b6130f1576040805162461bcd60e51b8152602060048201526016602482015275696e76616c69642073757370656e642071756f72756d60501b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100190206000908152600d60205220805461ffff90921661ffff199092169190911790556134bd565b61319e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81526b72656f70656e51756f72756d60a01b602082015291506146c09050565b156132d157600281146131e25760405162461bcd60e51b815260040180806020018281038252602c81526020018061498a602c913960400191505060405180910390fd5b6000613225600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a792505050565b905060008161ffff1611801561323f575060648161ffff16105b613288576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642072656f70656e2071756f72756d60581b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152815190819003600f0190206000908152600d60205220805461ffff90921661ffff199092169190911790556134bd565b61333c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601481527363616e63656c5472616e7366657251756f72756d60601b602082015291506146c09050565b1561348057600281146133805760405162461bcd60e51b81526004018080602001828103825260348152602001806149296034913960400191505060405180910390fd5b60006133c3600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a792505050565b905060008161ffff161180156133dd575060648161ffff16105b61342e576040805162461bcd60e51b815260206004820152601e60248201527f696e76616c69642063616e63656c207472616e736665722071756f72756d0000604482015290519081900360640190fd5b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b815281519081900360180190206000908152600d60205220805461ffff90921661ffff199092169190911790556134bd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081565b61100281565b60005460ff166135d9576040805162461bcd60e51b81526020600482015260196024820152600080516020614a60833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561361c57600080fd5b505afa158015613630573d6000803e3d6000fd5b505050506040513d602081101561364657600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561368757600080fd5b505afa15801561369b573d6000803e3d6000fd5b505050506040513d60208110156136b157600080fd5b50519050806136be575060155b6000821180156136ce5750808211155b61370d576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16613754576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f0190206000906137a5907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470614191565b905080156137e357600b805460ff1916905560405133907f899fe8c37dc61708a3aaa99c4bf143346c1d1da69af79be9e8920c0a6785b75290600090a25b505050565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b610e1081565b61100381565b61200481565b60005460ff1615613891576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16613c50576040805162461bcd60e51b81526020600482015260196024820152600080516020614a60833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015613c9357600080fd5b505afa158015613ca7573d6000803e3d6000fd5b505050506040513d6020811015613cbd57600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015613cfe57600080fd5b505afa158015613d12573d6000803e3d6000fd5b505050506040513d6020811015613d2857600080fd5b5051905080613d35575060155b600082118015613d455750808211155b613d84576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff1615613dc8576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b81529051908190036010019020600090613e1a907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470614191565b905080156137e3576137e36140c8565b601181565b60005460ff16613e74576040805162461bcd60e51b81526020600482015260196024820152600080516020614a60833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116613ed15760405162461bcd60e51b815260040180806020018281038252603181526020018061489e6031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b031692613f369284928a9261212492909189918c908c90819084018382808284376000920191909152506113a792505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b60408051600e808252818301909252606091630100380060ff851617918391602082018180368337505050600e81810187905260068201939093529182525090505b92915050565b600085613fda575060006140bf565b606082518451865160800101016040519080825280601f01601f191660200182016040528015614011576020820181803683370190505b509050600061401f826147b2565b60208089015182520190508660008061403789614146565b8086526020909501949092509050614050828583614150565b9283019261405d88614146565b8086526020909501949092509050614076828583614150565b9283018a81526020019261408987614146565b9092509050614099828583614150565b5083516020016140a76147b8565b60208183886065600019fa5051600114955050505050505b95945050505050565b600b5460ff161561410c576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b600b805460ff1916600117905560405133907f6f123d3d54c84a7960a573b31c221dcd86e13fd849c5adb0c6ca851468cc1ae490600090a2565b8051602090910191565b5b60208110614170578251825260209283019290910190601f1901614151565b915181516020939093036101000a6000190180199091169216919091179052565b6000828152600d602052604081205461ffff1661425a57604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100181206000908152600d6020818152848320805461ffff199081166001179091556e149153d4115397d41493d413d4d053608a1b8552855194859003600f01852084528282528584208054821660029081179091557710d05390d15317d514905394d1915497d41493d413d4d05360421b8652865195869003601801909520845291905292902080549092161790555b6000838152600c6020526040902080546201000090046001600160801b03164210158061428b575082816001015414155b1561435e576000848152600d602090815260409182902054835461ffff90911661ffff199091161771ffffffffffffffffffffffffffffffff0000191662010000610e1042016001600160801b03160217835560018084018690558251918201909252338152614300916002840191906147d6565b5080546040805161ffff83168152620100009092046001600160801b0316602083015281810185905251339186917f9e109f0e55ef32e99e4880be2ec357f1ddb3469c79d0747ef4762da6e89fabe5916060908290030190a3614412565b60005b60028201548110156143e957336001600160a01b031682600201828154811061438657fe5b6000918252602090912001546001600160a01b031614156143e1576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b600101614361565b50600281018054600181018255600091825260209091200180546001600160a01b031916331790555b8054600282015461ffff9091161161446c576000848152600c60205260408120805471ffffffffffffffffffffffffffffffffffff191681556001810182905590614460600283018261483b565b50506001915050613fc5565b5060009392505050565b600080600060606021855110156144a657505060408051600080825260208201909252909250829150819061451f565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156144f1576020820181803683370190505b50905060006144ff82614146565b509050614511858260218d5103614150565b506001975091955093509150505b9193509193565b600b5460ff161561456a576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6002544311156145a9576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556145ea565b600380546001908101918290555410156145ea576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe603885604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614680578181015183820152602001614668565b50505050905090810190601f1680156146ad5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106146f55780518252601f1990920191602091820191016146d6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106147635780518252601f199092019160209182019101614744565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b60405180602001604052806001906020820280368337509192915050565b82805482825590600052602060002090810192821561482b579160200282015b8281111561482b57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147f6565b5061483792915061485c565b5090565b50805460008255906000526020600020908101906148599190614883565b50565b61488091905b808211156148375780546001600160a01b0319168155600101614862565b90565b61488091905b80821115614837576000815560010161488956fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c6572416464726573736c656e677468206f662076616c756520666f722063616e63656c5472616e7366657251756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722073757370656e6451756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722072656f70656e51756f72756d2073686f756c642062652032746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d74686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106103e65760003560e01c806374f079b81161020a578063c27cdcfb11610125578063df8079e9116100b8578063f1fad10411610087578063f1fad10414610bac578063f7a251d714610bb4578063f9a2bbc714610c2c578063fc3e590814610c34578063fd6a687914610c3c576103e6565b8063df8079e914610b74578063e1c7392a14610b7c578063e3b0480514610b84578063e6400bbe14610ba4576103e6565b8063d31f968d116100f4578063d31f968d14610b2d578063d76a867514610b5c578063dc40433114610b64578063dc927faf14610b6c576103e6565b8063c27cdcfb14610af5578063c780e9de14610b15578063c81b166214610b1d578063ccc108d714610b25576103e6565b80639dc092621161019d578063aad560631161016c578063aad5606314610a27578063ab51bb9614610a2f578063ac43175114610a37578063b0355f5b146107d6576103e6565b80639dc0926214610a07578063a1a11bf514610a0f578063a78abc1614610a17578063aa82dce114610a1f576103e6565b806384013b6a116101d957806384013b6a1461091c578063863fe4ab146109f75780638cc8f561146108e457806396713da9146109ff576103e6565b806374f079b8146108fc57806375d47a0a146109045780637942fd051461090c5780637e434d5414610914576103e6565b806343756e5c116103055780636a3cb34d116102985780636e47a51a116102675780636e47a51a146108bc5780636e47b482146108dc57806370fd5bad146108e4578063718a8aa8146108ec578063719482d5146108f4576103e6565b80636a3cb34d146108645780636bacff2c1461086c5780636c46aa68146108645780636de380bd146108b4576103e6565b806351e80672116102d457806351e806721461081e5780635692ddd3146108265780635f8321771461082e57806363e1394e1461085c576103e6565b806343756e5c146107fe578063493279b1146108065780634bf6c8821461080e57806351b4dce314610816576103e6565b8063299b533d1161037d5780633a648b151161034c5780633a648b15146106725780633bdc47a6146106ae5780633dffc387146107d6578063422f9050146107de576103e6565b8063299b533d146105f85780632af6f3991461062c5780632ff32aea14610649578063308325f41461066a576103e6565b80631d130935116103b95780631d130935146104685780631e275ae11461048457806322556cdc146105e857806328087028146105f0576103e6565b806305e68258146103eb5780630bee7a67146104095780630e2374a51461042a57806314b3023b1461044e575b600080fd5b6103f3610c44565b6040805160ff9092168252519081900360200190f35b610411610c49565b6040805163ffffffff9092168252519081900360200190f35b610432610c4e565b604080516001600160a01b039092168252519081900360200190f35b610456610c54565b60408051918252519081900360200190f35b610470610c5a565b604080519115158252519081900360200190f35b6105e6600480360361010081101561049b57600080fd5b81018160a081016080820135600160201b8111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111600160201b831117156104eb57600080fd5b919390929091602081019035600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460018302840111600160201b8311171561053b57600080fd5b919390929091602081019035600160201b81111561055857600080fd5b82018360208201111561056a57600080fd5b803590602001918460018302840111600160201b8311171561058b57600080fd5b919390929091602081019035600160201b8111156105a857600080fd5b8201836020820111156105ba57600080fd5b803590602001918460018302840111600160201b831117156105db57600080fd5b509092509050610c63565b005b610456610f04565b610432610f09565b6106156004803603602081101561060e57600080fd5b5035610f0f565b6040805161ffff9092168252519081900360200190f35b6104706004803603602081101561064257600080fd5b5035610f25565b610651610f3a565b60408051600792830b90920b8252519081900360200190f35b610456610f43565b6106926004803603602081101561068857600080fd5b503560ff16610f49565b604080516001600160401b039092168252519081900360200190f35b610761600480360360608110156106c457600080fd5b60ff82351691602081013591810190606081016040820135600160201b8111156106ed57600080fd5b8201836020820111156106ff57600080fd5b803590602001918460018302840111600160201b8311171561072057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f64945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561079b578181015183820152602001610783565b50505050905090810190601f1680156107c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f3610fda565b610470600480360360208110156107f457600080fd5b503560ff16610fdf565b610432610ff4565b610615610ffa565b6103f3610fff565b610432611004565b61043261100a565b610456611010565b6105e66004803603604081101561084457600080fd5b506001600160a01b0381358116916020013516611045565b6104566111be565b6106156111e6565b6108896004803603602081101561088257600080fd5b50356111eb565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b61045661121a565b610432600480360360208110156108d257600080fd5b503560ff16611241565b61043261125c565b6103f36111e6565b6103f3611262565b610615610fda565b610456611267565b61043261126d565b6103f3611273565b610432611278565b6105e6600480360360a081101561093257600080fd5b810190602081018135600160201b81111561094c57600080fd5b82018360208201111561095e57600080fd5b803590602001918460018302840111600160201b8311171561097f57600080fd5b919390929091602081019035600160201b81111561099c57600080fd5b8201836020820111156109ae57600080fd5b803590602001918460018302840111600160201b831117156109cf57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff1661127e565b610456611632565b6103f361163a565b61043261163f565b610432611645565b61047061164b565b610432611654565b61043261165a565b610411610c44565b6105e660048036036040811015610a4d57600080fd5b810190602081018135600160201b811115610a6757600080fd5b820183602082011115610a7957600080fd5b803590602001918460018302840111600160201b83111715610a9a57600080fd5b919390929091602081019035600160201b811115610ab757600080fd5b820183602082011115610ac957600080fd5b803590602001918460018302840111600160201b83111715610aea57600080fd5b509092509050611660565b61069260048036036020811015610b0b57600080fd5b503560ff166116a0565b6104566116bb565b6104326116df565b6105e66116e5565b61047060048036036040811015610b4357600080fd5b5080356001600160a01b0316906020013560ff166118a5565b6107616118c5565b6104566118e4565b6104326118ea565b6104326118f0565b6105e66118f6565b61069260048036036020811015610b9a57600080fd5b503560ff16611988565b6105e66119a3565b6103f3611b1c565b6105e660048036036060811015610bca57600080fd5b60ff8235169190810190604081016020820135600160201b811115610bee57600080fd5b820183602082011115610c0057600080fd5b803590602001918460018302840111600160201b83111715610c2157600080fd5b919350915035611b21565b610432611bc3565b6103f3611bc9565b610432611bce565b600081565b606481565b61200181565b60015481565b600b5460ff1681565b60005460ff16610ca8576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b158015610cf357600080fd5b505afa158015610d07573d6000803e3d6000fd5b505050506040513d6020811015610d1d57600080fd5b5051610d5a5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c9f6023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610da657600080fd5b505afa158015610dba573d6000803e3d6000fd5b505050506040513d6020811015610dd057600080fd5b5051610e0d5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c9f6023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610e86576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610eca576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610f9c576020820181803683370190505b5060218101869052600181018790528281529050604181016000610fbf86611bd4565b509050610fce81838851611bde565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b603881565b600881565b61200681565b61200081565b604080517f43414e43454c5f5452414e534645525f50524f504f53414c00000000000000008152905190819003601801902081565b60005460ff1661108a576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b1580156110cd57600080fd5b505afa1580156110e1573d6000803e3d6000fd5b505050506040513d60208110156110f757600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561113857600080fd5b505afa15801561114c573d6000803e3d6000fd5b505050506040513d602081101561116257600080fd5b505190508061116f575060155b60008211801561117f5750808211155b610eca576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b8152905190819003601001902081565b600281565b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f01902081565b6005602052600090815260409020546001600160a01b031681565b61100581565b601081565b60035481565b61100881565b600b81565b61200381565b60005460ff166112c3576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561130257600080fd5b505afa158015611316573d6000803e3d6000fd5b505050506040513d602081101561132c57600080fd5b505161137f576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b0390811690831681146113ef576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b15801561146457600080fd5b505afa158015611478573d6000803e3d6000fd5b505050506040513d602081101561148e57600080fd5b50516114cb5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c9f6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316611535576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b03908116908316101561159e576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614610e865760ff8181166000908152600a60205260409020805467ffffffffffffffff19166001600160401b038516179055600b541615610eca576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b630100380081565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b3361100714610e865760405162461bcd60e51b815260040180806020018281038252602e815260200180611c51602e913960400191505060405180910390fd5b6008602052600090815260409020546001600160401b031681565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081565b61100281565b60005460ff1661172a576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561176d57600080fd5b505afa158015611781573d6000803e3d6000fd5b505050506040513d602081101561179757600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156117d857600080fd5b505afa1580156117ec573d6000803e3d6000fd5b505050506040513d602081101561180257600080fd5b505190508061180f575060155b60008211801561181f5750808211155b61185e576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16610eca576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b610e1081565b61100381565b61200481565b60005460ff161561194e576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260019081556004805467ffffffffffffffff19166001600160401b03179055600060028190556003819055805460ff19169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166119e8576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015611a2b57600080fd5b505afa158015611a3f573d6000803e3d6000fd5b505050506040513d6020811015611a5557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015611a9657600080fd5b505afa158015611aaa573d6000803e3d6000fd5b505050506040513d6020811015611ac057600080fd5b5051905080611acd575060155b600082118015611add5750808211155b610e86576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b601181565b60005460ff16611b66576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116610eca5760405162461bcd60e51b8152600401808060200182810382526031815260200180611c206031913960400191505060405180910390fd5b61100081565b600381565b61100481565b8051602090910191565b5b60208110611bfe578251825260209283019290910190601f1901611bdf565b915181516020939093036101000a600019018019909116921691909117905256fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637474686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002001": { "balance": "0x0", - "code": "0x6080604052600436106103d25760003560e01c8063718a8aa8116101fd578063b88a802f11610118578063dc927faf116100ab578063f45fd80b1161007a578063f45fd80b14610cdb578063f9a2bbc714610d20578063fa03f79714610d35578063fc3e5908146106d3578063fd6a687914610d4a576103d9565b8063dc927faf14610c87578063df8079e914610c9c578063edc1a5b014610cb1578063f1fad10414610cc6576103d9565b8063c81b1662116100e7578063c81b166214610bb2578063c8509d8114610bc7578063d61b9b9314610c4c578063d7ecfcb614610890576103d9565b8063b88a802f14610b38578063baaafd3b14610b4d578063bf8546ca14610b62578063c2117d8214610b9d576103d9565b80639dc0926211610190578063aad560631161015f578063aad5606314610a2e578063ab51bb9614610a43578063ac43175114610a58578063b14315df14610b23576103d9565b80639dc09262146109c6578063a1a11bf5146109db578063a78abc16146109f0578063aa82dce114610a19576103d9565b80637e434d54116101cc5780637e434d5414610917578063831d65d11461092c57806392b888a41461066a57806396713da9146109b1576103d9565b8063718a8aa8146108a557806375aca593146108ba57806375d47a0a146108ed5780637942fd0514610902576103d9565b8063413d9c3a116102ed5780635d17c8bd116102805780636bd8f8041161024f5780636bd8f804146108125780636e47b482146108485780636fb7f7eb1461085d57806370fd5bad14610890576103d9565b80635d17c8bd146107be5780635d499b1b146107d357806362b171d2146107e857806369b635b6146107fd576103d9565b80634d99dd16116102bc5780634d99dd161461075357806351b4dce31461077f57806351e8067214610794578063552aaf93146107a9576103d9565b8063413d9c3a146106e857806343756e5c146106fd578063493279b1146107125780634bf6c8821461073e576103d9565b8063151817e311610365578063333ad3e711610334578063333ad3e7146106a957806334c43354146106be5780633dffc3871461066a5780633fdfa7e4146106d3576103d9565b8063151817e31461063f57806317c9efb01461066a578063280870281461067f5780632fdeb11114610694576103d9565b80630c795715116103a15780630c795715146104cc5780630e2374a5146104e15780631182b8751461051257806311fe9ec61461060c576103d9565b8063026e402b146103de578063029859921461040c578063047636d1146104335780630bee7a671461049e576103d9565b366103d957005b600080fd5b61040a600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610d5f565b005b34801561041857600080fd5b50610421610d9c565b60408051918252519081900360200190f35b34801561043f57600080fd5b506104666004803603602081101561045657600080fd5b50356001600160a01b0316610da2565b6040518082606080838360005b8381101561048b578181015183820152602001610473565b5050505090500191505060405180910390f35b3480156104aa57600080fd5b506104b3610df6565b6040805163ffffffff9092168252519081900360200190f35b3480156104d857600080fd5b50610421610dfb565b3480156104ed57600080fd5b506104f6610e01565b604080516001600160a01b039092168252519081900360200190f35b34801561051e57600080fd5b506105976004803603604081101561053557600080fd5b60ff8235169190810190604081016020820135600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460018302840111600160201b8311171561058c57600080fd5b509092509050610e07565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105d15781810151838201526020016105b9565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061857600080fd5b506104216004803603602081101561062f57600080fd5b50356001600160a01b0316610fc3565b34801561064b57600080fd5b50610654610fde565b6040805160ff9092168252519081900360200190f35b34801561067657600080fd5b50610654610fe3565b34801561068b57600080fd5b506104f6610fe8565b3480156106a057600080fd5b50610421610fee565b3480156106b557600080fd5b506104b3610ff4565b3480156106ca57600080fd5b50610421610ff9565b3480156106df57600080fd5b50610654611004565b3480156106f457600080fd5b50610421611009565b34801561070957600080fd5b506104f6611010565b34801561071e57600080fd5b50610727611016565b6040805161ffff9092168252519081900360200190f35b34801561074a57600080fd5b5061065461101b565b61040a6004803603604081101561076957600080fd5b506001600160a01b038135169060200135611020565b34801561078b57600080fd5b506104f661164d565b3480156107a057600080fd5b506104f6611653565b3480156107b557600080fd5b50610654611659565b3480156107ca57600080fd5b5061042161165e565b3480156107df57600080fd5b50610421611664565b3480156107f457600080fd5b5061042161166d565b34801561080957600080fd5b5061042161180d565b61040a6004803603606081101561082857600080fd5b506001600160a01b03813581169160208101359091169060400135610d5f565b34801561085457600080fd5b506104f6611813565b34801561086957600080fd5b506104216004803603602081101561088057600080fd5b50356001600160a01b0316611819565b34801561089c57600080fd5b50610654611834565b3480156108b157600080fd5b50610654611839565b3480156108c657600080fd5b50610421600480360360208110156108dd57600080fd5b50356001600160a01b031661183e565b3480156108f957600080fd5b506104f6611859565b34801561090e57600080fd5b5061065461185f565b34801561092357600080fd5b506104f6611864565b34801561093857600080fd5b5061040a6004803603604081101561094f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561097357600080fd5b82018360208201111561098557600080fd5b803590602001918460018302840111600160201b831117156109a657600080fd5b50909250905061186a565b3480156109bd57600080fd5b50610654611b32565b3480156109d257600080fd5b506104f6611b37565b3480156109e757600080fd5b506104f6611b3d565b3480156109fc57600080fd5b50610a05611b43565b604080519115158252519081900360200190f35b348015610a2557600080fd5b506104f6611b4c565b348015610a3a57600080fd5b506104f6611b52565b348015610a4f57600080fd5b506104b3611659565b348015610a6457600080fd5b5061040a60048036036040811015610a7b57600080fd5b810190602081018135600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460018302840111600160201b83111715610ac857600080fd5b919390929091602081019035600160201b811115610ae557600080fd5b820183602082011115610af757600080fd5b803590602001918460018302840111600160201b83111715610b1857600080fd5b509092509050611b58565b348015610b2f57600080fd5b506106546122ea565b348015610b4457600080fd5b506104216122ef565b348015610b5957600080fd5b5061042161248c565b348015610b6e57600080fd5b5061042160048036036040811015610b8557600080fd5b506001600160a01b0381358116916020013516612497565b348015610ba957600080fd5b506104216124c4565b348015610bbe57600080fd5b506104f66124ca565b348015610bd357600080fd5b5061040a60048036036040811015610bea57600080fd5b60ff8235169190810190604081016020820135600160201b811115610c0e57600080fd5b820183602082011115610c2057600080fd5b803590602001918460018302840111600160201b83111715610c4157600080fd5b5090925090506124d0565b348015610c5857600080fd5b5061042160048036036040811015610c6f57600080fd5b506001600160a01b03813581169160200135166126f3565b348015610c9357600080fd5b506104f661271e565b348015610ca857600080fd5b506104f6612724565b348015610cbd57600080fd5b5061042161272a565b348015610cd257600080fd5b50610654612737565b348015610ce757600080fd5b5061042160048036036060811015610cfe57600080fd5b506001600160a01b03813581169160208101358216916040909101351661273c565b348015610d2c57600080fd5b506104f6612771565b348015610d4157600080fd5b50610421612777565b348015610d5657600080fd5b506104f661277d565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610daa614800565b610db2614800565b6001600160a01b0383166000818152600b60209081526040808320548552838352600c82528083205485830152928252600d9052819020549082015290505b919050565b606481565b6108fc81565b61200181565b60603361200014610e495760405162461bcd60e51b815260040180806020018281038252602f8152602001806149e3602f913960400191505060405180910390fd5b60005460ff16610e8c576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b610e9461481e565b610edb610ed685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061278392505050565b6127a8565b90506000610ef0610eeb836127f2565b612840565b90506000606060ff831660041415610f1557610f0b846128f7565b9092509050610f6c565b60ff831660051415610f2a57610f0b84612ad7565b6040805162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e206576656e74207479706560701b604482015290519081900360640190fd5b63ffffffff821615610fb8576040805163ffffffff84168152905160ff8516917f391d6e5ea6ab6c49b9a0abb1782cae5def8d711f973b00c729658c0b2a80b31b919081900360200190a25b979650505050505050565b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b61200581565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b603881565b600881565b60105460ff166002141561106c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be400340615801561109457506402540be4008106155b6110e5576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611128576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b600154341015611176576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b600354821015611231573360009081526005602090815260408083206001600160a01b038716845290915290205482146111e8576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6002548211611231576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b3360009081526007602090815260408083206001600160a01b03871684529091529020544210156112a9576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720756e64656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b604080518082018252601081526f6e6f7420656e6f7567682066756e647360801b602080830191909152336000908152600582528381206001600160a01b03881682529091529182205461130491859063ffffffff612df716565b9050801561134c57600254811161134c5760405162461bcd60e51b81526004018080602001828103825260258152602001806149be6025913960400191505060405180910390fd5b6000611363846402540be40063ffffffff612e8e16565b600254909150349060009061137f90839063ffffffff612ed716565b6040805160038082526080820190925291925060609190816020015b606081526020019060019003908161139b5790505090506113bb33612f19565b816000815181106113c857fe5b60200260200101819052506113e5886001600160a01b0316612f19565b816001815181106113f257fe5b602002602001018190525061140684612f3c565b8160028151811061141357fe5b60200260200101819052506060611433600261142e84612f4f565b612fd9565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600c909352912080549091019055905061148442620a8c0063ffffffff61305f16565b3360009081526007602090815260408083206001600160a01b038e16845290915290205561200063f7a251d76010836114c8876402540be40063ffffffff612e8e16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561152657818101518382015260200161150e565b50505050905090810190601f1680156115535780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561157457600080fd5b505af1158015611588573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f193505050501580156115bb573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f193505050501580156115ec573d6000803e3d6000fd5b50604080518981526020810185905281516001600160a01b038c169233927fdf0b6ac27f3f3bb31cee3dab0f4fe40cc19c6a3f8daaec52e06b261e58a12519929081900390910190a350506010805460ff1916600117905550505050505050565b61200681565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff16600214156116bc576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611723576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114611779576040519150601f19603f3d011682016040523d82523d6000602084013e61177e565b606091505b50509050806117c6576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b61200381565b33612000146118aa5760405162461bcd60e51b815260040180806020018281038252602f8152602001806149e3602f913960400191505060405180910390fd5b60005460ff166118ed576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6118f561481e565b611937610ed684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061278392505050565b905060008060606000805b61194b866130b9565b156119b6578061196857611961610eeb876127f2565b94506119ae565b80600114156119845761197d610eeb876127f2565b93506119ae565b80600214156119a95761199e611999876127f2565b6130da565b9250600191506119ae565b6119b6565b600101611942565b816119fc576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b611a058361314a565b611a48576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b611a54610ed684612783565b95506000611a64610eeb886127f2565b9050611a6e61481e565b611a77886130b9565b15611a9a57611a93610ed6611a8e6119998b6127f2565b612783565b9050611adb565b6040805162461bcd60e51b8152602060048201526011602482015270656d7074792061636b207061636b61676560781b604482015290519081900360640190fd5b60ff821660011415611af757611af281888861319e565b611b25565b60ff821660021415611b0e57611af2818888613555565b60ff821660031415610f2a57611af2818888613822565b5050505050505050505050565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b60005460ff16611baf576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714611bef5760405162461bcd60e51b815260040180806020018281038252602e815260200180614934602e913960400191505060405180910390fd5b611c5084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526972656c6179657246656560b01b60208201529150613b879050565b15611db65760208114611caa576040805162461bcd60e51b815260206004820152601d60248201527f6c656e677468206f662072656c61796572466565206d69736d61746368000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091611ce891858580838501838280828437600092019190915250613c6e92505050565b90506003548110611d2a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614962602e913960400191505060405180910390fd5b6002548111611d6a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614990602e913960400191505060405180910390fd5b6402540be400810615611dae5760405162461bcd60e51b815260040180806020018281038252602c815260200180614908602c913960400191505060405180910390fd5b600155612258565b611e1a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c62534352656c6179657246656560981b60208201529150613b879050565b15611f7c5760208114611e74576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f662062534352656c61796572466565206d69736d61746368604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091611eb291858580838501838280828437600092019190915250613c6e92505050565b905080611ef05760405162461bcd60e51b8152600401808060200182810382526022815260200180614a126022913960400191505060405180910390fd5b6001548110611f305760405162461bcd60e51b815260040180806020018281038252602e815260200180614888602e913960400191505060405180910390fd5b6402540be400810615611f745760405162461bcd60e51b815260040180806020018281038252602f815260200180614859602f913960400191505060405180910390fd5b600255612258565b611fe084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c36b4b72232b632b3b0ba34b7b760991b60208201529150613b879050565b156120c2576020811461203a576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206d696e44656c65676174696f6e206d69736d61746368604482015290519081900360640190fd5b604080516020601f840181900481028201810190925282815260009161207891858580838501838280828437600092019190915250613c6e92505050565b905060015481116120ba5760405162461bcd60e51b81526004018080602001828103825260318152602001806148b66031913960400191505060405180910390fd5b600355612258565b61212484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a7472616e7366657247617360a81b60208201529150613b879050565b1561221b576020811461217e576040805162461bcd60e51b815260206004820152601e60248201527f6c656e677468206f66207472616e73666572476173206d69736d617463680000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916121bc91858580838501838280828437600092019190915250613c6e92505050565b905060008111612213576040805162461bcd60e51b815260206004820152601e60248201527f746865207472616e736665724761732063616e6e6f74206265207a65726f0000604482015290519081900360640190fd5b601155612258565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b600481565b60105460009060ff166002141561233e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff1916600217905533600090815260066020526040902054806123a2576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d80600081146123f8576040519150601f19603f3d011682016040523d82523d6000602084013e6123fd565b606091505b5050905080612445576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b038083166000908152600760209081526040808320938516835292905220545b92915050565b60015490565b61100281565b33612000146125105760405162461bcd60e51b815260040180806020018281038252602f8152602001806149e3602f913960400191505060405180910390fd5b60005460ff16612553576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b61259282828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061314a92505050565b6125d5576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b6125dd61481e565b61261f610ed684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061278392505050565b9050600061262f610eeb836127f2565b905061263961481e565b612642836130b9565b1561266057612659610ed6611a8e611999866127f2565b90506126a6565b6040805162461bcd60e51b8152602060048201526016602482015275656d707479206661696c2061636b207061636b61676560501b604482015290519081900360640190fd5b60ff8216600114156126c0576126bb81613c73565b6126ea565b60ff8216600214156126d5576126bb81613e8d565b60ff821660031415610f2a576126bb81613fb7565b5050505b505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b601181565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b61278b61483e565b506040805180820190915281518152602082810190820152919050565b6127b061481e565b6127b98261411c565b6127c257600080fd5b60006127d18360200151614156565b60208085015160408051808201909152868152920190820152915050919050565b6127fa61483e565b612803826130b9565b61280c57600080fd5b6020820151600061281c826141b9565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061285557508151602110155b61285e57600080fd5b600061286d8360200151614156565b905080836000015110156128c8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156128ee57826020036101000a820491505b50949350505050565b600060606000806000805b61290b876130b9565b1561295d578261292d57612926612921886127f2565b6142ec565b9150612952565b826001141561294d57612942610eeb886127f2565b905060019350612952565b61295d565b826001019250612902565b836129a3576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156129ed57600080fd5b505af1158015612a01573d6000803e3d6000fd5b505050506040513d6020811015612a1757600080fd5b5051905080612a3c57612a2e600484846065614306565b965096505050505050612ad2565b6001600160a01b038316600090815260066020526040902054612a65908363ffffffff61305f16565b6001600160a01b038416600081815260066020908152604091829020939093558051858152905191927f7cc266c7b444f808013fa187f7b904d470a051a6564e78f482aa496581ba4bf892918290030190a260408051600080825260208201909252909750955050505050505b915091565b600060606000806000806000805b612aee896130b9565b15612b785784612b0b57612b046129218a6127f2565b9350612b6d565b8460011415612b2757612b206129218a6127f2565b9250612b6d565b8460021415612b4757612b3c610eeb8a6127f2565b915060019550612b6d565b8460031415612b6857612b61612b5c8a6127f2565b614402565b9050612b6d565b612b78565b846001019450612ae5565b85612bbe576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612c0857600080fd5b505af1158015612c1c573d6000803e3d6000fd5b505050506040513d6020811015612c3257600080fd5b5051905080612c5957612c49600586856065614306565b9850985050505050505050612ad2565b6001600160a01b038086166000818152600760209081526040808320948916835293815283822082905591815260089091522054612c9d908463ffffffff61305f16565b6001600160a01b0386166000908152600860205260409020558115612d8b576001600160a01b038516600090815260046020526040902054612ce5908463ffffffff612ed716565b6001600160a01b03808716600090815260046020908152604080832094909455600581528382209288168252919091522054612d27908463ffffffff612ed716565b6001600160a01b038087166000818152600560209081526040808320948a16808452948252918290209490945580518781529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a35b836001600160a01b0316856001600160a01b03167f35a799836f74fac7eccf5c73902823b970543d2274d3b93d8da3d37a255772a2856040518082815260200191505060405180910390a360408051600080825260208201909252909950975050505050505050915091565b60008184841115612e865760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e4b578181015183820152602001612e33565b50505050905090810190601f168015612e785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000612ed083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614446565b9392505050565b6000612ed083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612df7565b60408051600560a21b8318601482015260348101909152606090612ed0816144ab565b60606124be612f4a83614501565b6144ab565b6060815160001415612f705750604080516000815260208101909152610df1565b606082600081518110612f7f57fe5b602002602001015190506000600190505b8351811015612fc057612fb682858381518110612fa957fe5b60200260200101516145e7565b9150600101612f90565b50612ed0612fd3825160c060ff16614664565b826145e7565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081612ff25790505090506130158460ff16612f3c565b8160008151811061302257fe5b6020026020010181905250613036836144ab565b8160018151811061304357fe5b602002602001018190525061305781612f4f565b949350505050565b600082820183811015612ed0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006130c361483e565b505080518051602091820151919092015191011190565b80516060906130e857600080fd5b60006130f78360200151614156565b83516040805191839003808352601f19601f820116830160200190915291925060609082801561312e576020820181803683370190505b50905060008160200190506128ee84876020015101828561475c565b8051602080830191909120600e546000908152600a909252604082205480821461317957600092505050610df1565b5050600e80546000908152600a60205260408120558054600190810190915592915050565b60008060008060005b6131b0886130b9565b1561321957836131cd576131c6612921896127f2565b925061320e565b83600114156131e9576131e2612921896127f2565b915061320e565b8360021415613209576131fe610eeb896127f2565b90506001945061320e565b613219565b8360010193506131a7565b8461325f576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613276826402540be40063ffffffff6147a716565b6001600160a01b0385166000908152600b602052604090208054600019019055905060ff8816600114156133bc5760ff8716156132e9576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054613312908263ffffffff61305f16565b6001600160a01b03808616600090815260046020908152604080832094909455600581528382209287168252919091522054613354908263ffffffff61305f16565b6001600160a01b038086166000818152600560209081526040808320948916808452948252918290209490945580518581529051929391927f9a57c81564ab02642f34fd87e41baa9b074c18342cec3b7268b62bf752018fd1929181900390910190a361354a565b60ff881661350e576001600160a01b0384166000908152600860205260409020546133ed908263ffffffff61305f16565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b15801561344957600080fd5b505af115801561345d573d6000803e3d6000fd5b505050506040513d602081101561347357600080fd5b50516134bc576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040805182815260ff8916602082015281516001600160a01b0380871693908816927fcbd481ae600289fad8c0484d07ce0ffe4f010d7c844ecfdeaf2a13fead52886e929081900390910190a361354a565b6040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b505050505050505050565b60008060008060005b613567886130b9565b156135d057836135845761357d612921896127f2565b92506135c5565b83600114156135a057613599612921896127f2565b91506135c5565b83600214156135c0576135b5610eeb896127f2565b9050600194506135c5565b6135d0565b83600101935061355e565b84613616576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b600061362d826402540be40063ffffffff6147a716565b6001600160a01b0385166000908152600c602052604090208054600019019055905060ff8816600114156137ac5760ff8716156136a0576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b0384166000908152600460205260409020546136c9908263ffffffff612ed716565b6001600160a01b0380861660009081526004602090815260408083209490945560058152838220928716825291909152205461370b908263ffffffff612ed716565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205561374442620a8c0063ffffffff61305f16565b6001600160a01b038086166000818152600760209081526040808320948916808452948252918290209490945580518581529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a361354a565b60ff881661350e576001600160a01b03808516600081815260076020908152604080832094881680845294825280832092909255815185815260ff8c169181019190915281517f4417d10c1e33efa83a770b8d4f47176e78c08c1298d534901ad3b16bb585fa2e929181900390910190a361354a565b6000806000806000805b613835896130b9565b156138ba57846138525761384b6129218a6127f2565b93506138af565b846001141561386e576138676129218a6127f2565b92506138af565b846002141561388a576138836129218a6127f2565b91506138af565b84600314156138aa5761389f610eeb8a6127f2565b9050600195506138af565b6138ba565b84600101945061382c565b85613900576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613917826402540be40063ffffffff6147a716565b6001600160a01b0386166000908152600d602052604090208054600019019055905060ff891660011415613aea5760ff88161561398a576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038086166000908152600560209081526040808320938816835292905220546139c0908263ffffffff612ed716565b6001600160a01b038681166000908152600560209081526040808320898516845290915280822093909355908516815220546139fc908261305f565b6001600160a01b03808716600090815260056020908152604080832093881683529290522055613a3542620a8c0063ffffffff61305f16565b6001600160a01b0380871660009081526009602090815260408083208985168452825280832093881683529290522055613a7842620a8c0063ffffffff61305f16565b6001600160a01b038087166000818152600960209081526040808320898616808552908352818420958b1680855295835292819020959095558451868152945191947f78bffae3f8c6691ac7fc1a3bff800cb2d612f5ad9ae5b0444cfe2eb15c189e18929081900390910190a4613b7b565b60ff891661350e576001600160a01b038581166000818152600960209081526040808320898616808552818452828520968a16808652968452828520859055908352818420818552835281842093909355805186815260ff8e169281019290925280519293927fb93bee5c59f85ede6b074a99f4ffcd3e3fc0d5c3d8156de331de89a49e0ce77c9281900390910190a45b50505050505050505050565b6000816040516020018082805190602001908083835b60208310613bbc5780518252601f199092019160209182019101613b9d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310613c2a5780518252601f199092019160209182019101613c0b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60008060008060005b613c85866130b9565b15613cee5783613ca257613c9b612921876127f2565b9250613ce3565b8360011415613cbe57613cb7612921876127f2565b9150613ce3565b8360021415613cde57613cd3610eeb876127f2565b905060019450613ce3565b613cee565b836001019350613c7c565b84613d34576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613d4b826402540be40063ffffffff6147a716565b6001600160a01b0385166000908152600b6020908152604080832080546000190190556008909152902054909150613d89908263ffffffff61305f16565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b158015613de557600080fd5b505af1158015613df9573d6000803e3d6000fd5b505050506040513d6020811015613e0f57600080fd5b5051613e58576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040516001907ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b90600090a250505050505050565b60008060008060005b613e9f866130b9565b15613f085783613ebc57613eb5612921876127f2565b9250613efd565b8360011415613ed857613ed1612921876127f2565b9150613efd565b8360021415613ef857613eed610eeb876127f2565b905060019450613efd565b613f08565b836001019350613e96565b84613f4e576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600c60209081526040808320805460001901905560078252808320938616835292905281812081905590516002917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a2505050505050565b6000806000806000805b613fca876130b9565b1561404f5784613fe757613fe0612921886127f2565b9350614044565b846001141561400357613ffc612921886127f2565b9250614044565b846002141561401f57614018612921886127f2565b9150614044565b846003141561403f57614034610eeb886127f2565b905060019550614044565b61404f565b846001019450613fc1565b85614095576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038481166000908152600d602090815260408083208054600019019055600982528083208785168085528184528285209588168552948352818420849055825280832093835292905281812081905590516003917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a250505050505050565b805160009061412d57506000610df1565b6020820151805160001a9060c082101561414c57600092505050610df1565b5060019392505050565b8051600090811a6080811015614170576000915050610df1565b60b881108061418b575060c0811080159061418b575060f881105b1561419a576001915050610df1565b60c08110156141ae5760b519019050610df1565b60f519019050610df1565b80516000908190811a60808110156141d457600191506142e5565b60b88110156141e957607e19810191506142e5565b60c081101561426357600060b78203600186019550806020036101000a86510491506001810182019350508083101561425d576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142e5565b60f88110156142785760be19810191506142e5565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e3576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906015146142fd57600080fd5b6124be82612840565b6000606061431f846402540be40063ffffffff612e8e16565b60408051600480825260a0820190925291955060609190816020015b606081526020019060019003908161433b57905050905061435e8760ff16612f3c565b8160008151811061436b57fe5b6020026020010181905250614388866001600160a01b0316612f19565b8160018151811061439557fe5b60200260200101819052506143a985612f3c565b816002815181106143b657fe5b60200260200101819052506143d08463ffffffff16612f3c565b816003815181106143dd57fe5b602002602001018190525060606143f382612f4f565b94989497509395505050505050565b805160009060011461441357600080fd5b6020820151805160001a9081158061442b5750608082145b1561443b57600092505050610df1565b600192505050610df1565b600081836144955760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e4b578181015183820152602001612e33565b5060008385816144a157fe5b0495945050505050565b6060815160011480156144dd5750607f60f81b826000815181106144cb57fe5b01602001516001600160f81b03191611155b156144e9575080610df1565b6124be6144fb8351608060ff16614664565b836145e7565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661454557506018614569565b6fffffffffffffffffffffffffffffffff19841661456557506010614569565b5060005b602081101561459f5781818151811061457e57fe5b01602001516001600160f81b031916156145975761459f565b600101614569565b60008160200390506060816040519080825280601f01601f1916602001820160405280156145d4576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015614618578051835260209283019201614600565b50855184518101855292509050808201602086015b8183101561464557805183526020928301920161462d565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106146b4576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161470e5782840160f81b816000815181106146f057fe5b60200101906001600160f81b031916908160001a90535090506124be565b606061471985614501565b90508381510160370160f81b8260008151811061473257fe5b60200101906001600160f81b031916908160001a90535061475382826145e7565b95945050505050565b80614766576126ee565b5b60208110614786578251825260209283019290910190601f1901614767565b915181516020939093036101000a6000190180199091169216919091179052565b6000826147b6575060006124be565b828202828482816147c357fe5b0414612ed05760405162461bcd60e51b81526004018080602001828103825260218152602001806148e76021913960400191505060405180910390fd5b60405180606001604052806003906020820280368337509192915050565b604051806040016040528061483161483e565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe7468652042534352656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f7468652042534352656c61796572466565206d757374206265206c657373207468616e2072656c61796572466565746865206d696e44656c65676174696f6e206d7573742062652067726561746572207468616e2072656c61796572466565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777468652072656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163747468652072656c61796572466565206d757374206265206c657373207468616e206d696e44656c65676174696f6e7468652072656c61796572466565206d757374206265206d6f7265207468616e2042534352656c61796572466565696e73756666696369656e742062616c616e636520616674657220756e64656c6567617465746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747468652042534352656c61796572466565206d757374206e6f74206265207a65726fa164736f6c6343000604000a" + "code": "0x6080604052600436106103d25760003560e01c8063718a8aa8116101fd578063b88a802f11610118578063dc927faf116100ab578063f45fd80b1161007a578063f45fd80b14610c56578063f9a2bbc714610c9b578063fa03f79714610cb0578063fc3e5908146106d3578063fd6a687914610cc5576103d9565b8063dc927faf14610c02578063df8079e914610c17578063edc1a5b014610c2c578063f1fad10414610c41576103d9565b8063c81b1662116100e7578063c81b166214610bb2578063c8509d811461092c578063d61b9b9314610bc7578063d7ecfcb614610890576103d9565b8063b88a802f14610b38578063baaafd3b14610b4d578063bf8546ca14610b62578063c2117d8214610b9d576103d9565b80639dc0926211610190578063aad560631161015f578063aad5606314610a2e578063ab51bb9614610a43578063ac43175114610a58578063b14315df14610b23576103d9565b80639dc09262146109c6578063a1a11bf5146109db578063a78abc16146109f0578063aa82dce114610a19576103d9565b80637e434d54116101cc5780637e434d5414610917578063831d65d11461092c57806392b888a41461066a57806396713da9146109b1576103d9565b8063718a8aa8146108a557806375aca593146108ba57806375d47a0a146108ed5780637942fd0514610902576103d9565b8063413d9c3a116102ed5780635d17c8bd116102805780636bd8f8041161024f5780636bd8f804146108125780636e47b482146108485780636fb7f7eb1461085d57806370fd5bad14610890576103d9565b80635d17c8bd146107be5780635d499b1b146107d357806362b171d2146107e857806369b635b6146107fd576103d9565b80634d99dd16116102bc5780634d99dd161461075357806351b4dce31461077f57806351e8067214610794578063552aaf93146107a9576103d9565b8063413d9c3a146106e857806343756e5c146106fd578063493279b1146107125780634bf6c8821461073e576103d9565b8063151817e311610365578063333ad3e711610334578063333ad3e7146106a957806334c43354146106be5780633dffc3871461066a5780633fdfa7e4146106d3576103d9565b8063151817e31461063f57806317c9efb01461066a578063280870281461067f5780632fdeb11114610694576103d9565b80630c795715116103a15780630c795715146104cc5780630e2374a5146104e15780631182b8751461051257806311fe9ec61461060c576103d9565b8063026e402b146103de578063029859921461040c578063047636d1146104335780630bee7a671461049e576103d9565b366103d957005b600080fd5b61040a600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610cda565b005b34801561041857600080fd5b50610421610d17565b60408051918252519081900360200190f35b34801561043f57600080fd5b506104666004803603602081101561045657600080fd5b50356001600160a01b0316610d1d565b6040518082606080838360005b8381101561048b578181015183820152602001610473565b5050505090500191505060405180910390f35b3480156104aa57600080fd5b506104b3610d6f565b6040805163ffffffff9092168252519081900360200190f35b3480156104d857600080fd5b50610421610d74565b3480156104ed57600080fd5b506104f6610d7a565b604080516001600160a01b039092168252519081900360200190f35b34801561051e57600080fd5b506105976004803603604081101561053557600080fd5b60ff8235169190810190604081016020820135600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460018302840111600160201b8311171561058c57600080fd5b509092509050610d80565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105d15781810151838201526020016105b9565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061857600080fd5b506104216004803603602081101561062f57600080fd5b50356001600160a01b0316610e3f565b34801561064b57600080fd5b50610654610e5a565b6040805160ff9092168252519081900360200190f35b34801561067657600080fd5b50610654610e5f565b34801561068b57600080fd5b506104f6610e64565b3480156106a057600080fd5b50610421610e6a565b3480156106b557600080fd5b506104b3610e70565b3480156106ca57600080fd5b50610421610e75565b3480156106df57600080fd5b50610654610e80565b3480156106f457600080fd5b50610421610e85565b34801561070957600080fd5b506104f6610e8c565b34801561071e57600080fd5b50610727610e92565b6040805161ffff9092168252519081900360200190f35b34801561074a57600080fd5b50610654610e97565b61040a6004803603604081101561076957600080fd5b506001600160a01b038135169060200135610e9c565b34801561078b57600080fd5b506104f6610f61565b3480156107a057600080fd5b506104f6610f67565b3480156107b557600080fd5b50610654610f6d565b3480156107ca57600080fd5b50610421610f72565b3480156107df57600080fd5b50610421610f78565b3480156107f457600080fd5b50610421610f81565b34801561080957600080fd5b50610421611121565b61040a6004803603606081101561082857600080fd5b506001600160a01b03813581169160208101359091169060400135610cda565b34801561085457600080fd5b506104f6611127565b34801561086957600080fd5b506104216004803603602081101561088057600080fd5b50356001600160a01b031661112d565b34801561089c57600080fd5b50610654611148565b3480156108b157600080fd5b5061065461114d565b3480156108c657600080fd5b50610421600480360360208110156108dd57600080fd5b50356001600160a01b0316611152565b3480156108f957600080fd5b506104f661116d565b34801561090e57600080fd5b50610654611173565b34801561092357600080fd5b506104f6611178565b34801561093857600080fd5b5061040a6004803603604081101561094f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561097357600080fd5b82018360208201111561098557600080fd5b803590602001918460018302840111600160201b831117156109a657600080fd5b50909250905061117e565b3480156109bd57600080fd5b506106546111be565b3480156109d257600080fd5b506104f66111c3565b3480156109e757600080fd5b506104f66111c9565b3480156109fc57600080fd5b50610a056111cf565b604080519115158252519081900360200190f35b348015610a2557600080fd5b506104f66111d8565b348015610a3a57600080fd5b506104f66111de565b348015610a4f57600080fd5b506104b3610f6d565b348015610a6457600080fd5b5061040a60048036036040811015610a7b57600080fd5b810190602081018135600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460018302840111600160201b83111715610ac857600080fd5b919390929091602081019035600160201b811115610ae557600080fd5b820183602082011115610af757600080fd5b803590602001918460018302840111600160201b83111715610b1857600080fd5b5090925090506111e4565b348015610b2f57600080fd5b5061065461127b565b348015610b4457600080fd5b50610421611280565b348015610b5957600080fd5b5061042161141d565b348015610b6e57600080fd5b5061042160048036036040811015610b8557600080fd5b506001600160a01b0381358116916020013516611428565b348015610ba957600080fd5b50610421611453565b348015610bbe57600080fd5b506104f6611459565b348015610bd357600080fd5b5061042160048036036040811015610bea57600080fd5b506001600160a01b038135811691602001351661145f565b348015610c0e57600080fd5b506104f661148a565b348015610c2357600080fd5b506104f6611490565b348015610c3857600080fd5b50610421611496565b348015610c4d57600080fd5b506106546114a3565b348015610c6257600080fd5b5061042160048036036060811015610c7957600080fd5b506001600160a01b0381358116916020810135821691604090910135166114a8565b348015610ca757600080fd5b506104f66114dd565b348015610cbc57600080fd5b506104216114e3565b348015610cd157600080fd5b506104f66114e9565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610d256114ef565b610d2d6114ef565b6001600160a01b03929092166000818152600b60209081526040808320548652838352600c82528083205486830152928252600d905281902054908301525090565b606481565b6108fc81565b61200181565b60603361200014610dc25760405162461bcd60e51b815260040180806020018281038252602f81526020018061153c602f913960400191505060405180910390fd5b60005460ff16610e05576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b61200581565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b603881565b600881565b60105460ff1660021415610ee8576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610f1057506402540be4008106155b610dc2576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b61200681565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff1660021415610fd0576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611037576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d806000811461108d576040519150601f19603f3d011682016040523d82523d6000602084013e611092565b606091505b50509050806110da576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b61200381565b3361200014610dc25760405162461bcd60e51b815260040180806020018281038252602f81526020018061153c602f913960400191505060405180910390fd5b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b60005460ff1661123b576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610e055760405162461bcd60e51b815260040180806020018281038252602e81526020018061150e602e913960400191505060405180910390fd5b600481565b60105460009060ff16600214156112cf576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480611333576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b50509050806113d6576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60015490565b61100281565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b601181565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6040518060600160405280600390602082028036833750919291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002002": { "balance": "0x0", - "code": "0x608060405260043610620003ff5760003560e01c80638456cb59116200020f578063cbb04d9d1162000123578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000c98578063fb50b31f1462000cbd578063fc0c5ff11462000ce2578063ff69ab611462000cfa57600080fd5b8063e992aaf51462000c15578063efdbf0e11462000c2d578063f1f74d841462000c69578063f1fad1041462000c8157600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000ba8578063daacdb661462000bc0578063dbda7fb31462000bd8578063e8f67c3b1462000bfd57600080fd5b8063cbb04d9d1462000b04578063d115a2061462000b45578063d6ca429d1462000b5e578063d7c2dfc81462000b8357600080fd5b8063ac43175111620001a5578063bff02e201162000170578063bff02e201462000a91578063c38fbec81462000ac7578063c473318f1462000aec578063c8509d8114620008e557600080fd5b8063ac4317511462000a0f578063b187bd261462000a34578063baa7199e1462000a54578063bdceadf31462000a7957600080fd5b80638cd22b2211620001e65780638cd22b22146200097a578063982ef0a7146200099f578063a43569b314620009b6578063aad3ec9614620009ea57600080fd5b80638456cb59146200090a57806386d5450614620009225780638a4d3fa8146200095c57600080fd5b806349f41a42116200031357806364028fbd116200029d57806375cc7d89116200026857806375cc7d89146200089057806376e7d6d614620008b55780638129fc1c14620008cd578063831d65d114620008e557600080fd5b806364028fbd14620007cb578063663706d314620007e25780636ec01b2714620008135780636f8e2fa4146200086b57600080fd5b80634e6fd6c411620002de5780634e6fd6c4146200073257806359491871146200074a5780635e7cc1c9146200076f57806363a036b5146200079457600080fd5b806349f41a4214620006995780634a49ac4c14620006be5780634bf6c88214620006e35780634d99dd16146200070d57600080fd5b80631fa8882b1162000395578063417c73a71162000360578063417c73a714620005e5578063449ecfe6146200060a57806345211bfd146200062f5780634838d165146200065457600080fd5b80631fa8882b14620005555780632b727c86146200056e5780632e8e8c7114620005935780633840998814620005cd57600080fd5b8063092193ab11620003d6578063092193ab14620004a05780630e9fbf5114620004b75780631182b87514620004dc57806317b4f353146200051057600080fd5b8063046f7da2146200041f578063059ddd2214620004375780630661806e146200047957600080fd5b366200041a5760345460ff166001146200041857600080fd5b005b600080fd5b3480156200042c57600080fd5b506200041862000d12565b3480156200044457600080fd5b506200045c620004563660046200991e565b62000da4565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200048657600080fd5b506200049160365481565b60405190815260200162000470565b62000418620004b13660046200991e565b620011cc565b348015620004c457600080fd5b5062000418620004d636600462009982565b6200181d565b348015620004e957600080fd5b5062000501620004fb366004620099c7565b62001b49565b60405162000470919062009a7a565b3480156200051d57600080fd5b506200045c6200052f36600462009b70565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200056257600080fd5b50620004916201518081565b3480156200057b57600080fd5b506200045c6200058d3660046200991e565b62001ebc565b348015620005a057600080fd5b506200045c620005b23660046200991e565b604d602052600090815260409020546001600160a01b031681565b348015620005da57600080fd5b506200049160375481565b348015620005f257600080fd5b5062000418620006043660046200991e565b62001f11565b3480156200061757600080fd5b5062000418620006293660046200991e565b62001f93565b3480156200063c57600080fd5b50620004186200064e3660046200991e565b62002178565b3480156200066157600080fd5b5062000688620006733660046200991e565b60016020526000908152604090205460ff1681565b604051901515815260200162000470565b348015620006a657600080fd5b5062000418620006b83660046200991e565b62002377565b348015620006cb57600080fd5b5062000418620006dd3660046200991e565b62002593565b348015620006f057600080fd5b50620006fa600881565b60405160ff909116815260200162000470565b3480156200071a57600080fd5b50620004186200072c36600462009bc5565b6200260f565b3480156200073f57600080fd5b506200045c61dead81565b3480156200075757600080fd5b50620004186200076936600462009c03565b62002c3f565b3480156200077c57600080fd5b50620004186200078e36600462009c73565b62003a38565b348015620007a157600080fd5b50620007b9620007b336600462009c93565b62003c62565b60405162000470949392919062009cfc565b62000418620007dc36600462009db8565b62004307565b348015620007ef57600080fd5b5062000491620008013660046200991e565b60446020526000908152604090205481565b3480156200082057600080fd5b5062000838620008323660046200991e565b6200498b565b6040805182516001600160401b039081168252602080850151821690830152928201519092169082015260600162000470565b3480156200087857600080fd5b50620005016200088a3660046200991e565b62004a30565b3480156200089d57600080fd5b5062000418620008af3660046200991e565b62004e5c565b348015620008c257600080fd5b5062000491603d5481565b348015620008da57600080fd5b50620004186200502e565b348015620008f257600080fd5b506200041862000904366004620099c7565b62005345565b3480156200091757600080fd5b5062000418620053af565b3480156200092f57600080fd5b506200045c620009413660046200991e565b6043602052600090815260409020546001600160a01b031681565b3480156200096957600080fd5b5062000491670de0b6b3a764000081565b3480156200098757600080fd5b50620004916200099936600462009bc5565b62005447565b62000418620009b036600462009e90565b62005500565b348015620009c357600080fd5b50620009db620009d53660046200991e565b62005b9d565b60405162000470919062009ece565b348015620009f757600080fd5b506200041862000a0936600462009bc5565b62005e8a565b34801562000a1c57600080fd5b506200041862000a2e36600462009f4b565b62005ef7565b34801562000a4157600080fd5b5060005462010000900460ff1662000688565b34801562000a6157600080fd5b506200041862000a733660046200a004565b62006d96565b34801562000a8657600080fd5b5062000491603c5481565b34801562000a9e57600080fd5b5062000ab662000ab036600462009c93565b62006f63565b60405162000470939291906200a060565b34801562000ad457600080fd5b506200041862000ae63660046200991e565b6200713f565b34801562000af957600080fd5b506200049160385481565b34801562000b1157600080fd5b5062000b2962000b233660046200991e565b62007401565b6040805193845291151560208401529082015260600162000470565b34801562000b5257600080fd5b5062000491620186a081565b34801562000b6b57600080fd5b506200041862000b7d3660046200a0bd565b62007844565b34801562000b9057600080fd5b506200041862000ba23660046200a1a6565b62007a6a565b34801562000bb557600080fd5b5062000491603b5481565b34801562000bcd57600080fd5b506200049160495481565b34801562000be557600080fd5b506200045c62000bf73660046200991e565b62007b60565b34801562000c0a57600080fd5b506200049160355481565b34801562000c2257600080fd5b5062000491603a5481565b34801562000c3a57600080fd5b506200049162000c4c36600462009b70565b805160208183018101805160468252928201919093012091525481565b34801562000c7657600080fd5b5062000491603e5481565b34801562000c8e57600080fd5b50620006fa601181565b34801562000ca557600080fd5b506200049162000cb736600462009bc5565b62007f8a565b34801562000cca57600080fd5b506200041862000cdc36600462009f4b565b62007ffb565b34801562000cef57600080fd5b506200049160395481565b34801562000d0757600080fd5b5062000491604a5481565b600054630100000090046001600160a01b0316331462000d45576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000d6f57604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000e0f906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3d906200a20c565b801562000e8e5780601f1062000e625761010080835404028352916020019162000e8e565b820191906000526020600020905b81548152906001019060200180831162000e7057829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000eb9906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462000ee7906200a20c565b801562000f385780601f1062000f0c5761010080835404028352916020019162000f38565b820191906000526020600020905b81548152906001019060200180831162000f1a57829003601f168201915b5050505050815260200160018201805462000f53906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462000f81906200a20c565b801562000fd25780601f1062000fa65761010080835404028352916020019162000fd2565b820191906000526020600020905b81548152906001019060200180831162000fb457829003601f168201915b5050505050815260200160028201805462000fed906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200101b906200a20c565b80156200106c5780601f1062001040576101008083540402835291602001916200106c565b820191906000526020600020905b8154815290600101906020018083116200104e57829003601f168201915b5050505050815260200160038201805462001087906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620010b5906200a20c565b8015620011065780601f10620010da5761010080835404028352916020019162001106565b820191906000526020600020905b815481529060010190602001808311620010e857829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620011a5575050509190925250509051949350505050565b3361100014620011f857604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b0380821660009081526043602090815260408083205484168084526041835281842082516101808101845281548716815260018201548716948101949094526002810154909516918301919091526003840154606083015260048401805491949160808401919062001271906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200129f906200a20c565b8015620012f05780601f10620012c457610100808354040283529160200191620012f0565b820191906000526020600020905b815481529060010190602001808311620012d257829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200131b906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462001349906200a20c565b80156200139a5780601f106200136e576101008083540402835291602001916200139a565b820191906000526020600020905b8154815290600101906020018083116200137c57829003601f168201915b50505050508152602001600182018054620013b5906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620013e3906200a20c565b8015620014345780601f10620014085761010080835404028352916020019162001434565b820191906000526020600020905b8154815290600101906020018083116200141657829003601f168201915b505050505081526020016002820180546200144f906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200147d906200a20c565b8015620014ce5780601f10620014a257610100808354040283529160200191620014ce565b820191906000526020600020905b815481529060010190602001808311620014b057829003601f168201915b50505050508152602001600382018054620014e9906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462001517906200a20c565b8015620015685780601f106200153c5761010080835404028352916020019162001568565b820191906000526020600020905b8154815290600101906020018083116200154a57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162001607575050509190925250505060408101519091506001600160a01b031615806200164457508060e001515b156200170157604051611002903490600081818185875af1925050503d80600081146200168e576040519150601f19603f3d011682016040523d82523d6000602084013e62001693565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016f49060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200175857600080fd5b505af11580156200176d573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620017ae91815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017e3919086906004016200a242565b600060405180830381600087803b158015620017fe57600080fd5b505af115801562001813573d6000803e3d6000fd5b5050505050505b50565b33611001146200184557604051630f22c43960e41b81526110016004820152602401620011ef565b60005462010000900460ff16156200187057604051631785c68160e01b815260040160405180910390fd5b600060458383604051620018869291906200a25c565b908152604051908190036020019020546001600160a01b03169050620018ae603f8262008265565b620018cc5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038116600090815260416020526040812090620018f462015180426200a282565b604a546000828152604b602052604090205491925011620019285760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b60205260408120805460019290620019499084906200a2a5565b90915550506040516046906200196390879087906200a25c565b908152602001604051809103902054600014158015620019b45750426201518060468787604051620019979291906200a25c565b908152602001604051809103902054620019b291906200a2a5565b105b15620019d357604051631898eb6b60e01b815260040160405180910390fd5b600080620019e385600262008288565b915091508162001a0657604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001a59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a7f91906200a2bb565b905062001a8d858362008312565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600260405162001acd939291906200a2eb565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001b0b916001600160a01b0316908a906004016200a242565b600060405180830381600087803b15801562001b2657600080fd5b505af115801562001b3b573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001b7357604051630f22c43960e41b81526120006004820152602401620011ef565b60005462010000900460ff161562001b9e57604051631785c68160e01b815260040160405180910390fd5b6034805460ff19166001179055604080516020601f8501819004810282018101909252838152600091829162001bef918790879081908401838280828437600092019190915250620084d992505050565b915091508062001c125760405163035ede3560e21b815260040160405180910390fd5b816060015160000362001c38575050604080516000815260208101909152905062001eab565b606082015160405163e04c83a760e01b81526000916110049163e04c83a79162001c689160040190815260200190565b6020604051808303816000875af115801562001c88573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001cae91906200a31a565b90508062001d555782602001516001600160a01b031683600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a8560600151600160405162001d0a9291906200a33a565b60405180910390a385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092965062001eab95505050505050565b600062001d62846200863c565b9050600081600481111562001d7b5762001d7b6200a2d5565b0362001d9d575050604080516000815260208101909152925062001eab915050565b6040516000906110049047908381818185875af1925050503d806000811462001de3576040519150601f19603f3d011682016040523d82523d6000602084013e62001de8565b606091505b505090508062001e0b576040516312171d8360e31b815260040160405180910390fd5b84602001516001600160a01b031685600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a87606001518560405162001e5e9291906200a33a565b60405180910390a387878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092985062001eab975050505050505050565b6034805460ff191690559392505050565b60008162001ecc603f8262008265565b62001eea5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038084166000908152604160205260409020600d01541691505b50919050565b600054630100000090046001600160a01b0316331462001f44576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001fbe57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ff05760405163b1d02c3d60e01b815260040160405180910390fd5b8062001ffe603f8262008265565b6200201c5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff166200205a57604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa158015620020aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d091906200a2bb565b1015620020f0576040516317b204bf60e11b815260040160405180910390fd5b4281600b01541115620021165760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff1916905560498054600191906000906200213a9084906200a361565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff1615620021a357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620021d55760405163b1d02c3d60e01b815260040160405180910390fd5b620021df62008ca5565b620021ec603f8262008265565b6200220a5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166200223257604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161515806200227357506001600160a01b03821660009081526047602052604090205460ff165b156200229257604051631e6f587560e11b815260040160405180910390fd5b60006200229e62008ca5565b6001600160a01b0381166000908152604160205260409020600c810154919250904290620022d19062015180906200a2a5565b1115620022f157604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b3362002385603f8262008265565b620023a35760405163056e881160e01b815260040160405180910390fd5b60005462010000900460ff1615620023ce57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620024005760405163b1d02c3d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152604d602052604090205416156200243a5760405163bebdc75760e01b815260040160405180910390fd5b62002447603f8362008265565b15620024665760405163bebdc75760e01b815260040160405180910390fd5b336000818152604160205260409020600d01546001600160a01b039081169084168103620024a75760405163bebdc75760e01b815260040160405180910390fd5b6001600160a01b03811615620024de576001600160a01b0381166000908152604d6020526040902080546001600160a01b03191690555b6001600160a01b038281166000908152604160205260409020600d0180546001600160a01b03191691861691821790551562002543576001600160a01b038481166000908152604d6020526040902080546001600160a01b0319169184169190911790555b836001600160a01b0316816001600160a01b0316836001600160a01b03167fcbb728765de145e99c00e8ae32a325231e850359b7b8a6da3b84d672ab3f1d0a60405160405180910390a450505050565b600054630100000090046001600160a01b03163314620025c6576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff16156200263a57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200266c5760405163b1d02c3d60e01b815260040160405180910390fd5b816200267a603f8262008265565b620026985760405163056e881160e01b815260040160405180910390fd5b81600003620026ba57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038084166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002722906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462002750906200a20c565b8015620027a15780601f106200277557610100808354040283529160200191620027a1565b820191906000526020600020905b8154815290600101906020018083116200278357829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620027cc906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620027fa906200a20c565b80156200284b5780601f106200281f576101008083540402835291602001916200284b565b820191906000526020600020905b8154815290600101906020018083116200282d57829003601f168201915b5050505050815260200160018201805462002866906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462002894906200a20c565b8015620028e55780601f10620028b957610100808354040283529160200191620028e5565b820191906000526020600020905b815481529060010190602001808311620028c757829003601f168201915b5050505050815260200160028201805462002900906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200292e906200a20c565b80156200297f5780601f1062002953576101008083540402835291602001916200297f565b820191906000526020600020905b8154815290600101906020018083116200296157829003601f168201915b505050505081526020016003820180546200299a906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620029c8906200a20c565b801562002a195780601f10620029ed5761010080835404028352916020019162002a19565b820191906000526020600020905b815481529060010190602001808311620029fb57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162002ab8575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af115801562002b32573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002b5891906200a2bb565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802878460405162002ba9929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b03160362002bd65762002bd68662008ce6565b6040808301519051633041949b60e01b815261200591633041949b9162002c03919087906004016200a242565b600060405180830381600087803b15801562002c1e57600080fd5b505af115801562002c33573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff161562002c6a57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562002c9c5760405163b1d02c3d60e01b815260040160405180910390fd5b8362002caa603f8262008265565b62002cc85760405163056e881160e01b815260040160405180910390fd5b8362002cd6603f8262008265565b62002cf45760405163056e881160e01b815260040160405180910390fd5b6034805460ff19166001179055600084900362002d2457604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b03160362002d575760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002dbf906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462002ded906200a20c565b801562002e3e5780601f1062002e125761010080835404028352916020019162002e3e565b820191906000526020600020905b81548152906001019060200180831162002e2057829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002e69906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462002e97906200a20c565b801562002ee85780601f1062002ebc5761010080835404028352916020019162002ee8565b820191906000526020600020905b81548152906001019060200180831162002eca57829003601f168201915b5050505050815260200160018201805462002f03906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462002f31906200a20c565b801562002f825780601f1062002f565761010080835404028352916020019162002f82565b820191906000526020600020905b81548152906001019060200180831162002f6457829003601f168201915b5050505050815260200160028201805462002f9d906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462002fcb906200a20c565b80156200301c5780601f1062002ff0576101008083540402835291602001916200301c565b820191906000526020600020905b81548152906001019060200180831162002ffe57829003601f168201915b5050505050815260200160038201805462003037906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462003065906200a20c565b8015620030b65780601f106200308a57610100808354040283529160200191620030b6565b820191906000526020600020905b8154815290600101906020018083116200309857829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200315557505050919092525050506001600160a01b03808916600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805494955091939092916080840191620031e0906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200320e906200a20c565b80156200325f5780601f1062003233576101008083540402835291602001916200325f565b820191906000526020600020905b8154815290600101906020018083116200324157829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200328a906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620032b8906200a20c565b8015620033095780601f10620032dd5761010080835404028352916020019162003309565b820191906000526020600020905b815481529060010190602001808311620032eb57829003601f168201915b5050505050815260200160018201805462003324906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462003352906200a20c565b8015620033a35780601f106200337757610100808354040283529160200191620033a3565b820191906000526020600020905b8154815290600101906020018083116200338557829003601f168201915b50505050508152602001600282018054620033be906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620033ec906200a20c565b80156200343d5780601f1062003411576101008083540402835291602001916200343d565b820191906000526020600020905b8154815290600101906020018083116200341f57829003601f168201915b5050505050815260200160038201805462003458906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462003486906200a20c565b8015620034d75780601f10620034ab57610100808354040283529160200191620034d7565b820191906000526020600020905b815481529060010190602001808311620034b957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620035765750505050508152505090508060e001518015620035b95750876001600160a01b0316836001600160a01b031614155b15620035d857604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af11580156200362f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200365591906200a2bb565b90506037548110156200367b5760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200371057506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa158015620036e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200370e91906200a2bb565b105b156200372f576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a54836200374591906200a377565b6200375191906200a282565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d8060008114620037a6576040519150601f19603f3d011682016040523d82523d6000602084013e620037ab565b606091505b5050905080620037ce576040516312171d8360e31b815260040160405180910390fd5b620037da82846200a361565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af115801562003830573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200385791906200a2bb565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e8589604051620038bc939291909283526020830191909152604082015260600190565b60405180910390a46040805160028082526060820183526000926020830190803683370190505090508660400151816000815181106200390057620039006200a391565b60200260200101906001600160a01b031690816001600160a01b0316815250508560400151816001815181106200393b576200393b6200a391565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b8152612005906344840775906200397c9084908c906004016200a3a7565b600060405180830381600087803b1580156200399757600080fd5b505af1158015620039ac573d6000803e3d6000fd5b505050508a1562003a1e576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b8152600401620039e99291906200a242565b600060405180830381600087803b15801562003a0457600080fd5b505af115801562003a19573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff161562003a6357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562003a955760405163b1d02c3d60e01b815260040160405180910390fd5b62003a9f62008ca5565b62003aac603f8262008265565b62003aca5760405163056e881160e01b815260040160405180910390fd5b600062003ad662008ca5565b6001600160a01b0381166000908152604160205260409020600c81015491925090429062003b099062015180906200a2a5565b111562003b2957604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b9091048116908516111562003b635760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b03908116908616101562003ba157600982015462003b9b9086906001600160401b03166200a3d3565b62003bbb565b600982015462003bbb906001600160401b0316866200a3d3565b60098301546001600160401b039182169250600160801b90041681111562003bf65760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b6060806060600062003c75603f62008e0c565b905080861015620042fe57841562003c8e578462003c90565b805b945060008562003ca188846200a361565b1162003cb95762003cb387836200a361565b62003cbb565b855b9050806001600160401b0381111562003cd85762003cd862009a8f565b60405190808252806020026020018201604052801562003d02578160200160208202803683370190505b509450806001600160401b0381111562003d205762003d2062009a8f565b60405190808252806020026020018201604052801562003d4a578160200160208202803683370190505b509350806001600160401b0381111562003d685762003d6862009a8f565b60405190808252806020026020018201604052801562003d9d57816020015b606081526020019060019003908162003d875790505b50925060005b81811015620042fb57600062003dc762003dbe838b6200a2a5565b603f9062008e17565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003e34906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462003e62906200a20c565b801562003eb35780601f1062003e875761010080835404028352916020019162003eb3565b820191906000526020600020905b81548152906001019060200180831162003e9557829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003ede906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462003f0c906200a20c565b801562003f5d5780601f1062003f315761010080835404028352916020019162003f5d565b820191906000526020600020905b81548152906001019060200180831162003f3f57829003601f168201915b5050505050815260200160018201805462003f78906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462003fa6906200a20c565b801562003ff75780601f1062003fcb5761010080835404028352916020019162003ff7565b820191906000526020600020905b81548152906001019060200180831162003fd957829003601f168201915b5050505050815260200160028201805462004012906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462004040906200a20c565b8015620040915780601f10620040655761010080835404028352916020019162004091565b820191906000526020600020905b8154815290600101906020018083116200407357829003601f168201915b50505050508152602001600382018054620040ac906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620040da906200a20c565b80156200412b5780601f10620040ff576101008083540402835291602001916200412b565b820191906000526020600020905b8154815290600101906020018083116200410d57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620041ca57505050505081525050905080600001518884815181106200420357620042036200a391565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e001516200429c5780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562004270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200429691906200a2bb565b6200429f565b60005b878481518110620042b457620042b46200a391565b6020026020010181815250508060800151868481518110620042da57620042da6200a391565b6020026020010181905250505080620042f3906200a3f6565b905062003da3565b50505b92959194509250565b60005462010000900460ff16156200433257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620043645760405163b1d02c3d60e01b815260040160405180910390fd5b3362004372603f8262008265565b156200439157604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038181166000908152604d60205260409020541615620043cb57604051631a0a9b9f60e21b815260040160405180910390fd5b6001600160a01b03888116600090815260436020526040902054161515806200440c57506001600160a01b03881660009081526047602052604090205460ff165b156200442b57604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200444a9291906200a25c565b908152604051908190036020019020546001600160a01b031614158062004494575060488787604051620044809291906200a25c565b9081526040519081900360200190205460ff165b15620044b3576040516311fdb94760e01b815260040160405180910390fd5b6000620044c183806200a412565b604051602001620044d49291906200a25c565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff16156200451e5760405163c0bf414360e01b815260040160405180910390fd5b600062004534670de0b6b3a7640000346200a361565b90506036548110156200455a576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a166200458257604051636520611b60e11b815260040160405180910390fd5b61138862004597604087016020880162009c73565b6001600160401b03161180620045dd5750620045ba604086016020870162009c73565b6001600160401b0316620045d2602087018762009c73565b6001600160401b0316115b806200461c5750620045f6604086016020870162009c73565b6001600160401b031662004611606087016040880162009c73565b6001600160401b0316115b156200463b5760405163dc81db8560e01b815260040160405180910390fd5b620046866200464b85806200a412565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062008e2592505050565b620046a457604051635dba5ad760e01b815260040160405180910390fd5b620046b3838a8a8a8a62008fc7565b620046d157604051631647e3cb60e11b815260040160405180910390fd5b60006200471f84620046e487806200a412565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620090f792505050565b90506200472e603f85620091f8565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620047ae8b8d836200a4ba565b508560058201620047c082826200a582565b5087905060098201620047d482826200a6bb565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004822908e908e906200a25c565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620048a59291906200a78b565b60405180910390a460408051848152602081018590526001600160a01b0387169182916000805160206200ba92833981519152910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816916000805160206200ba92833981519152910160405180910390a3604051633041949b60e01b815261200590633041949b906200494990859089906004016200a242565b600060405180830381600087803b1580156200496457600080fd5b505af115801562004979573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620049b6603f8262008265565b620049d45760405163056e881160e01b815260040160405180910390fd5b50506001600160a01b031660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915290565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608281019190915260048401805491949160808401919062004a9d906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462004acb906200a20c565b801562004b1c5780601f1062004af05761010080835404028352916020019162004b1c565b820191906000526020600020905b81548152906001019060200180831162004afe57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462004b47906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462004b75906200a20c565b801562004bc65780601f1062004b9a5761010080835404028352916020019162004bc6565b820191906000526020600020905b81548152906001019060200180831162004ba857829003601f168201915b5050505050815260200160018201805462004be1906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462004c0f906200a20c565b801562004c605780601f1062004c345761010080835404028352916020019162004c60565b820191906000526020600020905b81548152906001019060200180831162004c4257829003601f168201915b5050505050815260200160028201805462004c7b906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462004ca9906200a20c565b801562004cfa5780601f1062004cce5761010080835404028352916020019162004cfa565b820191906000526020600020905b81548152906001019060200180831162004cdc57829003601f168201915b5050505050815260200160038201805462004d15906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462004d43906200a20c565b801562004d945780601f1062004d685761010080835404028352916020019162004d94565b820191906000526020600020905b81548152906001019060200180831162004d7657829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162004e335750505091909252505050608001519392505050565b336110011462004e8457604051630f22c43960e41b81526110016004820152602401620011ef565b6001600160a01b038082166000908152604360205260409020541662004eac603f8262008265565b62004eca5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004f2d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004f5391906200a2bb565b90506000603d544262004f6791906200a2a5565b905062004f75838262008312565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004fb5939291906200a2eb565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004ff3916001600160a01b03169088906004016200a242565b600060405180830381600087803b1580156200500e57600080fd5b505af115801562005023573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff16158080156200504f5750600054600160ff909116105b806200506b5750303b1580156200506b575060005460ff166001145b620050d05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620011ef565b6000805460ff191660011790558015620050f4576000805461ff0019166101001790555b334114620051155760405163022d8c9560e31b815260040160405180910390fd5b3a1562005135576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d60385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562278d00603e55604a5560408051610760810190915261074080825260609182916200bab26020830139806020019051810190620051c691906200a7c7565b915060405180611160016040528061114081526020016200c1f26111409139806020019051810190620051fa91906200a86b565b905060005b825181101562005269576001604760008584815181106200522457620052246200a391565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562005261816200a3f6565b9050620051ff565b5060005b8151811015620052da57600160488383815181106200529057620052906200a391565b6020026020010151604051620052a791906200a968565b908152604051908190036020019020805491151560ff19909216919091179055620052d2816200a3f6565b90506200526d565b50620052fa7308e68ec70fa3b629784fdb28887e206ce8561e086200920f565b505080156200181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b33612000146200536d57604051630f22c43960e41b81526120006004820152602401620011ef565b7faa5ba621c8b3d7d05bb9e51a7506108251d4d5dbe542ca66fc7bb52aacb02b65838383604051620053a2939291906200a986565b60405180910390a1505050565b600054630100000090046001600160a01b03163314620053e2576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff16156200540d57604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600062005456603f8462008265565b620054745760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa158015620054d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620054f791906200a2bb565b90505b92915050565b60005462010000900460ff16156200552b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200555d5760405163b1d02c3d60e01b815260040160405180910390fd5b816200556b603f8262008265565b620055895760405163056e881160e01b815260040160405180910390fd5b6037543490811015620055af5760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b038085166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162005617906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005645906200a20c565b8015620056965780601f106200566a5761010080835404028352916020019162005696565b820191906000526020600020905b8154815290600101906020018083116200567857829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620056c1906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620056ef906200a20c565b8015620057405780601f10620057145761010080835404028352916020019162005740565b820191906000526020600020905b8154815290600101906020018083116200572257829003601f168201915b505050505081526020016001820180546200575b906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005789906200a20c565b8015620057da5780601f10620057ae57610100808354040283529160200191620057da565b820191906000526020600020905b815481529060010190602001808311620057bc57829003601f168201915b50505050508152602001600282018054620057f5906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005823906200a20c565b8015620058745780601f10620058485761010080835404028352916020019162005874565b820191906000526020600020905b8154815290600101906020018083116200585657829003601f168201915b505050505081526020016003820180546200588f906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620058bd906200a20c565b80156200590e5780601f10620058e2576101008083540402835291602001916200590e565b820191906000526020600020905b815481529060010190602001808311620058f057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620059ad5750505050508152505090508060e001518015620059f05750856001600160a01b0316826001600160a01b031614155b1562005a0f57604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005a60573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062005a8791906200a2bb565b9050826001600160a01b0316876001600160a01b03166000805160206200ba92833981519152838760405162005ac7929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b9162005afc919087906004016200a242565b600060405180830381600087803b15801562005b1757600080fd5b505af115801562005b2c573d6000803e3d6000fd5b50505050851562001813576040516372f6ad8f60e11b81526120059063e5ed5b1e9062005b609086908b906004016200a242565b600060405180830381600087803b15801562005b7b57600080fd5b505af115801562005b90573d6000803e3d6000fd5b5050505050505050505050565b62005bc96040518060800160405280606081526020016060815260200160608152602001606081525090565b8162005bd7603f8262008265565b62005bf55760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383166000908152604160205260409081902081516080810190925260050180548290829062005c2c906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005c5a906200a20c565b801562005cab5780601f1062005c7f5761010080835404028352916020019162005cab565b820191906000526020600020905b81548152906001019060200180831162005c8d57829003601f168201915b5050505050815260200160018201805462005cc6906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005cf4906200a20c565b801562005d455780601f1062005d195761010080835404028352916020019162005d45565b820191906000526020600020905b81548152906001019060200180831162005d2757829003601f168201915b5050505050815260200160028201805462005d60906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005d8e906200a20c565b801562005ddf5780601f1062005db35761010080835404028352916020019162005ddf565b820191906000526020600020905b81548152906001019060200180831162005dc157829003601f168201915b5050505050815260200160038201805462005dfa906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462005e28906200a20c565b801562005e795780601f1062005e4d5761010080835404028352916020019162005e79565b820191906000526020600020905b81548152906001019060200180831162005e5b57829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005eb557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005ee75760405163b1d02c3d60e01b815260040160405180910390fd5b62005ef38282620092a8565b5050565b336110071462005f1f57604051630f22c43960e41b81526110076004820152602401620011ef565b62005f8c6040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b1562006047576020811462005fbe5783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f840181900481028201810190925282815260009162006001918585808385018382808284376000920191909152509293925050620094119050565b90506108fc81108062006015575061271081115b156200603e5784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b60355562006d51565b620060b86040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620061825760208114620060ea5783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f84018190048102820181019092528281526000916200612d918585808385018382808284376000920191909152509293925050620094119050565b9050683635c9adc5dea0000081108062006150575069152d02c7e14af680000081115b15620061795784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b60365562006d51565b620061f5604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620062bc5760208114620062275783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f84018190048102820181019092528281526000916200626a918585808385018382808284376000920191909152509293925050620094119050565b905067016345785d8a00008110806200628a5750678ac7230489e8000081115b15620062b35784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b60375562006d51565b6200632d604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620063e557602081146200635f5783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f8401819004810282018101909252828152600091620063a2918585808385018382808284376000920191909152509293925050620094119050565b9050801580620063b357506101f481115b15620063dc5784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b60385562006d51565b6200644e6040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b156200650b5760208114620064805783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f8401819004810282018101909252828152600091620064c3918585808385018382808284376000920191909152509293925050620094119050565b90506203f480811080620064d9575062278d0081115b15620065025784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b60395562006d51565b6200657960405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620066265760208114620065ab5783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f8401819004810282018101909252828152600091620065ee918585808385018382808284376000920191909152509293925050620094119050565b905060648111156200661d5784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b603a5562006d51565b6200669660405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620067575760208114620066c85783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f84018190048102820181019092528281526000916200670b918585808385018382808284376000920191909152509293925050620094119050565b9050674563918244f40000811080620067255750603c5481115b156200674e5784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b603b5562006d51565b620067c56040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620068885760208114620067f75783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f84018190048102820181019092528281526000916200683a918585808385018382808284376000920191909152509293925050620094119050565b905068056bc75e2d63100000811080620068565750603b548111155b156200687f5784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b603c5562006d51565b620068f56040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b15620069b25760208114620069275783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f84018190048102820181019092528281526000916200696a918585808385018382808284376000920191909152509293925050620094119050565b90506202a300811080620069805750603e548110155b15620069a95784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b603d5562006d51565b62006a1d6040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b1562006ada576020811462006a4f5783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f840181900481028201810190925282815260009162006a92918585808385018382808284376000920191909152509293925050620094119050565b9050620d2f0081108062006aa85750603d548111155b1562006ad15784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b603e5562006d51565b62006b546040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b1562006c00576020811462006b865783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604080516020601f840181900481028201810190925282815260009162006bc9918585808385018382808284376000920191909152509293925050620094119050565b90508060000362006bf75784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b604a5562006d51565b62006c6e6040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620093b49050565b1562006d2e576014811462006ca05783838383604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b600062006ce8601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620094119050565b90506001600160a01b03811662006d1c5784848484604051630a5a604160e01b8152600401620011ef94939291906200a9a5565b62006d278162009416565b5062006d51565b838383836040516325ee20d560e21b8152600401620011ef94939291906200a9a5565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e6338484848460405162006d8894939291906200a9a5565b60405180910390a150505050565b60005462010000900460ff161562006dc157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562006df35760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b0381111562006e115762006e1162009a8f565b60405190808252806020026020018201604052801562006e3b578160200160208202803683370190505b5090506000805b8381101562006f395762006e8487878381811062006e645762006e646200a391565b905060200201602081019062006e7b91906200991e565b603f9062008265565b62006ea25760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006ebb5762006ebb6200a391565b905060200201602081019062006ed291906200991e565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006f0e5762006f0e6200a391565b6001600160a01b039092166020928302919091019091015262006f31816200a3f6565b905062006e42565b50604051634484077560e01b81526120059063448407759062002c0390859088906004016200a3a7565b606080600062006f74603f62008e0c565b9050808510156200713857831562006f8d578362006f8f565b805b935060008462006fa087846200a361565b1162006fb85762006fb286836200a361565b62006fba565b845b9050806001600160401b0381111562006fd75762006fd762009a8f565b60405190808252806020026020018201604052801562007001578160200160208202803683370190505b509350806001600160401b038111156200701f576200701f62009a8f565b60405190808252806020026020018201604052801562007049578160200160208202803683370190505b50925060005b8181101562007135576200706862003dbe82896200a2a5565b8582815181106200707d576200707d6200a391565b60200260200101906001600160a01b031690816001600160a01b03168152505060416000868381518110620070b657620070b66200a391565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b03168482815181106200710a576200710a6200a391565b6001600160a01b03909216602092830291909101909101526200712d816200a3f6565b90506200704f565b50505b9250925092565b33611001146200716757604051630f22c43960e41b81526110016004820152602401620011ef565b60005462010000900460ff16156200719257604051631785c68160e01b815260040160405180910390fd5b6001600160a01b0380821660009081526043602052604090205416620071ba603f8262008265565b620071d85760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260408120906200720062015180426200a282565b604a546000828152604b602052604090205491925011620072345760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b60205260408120805460019290620072559084906200a2a5565b90915550506001600160a01b03841660009081526044602052604090205415801590620072aa57506001600160a01b0384166000908152604460205260409020544290620072a89062015180906200a2a5565b105b15620072c9576040516330abb81d60e21b815260040160405180910390fd5b600080620072d985600062008288565b9150915081620072fc57604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af11580156200734f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200737591906200a2bb565b905062007383858362008312565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb283836000604051620073c3939291906200a2eb565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162005b60916001600160a01b0316908a906004016200a242565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384938493849390929160808401919062007472906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620074a0906200a20c565b8015620074f15780601f10620074c557610100808354040283529160200191620074f1565b820191906000526020600020905b815481529060010190602001808311620074d357829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200751c906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200754a906200a20c565b80156200759b5780601f106200756f576101008083540402835291602001916200759b565b820191906000526020600020905b8154815290600101906020018083116200757d57829003601f168201915b50505050508152602001600182018054620075b6906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620075e4906200a20c565b8015620076355780601f10620076095761010080835404028352916020019162007635565b820191906000526020600020905b8154815290600101906020018083116200761757829003601f168201915b5050505050815260200160028201805462007650906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200767e906200a20c565b8015620076cf5780601f10620076a357610100808354040283529160200191620076cf565b820191906000526020600020905b815481529060010190602001808311620076b157829003601f168201915b50505050508152602001600382018054620076ea906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007718906200a20c565b8015620077695780601f106200773d5761010080835404028352916020019162007769565b820191906000526020600020905b8154815290600101906020018083116200774b57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620078085750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200786f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620078a15760405163b1d02c3d60e01b815260040160405180910390fd5b620078ab62008ca5565b620078b8603f8262008265565b620078d65760405163056e881160e01b815260040160405180910390fd5b6000620078e262008ca5565b6001600160a01b0381166000908152604160205260409020600c810154919250904290620079159062015180906200a2a5565b11156200793557604051631f92cdbd60e11b815260040160405180910390fd5b60058101805462007946906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007974906200a20c565b8015620079c55780601f106200799957610100808354040283529160200191620079c5565b820191906000526020600020905b815481529060010190602001808311620079a757829003601f168201915b5050508287525085916005840191508190620079e290826200a9d0565b5060208201516001820190620079f990826200a9d0565b506040820151600282019062007a1090826200a9d0565b506060820151600382019062007a2790826200a9d0565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff161562007a9557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007ac75760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007ae8576040516341abc80160e01b815260040160405180910390fd5b60005b8381101562007b595762007b4685858381811062007b0d5762007b0d6200a391565b905060200201602081019062007b2491906200991e565b84848481811062007b395762007b396200a391565b90506020020135620092a8565b62007b51816200a3f6565b905062007aeb565b5050505050565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162007bcb906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007bf9906200a20c565b801562007c4a5780601f1062007c1e5761010080835404028352916020019162007c4a565b820191906000526020600020905b81548152906001019060200180831162007c2c57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462007c75906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007ca3906200a20c565b801562007cf45780601f1062007cc85761010080835404028352916020019162007cf4565b820191906000526020600020905b81548152906001019060200180831162007cd657829003601f168201915b5050505050815260200160018201805462007d0f906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007d3d906200a20c565b801562007d8e5780601f1062007d625761010080835404028352916020019162007d8e565b820191906000526020600020905b81548152906001019060200180831162007d7057829003601f168201915b5050505050815260200160028201805462007da9906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007dd7906200a20c565b801562007e285780601f1062007dfc5761010080835404028352916020019162007e28565b820191906000526020600020905b81548152906001019060200180831162007e0a57829003601f168201915b5050505050815260200160038201805462007e43906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462007e71906200a20c565b801562007ec25780601f1062007e965761010080835404028352916020019162007ec2565b820191906000526020600020905b81548152906001019060200180831162007ea457829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162007f615750505091909252505050604001519392505050565b600062007f99603f8462008265565b62007fb75760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd90602401620054b3565b60005462010000900460ff16156200802657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620080585760405163b1d02c3d60e01b815260040160405180910390fd5b6200806262008ca5565b6200806f603f8262008265565b6200808d5760405163056e881160e01b815260040160405180910390fd5b60006200809962008ca5565b9050620080aa818787878762008fc7565b620080c857604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b031660458787604051620080e79291906200a25c565b908152604051908190036020019020546001600160a01b0316141580620081315750604886866040516200811d9291906200a25c565b9081526040519081900360200190205460ff165b1562008150576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c81015442906200817f9062015180906200a2a5565b11156200819f57604051631f92cdbd60e11b815260040160405180910390fd5b42604682600401604051620081b591906200aa98565b9081526040519081900360200190205560048101620081d68789836200a4ba565b5042600c8201556040518290604590620081f4908a908a906200a25c565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062008254908a908a906200a78b565b60405180910390a250505050505050565b6001600160a01b03811660009081526001830160205260408120541515620054f7565b60008060008484604051602001620082a29291906200ab16565b60408051601f1981840301815291815281516020928301206000818152604c90935291205490915042811115620082e2576000809350935050506200830b565b603e54620082f190426200a2a5565b6000928352604c6020526040909220829055506001925090505b9250929050565b8154604051631507fdb760e11b81526001600160a01b03909116600482015261100090632a0ffb6e90602401600060405180830381600087803b1580156200835957600080fd5b505af11580156200836e573d6000803e3d6000fd5b505050506000600162008382603f62008e0c565b6200838e91906200a361565b60495410801591506200844c5760405163d31f968d60e01b81526110006004820152600860248201526120009063d31f968d90604401602060405180830381865afa158015620083e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200840891906200a31a565b6200844c5760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b01548211156200846157600b83018290555b600a83015460ff16620084d457600a8301805460ff1916600190811790915560498054600090620084949084906200a2a5565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b604080516080808201835260008083526020808401829052838501829052606080850183905285519384018652828452838201839052838601839052830182905284518086018652828152810182905284518086019095528551855285810190850152919282906200854b9062009482565b90506000805b6200855c83620094f5565b156200862f57806000036200859157620085806200857a846200951b565b6200957f565b6001600160a01b031684526200861c565b80600103620085bd57620085a96200857a846200951b565b6001600160a01b031660208501526200861c565b80600203620085e957620085d56200857a846200951b565b6001600160a01b031660408501526200861c565b8060030362008616576200860762008601846200951b565b62009597565b6060850152600191506200861c565b6200862f565b62008627816200a3f6565b905062008551565b5091959194509092505050565b6020808201516001600160a01b031660009081526001909152604081205460ff168062008674575060208201516001600160a01b0316155b156200868257506004919050565b81516200869290603f9062008265565b6200869f57506002919050565b81516001600160a01b039081166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929391926080840191906200870b906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462008739906200a20c565b80156200878a5780601f106200875e576101008083540402835291602001916200878a565b820191906000526020600020905b8154815290600101906020018083116200876c57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620087b5906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620087e3906200a20c565b8015620088345780601f10620088085761010080835404028352916020019162008834565b820191906000526020600020905b8154815290600101906020018083116200881657829003601f168201915b505050505081526020016001820180546200884f906200a20c565b80601f01602080910402602001604051908101604052809291908181526020018280546200887d906200a20c565b8015620088ce5780601f10620088a257610100808354040283529160200191620088ce565b820191906000526020600020905b815481529060010190602001808311620088b057829003601f168201915b50505050508152602001600282018054620088e9906200a20c565b80601f016020809104026020016040519081016040528092919081815260200182805462008917906200a20c565b8015620089685780601f106200893c5761010080835404028352916020019162008968565b820191906000526020600020905b8154815290600101906020018083116200894a57829003601f168201915b5050505050815260200160038201805462008983906200a20c565b80601f0160208091040260200160405190810160405280929190818152602001828054620089b1906200a20c565b801562008a025780601f10620089d65761010080835404028352916020019162008a02565b820191906000526020600020905b815481529060010190602001808311620089e457829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162008aa15750505050508152505090508060e00151801562008aec575082600001516001600160a01b031683602001516001600160a01b031614155b1562008afb5750600392915050565b6040808201516060850151602086015192516317066a5760e21b81526001600160a01b03938416600482015260009390921691635c19a95c919060240160206040518083038185885af115801562008b57573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062008b7e91906200a2bb565b905083602001516001600160a01b031684600001516001600160a01b03166000805160206200ba9283398151915283876060015160405162008bca929190918252602082015260400190565b60405180910390a383602001516001600160a01b031684600001516001600160a01b03167f607b17598da6bdca05650a2fc08bd2bc8e38c3236806a0fa8e0daabc1d6cb1d883876060015160405162008c2d929190918252602082015260400190565b60405180910390a360408083015160208601519151633041949b60e01b815261200592633041949b9262008c67929091906004016200a242565b600060405180830381600087803b15801562008c8257600080fd5b505af115801562008c97573d6000803e3d6000fd5b506000979650505050505050565b336000908152604d60205260408120546001600160a01b03161562008ce15750336000908152604d60205260409020546001600160a01b031690565b503390565b6001600160a01b0381166000908152604160205260409020600a81015460ff161562008d10575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa15801562008d60573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008d8691906200a2bb565b101562005ef35762008da881603d544262008da291906200a2a5565b62008312565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b15801562008def57600080fd5b505af115801562008e04573d6000803e3d6000fd5b505050505050565b6000620054fa825490565b6000620054f783836200966f565b60008082905060038151108062008e3d575060098151115b1562008e4c5750600092915050565b60418160008151811062008e645762008e646200a391565b016020015160f81c108062008e965750605a8160008151811062008e8c5762008e8c6200a391565b016020015160f81c115b1562008ea55750600092915050565b60015b815181101562008fbd57603082828151811062008ec95762008ec96200a391565b016020015160f81c108062008efa5750603982828151811062008ef05762008ef06200a391565b016020015160f81c115b801562008f4a5750604182828151811062008f195762008f196200a391565b016020015160f81c108062008f4a5750605a82828151811062008f405762008f406200a391565b016020015160f81c115b801562008f9a5750606182828151811062008f695762008f696200a391565b016020015160f81c108062008f9a5750607a82828151811062008f905762008f906200a391565b016020015160f81c115b1562008faa575060009392505050565b62008fb5816200a3f6565b905062008ea8565b5060019392505050565b600060308414158062008fdb575060608214155b1562008fea57506000620090ee565b6000868686466040516020016200900594939291906200ab54565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a6040516020016200905f9594939291906200ab81565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa620090a957600080fd5b50600081600081518110620090c257620090c26200a391565b016020015160f81c905060018114620090e457600095505050505050620090ee565b6001955050505050505b95945050505050565b60008061200361dead6040516200910e90620098fa565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562009151573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b8152600401620091859291906200abb9565b6000604051808303818588803b1580156200919f57600080fd5b505af1158015620091b4573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b6000620054f7836001600160a01b0384166200969c565b600054610100900460ff166200927c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011ef565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b81620092b6603f8262008265565b620092d45760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562009338573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200935e91906200a2bb565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd399268383604051620093a691815260200190565b60405180910390a350505050565b600081604051602001620093c991906200a968565b6040516020818303038152906040528051906020012083604051602001620093f291906200a968565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6040805160808101825260009181018281526060820183905281526020810191909152620094b082620096ee565b620094ba57600080fd5b6000620094cb836020015162009721565b8360200151620094dc91906200a2a5565b6040805180820190915293845260208401525090919050565b805180516020820151600092916200950d916200a2a5565b836020015110915050919050565b60408051808201909152600080825260208201526200953a82620094f5565b6200954457600080fd5b602082015160006200955682620097b0565b90506200956481836200a2a5565b60209485015260408051808201909152908152928301525090565b80516000906015146200959157600080fd5b620054fa825b805160009015801590620095ad57508151602110155b620095b757600080fd5b6000620095c8836020015162009721565b90508083600001511015620096205760405162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f66667365740000000000006044820152606401620011ef565b8251600090620096329083906200a361565b90506000808386602001516200964991906200a2a5565b90508051915060208310156200966657826020036101000a820491505b50949350505050565b60008260000182815481106200968957620096896200a391565b9060005260206000200154905092915050565b6000818152600183016020526040812054620096e557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620054fa565b506000620054fa565b805160009081036200970257506000919050565b6020820151805160001a9060c082101562008fbd575060009392505050565b8051600090811a60808110156200973b5750600092915050565b60b881108062009758575060c0811080159062009758575060f881105b15620097675750600192915050565b60c0811015620097a2576200977f600160b86200abdf565b6200978e9060ff16826200a361565b6200979b9060016200a2a5565b9392505050565b6200977f600160f86200abdf565b80516000908190811a6080811015620097cd5760019150620098f3565b60b8811015620097f957620097e46080826200a361565b620097f19060016200a2a5565b9150620098f3565b60c08110156200987257600060b78203600186019550806020036101000a8651049150600181018201935050808310156200986b5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b6044820152606401620011ef565b50620098f3565b60f88110156200988957620097e460c0826200a361565b600060f78203600186019550806020036101000a865104915060018101820193505080831015620098f15760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b6044820152606401620011ef565b505b5092915050565b610e96806200abfc83390190565b6001600160a01b03811681146200181a57600080fd5b6000602082840312156200993157600080fd5b81356200979b8162009908565b60008083601f8401126200995157600080fd5b5081356001600160401b038111156200996957600080fd5b6020830191508360208285010111156200830b57600080fd5b600080602083850312156200999657600080fd5b82356001600160401b03811115620099ad57600080fd5b620099bb858286016200993e565b90969095509350505050565b600080600060408486031215620099dd57600080fd5b833560ff81168114620099ef57600080fd5b925060208401356001600160401b0381111562009a0b57600080fd5b62009a19868287016200993e565b9497909650939450505050565b60005b8381101562009a4357818101518382015260200162009a29565b50506000910152565b6000815180845262009a6681602086016020860162009a26565b601f01601f19169290920160200192915050565b602081526000620054f7602083018462009a4c565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562009aca5762009aca62009a8f565b60405290565b604051601f8201601f191681016001600160401b038111828210171562009afb5762009afb62009a8f565b604052919050565b60006001600160401b0382111562009b1f5762009b1f62009a8f565b50601f01601f191660200190565b600062009b4462009b3e8462009b03565b62009ad0565b905082815283838301111562009b5957600080fd5b828260208301376000602084830101529392505050565b60006020828403121562009b8357600080fd5b81356001600160401b0381111562009b9a57600080fd5b8201601f8101841362009bac57600080fd5b62009bbd8482356020840162009b2d565b949350505050565b6000806040838503121562009bd957600080fd5b823562009be68162009908565b946020939093013593505050565b80151581146200181a57600080fd5b6000806000806080858703121562009c1a57600080fd5b843562009c278162009908565b9350602085013562009c398162009908565b925060408501359150606085013562009c528162009bf4565b939692955090935050565b6001600160401b03811681146200181a57600080fd5b60006020828403121562009c8657600080fd5b81356200979b8162009c5d565b6000806040838503121562009ca757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101562009cf15781516001600160a01b03168752958201959082019060010162009cca565b509495945050505050565b60808152600062009d11608083018762009cb6565b82810360208481019190915286518083528782019282019060005b8181101562009d4a5784518352938301939183019160010162009d2c565b5050848103604086015286518082528282019350600581901b8201830183890160005b8381101562009d9f57601f1985840301875262009d8c83835162009a4c565b9686019692509085019060010162009d6d565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e081121562009dd557600080fd5b883562009de28162009908565b975060208901356001600160401b038082111562009dff57600080fd5b62009e0d8c838d016200993e565b909950975060408b013591508082111562009e2757600080fd5b62009e358c838d016200993e565b90975095508591506060605f198401121562009e5057600080fd5b60608b01945060c08b013592508083111562009e6b57600080fd5b505088016080818b03121562009e8057600080fd5b8091505092959891949750929550565b6000806040838503121562009ea457600080fd5b823562009eb18162009908565b9150602083013562009ec38162009bf4565b809150509250929050565b60208152600082516080602084015262009eec60a084018262009a4c565b90506020840151601f198085840301604086015262009f0c838362009a4c565b9250604086015191508085840301606086015262009f2b838362009a4c565b9250606086015191508085840301608086015250620090ee828262009a4c565b6000806000806040858703121562009f6257600080fd5b84356001600160401b038082111562009f7a57600080fd5b62009f88888389016200993e565b9096509450602087013591508082111562009fa257600080fd5b5062009fb1878288016200993e565b95989497509550505050565b60008083601f84011262009fd057600080fd5b5081356001600160401b0381111562009fe857600080fd5b6020830191508360208260051b85010111156200830b57600080fd5b6000806000604084860312156200a01a57600080fd5b83356001600160401b038111156200a03157600080fd5b6200a03f8682870162009fbd565b90945092505060208401356200a0558162009908565b809150509250925092565b6060815260006200a075606083018662009cb6565b82810360208401526200a089818662009cb6565b915050826040830152949350505050565b600082601f8301126200a0ac57600080fd5b620054f78383356020850162009b2d565b6000602082840312156200a0d057600080fd5b81356001600160401b03808211156200a0e857600080fd5b90830190608082860312156200a0fd57600080fd5b6200a10762009aa5565b8235828111156200a11757600080fd5b6200a125878286016200a09a565b8252506020830135828111156200a13b57600080fd5b6200a149878286016200a09a565b6020830152506040830135828111156200a16257600080fd5b6200a170878286016200a09a565b6040830152506060830135828111156200a18957600080fd5b6200a197878286016200a09a565b60608301525095945050505050565b600080600080604085870312156200a1bd57600080fd5b84356001600160401b03808211156200a1d557600080fd5b6200a1e38883890162009fbd565b909650945060208701359150808211156200a1fd57600080fd5b5062009fb18782880162009fbd565b600181811c908216806200a22157607f821691505b60208210810362001f0b57634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b6000826200a2a057634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620054fa57620054fa6200a26c565b6000602082840312156200a2ce57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b8381526020810183905260608101600383106200a30c576200a30c6200a2d5565b826040830152949350505050565b6000602082840312156200a32d57600080fd5b81516200979b8162009bf4565b82815260408101600583106200a354576200a3546200a2d5565b8260208301529392505050565b81810381811115620054fa57620054fa6200a26c565b8082028115828204841417620054fa57620054fa6200a26c565b634e487b7160e01b600052603260045260246000fd5b6040815260006200a3bc604083018562009cb6565b905060018060a01b03831660208301529392505050565b6001600160401b03828116828216039080821115620098f357620098f36200a26c565b6000600182016200a40b576200a40b6200a26c565b5060010190565b6000808335601e198436030181126200a42a57600080fd5b8301803591506001600160401b038211156200a44557600080fd5b6020019150368190038213156200830b57600080fd5b601f821115620084d457600081815260208120601f850160051c810160208610156200a4845750805b601f850160051c820191505b8181101562008e04578281556001016200a490565b600019600383901b1c191660019190911b1790565b6001600160401b038311156200a4d4576200a4d462009a8f565b6200a4ec836200a4e583546200a20c565b836200a45b565b6000601f8411600181146200a51f57600085156200a50a5750838201355b6200a51686826200a4a5565b84555062007b59565b600083815260209020601f19861690835b828110156200a55257868501358255602094850194600190920191016200a530565b50868210156200a5705760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200a58e82836200a412565b6001600160401b038111156200a5a8576200a5a862009a8f565b6200a5c0816200a5b985546200a20c565b856200a45b565b6000601f8211600181146200a5f357600083156200a5de5750838201355b6200a5ea84826200a4a5565b8655506200a650565b600085815260209020601f19841690835b828110156200a62657868501358255602094850194600190920191016200a604565b50848210156200a6445760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506200a66360208301836200a412565b6200a6738183600186016200a4ba565b50506200a68460408301836200a412565b6200a6948183600286016200a4ba565b50506200a6a560608301836200a412565b6200a6b58183600386016200a4ba565b50505050565b81356200a6c88162009c5d565b6001600160401b03811690508154816001600160401b0319821617835560208401356200a6f58162009c5d565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff198316841781178555908501356200a7358162009c5d565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600062009bbd6020830184866200a762565b60006001600160401b038211156200a7bd576200a7bd62009a8f565b5060051b60200190565b600060208083850312156200a7db57600080fd5b82516001600160401b038111156200a7f257600080fd5b8301601f810185136200a80457600080fd5b80516200a81562009b3e826200a7a1565b81815260059190911b820183019083810190878311156200a83557600080fd5b928401925b828410156200a8605783516200a8508162009908565b825292840192908401906200a83a565b979650505050505050565b600060208083850312156200a87f57600080fd5b82516001600160401b03808211156200a89757600080fd5b818501915085601f8301126200a8ac57600080fd5b81516200a8bd62009b3e826200a7a1565b81815260059190911b830184019084810190888311156200a8dd57600080fd5b8585015b838110156200a95b578051858111156200a8fb5760008081fd5b8601603f81018b136200a90e5760008081fd5b8781015160406200a92362009b3e8362009b03565b8281528d828486010111156200a9395760008081fd5b6200a94a838c830184870162009a26565b86525050509186019186016200a8e1565b5098975050505050505050565b600082516200a97c81846020870162009a26565b9190910192915050565b60ff84168152604060208201526000620090ee6040830184866200a762565b6040815260006200a9bb6040830186886200a762565b82810360208401526200a8608185876200a762565b81516001600160401b038111156200a9ec576200a9ec62009a8f565b6200aa04816200a9fd84546200a20c565b846200a45b565b602080601f8311600181146200aa3857600084156200aa235750858301515b6200aa2f85826200a4a5565b86555062008e04565b600085815260208120601f198616915b828110156200aa69578886015182559484019460019091019084016200aa48565b50858210156200aa885787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200aaa8816200a20c565b600182811680156200aac357600181146200aad9576200ab0a565b60ff19841687528215158302870194506200ab0a565b8760005260208060002060005b858110156200ab015781548a8201529084019082016200aae6565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200ab40576200ab406200a2d5565b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b600086516200ab95818460208b0162009a26565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b038316815260406020820181905260009062009bbd9083018462009a4c565b60ff8281168282160390811115620054fa57620054fa6200a26c56fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656424d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e0400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000a164736f6c6343000811000a" + "code": "0x608060405260043610620003ff5760003560e01c80638456cb59116200020f578063cbb04d9d1162000123578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000c98578063fb50b31f1462000cbd578063fc0c5ff11462000ce2578063ff69ab611462000cfa57600080fd5b8063e992aaf51462000c15578063efdbf0e11462000c2d578063f1f74d841462000c69578063f1fad1041462000c8157600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000ba8578063daacdb661462000bc0578063dbda7fb31462000bd8578063e8f67c3b1462000bfd57600080fd5b8063cbb04d9d1462000b04578063d115a2061462000b45578063d6ca429d1462000b5e578063d7c2dfc81462000b8357600080fd5b8063ac43175111620001a5578063bff02e201162000170578063bff02e201462000a91578063c38fbec81462000ac7578063c473318f1462000aec578063c8509d8114620008e557600080fd5b8063ac4317511462000a0f578063b187bd261462000a34578063baa7199e1462000a54578063bdceadf31462000a7957600080fd5b80638cd22b2211620001e65780638cd22b22146200097a578063982ef0a7146200099f578063a43569b314620009b6578063aad3ec9614620009ea57600080fd5b80638456cb59146200090a57806386d5450614620009225780638a4d3fa8146200095c57600080fd5b806349f41a42116200031357806364028fbd116200029d57806375cc7d89116200026857806375cc7d89146200089057806376e7d6d614620008b55780638129fc1c14620008cd578063831d65d114620008e557600080fd5b806364028fbd14620007cb578063663706d314620007e25780636ec01b2714620008135780636f8e2fa4146200086b57600080fd5b80634e6fd6c411620002de5780634e6fd6c4146200073257806359491871146200074a5780635e7cc1c9146200076f57806363a036b5146200079457600080fd5b806349f41a4214620006995780634a49ac4c14620006be5780634bf6c88214620006e35780634d99dd16146200070d57600080fd5b80631fa8882b1162000395578063417c73a71162000360578063417c73a714620005e5578063449ecfe6146200060a57806345211bfd146200062f5780634838d165146200065457600080fd5b80631fa8882b14620005555780632b727c86146200056e5780632e8e8c7114620005935780633840998814620005cd57600080fd5b8063092193ab11620003d6578063092193ab14620004a05780630e9fbf5114620004b75780631182b87514620004dc57806317b4f353146200051057600080fd5b8063046f7da2146200041f578063059ddd2214620004375780630661806e146200047957600080fd5b366200041a5760345460ff166001146200041857600080fd5b005b600080fd5b3480156200042c57600080fd5b506200041862000d12565b3480156200044457600080fd5b506200045c62000456366004620089d3565b62000da4565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200048657600080fd5b506200049160365481565b60405190815260200162000470565b62000418620004b1366004620089d3565b620011cc565b348015620004c457600080fd5b5062000418620004d636600462008a3e565b6200181d565b348015620004e957600080fd5b5062000501620004fb36600462008a83565b62001b49565b60405162000470919062008b36565b3480156200051d57600080fd5b506200045c6200052f36600462008c2c565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200056257600080fd5b50620004916201518081565b3480156200057b57600080fd5b506200045c6200058d366004620089d3565b62001be1565b348015620005a057600080fd5b506200045c620005b2366004620089d3565b604d602052600090815260409020546001600160a01b031681565b348015620005da57600080fd5b506200049160375481565b348015620005f257600080fd5b506200041862000604366004620089d3565b62001c36565b3480156200061757600080fd5b506200041862000629366004620089d3565b62001cb8565b3480156200063c57600080fd5b50620004186200064e366004620089d3565b62001e9d565b3480156200066157600080fd5b506200068862000673366004620089d3565b60016020526000908152604090205460ff1681565b604051901515815260200162000470565b348015620006a657600080fd5b5062000418620006b8366004620089d3565b6200209c565b348015620006cb57600080fd5b5062000418620006dd366004620089d3565b620022b8565b348015620006f057600080fd5b50620006fa600881565b60405160ff909116815260200162000470565b3480156200071a57600080fd5b50620004186200072c36600462008c81565b62002334565b3480156200073f57600080fd5b506200045c61dead81565b3480156200075757600080fd5b50620004186200076936600462008cc6565b62002964565b3480156200077c57600080fd5b50620004186200078e36600462008d34565b6200375d565b348015620007a157600080fd5b50620007b9620007b336600462008d54565b62003987565b60405162000470949392919062008dbd565b62000418620007dc36600462008e79565b6200402c565b348015620007ef57600080fd5b506200049162000801366004620089d3565b60446020526000908152604090205481565b3480156200082057600080fd5b506200083862000832366004620089d3565b620046d2565b6040805182516001600160401b039081168252602080850151821690830152928201519092169082015260600162000470565b3480156200087857600080fd5b50620005016200088a366004620089d3565b62004777565b3480156200089d57600080fd5b5062000418620008af366004620089d3565b62004ba3565b348015620008c257600080fd5b5062000491603d5481565b348015620008da57600080fd5b506200041862004d75565b348015620008f257600080fd5b50620004186200090436600462008a83565b6200508c565b3480156200091757600080fd5b5062000418620050ea565b3480156200092f57600080fd5b506200045c62000941366004620089d3565b6043602052600090815260409020546001600160a01b031681565b3480156200096957600080fd5b5062000491670de0b6b3a764000081565b3480156200098757600080fd5b50620004916200099936600462008c81565b62005182565b62000418620009b036600462008f51565b6200523b565b348015620009c357600080fd5b50620009db620009d5366004620089d3565b620058e9565b60405162000470919062008f8b565b348015620009f757600080fd5b506200041862000a0936600462008c81565b62005bd6565b34801562000a1c57600080fd5b506200041862000a2e36600462009008565b62005c43565b34801562000a4157600080fd5b5060005462010000900460ff1662000688565b34801562000a6157600080fd5b506200041862000a73366004620090c1565b62006ae2565b34801562000a8657600080fd5b5062000491603c5481565b34801562000a9e57600080fd5b5062000ab662000ab036600462008d54565b62006caf565b60405162000470939291906200911d565b34801562000ad457600080fd5b506200041862000ae6366004620089d3565b62006e8b565b34801562000af957600080fd5b506200049160385481565b34801562000b1157600080fd5b5062000b2962000b23366004620089d3565b6200714d565b6040805193845291151560208401529082015260600162000470565b34801562000b5257600080fd5b5062000491620186a081565b34801562000b6b57600080fd5b506200041862000b7d3660046200917a565b62007590565b34801562000b9057600080fd5b506200041862000ba236600462009263565b620077b6565b34801562000bb557600080fd5b5062000491603b5481565b34801562000bcd57600080fd5b506200049160495481565b34801562000be557600080fd5b506200045c62000bf7366004620089d3565b620078ac565b34801562000c0a57600080fd5b506200049160355481565b34801562000c2257600080fd5b5062000491603a5481565b34801562000c3a57600080fd5b506200049162000c4c36600462008c2c565b805160208183018101805160468252928201919093012091525481565b34801562000c7657600080fd5b5062000491603e5481565b34801562000c8e57600080fd5b50620006fa601181565b34801562000ca557600080fd5b506200049162000cb736600462008c81565b62007cd6565b34801562000cca57600080fd5b506200041862000cdc36600462009008565b62007d47565b34801562000cef57600080fd5b506200049160395481565b34801562000d0757600080fd5b5062000491604a5481565b600054630100000090046001600160a01b0316331462000d45576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000d6f57604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000e0f90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3d90620092c9565b801562000e8e5780601f1062000e625761010080835404028352916020019162000e8e565b820191906000526020600020905b81548152906001019060200180831162000e7057829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000eb990620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462000ee790620092c9565b801562000f385780601f1062000f0c5761010080835404028352916020019162000f38565b820191906000526020600020905b81548152906001019060200180831162000f1a57829003601f168201915b5050505050815260200160018201805462000f5390620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462000f8190620092c9565b801562000fd25780601f1062000fa65761010080835404028352916020019162000fd2565b820191906000526020600020905b81548152906001019060200180831162000fb457829003601f168201915b5050505050815260200160028201805462000fed90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200101b90620092c9565b80156200106c5780601f1062001040576101008083540402835291602001916200106c565b820191906000526020600020905b8154815290600101906020018083116200104e57829003601f168201915b505050505081526020016003820180546200108790620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620010b590620092c9565b8015620011065780601f10620010da5761010080835404028352916020019162001106565b820191906000526020600020905b815481529060010190602001808311620010e857829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620011a5575050509190925250509051949350505050565b3361100014620011f857604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b038082166000908152604360209081526040808320548416808452604183528184208251610180810184528154871681526001820154871694810194909452600281015490951691830191909152600384015460608301526004840180549194916080840191906200127190620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200129f90620092c9565b8015620012f05780601f10620012c457610100808354040283529160200191620012f0565b820191906000526020600020905b815481529060010190602001808311620012d257829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200131b90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200134990620092c9565b80156200139a5780601f106200136e576101008083540402835291602001916200139a565b820191906000526020600020905b8154815290600101906020018083116200137c57829003601f168201915b50505050508152602001600182018054620013b590620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620013e390620092c9565b8015620014345780601f10620014085761010080835404028352916020019162001434565b820191906000526020600020905b8154815290600101906020018083116200141657829003601f168201915b505050505081526020016002820180546200144f90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200147d90620092c9565b8015620014ce5780601f10620014a257610100808354040283529160200191620014ce565b820191906000526020600020905b815481529060010190602001808311620014b057829003601f168201915b50505050508152602001600382018054620014e990620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200151790620092c9565b8015620015685780601f106200153c5761010080835404028352916020019162001568565b820191906000526020600020905b8154815290600101906020018083116200154a57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162001607575050509190925250505060408101519091506001600160a01b031615806200164457508060e001515b156200170157604051611002903490600081818185875af1925050503d80600081146200168e576040519150601f19603f3d011682016040523d82523d6000602084013e62001693565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016f49060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200175857600080fd5b505af11580156200176d573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620017ae91815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017e391908690600401620092ff565b600060405180830381600087803b158015620017fe57600080fd5b505af115801562001813573d6000803e3d6000fd5b5050505050505b50565b33611001146200184557604051630f22c43960e41b81526110016004820152602401620011ef565b60005462010000900460ff16156200187057604051631785c68160e01b815260040160405180910390fd5b6000604583836040516200188692919062009319565b908152604051908190036020019020546001600160a01b03169050620018ae603f8262007fb1565b620018cc5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038116600090815260416020526040812090620018f462015180426200933f565b604a546000828152604b602052604090205491925011620019285760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200194990849062009362565b909155505060405160469062001963908790879062009319565b908152602001604051809103902054600014158015620019b457504262015180604687876040516200199792919062009319565b908152602001604051809103902054620019b2919062009362565b105b15620019d357604051631898eb6b60e01b815260040160405180910390fd5b600080620019e385600262007fd4565b915091508162001a0657604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001a59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a7f919062009378565b905062001a8d85836200805e565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600260405162001acd9392919062009392565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001b0b916001600160a01b0316908a90600401620092ff565b600060405180830381600087803b15801562001b2657600080fd5b505af115801562001b3b573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001b7357604051630f22c43960e41b81526120006004820152602401620011ef565b60005462010000900460ff161562001b9e57604051631785c68160e01b815260040160405180910390fd5b6034805460ff1916600117905560405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152606401620011ef565b60008162001bf1603f8262007fb1565b62001c0f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038084166000908152604160205260409020600d01541691505b50919050565b600054630100000090046001600160a01b0316331462001c69576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001ce357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001d155760405163b1d02c3d60e01b815260040160405180910390fd5b8062001d23603f8262007fb1565b62001d415760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001d7f57604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001dcf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001df5919062009378565b101562001e15576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001e3b5760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff19169055604980546001919060009062001e5f908490620093cd565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff161562001ec857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001efa5760405163b1d02c3d60e01b815260040160405180910390fd5b62001f0462008153565b62001f11603f8262007fb1565b62001f2f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03821662001f5757604051636520611b60e11b815260040160405180910390fd5b6001600160a01b038281166000908152604360205260409020541615158062001f9857506001600160a01b03821660009081526047602052604090205460ff165b1562001fb757604051631e6f587560e11b815260040160405180910390fd5b600062001fc362008153565b6001600160a01b0381166000908152604160205260409020600c81015491925090429062001ff690620151809062009362565b11156200201657604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b33620020aa603f8262007fb1565b620020c85760405163056e881160e01b815260040160405180910390fd5b60005462010000900460ff1615620020f357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620021255760405163b1d02c3d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152604d602052604090205416156200215f5760405163bebdc75760e01b815260040160405180910390fd5b6200216c603f8362007fb1565b156200218b5760405163bebdc75760e01b815260040160405180910390fd5b336000818152604160205260409020600d01546001600160a01b039081169084168103620021cc5760405163bebdc75760e01b815260040160405180910390fd5b6001600160a01b0381161562002203576001600160a01b0381166000908152604d6020526040902080546001600160a01b03191690555b6001600160a01b038281166000908152604160205260409020600d0180546001600160a01b03191691861691821790551562002268576001600160a01b038481166000908152604d6020526040902080546001600160a01b0319169184169190911790555b836001600160a01b0316816001600160a01b0316836001600160a01b03167fcbb728765de145e99c00e8ae32a325231e850359b7b8a6da3b84d672ab3f1d0a60405160405180910390a450505050565b600054630100000090046001600160a01b03163314620022eb576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff16156200235f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620023915760405163b1d02c3d60e01b815260040160405180910390fd5b816200239f603f8262007fb1565b620023bd5760405163056e881160e01b815260040160405180910390fd5b81600003620023df57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b03808416600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805433949160808401916200244790620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200247590620092c9565b8015620024c65780601f106200249a57610100808354040283529160200191620024c6565b820191906000526020600020905b815481529060010190602001808311620024a857829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620024f190620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200251f90620092c9565b8015620025705780601f10620025445761010080835404028352916020019162002570565b820191906000526020600020905b8154815290600101906020018083116200255257829003601f168201915b505050505081526020016001820180546200258b90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620025b990620092c9565b80156200260a5780601f10620025de576101008083540402835291602001916200260a565b820191906000526020600020905b815481529060010190602001808311620025ec57829003601f168201915b505050505081526020016002820180546200262590620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200265390620092c9565b8015620026a45780601f106200267857610100808354040283529160200191620026a4565b820191906000526020600020905b8154815290600101906020018083116200268657829003601f168201915b50505050508152602001600382018054620026bf90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620026ed90620092c9565b80156200273e5780601f1062002712576101008083540402835291602001916200273e565b820191906000526020600020905b8154815290600101906020018083116200272057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620027dd575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af115801562002857573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200287d919062009378565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b408298028784604051620028ce929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b031603620028fb57620028fb8662008194565b6040808301519051633041949b60e01b815261200591633041949b916200292891908790600401620092ff565b600060405180830381600087803b1580156200294357600080fd5b505af115801562002958573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff16156200298f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029c15760405163b1d02c3d60e01b815260040160405180910390fd5b83620029cf603f8262007fb1565b620029ed5760405163056e881160e01b815260040160405180910390fd5b83620029fb603f8262007fb1565b62002a195760405163056e881160e01b815260040160405180910390fd5b6034805460ff19166001179055600084900362002a4957604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b03160362002a7c5760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002ae490620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002b1290620092c9565b801562002b635780601f1062002b375761010080835404028352916020019162002b63565b820191906000526020600020905b81548152906001019060200180831162002b4557829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002b8e90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002bbc90620092c9565b801562002c0d5780601f1062002be15761010080835404028352916020019162002c0d565b820191906000526020600020905b81548152906001019060200180831162002bef57829003601f168201915b5050505050815260200160018201805462002c2890620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002c5690620092c9565b801562002ca75780601f1062002c7b5761010080835404028352916020019162002ca7565b820191906000526020600020905b81548152906001019060200180831162002c8957829003601f168201915b5050505050815260200160028201805462002cc290620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002cf090620092c9565b801562002d415780601f1062002d155761010080835404028352916020019162002d41565b820191906000526020600020905b81548152906001019060200180831162002d2357829003601f168201915b5050505050815260200160038201805462002d5c90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002d8a90620092c9565b801562002ddb5780601f1062002daf5761010080835404028352916020019162002ddb565b820191906000526020600020905b81548152906001019060200180831162002dbd57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162002e7a57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002f0590620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002f3390620092c9565b801562002f845780601f1062002f585761010080835404028352916020019162002f84565b820191906000526020600020905b81548152906001019060200180831162002f6657829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002faf90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002fdd90620092c9565b80156200302e5780601f1062003002576101008083540402835291602001916200302e565b820191906000526020600020905b8154815290600101906020018083116200301057829003601f168201915b505050505081526020016001820180546200304990620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200307790620092c9565b8015620030c85780601f106200309c57610100808354040283529160200191620030c8565b820191906000526020600020905b815481529060010190602001808311620030aa57829003601f168201915b50505050508152602001600282018054620030e390620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200311190620092c9565b8015620031625780601f10620031365761010080835404028352916020019162003162565b820191906000526020600020905b8154815290600101906020018083116200314457829003601f168201915b505050505081526020016003820180546200317d90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620031ab90620092c9565b8015620031fc5780601f10620031d057610100808354040283529160200191620031fc565b820191906000526020600020905b815481529060010190602001808311620031de57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200329b5750505050508152505090508060e001518015620032de5750876001600160a01b0316836001600160a01b031614155b15620032fd57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af115801562003354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200337a919062009378565b9050603754811015620033a05760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200343557506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200340d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003433919062009378565b105b1562003454576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a54836200346a9190620093e3565b6200347691906200933f565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d8060008114620034cb576040519150601f19603f3d011682016040523d82523d6000602084013e620034d0565b606091505b5050905080620034f3576040516312171d8360e31b815260040160405180910390fd5b620034ff8284620093cd565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af115801562003555573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200357c919062009378565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e8589604051620035e1939291909283526020830191909152604082015260600190565b60405180910390a4604080516002808252606082018352600092602083019080368337019050509050866040015181600081518110620036255762003625620093fd565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620036605762003660620093fd565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620036a19084908c9060040162009413565b600060405180830381600087803b158015620036bc57600080fd5b505af1158015620036d1573d6000803e3d6000fd5b505050508a1562003743576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200370e929190620092ff565b600060405180830381600087803b1580156200372957600080fd5b505af11580156200373e573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff16156200378857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620037ba5760405163b1d02c3d60e01b815260040160405180910390fd5b620037c462008153565b620037d1603f8262007fb1565b620037ef5760405163056e881160e01b815260040160405180910390fd5b6000620037fb62008153565b6001600160a01b0381166000908152604160205260409020600c8101549192509042906200382e90620151809062009362565b11156200384e57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620038885760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b039081169086161015620038c6576009820154620038c09086906001600160401b03166200943f565b620038e0565b6009820154620038e0906001600160401b0316866200943f565b60098301546001600160401b039182169250600160801b9004168111156200391b5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b606080606060006200399a603f620082ba565b90508086101562004023578415620039b35784620039b5565b805b9450600085620039c68884620093cd565b11620039de57620039d88783620093cd565b620039e0565b855b9050806001600160401b03811115620039fd57620039fd62008b4b565b60405190808252806020026020018201604052801562003a27578160200160208202803683370190505b509450806001600160401b0381111562003a455762003a4562008b4b565b60405190808252806020026020018201604052801562003a6f578160200160208202803683370190505b509350806001600160401b0381111562003a8d5762003a8d62008b4b565b60405190808252806020026020018201604052801562003ac257816020015b606081526020019060019003908162003aac5790505b50925060005b818110156200402057600062003aec62003ae3838b62009362565b603f90620082c5565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003b5990620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003b8790620092c9565b801562003bd85780601f1062003bac5761010080835404028352916020019162003bd8565b820191906000526020600020905b81548152906001019060200180831162003bba57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003c0390620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003c3190620092c9565b801562003c825780601f1062003c565761010080835404028352916020019162003c82565b820191906000526020600020905b81548152906001019060200180831162003c6457829003601f168201915b5050505050815260200160018201805462003c9d90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003ccb90620092c9565b801562003d1c5780601f1062003cf05761010080835404028352916020019162003d1c565b820191906000526020600020905b81548152906001019060200180831162003cfe57829003601f168201915b5050505050815260200160028201805462003d3790620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003d6590620092c9565b801562003db65780601f1062003d8a5761010080835404028352916020019162003db6565b820191906000526020600020905b81548152906001019060200180831162003d9857829003601f168201915b5050505050815260200160038201805462003dd190620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003dff90620092c9565b801562003e505780601f1062003e245761010080835404028352916020019162003e50565b820191906000526020600020905b81548152906001019060200180831162003e3257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162003eef575050505050815250509050806000015188848151811062003f285762003f28620093fd565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003fc15780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003f95573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003fbb919062009378565b62003fc4565b60005b87848151811062003fd95762003fd9620093fd565b602002602001018181525050806080015186848151811062003fff5762003fff620093fd565b6020026020010181905250505080620040189062009469565b905062003ac8565b50505b92959194509250565b60005462010000900460ff16156200405757604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620040895760405163b1d02c3d60e01b815260040160405180910390fd5b3362004097603f8262007fb1565b15620040b657604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038181166000908152604d60205260409020541615620040f057604051631a0a9b9f60e21b815260040160405180910390fd5b6001600160a01b03888116600090815260436020526040902054161515806200413157506001600160a01b03881660009081526047602052604090205460ff165b156200415057604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200416f92919062009319565b908152604051908190036020019020546001600160a01b0316141580620041b9575060488787604051620041a592919062009319565b9081526040519081900360200190205460ff165b15620041d8576040516311fdb94760e01b815260040160405180910390fd5b6000620041e6838062009485565b604051602001620041f992919062009319565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff1615620042435760405163c0bf414360e01b815260040160405180910390fd5b600062004259670de0b6b3a764000034620093cd565b90506036548110156200427f576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a16620042a757604051636520611b60e11b815260040160405180910390fd5b611388620042bc604087016020880162008d34565b6001600160401b03161180620043025750620042df604086016020870162008d34565b6001600160401b0316620042f7602087018762008d34565b6001600160401b0316115b806200434157506200431b604086016020870162008d34565b6001600160401b031662004336606087016040880162008d34565b6001600160401b0316115b15620043605760405163dc81db8560e01b815260040160405180910390fd5b620043ab62004370858062009485565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620082d392505050565b620043c957604051635dba5ad760e01b815260040160405180910390fd5b620043d8838a8a8a8a62008475565b620043f657604051631647e3cb60e11b815260040160405180910390fd5b6000620044448462004409878062009485565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620085a592505050565b905062004453603f85620086a6565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620044d38b8d836200952d565b508560058201620044e58282620095f5565b5087905060098201620044f982826200972e565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004547908e908e9062009319565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620045ca929190620097fe565b60405180910390a460408051848152602081018590526001600160a01b0387169182917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a3604051633041949b60e01b815261200590633041949b90620046909085908990600401620092ff565b600060405180830381600087803b158015620046ab57600080fd5b505af1158015620046c0573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620046fd603f8262007fb1565b6200471b5760405163056e881160e01b815260040160405180910390fd5b50506001600160a01b031660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915290565b6001600160a01b03808216600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082810191909152600484018054919491608084019190620047e490620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200481290620092c9565b8015620048635780601f10620048375761010080835404028352916020019162004863565b820191906000526020600020905b8154815290600101906020018083116200484557829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200488e90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620048bc90620092c9565b80156200490d5780601f10620048e1576101008083540402835291602001916200490d565b820191906000526020600020905b815481529060010190602001808311620048ef57829003601f168201915b505050505081526020016001820180546200492890620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200495690620092c9565b8015620049a75780601f106200497b57610100808354040283529160200191620049a7565b820191906000526020600020905b8154815290600101906020018083116200498957829003601f168201915b50505050508152602001600282018054620049c290620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620049f090620092c9565b801562004a415780601f1062004a155761010080835404028352916020019162004a41565b820191906000526020600020905b81548152906001019060200180831162004a2357829003601f168201915b5050505050815260200160038201805462004a5c90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462004a8a90620092c9565b801562004adb5780601f1062004aaf5761010080835404028352916020019162004adb565b820191906000526020600020905b81548152906001019060200180831162004abd57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162004b7a5750505091909252505050608001519392505050565b336110011462004bcb57604051630f22c43960e41b81526110016004820152602401620011ef565b6001600160a01b038082166000908152604360205260409020541662004bf3603f8262007fb1565b62004c115760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004c74573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004c9a919062009378565b90506000603d544262004cae919062009362565b905062004cbc83826200805e565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004cfc9392919062009392565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004d3a916001600160a01b0316908890600401620092ff565b600060405180830381600087803b15801562004d5557600080fd5b505af115801562004d6a573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004d965750600054600160ff909116105b8062004db25750303b15801562004db2575060005460ff166001145b62004e175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620011ef565b6000805460ff19166001179055801562004e3b576000805461ff0019166101001790555b33411462004e5c5760405163022d8c9560e31b815260040160405180910390fd5b3a1562004e7c576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d60385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562278d00603e55604a5560408051610760810190915261074080825260609182916200aad6602083013980602001905181019062004f0d91906200983a565b915060405180611160016040528061114081526020016200b216611140913980602001905181019062004f419190620098de565b905060005b825181101562004fb05760016047600085848151811062004f6b5762004f6b620093fd565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004fa88162009469565b905062004f46565b5060005b815181101562005021576001604883838151811062004fd75762004fd7620093fd565b602002602001015160405162004fee9190620099db565b908152604051908190036020019020805491151560ff19909216919091179055620050198162009469565b905062004fb4565b50620050417308e68ec70fa3b629784fdb28887e206ce8561e08620086bd565b505080156200181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b3361200014620050b457604051630f22c43960e41b81526120006004820152602401620011ef565b60405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152606401620011ef565b600054630100000090046001600160a01b031633146200511d576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff16156200514857604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600062005191603f8462007fb1565b620051af5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa1580156200520c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062005232919062009378565b90505b92915050565b60005462010000900460ff16156200526657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620052985760405163b1d02c3d60e01b815260040160405180910390fd5b81620052a6603f8262007fb1565b620052c45760405163056e881160e01b815260040160405180910390fd5b6037543490811015620052ea5760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b03808516600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805433949160808401916200535290620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200538090620092c9565b8015620053d15780601f10620053a557610100808354040283529160200191620053d1565b820191906000526020600020905b815481529060010190602001808311620053b357829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620053fc90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200542a90620092c9565b80156200547b5780601f106200544f576101008083540402835291602001916200547b565b820191906000526020600020905b8154815290600101906020018083116200545d57829003601f168201915b505050505081526020016001820180546200549690620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620054c490620092c9565b8015620055155780601f10620054e95761010080835404028352916020019162005515565b820191906000526020600020905b815481529060010190602001808311620054f757829003601f168201915b505050505081526020016002820180546200553090620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200555e90620092c9565b8015620055af5780601f106200558357610100808354040283529160200191620055af565b820191906000526020600020905b8154815290600101906020018083116200559157829003601f168201915b50505050508152602001600382018054620055ca90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620055f890620092c9565b8015620056495780601f106200561d5761010080835404028352916020019162005649565b820191906000526020600020905b8154815290600101906020018083116200562b57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620056e85750505050508152505090508060e0015180156200572b5750856001600160a01b0316826001600160a01b031614155b156200574a57604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af11580156200579b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620057c2919062009378565b9050826001600160a01b0316876001600160a01b03167f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04838760405162005813929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b916200584891908790600401620092ff565b600060405180830381600087803b1580156200586357600080fd5b505af115801562005878573d6000803e3d6000fd5b50505050851562001813576040516372f6ad8f60e11b81526120059063e5ed5b1e90620058ac9086908b90600401620092ff565b600060405180830381600087803b158015620058c757600080fd5b505af1158015620058dc573d6000803e3d6000fd5b5050505050505050505050565b620059156040518060800160405280606081526020016060815260200160608152602001606081525090565b8162005923603f8262007fb1565b620059415760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038316600090815260416020526040908190208151608081019092526005018054829082906200597890620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620059a690620092c9565b8015620059f75780601f10620059cb57610100808354040283529160200191620059f7565b820191906000526020600020905b815481529060010190602001808311620059d957829003601f168201915b5050505050815260200160018201805462005a1290620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462005a4090620092c9565b801562005a915780601f1062005a655761010080835404028352916020019162005a91565b820191906000526020600020905b81548152906001019060200180831162005a7357829003601f168201915b5050505050815260200160028201805462005aac90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462005ada90620092c9565b801562005b2b5780601f1062005aff5761010080835404028352916020019162005b2b565b820191906000526020600020905b81548152906001019060200180831162005b0d57829003601f168201915b5050505050815260200160038201805462005b4690620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462005b7490620092c9565b801562005bc55780601f1062005b995761010080835404028352916020019162005bc5565b820191906000526020600020905b81548152906001019060200180831162005ba757829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005c0157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005c335760405163b1d02c3d60e01b815260040160405180910390fd5b62005c3f828262008756565b5050565b336110071462005c6b57604051630f22c43960e41b81526110076004820152602401620011ef565b62005cd86040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562005d93576020811462005d0a5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162005d4d918585808385018382808284376000920191909152509293925050620088bf9050565b90506108fc81108062005d61575061271081115b1562005d8a5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60355562006a9d565b62005e046040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562005ece576020811462005e365783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162005e79918585808385018382808284376000920191909152509293925050620088bf9050565b9050683635c9adc5dea0000081108062005e9c575069152d02c7e14af680000081115b1562005ec55784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60365562006a9d565b62005f41604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562006008576020811462005f735783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162005fb6918585808385018382808284376000920191909152509293925050620088bf9050565b905067016345785d8a000081108062005fd65750678ac7230489e8000081115b1562005fff5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60375562006a9d565b62006079604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620061315760208114620060ab5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f8401819004810282018101909252828152600091620060ee918585808385018382808284376000920191909152509293925050620088bf9050565b9050801580620060ff57506101f481115b15620061285784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60385562006a9d565b6200619a6040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620062575760208114620061cc5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f84018190048102820181019092528281526000916200620f918585808385018382808284376000920191909152509293925050620088bf9050565b90506203f48081108062006225575062278d0081115b156200624e5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60395562006a9d565b620062c560405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620063725760208114620062f75783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f84018190048102820181019092528281526000916200633a918585808385018382808284376000920191909152509293925050620088bf9050565b90506064811115620063695784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603a5562006a9d565b620063e260405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620064a35760208114620064145783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162006457918585808385018382808284376000920191909152509293925050620088bf9050565b9050674563918244f40000811080620064715750603c5481115b156200649a5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603b5562006a9d565b620065116040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620065d45760208114620065435783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162006586918585808385018382808284376000920191909152509293925050620088bf9050565b905068056bc75e2d63100000811080620065a25750603b548111155b15620065cb5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603c5562006a9d565b620066416040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620066fe5760208114620066735783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f8401819004810282018101909252828152600091620066b6918585808385018382808284376000920191909152509293925050620088bf9050565b90506202a300811080620066cc5750603e548110155b15620066f55784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603d5562006a9d565b620067696040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b156200682657602081146200679b5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f8401819004810282018101909252828152600091620067de918585808385018382808284376000920191909152509293925050620088bf9050565b9050620d2f00811080620067f45750603d548111155b156200681d5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603e5562006a9d565b620068a06040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b156200694c5760208114620068d25783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162006915918585808385018382808284376000920191909152509293925050620088bf9050565b905080600003620069435784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604a5562006a9d565b620069ba6040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562006a7a5760148114620069ec5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b600062006a34601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088bf9050565b90506001600160a01b03811662006a685784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b62006a7381620088c4565b5062006a9d565b838383836040516325ee20d560e21b8152600401620011ef9493929190620099f9565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e6338484848460405162006ad49493929190620099f9565b60405180910390a150505050565b60005462010000900460ff161562006b0d57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562006b3f5760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b0381111562006b5d5762006b5d62008b4b565b60405190808252806020026020018201604052801562006b87578160200160208202803683370190505b5090506000805b8381101562006c855762006bd087878381811062006bb05762006bb0620093fd565b905060200201602081019062006bc79190620089d3565b603f9062007fb1565b62006bee5760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006c075762006c07620093fd565b905060200201602081019062006c1e9190620089d3565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006c5a5762006c5a620093fd565b6001600160a01b039092166020928302919091019091015262006c7d8162009469565b905062006b8e565b50604051634484077560e01b81526120059063448407759062002928908590889060040162009413565b606080600062006cc0603f620082ba565b90508085101562006e8457831562006cd9578362006cdb565b805b935060008462006cec8784620093cd565b1162006d045762006cfe8683620093cd565b62006d06565b845b9050806001600160401b0381111562006d235762006d2362008b4b565b60405190808252806020026020018201604052801562006d4d578160200160208202803683370190505b509350806001600160401b0381111562006d6b5762006d6b62008b4b565b60405190808252806020026020018201604052801562006d95578160200160208202803683370190505b50925060005b8181101562006e815762006db462003ae3828962009362565b85828151811062006dc95762006dc9620093fd565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006e025762006e02620093fd565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006e565762006e56620093fd565b6001600160a01b039092166020928302919091019091015262006e798162009469565b905062006d9b565b50505b9250925092565b336110011462006eb357604051630f22c43960e41b81526110016004820152602401620011ef565b60005462010000900460ff161562006ede57604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006f06603f8262007fb1565b62006f245760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006f4c62015180426200933f565b604a546000828152604b60205260409020549192501162006f805760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006fa190849062009362565b90915550506001600160a01b0384166000908152604460205260409020541580159062006ff657506001600160a01b038416600090815260446020526040902054429062006ff490620151809062009362565b105b1562007015576040516330abb81d60e21b815260040160405180910390fd5b6000806200702585600062007fd4565b91509150816200704857604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af11580156200709b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620070c1919062009378565b9050620070cf85836200805e565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb2838360006040516200710f9392919062009392565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b91620058ac916001600160a01b0316908a90600401620092ff565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849384938493909291608084019190620071be90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620071ec90620092c9565b80156200723d5780601f1062007211576101008083540402835291602001916200723d565b820191906000526020600020905b8154815290600101906020018083116200721f57829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200726890620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200729690620092c9565b8015620072e75780601f10620072bb57610100808354040283529160200191620072e7565b820191906000526020600020905b815481529060010190602001808311620072c957829003601f168201915b505050505081526020016001820180546200730290620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200733090620092c9565b8015620073815780601f10620073555761010080835404028352916020019162007381565b820191906000526020600020905b8154815290600101906020018083116200736357829003601f168201915b505050505081526020016002820180546200739c90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620073ca90620092c9565b80156200741b5780601f10620073ef576101008083540402835291602001916200741b565b820191906000526020600020905b815481529060010190602001808311620073fd57829003601f168201915b505050505081526020016003820180546200743690620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200746490620092c9565b8015620074b55780601f106200748957610100808354040283529160200191620074b5565b820191906000526020600020905b8154815290600101906020018083116200749757829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620075545750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff1615620075bb57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620075ed5760405163b1d02c3d60e01b815260040160405180910390fd5b620075f762008153565b62007604603f8262007fb1565b620076225760405163056e881160e01b815260040160405180910390fd5b60006200762e62008153565b6001600160a01b0381166000908152604160205260409020600c8101549192509042906200766190620151809062009362565b11156200768157604051631f92cdbd60e11b815260040160405180910390fd5b6005810180546200769290620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620076c090620092c9565b8015620077115780601f10620076e55761010080835404028352916020019162007711565b820191906000526020600020905b815481529060010190602001808311620076f357829003601f168201915b50505082875250859160058401915081906200772e908262009a24565b506020820151600182019062007745908262009a24565b50604082015160028201906200775c908262009a24565b506060820151600382019062007773908262009a24565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff1615620077e157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620078135760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007834576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620078a55762007892858583818110620078595762007859620093fd565b9050602002016020810190620078709190620089d3565b848484818110620078855762007885620093fd565b9050602002013562008756565b6200789d8162009469565b905062007837565b5050505050565b6001600160a01b03808216600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492938493909160808401916200791790620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200794590620092c9565b8015620079965780601f106200796a5761010080835404028352916020019162007996565b820191906000526020600020905b8154815290600101906020018083116200797857829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620079c190620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620079ef90620092c9565b801562007a405780601f1062007a145761010080835404028352916020019162007a40565b820191906000526020600020905b81548152906001019060200180831162007a2257829003601f168201915b5050505050815260200160018201805462007a5b90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462007a8990620092c9565b801562007ada5780601f1062007aae5761010080835404028352916020019162007ada565b820191906000526020600020905b81548152906001019060200180831162007abc57829003601f168201915b5050505050815260200160028201805462007af590620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462007b2390620092c9565b801562007b745780601f1062007b485761010080835404028352916020019162007b74565b820191906000526020600020905b81548152906001019060200180831162007b5657829003601f168201915b5050505050815260200160038201805462007b8f90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462007bbd90620092c9565b801562007c0e5780601f1062007be25761010080835404028352916020019162007c0e565b820191906000526020600020905b81548152906001019060200180831162007bf057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162007cad5750505091909252505050604001519392505050565b600062007ce5603f8462007fb1565b62007d035760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd90602401620051ee565b60005462010000900460ff161562007d7257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007da45760405163b1d02c3d60e01b815260040160405180910390fd5b62007dae62008153565b62007dbb603f8262007fb1565b62007dd95760405163056e881160e01b815260040160405180910390fd5b600062007de562008153565b905062007df6818787878762008475565b62007e1457604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007e3392919062009319565b908152604051908190036020019020546001600160a01b031614158062007e7d57506048868660405162007e6992919062009319565b9081526040519081900360200190205460ff165b1562007e9c576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007ecb90620151809062009362565b111562007eeb57604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007f01919062009aec565b908152604051908190036020019020556004810162007f228789836200952d565b5042600c820155604051829060459062007f40908a908a9062009319565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007fa0908a908a90620097fe565b60405180910390a250505050505050565b6001600160a01b0381166000908152600183016020526040812054151562005232565b6000806000848460405160200162007fee92919062009b6a565b60408051601f1981840301815291815281516020928301206000818152604c909352912054909150428111156200802e5760008093509350505062008057565b603e546200803d904262009362565b6000928352604c6020526040909220829055506001925090505b9250929050565b600060016200806e603f620082ba565b6200807a9190620093cd565b6049541080159150620080c65760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b0154821115620080db57600b83018290555b600a83015460ff166200814e57600a8301805460ff19166001908117909155604980546000906200810e90849062009362565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b336000908152604d60205260408120546001600160a01b0316156200818f5750336000908152604d60205260409020546001600160a01b031690565b503390565b6001600160a01b0381166000908152604160205260409020600a81015460ff1615620081be575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa1580156200820e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008234919062009378565b101562005c3f576200825681603d544262008250919062009362565b6200805e565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200829d57600080fd5b505af1158015620082b2573d6000803e3d6000fd5b505050505050565b600062005235825490565b600062005232838362008930565b600080829050600381511080620082eb575060098151115b15620082fa5750600092915050565b604181600081518110620083125762008312620093fd565b016020015160f81c1080620083445750605a816000815181106200833a576200833a620093fd565b016020015160f81c115b15620083535750600092915050565b60015b81518110156200846b576030828281518110620083775762008377620093fd565b016020015160f81c1080620083a8575060398282815181106200839e576200839e620093fd565b016020015160f81c115b8015620083f857506041828281518110620083c757620083c7620093fd565b016020015160f81c1080620083f85750605a828281518110620083ee57620083ee620093fd565b016020015160f81c115b80156200844857506061828281518110620084175762008417620093fd565b016020015160f81c1080620084485750607a8282815181106200843e576200843e620093fd565b016020015160f81c115b1562008458575060009392505050565b620084638162009469565b905062008356565b5060019392505050565b600060308414158062008489575060608214155b1562008498575060006200859c565b600086868646604051602001620084b3949392919062009bb4565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a6040516020016200850d95949392919062009be1565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa6200855757600080fd5b50600081600081518110620085705762008570620093fd565b016020015160f81c90506001811462008592576000955050505050506200859c565b6001955050505050505b95945050505050565b60008061200361dead604051620085bc90620089af565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f080158015620085ff573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b81526004016200863392919062009c19565b6000604051808303818588803b1580156200864d57600080fd5b505af115801562008662573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b600062005232836001600160a01b0384166200895d565b600054610100900460ff166200872a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011ef565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008764603f8262007fb1565b620087825760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af1158015620087e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200880c919062009378565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd3992683836040516200885491815260200190565b60405180910390a350505050565b600081604051602001620088779190620099db565b6040516020818303038152906040528051906020012083604051602001620088a09190620099db565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60008260000182815481106200894a576200894a620093fd565b9060005260206000200154905092915050565b6000818152600183016020526040812054620089a65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562005235565b50600062005235565b610e968062009c4083390190565b6001600160a01b03811681146200181a57600080fd5b600060208284031215620089e657600080fd5b8135620089f381620089bd565b9392505050565b60008083601f84011262008a0d57600080fd5b5081356001600160401b0381111562008a2557600080fd5b6020830191508360208285010111156200805757600080fd5b6000806020838503121562008a5257600080fd5b82356001600160401b0381111562008a6957600080fd5b62008a7785828601620089fa565b90969095509350505050565b60008060006040848603121562008a9957600080fd5b833560ff8116811462008aab57600080fd5b925060208401356001600160401b0381111562008ac757600080fd5b62008ad586828701620089fa565b9497909650939450505050565b60005b8381101562008aff57818101518382015260200162008ae5565b50506000910152565b6000815180845262008b2281602086016020860162008ae2565b601f01601f19169290920160200192915050565b60208152600062005232602083018462008b08565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562008b865762008b8662008b4b565b60405290565b604051601f8201601f191681016001600160401b038111828210171562008bb75762008bb762008b4b565b604052919050565b60006001600160401b0382111562008bdb5762008bdb62008b4b565b50601f01601f191660200190565b600062008c0062008bfa8462008bbf565b62008b8c565b905082815283838301111562008c1557600080fd5b828260208301376000602084830101529392505050565b60006020828403121562008c3f57600080fd5b81356001600160401b0381111562008c5657600080fd5b8201601f8101841362008c6857600080fd5b62008c798482356020840162008be9565b949350505050565b6000806040838503121562008c9557600080fd5b823562008ca281620089bd565b946020939093013593505050565b8035801515811462008cc157600080fd5b919050565b6000806000806080858703121562008cdd57600080fd5b843562008cea81620089bd565b9350602085013562008cfc81620089bd565b92506040850135915062008d136060860162008cb0565b905092959194509250565b6001600160401b03811681146200181a57600080fd5b60006020828403121562008d4757600080fd5b8135620089f38162008d1e565b6000806040838503121562008d6857600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101562008db25781516001600160a01b03168752958201959082019060010162008d8b565b509495945050505050565b60808152600062008dd2608083018762008d77565b82810360208481019190915286518083528782019282019060005b8181101562008e0b5784518352938301939183019160010162008ded565b5050848103604086015286518082528282019350600581901b8201830183890160005b8381101562008e6057601f1985840301875262008e4d83835162008b08565b9686019692509085019060010162008e2e565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e081121562008e9657600080fd5b883562008ea381620089bd565b975060208901356001600160401b038082111562008ec057600080fd5b62008ece8c838d01620089fa565b909950975060408b013591508082111562008ee857600080fd5b62008ef68c838d01620089fa565b90975095508591506060605f198401121562008f1157600080fd5b60608b01945060c08b013592508083111562008f2c57600080fd5b505088016080818b03121562008f4157600080fd5b8091505092959891949750929550565b6000806040838503121562008f6557600080fd5b823562008f7281620089bd565b915062008f826020840162008cb0565b90509250929050565b60208152600082516080602084015262008fa960a084018262008b08565b90506020840151601f198085840301604086015262008fc9838362008b08565b9250604086015191508085840301606086015262008fe8838362008b08565b92506060860151915080858403016080860152506200859c828262008b08565b600080600080604085870312156200901f57600080fd5b84356001600160401b03808211156200903757600080fd5b6200904588838901620089fa565b909650945060208701359150808211156200905f57600080fd5b506200906e87828801620089fa565b95989497509550505050565b60008083601f8401126200908d57600080fd5b5081356001600160401b03811115620090a557600080fd5b6020830191508360208260051b85010111156200805757600080fd5b600080600060408486031215620090d757600080fd5b83356001600160401b03811115620090ee57600080fd5b620090fc868287016200907a565b90945092505060208401356200911281620089bd565b809150509250925092565b60608152600062009132606083018662008d77565b828103602084015262009146818662008d77565b915050826040830152949350505050565b600082601f8301126200916957600080fd5b620052328383356020850162008be9565b6000602082840312156200918d57600080fd5b81356001600160401b0380821115620091a557600080fd5b9083019060808286031215620091ba57600080fd5b620091c462008b61565b823582811115620091d457600080fd5b620091e28782860162009157565b825250602083013582811115620091f857600080fd5b620092068782860162009157565b6020830152506040830135828111156200921f57600080fd5b6200922d8782860162009157565b6040830152506060830135828111156200924657600080fd5b620092548782860162009157565b60608301525095945050505050565b600080600080604085870312156200927a57600080fd5b84356001600160401b03808211156200929257600080fd5b620092a0888389016200907a565b90965094506020870135915080821115620092ba57600080fd5b506200906e878288016200907a565b600181811c90821680620092de57607f821691505b60208210810362001c3057634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b6000826200935d57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562005235576200523562009329565b6000602082840312156200938b57600080fd5b5051919050565b838152602081018390526060810160038310620093bf57634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b8181038181111562005235576200523562009329565b808202811582820484141762005235576200523562009329565b634e487b7160e01b600052603260045260246000fd5b60408152600062009428604083018562008d77565b905060018060a01b03831660208301529392505050565b6001600160401b0382811682821603908082111562009462576200946262009329565b5092915050565b6000600182016200947e576200947e62009329565b5060010190565b6000808335601e198436030181126200949d57600080fd5b8301803591506001600160401b03821115620094b857600080fd5b6020019150368190038213156200805757600080fd5b601f8211156200814e57600081815260208120601f850160051c81016020861015620094f75750805b601f850160051c820191505b81811015620082b25782815560010162009503565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009547576200954762008b4b565b6200955f83620095588354620092c9565b83620094ce565b6000601f8411600181146200959257600085156200957d5750838201355b62009589868262009518565b845550620078a5565b600083815260209020601f19861690835b82811015620095c55786850135825560209485019460019092019101620095a3565b5086821015620095e35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b62009601828362009485565b6001600160401b038111156200961b576200961b62008b4b565b62009633816200962c8554620092c9565b85620094ce565b6000601f821160018114620096665760008315620096515750838201355b6200965d848262009518565b865550620096c3565b600085815260209020601f19841690835b8281101562009699578685013582556020948501946001909201910162009677565b5084821015620096b75760001960f88660031b161c19848701351681555b505060018360011b0185555b50505050620096d6602083018362009485565b620096e68183600186016200952d565b5050620096f7604083018362009485565b620097078183600286016200952d565b505062009718606083018362009485565b620097288183600386016200952d565b50505050565b81356200973b8162008d1e565b6001600160401b03811690508154816001600160401b031982161783556020840135620097688162008d1e565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff19831684178117855590850135620097a88162008d1e565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600062008c79602083018486620097d5565b60006001600160401b0382111562009830576200983062008b4b565b5060051b60200190565b600060208083850312156200984e57600080fd5b82516001600160401b038111156200986557600080fd5b8301601f810185136200987757600080fd5b80516200988862008bfa8262009814565b81815260059190911b82018301908381019087831115620098a857600080fd5b928401925b82841015620098d3578351620098c381620089bd565b82529284019290840190620098ad565b979650505050505050565b60006020808385031215620098f257600080fd5b82516001600160401b03808211156200990a57600080fd5b818501915085601f8301126200991f57600080fd5b81516200993062008bfa8262009814565b81815260059190911b830184019084810190888311156200995057600080fd5b8585015b83811015620099ce578051858111156200996e5760008081fd5b8601603f81018b13620099815760008081fd5b8781015160406200999662008bfa8362008bbf565b8281528d82848601011115620099ac5760008081fd5b620099bd838c830184870162008ae2565b865250505091860191860162009954565b5098975050505050505050565b60008251620099ef81846020870162008ae2565b9190910192915050565b60408152600062009a0f604083018688620097d5565b8281036020840152620098d3818587620097d5565b81516001600160401b0381111562009a405762009a4062008b4b565b62009a588162009a518454620092c9565b84620094ce565b602080601f83116001811462009a8c576000841562009a775750858301515b62009a83858262009518565b865550620082b2565b600085815260208120601f198616915b8281101562009abd5788860151825594840194600190910190840162009a9c565b508582101562009adc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835462009afc81620092c9565b6001828116801562009b17576001811462009b2d5762009b5e565b60ff198416875282151583028701945062009b5e565b8760005260208060002060005b8581101562009b555781548a82015290840190820162009b3a565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b16815260006003831062009ba057634e487b7160e01b600052602160045260246000fd5b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b6000865162009bf5818460208b0162008ae2565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b038316815260406020820181905260009062008c799083018462008b0856fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000a164736f6c6343000811000a" }, "0x0000000000000000000000000000000000002003": { "balance": "0x0", From 798904dc86a18d4fe6775abbaf48cda06f77d284 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 09:32:34 +0800 Subject: [PATCH 07/52] feat: remove unused code and add comments --- contracts/BSCValidatorSet.sol | 31 +++------ contracts/StakeHub.sol | 10 +-- contracts/deprecated/CrossChain.sol | 41 ++++++------ contracts/deprecated/RelayerHub.sol | 16 ++--- contracts/deprecated/RelayerIncentivize.sol | 26 ++++---- .../deprecated/TendermintLightClient.sol | 63 +------------------ 6 files changed, 57 insertions(+), 130 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 2d228cb1..dcdf4728 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -34,7 +34,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica // the precision of cross chain value transfer. uint256 public constant PRECISION = 1e10; - uint256 public constant EXPIRE_TIME_SECOND_GAP = 1000; uint256 public constant MAX_NUM_OF_VALIDATORS = 100; bytes public constant INIT_VALIDATORSET_BYTES = @@ -50,19 +49,19 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica /*----------------- state of the contract -----------------*/ Validator[] public currentValidatorSet; - uint256 public expireTimeSecondGap; + uint256 public expireTimeSecondGap; // @dev deprecated uint256 public totalInComing; // key is the `consensusAddress` of `Validator`, // value is the index of the element in `currentValidatorSet`. mapping(address => uint256) public currentValidatorSetMap; - uint256 public numOfJailed; + uint256 public numOfJailed; // @dev deprecated uint256 public constant BLOCK_FEES_RATIO_SCALE = 10000; address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; uint256 public constant INIT_BURN_RATIO = 1000; uint256 public burnRatio; - bool public burnRatioInitialized; // deprecated + bool public burnRatioInitialized; // @dev deprecated // BEP-127 Temporary Maintenance uint256 public constant INIT_MAX_NUM_OF_MAINTAINING = 3; @@ -120,7 +119,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } /*----------------- cross chain package -----------------*/ - struct IbcValidatorSetPackage { + struct ValidatorSetPackage { uint8 packageType; Validator[] validatorSet; bytes[] voteAddrs; @@ -177,14 +176,13 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica /*----------------- init -----------------*/ function init() external onlyNotInit { - (IbcValidatorSetPackage memory validatorSetPkg, bool valid) = - decodeValidatorSetSynPackage(INIT_VALIDATORSET_BYTES); + (ValidatorSetPackage memory validatorSetPkg, bool valid) = + getValidatorSet(INIT_VALIDATORSET_BYTES); require(valid, "failed to parse init validatorSet"); for (uint256 i; i < validatorSetPkg.validatorSet.length; ++i) { currentValidatorSet.push(validatorSetPkg.validatorSet[i]); currentValidatorSetMap[validatorSetPkg.validatorSet[i].consensusAddress] = i + 1; } - expireTimeSecondGap = EXPIRE_TIME_SECOND_GAP; alreadyInit = true; } @@ -626,15 +624,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica /*----------------- Param update -----------------*/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { - if (Memory.compareStrings(key, "expireTimeSecondGap")) { - require(value.length == 32, "length of expireTimeSecondGap mismatch"); - uint256 newExpireTimeSecondGap = BytesToTypes.bytesToUint256(32, value); - require( - newExpireTimeSecondGap >= 100 && newExpireTimeSecondGap <= 1e5, - "the expireTimeSecondGap is out of range" - ); - expireTimeSecondGap = newExpireTimeSecondGap; - } else if (Memory.compareStrings(key, "burnRatio")) { + if (Memory.compareStrings(key, "burnRatio")) { require(value.length == 32, "length of burnRatio mismatch"); uint256 newBurnRatio = BytesToTypes.bytesToUint256(32, value); require( @@ -1093,13 +1083,12 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit validatorExitMaintenance(validator); } - //rlp encode & decode function - function decodeValidatorSetSynPackage(bytes memory msgBytes) + function getValidatorSet(bytes memory msgBytes) internal pure - returns (IbcValidatorSetPackage memory, bool) + returns (ValidatorSetPackage memory, bool) { - IbcValidatorSetPackage memory validatorSetPkg; + ValidatorSetPackage memory validatorSetPkg; RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); bool success = false; diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 24b6cf61..79c2c350 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -125,8 +125,8 @@ contract StakeHub is SystemV2, Initializable, Protectable { mapping(bytes => uint256) public voteExpiration; // legacy addresses of BC - mapping(address => bool) private _legacyConsensusAddress; - mapping(bytes => bool) private _legacyVoteAddress; + mapping(address => bool) private _legacyConsensusAddress; // @dev deprecated + mapping(bytes => bool) private _legacyVoteAddress; // @dev deprecated // total number of current jailed validators uint256 public numOfJailed; @@ -221,11 +221,11 @@ contract StakeHub is SystemV2, Initializable, Protectable { event ValidatorEmptyJailed(address indexed operatorAddress); event ValidatorUnjailed(address indexed operatorAddress); event Claimed(address indexed operatorAddress, address indexed delegator, uint256 bnbAmount); - event MigrateSuccess(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); + event MigrateSuccess(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); // @dev deprecated event MigrateFailed( address indexed operatorAddress, address indexed delegator, uint256 bnbAmount, StakeMigrationRespCode respCode - ); - event UnexpectedPackage(uint8 channelId, bytes msgBytes); + ); // @dev deprecated + event UnexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated event AgentChanged(address indexed operatorAddress, address indexed oldAgent, address indexed newAgent); /*----------------- modifiers -----------------*/ diff --git a/contracts/deprecated/CrossChain.sol b/contracts/deprecated/CrossChain.sol index af363e98..43617e88 100644 --- a/contracts/deprecated/CrossChain.sol +++ b/contracts/deprecated/CrossChain.sol @@ -1,17 +1,11 @@ pragma solidity 0.6.4; -import "../interface/0.6.x/IApplication.sol"; import "../interface/0.6.x/ICrossChain.sol"; -import "../interface/0.6.x/ITokenHub.sol"; import "../interface/0.6.x/ILightClient.sol"; -import "../interface/0.6.x/IRelayerIncentivize.sol"; -import "../interface/0.6.x/IRelayerHub.sol"; import "../interface/0.6.x/IBSCValidatorSetV2.sol"; import "../lib/0.6.x/Memory.sol"; -import "../lib/0.6.x/BytesToTypes.sol"; import "../interface/0.6.x/IParamSubscriber.sol"; import "../System.sol"; -import "../lib/0.6.x/MerkleProof.sol"; contract CrossChain is System, ICrossChain, IParamSubscriber { // constant variables @@ -23,7 +17,7 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { uint256 public constant INIT_BATCH_SIZE = 50; // governable parameters - uint256 public batchSizeForOracle; + uint256 public batchSizeForOracle; // @dev deprecated //state variables uint256 public previousTxHeight; @@ -31,9 +25,9 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { int64 public oracleSequence; mapping(uint8 => address) public channelHandlerContractMap; mapping(address => mapping(uint8 => bool)) public registeredContractChannelMap; - mapping(uint8 => uint64) public channelSendSequenceMap; + mapping(uint8 => uint64) public channelSendSequenceMap; // @dev deprecated mapping(uint8 => uint64) public channelReceiveSequenceMap; - mapping(uint8 => bool) public isRelayRewardFromSystemReward; + mapping(uint8 => bool) public isRelayRewardFromSystemReward; // @dev deprecated // to prevent the utilization of ancient block header mapping(uint8 => uint64) public channelSyncedHeaderMap; @@ -54,14 +48,15 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { bool public isSuspended; // proposal type hash => latest emergency proposal - mapping(bytes32 => EmergencyProposal) public emergencyProposals; + mapping(bytes32 => EmergencyProposal) public emergencyProposals; // @dev deprecated // proposal type hash => the threshold of proposal approved - mapping(bytes32 => uint16) public quorumMap; + mapping(bytes32 => uint16) public quorumMap; // @dev deprecated // IAVL key hash => is challenged - mapping(bytes32 => bool) public challenged; + mapping(bytes32 => bool) public challenged; // @dev deprecated // struct // BEP-171: Security Enhancement for Cross-Chain Module + // @dev deprecated struct EmergencyProposal { uint16 quorum; uint128 expiredAt; @@ -70,6 +65,7 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { } // event + // @dev deprecated event crossChainPackage( uint16 chainId, uint64 indexed oracleSequence, @@ -77,15 +73,16 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { uint8 indexed channelId, bytes payload ); - event receivedPackage(uint8 packageType, uint64 indexed packageSequence, uint8 indexed channelId); - event unsupportedPackage(uint64 indexed packageSequence, uint8 indexed channelId, bytes payload); - event unexpectedRevertInPackageHandler(address indexed contractAddr, string reason); - event unexpectedFailureAssertionInPackageHandler(address indexed contractAddr, bytes lowLevelData); - event paramChange(string key, bytes value); - event enableOrDisableChannel(uint8 indexed channelId, bool isEnable); - event addChannel(uint8 indexed channelId, address indexed contractAddr); + event receivedPackage(uint8 packageType, uint64 indexed packageSequence, uint8 indexed channelId); // @dev deprecated + event unsupportedPackage(uint64 indexed packageSequence, uint8 indexed channelId, bytes payload); // @dev deprecated + event unexpectedRevertInPackageHandler(address indexed contractAddr, string reason); // @dev deprecated + event unexpectedFailureAssertionInPackageHandler(address indexed contractAddr, bytes lowLevelData); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated + event enableOrDisableChannel(uint8 indexed channelId, bool isEnable); // @dev deprecated + event addChannel(uint8 indexed channelId, address indexed contractAddr); // @dev deprecated // BEP-171: Security Enhancement for Cross-Chain Module + // @dev deprecated event ProposalSubmitted( bytes32 indexed proposalTypeHash, address indexed proposer, @@ -93,9 +90,9 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { uint128 expiredAt, bytes32 contentHash ); - event Suspended(address indexed executor); - event Reopened(address indexed executor); - event SuccessChallenge(address indexed challenger, uint64 packageSequence, uint8 channelId); + event Suspended(address indexed executor); // @dev deprecated + event Reopened(address indexed executor); // @dev deprecated + event SuccessChallenge(address indexed challenger, uint64 packageSequence, uint8 channelId); // @dev deprecated modifier sequenceInOrder(uint64 _sequence, uint8 _channelID) { uint64 expectedSequence = channelReceiveSequenceMap[_channelID]; diff --git a/contracts/deprecated/RelayerHub.sol b/contracts/deprecated/RelayerHub.sol index 671b0d30..41c8d406 100644 --- a/contracts/deprecated/RelayerHub.sol +++ b/contracts/deprecated/RelayerHub.sol @@ -28,12 +28,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } mapping(address => bool) relayManagersExistMap; - mapping(address => address) managerToRelayer; + mapping(address => address) managerToRelayer; // @dev deprecated mapping(address => bool) currentRelayers; mapping(address => bool) provisionalRelayers; - mapping(address => address) managerToProvisionalRelayer; + mapping(address => address) managerToProvisionalRelayer; // @dev deprecated - bool public whitelistInitDone; + bool public whitelistInitDone; // @dev deprecated modifier onlyManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); @@ -51,12 +51,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } event relayerUnRegister(address _relayer); - event paramChange(string key, bytes value); + event paramChange(string key, bytes value); // @dev deprecated - event managerRemoved(address _removedManager); - event managerAdded(address _addedManager); - event relayerUpdated(address _from, address _to); - event relayerAddedProvisionally(address _relayer); + event managerRemoved(address _removedManager); // @dev deprecated + event managerAdded(address _addedManager); // @dev deprecated + event relayerUpdated(address _from, address _to); // @dev deprecated + event relayerAddedProvisionally(address _relayer); // @dev deprecated function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; diff --git a/contracts/deprecated/RelayerIncentivize.sol b/contracts/deprecated/RelayerIncentivize.sol index 282ae807..92713f67 100644 --- a/contracts/deprecated/RelayerIncentivize.sol +++ b/contracts/deprecated/RelayerIncentivize.sol @@ -24,26 +24,26 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { uint256 public callerCompensationMolecule; uint256 public callerCompensationDenominator; - mapping(address => uint256) public headerRelayersSubmitCount; - address payable[] public headerRelayerAddressRecord; + mapping(address => uint256) public headerRelayersSubmitCount; // @dev deprecated + address payable[] public headerRelayerAddressRecord; // @dev deprecated - mapping(address => uint256) public packageRelayersSubmitCount; - address payable[] public packageRelayerAddressRecord; + mapping(address => uint256) public packageRelayersSubmitCount; // @dev deprecated + address payable[] public packageRelayerAddressRecord; // @dev deprecated - uint256 public collectedRewardForHeaderRelayer = 0; - uint256 public collectedRewardForTransferRelayer = 0; + uint256 public collectedRewardForHeaderRelayer = 0; // @dev deprecated + uint256 public collectedRewardForTransferRelayer = 0; // @dev deprecated - uint256 public roundSequence = 0; - uint256 public countInRound = 0; + uint256 public roundSequence = 0; // @dev deprecated + uint256 public countInRound = 0; // @dev deprecated mapping(address => uint256) public relayerRewardVault; - uint256 public dynamicExtraIncentiveAmount; + uint256 public dynamicExtraIncentiveAmount; // @dev deprecated event distributeCollectedReward( uint256 sequence, uint256 roundRewardForHeaderRelayer, uint256 roundRewardForTransferRelayer - ); - event paramChange(string key, bytes value); + ); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated event rewardToRelayer(address relayer, uint256 amount); function init() external onlyNotInit { @@ -55,9 +55,7 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { alreadyInit = true; } - receive() external payable { - revert("deprecated"); - } + receive() external payable { } function addReward( address payable headerRelayerAddr, diff --git a/contracts/deprecated/TendermintLightClient.sol b/contracts/deprecated/TendermintLightClient.sol index c014f7f5..59168d70 100644 --- a/contracts/deprecated/TendermintLightClient.sol +++ b/contracts/deprecated/TendermintLightClient.sol @@ -1,9 +1,7 @@ pragma solidity 0.6.4; import "../lib/0.6.x/Memory.sol"; -import "../lib/0.6.x/BytesToTypes.sol"; import "../interface/0.6.x/ILightClient.sol"; -import "../interface/0.6.x/ISystemReward.sol"; import "../interface/0.6.x/IParamSubscriber.sol"; import "../System.sol"; @@ -26,9 +24,9 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { uint256 public constant INIT_REWARD_FOR_VALIDATOR_SER_CHANGE = 1e16; uint256 public rewardForValidatorSetChange; - event initConsensusState(uint64 initHeight, bytes32 appHash); - event syncConsensusState(uint64 height, uint64 preValidatorSetChangeHeight, bytes32 appHash, bool validatorChanged); - event paramChange(string key, bytes value); + event initConsensusState(uint64 initHeight, bytes32 appHash); // @dev deprecated + event syncConsensusState(uint64 height, uint64 preValidatorSetChangeHeight, bytes32 appHash, bool validatorChanged); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated function init() external onlyNotInit { uint256 pointer; @@ -40,18 +38,8 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { sstore(chainID_slot, mload(pointer)) } - ConsensusState memory cs; - uint64 height; - (cs, height) = decodeConsensusState(pointer, length, false); - cs.preValidatorSetChangeHeight = 0; - lightClientConsensusStates[height] = cs; - - initialHeight = height; - latestHeight = height; alreadyInit = true; rewardForValidatorSetChange = INIT_REWARD_FOR_VALIDATOR_SER_CHANGE; - - emit initConsensusState(initialHeight, cs.appHash); } function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer returns (bool) { @@ -93,51 +81,6 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { return string(chainIDStr); } - // | chainID | height | appHash | curValidatorSetHash | [{validator pubkey, voting power}] | - // | 32 bytes | 8 bytes | 32 bytes | 32 bytes | [{32 bytes, 8 bytes}] | - /* solium-disable-next-line */ - function decodeConsensusState( - uint256 ptr, - uint256 size, - bool leaveOutValidatorSet - ) internal pure returns (ConsensusState memory, uint64) { - ptr = ptr + 8; - uint64 height; - /* solium-disable-next-line */ - assembly { - height := mload(ptr) - } - - ptr = ptr + 32; - bytes32 appHash; - /* solium-disable-next-line */ - assembly { - appHash := mload(ptr) - } - - ptr = ptr + 32; - bytes32 curValidatorSetHash; - /* solium-disable-next-line */ - assembly { - curValidatorSetHash := mload(ptr) - } - - ConsensusState memory cs; - cs.appHash = appHash; - cs.curValidatorSetHash = curValidatorSetHash; - - if (!leaveOutValidatorSet) { - uint256 dest; - uint256 length; - cs.nextValidatorSet = new bytes(size - 104); - (dest, length) = Memory.fromBytes(cs.nextValidatorSet); - - Memory.copy(ptr + 32, dest, length); - } - - return (cs, height); - } - function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { revert("deprecated"); } From c98ae1d1bdec7a5884be6aa1a8f14b92c9ffc53b Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 09:39:42 +0800 Subject: [PATCH 08/52] feat: remove unused code --- contracts/deprecated/Staking.sol | 39 +++++----- .../deprecated/TendermintLightClient.sol | 4 +- contracts/deprecated/TokenManager.sol | 74 ++++--------------- 3 files changed, 32 insertions(+), 85 deletions(-) diff --git a/contracts/deprecated/Staking.sol b/contracts/deprecated/Staking.sol index 36d82485..83e50331 100644 --- a/contracts/deprecated/Staking.sol +++ b/contracts/deprecated/Staking.sol @@ -2,13 +2,8 @@ pragma solidity 0.6.4; import "../System.sol"; import "../interface/0.6.x/IApplication.sol"; -import "../interface/0.6.x/ICrossChain.sol"; import "../interface/0.6.x/IParamSubscriber.sol"; import "../interface/0.6.x/IStaking.sol"; -import "../interface/0.6.x/ITokenHub.sol"; -import "../lib/0.6.x/BytesToTypes.sol"; -import "../lib/0.6.x/BytesLib.sol"; -import "../lib/0.6.x/CmnPkg.sol"; import "../lib/0.6.x/Memory.sol"; import "../lib/0.6.x/RLPEncode.sol"; import "../lib/0.6.x/RLPDecode.sol"; @@ -52,13 +47,13 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { mapping(address => uint256) undelegated; // delegator => totalUndelegated mapping(address => mapping(address => mapping(address => uint256))) pendingRedelegateTime; // delegator => srcValidator => dstValidator => minTime - mapping(uint256 => bytes32) packageQueue; // index => package's hash + mapping(uint256 => bytes32) packageQueue; // index => package's hash // @dev deprecated mapping(address => uint256) delegateInFly; // delegator => delegate request in fly mapping(address => uint256) undelegateInFly; // delegator => undelegate request in fly mapping(address => uint256) redelegateInFly; // delegator => redelegate request in fly - uint256 internal leftIndex; - uint256 internal rightIndex; + uint256 internal leftIndex; // @dev deprecated + uint256 internal rightIndex; // @dev deprecated uint8 internal locked; uint256 public transferGas; // this param is newly added after the hardfork on testnet. It need to be initialed by governed @@ -87,30 +82,30 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { } /*----------------- Events -----------------*/ - event delegateSubmitted(address indexed delegator, address indexed validator, uint256 amount, uint256 relayerFee); - event undelegateSubmitted(address indexed delegator, address indexed validator, uint256 amount, uint256 relayerFee); + event delegateSubmitted(address indexed delegator, address indexed validator, uint256 amount, uint256 relayerFee); // @dev deprecated + event undelegateSubmitted(address indexed delegator, address indexed validator, uint256 amount, uint256 relayerFee); // @dev deprecated event redelegateSubmitted( address indexed delegator, address indexed validatorSrc, address indexed validatorDst, uint256 amount, uint256 relayerFee - ); - event rewardReceived(address indexed delegator, uint256 amount); + ); // @dev deprecated + event rewardReceived(address indexed delegator, uint256 amount); // @dev deprecated event rewardClaimed(address indexed delegator, uint256 amount); - event undelegatedReceived(address indexed delegator, address indexed validator, uint256 amount); + event undelegatedReceived(address indexed delegator, address indexed validator, uint256 amount); // @dev deprecated event undelegatedClaimed(address indexed delegator, uint256 amount); - event delegateSuccess(address indexed delegator, address indexed validator, uint256 amount); - event undelegateSuccess(address indexed delegator, address indexed validator, uint256 amount); - event redelegateSuccess(address indexed delegator, address indexed valSrc, address indexed valDst, uint256 amount); - event delegateFailed(address indexed delegator, address indexed validator, uint256 amount, uint8 errCode); - event undelegateFailed(address indexed delegator, address indexed validator, uint256 amount, uint8 errCode); + event delegateSuccess(address indexed delegator, address indexed validator, uint256 amount); // @dev deprecated + event undelegateSuccess(address indexed delegator, address indexed validator, uint256 amount); // @dev deprecated + event redelegateSuccess(address indexed delegator, address indexed valSrc, address indexed valDst, uint256 amount); // @dev deprecated + event delegateFailed(address indexed delegator, address indexed validator, uint256 amount, uint8 errCode); // @dev deprecated + event undelegateFailed(address indexed delegator, address indexed validator, uint256 amount, uint8 errCode); // @dev deprecated event redelegateFailed( address indexed delegator, address indexed valSrc, address indexed valDst, uint256 amount, uint8 errCode - ); - event paramChange(string key, bytes value); - event failedSynPackage(uint8 indexed eventType, uint256 errCode); - event crashResponse(uint8 indexed eventType); + ); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated + event failedSynPackage(uint8 indexed eventType, uint256 errCode); // @dev deprecated + event crashResponse(uint8 indexed eventType); // @dev deprecated receive() external payable { } diff --git a/contracts/deprecated/TendermintLightClient.sol b/contracts/deprecated/TendermintLightClient.sol index 59168d70..db5ffbd2 100644 --- a/contracts/deprecated/TendermintLightClient.sol +++ b/contracts/deprecated/TendermintLightClient.sol @@ -16,8 +16,8 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber { mapping(uint64 => ConsensusState) public lightClientConsensusStates; mapping(uint64 => address payable) public submitters; uint64 public initialHeight; - uint64 public latestHeight; - bytes32 public chainID; + uint64 public latestHeight; // @dev deprecated + bytes32 public chainID; // @dev deprecated bytes public constant INIT_CONSENSUS_STATE_BYTES = hex"42696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000"; diff --git a/contracts/deprecated/TokenManager.sol b/contracts/deprecated/TokenManager.sol index 3111b54b..57476e89 100644 --- a/contracts/deprecated/TokenManager.sol +++ b/contracts/deprecated/TokenManager.sol @@ -1,9 +1,7 @@ pragma solidity 0.6.4; import "../interface/0.6.x/IBEP20.sol"; -import "../interface/0.6.x/ITokenHub.sol"; import "../interface/0.6.x/IApplication.sol"; -import "../interface/0.6.x/ICrossChain.sol"; import "../interface/0.6.x/IParamSubscriber.sol"; import "../lib/0.6.x/SafeMath.sol"; import "../lib/0.6.x/RLPEncode.sol"; @@ -30,52 +28,6 @@ contract TokenManager is System, IApplication, IParamSubscriber { uint64 expireTime; } - // BSC to BC - struct ReactBindSynPackage { - uint32 status; - bytes32 bep2TokenSymbol; - } - - // BSC to BC - struct MirrorSynPackage { - address mirrorSender; - address bep20Addr; - bytes32 bep20Name; - bytes32 bep20Symbol; - uint256 bep20Supply; - uint8 bep20Decimals; - uint256 mirrorFee; - uint64 expireTime; - } - - // BC to BSC - struct MirrorAckPackage { - address mirrorSender; - address bep20Addr; - uint8 bep20Decimals; - bytes32 bep2Symbol; - uint256 mirrorFee; - uint8 errorCode; - } - - // BSC to BC - struct SyncSynPackage { - address syncSender; - address bep20Addr; - bytes32 bep2Symbol; - uint256 bep20Supply; - uint256 syncFee; - uint64 expireTime; - } - - // BC to BSC - struct SyncAckPackage { - address syncSender; - address bep20Addr; - uint256 syncFee; - uint8 errorCode; - } - uint8 public constant BIND_PACKAGE = 0; uint8 public constant UNBIND_PACKAGE = 1; @@ -109,19 +61,19 @@ contract TokenManager is System, IApplication, IParamSubscriber { mapping(bytes32 => BindSynPackage) public bindPackageRecord; - mapping(address => bool) public mirrorPendingRecord; - mapping(address => bool) public boundByMirror; - uint256 public mirrorFee; - uint256 public syncFee; - - event bindSuccess(address indexed contractAddr, string bep2Symbol, uint256 totalSupply, uint256 peggyAmount); - event bindFailure(address indexed contractAddr, string bep2Symbol, uint32 failedReason); - event unexpectedPackage(uint8 channelId, bytes msgBytes); - event paramChange(string key, bytes value); - event mirrorSuccess(address indexed bep20Addr, bytes32 bep2Symbol); - event mirrorFailure(address indexed bep20Addr, uint8 errCode); - event syncSuccess(address indexed bep20Addr); - event syncFailure(address indexed bep20Addr, uint8 errCode); + mapping(address => bool) public mirrorPendingRecord; // @dev deprecated + mapping(address => bool) public boundByMirror; // @dev deprecated + uint256 public mirrorFee; // @dev deprecated + uint256 public syncFee; // @dev deprecated + + event bindSuccess(address indexed contractAddr, string bep2Symbol, uint256 totalSupply, uint256 peggyAmount); // @dev deprecated + event bindFailure(address indexed contractAddr, string bep2Symbol, uint32 failedReason); // @dev deprecated + event unexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated + event mirrorSuccess(address indexed bep20Addr, bytes32 bep2Symbol); // @dev deprecated + event mirrorFailure(address indexed bep20Addr, uint8 errCode); // @dev deprecated + event syncSuccess(address indexed bep20Addr); // @dev deprecated + event syncFailure(address indexed bep20Addr, uint8 errCode); // @dev deprecated function handleSynPackage( uint8 channelId, From 73d3e7e1081ff72650947adbac2f18362f5f7edc Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 09:49:25 +0800 Subject: [PATCH 09/52] feat: remove unused code --- contracts/BSCValidatorSet.sol | 10 +--------- contracts/GovHub.sol | 2 +- contracts/SlashIndicator.sol | 10 ++++------ contracts/StakeHub.sol | 2 +- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index dcdf4728..770a4600 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -5,21 +5,13 @@ import "./System.sol"; import "./lib/0.6.x/BytesLib.sol"; import "./lib/0.6.x/BytesToTypes.sol"; import "./lib/0.6.x/Memory.sol"; -import "./interface/0.6.x/ILightClient.sol"; import "./interface/0.6.x/ISlashIndicator.sol"; -import "./interface/0.6.x/ITokenHub.sol"; -import "./interface/0.6.x/IRelayerHub.sol"; import "./interface/0.6.x/IParamSubscriber.sol"; import "./interface/0.6.x/IBSCValidatorSet.sol"; import "./interface/0.6.x/IApplication.sol"; import "./interface/0.6.x/IStakeHub.sol"; import "./lib/0.6.x/SafeMath.sol"; import "./lib/0.6.x/RLPDecode.sol"; -import "./lib/0.6.x/CmnPkg.sol"; - -interface ICrossChain { - function registeredContractChannelMap(address, uint8) external view returns (bool); -} contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplication { using SafeMath for uint256; @@ -85,7 +77,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica uint256 public systemRewardBaseRatio; uint256 public previousHeight; - uint256 public previousBalanceOfSystemReward; // deprecated + uint256 public previousBalanceOfSystemReward; // @dev deprecated bytes[] public previousVoteAddrFullSet; bytes[] public currentVoteAddrFullSet; bool public isSystemRewardIncluded; diff --git a/contracts/GovHub.sol b/contracts/GovHub.sol index 0ebc5dd5..b125d1dd 100644 --- a/contracts/GovHub.sol +++ b/contracts/GovHub.sol @@ -19,7 +19,7 @@ contract GovHub is System, IApplication { event failReasonWithStr(string message); event failReasonWithBytes(bytes message); - event paramChange(string key, bytes value); + event paramChange(string key, bytes value); // @dev deprecated struct ParamChangePackage { string key; diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index 364b6fbc..99eaa7b9 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -10,10 +10,8 @@ import "./interface/0.6.x/ISlashIndicator.sol"; import "./interface/0.6.x/IApplication.sol"; import "./interface/0.6.x/IBSCValidatorSet.sol"; import "./interface/0.6.x/IParamSubscriber.sol"; -import "./interface/0.6.x/ICrossChain.sol"; import "./interface/0.6.x/ISystemReward.sol"; import "./interface/0.6.x/IStakeHub.sol"; -import "./lib/0.6.x/CmnPkg.sol"; import "./lib/0.6.x/RLPEncode.sol"; contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplication { @@ -46,13 +44,13 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati uint256 public felonySlashScope; event validatorSlashed(address indexed validator); - event maliciousVoteSlashed(bytes32 indexed voteAddrSlice); + event maliciousVoteSlashed(bytes32 indexed voteAddrSlice); // @dev deprecated event indicatorCleaned(); event paramChange(string key, bytes value); - event knownResponse(uint32 code); - event unKnownResponse(uint32 code); - event crashResponse(); + event knownResponse(uint32 code); // @dev deprecated + event unKnownResponse(uint32 code); // @dev deprecated + event crashResponse(); // @dev deprecated event failedFelony(address indexed validator, uint256 slashCount, bytes failReason); diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 79c2c350..dba0ca80 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -129,7 +129,7 @@ contract StakeHub is SystemV2, Initializable, Protectable { mapping(bytes => bool) private _legacyVoteAddress; // @dev deprecated // total number of current jailed validators - uint256 public numOfJailed; + uint256 public numOfJailed; // @dev deprecated // max number of jailed validators between breathe block(only for malicious vote and double sign) uint256 public maxFelonyBetweenBreatheBlock; // index(timestamp / breatheBlockInterval) => number of malicious vote and double sign slash From c96aec0018b71e469bb062cf97ad675442aad0bd Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 09:55:06 +0800 Subject: [PATCH 10/52] feat: add comments --- contracts/TokenHub.sol | 60 ++++++++---------------------------------- 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index 864b052e..cd01dbd8 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -4,12 +4,10 @@ import "./interface/0.6.x/IBEP20.sol"; import "./interface/0.6.x/ITokenHub.sol"; import "./interface/0.6.x/IParamSubscriber.sol"; import "./interface/0.6.x/IApplication.sol"; -import "./interface/0.6.x/ICrossChain.sol"; import "./interface/0.6.x/ISystemReward.sol"; import "./lib/0.6.x/SafeMath.sol"; import "./lib/0.6.x/RLPEncode.sol"; import "./lib/0.6.x/RLPDecode.sol"; -import "./lib/0.6.x/BytesToTypes.sol"; import "./lib/0.6.x/Memory.sol"; import "./System.sol"; @@ -22,42 +20,6 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR using RLPDecode for RLPDecode.RLPItem; using RLPDecode for RLPDecode.Iterator; - // BSC to BC - struct TransferOutSynPackage { - bytes32 bep2TokenSymbol; - address contractAddr; - uint256[] amounts; - address[] recipients; - address[] refundAddrs; - uint64 expireTime; - } - - // BC to BSC - struct TransferOutAckPackage { - address contractAddr; - uint256[] refundAmounts; - address[] refundAddrs; - uint32 status; - } - - // BC to BSC - struct TransferInSynPackage { - bytes32 bep2TokenSymbol; - address contractAddr; - uint256 amount; - address recipient; - address refundAddr; - uint64 expireTime; - } - - // BSC to BC - struct TransferInRefundPackage { - bytes32 bep2TokenSymbol; - uint256 refundAmount; - address refundAddr; - uint32 status; - } - // BEP-171: Security Enhancement for Cross-Chain Module struct LockInfo { uint256 amount; @@ -95,29 +57,29 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR uint256 public constant INIT_BNB_LARGE_TRANSFER_LIMIT = 10000 ether; uint256 public constant INIT_LOCK_PERIOD = 12 hours; // the lock period for large cross-chain transfer - uint256 public lockPeriod; + uint256 public lockPeriod; // @dev deprecated // the lock Period for token recover uint256 public constant LOCK_PERIOD_FOR_TOKEN_RECOVER = 7 days; // token address => largeTransferLimit amount, address(0) means BNB - mapping(address => uint256) public largeTransferLimitMap; + mapping(address => uint256) public largeTransferLimitMap; // @dev deprecated // token address => recipient address => lockedAmount + unlockAt, address(0) means BNB mapping(address => mapping(address => LockInfo)) public lockInfoMap; uint8 internal reentryLock; - event transferInSuccess(address bep20Addr, address refundAddr, uint256 amount); - event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee); - event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status); - event refundFailure(address bep20Addr, address refundAddr, uint256 amount, uint32 status); + event transferInSuccess(address bep20Addr, address refundAddr, uint256 amount); // @dev deprecated + event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee); // @dev deprecated + event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status); // @dev deprecated + event refundFailure(address bep20Addr, address refundAddr, uint256 amount, uint32 status); // @dev deprecated event rewardTo(address to, uint256 amount); event receiveDeposit(address from, uint256 amount); - event unexpectedPackage(uint8 channelId, bytes msgBytes); - event paramChange(string key, bytes value); + event unexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated // BEP-171: Security Enhancement for Cross-Chain Module - event LargeTransferLocked(address indexed tokenAddr, address indexed recipient, uint256 amount, uint256 unlockAt); + event LargeTransferLocked(address indexed tokenAddr, address indexed recipient, uint256 amount, uint256 unlockAt); // @dev deprecated event WithdrawUnlockedToken(address indexed tokenAddr, address indexed recipient, uint256 amount); - event CancelTransfer(address indexed tokenAddr, address indexed attacker, uint256 amount); - event LargeTransferLimitSet(address indexed tokenAddr, address indexed owner, uint256 largeTransferLimit); + event CancelTransfer(address indexed tokenAddr, address indexed attacker, uint256 amount); // @dev deprecated + event LargeTransferLimitSet(address indexed tokenAddr, address indexed owner, uint256 largeTransferLimit); // @dev deprecated // BEP-299: Token Migration after BC Fusion event TokenRecoverLocked( From 13ea43fb28470f86677e9c2afb42570bba477722 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 10:00:28 +0800 Subject: [PATCH 11/52] feat: update genesis.json --- genesis.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/genesis.json b/genesis.json index cb2d78ba..89acbb6f 100644 --- a/genesis.json +++ b/genesis.json @@ -46,7 +46,7 @@ }, "0x0000000000000000000000000000000000001000": { "balance": "0x0", - "code": "0x60806040526004361061051c5760003560e01c80638a7beb01116102a2578063c81b166211610165578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d8d578063f9a2bbc714610da2578063fc3e590814610db7578063fccc281314610dcc578063fd4ad81f14610de1578063fd6a687914610e1057610523565b8063e40716a114610cfb578063ea321e4914610d10578063eb57e20214610d30578063eda5868c14610d50578063f1fad10414610d65578063f340fa0114610d7a57610523565b8063d86222d51161011e578063d86222d514610c7d578063daacdb6614610c92578063dc927faf14610ca7578063df8079e914610cbc578063e086c7b114610cd1578063e1c7392a14610ce657610523565b8063c81b166214610c09578063c8509d81146109ae578063cb75a59214610c1e578063ce910b0c14610c33578063d58918ae14610c53578063d68fb56a14610c6857610523565b8063aa82dce111610209578063aef198a9116101c2578063aef198a914610b93578063b7ab4db514610ba8578063b8cf4ef114610bca578063bf9f499514610734578063c466689d14610bdf578063c6d3394514610bf457610523565b8063aa82dce114610aff578063aad5606314610b14578063aaf5eb6814610b29578063ab51bb9614610b3e578063ac43175114610b53578063ad3c9da614610b7357610523565b80639dc092621161025b5780639dc0926214610a815780639fe0f81614610a96578063a0dc275814610aab578063a1a11bf514610ac0578063a5422d5c14610ad5578063a78abc1614610aea57610523565b80638a7beb01146109f85780638b5ad0c914610a0d5780638c5d749d14610a225780638d19a41014610a375780639369d7de14610a5757806396713da914610a6c57610523565b80635192c82c116103ea578063718a8aa81161035157806381650b621161030a57806381650b6214610984578063820dcaa814610999578063831d65d1146109ae578063853230aa1461093057806386249882146109ce57806388b32f11146109e357610523565b8063718a8aa81461090657806375d47a0a1461091b57806378dfed4a146109305780637942fd05146109455780637a84ca2a1461095a5780637e434d541461096f57610523565b80635d77156c116103a35780635d77156c1461086057806360eba4fe1461087557806362b72cf5146108955780636969a25c146108aa5780636e47b482146108dc57806370fd5bad146108f157610523565b80635192c82c146107cc57806351b4dce3146107e157806351e80672146107f657806355614fcc1461080b578063565c56b31461082b5780635667515a1461084b57610523565b80632a0ffb6e1161048e5780633dffc387116104475780633dffc3871461073457806343756e5c1461075657806345cf9daf1461076b578063493279b1146107805780634bf6c882146107a25780634df6e0c3146107b757610523565b80632a0ffb6e14610671578063300c356714610691578063321d398a146106b15780633365af3a146106d157806335409f7f146106f15780633b071dcc1461071157610523565b8063152ad3b8116104e0578063152ad3b8146105db5780631bd14ed8146105fd5780631e4c1524146106125780631ff1806914610632578063219f22d514610647578063280870281461065c57610523565b806304c4fec61461052857806307a568471461053f5780630bee7a671461056a5780630e2374a51461058c5780631182b875146105ae57610523565b3661052357005b600080fd5b34801561053457600080fd5b5061053d610e25565b005b34801561054b57600080fd5b50610554610e99565b6040516105619190617156565b60405180910390f35b34801561057657600080fd5b5061057f610e9f565b6040516105619190617189565b34801561059857600080fd5b506105a1610ea4565b604051610561919061647f565b3480156105ba57600080fd5b506105ce6105c9366004616365565b610eaa565b604051610561919061659f565b3480156105e757600080fd5b506105f0610fc6565b6040516105619190616594565b34801561060957600080fd5b50610554610fcf565b34801561061e57600080fd5b5061053d61062d366004616193565b610fd5565b34801561063e57600080fd5b5061055461130e565b34801561065357600080fd5b5061057f611314565b34801561066857600080fd5b506105a1611319565b34801561067d57600080fd5b5061053d61068c3660046160f3565b61131f565b34801561069d57600080fd5b5061053d6106ac36600461612b565b611340565b3480156106bd57600080fd5b506105f06106cc366004616312565b611689565b3480156106dd57600080fd5b506105f06106ec366004616312565b611758565b3480156106fd57600080fd5b5061053d61070c3660046160f3565b611809565b34801561071d57600080fd5b5061072661196e565b604051610561929190616524565b34801561074057600080fd5b50610749611c4a565b604051610561919061719a565b34801561076257600080fd5b506105a1611c4f565b34801561077757600080fd5b50610554611c55565b34801561078c57600080fd5b50610795611c5b565b6040516105619190617147565b3480156107ae57600080fd5b50610749611c60565b3480156107c357600080fd5b50610726611c65565b3480156107d857600080fd5b50610554611df1565b3480156107ed57600080fd5b506105a1611df7565b34801561080257600080fd5b506105a1611dfd565b34801561081757600080fd5b506105f06108263660046160f3565b611e03565b34801561083757600080fd5b506105546108463660046160f3565b611e3f565b34801561085757600080fd5b50610749611e90565b34801561086c57600080fd5b5061057f611e95565b34801561088157600080fd5b506105ce610890366004616312565b611e9a565b3480156108a157600080fd5b50610554611f40565b3480156108b657600080fd5b506108ca6108c5366004616312565b611f46565b604051610561969594939291906164ac565b3480156108e857600080fd5b506105a1611faa565b3480156108fd57600080fd5b50610749611fb0565b34801561091257600080fd5b50610749611fb5565b34801561092757600080fd5b506105a1611fba565b34801561093c57600080fd5b50610554611fc0565b34801561095157600080fd5b50610749611fc6565b34801561096657600080fd5b50610554611fcb565b34801561097b57600080fd5b506105a1611fd1565b34801561099057600080fd5b5061057f611fd7565b3480156109a557600080fd5b50610554611fdc565b3480156109ba57600080fd5b5061053d6109c9366004616365565b611fe2565b3480156109da57600080fd5b50610554612003565b3480156109ef57600080fd5b50610554612009565b348015610a0457600080fd5b506105f061200f565b348015610a1957600080fd5b50610554612018565b348015610a2e57600080fd5b5061055461201e565b348015610a4357600080fd5b50610554610a523660046160f3565b61203b565b348015610a6357600080fd5b5061053d61207b565b348015610a7857600080fd5b5061074961218f565b348015610a8d57600080fd5b506105a1612194565b348015610aa257600080fd5b5061055461219a565b348015610ab757600080fd5b5061055461219f565b348015610acc57600080fd5b506105a16121a4565b348015610ae157600080fd5b506105ce6121aa565b348015610af657600080fd5b506105f06121c9565b348015610b0b57600080fd5b506105a16121d2565b348015610b2057600080fd5b506105a16121d8565b348015610b3557600080fd5b506105546121de565b348015610b4a57600080fd5b5061057f611e90565b348015610b5f57600080fd5b5061053d610b6e3660046162b6565b6121e7565b348015610b7f57600080fd5b50610554610b8e3660046160f3565b612ce0565b348015610b9f57600080fd5b50610554612cf2565b348015610bb457600080fd5b50610bbd612cff565b6040516105619190616511565b348015610bd657600080fd5b50610554612dea565b348015610beb57600080fd5b50610554612def565b348015610c0057600080fd5b50610554611fb0565b348015610c1557600080fd5b506105a1612df5565b348015610c2a57600080fd5b50610554612dfb565b348015610c3f57600080fd5b506105ce610c4e366004616312565b612e01565b348015610c5f57600080fd5b50610554612e0e565b348015610c7457600080fd5b50610554612e14565b348015610c8957600080fd5b50610554612e53565b348015610c9e57600080fd5b50610554612e5f565b348015610cb357600080fd5b506105a1612e65565b348015610cc857600080fd5b506105a1612e6b565b348015610cdd57600080fd5b50610554610e9f565b348015610cf257600080fd5b5061053d612e71565b348015610d0757600080fd5b50610554613020565b348015610d1c57600080fd5b506105f0610d2b366004616277565b613026565b348015610d3c57600080fd5b5061053d610d4b3660046160f3565b6131ac565b348015610d5c57600080fd5b5061057f6132b4565b348015610d7157600080fd5b506107496132b9565b61053d610d883660046160f3565b6132be565b348015610d9957600080fd5b50610554613674565b348015610dae57600080fd5b506105a161367a565b348015610dc357600080fd5b5061074961219a565b348015610dd857600080fd5b506105a1613680565b348015610ded57600080fd5b50610e01610dfc366004616312565b613686565b6040516105619392919061715f565b348015610e1c57600080fd5b506105a1613748565b6000610e303361203b565b9050600b8181548110610e3f57fe5b600091825260209091206001601690920201015460ff16610e7b5760405162461bcd60e51b8152600401610e7290616db8565b60405180910390fd5b6000610e85612e14565b9050610e94338383600161374e565b505050565b60095481565b606481565b61200181565b60005460609060ff16610ecf5760405162461bcd60e51b8152600401610e7290616727565b3361200014610ef05760405162461bcd60e51b8152600401610e7290616f5f565b600b54610fae57610eff615c9f565b60015460005b81811015610faa57600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff1916911515919091179055604086015180518794610f869360008051602061724f833981519152909101920190615cce565b506060820151610f9c9060038301906013615d48565b505050806001019050610f05565b5050505b60405162461bcd60e51b8152600401610e72906169d6565b60075460ff1681565b600f5481565b334114610ff45760405162461bcd60e51b8152600401610e7290616fae565b3a156110125760405162461bcd60e51b8152600401610e7290616cf7565b825160408051828152602080840282010190915260609082801561105057816020015b61103d615d75565b8152602001906001900390816110355790505b50905060005b828110156110fa576040518060c0016040528087838151811061107557fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020018683815181106110b757fe5b60200260200101516001600160401b0316815260200160001515815260200160008152508282815181106110e757fe5b6020908102919091010152600101611056565b506060806111088386613940565b9150915060005b6001548110156111fe5760006001828154811061112857fe5b9060005260206000209060040201600301549050806000146111f55760006001838154811061115357fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061118757fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526111c2926001600160a01b03909216910161647f565b6000604051808303818588803b1580156111db57600080fd5b505af11580156111ef573d6000803e3d6000fd5b50505050505b5060010161110f565b50471561126c577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516112349190617156565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561126a573d6000803e3d6000fd5b505b60006003819055600555815115611287576112878282613e2a565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112c457600080fd5b505af11580156112d8573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b3361200214610fae5760405162461bcd60e51b8152600401610e7290617110565b33411461135f5760405162461bcd60e51b8152600401610e7290616fae565b60105443116113805760405162461bcd60e51b8152600401610e7290616900565b3a1561139e5760405162461bcd60e51b8152600401610e7290616cf7565b60005460ff166113c05760405162461bcd60e51b8152600401610e7290616727565b60006110023168056bc75e2d631000008111156113f7576113f08168056bc75e2d6310000063ffffffff61461916565b91506113fe565b505061167f565b6040516309a99b4f60e41b815261100290639a99b4f0906114259030908690600401616493565b602060405180830381600087803b15801561143f57600080fd5b505af1158015611453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611477919061632a565b91508161148557505061167f565b6000805b848110156114b35785858281811061149d57fe5b9050602002013582019150806001019050611489565b50806114c15750505061167f565b6000806000805b8981101561167757848989838181106114dd57fe5b905060200201358802816114ed57fe5b0493508a8a828181106114fc57fe5b905060200201602081019061151191906160f3565b6001600160a01b0381166000908152600460205260409020549093509150811561162d57600060018084038154811061154657fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156115b357836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516115a69190617156565b60405180910390a2611627565b6003546115c6908663ffffffff61465b16565b60039081558101546115de908663ffffffff61465b16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b29061161e908890617156565b60405180910390a25b5061166f565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516116669190617156565b60405180910390a25b6001016114c8565b505050505050505b5050436010555050565b600154600090821061169d57506000611753565b60006001600160a01b0316600183815481106116b557fe5b60009182526020909120600490910201546001600160a01b031614806116e5575060085415806116e55750600a54155b806116f4575060085460095410155b80611705575061170382611758565b155b8061172e57506000600b838154811061171a57fe5b906000526020600020906016020160000154115b806117425750600161173e612cff565b5111155b1561174f57506000611753565b5060015b919050565b600154600090821061176c57506000611753565b600b5482106117a9576001828154811061178257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611753565b600182815481106117b657fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156118035750600b82815481106117ea57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b546118c757611818615c9f565b60015460005b818110156118c357600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff191691151591909117905560408601518051879461189f9360008051602061724f833981519152909101920190615cce565b5060608201516118b59060038301906013615d48565b50505080600101905061181e565b5050505b3361100114806118d8575033612002145b6118f45760405162461bcd60e51b8152600401610e729061675e565b6001600160a01b03811660009081526004602052604090205480611918575061196b565b6001810390506000600b828154811061192d57fe5b600091825260209091206001601690920201015460ff1690506119508383614680565b80156119595750805b15610e94576009805460001901905550505b50565b60015460609081906000805b828110156119c1576001818154811061198f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166119b9576001909101905b60010161197a565b506060816040519080825280602002602001820160405280156119ee578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611a2757816020015b6060815260200190600190039081611a125790505b50600b5460009450909150841415611ba25760005b84811015611b9c5760018181548110611a5157fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611b945760018181548110611a8157fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611aac57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b8181548110611ad957fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015611b715780601f10611b4657610100808354040283529160200191611b71565b820191906000526020600020905b815481529060010190602001808311611b5457829003601f168201915b5050505050828581518110611b8257fe5b60209081029190910101526001909301925b600101611a3c565b50611c3e565b60005b84811015611c3c5760018181548110611bba57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611c345760018181548110611bea57fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611c1557fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611ba5565b505b909450925050505b9091565b600181565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c5411611c81576015611c85565b600c545b90506060611c91612cff565b90506060611c9e82614a43565b905082825111611cb5579094509250611c46915050565b83838351031015611cc7578282510393505b8315611cfd5760c84304611ce383838388880360008a8a614bb1565b611cfb8383838888038989038a8b8b8b510301614bb1565b505b606083604051908082528060200260200182016040528015611d29578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611d6257816020015b6060815260200190600190039081611d4d5790505b50905060005b85811015611de357848181518110611d7c57fe5b6020026020010151838281518110611d9057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611dbc57fe5b6020026020010151828281518110611dd057fe5b6020908102919091010152600101611d68565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611e2b576000915050611753565b60001901611e3881611758565b9392505050565b6001600160a01b03811660009081526004602052604081205480611e67576000915050611753565b600180820381548110611e7657fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611ea757fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611f385780601f10611f0d57610100808354040283529160200191611f38565b820191906000526020600020905b815481529060010190602001808311611f1b57829003601f168201915b505050505081565b60105481565b60018181548110611f5357fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b3361200014610fae5760405162461bcd60e51b8152600401610e7290616f5f565b60025481565b60115481565b60145460ff1681565b600a5481565b60006017546000141561203357506001612038565b506017545b90565b6001600160a01b038116600090815260046020526040812054806120715760405162461bcd60e51b8152600401610e7290616ee7565b6000190192915050565b600b546121395761208a615c9f565b60015460005b8181101561213557600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff19169115159190911790556040860151805187946121119360008051602061724f833981519152909101920190615cce565b5060608201516121279060038301906013615d48565b505050806001019050612090565b5050505b6008546121465760036008555b600a54612153576002600a555b600061215e3361203b565b905061216981611689565b6121855760405162461bcd60e51b8152600401610e7290616c73565b61196b3382614d08565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef815260200161726f6105ef913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166122095760405162461bcd60e51b8152600401610e7290616727565b336110071461222a5760405162461bcd60e51b8152600401610e7290616d25565b61229484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150614da09050565b1561233157602081146122b95760405162461bcd60e51b8152600401610e7290616ea1565b604080516020601f84018190048102820181019092528281526000916122f791858580838501838280828437600092019190915250614df992505050565b90506064811015801561230d5750620186a08111155b6123295760405162461bcd60e51b8152600401610e7290616ad4565b600255612c9d565b61239184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614da09050565b1561244657602081146123b65760405162461bcd60e51b8152600401610e72906165e4565b604080516020601f84018190048102820181019092528281526000916123f491858580838501838280828437600092019190915250614df992505050565b9050612710612420601854612414600f548561465b90919063ffffffff16565b9063ffffffff61465b16565b111561243e5760405162461bcd60e51b8152600401610e72906169fa565b600655612c9d565b6124b084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614da09050565b1561254a57602081146124d55760405162461bcd60e51b8152600401610e729061661b565b604080516020601f840181900481028201810190925282815260009161251391858580838501838280828437600092019190915250614df992505050565b600c5490915080612522575060155b8082106125415760405162461bcd60e51b8152600401610e7290616942565b50600855612c9d565b6125b384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614da09050565b1561264c57602081146125d85760405162461bcd60e51b8152600401610e72906166ad565b604080516020601f840181900481028201810190925282815260009161261691858580838501838280828437600092019190915250614df992505050565b90506000811180156126285750600a81105b6126445760405162461bcd60e51b8152600401610e7290617043565b600a55612c9d565b6126c084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614da09050565b1561274f57602081146126e55760405162461bcd60e51b8152600401610e7290616661565b604080516020601f840181900481028201810190925282815260009161272391858580838501838280828437600092019190915250614df992505050565b9050600d548111156127475760405162461bcd60e51b8152600401610e7290616b4a565b600e55612c9d565b6127b884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614da09050565b1561283a57602081146127dd5760405162461bcd60e51b8152600401610e7290616d73565b604080516020601f840181900481028201810190925282815260009161281b91858580838501838280828437600092019190915250614df992505050565b600d819055600e5490915081101561283457600d54600e555b50612c9d565b61289e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614da09050565b1561294c57602081146128c35760405162461bcd60e51b8152600401610e72906166f2565b604080516020601f840181900481028201810190925282815260009161290191858580838501838280828437600092019190915250614df992505050565b9050600081116129235760405162461bcd60e51b8152600401610e729061685b565b60648111156129445760405162461bcd60e51b8152600401610e72906168a3565b600c55612c9d565b6129b884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614da09050565b15612a6157602081146129dd5760405162461bcd60e51b8152600401610e7290616ffb565b604080516020601f8401819004810282018101909252828152600091612a1b91858580838501838280828437600092019190915250614df992505050565b9050612710612a3b6018546124146006548561465b90919063ffffffff16565b1115612a595760405162461bcd60e51b8152600401610e72906167cc565b600f55612c9d565b612ad584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614da09050565b15612b7e5760208114612afa5760405162461bcd60e51b8152600401610e7290616a89565b604080516020601f8401819004810282018101909252828152600091612b3891858580838501838280828437600092019190915250614df992505050565b9050612710612b58600f546124146006548561465b90919063ffffffff16565b1115612b765760405162461bcd60e51b8152600401610e7290616be4565b601855612c9d565b612bdf84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614da09050565b15612c855760208114612c045760405162461bcd60e51b8152600401610e729061699f565b604080516020601f8401819004810282018101909252828152600091612c4291858580838501838280828437600092019190915250614df992505050565b905060038110158015612c56575060098111155b80612c615750806001145b612c7d5760405162461bcd60e51b8152600401610e7290616e1b565b601755612c9d565b60405162461bcd60e51b8152600401610e72906170a0565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051612cd294939291906165b2565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612d2e57612d1a81611758565b15612d26578160010191505b600101612d09565b50606081604051908082528060200260200182016040528015612d5b578160200160208202803683370190505b5090506000915060005b83811015612de257612d7681611758565b15612dda5760018181548110612d8857fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612db357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612d65565b509250505090565b601581565b61027181565b61100281565b60175481565b60138181548110611ea757fe5b60185481565b6000612e1e612cff565b519050600080600c5411612e33576015612e37565b600c545b905080821115612e45578091505b81612e4f57600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff1615612e945760405162461bcd60e51b8152600401610e7290616de4565b612e9c615daa565b6000612ec26040518061062001604052806105ef815260200161726f6105ef9139614dfe565b9150915080612ee35760405162461bcd60e51b8152600401610e7290616f1e565b60005b82602001515181101561300857600183602001518281518110612f0557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612fdb57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612ee6565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b8181101561312f5761311785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060138054909250859150811061307f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561310d5780601f106130e25761010080835404028352916020019161310d565b820191906000526020600020905b8154815290600101906020018083116130f057829003601f168201915b5050505050614fba565b1561312757600192505050611803565b60010161302e565b5060125460005b818110156131a05761318786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060128054909250859150811061307f57fe5b156131985760019350505050611803565b600101613136565b50600095945050505050565b33611001146131cd5760405162461bcd60e51b8152600401610e72906170c7565b600b5461328b576131dc615c9f565b60015460005b8181101561328757600b8054600181018255600091909152835160008051602061722f833981519152601690920291820190815560208086015160008051602061785e8339815191528401805460ff19169115159190911790556040860151805187946132639360008051602061724f833981519152909101920190615cce565b5060608201516132799060038301906013615d48565b5050508060010190506131e2565b5050505b60006132968261501e565b90506132a181611689565b156132b0576132b08282614d08565b5050565b606581565b601181565b3341146132dd5760405162461bcd60e51b8152600401610e7290616fae565b60005460ff166132ff5760405162461bcd60e51b8152600401610e7290616727565b6000341161331f5760405162461bcd60e51b8152600401610e7290616b1b565b3a1561333d5760405162461bcd60e51b8152600401610e7290616cf7565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661337d57610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561339457506000601854115b156133b95760016017540360175443816133aa57fe5b0660185402816133b657fe5b04015b6000831180156133c95750600081115b156134765760006133f26127106133e6348563ffffffff6151a116565b9063ffffffff6151db16565b90508015613474576040516110029082156108fc029083906000818181858888f19350505050158015613429573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516134599190617156565b60405180910390a1613471848263ffffffff61461916565b93505b505b60008311801561348857506000600654115b1561352e5760006134aa6127106133e6600654346151a190919063ffffffff16565b9050801561352c5760405161dead9082156108fc029083906000818181858888f193505050501580156134e1573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516135119190617156565b60405180910390a1613529848263ffffffff61461916565b93505b505b811561362c57600060018084038154811061354557fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156135b257846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4856040516135a59190617156565b60405180910390a2613626565b6003546135c5908563ffffffff61465b16565b60039081558101546135dd908563ffffffff61465b16565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc0559061361d908790617156565b60405180910390a25b5061366e565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516136659190617156565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061369357fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff9091169491929183018282801561373e5780601f106137135761010080835404028352916020019161373e565b820191906000526020600020905b81548152906001019060200180831161372157829003601f168201915b5050505050905083565b61100481565b6000600a546000148061375f575082155b8061376a5750600954155b1561377757506000613938565b600960008154600190039190508190555060006137c2600a546133e6866133e6600b8a815481106137a457fe5b6000918252602090912060169091020154439063ffffffff61461916565b90506000600b86815481106137d357fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b15801561383857600080fd5b505afa15801561384c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138709190616342565b91509150600093508083106138ee576138898888614680565b506040516328aa02b160e01b8152611001906328aa02b1906138b3908b9087908a906004016164ee565b600060405180830381600087803b1580156138cd57600080fd5b505af11580156138e1573d6000803e3d6000fd5b5050505060019350613900565b818310613900576138fe8861501e565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b606080600080808080613951612e14565b6001549091505b8015613b8357600181039250600b838154811061397157fe5b600091825260209091206001601690920201015460ff1661399157613b7a565b6001838154811061399e57fe5b600091825260208220600490910201546001600160a01b031695506139c89086908590859061374e565b9350836139d457613b7a565b60405163436aa28360e11b81526000908190612002906386d54506906139fe908a9060040161647f565b60206040518083038186803b158015613a1657600080fd5b505afa158015613a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4e919061610f565b90506001600160a01b03811615613ad7576040516302ceee9160e11b81526120029063059ddd2290613a8490849060040161647f565b60206040518083038186803b158015613a9c57600080fd5b505afa158015613ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad4919061610f565b91505b60005b8c51811015613b7657876001600160a01b03168d8281518110613af957fe5b6020026020010151600001516001600160a01b03161480613b425750826001600160a01b03168d8281518110613b2b57fe5b6020026020010151600001516001600160a01b0316145b15613b6e5760018d8281518110613b5557fe5b6020908102919091010151901515608090910152613b76565b600101613ada565b5050505b60001901613958565b5060005b8951811015613bf057898181518110613b9c57fe5b60200260200101516080015180613bdc575060006001600160a01b03168a8281518110613bc557fe5b6020026020010151600001516001600160a01b0316145b15613be8578560010195505b600101613b87565b5088518510613cd85760408051600180825281830190925290816020015b613c16615d75565b815260200190600190039081613c0e575050604080516001808252818301909252919850602082015b6060815260200190600190039081613c3f57905050955088600081518110613c6357fe5b602002602001015187600081518110613c7857fe5b602002602001018190525087600081518110613c9057fe5b602002602001015186600081518110613ca557fe5b6020026020010181905250600087600081518110613cbf57fe5b6020908102919091010151901515608090910152613e1d565b84895103604051908082528060200260200182016040528015613d1557816020015b613d02615d75565b815260200190600190039081613cfa5790505b50965084895103604051908082528060200260200182016040528015613d4f57816020015b6060815260200190600190039081613d3a5790505b5095506000915060005b8951811015613e1b57898181518110613d6e57fe5b602002602001015160800151158015613db1575060006001600160a01b03168a8281518110613d9957fe5b6020026020010151600001516001600160a01b031614155b15613e1357898181518110613dc257fe5b6020026020010151888481518110613dd657fe5b6020026020010181905250888181518110613ded57fe5b6020026020010151878481518110613e0157fe5b60200260200101819052508260010192505b600101613d59565b505b50505050505b9250929050565b600154825160005b82811015613f47576001613e44615d75565b60018381548110613e5157fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613f1b57878181518110613ee157fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613f135760009250613f1b565b600101613ecd565b508115613f3d5780516001600160a01b03166000908152600460205260408120555b5050600101613e32565b508082111561400657805b82811015614004576001805480613f6557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613fb857fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613fea6002830182615dce565b613ff8600383016000615e12565b50509055600101613f52565b505b60008183106140155781614017565b825b905060005b818110156143bb576140c986828151811061403357fe5b60200260200101516001838154811061404857fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a082015261521d565b61427d5780600101600460008884815181106140e157fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061411d57fe5b60200260200101516001828154811061413257fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106141ed57fe5b6020026020010151600b828154811061420257fe5b90600052602060002090601602016002019080519060200190614226929190615cce565b506000600b828154811061423657fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061426757fe5b60009182526020909120601690910201556143b3565b85818151811061428957fe5b602002602001015160600151600182815481106142a257fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b031602179055506143688582815181106142e657fe5b6020026020010151600b83815481106142fb57fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561310d5780601f106130e25761010080835404028352916020019161310d565b6143b35784818151811061437857fe5b6020026020010151600b828154811061438d57fe5b906000526020600020906016020160020190805190602001906143b1929190615cce565b505b60010161401c565b5082821115614593576143cc615c9f565b835b83811015614590578581815181106143e257fe5b60200260200101518260400181905250600187828151811061440057fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b805492830181559093528451601690910260008051602061722f83398151915281019182558583015160008051602061785e8339815191528201805491151560ff19909216919091179055928501518051869492936145369360008051602061724f83398151915201920190615cce565b50606082015161454c9060038301906013615d48565b505050806001016004600089848151811061456357fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016143ce565b50505b61459b615279565b6145a361545b565b6000600981905560015493505b83811015614611576000600b82815481106145c757fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106145f857fe5b60009182526020909120601690910201556001016145b0565b505050505050565b6000611e3883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615649565b600082820183811015611e385760405162461bcd60e51b8152600401610e7290616795565b6000806001838154811061469057fe5b906000526020600020906004020160030154905060006001808054905003905060016146ba612cff565b51116146ef576000600185815481106146cf57fe5b906000526020600020906004020160030181905550600092505050611803565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516147289190617156565b60405180910390a26001600160a01b038516600090815260046020526040812055835b60015460001901811015614915576001816001018154811061476957fe5b90600052602060002090600402016001828154811061478457fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061484557fe5b9060005260206000209060160201600b828154811061486057fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff19909216919091179055600280840180546148b7938386019390821615610100026000190190911604615e21565b506148ca60038281019084016013615e96565b509050508060010160046000600184815481106148e357fe5b600091825260208083206004909202909101546001600160a01b0316835282019290925260400190205560010161474b565b50600180548061492157fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061497457fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906149a66002830182615dce565b6149b4600383016000615e12565b5050905560008183816149c357fe5b0490508015614a375760015460005b81811015614a3457614a0b83600183815481106149eb57fe5b90600052602060002090600402016003015461465b90919063ffffffff16565b60018281548110614a1857fe5b60009182526020909120600360049092020101556001016149d2565b50505b50600195945050505050565b600154815160408051828152602080840282010190915260609291908390828015614a8257816020015b6060815260200190600190039081614a6d5790505b50600b549091508314614a99579250611753915050565b60005b82811015614ba857600b600160046000898581518110614ab857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020540381548110614aec57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015614b845780601f10614b5957610100808354040283529160200191614b84565b820191906000526020600020905b815481529060010190602001808311614b6757829003601f168201915b5050505050828281518110614b9557fe5b6020908102919091010152600101614a9c565b50949350505050565b60005b82811015614cfe5760008287838801604051602001614bd4929190616471565b6040516020818303038152906040528051906020012060001c81614bf457fe5b06905080850182870114614cf55760008983880181518110614c1257fe5b6020026020010151905060608984890181518110614c2c57fe5b602002602001015190508a83880181518110614c4457fe5b60200260200101518b858a0181518110614c5a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b84890181518110614c8957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508983880181518110614cb757fe5b60200260200101518a858a0181518110614ccd57fe5b6020026020010181905250808a84890181518110614ce757fe5b602002602001018190525050505b50600101614bb4565b5050505050505050565b600980546001908101909155600b805483908110614d2257fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b8281548110614d5857fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614db39190616455565b6040516020818303038152906040528051906020012083604051602001614dda9190616455565b6040516020818303038152906040528051906020012014905092915050565b015190565b614e06615daa565b6000614e10615daa565b614e18615ec0565b614e29614e2486615675565b61569a565b90506000805b614e38836156e4565b15614fac5780614e5d57614e53614e4e84615705565b615753565b60ff168452614fa4565b8060011415614f9f576060614e79614e7485615705565b6157d3565b90508051604051908082528060200260200182016040528015614eb657816020015b614ea3615d75565b815260200190600190039081614e9b5790505b5085602001819052508051604051908082528060200260200182016040528015614ef457816020015b6060815260200190600190039081614edf5790505b50604086015260005b8151811015614f9457614f0e615d75565b60606000614f2e858581518110614f2157fe5b60200260200101516158a4565b92509250925080614f4e578860009a509a50505050505050505050614fb5565b8289602001518581518110614f5f57fe5b60200260200101819052508189604001518581518110614f7b57fe5b6020026020010181905250505050806001019050614efd565b506001925050614fa4565b614fac565b600101614e2f565b50919350909150505b915091565b815181516000916001918114808314614fd65760009250615014565b600160208701838101602088015b60028483851001141561500f5780518351146150035760009650600093505b60209283019201614fe4565b505050505b5090949350505050565b6001600160a01b0381166000908152600460205260408120548061504757506000199050611753565b60018103905060006001828154811061505c57fe5b906000526020600020906004020160030154905060006001838154811061507f57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d906150d8908590617156565b60405180910390a2806150f057829350505050611753565b60008183816150fb57fe5b04905080156151975760005b848110156151495761512082600183815481106149eb57fe5b6001828154811061512d57fe5b6000918252602090912060036004909202010155600101615107565b50600180549085015b818110156151945761516b83600183815481106149eb57fe5b6001828154811061517857fe5b6000918252602090912060036004909202010155600101615152565b50505b5091949350505050565b6000826151b057506000611803565b828202828482816151bd57fe5b0414611e385760405162461bcd60e51b8152600401610e7290616cb6565b6000611e3883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506159be565b805182516000916001600160a01b039182169116148015615257575081602001516001600160a01b031683602001516001600160a01b0316145b8015611e385750506040908101519101516001600160a01b0390811691161490565b601254601354808211156152c457805b828110156152c257601280548061529c57fe5b6001900381819060005260206000200160006152b89190615dce565b9055600101615289565b505b60008183106152d357816152d5565b825b905060005b818110156153ed57615392601282815481106152f257fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156153805780601f1061535557610100808354040283529160200191615380565b820191906000526020600020905b81548152906001019060200180831161536357829003601f168201915b50505050506013838154811061307f57fe5b6153e557601381815481106153a357fe5b90600052602060002001601282815481106153ba57fe5b9060005260206000200190805460018160011615610100020316600290046153e3929190615e21565b505b6001016152da565b5082821115610e9457825b8281101561366e5760126013828154811061540f57fe5b6000918252602080832084546001818101875595855291909320929091018054615452949390920192909160026101009282161592909202600019011604615e21565b506001016153f8565b601354600b54808211156154a657805b828110156154a457601380548061547e57fe5b60019003818190600052602060002001600061549a9190615dce565b905560010161546b565b505b60008183106154b557816154b7565b825b905060005b818110156155d657615574601382815481106154d457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156155625780601f1061553757610100808354040283529160200191615562565b820191906000526020600020905b81548152906001019060200180831161554557829003601f168201915b5050505050600b83815481106142fb57fe5b6155ce57600b818154811061558557fe5b9060005260206000209060160201600201601382815481106155a357fe5b9060005260206000200190805460018160011615610100020316600290046155cc929190615e21565b505b6001016154bc565b5082821115610e9457825b8281101561366e576013600b82815481106155f857fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461564095939094019390926000199082161561010002011604615e21565b506001016155e1565b6000818484111561566d5760405162461bcd60e51b8152600401610e72919061659f565b505050900390565b61567d615ee0565b506040805180820190915281518152602082810190820152919050565b6156a2615ec0565b6156ab826159f5565b6156b457600080fd5b60006156c38360200151615a2f565b60208085015160408051808201909152868152920190820152915050919050565b60006156ee615ee0565b505080518051602091820151919092015191011190565b61570d615ee0565b615716826156e4565b61571f57600080fd5b6020820151600061572f82615a92565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061576857508151602110155b61577157600080fd5b60006157808360200151615a2f565b905080836000015110156157a65760405162461bcd60e51b8152600401610e7290616e6a565b825160208085015183018051928490039291831015614ba857506020919091036101000a90049392505050565b60606157de826159f5565b6157e757600080fd5b60006157f283615b73565b905060608160405190808252806020026020018201604052801561583057816020015b61581d615ee0565b8152602001906001900390816158155790505b50905060006158428560200151615a2f565b60208601510190506000805b848110156158995761585f83615a92565b915060405180604001604052808381526020018481525084828151811061588257fe5b60209081029190910101529181019160010161584e565b509195945050505050565b6158ac615d75565b606060006158b8615d75565b60606158c2615ec0565b6158cb8761569a565b90506000805b6158da836156e4565b156159af5780615905576158f56158f084615705565b615bcf565b6001600160a01b031685526159a7565b806001141561592d5761591a6158f084615705565b6001600160a01b031660208601526159a7565b8060021415615955576159426158f084615705565b6001600160a01b031660408601526159a7565b80600314156159815761596a614e4e84615705565b6001600160401b03166060860152600191506159a7565b80600414156159a25761599b61599684615705565b615be9565b93506159a7565b6159af565b6001016158d1565b50929791965091945092505050565b600081836159df5760405162461bcd60e51b8152600401610e72919061659f565b5060008385816159eb57fe5b0495945050505050565b8051600090615a0657506000611753565b6020820151805160001a9060c0821015615a2557600092505050611753565b5060019392505050565b8051600090811a6080811015615a49576000915050611753565b60b8811080615a64575060c08110801590615a64575060f881105b15615a73576001915050611753565b60c0811015615a875760b519019050611753565b60f519019050611753565b80516000908190811a6080811015615aad5760019150615b6c565b60b8811015615ac257607e1981019150615b6c565b60c0811015615b1357600060b78203600186019550806020036101000a865104915060018101820193505080831015615b0d5760405162461bcd60e51b8152600401610e7290616bb9565b50615b6c565b60f8811015615b285760be1981019150615b6c565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615b6a5760405162461bcd60e51b8152600401610e7290616bb9565b505b5092915050565b8051600090615b8457506000611753565b60008090506000615b988460200151615a2f565b602085015185519181019250015b80821015615bc657615bb782615a92565b82019150826001019250615ba6565b50909392505050565b8051600090601514615be057600080fd5b61180382615753565b8051606090615bf757600080fd5b6000615c068360200151615a2f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615c3d576020820181803683370190505b5090506000816020019050614ba884876020015101828580615c5e57610e94565b5b60208110615c7e578251825260209283019290910190601f1901615c5f565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615cc9615efa565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615d0f57805160ff1916838001178555615d3c565b82800160010185558215615d3c579182015b82811115615d3c578251825591602001919060010190615d21565b50612e4f929150615f19565b8260138101928215615d3c5791602002820182811115615d3c578251825591602001919060010190615d21565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615df4575061196b565b601f01602090049060005260206000209081019061196b9190615f19565b5061196b906013810190615f19565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615e5a5780548555615d3c565b82800160010185558215615d3c57600052602060002091601f016020900482015b82811115615d3c578254825591600101919060010190615e7b565b8260138101928215615d3c5791820182811115615d3c578254825591600101919060010190615e7b565b6040518060400160405280615ed3615ee0565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61203891905b80821115612e4f5760008155600101615f1f565b803561180381617219565b60008083601f840112615f4f578182fd5b5081356001600160401b03811115615f65578182fd5b6020830191508360208083028501011115613e2357600080fd5b6000601f8381840112615f90578182fd5b8235615fa3615f9e826171ce565b6171a8565b818152925060208084019085810160005b84811015616035578135880189603f820112615fcf57600080fd5b838101356001600160401b03811115615fe757600080fd5b615ff8818901601f191686016171a8565b81815260408c8184860101111561600e57600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615fb4565b50505050505092915050565b600082601f830112616051578081fd5b813561605f615f9e826171ce565b81815291506020808301908481018184028601820187101561608057600080fd5b6000805b858110156160355782356001600160401b03811681146160a2578283fd5b85529383019391830191600101616084565b60008083601f8401126160c5578182fd5b5081356001600160401b038111156160db578182fd5b602083019150836020828501011115613e2357600080fd5b600060208284031215616104578081fd5b8135611e3881617219565b600060208284031215616120578081fd5b8151611e3881617219565b60008060008060408587031215616140578283fd5b84356001600160401b0380821115616156578485fd5b61616288838901615f3e565b9096509450602087013591508082111561617a578384fd5b5061618787828801615f3e565b95989497509550505050565b6000806000606084860312156161a7578283fd5b83356001600160401b03808211156161bd578485fd5b81860187601f8201126161ce578586fd5b803592506161de615f9e846171ce565b80848252602080830192508084018b8283890287010111156161fe57898afd5b8994505b86851015616228576162148c82615f33565b845260019490940193928101928101616202565b50909750880135935050508082111561623f578384fd5b61624b87838801616041565b93506040860135915080821115616260578283fd5b5061626d86828701615f7f565b9150509250925092565b60008060208385031215616289578182fd5b82356001600160401b0381111561629e578283fd5b6162aa858286016160b4565b90969095509350505050565b600080600080604085870312156162cb578384fd5b84356001600160401b03808211156162e1578586fd5b6162ed888389016160b4565b90965094506020870135915080821115616305578384fd5b50616187878288016160b4565b600060208284031215616323578081fd5b5035919050565b60006020828403121561633b578081fd5b5051919050565b60008060408385031215616354578182fd5b505080516020909101519092909150565b600080600060408486031215616379578081fd5b833560ff81168114616389578182fd5b925060208401356001600160401b038111156163a3578182fd5b6163af868287016160b4565b9497909650939450505050565b6000815180845260208085019450808401835b838110156163f45781516001600160a01b0316875295820195908201906001016163cf565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526164418160208601602086016171ed565b601f01601f19169290920160200192915050565b600082516164678184602087016171ed565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611e3860208301846163bc565b60006040825261653760408301856163bc565b602083820381850152818551808452828401915082838202850101838801865b8381101561658557601f19878403018552616573838351616429565b94860194925090850190600101616557565b50909998505050505050505050565b901515815260200190565b600060208252611e386020830184616429565b6000604082526165c66040830186886163ff565b82810360208401526165d98185876163ff565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008482528315156020830152606060408301526171806060830184616429565b95945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b03811182821017156171c657600080fd5b604052919050565b60006001600160401b038211156171e3578081fd5b5060209081020190565b60005b838110156172085781810151838201526020016171f0565b8381111561366e5750506000910152565b6001600160a01b038116811461196b57600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" + "code": "0x6080604052600436106105115760003560e01c80638b5ad0c911610297578063c81b166211610165578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d82578063f9a2bbc714610d97578063fc3e590814610dac578063fccc281314610dc1578063fd4ad81f14610dd6578063fd6a687914610e0557610518565b8063e40716a114610cf0578063ea321e4914610d05578063eb57e20214610d25578063eda5868c14610d45578063f1fad10414610d5a578063f340fa0114610d6f57610518565b8063d86222d51161011e578063d86222d514610c72578063daacdb6614610c87578063dc927faf14610c9c578063df8079e914610cb1578063e086c7b114610cc6578063e1c7392a14610cdb57610518565b8063c81b166214610bfe578063c8509d81146109a3578063cb75a59214610c13578063ce910b0c14610c28578063d58918ae14610c48578063d68fb56a14610c5d57610518565b8063aa82dce111610209578063aef198a9116101c2578063aef198a914610b88578063b7ab4db514610b9d578063b8cf4ef114610bbf578063bf9f499514610729578063c466689d14610bd4578063c6d3394514610be957610518565b8063aa82dce114610af4578063aad5606314610b09578063aaf5eb6814610b1e578063ab51bb9614610b33578063ac43175114610b48578063ad3c9da614610b6857610518565b80639dc092621161025b5780639dc0926214610a765780639fe0f81614610a8b578063a0dc275814610aa0578063a1a11bf514610ab5578063a5422d5c14610aca578063a78abc1614610adf57610518565b80638b5ad0c914610a025780638c5d749d14610a175780638d19a41014610a2c5780639369d7de14610a4c57806396713da914610a6157610518565b80635192c82c116103df578063718a8aa81161034657806381650b62116102ff57806381650b6214610979578063820dcaa81461098e578063831d65d1146109a357806386249882146109c357806388b32f11146109d85780638a7beb01146109ed57610518565b8063718a8aa8146108fb57806375d47a0a1461091057806378dfed4a146109255780637942fd051461093a5780637a84ca2a1461094f5780637e434d541461096457610518565b80635d77156c116103985780635d77156c1461085557806360eba4fe1461086a57806362b72cf51461088a5780636969a25c1461089f5780636e47b482146108d157806370fd5bad146108e657610518565b80635192c82c146107c157806351b4dce3146107d657806351e80672146107eb57806355614fcc14610800578063565c56b3146108205780635667515a1461084057610518565b80632a0ffb6e116104835780633dffc3871161043c5780633dffc3871461072957806343756e5c1461074b57806345cf9daf14610760578063493279b1146107755780634bf6c882146107975780634df6e0c3146107ac57610518565b80632a0ffb6e14610666578063300c356714610686578063321d398a146106a65780633365af3a146106c657806335409f7f146106e65780633b071dcc1461070657610518565b8063152ad3b8116104d5578063152ad3b8146105d05780631bd14ed8146105f25780631e4c1524146106075780631ff1806914610627578063219f22d51461063c578063280870281461065157610518565b806304c4fec61461051d57806307a56847146105345780630bee7a671461055f5780630e2374a5146105815780631182b875146105a357610518565b3661051857005b600080fd5b34801561052957600080fd5b50610532610e1a565b005b34801561054057600080fd5b50610549610e8e565b6040516105569190616fb1565b60405180910390f35b34801561056b57600080fd5b50610574610e94565b6040516105569190616fe4565b34801561058d57600080fd5b50610596610e99565b6040516105569190616367565b3480156105af57600080fd5b506105c36105be36600461624d565b610e9f565b6040516105569190616487565b3480156105dc57600080fd5b506105e5610fbb565b604051610556919061647c565b3480156105fe57600080fd5b50610549610fc4565b34801561061357600080fd5b5061053261062236600461607b565b610fca565b34801561063357600080fd5b50610549611303565b34801561064857600080fd5b50610574611309565b34801561065d57600080fd5b5061059661130e565b34801561067257600080fd5b50610532610681366004615fdb565b611314565b34801561069257600080fd5b506105326106a1366004616013565b611335565b3480156106b257600080fd5b506105e56106c13660046161fa565b61167e565b3480156106d257600080fd5b506105e56106e13660046161fa565b61174d565b3480156106f257600080fd5b50610532610701366004615fdb565b6117fe565b34801561071257600080fd5b5061071b611963565b60405161055692919061640c565b34801561073557600080fd5b5061073e611c3f565b6040516105569190616ff5565b34801561075757600080fd5b50610596611c44565b34801561076c57600080fd5b50610549611c4a565b34801561078157600080fd5b5061078a611c50565b6040516105569190616fa2565b3480156107a357600080fd5b5061073e611c55565b3480156107b857600080fd5b5061071b611c5a565b3480156107cd57600080fd5b50610549611de6565b3480156107e257600080fd5b50610596611dec565b3480156107f757600080fd5b50610596611df2565b34801561080c57600080fd5b506105e561081b366004615fdb565b611df8565b34801561082c57600080fd5b5061054961083b366004615fdb565b611e34565b34801561084c57600080fd5b5061073e611e85565b34801561086157600080fd5b50610574611e8a565b34801561087657600080fd5b506105c36108853660046161fa565b611e8f565b34801561089657600080fd5b50610549611f35565b3480156108ab57600080fd5b506108bf6108ba3660046161fa565b611f3b565b60405161055696959493929190616394565b3480156108dd57600080fd5b50610596611f9f565b3480156108f257600080fd5b5061073e611fa5565b34801561090757600080fd5b5061073e611faa565b34801561091c57600080fd5b50610596611faf565b34801561093157600080fd5b50610549611fb5565b34801561094657600080fd5b5061073e611fbb565b34801561095b57600080fd5b50610549611fc0565b34801561097057600080fd5b50610596611fc6565b34801561098557600080fd5b50610574611fcc565b34801561099a57600080fd5b50610549611fd1565b3480156109af57600080fd5b506105326109be36600461624d565b611fd7565b3480156109cf57600080fd5b50610549611ff8565b3480156109e457600080fd5b50610549611ffe565b3480156109f957600080fd5b506105e5612004565b348015610a0e57600080fd5b5061054961200d565b348015610a2357600080fd5b50610549612013565b348015610a3857600080fd5b50610549610a47366004615fdb565b612030565b348015610a5857600080fd5b50610532612070565b348015610a6d57600080fd5b5061073e612184565b348015610a8257600080fd5b50610596612189565b348015610a9757600080fd5b5061054961218f565b348015610aac57600080fd5b50610549612194565b348015610ac157600080fd5b50610596612199565b348015610ad657600080fd5b506105c361219f565b348015610aeb57600080fd5b506105e56121be565b348015610b0057600080fd5b506105966121c7565b348015610b1557600080fd5b506105966121cd565b348015610b2a57600080fd5b506105496121d3565b348015610b3f57600080fd5b50610574611e85565b348015610b5457600080fd5b50610532610b6336600461619e565b6121dc565b348015610b7457600080fd5b50610549610b83366004615fdb565b612bce565b348015610b9457600080fd5b50610549612be0565b348015610ba957600080fd5b50610bb2612bed565b60405161055691906163f9565b348015610bcb57600080fd5b50610549612cd8565b348015610be057600080fd5b50610549612cdd565b348015610bf557600080fd5b50610549611fa5565b348015610c0a57600080fd5b50610596612ce3565b348015610c1f57600080fd5b50610549612ce9565b348015610c3457600080fd5b506105c3610c433660046161fa565b612cef565b348015610c5457600080fd5b50610549612cfc565b348015610c6957600080fd5b50610549612d02565b348015610c7e57600080fd5b50610549612d41565b348015610c9357600080fd5b50610549612d4d565b348015610ca857600080fd5b50610596612d53565b348015610cbd57600080fd5b50610596612d59565b348015610cd257600080fd5b50610549610e94565b348015610ce757600080fd5b50610532612d5f565b348015610cfc57600080fd5b50610549612f08565b348015610d1157600080fd5b506105e5610d2036600461615f565b612f0e565b348015610d3157600080fd5b50610532610d40366004615fdb565b613094565b348015610d5157600080fd5b5061057461319c565b348015610d6657600080fd5b5061073e6131a1565b610532610d7d366004615fdb565b6131a6565b348015610d8e57600080fd5b5061054961355c565b348015610da357600080fd5b50610596613562565b348015610db857600080fd5b5061073e61218f565b348015610dcd57600080fd5b50610596613568565b348015610de257600080fd5b50610df6610df13660046161fa565b61356e565b60405161055693929190616fba565b348015610e1157600080fd5b50610596613630565b6000610e2533612030565b9050600b8181548110610e3457fe5b600091825260209091206001601690920201015460ff16610e705760405162461bcd60e51b8152600401610e6790616c59565b60405180910390fd5b6000610e7a612d02565b9050610e893383836001613636565b505050565b60095481565b606481565b61200181565b60005460609060ff16610ec45760405162461bcd60e51b8152600401610e679061660f565b3361200014610ee55760405162461bcd60e51b8152600401610e6790616dba565b600b54610fa357610ef4615b87565b60015460005b81811015610f9f57600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff1916911515919091179055604086015180518794610f7b936000805160206170aa833981519152909101920190615bb6565b506060820151610f919060038301906013615c30565b505050806001019050610efa565b5050505b60405162461bcd60e51b8152600401610e67906168be565b60075460ff1681565b600f5481565b334114610fe95760405162461bcd60e51b8152600401610e6790616e09565b3a156110075760405162461bcd60e51b8152600401610e6790616b98565b825160408051828152602080840282010190915260609082801561104557816020015b611032615c5d565b81526020019060019003908161102a5790505b50905060005b828110156110ef576040518060c0016040528087838151811061106a57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020018683815181106110ac57fe5b60200260200101516001600160401b0316815260200160001515815260200160008152508282815181106110dc57fe5b602090810291909101015260010161104b565b506060806110fd8386613828565b9150915060005b6001548110156111f35760006001828154811061111d57fe5b9060005260206000209060040201600301549050806000146111ea5760006001838154811061114857fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061117c57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526111b7926001600160a01b039092169101616367565b6000604051808303818588803b1580156111d057600080fd5b505af11580156111e4573d6000803e3d6000fd5b50505050505b50600101611104565b504715611261577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516112299190616fb1565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561125f573d6000803e3d6000fd5b505b6000600381905560055581511561127c5761127c8282613d12565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b3361200214610fa35760405162461bcd60e51b8152600401610e6790616f6b565b3341146113545760405162461bcd60e51b8152600401610e6790616e09565b60105443116113755760405162461bcd60e51b8152600401610e67906167e8565b3a156113935760405162461bcd60e51b8152600401610e6790616b98565b60005460ff166113b55760405162461bcd60e51b8152600401610e679061660f565b60006110023168056bc75e2d631000008111156113ec576113e58168056bc75e2d6310000063ffffffff61450116565b91506113f3565b5050611674565b6040516309a99b4f60e41b815261100290639a99b4f09061141a903090869060040161637b565b602060405180830381600087803b15801561143457600080fd5b505af1158015611448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146c9190616212565b91508161147a575050611674565b6000805b848110156114a85785858281811061149257fe5b905060200201358201915080600101905061147e565b50806114b657505050611674565b6000806000805b8981101561166c57848989838181106114d257fe5b905060200201358802816114e257fe5b0493508a8a828181106114f157fe5b90506020020160208101906115069190615fdb565b6001600160a01b0381166000908152600460205260409020549093509150811561162257600060018084038154811061153b57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156115a857836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858660405161159b9190616fb1565b60405180910390a261161c565b6003546115bb908663ffffffff61454316565b60039081558101546115d3908663ffffffff61454316565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611613908890616fb1565b60405180910390a25b50611664565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858560405161165b9190616fb1565b60405180910390a25b6001016114bd565b505050505050505b5050436010555050565b600154600090821061169257506000611748565b60006001600160a01b0316600183815481106116aa57fe5b60009182526020909120600490910201546001600160a01b031614806116da575060085415806116da5750600a54155b806116e9575060085460095410155b806116fa57506116f88261174d565b155b8061172357506000600b838154811061170f57fe5b906000526020600020906016020160000154115b8061173757506001611733612bed565b5111155b1561174457506000611748565b5060015b919050565b600154600090821061176157506000611748565b600b54821061179e576001828154811061177757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611748565b600182815481106117ab57fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156117f85750600b82815481106117df57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b546118bc5761180d615b87565b60015460005b818110156118b857600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff1916911515919091179055604086015180518794611894936000805160206170aa833981519152909101920190615bb6565b5060608201516118aa9060038301906013615c30565b505050806001019050611813565b5050505b3361100114806118cd575033612002145b6118e95760405162461bcd60e51b8152600401610e6790616646565b6001600160a01b0381166000908152600460205260409020548061190d5750611960565b6001810390506000600b828154811061192257fe5b600091825260209091206001601690920201015460ff1690506119458383614568565b801561194e5750805b15610e89576009805460001901905550505b50565b60015460609081906000805b828110156119b6576001818154811061198457fe5b9060005260206000209060040201600201601c9054906101000a900460ff166119ae576001909101905b60010161196f565b506060816040519080825280602002602001820160405280156119e3578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611a1c57816020015b6060815260200190600190039081611a075790505b50600b5460009450909150841415611b975760005b84811015611b915760018181548110611a4657fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611b895760018181548110611a7657fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611aa157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b8181548110611ace57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015611b665780601f10611b3b57610100808354040283529160200191611b66565b820191906000526020600020905b815481529060010190602001808311611b4957829003601f168201915b5050505050828581518110611b7757fe5b60209081029190910101526001909301925b600101611a31565b50611c33565b60005b84811015611c315760018181548110611baf57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611c295760018181548110611bdf57fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611c0a57fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611b9a565b505b909450925050505b9091565b600181565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c5411611c76576015611c7a565b600c545b90506060611c86612bed565b90506060611c938261492b565b905082825111611caa579094509250611c3b915050565b83838351031015611cbc578282510393505b8315611cf25760c84304611cd883838388880360008a8a614a99565b611cf08383838888038989038a8b8b8b510301614a99565b505b606083604051908082528060200260200182016040528015611d1e578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611d5757816020015b6060815260200190600190039081611d425790505b50905060005b85811015611dd857848181518110611d7157fe5b6020026020010151838281518110611d8557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611db157fe5b6020026020010151828281518110611dc557fe5b6020908102919091010152600101611d5d565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611e20576000915050611748565b60001901611e2d8161174d565b9392505050565b6001600160a01b03811660009081526004602052604081205480611e5c576000915050611748565b600180820381548110611e6b57fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611e9c57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611f2d5780601f10611f0257610100808354040283529160200191611f2d565b820191906000526020600020905b815481529060010190602001808311611f1057829003601f168201915b505050505081565b60105481565b60018181548110611f4857fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b3361200014610fa35760405162461bcd60e51b8152600401610e6790616dba565b60025481565b60115481565b60145460ff1681565b600a5481565b6000601754600014156120285750600161202d565b506017545b90565b6001600160a01b038116600090815260046020526040812054806120665760405162461bcd60e51b8152600401610e6790616d42565b6000190192915050565b600b5461212e5761207f615b87565b60015460005b8181101561212a57600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff1916911515919091179055604086015180518794612106936000805160206170aa833981519152909101920190615bb6565b50606082015161211c9060038301906013615c30565b505050806001019050612085565b5050505b60085461213b5760036008555b600a54612148576002600a555b600061215333612030565b905061215e8161167e565b61217a5760405162461bcd60e51b8152600401610e6790616b14565b6119603382614bf0565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef81526020016170ca6105ef913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166121fe5760405162461bcd60e51b8152600401610e679061660f565b336110071461221f5760405162461bcd60e51b8152600401610e6790616bc6565b61227f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614c889050565b1561233457602081146122a45760405162461bcd60e51b8152600401610e67906164cc565b604080516020601f84018190048102820181019092528281526000916122e291858580838501838280828437600092019190915250614ce192505050565b905061271061230e601854612302600f548561454390919063ffffffff16565b9063ffffffff61454316565b111561232c5760405162461bcd60e51b8152600401610e67906168e2565b600655612b8b565b61239e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614c889050565b1561243857602081146123c35760405162461bcd60e51b8152600401610e6790616503565b604080516020601f840181900481028201810190925282815260009161240191858580838501838280828437600092019190915250614ce192505050565b600c5490915080612410575060155b80821061242f5760405162461bcd60e51b8152600401610e679061682a565b50600855612b8b565b6124a184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614c889050565b1561253a57602081146124c65760405162461bcd60e51b8152600401610e6790616595565b604080516020601f840181900481028201810190925282815260009161250491858580838501838280828437600092019190915250614ce192505050565b90506000811180156125165750600a81105b6125325760405162461bcd60e51b8152600401610e6790616e9e565b600a55612b8b565b6125ae84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614c889050565b1561263d57602081146125d35760405162461bcd60e51b8152600401610e6790616549565b604080516020601f840181900481028201810190925282815260009161261191858580838501838280828437600092019190915250614ce192505050565b9050600d548111156126355760405162461bcd60e51b8152600401610e67906169eb565b600e55612b8b565b6126a684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614c889050565b1561272857602081146126cb5760405162461bcd60e51b8152600401610e6790616c14565b604080516020601f840181900481028201810190925282815260009161270991858580838501838280828437600092019190915250614ce192505050565b600d819055600e5490915081101561272257600d54600e555b50612b8b565b61278c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614c889050565b1561283a57602081146127b15760405162461bcd60e51b8152600401610e67906165da565b604080516020601f84018190048102820181019092528281526000916127ef91858580838501838280828437600092019190915250614ce192505050565b9050600081116128115760405162461bcd60e51b8152600401610e6790616743565b60648111156128325760405162461bcd60e51b8152600401610e679061678b565b600c55612b8b565b6128a684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614c889050565b1561294f57602081146128cb5760405162461bcd60e51b8152600401610e6790616e56565b604080516020601f840181900481028201810190925282815260009161290991858580838501838280828437600092019190915250614ce192505050565b90506127106129296018546123026006548561454390919063ffffffff16565b11156129475760405162461bcd60e51b8152600401610e67906166b4565b600f55612b8b565b6129c384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614c889050565b15612a6c57602081146129e85760405162461bcd60e51b8152600401610e6790616971565b604080516020601f8401819004810282018101909252828152600091612a2691858580838501838280828437600092019190915250614ce192505050565b9050612710612a46600f546123026006548561454390919063ffffffff16565b1115612a645760405162461bcd60e51b8152600401610e6790616a85565b601855612b8b565b612acd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614c889050565b15612b735760208114612af25760405162461bcd60e51b8152600401610e6790616887565b604080516020601f8401819004810282018101909252828152600091612b3091858580838501838280828437600092019190915250614ce192505050565b905060038110158015612b44575060098111155b80612b4f5750806001145b612b6b5760405162461bcd60e51b8152600401610e6790616cbc565b601755612b8b565b60405162461bcd60e51b8152600401610e6790616efb565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051612bc0949392919061649a565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612c1c57612c088161174d565b15612c14578160010191505b600101612bf7565b50606081604051908082528060200260200182016040528015612c49578160200160208202803683370190505b5090506000915060005b83811015612cd057612c648161174d565b15612cc85760018181548110612c7657fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612ca157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612c53565b509250505090565b601581565b61027181565b61100281565b60175481565b60138181548110611e9c57fe5b60185481565b6000612d0c612bed565b519050600080600c5411612d21576015612d25565b600c545b905080821115612d33578091505b81612d3d57600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff1615612d825760405162461bcd60e51b8152600401610e6790616c85565b612d8a615c92565b6000612db06040518061062001604052806105ef81526020016170ca6105ef9139614ce6565b9150915080612dd15760405162461bcd60e51b8152600401610e6790616d79565b60005b826020015151811015612ef657600183602001518281518110612df357fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612ec957fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612dd4565b50506000805460ff1916600117905550565b600d5481565b601354600090815b8181101561301757612fff85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612f6757fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ff55780601f10612fca57610100808354040283529160200191612ff5565b820191906000526020600020905b815481529060010190602001808311612fd857829003601f168201915b5050505050614ea2565b1561300f576001925050506117f8565b600101612f16565b5060125460005b818110156130885761306f86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612f6757fe5b1561308057600193505050506117f8565b60010161301e565b50600095945050505050565b33611001146130b55760405162461bcd60e51b8152600401610e6790616f22565b600b54613173576130c4615b87565b60015460005b8181101561316f57600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff191691151591909117905560408601518051879461314b936000805160206170aa833981519152909101920190615bb6565b5060608201516131619060038301906013615c30565b5050508060010190506130ca565b5050505b600061317e82614f06565b90506131898161167e565b15613198576131988282614bf0565b5050565b606581565b601181565b3341146131c55760405162461bcd60e51b8152600401610e6790616e09565b60005460ff166131e75760405162461bcd60e51b8152600401610e679061660f565b600034116132075760405162461bcd60e51b8152600401610e67906169bc565b3a156132255760405162461bcd60e51b8152600401610e6790616b98565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661326557610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561327c57506000601854115b156132a157600160175403601754438161329257fe5b06601854028161329e57fe5b04015b6000831180156132b15750600081115b1561335e5760006132da6127106132ce348563ffffffff61508916565b9063ffffffff6150c316565b9050801561335c576040516110029082156108fc029083906000818181858888f19350505050158015613311573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516133419190616fb1565b60405180910390a1613359848263ffffffff61450116565b93505b505b60008311801561337057506000600654115b156134165760006133926127106132ce6006543461508990919063ffffffff16565b905080156134145760405161dead9082156108fc029083906000818181858888f193505050501580156133c9573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516133f99190616fb1565b60405180910390a1613411848263ffffffff61450116565b93505b505b811561351457600060018084038154811061342d57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561349a57846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48560405161348d9190616fb1565b60405180910390a261350e565b6003546134ad908563ffffffff61454316565b60039081558101546134c5908563ffffffff61454316565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590613505908790616fb1565b60405180910390a25b50613556565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48460405161354d9190616fb1565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061357b57fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff909116949192918301828280156136265780601f106135fb57610100808354040283529160200191613626565b820191906000526020600020905b81548152906001019060200180831161360957829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613647575082155b806136525750600954155b1561365f57506000613820565b600960008154600190039190508190555060006136aa600a546132ce866132ce600b8a8154811061368c57fe5b6000918252602090912060169091020154439063ffffffff61450116565b90506000600b86815481106136bb57fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b15801561372057600080fd5b505afa158015613734573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613758919061622a565b91509150600093508083106137d6576137718888614568565b506040516328aa02b160e01b8152611001906328aa02b19061379b908b9087908a906004016163d6565b600060405180830381600087803b1580156137b557600080fd5b505af11580156137c9573d6000803e3d6000fd5b50505050600193506137e8565b8183106137e8576137e688614f06565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b606080600080808080613839612d02565b6001549091505b8015613a6b57600181039250600b838154811061385957fe5b600091825260209091206001601690920201015460ff1661387957613a62565b6001838154811061388657fe5b600091825260208220600490910201546001600160a01b031695506138b090869085908590613636565b9350836138bc57613a62565b60405163436aa28360e11b81526000908190612002906386d54506906138e6908a90600401616367565b60206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139369190615ff7565b90506001600160a01b038116156139bf576040516302ceee9160e11b81526120029063059ddd229061396c908490600401616367565b60206040518083038186803b15801561398457600080fd5b505afa158015613998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139bc9190615ff7565b91505b60005b8c51811015613a5e57876001600160a01b03168d82815181106139e157fe5b6020026020010151600001516001600160a01b03161480613a2a5750826001600160a01b03168d8281518110613a1357fe5b6020026020010151600001516001600160a01b0316145b15613a565760018d8281518110613a3d57fe5b6020908102919091010151901515608090910152613a5e565b6001016139c2565b5050505b60001901613840565b5060005b8951811015613ad857898181518110613a8457fe5b60200260200101516080015180613ac4575060006001600160a01b03168a8281518110613aad57fe5b6020026020010151600001516001600160a01b0316145b15613ad0578560010195505b600101613a6f565b5088518510613bc05760408051600180825281830190925290816020015b613afe615c5d565b815260200190600190039081613af6575050604080516001808252818301909252919850602082015b6060815260200190600190039081613b2757905050955088600081518110613b4b57fe5b602002602001015187600081518110613b6057fe5b602002602001018190525087600081518110613b7857fe5b602002602001015186600081518110613b8d57fe5b6020026020010181905250600087600081518110613ba757fe5b6020908102919091010151901515608090910152613d05565b84895103604051908082528060200260200182016040528015613bfd57816020015b613bea615c5d565b815260200190600190039081613be25790505b50965084895103604051908082528060200260200182016040528015613c3757816020015b6060815260200190600190039081613c225790505b5095506000915060005b8951811015613d0357898181518110613c5657fe5b602002602001015160800151158015613c99575060006001600160a01b03168a8281518110613c8157fe5b6020026020010151600001516001600160a01b031614155b15613cfb57898181518110613caa57fe5b6020026020010151888481518110613cbe57fe5b6020026020010181905250888181518110613cd557fe5b6020026020010151878481518110613ce957fe5b60200260200101819052508260010192505b600101613c41565b505b50505050505b9250929050565b600154825160005b82811015613e2f576001613d2c615c5d565b60018381548110613d3957fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613e0357878181518110613dc957fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613dfb5760009250613e03565b600101613db5565b508115613e255780516001600160a01b03166000908152600460205260408120555b5050600101613d1a565b5080821115613eee57805b82811015613eec576001805480613e4d57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613ea057fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613ed26002830182615cb6565b613ee0600383016000615cfa565b50509055600101613e3a565b505b6000818310613efd5781613eff565b825b905060005b818110156142a357613fb1868281518110613f1b57fe5b602002602001015160018381548110613f3057fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615105565b614165578060010160046000888481518110613fc957fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061400557fe5b60200260200101516001828154811061401a57fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106140d557fe5b6020026020010151600b82815481106140ea57fe5b9060005260206000209060160201600201908051906020019061410e929190615bb6565b506000600b828154811061411e57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061414f57fe5b600091825260209091206016909102015561429b565b85818151811061417157fe5b6020026020010151606001516001828154811061418a57fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b031602179055506142508582815181106141ce57fe5b6020026020010151600b83815481106141e357fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612ff55780601f10612fca57610100808354040283529160200191612ff5565b61429b5784818151811061426057fe5b6020026020010151600b828154811061427557fe5b90600052602060002090601602016002019080519060200190614299929190615bb6565b505b600101613f04565b508282111561447b576142b4615b87565b835b83811015614478578581815181106142ca57fe5b6020026020010151826040018190525060018782815181106142e857fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b805492830181559093528451601690910260008051602061708a8339815191528101918255858301516000805160206176b98339815191528201805491151560ff199092169190911790559285015180518694929361441e936000805160206170aa83398151915201920190615bb6565b5060608201516144349060038301906013615c30565b505050806001016004600089848151811061444b57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016142b6565b50505b614483615161565b61448b615343565b6000600981905560015493505b838110156144f9576000600b82815481106144af57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106144e057fe5b6000918252602090912060169091020155600101614498565b505050505050565b6000611e2d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615531565b600082820183811015611e2d5760405162461bcd60e51b8152600401610e679061667d565b6000806001838154811061457857fe5b906000526020600020906004020160030154905060006001808054905003905060016145a2612bed565b51116145d7576000600185815481106145b757fe5b9060005260206000209060040201600301819055506000925050506117f8565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516146109190616fb1565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156147fd576001816001018154811061465157fe5b90600052602060002090600402016001828154811061466c57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061472d57fe5b9060005260206000209060160201600b828154811061474857fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff199092169190911790556002808401805461479f938386019390821615610100026000190190911604615d09565b506147b260038281019084016013615d7e565b509050508060010160046000600184815481106147cb57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614633565b50600180548061480957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061485c57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061488e6002830182615cb6565b61489c600383016000615cfa565b5050905560008183816148ab57fe5b049050801561491f5760015460005b8181101561491c576148f383600183815481106148d357fe5b90600052602060002090600402016003015461454390919063ffffffff16565b6001828154811061490057fe5b60009182526020909120600360049092020101556001016148ba565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561496a57816020015b60608152602001906001900390816149555790505b50600b549091508314614981579250611748915050565b60005b82811015614a9057600b6001600460008985815181106149a057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106149d457fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015614a6c5780601f10614a4157610100808354040283529160200191614a6c565b820191906000526020600020905b815481529060010190602001808311614a4f57829003601f168201915b5050505050828281518110614a7d57fe5b6020908102919091010152600101614984565b50949350505050565b60005b82811015614be65760008287838801604051602001614abc929190616359565b6040516020818303038152906040528051906020012060001c81614adc57fe5b06905080850182870114614bdd5760008983880181518110614afa57fe5b6020026020010151905060608984890181518110614b1457fe5b602002602001015190508a83880181518110614b2c57fe5b60200260200101518b858a0181518110614b4257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b84890181518110614b7157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508983880181518110614b9f57fe5b60200260200101518a858a0181518110614bb557fe5b6020026020010181905250808a84890181518110614bcf57fe5b602002602001018190525050505b50600101614a9c565b5050505050505050565b600980546001908101909155600b805483908110614c0a57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b8281548110614c4057fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614c9b919061633d565b6040516020818303038152906040528051906020012083604051602001614cc2919061633d565b6040516020818303038152906040528051906020012014905092915050565b015190565b614cee615c92565b6000614cf8615c92565b614d00615da8565b614d11614d0c8661555d565b615582565b90506000805b614d20836155cc565b15614e945780614d4557614d3b614d36846155ed565b61563b565b60ff168452614e8c565b8060011415614e87576060614d61614d5c856155ed565b6156bb565b90508051604051908082528060200260200182016040528015614d9e57816020015b614d8b615c5d565b815260200190600190039081614d835790505b5085602001819052508051604051908082528060200260200182016040528015614ddc57816020015b6060815260200190600190039081614dc75790505b50604086015260005b8151811015614e7c57614df6615c5d565b60606000614e16858581518110614e0957fe5b602002602001015161578c565b92509250925080614e36578860009a509a50505050505050505050614e9d565b8289602001518581518110614e4757fe5b60200260200101819052508189604001518581518110614e6357fe5b6020026020010181905250505050806001019050614de5565b506001925050614e8c565b614e94565b600101614d17565b50919350909150505b915091565b815181516000916001918114808314614ebe5760009250614efc565b600160208701838101602088015b600284838510011415614ef7578051835114614eeb5760009650600093505b60209283019201614ecc565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614f2f57506000199050611748565b600181039050600060018281548110614f4457fe5b9060005260206000209060040201600301549050600060018381548110614f6757fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614fc0908590616fb1565b60405180910390a280614fd857829350505050611748565b6000818381614fe357fe5b049050801561507f5760005b848110156150315761500882600183815481106148d357fe5b6001828154811061501557fe5b6000918252602090912060036004909202010155600101614fef565b50600180549085015b8181101561507c5761505383600183815481106148d357fe5b6001828154811061506057fe5b600091825260209091206003600490920201015560010161503a565b50505b5091949350505050565b600082615098575060006117f8565b828202828482816150a557fe5b0414611e2d5760405162461bcd60e51b8152600401610e6790616b57565b6000611e2d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506158a6565b805182516000916001600160a01b03918216911614801561513f575081602001516001600160a01b031683602001516001600160a01b0316145b8015611e2d5750506040908101519101516001600160a01b0390811691161490565b601254601354808211156151ac57805b828110156151aa57601280548061518457fe5b6001900381819060005260206000200160006151a09190615cb6565b9055600101615171565b505b60008183106151bb57816151bd565b825b905060005b818110156152d55761527a601282815481106151da57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156152685780601f1061523d57610100808354040283529160200191615268565b820191906000526020600020905b81548152906001019060200180831161524b57829003601f168201915b505050505060138381548110612f6757fe5b6152cd576013818154811061528b57fe5b90600052602060002001601282815481106152a257fe5b9060005260206000200190805460018160011615610100020316600290046152cb929190615d09565b505b6001016151c2565b5082821115610e8957825b82811015613556576012601382815481106152f757fe5b600091825260208083208454600181810187559585529190932092909101805461533a949390920192909160026101009282161592909202600019011604615d09565b506001016152e0565b601354600b548082111561538e57805b8281101561538c57601380548061536657fe5b6001900381819060005260206000200160006153829190615cb6565b9055600101615353565b505b600081831061539d578161539f565b825b905060005b818110156154be5761545c601382815481106153bc57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561544a5780601f1061541f5761010080835404028352916020019161544a565b820191906000526020600020905b81548152906001019060200180831161542d57829003601f168201915b5050505050600b83815481106141e357fe5b6154b657600b818154811061546d57fe5b90600052602060002090601602016002016013828154811061548b57fe5b9060005260206000200190805460018160011615610100020316600290046154b4929190615d09565b505b6001016153a4565b5082821115610e8957825b82811015613556576013600b82815481106154e057fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461552895939094019390926000199082161561010002011604615d09565b506001016154c9565b600081848411156155555760405162461bcd60e51b8152600401610e679190616487565b505050900390565b615565615dc8565b506040805180820190915281518152602082810190820152919050565b61558a615da8565b615593826158dd565b61559c57600080fd5b60006155ab8360200151615917565b60208085015160408051808201909152868152920190820152915050919050565b60006155d6615dc8565b505080518051602091820151919092015191011190565b6155f5615dc8565b6155fe826155cc565b61560757600080fd5b602082015160006156178261597a565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061565057508151602110155b61565957600080fd5b60006156688360200151615917565b9050808360000151101561568e5760405162461bcd60e51b8152600401610e6790616d0b565b825160208085015183018051928490039291831015614a9057506020919091036101000a90049392505050565b60606156c6826158dd565b6156cf57600080fd5b60006156da83615a5b565b905060608160405190808252806020026020018201604052801561571857816020015b615705615dc8565b8152602001906001900390816156fd5790505b509050600061572a8560200151615917565b60208601510190506000805b84811015615781576157478361597a565b915060405180604001604052808381526020018481525084828151811061576a57fe5b602090810291909101015291810191600101615736565b509195945050505050565b615794615c5d565b606060006157a0615c5d565b60606157aa615da8565b6157b387615582565b90506000805b6157c2836155cc565b1561589757806157ed576157dd6157d8846155ed565b615ab7565b6001600160a01b0316855261588f565b8060011415615815576158026157d8846155ed565b6001600160a01b0316602086015261588f565b806002141561583d5761582a6157d8846155ed565b6001600160a01b0316604086015261588f565b806003141561586957615852614d36846155ed565b6001600160401b031660608601526001915061588f565b806004141561588a5761588361587e846155ed565b615ad1565b935061588f565b615897565b6001016157b9565b50929791965091945092505050565b600081836158c75760405162461bcd60e51b8152600401610e679190616487565b5060008385816158d357fe5b0495945050505050565b80516000906158ee57506000611748565b6020820151805160001a9060c082101561590d57600092505050611748565b5060019392505050565b8051600090811a6080811015615931576000915050611748565b60b881108061594c575060c0811080159061594c575060f881105b1561595b576001915050611748565b60c081101561596f5760b519019050611748565b60f519019050611748565b80516000908190811a60808110156159955760019150615a54565b60b88110156159aa57607e1981019150615a54565b60c08110156159fb57600060b78203600186019550806020036101000a8651049150600181018201935050808310156159f55760405162461bcd60e51b8152600401610e6790616a5a565b50615a54565b60f8811015615a105760be1981019150615a54565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615a525760405162461bcd60e51b8152600401610e6790616a5a565b505b5092915050565b8051600090615a6c57506000611748565b60008090506000615a808460200151615917565b602085015185519181019250015b80821015615aae57615a9f8261597a565b82019150826001019250615a8e565b50909392505050565b8051600090601514615ac857600080fd5b6117f88261563b565b8051606090615adf57600080fd5b6000615aee8360200151615917565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615b25576020820181803683370190505b5090506000816020019050614a9084876020015101828580615b4657610e89565b5b60208110615b66578251825260209283019290910190601f1901615b47565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615bb1615de2565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615bf757805160ff1916838001178555615c24565b82800160010185558215615c24579182015b82811115615c24578251825591602001919060010190615c09565b50612d3d929150615e01565b8260138101928215615c245791602002820182811115615c24578251825591602001919060010190615c09565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615cdc5750611960565b601f0160209004906000526020600020908101906119609190615e01565b50611960906013810190615e01565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615d425780548555615c24565b82800160010185558215615c2457600052602060002091601f016020900482015b82811115615c24578254825591600101919060010190615d63565b8260138101928215615c245791820182811115615c24578254825591600101919060010190615d63565b6040518060400160405280615dbb615dc8565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61202d91905b80821115612d3d5760008155600101615e07565b80356117f881617074565b60008083601f840112615e37578182fd5b5081356001600160401b03811115615e4d578182fd5b6020830191508360208083028501011115613d0b57600080fd5b6000601f8381840112615e78578182fd5b8235615e8b615e8682617029565b617003565b818152925060208084019085810160005b84811015615f1d578135880189603f820112615eb757600080fd5b838101356001600160401b03811115615ecf57600080fd5b615ee0818901601f19168601617003565b81815260408c81848601011115615ef657600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615e9c565b50505050505092915050565b600082601f830112615f39578081fd5b8135615f47615e8682617029565b818152915060208083019084810181840286018201871015615f6857600080fd5b6000805b85811015615f1d5782356001600160401b0381168114615f8a578283fd5b85529383019391830191600101615f6c565b60008083601f840112615fad578182fd5b5081356001600160401b03811115615fc3578182fd5b602083019150836020828501011115613d0b57600080fd5b600060208284031215615fec578081fd5b8135611e2d81617074565b600060208284031215616008578081fd5b8151611e2d81617074565b60008060008060408587031215616028578283fd5b84356001600160401b038082111561603e578485fd5b61604a88838901615e26565b90965094506020870135915080821115616062578384fd5b5061606f87828801615e26565b95989497509550505050565b60008060006060848603121561608f578283fd5b83356001600160401b03808211156160a5578485fd5b81860187601f8201126160b6578586fd5b803592506160c6615e8684617029565b80848252602080830192508084018b8283890287010111156160e657898afd5b8994505b86851015616110576160fc8c82615e1b565b8452600194909401939281019281016160ea565b509097508801359350505080821115616127578384fd5b61613387838801615f29565b93506040860135915080821115616148578283fd5b5061615586828701615e67565b9150509250925092565b60008060208385031215616171578182fd5b82356001600160401b03811115616186578283fd5b61619285828601615f9c565b90969095509350505050565b600080600080604085870312156161b3578384fd5b84356001600160401b03808211156161c9578586fd5b6161d588838901615f9c565b909650945060208701359150808211156161ed578384fd5b5061606f87828801615f9c565b60006020828403121561620b578081fd5b5035919050565b600060208284031215616223578081fd5b5051919050565b6000806040838503121561623c578182fd5b505080516020909101519092909150565b600080600060408486031215616261578081fd5b833560ff81168114616271578182fd5b925060208401356001600160401b0381111561628b578182fd5b61629786828701615f9c565b9497909650939450505050565b6000815180845260208085019450808401835b838110156162dc5781516001600160a01b0316875295820195908201906001016162b7565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452616329816020860160208601617048565b601f01601f19169290920160200192915050565b6000825161634f818460208701617048565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611e2d60208301846162a4565b60006040825261641f60408301856162a4565b602083820381850152818551808452828401915082838202850101838801865b8381101561646d57601f1987840301855261645b838351616311565b9486019492509085019060010161643f565b50909998505050505050505050565b901515815260200190565b600060208252611e2d6020830184616311565b6000604082526164ae6040830186886162e7565b82810360208401526164c18185876162e7565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152616fdb6060830184616311565b95945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561702157600080fd5b604052919050565b60006001600160401b0382111561703e578081fd5b5060209081020190565b60005b8381101561706357818101518382015260200161704b565b838111156135565750506000910152565b6001600160a01b038116811461196057600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001001": { "balance": "0x0", @@ -58,7 +58,7 @@ }, "0x0000000000000000000000000000000000001003": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063a78abc1611610151578063dda83148116100c3578063e405bbc311610087578063e405bbc314610724578063ea54b2aa1461072c578063f1fad10414610734578063f9a2bbc71461073c578063fc3e590814610744578063fd6a68791461074c57610274565b8063dda83148146106a4578063df5fe704146106ca578063df8079e9146106f0578063e1c7392a146106f8578063e2761af01461070057610274565b8063adc879e911610115578063adc879e9146105c7578063c81b1662146105cf578063cba510a9146105d7578063d8169879146105fd578063da8d08f014610676578063dc927faf1461069c57610274565b8063a78abc16146104cf578063aa82dce1146104eb578063aad56063146104f3578063ab51bb96146104fb578063ac4317511461050357610274565b8063564b81ef116101ea57806375d47a0a116101ae57806375d47a0a1461049f5780637942fd05146104a75780637e434d54146104af57806396713da9146104b75780639dc09262146104bf578063a1a11bf5146104c757610274565b8063564b81ef146103455780635c5ae8db146103c25780636e47b4821461048757806370fd5bad1461048f578063718a8aa81461049757610274565b80633dffc3871161023c5780633dffc387146102e857806343756e5c14610306578063493279b11461030e5780634bf6c8821461032d57806351b4dce31461033557806351e806721461033d57610274565b80630bee7a67146102795780630e2374a51461029a5780632657e9b6146102be57806328087028146102d857806333f7798d146102e0575b600080fd5b610281610754565b6040805163ffffffff9092168252519081900360200190f35b6102a2610759565b604080516001600160a01b039092168252519081900360200190f35b6102c661075f565b60408051918252519081900360200190f35b6102a261076a565b6102c6610770565b6102f0610776565b6040805160ff9092168252519081900360200190f35b6102a261077b565b610316610781565b6040805161ffff9092168252519081900360200190f35b6102f0610786565b6102a261078b565b6102a2610791565b61034d610797565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038757818101518382015260200161036f565b50505050905090810190601f1680156103b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360208110156103d857600080fd5b50356001600160401b03166108a3565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610449578181015183820152602001610431565b50505050905090810190601f1680156104765780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102a261095e565b6102f0610964565b6102f0610969565b6102a261096e565b6102f0610974565b6102a2610979565b6102f061097f565b6102a2610984565b6102a261098a565b6104d7610990565b604080519115158252519081900360200190f35b6102a2610999565b6102a261099f565b6102816109a5565b6105c56004803603604081101561051957600080fd5b81019060208101813564010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91939092909160208101903564010000000081111561058657600080fd5b82018360208201111561059857600080fd5b803590602001918460018302840111640100000000831117156105ba57600080fd5b5090925090506109aa565b005b6102c6610a7b565b6102a2610a81565b6102c6600480360360208110156105ed57600080fd5b50356001600160401b0316610a87565b6104d76004803603604081101561061357600080fd5b81019060208101813564010000000081111561062e57600080fd5b82018360208201111561064057600080fd5b8035906020019184600183028401116401000000008311171561066257600080fd5b9193509150356001600160401b0316610aa6565b6102a26004803603602081101561068c57600080fd5b50356001600160401b0316610b66565b6102a2610b81565b6102a2600480360360208110156106ba57600080fd5b50356001600160401b0316610b87565b6104d7600480360360208110156106e057600080fd5b50356001600160401b0316610bab565b6102a2610bed565b6105c5610bf3565b610708610d9f565b604080516001600160401b039092168252519081900360200190f35b610708610dae565b61034d610dc4565b6102f0610de3565b6102a2610de8565b6102f0610dee565b6102a2610df3565b606481565b61200181565b662386f26fc1000081565b61200581565b60055481565b600181565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561080d57828160ff16815181106107e157fe5b01602001516001600160f81b0319161561080057816001019150610805565b61080d565b6001016107c6565b5060608160ff166040519080825280601f01601f19166020018201604052801561083e576020820181803683370190505b50905060005b8260ff168160ff16101561089a57838160ff168151811061086157fe5b602001015160f81c60f81b828260ff168151811061087b57fe5b60200101906001600160f81b031916908160001a905350600101610844565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610a01576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610a415760405162461bcd60e51b815260040180806020018281038252602e815260200180610fa3602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d6020811015610b1357600080fd5b5051610a41576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610be757506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610c4b576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610c726040518061024001604052806102208152602001610fd16102209139610df9565b81516004559092509050610c84610ee4565b6000610c9284846000610e03565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff1916941693909317835580860151918301919091559184015160028201556060840151805194965092945085939092610cfe926003850192910190610f0a565b50506003805467ffffffffffffffff19166001600160401b038481169182176fffffffffffffffff00000000000000001916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518061024001604052806102208152602001610fd1610220913981565b601181565b61100081565b600381565b61100481565b8051602090910191565b610e0b610ee4565b6008840151602885015160489095018051909560009291610e2a610ee4565b602081018390526040810182905286610e955760008060688a036040519080825280601f01601f191660200182016040528015610e6e576020820181803683370190505b5060608401819052610e7f90610df9565b9092509050610e9260208c018383610ea3565b50505b989297509195505050505050565b5b60208110610ec3578251825260209283019290910190601f1901610ea4565b915181516020939093036101000a6000190180199091169216919091179052565b604080516080810182526000808252602082018190529181019190915260608082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610f4b57805160ff1916838001178555610f78565b82800160010185558215610f78579182015b82811115610f78578251825591602001919060010190610f5d565b50610f84929150610f88565b5090565b6108a091905b80821115610f845760008155600101610f8e56fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063a78abc1611610151578063dda83148116100c3578063e405bbc311610087578063e405bbc314610724578063ea54b2aa1461072c578063f1fad10414610734578063f9a2bbc71461073c578063fc3e590814610744578063fd6a68791461074c57610274565b8063dda83148146106a4578063df5fe704146106ca578063df8079e9146106f0578063e1c7392a146106f8578063e2761af01461070057610274565b8063adc879e911610115578063adc879e9146105c7578063c81b1662146105cf578063cba510a9146105d7578063d8169879146105fd578063da8d08f014610676578063dc927faf1461069c57610274565b8063a78abc16146104cf578063aa82dce1146104eb578063aad56063146104f3578063ab51bb96146104fb578063ac4317511461050357610274565b8063564b81ef116101ea57806375d47a0a116101ae57806375d47a0a1461049f5780637942fd05146104a75780637e434d54146104af57806396713da9146104b75780639dc09262146104bf578063a1a11bf5146104c757610274565b8063564b81ef146103455780635c5ae8db146103c25780636e47b4821461048757806370fd5bad1461048f578063718a8aa81461049757610274565b80633dffc3871161023c5780633dffc387146102e857806343756e5c14610306578063493279b11461030e5780634bf6c8821461032d57806351b4dce31461033557806351e806721461033d57610274565b80630bee7a67146102795780630e2374a51461029a5780632657e9b6146102be57806328087028146102d857806333f7798d146102e0575b600080fd5b610281610754565b6040805163ffffffff9092168252519081900360200190f35b6102a2610759565b604080516001600160a01b039092168252519081900360200190f35b6102c661075f565b60408051918252519081900360200190f35b6102a261076a565b6102c6610770565b6102f0610776565b6040805160ff9092168252519081900360200190f35b6102a261077b565b610316610781565b6040805161ffff9092168252519081900360200190f35b6102f0610786565b6102a261078b565b6102a2610791565b61034d610797565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038757818101518382015260200161036f565b50505050905090810190601f1680156103b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360208110156103d857600080fd5b50356001600160401b03166108a2565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610449578181015183820152602001610431565b50505050905090810190601f1680156104765780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102a261095d565b6102f0610963565b6102f0610968565b6102a261096d565b6102f0610973565b6102a2610978565b6102f061097e565b6102a2610983565b6102a2610989565b6104d761098f565b604080519115158252519081900360200190f35b6102a2610998565b6102a261099e565b6102816109a4565b6105c56004803603604081101561051957600080fd5b81019060208101813564010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91939092909160208101903564010000000081111561058657600080fd5b82018360208201111561059857600080fd5b803590602001918460018302840111640100000000831117156105ba57600080fd5b5090925090506109a9565b005b6102c6610a7a565b6102a2610a80565b6102c6600480360360208110156105ed57600080fd5b50356001600160401b0316610a86565b6104d76004803603604081101561061357600080fd5b81019060208101813564010000000081111561062e57600080fd5b82018360208201111561064057600080fd5b8035906020019184600183028401116401000000008311171561066257600080fd5b9193509150356001600160401b0316610aa5565b6102a26004803603602081101561068c57600080fd5b50356001600160401b0316610b65565b6102a2610b80565b6102a2600480360360208110156106ba57600080fd5b50356001600160401b0316610b86565b6104d7600480360360208110156106e057600080fd5b50356001600160401b0316610baa565b6102a2610bec565b6105c5610bf2565b610708610c92565b604080516001600160401b039092168252519081900360200190f35b610708610ca1565b61034d610cbc565b6102f0610cdb565b6102a2610ce0565b6102f0610ce6565b6102a2610ceb565b606481565b61200181565b662386f26fc1000081565b61200581565b60055481565b600181565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561080d57828160ff16815181106107e157fe5b01602001516001600160f81b0319161561080057816001019150610805565b61080d565b6001016107c6565b5060608160ff166040519080825280601f01601f19166020018201604052801561083e576020820181803683370190505b50905060005b8260ff168160ff16101561089a57838160ff168151811061086157fe5b602001015160f81c60f81b828260ff168151811061087b57fe5b60200101906001600160f81b031916908160001a905350600101610844565b509250505090565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156109535780601f1061092857610100808354040283529160200191610953565b820191906000526020600020905b81548152906001019060200180831161093657829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610a00576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610a405760405162461bcd60e51b815260040180806020018281038252602e815260200180610cfc602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610ae857600080fd5b505afa158015610afc573d6000803e3d6000fd5b505050506040513d6020811015610b1257600080fd5b5051610a40576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610be657506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610c4a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610c716040518061024001604052806102208152602001610d2a6102209139610cf1565b505160045550506000805460ff19166001179055662386f26fc10000600555565b6003546001600160401b031681565b6003546801000000000000000090046001600160401b031681565b6040518061024001604052806102208152602001610d2a610220913981565b601181565b61100081565b600381565b61100481565b805160209091019156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001004": { "balance": "176405560900000000000000000", @@ -66,7 +66,7 @@ }, "0x0000000000000000000000000000000000001005": { "balance": "0x0", - "code": "0x6080604052600436106103545760003560e01c80637e434d54116101c6578063bd4cc830116100f7578063e75d72c711610095578063f9a2bbc71161006f578063f9a2bbc7146109da578063fc3e5908146109ef578063fd6a687914610a04578063fdd31fcd14610a1957610393565b8063e75d72c714610968578063e89a30201461099b578063f1fad104146109c557610393565b8063dc927faf116100d1578063dc927faf14610914578063dcae76ab14610929578063df8079e91461093e578063e1c7392a1461095357610393565b8063bd4cc830146108c0578063c81b1662146108ea578063d0ab528a146108ff57610393565b8063a7c6a59d11610164578063ab51bb961161013e578063ab51bb961461079b578063ac431751146107b0578063ace9fcc214610881578063af4006811461089657610393565b8063a7c6a59d1461075c578063aa82dce114610771578063aad560631461078657610393565b80639dc09262116101a05780639dc0926214610708578063a1a11bf51461071d578063a3c3c0ad14610732578063a78abc161461074757610393565b80637e434d54146106ab578063930e1b09146106c057806396713da9146106f357610393565b806343756e5c116102a05780636f93d2e61161023e57806374f2272d1161021857806374f2272d1461065757806375d47a0a1461066c5780637942fd05146106815780637e146cc51461069657610393565b80636f93d2e6146105ce57806370fd5bad1461062d578063718a8aa81461064257610393565b806351b4dce31161027a57806351b4dce31461057a57806351e806721461058f57806354133307146105a45780636e47b482146105b957610393565b806343756e5c14610524578063493279b1146105395780634bf6c8821461056557610393565b806312950c461161030d57806328087028116102e757806328087028146104b15780633a975612146103985780633dffc387146104c657806340bb43c0146104f157610393565b806312950c461461045d5780631b20087c146104725780631c6433121461048757610393565b8063081e9d131461039857806308f2ec06146103bf578063093f2fc4146103d45780630bee7a67146103e95780630e2374a51461041757806310e06a761461044857610393565b36610393576040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600080fd5b3480156103a457600080fd5b506103ad610a4c565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506103ad610a51565b3480156103e057600080fd5b506103ad610a56565b3480156103f557600080fd5b506103fe610a5b565b6040805163ffffffff9092168252519081900360200190f35b34801561042357600080fd5b5061042c610a60565b604080516001600160a01b039092168252519081900360200190f35b34801561045457600080fd5b506103ad610a66565b34801561046957600080fd5b506103ad610a6c565b34801561047e57600080fd5b506103ad610a72565b34801561049357600080fd5b5061042c600480360360208110156104aa57600080fd5b5035610a78565b3480156104bd57600080fd5b5061042c610a9f565b3480156104d257600080fd5b506104db610a4c565b6040805160ff9092168252519081900360200190f35b3480156104fd57600080fd5b506103ad6004803603602081101561051457600080fd5b50356001600160a01b0316610aa5565b34801561053057600080fd5b5061042c610ab7565b34801561054557600080fd5b5061054e610abd565b6040805161ffff9092168252519081900360200190f35b34801561057157600080fd5b506104db610ac2565b34801561058657600080fd5b5061042c610ac7565b34801561059b57600080fd5b5061042c610acd565b3480156105b057600080fd5b506103ad610a5b565b3480156105c557600080fd5b5061042c610ad3565b3480156105da57600080fd5b50610619600480360360808110156105f157600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610ad9565b604080519115158252519081900360200190f35b34801561063957600080fd5b506104db610bab565b34801561064e57600080fd5b506104db610bb0565b34801561066357600080fd5b506103ad610bb5565b34801561067857600080fd5b5061042c610bbb565b34801561068d57600080fd5b506104db610bc1565b3480156106a257600080fd5b506103ad610bc6565b3480156106b757600080fd5b5061042c610bcb565b3480156106cc57600080fd5b506103ad600480360360208110156106e357600080fd5b50356001600160a01b0316610bd1565b3480156106ff57600080fd5b506104db610be3565b34801561071457600080fd5b5061042c610be8565b34801561072957600080fd5b5061042c610bee565b34801561073e57600080fd5b506103ad610bf4565b34801561075357600080fd5b50610619610bfa565b34801561076857600080fd5b506103ad610c03565b34801561077d57600080fd5b5061042c610c09565b34801561079257600080fd5b5061042c610c0f565b3480156107a757600080fd5b506103fe610c15565b3480156107bc57600080fd5b5061087f600480360360408110156107d357600080fd5b8101906020810181356401000000008111156107ee57600080fd5b82018360208201111561080057600080fd5b8035906020019184600183028401116401000000008311171561082257600080fd5b91939092909160208101903564010000000081111561084057600080fd5b82018360208201111561085257600080fd5b8035906020019184600183028401116401000000008311171561087457600080fd5b509092509050610c1a565b005b34801561088d57600080fd5b506103ad610c5a565b3480156108a257600080fd5b506103ad600480360360208110156108b957600080fd5b5035610c60565b3480156108cc57600080fd5b506103ad600480360360208110156108e357600080fd5b5035610cbb565b3480156108f657600080fd5b5061042c610cd4565b34801561090b57600080fd5b506103ad610cda565b34801561092057600080fd5b5061042c610ce0565b34801561093557600080fd5b506103ad610ce6565b34801561094a57600080fd5b5061042c610cec565b34801561095f57600080fd5b5061087f610cf2565b34801561097457600080fd5b5061087f6004803603602081101561098b57600080fd5b50356001600160a01b0316610dbb565b3480156109a757600080fd5b5061042c600480360360208110156109be57600080fd5b5035610f14565b3480156109d157600080fd5b506104db610f21565b3480156109e657600080fd5b5061042c610f26565b3480156109fb57600080fd5b506104db610f2c565b348015610a1057600080fd5b5061042c610f31565b348015610a2557600080fd5b506103ad60048036036020811015610a3c57600080fd5b50356001600160a01b0316610f37565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b60068181548110610a8557fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff16610b31576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361200014610b715760405162461bcd60e51b815260040180806020018281038252602f815260200180610f78602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600281565b601081565b60035481565b61100881565b600b81565b600581565b61200381565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b3361100714610b715760405162461bcd60e51b815260040180806020018281038252602e815260200180610f4a602e913960400191505060405180910390fd5b60025481565b600060288211610c71575080610cb6565b816028108015610c82575060508211155b15610c8f57506028610cb6565b605082118015610ca05750606e8211155b15610cb057506078819003610cb6565b50600481045b919050565b600060288211610ccc575080610cb6565b506028610cb6565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff1615610d4a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610d98576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480610e1a576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f19350505050610eca5760405161100290819084156108fc029085906000818181858888f19350505050158015610e84573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050610f11565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b60088181548110610a8557fe5b601181565b61100081565b600381565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x6080604052600436106103545760003560e01c80637e434d54116101c6578063bd4cc830116100f7578063e75d72c711610095578063f9a2bbc71161006f578063f9a2bbc7146109a2578063fc3e5908146109b7578063fd6a6879146109cc578063fdd31fcd146109e15761035b565b8063e75d72c714610930578063e89a302014610963578063f1fad1041461098d5761035b565b8063dc927faf116100d1578063dc927faf146108dc578063dcae76ab146108f1578063df8079e914610906578063e1c7392a1461091b5761035b565b8063bd4cc83014610888578063c81b1662146108b2578063d0ab528a146108c75761035b565b8063a7c6a59d11610164578063ab51bb961161013e578063ab51bb9614610763578063ac43175114610778578063ace9fcc214610849578063af4006811461085e5761035b565b8063a7c6a59d14610724578063aa82dce114610739578063aad560631461074e5761035b565b80639dc09262116101a05780639dc09262146106d0578063a1a11bf5146106e5578063a3c3c0ad146106fa578063a78abc161461070f5761035b565b80637e434d5414610673578063930e1b091461068857806396713da9146106bb5761035b565b806343756e5c116102a05780636f93d2e61161023e57806374f2272d1161021857806374f2272d1461061f57806375d47a0a146106345780637942fd05146106495780637e146cc51461065e5761035b565b80636f93d2e61461059657806370fd5bad146105f5578063718a8aa81461060a5761035b565b806351b4dce31161027a57806351b4dce31461054257806351e8067214610557578063541333071461056c5780636e47b482146105815761035b565b806343756e5c146104ec578063493279b1146105015780634bf6c8821461052d5761035b565b806312950c461161030d57806328087028116102e757806328087028146104795780633a975612146103605780633dffc3871461048e57806340bb43c0146104b95761035b565b806312950c46146104255780631b20087c1461043a5780631c6433121461044f5761035b565b8063081e9d131461036057806308f2ec0614610387578063093f2fc41461039c5780630bee7a67146103b15780630e2374a5146103df57806310e06a76146104105761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610375610a14565b60408051918252519081900360200190f35b34801561039357600080fd5b50610375610a19565b3480156103a857600080fd5b50610375610a1e565b3480156103bd57600080fd5b506103c6610a23565b6040805163ffffffff9092168252519081900360200190f35b3480156103eb57600080fd5b506103f4610a28565b604080516001600160a01b039092168252519081900360200190f35b34801561041c57600080fd5b50610375610a2e565b34801561043157600080fd5b50610375610a34565b34801561044657600080fd5b50610375610a3a565b34801561045b57600080fd5b506103f46004803603602081101561047257600080fd5b5035610a40565b34801561048557600080fd5b506103f4610a67565b34801561049a57600080fd5b506104a3610a14565b6040805160ff9092168252519081900360200190f35b3480156104c557600080fd5b50610375600480360360208110156104dc57600080fd5b50356001600160a01b0316610a6d565b3480156104f857600080fd5b506103f4610a7f565b34801561050d57600080fd5b50610516610a85565b6040805161ffff9092168252519081900360200190f35b34801561053957600080fd5b506104a3610a8a565b34801561054e57600080fd5b506103f4610a8f565b34801561056357600080fd5b506103f4610a95565b34801561057857600080fd5b50610375610a23565b34801561058d57600080fd5b506103f4610a9b565b3480156105a257600080fd5b506105e1600480360360808110156105b957600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610aa1565b604080519115158252519081900360200190f35b34801561060157600080fd5b506104a3610b73565b34801561061657600080fd5b506104a3610b78565b34801561062b57600080fd5b50610375610b7d565b34801561064057600080fd5b506103f4610b83565b34801561065557600080fd5b506104a3610b89565b34801561066a57600080fd5b50610375610b8e565b34801561067f57600080fd5b506103f4610b93565b34801561069457600080fd5b50610375600480360360208110156106ab57600080fd5b50356001600160a01b0316610b99565b3480156106c757600080fd5b506104a3610bab565b3480156106dc57600080fd5b506103f4610bb0565b3480156106f157600080fd5b506103f4610bb6565b34801561070657600080fd5b50610375610bbc565b34801561071b57600080fd5b506105e1610bc2565b34801561073057600080fd5b50610375610bcb565b34801561074557600080fd5b506103f4610bd1565b34801561075a57600080fd5b506103f4610bd7565b34801561076f57600080fd5b506103c6610bdd565b34801561078457600080fd5b506108476004803603604081101561079b57600080fd5b8101906020810181356401000000008111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111640100000000831117156107ea57600080fd5b91939092909160208101903564010000000081111561080857600080fd5b82018360208201111561081a57600080fd5b8035906020019184600183028401116401000000008311171561083c57600080fd5b509092509050610be2565b005b34801561085557600080fd5b50610375610c22565b34801561086a57600080fd5b506103756004803603602081101561088157600080fd5b5035610c28565b34801561089457600080fd5b50610375600480360360208110156108ab57600080fd5b5035610c83565b3480156108be57600080fd5b506103f4610c9c565b3480156108d357600080fd5b50610375610ca2565b3480156108e857600080fd5b506103f4610ca8565b3480156108fd57600080fd5b50610375610cae565b34801561091257600080fd5b506103f4610cb4565b34801561092757600080fd5b50610847610cba565b34801561093c57600080fd5b506108476004803603602081101561095357600080fd5b50356001600160a01b0316610d83565b34801561096f57600080fd5b506103f46004803603602081101561098657600080fd5b5035610edc565b34801561099957600080fd5b506104a3610ee9565b3480156109ae57600080fd5b506103f4610eee565b3480156109c357600080fd5b506104a3610ef4565b3480156109d857600080fd5b506103f4610ef9565b3480156109ed57600080fd5b5061037560048036036020811015610a0457600080fd5b50356001600160a01b0316610eff565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b60068181548110610a4d57fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff16610af9576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361200014610b395760405162461bcd60e51b815260040180806020018281038252602f815260200180610f40602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600281565b601081565b60035481565b61100881565b600b81565b600581565b61200381565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b3361100714610b395760405162461bcd60e51b815260040180806020018281038252602e815260200180610f12602e913960400191505060405180910390fd5b60025481565b600060288211610c39575080610c7e565b816028108015610c4a575060508211155b15610c5757506028610c7e565b605082118015610c685750606e8211155b15610c7857506078819003610c7e565b50600481045b919050565b600060288211610c94575080610c7e565b506028610c7e565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff1615610d12576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610d60576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480610de2576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f19350505050610e925760405161100290819084156108fc029085906000818181858888f19350505050158015610e4c573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050610ed9565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b60088181548110610a4d57fe5b601181565b61100081565b600381565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001006": { "balance": "0x0", From c1592fb8f7606897cf11320d2528069e38076088 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 10:10:07 +0800 Subject: [PATCH 12/52] fix: fix test after code clean up --- test/GovHub.t.sol | 105 ++++++---------------------------------- test/utils/Deployer.sol | 9 +--- 2 files changed, 18 insertions(+), 96 deletions(-) diff --git a/test/GovHub.t.sol b/test/GovHub.t.sol index d09500b6..8dcecaef 100644 --- a/test/GovHub.t.sol +++ b/test/GovHub.t.sol @@ -13,10 +13,9 @@ contract GovHubTest is Deployer { bytes memory key = "expireTimeSecondGap"; bytes memory valueBytes = abi.encode(value); - vm.expectEmit(false, false, false, true, address(bscValidatorSet)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("unknown param"); _updateParamByGovHub(key, valueBytes, address(bscValidatorSet)); - assertEq(uint256(value), bscValidatorSet.expireTimeSecondGap()); } function testGovTokenHub(uint256 value) public { @@ -26,10 +25,9 @@ contract GovHubTest is Deployer { bytes memory key = "relayFee"; bytes memory valueBytes = abi.encode(value); - vm.expectEmit(false, false, false, true, address(tokenHub)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(tokenHub)); - assertEq(value, tokenHub.relayFee()); } function testGovLightClient(uint256 value) public { @@ -38,24 +36,9 @@ contract GovHubTest is Deployer { bytes memory key = "rewardForValidatorSetChange"; bytes memory valueBytes = abi.encode(value); - vm.expectEmit(false, false, false, true, address(lightClient)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(lightClient)); - assertEq(value, lightClient.rewardForValidatorSetChange()); - } - - function testGovRelayerHub() public { - // removed params - // uint256 dues = relayerHub.dues(); - // vm.assume(uint256(value) > dues); - // vm.assume(value <= 1e21); - // - // bytes memory key = "requiredDeposit"; - // bytes memory valueBytes = abi.encode(value); - // vm.expectEmit(false, false, false, true, address(relayerHub)); - // emit paramChange(string(key), valueBytes); - // _updateParamByGovHub(key, valueBytes, address(relayerHub)); - // assertEq(uint256(value), relayerHub.requiredDeposit()); } function testGovIncentivize(uint256 value1, uint256 value2, uint256 value3) public { @@ -68,24 +51,9 @@ contract GovHubTest is Deployer { bytes memory key = "headerRelayerRewardRateMolecule"; bytes memory valueBytes = abi.encode(value1); - vm.expectEmit(false, false, false, true, address(incentivize)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(incentivize)); - assertEq(value1, incentivize.headerRelayerRewardRateMolecule()); - - key = "headerRelayerRewardRateDenominator"; - valueBytes = abi.encode(value2); - vm.expectEmit(false, false, false, true, address(incentivize)); - emit paramChange(string(key), valueBytes); - _updateParamByGovHub(key, valueBytes, address(incentivize)); - assertEq(value2, incentivize.headerRelayerRewardRateDenominator()); - - key = "callerCompensationDenominator"; - valueBytes = abi.encode(value3); - vm.expectEmit(false, false, false, true, address(incentivize)); - emit paramChange(string(key), valueBytes); - _updateParamByGovHub(key, valueBytes, address(incentivize)); - assertEq(value3, incentivize.callerCompensationDenominator()); } function testGovCrossChain(uint16 value) public { @@ -94,30 +62,26 @@ contract GovHubTest is Deployer { bytes memory key = "batchSizeForOracle"; bytes memory valueBytes = abi.encode(value); - vm.expectEmit(false, false, false, true, address(crossChain)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(crossChain)); - assertEq(uint256(value), crossChain.batchSizeForOracle()); key = "addOrUpdateChannel"; valueBytes = abi.encodePacked(uint8(0x58), uint8(0x00), address(incentivize)); - vm.expectEmit(false, false, false, true, address(crossChain)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(crossChain)); - assertEq(address(incentivize), crossChain.channelHandlerContractMap(0x58)); key = "enableOrDisableChannel"; valueBytes = abi.encodePacked(uint8(0x58), uint8(0x00)); - vm.expectEmit(false, false, false, true, address(crossChain)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(crossChain)); - assertEq(false, crossChain.registeredContractChannelMap(address(incentivize), 0x58)); valueBytes = abi.encodePacked(uint8(0x58), uint8(0x01)); - vm.expectEmit(false, false, false, true, address(crossChain)); - emit paramChange(string(key), valueBytes); + vm.expectEmit(); + emit failReasonWithStr("deprecated"); _updateParamByGovHub(key, valueBytes, address(crossChain)); - assertTrue(crossChain.registeredContractChannelMap(address(incentivize), 0x58)); } function testGovSlash(uint16 value1, uint16 value2) public { @@ -141,41 +105,4 @@ contract GovHubTest is Deployer { _updateParamByGovHub(key, valueBytes, address(slashIndicator)); assertEq(uint256(value2), slashIndicator.misdemeanorThreshold()); } - - function testGovFailed(uint256 value) public { - // unknown key - bytes memory key = "unknownKey"; - bytes memory valueBytes = abi.encode(value); - vm.expectEmit(false, false, false, true, address(govHub)); - emit failReasonWithStr("unknown param"); - _updateParamByGovHub(key, valueBytes, address(bscValidatorSet)); - - // exceed range - key = "expireTimeSecondGap"; - valueBytes = abi.encode(uint256(10)); - vm.expectEmit(false, false, false, true, address(govHub)); - emit failReasonWithStr("the expireTimeSecondGap is out of range"); - _updateParamByGovHub(key, valueBytes, address(bscValidatorSet)); - - // length mismatch - key = "expireTimeSecondGap"; - valueBytes = abi.encodePacked(uint128(10)); - vm.expectEmit(false, false, false, true, address(govHub)); - emit failReasonWithStr("length of expireTimeSecondGap mismatch"); - _updateParamByGovHub(key, valueBytes, address(bscValidatorSet)); - - // address do not exist - key = "expireTimeSecondGap"; - valueBytes = abi.encode(uint256(10)); - vm.expectEmit(false, false, false, true, address(govHub)); - emit failReasonWithStr("the target is not a contract"); - _updateParamByGovHub(key, valueBytes, _getNextUserAddress()); - - // method do no exist - key = "expireTimeSecondGap"; - valueBytes = abi.encode(uint256(10)); - vm.expectEmit(false, false, false, true, address(govHub)); - emit failReasonWithStr("unknown param"); - _updateParamByGovHub(key, valueBytes, address(systemReward)); - } } diff --git a/test/utils/Deployer.sol b/test/utils/Deployer.sol index abfbc756..9b28ad83 100644 --- a/test/utils/Deployer.sol +++ b/test/utils/Deployer.sol @@ -168,13 +168,8 @@ contract Deployer is Test { } function _updateParamByGovHub(bytes memory key, bytes memory value, address addr) internal { - bytes[] memory elements = new bytes[](3); - elements[0] = key.encodeBytes(); - elements[1] = value.encodeBytes(); - elements[2] = addr.encodeAddress(); - - vm.startPrank(address(crossChain)); - govHub.handleSynPackage(GOV_CHANNELID, elements.encodeList()); + vm.startPrank(address(TIMELOCK_ADDR)); + govHub.updateParam(string(key), value, addr); vm.stopPrank(); } From 579bd70c1fa0a302991ba1f956eaad0e0452d92d Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 30 Aug 2024 11:19:33 +0800 Subject: [PATCH 13/52] feat: remove unused code --- contracts/StakeHub.sol | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index dba0ca80..f196afa5 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -29,11 +29,6 @@ contract StakeHub is SystemV2, Initializable, Protectable { uint256 public constant BREATHE_BLOCK_INTERVAL = 1 days; - bytes private constant INIT_BC_CONSENSUS_ADDRESSES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa"; - bytes private constant INIT_BC_VOTE_ADDRESSES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000"; - // receive fund status uint8 private constant _DISABLE = 0; uint8 private constant _ENABLE = 1; @@ -260,18 +255,6 @@ contract StakeHub is SystemV2, Initializable, Protectable { downtimeJailTime = 2 days; felonyJailTime = 30 days; maxFelonyBetweenBreatheBlock = 2; - - address[] memory bcConsensusAddress; - bytes[] memory bcVoteAddress; - bcConsensusAddress = abi.decode(INIT_BC_CONSENSUS_ADDRESSES, (address[])); - bcVoteAddress = abi.decode(INIT_BC_VOTE_ADDRESSES, (bytes[])); - for (uint256 i; i < bcConsensusAddress.length; ++i) { - _legacyConsensusAddress[bcConsensusAddress[i]] = true; - } - for (uint256 i; i < bcVoteAddress.length; ++i) { - _legacyVoteAddress[bcVoteAddress[i]] = true; - } - // Different address will be set depending on the environment __Protectable_init_unchained(0x08E68Ec70FA3b629784fDB28887e206ce8561E08); } From bbc5f237081afabc42c240495100bc3d521742b6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Mon, 2 Sep 2024 21:37:38 +0800 Subject: [PATCH 14/52] feat: remove unused code and imports --- contracts/BSCValidatorSet.sol | 37 +++++++------------ contracts/GovHub.sol | 7 ---- contracts/StakeHub.sol | 14 +++---- contracts/TokenHub.sol | 9 ----- contracts/deprecated/Staking.sol | 5 --- contracts/deprecated/TokenManager.sol | 8 ---- .../interface/0.8.x/IBSCValidatorSet.sol | 1 - contracts/interface/0.8.x/ICrossChain.sol | 6 --- 8 files changed, 20 insertions(+), 67 deletions(-) delete mode 100644 contracts/interface/0.8.x/ICrossChain.sol diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 770a4600..7a835261 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -18,23 +18,15 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica using RLPDecode for *; - // will not transfer value less than 0.1 BNB for validators - uint256 public constant DUSTY_INCOMING = 1e17; - - uint8 public constant JAIL_MESSAGE_TYPE = 1; - uint8 public constant VALIDATORS_UPDATE_MESSAGE_TYPE = 0; - - // the precision of cross chain value transfer. - uint256 public constant PRECISION = 1e10; uint256 public constant MAX_NUM_OF_VALIDATORS = 100; bytes public constant INIT_VALIDATORSET_BYTES = hex"f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000"; - uint32 public constant ERROR_UNKNOWN_PACKAGE_TYPE = 101; - uint32 public constant ERROR_FAIL_CHECK_VALIDATORS = 102; - uint32 public constant ERROR_LEN_OF_VAL_MISMATCH = 103; - uint32 public constant ERROR_RELAYFEE_TOO_LARGE = 104; + uint32 public constant ERROR_UNKNOWN_PACKAGE_TYPE = 101; // @dev deprecated + uint32 public constant ERROR_FAIL_CHECK_VALIDATORS = 102; // @dev deprecated + uint32 public constant ERROR_LEN_OF_VAL_MISMATCH = 103; // @dev deprecated + uint32 public constant ERROR_RELAYFEE_TOO_LARGE = 104; // @dev deprecated uint256 public constant INIT_NUM_OF_CABINETS = 21; uint256 public constant EPOCH = 200; @@ -144,27 +136,27 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica /*----------------- events -----------------*/ event validatorSetUpdated(); - event validatorJailed(address indexed validator); - event validatorEmptyJailed(address indexed validator); - event batchTransfer(uint256 amount); - event batchTransferFailed(uint256 indexed amount, string reason); - event batchTransferLowerFailed(uint256 indexed amount, bytes reason); + event validatorJailed(address indexed validator); // @dev deprecated + event validatorEmptyJailed(address indexed validator); // @dev deprecated + event batchTransfer(uint256 amount); // @dev deprecated + event batchTransferFailed(uint256 indexed amount, string reason); // @dev deprecated + event batchTransferLowerFailed(uint256 indexed amount, bytes reason); // @dev deprecated event systemTransfer(uint256 amount); - event directTransfer(address payable indexed validator, uint256 amount); - event directTransferFail(address payable indexed validator, uint256 amount); + event directTransfer(address payable indexed validator, uint256 amount); // @dev deprecated + event directTransferFail(address payable indexed validator, uint256 amount); // @dev deprecated event deprecatedDeposit(address indexed validator, uint256 amount); event validatorDeposit(address indexed validator, uint256 amount); event validatorMisdemeanor(address indexed validator, uint256 amount); event validatorFelony(address indexed validator, uint256 amount); - event failReasonWithStr(string message); - event unexpectedPackage(uint8 channelId, bytes msgBytes); + event failReasonWithStr(string message); // @dev deprecated + event unexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated event paramChange(string key, bytes value); event feeBurned(uint256 amount); event validatorEnterMaintenance(address indexed validator); event validatorExitMaintenance(address indexed validator); event finalityRewardDeposit(address indexed validator, uint256 amount); event deprecatedFinalityRewardDeposit(address indexed validator, uint256 amount); - event tmpValidatorSetUpdated(uint256 validatorsNum); + event tmpValidatorSetUpdated(uint256 validatorsNum); // @dev deprecated /*----------------- init -----------------*/ function init() external onlyNotInit { @@ -242,7 +234,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica // step 3: do update validator set state totalInComing = 0; - numOfJailed = 0; if (validatorSetTemp.length != 0) { doUpdateState(validatorSetTemp, voteAddrsTemp); } diff --git a/contracts/GovHub.sol b/contracts/GovHub.sol index b125d1dd..1aebabd3 100644 --- a/contracts/GovHub.sol +++ b/contracts/GovHub.sol @@ -1,17 +1,10 @@ pragma solidity 0.6.4; import "./System.sol"; -import "./lib/0.6.x/BytesToTypes.sol"; -import "./lib/0.6.x/Memory.sol"; -import "./lib/0.6.x/BytesLib.sol"; import "./interface/0.6.x/IParamSubscriber.sol"; import "./interface/0.6.x/IApplication.sol"; -import "./lib/0.6.x/RLPDecode.sol"; -import "./lib/0.6.x/CmnPkg.sol"; contract GovHub is System, IApplication { - using RLPDecode for *; - uint8 public constant PARAM_UPDATE_MESSAGE_TYPE = 0; uint32 public constant ERROR_TARGET_NOT_CONTRACT = 101; diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index f196afa5..9454c70f 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -10,11 +10,9 @@ import "./extension/Protectable.sol"; import "./interface/0.8.x/IBSCValidatorSet.sol"; import "./interface/0.8.x/IGovToken.sol"; import "./interface/0.8.x/IStakeCredit.sol"; -import "./lib/0.8.x/RLPDecode.sol"; import "./lib/0.8.x/Utils.sol"; contract StakeHub is SystemV2, Initializable, Protectable { - using RLPDecode for *; using Utils for string; using Utils for bytes; using EnumerableSet for EnumerableSet.AddressSet; @@ -120,11 +118,11 @@ contract StakeHub is SystemV2, Initializable, Protectable { mapping(bytes => uint256) public voteExpiration; // legacy addresses of BC - mapping(address => bool) private _legacyConsensusAddress; // @dev deprecated - mapping(bytes => bool) private _legacyVoteAddress; // @dev deprecated + mapping(address => bool) private _legacyConsensusAddress; // @dev deprecated + mapping(bytes => bool) private _legacyVoteAddress; // @dev deprecated // total number of current jailed validators - uint256 public numOfJailed; // @dev deprecated + uint256 public numOfJailed; // @dev deprecated // max number of jailed validators between breathe block(only for malicious vote and double sign) uint256 public maxFelonyBetweenBreatheBlock; // index(timestamp / breatheBlockInterval) => number of malicious vote and double sign slash @@ -216,11 +214,11 @@ contract StakeHub is SystemV2, Initializable, Protectable { event ValidatorEmptyJailed(address indexed operatorAddress); event ValidatorUnjailed(address indexed operatorAddress); event Claimed(address indexed operatorAddress, address indexed delegator, uint256 bnbAmount); - event MigrateSuccess(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); // @dev deprecated + event MigrateSuccess(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); // @dev deprecated event MigrateFailed( address indexed operatorAddress, address indexed delegator, uint256 bnbAmount, StakeMigrationRespCode respCode - ); // @dev deprecated - event UnexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated + ); // @dev deprecated + event UnexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated event AgentChanged(address indexed operatorAddress, address indexed oldAgent, address indexed newAgent); /*----------------- modifiers -----------------*/ diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index cd01dbd8..4e0edd49 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -6,20 +6,11 @@ import "./interface/0.6.x/IParamSubscriber.sol"; import "./interface/0.6.x/IApplication.sol"; import "./interface/0.6.x/ISystemReward.sol"; import "./lib/0.6.x/SafeMath.sol"; -import "./lib/0.6.x/RLPEncode.sol"; -import "./lib/0.6.x/RLPDecode.sol"; -import "./lib/0.6.x/Memory.sol"; import "./System.sol"; contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemReward { using SafeMath for uint256; - using RLPEncode for *; - using RLPDecode for *; - - using RLPDecode for RLPDecode.RLPItem; - using RLPDecode for RLPDecode.Iterator; - // BEP-171: Security Enhancement for Cross-Chain Module struct LockInfo { uint256 amount; diff --git a/contracts/deprecated/Staking.sol b/contracts/deprecated/Staking.sol index 83e50331..6687fc5e 100644 --- a/contracts/deprecated/Staking.sol +++ b/contracts/deprecated/Staking.sol @@ -4,15 +4,10 @@ import "../System.sol"; import "../interface/0.6.x/IApplication.sol"; import "../interface/0.6.x/IParamSubscriber.sol"; import "../interface/0.6.x/IStaking.sol"; -import "../lib/0.6.x/Memory.sol"; -import "../lib/0.6.x/RLPEncode.sol"; -import "../lib/0.6.x/RLPDecode.sol"; import "../lib/0.6.x/SafeMath.sol"; contract Staking is IStaking, System, IParamSubscriber, IApplication { using SafeMath for uint256; - using RLPEncode for *; - using RLPDecode for *; // Cross Stake Event type uint8 public constant EVENT_DELEGATE = 0x01; diff --git a/contracts/deprecated/TokenManager.sol b/contracts/deprecated/TokenManager.sol index 57476e89..6ca22604 100644 --- a/contracts/deprecated/TokenManager.sol +++ b/contracts/deprecated/TokenManager.sol @@ -4,19 +4,11 @@ import "../interface/0.6.x/IBEP20.sol"; import "../interface/0.6.x/IApplication.sol"; import "../interface/0.6.x/IParamSubscriber.sol"; import "../lib/0.6.x/SafeMath.sol"; -import "../lib/0.6.x/RLPEncode.sol"; -import "../lib/0.6.x/RLPDecode.sol"; import "../System.sol"; contract TokenManager is System, IApplication, IParamSubscriber { using SafeMath for uint256; - using RLPEncode for *; - using RLPDecode for *; - - using RLPDecode for RLPDecode.RLPItem; - using RLPDecode for RLPDecode.Iterator; - // BC to BSC struct BindSynPackage { uint8 packageType; diff --git a/contracts/interface/0.8.x/IBSCValidatorSet.sol b/contracts/interface/0.8.x/IBSCValidatorSet.sol index a66287f0..592991f6 100644 --- a/contracts/interface/0.8.x/IBSCValidatorSet.sol +++ b/contracts/interface/0.8.x/IBSCValidatorSet.sol @@ -3,5 +3,4 @@ pragma solidity 0.8.17; interface IBSCValidatorSet { function felony(address consensusAddress) external; - function removeTmpMigratedValidator(address consensusAddress) external; } diff --git a/contracts/interface/0.8.x/ICrossChain.sol b/contracts/interface/0.8.x/ICrossChain.sol deleted file mode 100644 index 8b4767e6..00000000 --- a/contracts/interface/0.8.x/ICrossChain.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.17; - -interface ICrossChain { - function registeredContractChannelMap(address, uint8) external view returns (bool); -} From 0e96eced51b3039d937af8455b7a8dcda1dab735 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 10:04:54 +0800 Subject: [PATCH 15/52] feat: remove _legacyConsensusAddress and _legacyVoteAddress check --- contracts/StakeHub.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 9454c70f..789f9544 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -317,10 +317,10 @@ contract StakeHub is SystemV2, Initializable, Protectable { if (_validatorSet.contains(operatorAddress)) revert ValidatorExisted(); if (agentToOperator[operatorAddress] != address(0)) revert InvalidValidator(); - if (consensusToOperator[consensusAddress] != address(0) || _legacyConsensusAddress[consensusAddress]) { + if (consensusToOperator[consensusAddress] != address(0)) { revert DuplicateConsensusAddress(); } - if (voteToOperator[voteAddress] != address(0) || _legacyVoteAddress[voteAddress]) { + if (voteToOperator[voteAddress] != address(0)) { revert DuplicateVoteAddress(); } bytes32 monikerHash = keccak256(abi.encodePacked(description.moniker)); @@ -369,7 +369,7 @@ contract StakeHub is SystemV2, Initializable, Protectable { address newConsensusAddress ) external whenNotPaused notInBlackList validatorExist(_bep410MsgSender()) { if (newConsensusAddress == address(0)) revert InvalidConsensusAddress(); - if (consensusToOperator[newConsensusAddress] != address(0) || _legacyConsensusAddress[newConsensusAddress]) { + if (consensusToOperator[newConsensusAddress] != address(0)) { revert DuplicateConsensusAddress(); } @@ -436,7 +436,7 @@ contract StakeHub is SystemV2, Initializable, Protectable { // proof-of-possession verify address operatorAddress = _bep410MsgSender(); if (!_checkVoteAddress(operatorAddress, newVoteAddress, blsProof)) revert InvalidVoteAddress(); - if (voteToOperator[newVoteAddress] != address(0) || _legacyVoteAddress[newVoteAddress]) { + if (voteToOperator[newVoteAddress] != address(0)) { revert DuplicateVoteAddress(); } From 7ed2991d7833d4a1b5bbcd2c6e5896d8ed35620c Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 14:38:49 +0800 Subject: [PATCH 16/52] fix: removed deprecated comment --- contracts/StakeHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 789f9544..df04bca3 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -122,7 +122,7 @@ contract StakeHub is SystemV2, Initializable, Protectable { mapping(bytes => bool) private _legacyVoteAddress; // @dev deprecated // total number of current jailed validators - uint256 public numOfJailed; // @dev deprecated + uint256 public numOfJailed; // max number of jailed validators between breathe block(only for malicious vote and double sign) uint256 public maxFelonyBetweenBreatheBlock; // index(timestamp / breatheBlockInterval) => number of malicious vote and double sign slash From d1a8a563c0181140fd57b1c7439290b10a890497 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 14:40:19 +0800 Subject: [PATCH 17/52] fix: move events --- contracts/StakeHub.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index df04bca3..8aee033a 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -214,12 +214,13 @@ contract StakeHub is SystemV2, Initializable, Protectable { event ValidatorEmptyJailed(address indexed operatorAddress); event ValidatorUnjailed(address indexed operatorAddress); event Claimed(address indexed operatorAddress, address indexed delegator, uint256 bnbAmount); + event AgentChanged(address indexed operatorAddress, address indexed oldAgent, address indexed newAgent); + event MigrateSuccess(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); // @dev deprecated event MigrateFailed( address indexed operatorAddress, address indexed delegator, uint256 bnbAmount, StakeMigrationRespCode respCode ); // @dev deprecated event UnexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated - event AgentChanged(address indexed operatorAddress, address indexed oldAgent, address indexed newAgent); /*----------------- modifiers -----------------*/ modifier validatorExist(address operatorAddress) { From 4db83b836b7f6399dc7dbe10753c2f8806a201f4 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 14:47:12 +0800 Subject: [PATCH 18/52] fix: move events --- contracts/BSCValidatorSet.sol | 19 ++++++++++--------- contracts/SlashIndicator.sol | 5 ++--- contracts/TokenHub.sol | 9 ++++----- contracts/deprecated/RelayerHub.sol | 2 +- contracts/deprecated/RelayerIncentivize.sol | 3 ++- contracts/deprecated/Staking.sol | 3 ++- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 7a835261..dde4a691 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -136,26 +136,27 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica /*----------------- events -----------------*/ event validatorSetUpdated(); - event validatorJailed(address indexed validator); // @dev deprecated - event validatorEmptyJailed(address indexed validator); // @dev deprecated - event batchTransfer(uint256 amount); // @dev deprecated - event batchTransferFailed(uint256 indexed amount, string reason); // @dev deprecated - event batchTransferLowerFailed(uint256 indexed amount, bytes reason); // @dev deprecated event systemTransfer(uint256 amount); - event directTransfer(address payable indexed validator, uint256 amount); // @dev deprecated - event directTransferFail(address payable indexed validator, uint256 amount); // @dev deprecated event deprecatedDeposit(address indexed validator, uint256 amount); event validatorDeposit(address indexed validator, uint256 amount); event validatorMisdemeanor(address indexed validator, uint256 amount); event validatorFelony(address indexed validator, uint256 amount); - event failReasonWithStr(string message); // @dev deprecated - event unexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated event paramChange(string key, bytes value); event feeBurned(uint256 amount); event validatorEnterMaintenance(address indexed validator); event validatorExitMaintenance(address indexed validator); event finalityRewardDeposit(address indexed validator, uint256 amount); event deprecatedFinalityRewardDeposit(address indexed validator, uint256 amount); + + event validatorJailed(address indexed validator); // @dev deprecated + event validatorEmptyJailed(address indexed validator); // @dev deprecated + event batchTransfer(uint256 amount); // @dev deprecated + event batchTransferFailed(uint256 indexed amount, string reason); // @dev deprecated + event batchTransferLowerFailed(uint256 indexed amount, bytes reason); // @dev deprecated + event directTransfer(address payable indexed validator, uint256 amount); // @dev deprecated + event directTransferFail(address payable indexed validator, uint256 amount); // @dev deprecated + event failReasonWithStr(string message); // @dev deprecated + event unexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated event tmpValidatorSetUpdated(uint256 validatorsNum); // @dev deprecated /*----------------- init -----------------*/ diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index 99eaa7b9..5aa10d53 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -44,16 +44,15 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati uint256 public felonySlashScope; event validatorSlashed(address indexed validator); - event maliciousVoteSlashed(bytes32 indexed voteAddrSlice); // @dev deprecated event indicatorCleaned(); event paramChange(string key, bytes value); + event failedFelony(address indexed validator, uint256 slashCount, bytes failReason); + event maliciousVoteSlashed(bytes32 indexed voteAddrSlice); // @dev deprecated event knownResponse(uint32 code); // @dev deprecated event unKnownResponse(uint32 code); // @dev deprecated event crashResponse(); // @dev deprecated - event failedFelony(address indexed validator, uint256 slashCount, bytes failReason); - struct Indicator { uint256 height; uint256 count; diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index 4e0edd49..a9587439 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -57,18 +57,17 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR mapping(address => mapping(address => LockInfo)) public lockInfoMap; uint8 internal reentryLock; + event rewardTo(address to, uint256 amount); + event receiveDeposit(address from, uint256 amount); + event WithdrawUnlockedToken(address indexed tokenAddr, address indexed recipient, uint256 amount); + event transferInSuccess(address bep20Addr, address refundAddr, uint256 amount); // @dev deprecated event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee); // @dev deprecated event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status); // @dev deprecated event refundFailure(address bep20Addr, address refundAddr, uint256 amount, uint32 status); // @dev deprecated - event rewardTo(address to, uint256 amount); - event receiveDeposit(address from, uint256 amount); event unexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated event paramChange(string key, bytes value); // @dev deprecated - - // BEP-171: Security Enhancement for Cross-Chain Module event LargeTransferLocked(address indexed tokenAddr, address indexed recipient, uint256 amount, uint256 unlockAt); // @dev deprecated - event WithdrawUnlockedToken(address indexed tokenAddr, address indexed recipient, uint256 amount); event CancelTransfer(address indexed tokenAddr, address indexed attacker, uint256 amount); // @dev deprecated event LargeTransferLimitSet(address indexed tokenAddr, address indexed owner, uint256 largeTransferLimit); // @dev deprecated diff --git a/contracts/deprecated/RelayerHub.sol b/contracts/deprecated/RelayerHub.sol index 41c8d406..67cff839 100644 --- a/contracts/deprecated/RelayerHub.sol +++ b/contracts/deprecated/RelayerHub.sol @@ -51,8 +51,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } event relayerUnRegister(address _relayer); - event paramChange(string key, bytes value); // @dev deprecated + event paramChange(string key, bytes value); // @dev deprecated event managerRemoved(address _removedManager); // @dev deprecated event managerAdded(address _addedManager); // @dev deprecated event relayerUpdated(address _from, address _to); // @dev deprecated diff --git a/contracts/deprecated/RelayerIncentivize.sol b/contracts/deprecated/RelayerIncentivize.sol index 92713f67..673e11bf 100644 --- a/contracts/deprecated/RelayerIncentivize.sol +++ b/contracts/deprecated/RelayerIncentivize.sol @@ -40,11 +40,12 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { uint256 public dynamicExtraIncentiveAmount; // @dev deprecated + event rewardToRelayer(address relayer, uint256 amount); + event distributeCollectedReward( uint256 sequence, uint256 roundRewardForHeaderRelayer, uint256 roundRewardForTransferRelayer ); // @dev deprecated event paramChange(string key, bytes value); // @dev deprecated - event rewardToRelayer(address relayer, uint256 amount); function init() external onlyNotInit { require(!alreadyInit, "already initialized"); diff --git a/contracts/deprecated/Staking.sol b/contracts/deprecated/Staking.sol index 6687fc5e..d2a379e1 100644 --- a/contracts/deprecated/Staking.sol +++ b/contracts/deprecated/Staking.sol @@ -77,6 +77,8 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { } /*----------------- Events -----------------*/ + event rewardClaimed(address indexed delegator, uint256 amount); + event delegateSubmitted(address indexed delegator, address indexed validator, uint256 amount, uint256 relayerFee); // @dev deprecated event undelegateSubmitted(address indexed delegator, address indexed validator, uint256 amount, uint256 relayerFee); // @dev deprecated event redelegateSubmitted( @@ -87,7 +89,6 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { uint256 relayerFee ); // @dev deprecated event rewardReceived(address indexed delegator, uint256 amount); // @dev deprecated - event rewardClaimed(address indexed delegator, uint256 amount); event undelegatedReceived(address indexed delegator, address indexed validator, uint256 amount); // @dev deprecated event undelegatedClaimed(address indexed delegator, uint256 amount); event delegateSuccess(address indexed delegator, address indexed validator, uint256 amount); // @dev deprecated From 246a073a72e8fadeb33b44524ecb155251397f40 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 14:49:32 +0800 Subject: [PATCH 19/52] feat: deprecate withdrawUnlockToken in TokenHub.sol --- contracts/TokenHub.sol | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index a9587439..e494e1d7 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -59,8 +59,8 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR event rewardTo(address to, uint256 amount); event receiveDeposit(address from, uint256 amount); - event WithdrawUnlockedToken(address indexed tokenAddr, address indexed recipient, uint256 amount); + event WithdrawUnlockedToken(address indexed tokenAddr, address indexed recipient, uint256 amount); // @dev deprecated event transferInSuccess(address bep20Addr, address refundAddr, uint256 amount); // @dev deprecated event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee); // @dev deprecated event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status); // @dev deprecated @@ -192,22 +192,7 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR // BEP-171: Security Enhancement for Cross-Chain Module function withdrawUnlockedToken(address tokenAddress, address recipient) external noReentrant { - LockInfo storage lockInfo = lockInfoMap[tokenAddress][recipient]; - require(lockInfo.amount > 0, "no locked amount"); - require(block.timestamp >= lockInfo.unlockAt, "still on locking period"); - - uint256 _amount = lockInfo.amount; - lockInfo.amount = 0; - - bool _success; - if (tokenAddress == address(0x0)) { - (_success,) = recipient.call{ gas: MAX_GAS_FOR_TRANSFER_BNB, value: _amount }(""); - } else { - _success = IBEP20(tokenAddress).transfer{ gas: MAX_GAS_FOR_CALLING_BEP20 }(recipient, _amount); - } - require(_success, "withdraw unlocked token failed"); - - emit WithdrawUnlockedToken(tokenAddress, recipient, _amount); + revert("deprecated"); } // BEP-171: Security Enhancement for Cross-Chain Module From 23ab1e26b624607aa89cbe05f9ba34b9811e6588 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 15:08:31 +0800 Subject: [PATCH 20/52] feat: remove unused constants --- contracts/BSCValidatorSet.sol | 5 ---- contracts/GovHub.sol | 2 -- contracts/System.sol | 8 ------ contracts/SystemV2.sol | 3 -- contracts/TokenHub.sol | 14 ---------- contracts/deprecated/CrossChain.sol | 20 ------------- contracts/deprecated/RelayerHub.sol | 3 -- contracts/deprecated/RelayerIncentivize.sol | 23 --------------- contracts/deprecated/Staking.sol | 15 ---------- contracts/deprecated/TokenManager.sol | 31 --------------------- 10 files changed, 124 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index dde4a691..1c8f9d0d 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -23,11 +23,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica bytes public constant INIT_VALIDATORSET_BYTES = hex"f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000"; - uint32 public constant ERROR_UNKNOWN_PACKAGE_TYPE = 101; // @dev deprecated - uint32 public constant ERROR_FAIL_CHECK_VALIDATORS = 102; // @dev deprecated - uint32 public constant ERROR_LEN_OF_VAL_MISMATCH = 103; // @dev deprecated - uint32 public constant ERROR_RELAYFEE_TOO_LARGE = 104; // @dev deprecated - uint256 public constant INIT_NUM_OF_CABINETS = 21; uint256 public constant EPOCH = 200; diff --git a/contracts/GovHub.sol b/contracts/GovHub.sol index 1aebabd3..4a930d4b 100644 --- a/contracts/GovHub.sol +++ b/contracts/GovHub.sol @@ -5,8 +5,6 @@ import "./interface/0.6.x/IParamSubscriber.sol"; import "./interface/0.6.x/IApplication.sol"; contract GovHub is System, IApplication { - uint8 public constant PARAM_UPDATE_MESSAGE_TYPE = 0; - uint32 public constant ERROR_TARGET_NOT_CONTRACT = 101; uint32 public constant ERROR_TARGET_CONTRACT_FAIL = 102; diff --git a/contracts/System.sol b/contracts/System.sol index 10eb27bc..9dc8c0e3 100644 --- a/contracts/System.sol +++ b/contracts/System.sol @@ -8,16 +8,8 @@ contract System { bool public alreadyInit; uint32 public constant CODE_OK = 0; - uint32 public constant ERROR_FAIL_DECODE = 100; - uint8 public constant BIND_CHANNELID = 0x01; - uint8 public constant TRANSFER_IN_CHANNELID = 0x02; - uint8 public constant TRANSFER_OUT_CHANNELID = 0x03; uint8 public constant STAKING_CHANNELID = 0x08; - uint8 public constant GOV_CHANNELID = 0x09; - uint8 public constant SLASH_CHANNELID = 0x0b; - uint8 public constant CROSS_STAKE_CHANNELID = 0x10; - uint8 public constant BC_FUSION_CHANNELID = 0x11; // new channel id for cross-chain redelegate from Beacon Chain to Smart Chain after Feynman upgrade uint16 public constant bscChainID = 0x0038; address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; diff --git a/contracts/SystemV2.sol b/contracts/SystemV2.sol index d7520425..9b198a5c 100644 --- a/contracts/SystemV2.sol +++ b/contracts/SystemV2.sol @@ -3,9 +3,6 @@ pragma solidity 0.8.17; contract SystemV2 { /*----------------- constants -----------------*/ - uint8 public constant STAKING_CHANNELID = 0x08; - uint8 public constant BC_FUSION_CHANNELID = 0x11; // new channel id for cross-chain redelegate from Beacon Chain to Smart Chain after Feynman upgrade - address internal constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; address internal constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001; address internal constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002; diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index e494e1d7..90dc4b65 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -17,22 +17,10 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR uint256 unlockAt; } - // transfer in channel - uint8 public constant TRANSFER_IN_SUCCESS = 0; - uint8 public constant TRANSFER_IN_FAILURE_TIMEOUT = 1; - uint8 public constant TRANSFER_IN_FAILURE_UNBOUND_TOKEN = 2; - uint8 public constant TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE = 3; - uint8 public constant TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT = 4; - uint8 public constant TRANSFER_IN_FAILURE_UNKNOWN = 5; - uint256 public constant MAX_BEP2_TOTAL_SUPPLY = 9000000000000000000; - uint8 public constant MINIMUM_BEP20_SYMBOL_LEN = 2; - uint8 public constant MAXIMUM_BEP20_SYMBOL_LEN = 8; uint8 public constant BEP2_TOKEN_DECIMALS = 8; bytes32 public constant BEP2_TOKEN_SYMBOL_FOR_BNB = 0x424E420000000000000000000000000000000000000000000000000000000000; // "BNB" - uint256 public constant MAX_GAS_FOR_CALLING_BEP20 = 50000; - uint256 public constant MAX_GAS_FOR_TRANSFER_BNB = 10000; uint256 public constant INIT_MINIMUM_RELAY_FEE = 2e15; uint256 public constant REWARD_UPPER_LIMIT = 1e18; @@ -45,8 +33,6 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR mapping(bytes32 => address) private bep2SymbolToContractAddr; // BEP-171: Security Enhancement for Cross-Chain Module - uint256 public constant INIT_BNB_LARGE_TRANSFER_LIMIT = 10000 ether; - uint256 public constant INIT_LOCK_PERIOD = 12 hours; // the lock period for large cross-chain transfer uint256 public lockPeriod; // @dev deprecated // the lock Period for token recover diff --git a/contracts/deprecated/CrossChain.sol b/contracts/deprecated/CrossChain.sol index 43617e88..d7919761 100644 --- a/contracts/deprecated/CrossChain.sol +++ b/contracts/deprecated/CrossChain.sol @@ -8,12 +8,6 @@ import "../interface/0.6.x/IParamSubscriber.sol"; import "../System.sol"; contract CrossChain is System, ICrossChain, IParamSubscriber { - // constant variables - string public constant STORE_NAME = "ibc"; - uint256 public constant CROSS_CHAIN_KEY_PREFIX = 0x01003800; // last 6 bytes - uint8 public constant SYN_PACKAGE = 0x00; - uint8 public constant ACK_PACKAGE = 0x01; - uint8 public constant FAIL_ACK_PACKAGE = 0x02; uint256 public constant INIT_BATCH_SIZE = 50; // governable parameters @@ -32,20 +26,6 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { // to prevent the utilization of ancient block header mapping(uint8 => uint64) public channelSyncedHeaderMap; - // BEP-171: Security Enhancement for Cross-Chain Module - // 0xebbda044f67428d7e9b472f9124983082bcda4f84f5148ca0a9ccbe06350f196 - bytes32 public constant SUSPEND_PROPOSAL = keccak256("SUSPEND_PROPOSAL"); - // 0xcf82004e82990eca84a75e16ba08aa620238e076e0bc7fc4c641df44bbf5b55a - bytes32 public constant REOPEN_PROPOSAL = keccak256("REOPEN_PROPOSAL"); - // 0x605b57daa79220f76a5cdc8f5ee40e59093f21a4e1cec30b9b99c555e94c75b9 - bytes32 public constant CANCEL_TRANSFER_PROPOSAL = keccak256("CANCEL_TRANSFER_PROPOSAL"); - // 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 - bytes32 public constant EMPTY_CONTENT_HASH = keccak256(""); - uint16 public constant INIT_SUSPEND_QUORUM = 1; - uint16 public constant INIT_REOPEN_QUORUM = 2; - uint16 public constant INIT_CANCEL_TRANSFER_QUORUM = 2; - uint256 public constant EMERGENCY_PROPOSAL_EXPIRE_PERIOD = 1 hours; - bool public isSuspended; // proposal type hash => latest emergency proposal mapping(bytes32 => EmergencyProposal) public emergencyProposals; // @dev deprecated diff --git a/contracts/deprecated/RelayerHub.sol b/contracts/deprecated/RelayerHub.sol index 67cff839..41564dd5 100644 --- a/contracts/deprecated/RelayerHub.sol +++ b/contracts/deprecated/RelayerHub.sol @@ -13,9 +13,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; - address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; - address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; - uint256 internal requiredDeposit; // have to keep it to not break the storage layout uint256 internal dues; diff --git a/contracts/deprecated/RelayerIncentivize.sol b/contracts/deprecated/RelayerIncentivize.sol index 673e11bf..c1b82768 100644 --- a/contracts/deprecated/RelayerIncentivize.sol +++ b/contracts/deprecated/RelayerIncentivize.sol @@ -11,9 +11,6 @@ import "../interface/0.6.x/ISystemReward.sol"; contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { using SafeMath for uint256; - uint256 public constant ROUND_SIZE = 100; - uint256 public constant MAXIMUM_WEIGHT = 40; - uint256 public constant HEADER_RELAYER_REWARD_RATE_MOLECULE = 1; uint256 public constant HEADER_RELAYER_REWARD_RATE_DENOMINATOR = 5; uint256 public constant CALLER_COMPENSATION_MOLECULE = 1; @@ -81,26 +78,6 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { emit rewardToRelayer(relayerAddr, reward); } - function calculateTransferRelayerWeight(uint256 count) public pure returns (uint256) { - if (count <= MAXIMUM_WEIGHT) { - return count; - } else if (MAXIMUM_WEIGHT < count && count <= 2 * MAXIMUM_WEIGHT) { - return MAXIMUM_WEIGHT; - } else if (2 * MAXIMUM_WEIGHT < count && count <= (2 * MAXIMUM_WEIGHT + 3 * MAXIMUM_WEIGHT / 4)) { - return 3 * MAXIMUM_WEIGHT - count; - } else { - return count / 4; - } - } - - function calculateHeaderRelayerWeight(uint256 count) public pure returns (uint256) { - if (count <= MAXIMUM_WEIGHT) { - return count; - } else { - return MAXIMUM_WEIGHT; - } - } - function updateParam(string calldata key, bytes calldata value) external override onlyGov { revert("deprecated"); } diff --git a/contracts/deprecated/Staking.sol b/contracts/deprecated/Staking.sol index d2a379e1..fd975833 100644 --- a/contracts/deprecated/Staking.sol +++ b/contracts/deprecated/Staking.sol @@ -9,22 +9,7 @@ import "../lib/0.6.x/SafeMath.sol"; contract Staking is IStaking, System, IParamSubscriber, IApplication { using SafeMath for uint256; - // Cross Stake Event type - uint8 public constant EVENT_DELEGATE = 0x01; - uint8 public constant EVENT_UNDELEGATE = 0x02; - uint8 public constant EVENT_REDELEGATE = 0x03; - uint8 public constant EVENT_DISTRIBUTE_REWARD = 0x04; - uint8 public constant EVENT_DISTRIBUTE_UNDELEGATED = 0x05; - - // ack package status code - uint8 public constant CODE_FAILED = 0; - uint8 public constant CODE_SUCCESS = 1; - - // Error code - uint32 public constant ERROR_WITHDRAW_BNB = 101; - uint256 public constant TEN_DECIMALS = 1e10; - uint256 public constant LOCK_TIME = 8 days; // 8*24*3600 second uint256 public constant INIT_RELAYER_FEE = 16 * 1e15; uint256 public constant INIT_BSC_RELAYER_FEE = 1 * 1e16; diff --git a/contracts/deprecated/TokenManager.sol b/contracts/deprecated/TokenManager.sol index 6ca22604..a65b71d7 100644 --- a/contracts/deprecated/TokenManager.sol +++ b/contracts/deprecated/TokenManager.sol @@ -20,37 +20,6 @@ contract TokenManager is System, IApplication, IParamSubscriber { uint64 expireTime; } - uint8 public constant BIND_PACKAGE = 0; - uint8 public constant UNBIND_PACKAGE = 1; - - // bind status - uint8 public constant BIND_STATUS_TIMEOUT = 1; - uint8 public constant BIND_STATUS_SYMBOL_MISMATCH = 2; - uint8 public constant BIND_STATUS_TOO_MUCH_TOKENHUB_BALANCE = 3; - uint8 public constant BIND_STATUS_TOTAL_SUPPLY_MISMATCH = 4; - uint8 public constant BIND_STATUS_DECIMALS_MISMATCH = 5; - uint8 public constant BIND_STATUS_ALREADY_BOUND_TOKEN = 6; - uint8 public constant BIND_STATUS_REJECTED = 7; - - uint8 public constant MIRROR_CHANNELID = 0x04; - uint8 public constant SYNC_CHANNELID = 0x05; - uint8 public constant BEP2_TOKEN_DECIMALS = 8; - uint256 public constant MAX_GAS_FOR_TRANSFER_BNB = 10000; - uint256 public constant MAX_BEP2_TOTAL_SUPPLY = 9000000000000000000; - uint256 public constant LOG_MAX_UINT256 = 77; - // mirror status - uint8 public constant MIRROR_STATUS_TIMEOUT = 1; - uint8 public constant MIRROR_STATUS_DUPLICATED_BEP2_SYMBOL = 2; - uint8 public constant MIRROR_STATUS_ALREADY_BOUND = 3; - // sync status - uint8 public constant SYNC_STATUS_TIMEOUT = 1; - uint8 public constant SYNC_STATUS_NOT_BOUND_MIRROR = 2; - - uint8 public constant MINIMUM_BEP20_SYMBOL_LEN = 2; - uint8 public constant MAXIMUM_BEP20_SYMBOL_LEN = 8; - - uint256 public constant TEN_DECIMALS = 1e10; - mapping(bytes32 => BindSynPackage) public bindPackageRecord; mapping(address => bool) public mirrorPendingRecord; // @dev deprecated From 7f893f551704e7946786a334e014ee5407259ad8 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 15:16:47 +0800 Subject: [PATCH 21/52] feat: remove unused code --- contracts/deprecated/CrossChain.sol | 34 ----------------------------- 1 file changed, 34 deletions(-) diff --git a/contracts/deprecated/CrossChain.sol b/contracts/deprecated/CrossChain.sol index d7919761..0a062266 100644 --- a/contracts/deprecated/CrossChain.sol +++ b/contracts/deprecated/CrossChain.sol @@ -139,40 +139,6 @@ contract CrossChain is System, ICrossChain, IParamSubscriber { alreadyInit = true; } - function encodePayload( - uint8 packageType, - uint256 relayFee, - bytes memory msgBytes - ) public pure returns (bytes memory) { - uint256 payloadLength = msgBytes.length + 33; - bytes memory payload = new bytes(payloadLength); - uint256 ptr; - assembly { - ptr := payload - } - ptr += 33; - - assembly { - mstore(ptr, relayFee) - } - - ptr -= 32; - assembly { - mstore(ptr, packageType) - } - - ptr -= 1; - assembly { - mstore(ptr, payloadLength) - } - - ptr += 65; - (uint256 src,) = Memory.fromBytes(msgBytes); - Memory.copy(src, ptr, msgBytes.length); - - return payload; - } - function handlePackage( bytes calldata payload, bytes calldata proof, From 543f3118e42940116d789fa5316e27cd09b46354 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 15:27:33 +0800 Subject: [PATCH 22/52] feat: remove flattened folder --- contracts/flattened/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contracts/flattened/.gitkeep diff --git a/contracts/flattened/.gitkeep b/contracts/flattened/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 71bfbc01119775b5aa38d09b8d4d144aea7ee898 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 15:31:02 +0800 Subject: [PATCH 23/52] fix: fix genesis bytecode generate script and sync genesis.json --- genesis.json | 34 +++++++++++++++++----------------- scripts/generate.py | 8 -------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/genesis.json b/genesis.json index 89acbb6f..b0008266 100644 --- a/genesis.json +++ b/genesis.json @@ -46,71 +46,71 @@ }, "0x0000000000000000000000000000000000001000": { "balance": "0x0", - "code": "0x6080604052600436106105115760003560e01c80638b5ad0c911610297578063c81b166211610165578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d82578063f9a2bbc714610d97578063fc3e590814610dac578063fccc281314610dc1578063fd4ad81f14610dd6578063fd6a687914610e0557610518565b8063e40716a114610cf0578063ea321e4914610d05578063eb57e20214610d25578063eda5868c14610d45578063f1fad10414610d5a578063f340fa0114610d6f57610518565b8063d86222d51161011e578063d86222d514610c72578063daacdb6614610c87578063dc927faf14610c9c578063df8079e914610cb1578063e086c7b114610cc6578063e1c7392a14610cdb57610518565b8063c81b166214610bfe578063c8509d81146109a3578063cb75a59214610c13578063ce910b0c14610c28578063d58918ae14610c48578063d68fb56a14610c5d57610518565b8063aa82dce111610209578063aef198a9116101c2578063aef198a914610b88578063b7ab4db514610b9d578063b8cf4ef114610bbf578063bf9f499514610729578063c466689d14610bd4578063c6d3394514610be957610518565b8063aa82dce114610af4578063aad5606314610b09578063aaf5eb6814610b1e578063ab51bb9614610b33578063ac43175114610b48578063ad3c9da614610b6857610518565b80639dc092621161025b5780639dc0926214610a765780639fe0f81614610a8b578063a0dc275814610aa0578063a1a11bf514610ab5578063a5422d5c14610aca578063a78abc1614610adf57610518565b80638b5ad0c914610a025780638c5d749d14610a175780638d19a41014610a2c5780639369d7de14610a4c57806396713da914610a6157610518565b80635192c82c116103df578063718a8aa81161034657806381650b62116102ff57806381650b6214610979578063820dcaa81461098e578063831d65d1146109a357806386249882146109c357806388b32f11146109d85780638a7beb01146109ed57610518565b8063718a8aa8146108fb57806375d47a0a1461091057806378dfed4a146109255780637942fd051461093a5780637a84ca2a1461094f5780637e434d541461096457610518565b80635d77156c116103985780635d77156c1461085557806360eba4fe1461086a57806362b72cf51461088a5780636969a25c1461089f5780636e47b482146108d157806370fd5bad146108e657610518565b80635192c82c146107c157806351b4dce3146107d657806351e80672146107eb57806355614fcc14610800578063565c56b3146108205780635667515a1461084057610518565b80632a0ffb6e116104835780633dffc3871161043c5780633dffc3871461072957806343756e5c1461074b57806345cf9daf14610760578063493279b1146107755780634bf6c882146107975780634df6e0c3146107ac57610518565b80632a0ffb6e14610666578063300c356714610686578063321d398a146106a65780633365af3a146106c657806335409f7f146106e65780633b071dcc1461070657610518565b8063152ad3b8116104d5578063152ad3b8146105d05780631bd14ed8146105f25780631e4c1524146106075780631ff1806914610627578063219f22d51461063c578063280870281461065157610518565b806304c4fec61461051d57806307a56847146105345780630bee7a671461055f5780630e2374a5146105815780631182b875146105a357610518565b3661051857005b600080fd5b34801561052957600080fd5b50610532610e1a565b005b34801561054057600080fd5b50610549610e8e565b6040516105569190616fb1565b60405180910390f35b34801561056b57600080fd5b50610574610e94565b6040516105569190616fe4565b34801561058d57600080fd5b50610596610e99565b6040516105569190616367565b3480156105af57600080fd5b506105c36105be36600461624d565b610e9f565b6040516105569190616487565b3480156105dc57600080fd5b506105e5610fbb565b604051610556919061647c565b3480156105fe57600080fd5b50610549610fc4565b34801561061357600080fd5b5061053261062236600461607b565b610fca565b34801561063357600080fd5b50610549611303565b34801561064857600080fd5b50610574611309565b34801561065d57600080fd5b5061059661130e565b34801561067257600080fd5b50610532610681366004615fdb565b611314565b34801561069257600080fd5b506105326106a1366004616013565b611335565b3480156106b257600080fd5b506105e56106c13660046161fa565b61167e565b3480156106d257600080fd5b506105e56106e13660046161fa565b61174d565b3480156106f257600080fd5b50610532610701366004615fdb565b6117fe565b34801561071257600080fd5b5061071b611963565b60405161055692919061640c565b34801561073557600080fd5b5061073e611c3f565b6040516105569190616ff5565b34801561075757600080fd5b50610596611c44565b34801561076c57600080fd5b50610549611c4a565b34801561078157600080fd5b5061078a611c50565b6040516105569190616fa2565b3480156107a357600080fd5b5061073e611c55565b3480156107b857600080fd5b5061071b611c5a565b3480156107cd57600080fd5b50610549611de6565b3480156107e257600080fd5b50610596611dec565b3480156107f757600080fd5b50610596611df2565b34801561080c57600080fd5b506105e561081b366004615fdb565b611df8565b34801561082c57600080fd5b5061054961083b366004615fdb565b611e34565b34801561084c57600080fd5b5061073e611e85565b34801561086157600080fd5b50610574611e8a565b34801561087657600080fd5b506105c36108853660046161fa565b611e8f565b34801561089657600080fd5b50610549611f35565b3480156108ab57600080fd5b506108bf6108ba3660046161fa565b611f3b565b60405161055696959493929190616394565b3480156108dd57600080fd5b50610596611f9f565b3480156108f257600080fd5b5061073e611fa5565b34801561090757600080fd5b5061073e611faa565b34801561091c57600080fd5b50610596611faf565b34801561093157600080fd5b50610549611fb5565b34801561094657600080fd5b5061073e611fbb565b34801561095b57600080fd5b50610549611fc0565b34801561097057600080fd5b50610596611fc6565b34801561098557600080fd5b50610574611fcc565b34801561099a57600080fd5b50610549611fd1565b3480156109af57600080fd5b506105326109be36600461624d565b611fd7565b3480156109cf57600080fd5b50610549611ff8565b3480156109e457600080fd5b50610549611ffe565b3480156109f957600080fd5b506105e5612004565b348015610a0e57600080fd5b5061054961200d565b348015610a2357600080fd5b50610549612013565b348015610a3857600080fd5b50610549610a47366004615fdb565b612030565b348015610a5857600080fd5b50610532612070565b348015610a6d57600080fd5b5061073e612184565b348015610a8257600080fd5b50610596612189565b348015610a9757600080fd5b5061054961218f565b348015610aac57600080fd5b50610549612194565b348015610ac157600080fd5b50610596612199565b348015610ad657600080fd5b506105c361219f565b348015610aeb57600080fd5b506105e56121be565b348015610b0057600080fd5b506105966121c7565b348015610b1557600080fd5b506105966121cd565b348015610b2a57600080fd5b506105496121d3565b348015610b3f57600080fd5b50610574611e85565b348015610b5457600080fd5b50610532610b6336600461619e565b6121dc565b348015610b7457600080fd5b50610549610b83366004615fdb565b612bce565b348015610b9457600080fd5b50610549612be0565b348015610ba957600080fd5b50610bb2612bed565b60405161055691906163f9565b348015610bcb57600080fd5b50610549612cd8565b348015610be057600080fd5b50610549612cdd565b348015610bf557600080fd5b50610549611fa5565b348015610c0a57600080fd5b50610596612ce3565b348015610c1f57600080fd5b50610549612ce9565b348015610c3457600080fd5b506105c3610c433660046161fa565b612cef565b348015610c5457600080fd5b50610549612cfc565b348015610c6957600080fd5b50610549612d02565b348015610c7e57600080fd5b50610549612d41565b348015610c9357600080fd5b50610549612d4d565b348015610ca857600080fd5b50610596612d53565b348015610cbd57600080fd5b50610596612d59565b348015610cd257600080fd5b50610549610e94565b348015610ce757600080fd5b50610532612d5f565b348015610cfc57600080fd5b50610549612f08565b348015610d1157600080fd5b506105e5610d2036600461615f565b612f0e565b348015610d3157600080fd5b50610532610d40366004615fdb565b613094565b348015610d5157600080fd5b5061057461319c565b348015610d6657600080fd5b5061073e6131a1565b610532610d7d366004615fdb565b6131a6565b348015610d8e57600080fd5b5061054961355c565b348015610da357600080fd5b50610596613562565b348015610db857600080fd5b5061073e61218f565b348015610dcd57600080fd5b50610596613568565b348015610de257600080fd5b50610df6610df13660046161fa565b61356e565b60405161055693929190616fba565b348015610e1157600080fd5b50610596613630565b6000610e2533612030565b9050600b8181548110610e3457fe5b600091825260209091206001601690920201015460ff16610e705760405162461bcd60e51b8152600401610e6790616c59565b60405180910390fd5b6000610e7a612d02565b9050610e893383836001613636565b505050565b60095481565b606481565b61200181565b60005460609060ff16610ec45760405162461bcd60e51b8152600401610e679061660f565b3361200014610ee55760405162461bcd60e51b8152600401610e6790616dba565b600b54610fa357610ef4615b87565b60015460005b81811015610f9f57600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff1916911515919091179055604086015180518794610f7b936000805160206170aa833981519152909101920190615bb6565b506060820151610f919060038301906013615c30565b505050806001019050610efa565b5050505b60405162461bcd60e51b8152600401610e67906168be565b60075460ff1681565b600f5481565b334114610fe95760405162461bcd60e51b8152600401610e6790616e09565b3a156110075760405162461bcd60e51b8152600401610e6790616b98565b825160408051828152602080840282010190915260609082801561104557816020015b611032615c5d565b81526020019060019003908161102a5790505b50905060005b828110156110ef576040518060c0016040528087838151811061106a57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020018683815181106110ac57fe5b60200260200101516001600160401b0316815260200160001515815260200160008152508282815181106110dc57fe5b602090810291909101015260010161104b565b506060806110fd8386613828565b9150915060005b6001548110156111f35760006001828154811061111d57fe5b9060005260206000209060040201600301549050806000146111ea5760006001838154811061114857fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061117c57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526111b7926001600160a01b039092169101616367565b6000604051808303818588803b1580156111d057600080fd5b505af11580156111e4573d6000803e3d6000fd5b50505050505b50600101611104565b504715611261577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516112299190616fb1565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561125f573d6000803e3d6000fd5b505b6000600381905560055581511561127c5761127c8282613d12565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b3361200214610fa35760405162461bcd60e51b8152600401610e6790616f6b565b3341146113545760405162461bcd60e51b8152600401610e6790616e09565b60105443116113755760405162461bcd60e51b8152600401610e67906167e8565b3a156113935760405162461bcd60e51b8152600401610e6790616b98565b60005460ff166113b55760405162461bcd60e51b8152600401610e679061660f565b60006110023168056bc75e2d631000008111156113ec576113e58168056bc75e2d6310000063ffffffff61450116565b91506113f3565b5050611674565b6040516309a99b4f60e41b815261100290639a99b4f09061141a903090869060040161637b565b602060405180830381600087803b15801561143457600080fd5b505af1158015611448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146c9190616212565b91508161147a575050611674565b6000805b848110156114a85785858281811061149257fe5b905060200201358201915080600101905061147e565b50806114b657505050611674565b6000806000805b8981101561166c57848989838181106114d257fe5b905060200201358802816114e257fe5b0493508a8a828181106114f157fe5b90506020020160208101906115069190615fdb565b6001600160a01b0381166000908152600460205260409020549093509150811561162257600060018084038154811061153b57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156115a857836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858660405161159b9190616fb1565b60405180910390a261161c565b6003546115bb908663ffffffff61454316565b60039081558101546115d3908663ffffffff61454316565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611613908890616fb1565b60405180910390a25b50611664565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858560405161165b9190616fb1565b60405180910390a25b6001016114bd565b505050505050505b5050436010555050565b600154600090821061169257506000611748565b60006001600160a01b0316600183815481106116aa57fe5b60009182526020909120600490910201546001600160a01b031614806116da575060085415806116da5750600a54155b806116e9575060085460095410155b806116fa57506116f88261174d565b155b8061172357506000600b838154811061170f57fe5b906000526020600020906016020160000154115b8061173757506001611733612bed565b5111155b1561174457506000611748565b5060015b919050565b600154600090821061176157506000611748565b600b54821061179e576001828154811061177757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611748565b600182815481106117ab57fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156117f85750600b82815481106117df57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b546118bc5761180d615b87565b60015460005b818110156118b857600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff1916911515919091179055604086015180518794611894936000805160206170aa833981519152909101920190615bb6565b5060608201516118aa9060038301906013615c30565b505050806001019050611813565b5050505b3361100114806118cd575033612002145b6118e95760405162461bcd60e51b8152600401610e6790616646565b6001600160a01b0381166000908152600460205260409020548061190d5750611960565b6001810390506000600b828154811061192257fe5b600091825260209091206001601690920201015460ff1690506119458383614568565b801561194e5750805b15610e89576009805460001901905550505b50565b60015460609081906000805b828110156119b6576001818154811061198457fe5b9060005260206000209060040201600201601c9054906101000a900460ff166119ae576001909101905b60010161196f565b506060816040519080825280602002602001820160405280156119e3578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611a1c57816020015b6060815260200190600190039081611a075790505b50600b5460009450909150841415611b975760005b84811015611b915760018181548110611a4657fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611b895760018181548110611a7657fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611aa157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b8181548110611ace57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015611b665780601f10611b3b57610100808354040283529160200191611b66565b820191906000526020600020905b815481529060010190602001808311611b4957829003601f168201915b5050505050828581518110611b7757fe5b60209081029190910101526001909301925b600101611a31565b50611c33565b60005b84811015611c315760018181548110611baf57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611c295760018181548110611bdf57fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611c0a57fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611b9a565b505b909450925050505b9091565b600181565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c5411611c76576015611c7a565b600c545b90506060611c86612bed565b90506060611c938261492b565b905082825111611caa579094509250611c3b915050565b83838351031015611cbc578282510393505b8315611cf25760c84304611cd883838388880360008a8a614a99565b611cf08383838888038989038a8b8b8b510301614a99565b505b606083604051908082528060200260200182016040528015611d1e578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611d5757816020015b6060815260200190600190039081611d425790505b50905060005b85811015611dd857848181518110611d7157fe5b6020026020010151838281518110611d8557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611db157fe5b6020026020010151828281518110611dc557fe5b6020908102919091010152600101611d5d565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611e20576000915050611748565b60001901611e2d8161174d565b9392505050565b6001600160a01b03811660009081526004602052604081205480611e5c576000915050611748565b600180820381548110611e6b57fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611e9c57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611f2d5780601f10611f0257610100808354040283529160200191611f2d565b820191906000526020600020905b815481529060010190602001808311611f1057829003601f168201915b505050505081565b60105481565b60018181548110611f4857fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b3361200014610fa35760405162461bcd60e51b8152600401610e6790616dba565b60025481565b60115481565b60145460ff1681565b600a5481565b6000601754600014156120285750600161202d565b506017545b90565b6001600160a01b038116600090815260046020526040812054806120665760405162461bcd60e51b8152600401610e6790616d42565b6000190192915050565b600b5461212e5761207f615b87565b60015460005b8181101561212a57600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff1916911515919091179055604086015180518794612106936000805160206170aa833981519152909101920190615bb6565b50606082015161211c9060038301906013615c30565b505050806001019050612085565b5050505b60085461213b5760036008555b600a54612148576002600a555b600061215333612030565b905061215e8161167e565b61217a5760405162461bcd60e51b8152600401610e6790616b14565b6119603382614bf0565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef81526020016170ca6105ef913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166121fe5760405162461bcd60e51b8152600401610e679061660f565b336110071461221f5760405162461bcd60e51b8152600401610e6790616bc6565b61227f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614c889050565b1561233457602081146122a45760405162461bcd60e51b8152600401610e67906164cc565b604080516020601f84018190048102820181019092528281526000916122e291858580838501838280828437600092019190915250614ce192505050565b905061271061230e601854612302600f548561454390919063ffffffff16565b9063ffffffff61454316565b111561232c5760405162461bcd60e51b8152600401610e67906168e2565b600655612b8b565b61239e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614c889050565b1561243857602081146123c35760405162461bcd60e51b8152600401610e6790616503565b604080516020601f840181900481028201810190925282815260009161240191858580838501838280828437600092019190915250614ce192505050565b600c5490915080612410575060155b80821061242f5760405162461bcd60e51b8152600401610e679061682a565b50600855612b8b565b6124a184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614c889050565b1561253a57602081146124c65760405162461bcd60e51b8152600401610e6790616595565b604080516020601f840181900481028201810190925282815260009161250491858580838501838280828437600092019190915250614ce192505050565b90506000811180156125165750600a81105b6125325760405162461bcd60e51b8152600401610e6790616e9e565b600a55612b8b565b6125ae84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614c889050565b1561263d57602081146125d35760405162461bcd60e51b8152600401610e6790616549565b604080516020601f840181900481028201810190925282815260009161261191858580838501838280828437600092019190915250614ce192505050565b9050600d548111156126355760405162461bcd60e51b8152600401610e67906169eb565b600e55612b8b565b6126a684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614c889050565b1561272857602081146126cb5760405162461bcd60e51b8152600401610e6790616c14565b604080516020601f840181900481028201810190925282815260009161270991858580838501838280828437600092019190915250614ce192505050565b600d819055600e5490915081101561272257600d54600e555b50612b8b565b61278c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614c889050565b1561283a57602081146127b15760405162461bcd60e51b8152600401610e67906165da565b604080516020601f84018190048102820181019092528281526000916127ef91858580838501838280828437600092019190915250614ce192505050565b9050600081116128115760405162461bcd60e51b8152600401610e6790616743565b60648111156128325760405162461bcd60e51b8152600401610e679061678b565b600c55612b8b565b6128a684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614c889050565b1561294f57602081146128cb5760405162461bcd60e51b8152600401610e6790616e56565b604080516020601f840181900481028201810190925282815260009161290991858580838501838280828437600092019190915250614ce192505050565b90506127106129296018546123026006548561454390919063ffffffff16565b11156129475760405162461bcd60e51b8152600401610e67906166b4565b600f55612b8b565b6129c384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614c889050565b15612a6c57602081146129e85760405162461bcd60e51b8152600401610e6790616971565b604080516020601f8401819004810282018101909252828152600091612a2691858580838501838280828437600092019190915250614ce192505050565b9050612710612a46600f546123026006548561454390919063ffffffff16565b1115612a645760405162461bcd60e51b8152600401610e6790616a85565b601855612b8b565b612acd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614c889050565b15612b735760208114612af25760405162461bcd60e51b8152600401610e6790616887565b604080516020601f8401819004810282018101909252828152600091612b3091858580838501838280828437600092019190915250614ce192505050565b905060038110158015612b44575060098111155b80612b4f5750806001145b612b6b5760405162461bcd60e51b8152600401610e6790616cbc565b601755612b8b565b60405162461bcd60e51b8152600401610e6790616efb565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051612bc0949392919061649a565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612c1c57612c088161174d565b15612c14578160010191505b600101612bf7565b50606081604051908082528060200260200182016040528015612c49578160200160208202803683370190505b5090506000915060005b83811015612cd057612c648161174d565b15612cc85760018181548110612c7657fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612ca157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612c53565b509250505090565b601581565b61027181565b61100281565b60175481565b60138181548110611e9c57fe5b60185481565b6000612d0c612bed565b519050600080600c5411612d21576015612d25565b600c545b905080821115612d33578091505b81612d3d57600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff1615612d825760405162461bcd60e51b8152600401610e6790616c85565b612d8a615c92565b6000612db06040518061062001604052806105ef81526020016170ca6105ef9139614ce6565b9150915080612dd15760405162461bcd60e51b8152600401610e6790616d79565b60005b826020015151811015612ef657600183602001518281518110612df357fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612ec957fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612dd4565b50506000805460ff1916600117905550565b600d5481565b601354600090815b8181101561301757612fff85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612f6757fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ff55780601f10612fca57610100808354040283529160200191612ff5565b820191906000526020600020905b815481529060010190602001808311612fd857829003601f168201915b5050505050614ea2565b1561300f576001925050506117f8565b600101612f16565b5060125460005b818110156130885761306f86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612f6757fe5b1561308057600193505050506117f8565b60010161301e565b50600095945050505050565b33611001146130b55760405162461bcd60e51b8152600401610e6790616f22565b600b54613173576130c4615b87565b60015460005b8181101561316f57600b8054600181018255600091909152835160008051602061708a83398151915260169092029182019081556020808601516000805160206176b98339815191528401805460ff191691151591909117905560408601518051879461314b936000805160206170aa833981519152909101920190615bb6565b5060608201516131619060038301906013615c30565b5050508060010190506130ca565b5050505b600061317e82614f06565b90506131898161167e565b15613198576131988282614bf0565b5050565b606581565b601181565b3341146131c55760405162461bcd60e51b8152600401610e6790616e09565b60005460ff166131e75760405162461bcd60e51b8152600401610e679061660f565b600034116132075760405162461bcd60e51b8152600401610e67906169bc565b3a156132255760405162461bcd60e51b8152600401610e6790616b98565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661326557610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561327c57506000601854115b156132a157600160175403601754438161329257fe5b06601854028161329e57fe5b04015b6000831180156132b15750600081115b1561335e5760006132da6127106132ce348563ffffffff61508916565b9063ffffffff6150c316565b9050801561335c576040516110029082156108fc029083906000818181858888f19350505050158015613311573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516133419190616fb1565b60405180910390a1613359848263ffffffff61450116565b93505b505b60008311801561337057506000600654115b156134165760006133926127106132ce6006543461508990919063ffffffff16565b905080156134145760405161dead9082156108fc029083906000818181858888f193505050501580156133c9573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516133f99190616fb1565b60405180910390a1613411848263ffffffff61450116565b93505b505b811561351457600060018084038154811061342d57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561349a57846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48560405161348d9190616fb1565b60405180910390a261350e565b6003546134ad908563ffffffff61454316565b60039081558101546134c5908563ffffffff61454316565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590613505908790616fb1565b60405180910390a25b50613556565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48460405161354d9190616fb1565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061357b57fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff909116949192918301828280156136265780601f106135fb57610100808354040283529160200191613626565b820191906000526020600020905b81548152906001019060200180831161360957829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613647575082155b806136525750600954155b1561365f57506000613820565b600960008154600190039190508190555060006136aa600a546132ce866132ce600b8a8154811061368c57fe5b6000918252602090912060169091020154439063ffffffff61450116565b90506000600b86815481106136bb57fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b15801561372057600080fd5b505afa158015613734573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613758919061622a565b91509150600093508083106137d6576137718888614568565b506040516328aa02b160e01b8152611001906328aa02b19061379b908b9087908a906004016163d6565b600060405180830381600087803b1580156137b557600080fd5b505af11580156137c9573d6000803e3d6000fd5b50505050600193506137e8565b8183106137e8576137e688614f06565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b606080600080808080613839612d02565b6001549091505b8015613a6b57600181039250600b838154811061385957fe5b600091825260209091206001601690920201015460ff1661387957613a62565b6001838154811061388657fe5b600091825260208220600490910201546001600160a01b031695506138b090869085908590613636565b9350836138bc57613a62565b60405163436aa28360e11b81526000908190612002906386d54506906138e6908a90600401616367565b60206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139369190615ff7565b90506001600160a01b038116156139bf576040516302ceee9160e11b81526120029063059ddd229061396c908490600401616367565b60206040518083038186803b15801561398457600080fd5b505afa158015613998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139bc9190615ff7565b91505b60005b8c51811015613a5e57876001600160a01b03168d82815181106139e157fe5b6020026020010151600001516001600160a01b03161480613a2a5750826001600160a01b03168d8281518110613a1357fe5b6020026020010151600001516001600160a01b0316145b15613a565760018d8281518110613a3d57fe5b6020908102919091010151901515608090910152613a5e565b6001016139c2565b5050505b60001901613840565b5060005b8951811015613ad857898181518110613a8457fe5b60200260200101516080015180613ac4575060006001600160a01b03168a8281518110613aad57fe5b6020026020010151600001516001600160a01b0316145b15613ad0578560010195505b600101613a6f565b5088518510613bc05760408051600180825281830190925290816020015b613afe615c5d565b815260200190600190039081613af6575050604080516001808252818301909252919850602082015b6060815260200190600190039081613b2757905050955088600081518110613b4b57fe5b602002602001015187600081518110613b6057fe5b602002602001018190525087600081518110613b7857fe5b602002602001015186600081518110613b8d57fe5b6020026020010181905250600087600081518110613ba757fe5b6020908102919091010151901515608090910152613d05565b84895103604051908082528060200260200182016040528015613bfd57816020015b613bea615c5d565b815260200190600190039081613be25790505b50965084895103604051908082528060200260200182016040528015613c3757816020015b6060815260200190600190039081613c225790505b5095506000915060005b8951811015613d0357898181518110613c5657fe5b602002602001015160800151158015613c99575060006001600160a01b03168a8281518110613c8157fe5b6020026020010151600001516001600160a01b031614155b15613cfb57898181518110613caa57fe5b6020026020010151888481518110613cbe57fe5b6020026020010181905250888181518110613cd557fe5b6020026020010151878481518110613ce957fe5b60200260200101819052508260010192505b600101613c41565b505b50505050505b9250929050565b600154825160005b82811015613e2f576001613d2c615c5d565b60018381548110613d3957fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613e0357878181518110613dc957fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613dfb5760009250613e03565b600101613db5565b508115613e255780516001600160a01b03166000908152600460205260408120555b5050600101613d1a565b5080821115613eee57805b82811015613eec576001805480613e4d57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613ea057fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613ed26002830182615cb6565b613ee0600383016000615cfa565b50509055600101613e3a565b505b6000818310613efd5781613eff565b825b905060005b818110156142a357613fb1868281518110613f1b57fe5b602002602001015160018381548110613f3057fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615105565b614165578060010160046000888481518110613fc957fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061400557fe5b60200260200101516001828154811061401a57fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106140d557fe5b6020026020010151600b82815481106140ea57fe5b9060005260206000209060160201600201908051906020019061410e929190615bb6565b506000600b828154811061411e57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061414f57fe5b600091825260209091206016909102015561429b565b85818151811061417157fe5b6020026020010151606001516001828154811061418a57fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b031602179055506142508582815181106141ce57fe5b6020026020010151600b83815481106141e357fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612ff55780601f10612fca57610100808354040283529160200191612ff5565b61429b5784818151811061426057fe5b6020026020010151600b828154811061427557fe5b90600052602060002090601602016002019080519060200190614299929190615bb6565b505b600101613f04565b508282111561447b576142b4615b87565b835b83811015614478578581815181106142ca57fe5b6020026020010151826040018190525060018782815181106142e857fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b805492830181559093528451601690910260008051602061708a8339815191528101918255858301516000805160206176b98339815191528201805491151560ff199092169190911790559285015180518694929361441e936000805160206170aa83398151915201920190615bb6565b5060608201516144349060038301906013615c30565b505050806001016004600089848151811061444b57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016142b6565b50505b614483615161565b61448b615343565b6000600981905560015493505b838110156144f9576000600b82815481106144af57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106144e057fe5b6000918252602090912060169091020155600101614498565b505050505050565b6000611e2d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615531565b600082820183811015611e2d5760405162461bcd60e51b8152600401610e679061667d565b6000806001838154811061457857fe5b906000526020600020906004020160030154905060006001808054905003905060016145a2612bed565b51116145d7576000600185815481106145b757fe5b9060005260206000209060040201600301819055506000925050506117f8565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516146109190616fb1565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156147fd576001816001018154811061465157fe5b90600052602060002090600402016001828154811061466c57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061472d57fe5b9060005260206000209060160201600b828154811061474857fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff199092169190911790556002808401805461479f938386019390821615610100026000190190911604615d09565b506147b260038281019084016013615d7e565b509050508060010160046000600184815481106147cb57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614633565b50600180548061480957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061485c57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061488e6002830182615cb6565b61489c600383016000615cfa565b5050905560008183816148ab57fe5b049050801561491f5760015460005b8181101561491c576148f383600183815481106148d357fe5b90600052602060002090600402016003015461454390919063ffffffff16565b6001828154811061490057fe5b60009182526020909120600360049092020101556001016148ba565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561496a57816020015b60608152602001906001900390816149555790505b50600b549091508314614981579250611748915050565b60005b82811015614a9057600b6001600460008985815181106149a057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106149d457fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015614a6c5780601f10614a4157610100808354040283529160200191614a6c565b820191906000526020600020905b815481529060010190602001808311614a4f57829003601f168201915b5050505050828281518110614a7d57fe5b6020908102919091010152600101614984565b50949350505050565b60005b82811015614be65760008287838801604051602001614abc929190616359565b6040516020818303038152906040528051906020012060001c81614adc57fe5b06905080850182870114614bdd5760008983880181518110614afa57fe5b6020026020010151905060608984890181518110614b1457fe5b602002602001015190508a83880181518110614b2c57fe5b60200260200101518b858a0181518110614b4257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b84890181518110614b7157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508983880181518110614b9f57fe5b60200260200101518a858a0181518110614bb557fe5b6020026020010181905250808a84890181518110614bcf57fe5b602002602001018190525050505b50600101614a9c565b5050505050505050565b600980546001908101909155600b805483908110614c0a57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b8281548110614c4057fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614c9b919061633d565b6040516020818303038152906040528051906020012083604051602001614cc2919061633d565b6040516020818303038152906040528051906020012014905092915050565b015190565b614cee615c92565b6000614cf8615c92565b614d00615da8565b614d11614d0c8661555d565b615582565b90506000805b614d20836155cc565b15614e945780614d4557614d3b614d36846155ed565b61563b565b60ff168452614e8c565b8060011415614e87576060614d61614d5c856155ed565b6156bb565b90508051604051908082528060200260200182016040528015614d9e57816020015b614d8b615c5d565b815260200190600190039081614d835790505b5085602001819052508051604051908082528060200260200182016040528015614ddc57816020015b6060815260200190600190039081614dc75790505b50604086015260005b8151811015614e7c57614df6615c5d565b60606000614e16858581518110614e0957fe5b602002602001015161578c565b92509250925080614e36578860009a509a50505050505050505050614e9d565b8289602001518581518110614e4757fe5b60200260200101819052508189604001518581518110614e6357fe5b6020026020010181905250505050806001019050614de5565b506001925050614e8c565b614e94565b600101614d17565b50919350909150505b915091565b815181516000916001918114808314614ebe5760009250614efc565b600160208701838101602088015b600284838510011415614ef7578051835114614eeb5760009650600093505b60209283019201614ecc565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614f2f57506000199050611748565b600181039050600060018281548110614f4457fe5b9060005260206000209060040201600301549050600060018381548110614f6757fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614fc0908590616fb1565b60405180910390a280614fd857829350505050611748565b6000818381614fe357fe5b049050801561507f5760005b848110156150315761500882600183815481106148d357fe5b6001828154811061501557fe5b6000918252602090912060036004909202010155600101614fef565b50600180549085015b8181101561507c5761505383600183815481106148d357fe5b6001828154811061506057fe5b600091825260209091206003600490920201015560010161503a565b50505b5091949350505050565b600082615098575060006117f8565b828202828482816150a557fe5b0414611e2d5760405162461bcd60e51b8152600401610e6790616b57565b6000611e2d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506158a6565b805182516000916001600160a01b03918216911614801561513f575081602001516001600160a01b031683602001516001600160a01b0316145b8015611e2d5750506040908101519101516001600160a01b0390811691161490565b601254601354808211156151ac57805b828110156151aa57601280548061518457fe5b6001900381819060005260206000200160006151a09190615cb6565b9055600101615171565b505b60008183106151bb57816151bd565b825b905060005b818110156152d55761527a601282815481106151da57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156152685780601f1061523d57610100808354040283529160200191615268565b820191906000526020600020905b81548152906001019060200180831161524b57829003601f168201915b505050505060138381548110612f6757fe5b6152cd576013818154811061528b57fe5b90600052602060002001601282815481106152a257fe5b9060005260206000200190805460018160011615610100020316600290046152cb929190615d09565b505b6001016151c2565b5082821115610e8957825b82811015613556576012601382815481106152f757fe5b600091825260208083208454600181810187559585529190932092909101805461533a949390920192909160026101009282161592909202600019011604615d09565b506001016152e0565b601354600b548082111561538e57805b8281101561538c57601380548061536657fe5b6001900381819060005260206000200160006153829190615cb6565b9055600101615353565b505b600081831061539d578161539f565b825b905060005b818110156154be5761545c601382815481106153bc57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561544a5780601f1061541f5761010080835404028352916020019161544a565b820191906000526020600020905b81548152906001019060200180831161542d57829003601f168201915b5050505050600b83815481106141e357fe5b6154b657600b818154811061546d57fe5b90600052602060002090601602016002016013828154811061548b57fe5b9060005260206000200190805460018160011615610100020316600290046154b4929190615d09565b505b6001016153a4565b5082821115610e8957825b82811015613556576013600b82815481106154e057fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461552895939094019390926000199082161561010002011604615d09565b506001016154c9565b600081848411156155555760405162461bcd60e51b8152600401610e679190616487565b505050900390565b615565615dc8565b506040805180820190915281518152602082810190820152919050565b61558a615da8565b615593826158dd565b61559c57600080fd5b60006155ab8360200151615917565b60208085015160408051808201909152868152920190820152915050919050565b60006155d6615dc8565b505080518051602091820151919092015191011190565b6155f5615dc8565b6155fe826155cc565b61560757600080fd5b602082015160006156178261597a565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061565057508151602110155b61565957600080fd5b60006156688360200151615917565b9050808360000151101561568e5760405162461bcd60e51b8152600401610e6790616d0b565b825160208085015183018051928490039291831015614a9057506020919091036101000a90049392505050565b60606156c6826158dd565b6156cf57600080fd5b60006156da83615a5b565b905060608160405190808252806020026020018201604052801561571857816020015b615705615dc8565b8152602001906001900390816156fd5790505b509050600061572a8560200151615917565b60208601510190506000805b84811015615781576157478361597a565b915060405180604001604052808381526020018481525084828151811061576a57fe5b602090810291909101015291810191600101615736565b509195945050505050565b615794615c5d565b606060006157a0615c5d565b60606157aa615da8565b6157b387615582565b90506000805b6157c2836155cc565b1561589757806157ed576157dd6157d8846155ed565b615ab7565b6001600160a01b0316855261588f565b8060011415615815576158026157d8846155ed565b6001600160a01b0316602086015261588f565b806002141561583d5761582a6157d8846155ed565b6001600160a01b0316604086015261588f565b806003141561586957615852614d36846155ed565b6001600160401b031660608601526001915061588f565b806004141561588a5761588361587e846155ed565b615ad1565b935061588f565b615897565b6001016157b9565b50929791965091945092505050565b600081836158c75760405162461bcd60e51b8152600401610e679190616487565b5060008385816158d357fe5b0495945050505050565b80516000906158ee57506000611748565b6020820151805160001a9060c082101561590d57600092505050611748565b5060019392505050565b8051600090811a6080811015615931576000915050611748565b60b881108061594c575060c0811080159061594c575060f881105b1561595b576001915050611748565b60c081101561596f5760b519019050611748565b60f519019050611748565b80516000908190811a60808110156159955760019150615a54565b60b88110156159aa57607e1981019150615a54565b60c08110156159fb57600060b78203600186019550806020036101000a8651049150600181018201935050808310156159f55760405162461bcd60e51b8152600401610e6790616a5a565b50615a54565b60f8811015615a105760be1981019150615a54565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615a525760405162461bcd60e51b8152600401610e6790616a5a565b505b5092915050565b8051600090615a6c57506000611748565b60008090506000615a808460200151615917565b602085015185519181019250015b80821015615aae57615a9f8261597a565b82019150826001019250615a8e565b50909392505050565b8051600090601514615ac857600080fd5b6117f88261563b565b8051606090615adf57600080fd5b6000615aee8360200151615917565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615b25576020820181803683370190505b5090506000816020019050614a9084876020015101828580615b4657610e89565b5b60208110615b66578251825260209283019290910190601f1901615b47565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615bb1615de2565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615bf757805160ff1916838001178555615c24565b82800160010185558215615c24579182015b82811115615c24578251825591602001919060010190615c09565b50612d3d929150615e01565b8260138101928215615c245791602002820182811115615c24578251825591602001919060010190615c09565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615cdc5750611960565b601f0160209004906000526020600020908101906119609190615e01565b50611960906013810190615e01565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615d425780548555615c24565b82800160010185558215615c2457600052602060002091601f016020900482015b82811115615c24578254825591600101919060010190615d63565b8260138101928215615c245791820182811115615c24578254825591600101919060010190615d63565b6040518060400160405280615dbb615dc8565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61202d91905b80821115612d3d5760008155600101615e07565b80356117f881617074565b60008083601f840112615e37578182fd5b5081356001600160401b03811115615e4d578182fd5b6020830191508360208083028501011115613d0b57600080fd5b6000601f8381840112615e78578182fd5b8235615e8b615e8682617029565b617003565b818152925060208084019085810160005b84811015615f1d578135880189603f820112615eb757600080fd5b838101356001600160401b03811115615ecf57600080fd5b615ee0818901601f19168601617003565b81815260408c81848601011115615ef657600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615e9c565b50505050505092915050565b600082601f830112615f39578081fd5b8135615f47615e8682617029565b818152915060208083019084810181840286018201871015615f6857600080fd5b6000805b85811015615f1d5782356001600160401b0381168114615f8a578283fd5b85529383019391830191600101615f6c565b60008083601f840112615fad578182fd5b5081356001600160401b03811115615fc3578182fd5b602083019150836020828501011115613d0b57600080fd5b600060208284031215615fec578081fd5b8135611e2d81617074565b600060208284031215616008578081fd5b8151611e2d81617074565b60008060008060408587031215616028578283fd5b84356001600160401b038082111561603e578485fd5b61604a88838901615e26565b90965094506020870135915080821115616062578384fd5b5061606f87828801615e26565b95989497509550505050565b60008060006060848603121561608f578283fd5b83356001600160401b03808211156160a5578485fd5b81860187601f8201126160b6578586fd5b803592506160c6615e8684617029565b80848252602080830192508084018b8283890287010111156160e657898afd5b8994505b86851015616110576160fc8c82615e1b565b8452600194909401939281019281016160ea565b509097508801359350505080821115616127578384fd5b61613387838801615f29565b93506040860135915080821115616148578283fd5b5061615586828701615e67565b9150509250925092565b60008060208385031215616171578182fd5b82356001600160401b03811115616186578283fd5b61619285828601615f9c565b90969095509350505050565b600080600080604085870312156161b3578384fd5b84356001600160401b03808211156161c9578586fd5b6161d588838901615f9c565b909650945060208701359150808211156161ed578384fd5b5061606f87828801615f9c565b60006020828403121561620b578081fd5b5035919050565b600060208284031215616223578081fd5b5051919050565b6000806040838503121561623c578182fd5b505080516020909101519092909150565b600080600060408486031215616261578081fd5b833560ff81168114616271578182fd5b925060208401356001600160401b0381111561628b578182fd5b61629786828701615f9c565b9497909650939450505050565b6000815180845260208085019450808401835b838110156162dc5781516001600160a01b0316875295820195908201906001016162b7565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452616329816020860160208601617048565b601f01601f19169290920160200192915050565b6000825161634f818460208701617048565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611e2d60208301846162a4565b60006040825261641f60408301856162a4565b602083820381850152818551808452828401915082838202850101838801865b8381101561646d57601f1987840301855261645b838351616311565b9486019492509085019060010161643f565b50909998505050505050505050565b901515815260200190565b600060208252611e2d6020830184616311565b6000604082526164ae6040830186886162e7565b82810360208401526164c18185876162e7565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152616fdb6060830184616311565b95945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561702157600080fd5b604052919050565b60006001600160401b0382111561703e578081fd5b5060209081020190565b60005b8381101561706357818101518382015260200161704b565b838111156135565750506000910152565b6001600160a01b038116811461196057600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" + "code": "0x6080604052600436106104615760003560e01c80638c5d749d1161023f578063c81b166211610139578063e1c7392a116100b6578063f92eb86b1161007a578063f92eb86b14610bac578063f9a2bbc714610bc1578063fccc281314610bd6578063fd4ad81f14610beb578063fd6a687914610c1a57610468565b8063e1c7392a14610b2f578063e40716a114610b44578063ea321e4914610b59578063eb57e20214610b79578063f340fa0114610b9957610468565b8063d68fb56a116100fd578063d68fb56a14610ac6578063daacdb6614610adb578063dc927faf14610af0578063df8079e914610b05578063e086c7b114610b1a57610468565b8063c81b166214610a67578063c8509d8114610829578063cb75a59214610a7c578063ce910b0c14610a91578063d58918ae14610ab157610468565b8063aa82dce1116101c7578063aef198a91161018b578063aef198a9146109f1578063b7ab4db514610a06578063b8cf4ef114610a28578063c466689d14610a3d578063c6d3394514610a5257610468565b8063aa82dce114610965578063aad560631461097a578063ab51bb961461098f578063ac431751146109b1578063ad3c9da6146109d157610468565b80639fe0f8161161020e5780639fe0f816146108fc578063a0dc275814610911578063a1a11bf514610926578063a5422d5c1461093b578063a78abc161461095057610468565b80638c5d749d1461089d5780638d19a410146108b25780639369d7de146108d25780639dc09262146108e757610468565b80634df6e0c31161035b57806375d47a0a116102d8578063831d65d11161029c578063831d65d114610829578063862498821461084957806388b32f111461085e5780638a7beb01146108735780638b5ad0c91461088857610468565b806375d47a0a146107c057806378dfed4a146107d55780637a84ca2a146107ea5780637e434d54146107ff578063820dcaa81461081457610468565b8063565c56b31161031f578063565c56b31461072457806360eba4fe1461074457806362b72cf5146107645780636969a25c146107795780636e47b482146107ab57610468565b80634df6e0c3146106b05780635192c82c146106c557806351b4dce3146106da57806351e80672146106ef57806355614fcc1461070457610468565b80632a0ffb6e116103e95780633b071dcc116103ad5780633b071dcc1461061f57806343756e5c1461064257806345cf9daf14610657578063493279b11461066c5780634bf6c8821461068e57610468565b80632a0ffb6e1461057f578063300c35671461059f578063321d398a146105bf5780633365af3a146105df57806335409f7f146105ff57610468565b8063152ad3b811610430578063152ad3b8146104fe5780631bd14ed8146105205780631e4c1524146105355780631ff1806914610555578063280870281461056a57610468565b806304c4fec61461046d57806307a56847146104845780630e2374a5146104af5780631182b875146104d157610468565b3661046857005b600080fd5b34801561047957600080fd5b50610482610c2f565b005b34801561049057600080fd5b50610499610ca3565b6040516104a69190616d7f565b60405180910390f35b3480156104bb57600080fd5b506104c4610ca9565b6040516104a69190616135565b3480156104dd57600080fd5b506104f16104ec36600461601b565b610caf565b6040516104a69190616255565b34801561050a57600080fd5b50610513610dcb565b6040516104a6919061624a565b34801561052c57600080fd5b50610499610dd4565b34801561054157600080fd5b50610482610550366004615e49565b610dda565b34801561056157600080fd5b5061049961110e565b34801561057657600080fd5b506104c4611114565b34801561058b57600080fd5b5061048261059a366004615da9565b61111a565b3480156105ab57600080fd5b506104826105ba366004615de1565b61113b565b3480156105cb57600080fd5b506105136105da366004615fc8565b611484565b3480156105eb57600080fd5b506105136105fa366004615fc8565b611553565b34801561060b57600080fd5b5061048261061a366004615da9565b611604565b34801561062b57600080fd5b50610634611769565b6040516104a69291906161da565b34801561064e57600080fd5b506104c4611a45565b34801561066357600080fd5b50610499611a4b565b34801561067857600080fd5b50610681611a51565b6040516104a69190616d70565b34801561069a57600080fd5b506106a3611a56565b6040516104a69190616dc3565b3480156106bc57600080fd5b50610634611a5b565b3480156106d157600080fd5b50610499611be7565b3480156106e657600080fd5b506104c4611bed565b3480156106fb57600080fd5b506104c4611bf3565b34801561071057600080fd5b5061051361071f366004615da9565b611bf9565b34801561073057600080fd5b5061049961073f366004615da9565b611c35565b34801561075057600080fd5b506104f161075f366004615fc8565b611c86565b34801561077057600080fd5b50610499611d2c565b34801561078557600080fd5b50610799610794366004615fc8565b611d32565b6040516104a696959493929190616162565b3480156107b757600080fd5b506104c4611d96565b3480156107cc57600080fd5b506104c4611d9c565b3480156107e157600080fd5b50610499611da2565b3480156107f657600080fd5b50610499611da8565b34801561080b57600080fd5b506104c4611dae565b34801561082057600080fd5b50610499611db4565b34801561083557600080fd5b5061048261084436600461601b565b611dba565b34801561085557600080fd5b50610499611ddb565b34801561086a57600080fd5b50610499611de1565b34801561087f57600080fd5b50610513611de7565b34801561089457600080fd5b50610499611df0565b3480156108a957600080fd5b50610499611df6565b3480156108be57600080fd5b506104996108cd366004615da9565b611e13565b3480156108de57600080fd5b50610482611e53565b3480156108f357600080fd5b506104c4611f67565b34801561090857600080fd5b50610499611f6d565b34801561091d57600080fd5b50610499611f72565b34801561093257600080fd5b506104c4611f77565b34801561094757600080fd5b506104f1611f7d565b34801561095c57600080fd5b50610513611f9c565b34801561097157600080fd5b506104c4611fa5565b34801561098657600080fd5b506104c4611fab565b34801561099b57600080fd5b506109a4611fb1565b6040516104a69190616db2565b3480156109bd57600080fd5b506104826109cc366004615f6c565b611fb6565b3480156109dd57600080fd5b506104996109ec366004615da9565b6129a8565b3480156109fd57600080fd5b506104996129ba565b348015610a1257600080fd5b50610a1b6129c7565b6040516104a691906161c7565b348015610a3457600080fd5b50610499612ab2565b348015610a4957600080fd5b50610499612ab7565b348015610a5e57600080fd5b50610499612abd565b348015610a7357600080fd5b506104c4612ac2565b348015610a8857600080fd5b50610499612ac8565b348015610a9d57600080fd5b506104f1610aac366004615fc8565b612ace565b348015610abd57600080fd5b50610499612adb565b348015610ad257600080fd5b50610499612ae1565b348015610ae757600080fd5b50610499612b20565b348015610afc57600080fd5b506104c4612b26565b348015610b1157600080fd5b506104c4612b2c565b348015610b2657600080fd5b50610499612b32565b348015610b3b57600080fd5b50610482612b37565b348015610b5057600080fd5b50610499612ce0565b348015610b6557600080fd5b50610513610b74366004615f2d565b612ce6565b348015610b8557600080fd5b50610482610b94366004615da9565b612e6c565b610482610ba7366004615da9565b612f74565b348015610bb857600080fd5b5061049961332a565b348015610bcd57600080fd5b506104c4613330565b348015610be257600080fd5b506104c4613336565b348015610bf757600080fd5b50610c0b610c06366004615fc8565b61333c565b6040516104a693929190616d88565b348015610c2657600080fd5b506104c46133fe565b6000610c3a33611e13565b9050600b8181548110610c4957fe5b600091825260209091206001601690920201015460ff16610c855760405162461bcd60e51b8152600401610c7c90616a27565b60405180910390fd5b6000610c8f612ae1565b9050610c9e3383836001613404565b505050565b60095481565b61200181565b60005460609060ff16610cd45760405162461bcd60e51b8152600401610c7c906163dd565b3361200014610cf55760405162461bcd60e51b8152600401610c7c90616b88565b600b54610db357610d04615955565b60015460005b81811015610daf57600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff1916911515919091179055604086015180518794610d8b93600080516020616e78833981519152909101920190615984565b506060820151610da190600383019060136159fe565b505050806001019050610d0a565b5050505b60405162461bcd60e51b8152600401610c7c9061668c565b60075460ff1681565b600f5481565b334114610df95760405162461bcd60e51b8152600401610c7c90616bd7565b3a15610e175760405162461bcd60e51b8152600401610c7c90616966565b8251604080518281526020808402820101909152606090828015610e5557816020015b610e42615a2b565b815260200190600190039081610e3a5790505b50905060005b82811015610eff576040518060c00160405280878381518110610e7a57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001868381518110610ebc57fe5b60200260200101516001600160401b031681526020016000151581526020016000815250828281518110610eec57fe5b6020908102919091010152600101610e5b565b50606080610f0d83866135f6565b9150915060005b60015481101561100357600060018281548110610f2d57fe5b906000526020600020906004020160030154905080600014610ffa57600060018381548110610f5857fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab8260018581548110610f8c57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b168152610fc7926001600160a01b039092169101616135565b6000604051808303818588803b158015610fe057600080fd5b505af1158015610ff4573d6000803e3d6000fd5b50505050505b50600101610f14565b504715611071577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516110399190616d7f565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561106f573d6000803e3d6000fd5b505b6000600355815115611087576110878282613ae0565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b61200581565b3361200214610db35760405162461bcd60e51b8152600401610c7c90616d39565b33411461115a5760405162461bcd60e51b8152600401610c7c90616bd7565b601054431161117b5760405162461bcd60e51b8152600401610c7c906165b6565b3a156111995760405162461bcd60e51b8152600401610c7c90616966565b60005460ff166111bb5760405162461bcd60e51b8152600401610c7c906163dd565b60006110023168056bc75e2d631000008111156111f2576111eb8168056bc75e2d6310000063ffffffff6142cf16565b91506111f9565b505061147a565b6040516309a99b4f60e41b815261100290639a99b4f0906112209030908690600401616149565b602060405180830381600087803b15801561123a57600080fd5b505af115801561124e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112729190615fe0565b91508161128057505061147a565b6000805b848110156112ae5785858281811061129857fe5b9050602002013582019150806001019050611284565b50806112bc5750505061147a565b6000806000805b8981101561147257848989838181106112d857fe5b905060200201358802816112e857fe5b0493508a8a828181106112f757fe5b905060200201602081019061130c9190615da9565b6001600160a01b0381166000908152600460205260409020549093509150811561142857600060018084038154811061134157fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156113ae57836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516113a19190616d7f565b60405180910390a2611422565b6003546113c1908663ffffffff61431116565b60039081558101546113d9908663ffffffff61431116565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611419908890616d7f565b60405180910390a25b5061146a565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516114619190616d7f565b60405180910390a25b6001016112c3565b505050505050505b5050436010555050565b60015460009082106114985750600061154e565b60006001600160a01b0316600183815481106114b057fe5b60009182526020909120600490910201546001600160a01b031614806114e0575060085415806114e05750600a54155b806114ef575060085460095410155b8061150057506114fe82611553565b155b8061152957506000600b838154811061151557fe5b906000526020600020906016020160000154115b8061153d575060016115396129c7565b5111155b1561154a5750600061154e565b5060015b919050565b60015460009082106115675750600061154e565b600b5482106115a4576001828154811061157d57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615905061154e565b600182815481106115b157fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156115fe5750600b82815481106115e557fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b546116c257611613615955565b60015460005b818110156116be57600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff191691151591909117905560408601518051879461169a93600080516020616e78833981519152909101920190615984565b5060608201516116b090600383019060136159fe565b505050806001019050611619565b5050505b3361100114806116d3575033612002145b6116ef5760405162461bcd60e51b8152600401610c7c90616414565b6001600160a01b038116600090815260046020526040902054806117135750611766565b6001810390506000600b828154811061172857fe5b600091825260209091206001601690920201015460ff16905061174b8383614336565b80156117545750805b15610c9e576009805460001901905550505b50565b60015460609081906000805b828110156117bc576001818154811061178a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117b4576001909101905b600101611775565b506060816040519080825280602002602001820160405280156117e9578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561182257816020015b606081526020019060019003908161180d5790505b50600b546000945090915084141561199d5760005b84811015611997576001818154811061184c57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661198f576001818154811061187c57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106118a757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b81815481106118d457fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561196c5780601f106119415761010080835404028352916020019161196c565b820191906000526020600020905b81548152906001019060200180831161194f57829003601f168201915b505050505082858151811061197d57fe5b60209081029190910101526001909301925b600101611837565b50611a39565b60005b84811015611a3757600181815481106119b557fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611a2f57600181815481106119e557fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611a1057fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016119a0565b505b909450925050505b9091565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c5411611a77576015611a7b565b600c545b90506060611a876129c7565b90506060611a94826146f9565b905082825111611aab579094509250611a41915050565b83838351031015611abd578282510393505b8315611af35760c84304611ad983838388880360008a8a614867565b611af18383838888038989038a8b8b8b510301614867565b505b606083604051908082528060200260200182016040528015611b1f578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611b5857816020015b6060815260200190600190039081611b435790505b50905060005b85811015611bd957848181518110611b7257fe5b6020026020010151838281518110611b8657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611bb257fe5b6020026020010151828281518110611bc657fe5b6020908102919091010152600101611b5e565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611c2157600091505061154e565b60001901611c2e81611553565b9392505050565b6001600160a01b03811660009081526004602052604081205480611c5d57600091505061154e565b600180820381548110611c6c57fe5b906000526020600020906004020160030154915050919050565b60128181548110611c9357fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611d245780601f10611cf957610100808354040283529160200191611d24565b820191906000526020600020905b815481529060010190602001808311611d0757829003601f168201915b505050505081565b60105481565b60018181548110611d3f57fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b61100881565b6103e881565b600c5481565b61200381565b61271081565b3361200014610db35760405162461bcd60e51b8152600401610c7c90616b88565b60025481565b60115481565b60145460ff1681565b600a5481565b600060175460001415611e0b57506001611e10565b506017545b90565b6001600160a01b03811660009081526004602052604081205480611e495760405162461bcd60e51b8152600401610c7c90616b10565b6000190192915050565b600b54611f1157611e62615955565b60015460005b81811015611f0d57600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff1916911515919091179055604086015180518794611ee993600080516020616e78833981519152909101920190615984565b506060820151611eff90600383019060136159fe565b505050806001019050611e68565b5050505b600854611f1e5760036008555b600a54611f2b576002600a555b6000611f3633611e13565b9050611f4181611484565b611f5d5760405162461bcd60e51b8152600401610c7c906168e2565b61176633826149be565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef8152602001616e986105ef913981565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16611fd85760405162461bcd60e51b8152600401610c7c906163dd565b3361100714611ff95760405162461bcd60e51b8152600401610c7c90616994565b61205984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614a569050565b1561210e576020811461207e5760405162461bcd60e51b8152600401610c7c9061629a565b604080516020601f84018190048102820181019092528281526000916120bc91858580838501838280828437600092019190915250614aaf92505050565b90506127106120e86018546120dc600f548561431190919063ffffffff16565b9063ffffffff61431116565b11156121065760405162461bcd60e51b8152600401610c7c906166b0565b600655612965565b61217884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614a569050565b15612212576020811461219d5760405162461bcd60e51b8152600401610c7c906162d1565b604080516020601f84018190048102820181019092528281526000916121db91858580838501838280828437600092019190915250614aaf92505050565b600c54909150806121ea575060155b8082106122095760405162461bcd60e51b8152600401610c7c906165f8565b50600855612965565b61227b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614a569050565b1561231457602081146122a05760405162461bcd60e51b8152600401610c7c90616363565b604080516020601f84018190048102820181019092528281526000916122de91858580838501838280828437600092019190915250614aaf92505050565b90506000811180156122f05750600a81105b61230c5760405162461bcd60e51b8152600401610c7c90616c6c565b600a55612965565b61238884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614a569050565b1561241757602081146123ad5760405162461bcd60e51b8152600401610c7c90616317565b604080516020601f84018190048102820181019092528281526000916123eb91858580838501838280828437600092019190915250614aaf92505050565b9050600d5481111561240f5760405162461bcd60e51b8152600401610c7c906167b9565b600e55612965565b61248084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614a569050565b1561250257602081146124a55760405162461bcd60e51b8152600401610c7c906169e2565b604080516020601f84018190048102820181019092528281526000916124e391858580838501838280828437600092019190915250614aaf92505050565b600d819055600e549091508110156124fc57600d54600e555b50612965565b61256684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614a569050565b15612614576020811461258b5760405162461bcd60e51b8152600401610c7c906163a8565b604080516020601f84018190048102820181019092528281526000916125c991858580838501838280828437600092019190915250614aaf92505050565b9050600081116125eb5760405162461bcd60e51b8152600401610c7c90616511565b606481111561260c5760405162461bcd60e51b8152600401610c7c90616559565b600c55612965565b61268084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614a569050565b1561272957602081146126a55760405162461bcd60e51b8152600401610c7c90616c24565b604080516020601f84018190048102820181019092528281526000916126e391858580838501838280828437600092019190915250614aaf92505050565b90506127106127036018546120dc6006548561431190919063ffffffff16565b11156127215760405162461bcd60e51b8152600401610c7c90616482565b600f55612965565b61279d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614a569050565b1561284657602081146127c25760405162461bcd60e51b8152600401610c7c9061673f565b604080516020601f840181900481028201810190925282815260009161280091858580838501838280828437600092019190915250614aaf92505050565b9050612710612820600f546120dc6006548561431190919063ffffffff16565b111561283e5760405162461bcd60e51b8152600401610c7c90616853565b601855612965565b6128a784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614a569050565b1561294d57602081146128cc5760405162461bcd60e51b8152600401610c7c90616655565b604080516020601f840181900481028201810190925282815260009161290a91858580838501838280828437600092019190915250614aaf92505050565b90506003811015801561291e575060098111155b806129295750806001145b6129455760405162461bcd60e51b8152600401610c7c90616a8a565b601755612965565b60405162461bcd60e51b8152600401610c7c90616cc9565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161299a9493929190616268565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156129f6576129e281611553565b156129ee578160010191505b6001016129d1565b50606081604051908082528060200260200182016040528015612a23578160200160208202803683370190505b5090506000915060005b83811015612aaa57612a3e81611553565b15612aa25760018181548110612a5057fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612a7b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612a2d565b509250505090565b601581565b61027181565b600281565b61100281565b60175481565b60138181548110611c9357fe5b60185481565b6000612aeb6129c7565b519050600080600c5411612b00576015612b04565b600c545b905080821115612b12578091505b81612b1c57600191505b5090565b60055481565b61100381565b61200481565b606481565b60005460ff1615612b5a5760405162461bcd60e51b8152600401610c7c90616a53565b612b62615a60565b6000612b886040518061062001604052806105ef8152602001616e986105ef9139614ab4565b9150915080612ba95760405162461bcd60e51b8152600401610c7c90616b47565b60005b826020015151811015612cce57600183602001518281518110612bcb57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612ca157fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612bac565b50506000805460ff1916600117905550565b600d5481565b601354600090815b81811015612def57612dd785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612d3f57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612dcd5780601f10612da257610100808354040283529160200191612dcd565b820191906000526020600020905b815481529060010190602001808311612db057829003601f168201915b5050505050614c70565b15612de7576001925050506115fe565b600101612cee565b5060125460005b81811015612e6057612e4786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612d3f57fe5b15612e5857600193505050506115fe565b600101612df6565b50600095945050505050565b3361100114612e8d5760405162461bcd60e51b8152600401610c7c90616cf0565b600b54612f4b57612e9c615955565b60015460005b81811015612f4757600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff1916911515919091179055604086015180518794612f2393600080516020616e78833981519152909101920190615984565b506060820151612f3990600383019060136159fe565b505050806001019050612ea2565b5050505b6000612f5682614cd4565b9050612f6181611484565b15612f7057612f7082826149be565b5050565b334114612f935760405162461bcd60e51b8152600401610c7c90616bd7565b60005460ff16612fb55760405162461bcd60e51b8152600401610c7c906163dd565b60003411612fd55760405162461bcd60e51b8152600401610c7c9061678a565b3a15612ff35760405162461bcd60e51b8152600401610c7c90616966565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661303357610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561304a57506000601854115b1561306f57600160175403601754438161306057fe5b06601854028161306c57fe5b04015b60008311801561307f5750600081115b1561312c5760006130a861271061309c348563ffffffff614e5716565b9063ffffffff614e9116565b9050801561312a576040516110029082156108fc029083906000818181858888f193505050501580156130df573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d8160405161310f9190616d7f565b60405180910390a1613127848263ffffffff6142cf16565b93505b505b60008311801561313e57506000600654115b156131e457600061316061271061309c60065434614e5790919063ffffffff16565b905080156131e25760405161dead9082156108fc029083906000818181858888f19350505050158015613197573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516131c79190616d7f565b60405180910390a16131df848263ffffffff6142cf16565b93505b505b81156132e25760006001808403815481106131fb57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561326857846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48560405161325b9190616d7f565b60405180910390a26132dc565b60035461327b908563ffffffff61431116565b6003908155810154613293908563ffffffff61431116565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055906132d3908790616d7f565b60405180910390a25b50613324565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48460405161331b9190616d7f565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061334957fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff909116949192918301828280156133f45780601f106133c9576101008083540402835291602001916133f4565b820191906000526020600020905b8154815290600101906020018083116133d757829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613415575082155b806134205750600954155b1561342d575060006135ee565b60096000815460019003919050819055506000613478600a5461309c8661309c600b8a8154811061345a57fe5b6000918252602090912060169091020154439063ffffffff6142cf16565b90506000600b868154811061348957fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156134ee57600080fd5b505afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615ff8565b91509150600093508083106135a45761353f8888614336565b506040516328aa02b160e01b8152611001906328aa02b190613569908b9087908a906004016161a4565b600060405180830381600087803b15801561358357600080fd5b505af1158015613597573d6000803e3d6000fd5b50505050600193506135b6565b8183106135b6576135b488614cd4565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b606080600080808080613607612ae1565b6001549091505b801561383957600181039250600b838154811061362757fe5b600091825260209091206001601690920201015460ff1661364757613830565b6001838154811061365457fe5b600091825260208220600490910201546001600160a01b0316955061367e90869085908590613404565b93508361368a57613830565b60405163436aa28360e11b81526000908190612002906386d54506906136b4908a90600401616135565b60206040518083038186803b1580156136cc57600080fd5b505afa1580156136e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137049190615dc5565b90506001600160a01b0381161561378d576040516302ceee9160e11b81526120029063059ddd229061373a908490600401616135565b60206040518083038186803b15801561375257600080fd5b505afa158015613766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378a9190615dc5565b91505b60005b8c5181101561382c57876001600160a01b03168d82815181106137af57fe5b6020026020010151600001516001600160a01b031614806137f85750826001600160a01b03168d82815181106137e157fe5b6020026020010151600001516001600160a01b0316145b156138245760018d828151811061380b57fe5b602090810291909101015190151560809091015261382c565b600101613790565b5050505b6000190161360e565b5060005b89518110156138a65789818151811061385257fe5b60200260200101516080015180613892575060006001600160a01b03168a828151811061387b57fe5b6020026020010151600001516001600160a01b0316145b1561389e578560010195505b60010161383d565b508851851061398e5760408051600180825281830190925290816020015b6138cc615a2b565b8152602001906001900390816138c4575050604080516001808252818301909252919850602082015b60608152602001906001900390816138f55790505095508860008151811061391957fe5b60200260200101518760008151811061392e57fe5b60200260200101819052508760008151811061394657fe5b60200260200101518660008151811061395b57fe5b602002602001018190525060008760008151811061397557fe5b6020908102919091010151901515608090910152613ad3565b848951036040519080825280602002602001820160405280156139cb57816020015b6139b8615a2b565b8152602001906001900390816139b05790505b50965084895103604051908082528060200260200182016040528015613a0557816020015b60608152602001906001900390816139f05790505b5095506000915060005b8951811015613ad157898181518110613a2457fe5b602002602001015160800151158015613a67575060006001600160a01b03168a8281518110613a4f57fe5b6020026020010151600001516001600160a01b031614155b15613ac957898181518110613a7857fe5b6020026020010151888481518110613a8c57fe5b6020026020010181905250888181518110613aa357fe5b6020026020010151878481518110613ab757fe5b60200260200101819052508260010192505b600101613a0f565b505b50505050505b9250929050565b600154825160005b82811015613bfd576001613afa615a2b565b60018381548110613b0757fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613bd157878181518110613b9757fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613bc95760009250613bd1565b600101613b83565b508115613bf35780516001600160a01b03166000908152600460205260408120555b5050600101613ae8565b5080821115613cbc57805b82811015613cba576001805480613c1b57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613c6e57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613ca06002830182615a84565b613cae600383016000615ac8565b50509055600101613c08565b505b6000818310613ccb5781613ccd565b825b905060005b8181101561407157613d7f868281518110613ce957fe5b602002602001015160018381548110613cfe57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152614ed3565b613f33578060010160046000888481518110613d9757fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110613dd357fe5b602002602001015160018281548110613de857fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110613ea357fe5b6020026020010151600b8281548110613eb857fe5b90600052602060002090601602016002019080519060200190613edc929190615984565b506000600b8281548110613eec57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110613f1d57fe5b6000918252602090912060169091020155614069565b858181518110613f3f57fe5b60200260200101516060015160018281548110613f5857fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b0316021790555061401e858281518110613f9c57fe5b6020026020010151600b8381548110613fb157fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612dcd5780601f10612da257610100808354040283529160200191612dcd565b6140695784818151811061402e57fe5b6020026020010151600b828154811061404357fe5b90600052602060002090601602016002019080519060200190614067929190615984565b505b600101613cd2565b508282111561424957614082615955565b835b838110156142465785818151811061409857fe5b6020026020010151826040018190525060018782815181106140b657fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616e588339815191528101918255858301516000805160206174878339815191528201805491151560ff19909216919091179055928501518051869492936141ec93600080516020616e7883398151915201920190615984565b50606082015161420290600383019060136159fe565b505050806001016004600089848151811061421957fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101614084565b50505b614251614f2f565b614259615111565b6000600981905560015493505b838110156142c7576000600b828154811061427d57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106142ae57fe5b6000918252602090912060169091020155600101614266565b505050505050565b6000611c2e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152ff565b600082820183811015611c2e5760405162461bcd60e51b8152600401610c7c9061644b565b6000806001838154811061434657fe5b906000526020600020906004020160030154905060006001808054905003905060016143706129c7565b51116143a55760006001858154811061438557fe5b9060005260206000209060040201600301819055506000925050506115fe565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143de9190616d7f565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156145cb576001816001018154811061441f57fe5b90600052602060002090600402016001828154811061443a57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106144fb57fe5b9060005260206000209060160201600b828154811061451657fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff199092169190911790556002808401805461456d938386019390821615610100026000190190911604615ad7565b5061458060038281019084016013615b4c565b5090505080600101600460006001848154811061459957fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614401565b5060018054806145d757fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061462a57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061465c6002830182615a84565b61466a600383016000615ac8565b50509055600081838161467957fe5b04905080156146ed5760015460005b818110156146ea576146c183600183815481106146a157fe5b90600052602060002090600402016003015461431190919063ffffffff16565b600182815481106146ce57fe5b6000918252602090912060036004909202010155600101614688565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561473857816020015b60608152602001906001900390816147235790505b50600b54909150831461474f57925061154e915050565b60005b8281101561485e57600b60016004600089858151811061476e57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106147a257fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561483a5780601f1061480f5761010080835404028352916020019161483a565b820191906000526020600020905b81548152906001019060200180831161481d57829003601f168201915b505050505082828151811061484b57fe5b6020908102919091010152600101614752565b50949350505050565b60005b828110156149b4576000828783880160405160200161488a929190616127565b6040516020818303038152906040528051906020012060001c816148aa57fe5b069050808501828701146149ab57600089838801815181106148c857fe5b60200260200101519050606089848901815181106148e257fe5b602002602001015190508a838801815181106148fa57fe5b60200260200101518b858a018151811061491057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061493f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061496d57fe5b60200260200101518a858a018151811061498357fe5b6020026020010181905250808a8489018151811061499d57fe5b602002602001018190525050505b5060010161486a565b5050505050505050565b600980546001908101909155600b8054839081106149d857fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b8281548110614a0e57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614a69919061610b565b6040516020818303038152906040528051906020012083604051602001614a90919061610b565b6040516020818303038152906040528051906020012014905092915050565b015190565b614abc615a60565b6000614ac6615a60565b614ace615b76565b614adf614ada8661532b565b615350565b90506000805b614aee8361539a565b15614c625780614b1357614b09614b04846153bb565b615409565b60ff168452614c5a565b8060011415614c55576060614b2f614b2a856153bb565b615489565b90508051604051908082528060200260200182016040528015614b6c57816020015b614b59615a2b565b815260200190600190039081614b515790505b5085602001819052508051604051908082528060200260200182016040528015614baa57816020015b6060815260200190600190039081614b955790505b50604086015260005b8151811015614c4a57614bc4615a2b565b60606000614be4858581518110614bd757fe5b602002602001015161555a565b92509250925080614c04578860009a509a50505050505050505050614c6b565b8289602001518581518110614c1557fe5b60200260200101819052508189604001518581518110614c3157fe5b6020026020010181905250505050806001019050614bb3565b506001925050614c5a565b614c62565b600101614ae5565b50919350909150505b915091565b815181516000916001918114808314614c8c5760009250614cca565b600160208701838101602088015b600284838510011415614cc5578051835114614cb95760009650600093505b60209283019201614c9a565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614cfd5750600019905061154e565b600181039050600060018281548110614d1257fe5b9060005260206000209060040201600301549050600060018381548110614d3557fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614d8e908590616d7f565b60405180910390a280614da65782935050505061154e565b6000818381614db157fe5b0490508015614e4d5760005b84811015614dff57614dd682600183815481106146a157fe5b60018281548110614de357fe5b6000918252602090912060036004909202010155600101614dbd565b50600180549085015b81811015614e4a57614e2183600183815481106146a157fe5b60018281548110614e2e57fe5b6000918252602090912060036004909202010155600101614e08565b50505b5091949350505050565b600082614e66575060006115fe565b82820282848281614e7357fe5b0414611c2e5760405162461bcd60e51b8152600401610c7c90616925565b6000611c2e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615674565b805182516000916001600160a01b039182169116148015614f0d575081602001516001600160a01b031683602001516001600160a01b0316145b8015611c2e5750506040908101519101516001600160a01b0390811691161490565b60125460135480821115614f7a57805b82811015614f78576012805480614f5257fe5b600190038181906000526020600020016000614f6e9190615a84565b9055600101614f3f565b505b6000818310614f895781614f8b565b825b905060005b818110156150a35761504860128281548110614fa857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156150365780601f1061500b57610100808354040283529160200191615036565b820191906000526020600020905b81548152906001019060200180831161501957829003601f168201915b505050505060138381548110612d3f57fe5b61509b576013818154811061505957fe5b906000526020600020016012828154811061507057fe5b906000526020600020019080546001816001161561010002031660029004615099929190615ad7565b505b600101614f90565b5082821115610c9e57825b82811015613324576012601382815481106150c557fe5b6000918252602080832084546001818101875595855291909320929091018054615108949390920192909160026101009282161592909202600019011604615ad7565b506001016150ae565b601354600b548082111561515c57805b8281101561515a57601380548061513457fe5b6001900381819060005260206000200160006151509190615a84565b9055600101615121565b505b600081831061516b578161516d565b825b905060005b8181101561528c5761522a6013828154811061518a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156152185780601f106151ed57610100808354040283529160200191615218565b820191906000526020600020905b8154815290600101906020018083116151fb57829003601f168201915b5050505050600b8381548110613fb157fe5b61528457600b818154811061523b57fe5b90600052602060002090601602016002016013828154811061525957fe5b906000526020600020019080546001816001161561010002031660029004615282929190615ad7565b505b600101615172565b5082821115610c9e57825b82811015613324576013600b82815481106152ae57fe5b6000918252602080832084546001808201875595855291909320601692909202909201600290810180546152f695939094019390926000199082161561010002011604615ad7565b50600101615297565b600081848411156153235760405162461bcd60e51b8152600401610c7c9190616255565b505050900390565b615333615b96565b506040805180820190915281518152602082810190820152919050565b615358615b76565b615361826156ab565b61536a57600080fd5b600061537983602001516156e5565b60208085015160408051808201909152868152920190820152915050919050565b60006153a4615b96565b505080518051602091820151919092015191011190565b6153c3615b96565b6153cc8261539a565b6153d557600080fd5b602082015160006153e582615748565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061541e57508151602110155b61542757600080fd5b600061543683602001516156e5565b9050808360000151101561545c5760405162461bcd60e51b8152600401610c7c90616ad9565b82516020808501518301805192849003929183101561485e57506020919091036101000a90049392505050565b6060615494826156ab565b61549d57600080fd5b60006154a883615829565b90506060816040519080825280602002602001820160405280156154e657816020015b6154d3615b96565b8152602001906001900390816154cb5790505b50905060006154f885602001516156e5565b60208601510190506000805b8481101561554f5761551583615748565b915060405180604001604052808381526020018481525084828151811061553857fe5b602090810291909101015291810191600101615504565b509195945050505050565b615562615a2b565b6060600061556e615a2b565b6060615578615b76565b61558187615350565b90506000805b6155908361539a565b1561566557806155bb576155ab6155a6846153bb565b615885565b6001600160a01b0316855261565d565b80600114156155e3576155d06155a6846153bb565b6001600160a01b0316602086015261565d565b806002141561560b576155f86155a6846153bb565b6001600160a01b0316604086015261565d565b806003141561563757615620614b04846153bb565b6001600160401b031660608601526001915061565d565b80600414156156585761565161564c846153bb565b61589f565b935061565d565b615665565b600101615587565b50929791965091945092505050565b600081836156955760405162461bcd60e51b8152600401610c7c9190616255565b5060008385816156a157fe5b0495945050505050565b80516000906156bc5750600061154e565b6020820151805160001a9060c08210156156db5760009250505061154e565b5060019392505050565b8051600090811a60808110156156ff57600091505061154e565b60b881108061571a575060c0811080159061571a575060f881105b1561572957600191505061154e565b60c081101561573d5760b51901905061154e565b60f51901905061154e565b80516000908190811a60808110156157635760019150615822565b60b881101561577857607e1981019150615822565b60c08110156157c957600060b78203600186019550806020036101000a8651049150600181018201935050808310156157c35760405162461bcd60e51b8152600401610c7c90616828565b50615822565b60f88110156157de5760be1981019150615822565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156158205760405162461bcd60e51b8152600401610c7c90616828565b505b5092915050565b805160009061583a5750600061154e565b6000809050600061584e84602001516156e5565b602085015185519181019250015b8082101561587c5761586d82615748565b8201915082600101925061585c565b50909392505050565b805160009060151461589657600080fd5b6115fe82615409565b80516060906158ad57600080fd5b60006158bc83602001516156e5565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156158f3576020820181803683370190505b509050600081602001905061485e8487602001510182858061591457610c9e565b5b60208110615934578251825260209283019290910190601f1901615915565b915181516020939093036101000a6000190180199091169216919091179052565b6040518060800160405280600081526020016000151581526020016060815260200161597f615bb0565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106159c557805160ff19168380011785556159f2565b828001600101855582156159f2579182015b828111156159f25782518255916020019190600101906159d7565b50612b1c929150615bcf565b82601381019282156159f257916020028201828111156159f25782518255916020019190600101906159d7565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615aaa5750611766565b601f0160209004906000526020600020908101906117669190615bcf565b50611766906013810190615bcf565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615b1057805485556159f2565b828001600101855582156159f257600052602060002091601f016020900482015b828111156159f2578254825591600101919060010190615b31565b82601381019282156159f257918201828111156159f2578254825591600101919060010190615b31565b6040518060400160405280615b89615b96565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b611e1091905b80821115612b1c5760008155600101615bd5565b80356115fe81616e42565b60008083601f840112615c05578182fd5b5081356001600160401b03811115615c1b578182fd5b6020830191508360208083028501011115613ad957600080fd5b6000601f8381840112615c46578182fd5b8235615c59615c5482616df7565b616dd1565b818152925060208084019085810160005b84811015615ceb578135880189603f820112615c8557600080fd5b838101356001600160401b03811115615c9d57600080fd5b615cae818901601f19168601616dd1565b81815260408c81848601011115615cc457600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615c6a565b50505050505092915050565b600082601f830112615d07578081fd5b8135615d15615c5482616df7565b818152915060208083019084810181840286018201871015615d3657600080fd5b6000805b85811015615ceb5782356001600160401b0381168114615d58578283fd5b85529383019391830191600101615d3a565b60008083601f840112615d7b578182fd5b5081356001600160401b03811115615d91578182fd5b602083019150836020828501011115613ad957600080fd5b600060208284031215615dba578081fd5b8135611c2e81616e42565b600060208284031215615dd6578081fd5b8151611c2e81616e42565b60008060008060408587031215615df6578283fd5b84356001600160401b0380821115615e0c578485fd5b615e1888838901615bf4565b90965094506020870135915080821115615e30578384fd5b50615e3d87828801615bf4565b95989497509550505050565b600080600060608486031215615e5d578283fd5b83356001600160401b0380821115615e73578485fd5b81860187601f820112615e84578586fd5b80359250615e94615c5484616df7565b80848252602080830192508084018b828389028701011115615eb457898afd5b8994505b86851015615ede57615eca8c82615be9565b845260019490940193928101928101615eb8565b509097508801359350505080821115615ef5578384fd5b615f0187838801615cf7565b93506040860135915080821115615f16578283fd5b50615f2386828701615c35565b9150509250925092565b60008060208385031215615f3f578182fd5b82356001600160401b03811115615f54578283fd5b615f6085828601615d6a565b90969095509350505050565b60008060008060408587031215615f81578384fd5b84356001600160401b0380821115615f97578586fd5b615fa388838901615d6a565b90965094506020870135915080821115615fbb578384fd5b50615e3d87828801615d6a565b600060208284031215615fd9578081fd5b5035919050565b600060208284031215615ff1578081fd5b5051919050565b6000806040838503121561600a578182fd5b505080516020909101519092909150565b60008060006040848603121561602f578081fd5b833560ff8116811461603f578182fd5b925060208401356001600160401b03811115616059578182fd5b61606586828701615d6a565b9497909650939450505050565b6000815180845260208085019450808401835b838110156160aa5781516001600160a01b031687529582019590820190600101616085565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526160f7816020860160208601616e16565b601f01601f19169290920160200192915050565b6000825161611d818460208701616e16565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611c2e6020830184616072565b6000604082526161ed6040830185616072565b602083820381850152818551808452828401915082838202850101838801865b8381101561623b57601f198784030185526162298383516160df565b9486019492509085019060010161620d565b50909998505050505050505050565b901515815260200190565b600060208252611c2e60208301846160df565b60006040825261627c6040830186886160b5565b828103602084015261628f8185876160b5565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152616da960608301846160df565b95945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715616def57600080fd5b604052919050565b60006001600160401b03821115616e0c578081fd5b5060209081020190565b60005b83811015616e31578181015183820152602001616e19565b838111156133245750506000910152565b6001600160a01b038116811461176657600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001001": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061035d5760003560e01c80637942fd05116101d3578063c80d4b8f11610104578063df8079e9116100a2578063f9a2bbc71161007c578063f9a2bbc7146105ee578063fc3e5908146105f6578063fc4333cd146105fe578063fd6a6879146106065761035d565b8063df8079e9146105d6578063e1c7392a146105de578063f1fad104146105e65761035d565b8063c96be4cb116100de578063c96be4cb146105a0578063cc844b73146105b3578063dc927faf146105c6578063dcc6f156146105ce5761035d565b8063c80d4b8f14610590578063c81b166214610598578063c8509d81146105225761035d565b8063a1a11bf511610171578063aad560631161014b578063aad5606314610565578063ab51bb961461056d578063ac0af62914610575578063ac4317511461057d5761035d565b8063a1a11bf51461054d578063a78abc1614610555578063aa82dce11461055d5761035d565b8063831d65d1116101ad578063831d65d11461052257806396713da9146105355780639dc092621461053d5780639f804f5f146105455761035d565b80637942fd051461050a5780637e434d54146105125780638256ace61461051a5761035d565b806343756e5c116102ad5780635bfb49901161024b57806370fd5bad1161022557806370fd5bad146104ea578063718a8aa8146104f257806375d47a0a146104fa5780637912a65d146105025761035d565b80635bfb4990146104c757806362b72cf5146104da5780636e47b482146104e25761035d565b806350055f901161028757806350055f90146104a757806351b4dce3146104af57806351e80672146104b7578063567a372d146104bf5761035d565b806343756e5c14610482578063493279b11461048a5780634bf6c8821461049f5761035d565b8063280870281161031a57806335aa2e44116102f457806335aa2e441461043157806337c8dab914610444578063389f4f71146104655780633dffc3871461046d5761035d565b8063280870281461040157806328aa02b1146104095780633306ccca1461041c5761035d565b80630bee7a67146103625780630e2374a5146103805780631182b8751461039557806322d1e80b146103b557806323bac5a2146103ca57806327962118146103ec575b600080fd5b61036a61060e565b604051610377919061342d565b60405180910390f35b610388610613565b6040516103779190612c7a565b6103a86103a3366004612b93565b610619565b6040516103779190612cb2565b6103bd61067f565b6040516103779190612ca7565b6103dd6103d8366004612898565b610688565b60405161037793929190613415565b6103ff6103fa3660046129f0565b6106ab565b005b610388610a00565b6103ff6104173660046128d0565b610a06565b610424610a37565b60405161037791906133dd565b61038861043f366004612b63565b610a3d565b610457610452366004612898565b610a64565b604051610377929190613407565b610424610abb565b610475610ac1565b604051610377919061343e565b610388610ac6565b610492610acc565b60405161037791906133ce565b610475610ad1565b610424610ad6565b610388610adc565b610388610ae2565b610424610ae8565b6103ff6104d5366004612898565b610aee565b610424610b76565b610388610b7c565b610475610b82565b610475610b87565b610388610b8c565b610424610b92565b610475610b97565b610388610b9c565b610457610ba2565b6103ff610530366004612b93565b610bac565b610475610bcd565b610388610bd2565b610424610bd8565b610388610bde565b6103bd610be4565b610388610bed565b610388610bf3565b61036a610bf9565b610424610bfe565b6103ff61058b366004612a47565b610c03565b61042461119f565b6103886111a4565b6103ff6105ae366004612898565b6111aa565b6103ff6105c1366004612ab0565b6114c7565b610388611966565b61042461196c565b610388611971565b6103ff611977565b6104756119b3565b6103886119b8565b6104756119be565b6103ff6119c3565b610388611e0c565b606481565b61200181565b606033612000146106455760405162461bcd60e51b815260040161063c906132a8565b60405180910390fd5b60005460ff166106675760405162461bcd60e51b815260040161063c90612d9e565b60405162461bcd60e51b815260040161063c90612f6d565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166106cd5760405162461bcd60e51b815260040161063c90612d9e565b6006546106da5760146006555b6008546106e8576170806008555b8151158015906106f85750805115155b6107145760405162461bcd60e51b815260040161063c9061323d565b60408051600380825260808201909252606091816020015b606081526020019060019003908161072c57905050905061074d6038611e12565b8160008151811061075a57fe5b602002602001018190525061076e83611e2d565b8160018151811061077b57fe5b602002602001018190525061078f82611e2d565b8160028151811061079c57fe5b602002602001018190525060606107b282611e83565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa6107f357600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d5450690610826908690600401612c7a565b60206040518083038186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087691906128b4565b6001600160a01b0316141561089d5760405162461bcd60e51b815260040161063c90612d6e565b43600854820110156108c15760405162461bcd60e51b815260040161063c90612d0f565b604051631871f7d960e31b81526120029063c38fbec8906108e6908590600401612c7a565b600060405180830381600087803b15801561090057600080fd5b505af1158015610914573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f915061093d908590600401612c7a565b600060405180830381600087803b15801561095757600080fd5b505af115801561096b573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906109a39033908590600401612c8e565b602060405180830381600087803b1580156109bd57600080fd5b505af11580156109d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f59190612b7b565b505050505050505050565b61200581565b3361100014610a275760405162461bcd60e51b815260040161063c90612ff3565b610a32838383611f14565b505050565b61708081565b60018181548110610a4a57fe5b6000918252602090912001546001600160a01b0316905081565b600080610a6f6126cb565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b603881565b600881565b60065481565b61200681565b61200081565b60045481565b3361100014610b0f5760405162461bcd60e51b815260040161063c90612ff3565b60005460ff16610b315760405162461bcd60e51b815260040161063c90612d9e565b806001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c6000604051610b6b9190612cc5565b60405180910390a250565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b61200381565b6004546005549091565b33612000146106455760405162461bcd60e51b815260040161063c906132a8565b600981565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610c255760405162461bcd60e51b815260040161063c90612d9e565b3361100714610c465760405162461bcd60e51b815260040161063c9061312c565b610cb184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b6020820152915061214d9050565b15610d4c5760208114610cd65760405162461bcd60e51b815260040161063c90612f7f565b604080516020601f8401819004810282018101909252828152600091610d14918585808385018382808284376000920191909152506121a792505050565b905060018110158015610d28575060055481105b610d445760405162461bcd60e51b815260040161063c90613263565b60045561115c565b610db284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b6020820152915061214d9050565b15610e4e5760208114610dd75760405162461bcd60e51b815260040161063c9061317a565b604080516020601f8401819004810282018101909252828152600091610e15918585808385018382808284376000920191909152506121a792505050565b90506103e88111158015610e2a575060045481115b610e465760405162461bcd60e51b815260040161063c90612e57565b60055561115c565b610ebb84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b6020820152915061214d9050565b15610f555760208114610ee05760405162461bcd60e51b815260040161063c906130b4565b604080516020601f8401819004810282018101909252828152600091610f1e918585808385018382808284376000920191909152506121a792505050565b9050600a8110158015610f315750606481105b610f4d5760405162461bcd60e51b815260040161063c906131bc565b60065561115c565b610fc984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c61736800000000000000006020820152915061214d9050565b156110405760208114610fee5760405162461bcd60e51b815260040161063c90612e8c565b604080516020601f840181900481028201810190925282815261102a91908484808385018382808284376000920191909152506121ac92505050565b6007805460ff191691151591909117905561115c565b6110a784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b6020820152915061214d9050565b1561114457602081146110cc5760405162461bcd60e51b815260040161063c90613043565b604080516020601f840181900481028201810190925282815260009161110a918585808385018382808284376000920191909152506121a792505050565b905061708081101580156111205750620d2f0081105b61113c5760405162461bcd60e51b815260040161063c90612dd5565b60085561115c565b60405162461bcd60e51b815260040161063c90613344565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516111919493929190612cdd565b60405180910390a150505050565b609681565b61100281565b3341146111c95760405162461bcd60e51b815260040161063c906132f7565b60005460ff166111eb5760405162461bcd60e51b815260040161063c90612d9e565b600354431161120c5760405162461bcd60e51b815260040161063c90613399565b3a1561122a5760405162461bcd60e51b815260040161063c90613086565b60405163155853f360e21b8152611000906355614fcc9061124f908490600401612c7a565b60206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f91906129d4565b6112a8576114c0565b6112b06126cb565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061130b576020810180516001019052611364565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161137657fe5b066113ee57600060208201526040516335409f7f60e01b8152611000906335409f7f906113a7908590600401612c7a565b600060405180830381600087803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b505050506113e98282602001516000611f14565b61145a565b6004548160200151816113fd57fe5b0661145a576040516375abf10160e11b81526110009063eb57e20290611427908590600401612c7a565b600060405180830381600087803b15801561144157600080fd5b505af1158015611455573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166114e95760405162461bcd60e51b815260040161063c90612d9e565b60075460ff1661150b5760405162461bcd60e51b815260040161063c90612d39565b6006546115185760146006555b600854611526576170806008555b60085481516040015143910111801561154a57504360085482602001516040015101115b6115665760405162461bcd60e51b815260040161063c9061336b565b8060200151602001518160000151602001511480156115945750806020015160600151816000015160600151145b156115b15760405162461bcd60e51b815260040161063c90612fc6565b8051604081015190511080156115d05750602081015160408101519051105b6115ec5760405162461bcd60e51b815260040161063c90612f36565b6020810151518151511080156116115750806000015160400151816020015160400151105b8061163c575080515160208201515110801561163c5750806020015160400151816000015160400151105b806116565750806020015160400151816000015160400151145b6116725760405162461bcd60e51b815260040161063c90612e20565b604080820151905163ea321e4960e01b81526110009163ea321e499161169b9190600401612cb2565b60206040518083038186803b1580156116b357600080fd5b505afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb91906129d4565b6117075760405162461bcd60e51b815260040161063c906130fd565b611719816000015182604001516121d4565b80156117325750611732816020015182604001516121d4565b61174e5760405162461bcd60e51b815260040161063c90612ed7565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117c89190810190612911565b9150915060005b8151811015611905576117f98282815181106117e757fe5b602002602001015185604001516123ac565b156118fd576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906118319033908590600401612c8e565b602060405180830381600087803b15801561184b57600080fd5b505af115801561185f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118839190612b7b565b506110006001600160a01b03166335409f7f8584815181106118a157fe5b60200260200101516040518263ffffffff1660e01b81526004016118c59190612c7a565b600060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b5050505050611905565b6001016117cf565b506040808401519051630e9fbf5160e01b815261200291630e9fbf519161192f9190600401612cb2565b600060405180830381600087803b15801561194957600080fd5b505af115801561195d573d6000803e3d6000fd5b50505050505050565b61100381565b601481565b61200481565b60005460ff161561199a5760405162461bcd60e51b815260040161063c90613206565b603260045560966005556000805460ff19166001179055565b601181565b61100081565b600381565b33611000146119e45760405162461bcd60e51b815260040161063c90612ff3565b60005460ff16611a065760405162461bcd60e51b815260040161063c90612d9e565b600154611a1257611e0a565b600154600090600019015b808211611dde576000805b82841015611b4157611a386126cb565b6002600060018781548110611a4957fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611b2b57600460055481611ab657fe5b04816020015103816020018181525050806002600060018881548110611ad857fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611b35565b6001925050611b41565b50836001019350611a28565b828411611cd857611b506126cb565b6002600060018681548110611b6157fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611c4957600460055481611bce57fe5b04816020015103816020018181525050806002600060018781548110611bf057fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611cd89050565b6002600060018681548110611c5a57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611c9e57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611ccb5750611cd8565b5060001990920191611b41565b818015611ce25750805b15611dc1576002600060018681548110611cf857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611d3f57fe5b600091825260209091200154600180546001600160a01b039092169186908110611d6557fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611d9e57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611dcd575050611dde565b505060019091019060001901611a1d565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b6060611e25611e2083612410565b611e2d565b90505b919050565b606081516001148015611e5f5750607f60f81b82600081518110611e4d57fe5b01602001516001600160f81b03191611155b15611e6b575080611e28565b611e25611e7d8351608060ff166124f6565b836125c8565b6060815160001415611ea45750604080516000815260208101909152611e28565b606082600081518110611eb357fe5b602002602001015190506000600190505b8351811015611ef457611eea82858381518110611edd57fe5b60200260200101516125c8565b9150600101611ec4565b50611f0d611f07825160c060ff166124f6565b826125c8565b9392505050565b8015611f76576040516375cc7d8960e01b8152612002906375cc7d8990611f3f908690600401612c7a565b600060405180830381600087803b158015611f5957600080fd5b505af1158015611f6d573d6000803e3d6000fd5b50505050610a32565b6040516375cc7d8960e01b8152612002906375cc7d8990611f9b908690600401612c7a565b600060405180830381600087803b158015611fb557600080fd5b505af1925050508015611fc6575060015b610a32576040516000815260443d1015611fe25750600061207f565b60046000803e60005160e01c6308c379a0811461200357600091505061207f565b60043d036004833e81513d602482011167ffffffffffffffff8211171561202f5760009250505061207f565b808301805167ffffffffffffffff81111561205157600094505050505061207f565b8060208301013d860181111561206f5760009550505050505061207f565b601f01601f191660405250925050505b8061208a57506120d3565b836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c84836040516120c59291906133e6565b60405180910390a250612148565b3d8080156120fd576040519150601f19603f3d011682016040523d82523d6000602084013e612102565b606091505b50836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c848360405161213e9291906133e6565b60405180910390a2505b610a32565b6000816040516020016121609190612c5e565b60405160208183030381529060405280519060200120836040516020016121879190612c5e565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff8116156121c65760019150816121cc565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b60608152602001906001900390816121f05750506040805160208082528183019092529192506060919080820181803683370190505090506122358560000151611e12565b8260008151811061224257fe5b602002602001018190525061225d6020866020015183612645565b61226681611e2d565b8260018151811061227357fe5b602002602001018190525061228b8560400151611e12565b8260028151811061229857fe5b60200260200101819052506122b36020866060015183612645565b6122bc81611e2d565b826003815181106122c957fe5b60200260200101819052506122ef60206122e284611e83565b8051906020012083612645565b6040805160b080825260e0820190925260609160208201818036833701905050905061231f818360006020612655565b61233181876080015160206060612655565b61233f818660806030612655565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa61237c57600080fd5b50600161238a8260006126af565b60ff161461239f5760009450505050506121a1565b5060019695505050505050565b8151815160009160019181148083146123c85760009250612406565b600160208701838101602088015b6002848385100114156124015780518351146123f55760009650600093505b602092830192016123d6565b505050505b5090949350505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661245457506018612478565b6fffffffffffffffffffffffffffffffff19841661247457506010612478565b5060005b60208110156124ae5781818151811061248d57fe5b01602001516001600160f81b031916156124a6576124ae565b600101612478565b60008160200390506060816040519080825280601f01601f1916602001820160405280156124e3576020820181803683370190505b5080830196909652508452509192915050565b60606801000000000000000083106125205760405162461bcd60e51b815260040161063c90612f0e565b6040805160018082528183019092526060916020820181803683370190505090506037841161257a5782840160f81b8160008151811061255c57fe5b60200101906001600160f81b031916908160001a90535090506121a1565b606061258585612410565b90508381510160370160f81b8260008151811061259e57fe5b60200101906001600160f81b031916908160001a9053506125bf82826125c8565b95945050505050565b6060806040519050835180825260208201818101602087015b818310156125f95780518352602092830192016125e1565b50855184518101855292509050808201602086015b8183101561262657805183526020928301920161260e565b508651929092011591909101601f01601f191660405250905092915050565b9091018181526020918201910152565b60005b818110156126a85783818151811061266c57fe5b602001015160f81c60f81b85848060010195508151811061268957fe5b60200101906001600160f81b031916908160001a905350600101612658565b5050505050565b600081600101835110156126c257600080fd5b50016001015190565b604051806060016040528060008152602001600081526020016000151581525090565b600082601f8301126126fe578081fd5b815161271161270c82613473565b61344c565b818152915060208083019084810160005b84811015612787578151870188603f82011261273d57600080fd5b8381015161274d61270c82613493565b81815260408b8184860101111561276357600080fd5b612772838884018387016134b7565b50865250509282019290820190600101612722565b505050505092915050565b60008083601f8401126127a3578182fd5b50813567ffffffffffffffff8111156127ba578182fd5b6020830191508360208285010111156127d257600080fd5b9250929050565b600082601f8301126127e9578081fd5b81356127f761270c82613493565b915080825283602082850101111561280e57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612838578081fd5b61284260a061344c565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561288057600080fd5b61288c848285016127d9565b60808301525092915050565b6000602082840312156128a9578081fd5b8135611f0d816134e7565b6000602082840312156128c5578081fd5b8151611f0d816134e7565b6000806000606084860312156128e4578182fd5b83356128ef816134e7565b9250602084013591506040840135612906816134ff565b809150509250925092565b60008060408385031215612923578182fd5b825167ffffffffffffffff8082111561293a578384fd5b81850186601f82011261294b578485fd5b8051925061295b61270c84613473565b80848252602080830192508084018a82838902870101111561297b578889fd5b8894505b868510156129a6578051612992816134e7565b84526001949094019392810192810161297f565b5088015190965093505050808211156129bd578283fd5b506129ca858286016126ee565b9150509250929050565b6000602082840312156129e5578081fd5b8151611f0d816134ff565b60008060408385031215612a02578182fd5b823567ffffffffffffffff80821115612a19578384fd5b612a25868387016127d9565b93506020850135915080821115612a3a578283fd5b506129ca858286016127d9565b60008060008060408587031215612a5c578182fd5b843567ffffffffffffffff80821115612a73578384fd5b612a7f88838901612792565b90965094506020870135915080821115612a97578384fd5b50612aa487828801612792565b95989497509550505050565b600060208284031215612ac1578081fd5b813567ffffffffffffffff80821115612ad8578283fd5b81840160608187031215612aea578384fd5b612af4606061344c565b9250803582811115612b04578485fd5b612b1087828401612827565b845250602081013582811115612b24578485fd5b612b3087828401612827565b602085015250604081013582811115612b47578485fd5b612b53878284016127d9565b6040850152509195945050505050565b600060208284031215612b74578081fd5b5035919050565b600060208284031215612b8c578081fd5b5051919050565b600080600060408486031215612ba7578081fd5b833560ff81168114612bb7578182fd5b9250602084013567ffffffffffffffff811115612bd2578182fd5b612bde86828701612792565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612c2d8160208601602086016134b7565b601f01601f19169290920160200192915050565b600a81526919195c1c9958d85d195960b21b602082015260400190565b60008251612c708184602087016134b7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611f0d6020830184612c15565b600082825260406020830152611f0d60408301612c41565b600060408252612cf1604083018688612beb565b8281036020840152612d04818587612beb565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b600060208252611e2560208301612c41565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526133ff6040830184612c15565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561346b57600080fd5b604052919050565b600067ffffffffffffffff821115613489578081fd5b5060209081020190565b600067ffffffffffffffff8211156134a9578081fd5b50601f01601f191660200190565b60005b838110156134d25781810151838201526020016134ba565b838111156134e1576000848401525b50505050565b6001600160a01b03811681146134fc57600080fd5b50565b80151581146134fc57600080fdfea164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102955760003560e01c80637e434d5411610167578063c80d4b8f116100ce578063dcc6f15611610087578063dcc6f156146104d6578063df8079e9146104de578063e1c7392a146104e6578063f9a2bbc7146104ee578063fc4333cd146104f6578063fd6a6879146104fe57610295565b8063c80d4b8f14610498578063c81b1662146104a0578063c8509d8114610425578063c96be4cb146104a8578063cc844b73146104bb578063dc927faf146104ce57610295565b8063a78abc1611610120578063a78abc1614610450578063aa82dce114610458578063aad5606314610460578063ab51bb9614610468578063ac0af6291461047d578063ac4317511461048557610295565b80637e434d54146104155780638256ace61461041d578063831d65d1146104255780639dc09262146104385780639f804f5f14610440578063a1a11bf51461044857610295565b806343756e5c1161020b578063567a372d116101c4578063567a372d146103da5780635bfb4990146103e257806362b72cf5146103f55780636e47b482146103fd57806375d47a0a146104055780637912a65d1461040d57610295565b806343756e5c14610390578063493279b1146103985780634bf6c882146103ad57806350055f90146103c257806351b4dce3146103ca57806351e80672146103d257610295565b8063280870281161025d578063280870281461032457806328aa02b11461032c5780633306ccca1461033f57806335aa2e441461035457806337c8dab914610367578063389f4f711461038857610295565b80630e2374a51461029a5780631182b875146102b857806322d1e80b146102d857806323bac5a2146102ed578063279621181461030f575b600080fd5b6102a2610506565b6040516102af9190612b4a565b60405180910390f35b6102cb6102c6366004612a63565b61050c565b6040516102af9190612b82565b6102e0610572565b6040516102af9190612b77565b6103006102fb366004612768565b61057b565b6040516102af939291906132e5565b61032261031d3660046128c0565b61059e565b005b6102a26108f3565b61032261033a3660046127a0565b6108f9565b61034761092a565b6040516102af91906132ad565b6102a2610362366004612a33565b610930565b61037a610375366004612768565b610957565b6040516102af9291906132d7565b6103476109ae565b6102a26109b4565b6103a06109ba565b6040516102af919061329e565b6103b56109bf565b6040516102af919061330e565b6103476109c4565b6102a26109ca565b6102a26109d0565b6103476109d6565b6103226103f0366004612768565b6109dc565b610347610a64565b6102a2610a6a565b6102a2610a70565b610347610a76565b6102a2610a7b565b61037a610a81565b610322610433366004612a63565b610a8b565b6102a2610aac565b610347610ab2565b6102a2610ab8565b6102e0610abe565b6102a2610ac7565b6102a2610acd565b610470610ad3565b6040516102af91906132fd565b610347610ad8565b610322610493366004612917565b610add565b610347611079565b6102a261107e565b6103226104b6366004612768565b611084565b6103226104c9366004612980565b6113a1565b6102a2611840565b610347611846565b6102a261184b565b610322611851565b6102a261188d565b610322611893565b6102a2611cdc565b61200181565b606033612000146105385760405162461bcd60e51b815260040161052f90613178565b60405180910390fd5b60005460ff1661055a5760405162461bcd60e51b815260040161052f90612c6e565b60405162461bcd60e51b815260040161052f90612e3d565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166105c05760405162461bcd60e51b815260040161052f90612c6e565b6006546105cd5760146006555b6008546105db576170806008555b8151158015906105eb5750805115155b6106075760405162461bcd60e51b815260040161052f9061310d565b60408051600380825260808201909252606091816020015b606081526020019060019003908161061f5790505090506106406038611ce2565b8160008151811061064d57fe5b602002602001018190525061066183611cfd565b8160018151811061066e57fe5b602002602001018190525061068282611cfd565b8160028151811061068f57fe5b602002602001018190525060606106a582611d53565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa6106e657600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d5450690610719908690600401612b4a565b60206040518083038186803b15801561073157600080fd5b505afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190612784565b6001600160a01b031614156107905760405162461bcd60e51b815260040161052f90612c3e565b43600854820110156107b45760405162461bcd60e51b815260040161052f90612bdf565b604051631871f7d960e31b81526120029063c38fbec8906107d9908590600401612b4a565b600060405180830381600087803b1580156107f357600080fd5b505af1158015610807573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f9150610830908590600401612b4a565b600060405180830381600087803b15801561084a57600080fd5b505af115801561085e573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906108969033908590600401612b5e565b602060405180830381600087803b1580156108b057600080fd5b505af11580156108c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e89190612a4b565b505050505050505050565b61200581565b336110001461091a5760405162461bcd60e51b815260040161052f90612ec3565b610925838383611de4565b505050565b61708081565b6001818154811061093d57fe5b6000918252602090912001546001600160a01b0316905081565b60008061096261259b565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b61100181565b603881565b600881565b60065481565b61200681565b61200081565b60045481565b33611000146109fd5760405162461bcd60e51b815260040161052f90612ec3565b60005460ff16610a1f5760405162461bcd60e51b815260040161052f90612c6e565b806001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c6000604051610a599190612b95565b60405180910390a250565b60035481565b61100581565b61100881565b603281565b61200381565b6004546005549091565b33612000146105385760405162461bcd60e51b815260040161052f90613178565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610aff5760405162461bcd60e51b815260040161052f90612c6e565b3361100714610b205760405162461bcd60e51b815260040161052f90612ffc565b610b8b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b6020820152915061201d9050565b15610c265760208114610bb05760405162461bcd60e51b815260040161052f90612e4f565b604080516020601f8401819004810282018101909252828152600091610bee9185858083850183828082843760009201919091525061207792505050565b905060018110158015610c02575060055481105b610c1e5760405162461bcd60e51b815260040161052f90613133565b600455611036565b610c8c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b6020820152915061201d9050565b15610d285760208114610cb15760405162461bcd60e51b815260040161052f9061304a565b604080516020601f8401819004810282018101909252828152600091610cef9185858083850183828082843760009201919091525061207792505050565b90506103e88111158015610d04575060045481115b610d205760405162461bcd60e51b815260040161052f90612d27565b600555611036565b610d9584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b6020820152915061201d9050565b15610e2f5760208114610dba5760405162461bcd60e51b815260040161052f90612f84565b604080516020601f8401819004810282018101909252828152600091610df89185858083850183828082843760009201919091525061207792505050565b9050600a8110158015610e0b5750606481105b610e275760405162461bcd60e51b815260040161052f9061308c565b600655611036565b610ea384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c61736800000000000000006020820152915061201d9050565b15610f1a5760208114610ec85760405162461bcd60e51b815260040161052f90612d5c565b604080516020601f8401819004810282018101909252828152610f04919084848083850183828082843760009201919091525061207c92505050565b6007805460ff1916911515919091179055611036565b610f8184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b6020820152915061201d9050565b1561101e5760208114610fa65760405162461bcd60e51b815260040161052f90612f13565b604080516020601f8401819004810282018101909252828152600091610fe49185858083850183828082843760009201919091525061207792505050565b90506170808110158015610ffa5750620d2f0081105b6110165760405162461bcd60e51b815260040161052f90612ca5565b600855611036565b60405162461bcd60e51b815260040161052f90613214565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161106b9493929190612bad565b60405180910390a150505050565b609681565b61100281565b3341146110a35760405162461bcd60e51b815260040161052f906131c7565b60005460ff166110c55760405162461bcd60e51b815260040161052f90612c6e565b60035443116110e65760405162461bcd60e51b815260040161052f90613269565b3a156111045760405162461bcd60e51b815260040161052f90612f56565b60405163155853f360e21b8152611000906355614fcc90611129908490600401612b4a565b60206040518083038186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117991906128a4565b6111825761139a565b61118a61259b565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff1615801592820192909252906111e557602081018051600101905261123e565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161125057fe5b066112c857600060208201526040516335409f7f60e01b8152611000906335409f7f90611281908590600401612b4a565b600060405180830381600087803b15801561129b57600080fd5b505af11580156112af573d6000803e3d6000fd5b505050506112c38282602001516000611de4565b611334565b6004548160200151816112d757fe5b06611334576040516375abf10160e11b81526110009063eb57e20290611301908590600401612b4a565b600060405180830381600087803b15801561131b57600080fd5b505af115801561132f573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166113c35760405162461bcd60e51b815260040161052f90612c6e565b60075460ff166113e55760405162461bcd60e51b815260040161052f90612c09565b6006546113f25760146006555b600854611400576170806008555b60085481516040015143910111801561142457504360085482602001516040015101115b6114405760405162461bcd60e51b815260040161052f9061323b565b80602001516020015181600001516020015114801561146e5750806020015160600151816000015160600151145b1561148b5760405162461bcd60e51b815260040161052f90612e96565b8051604081015190511080156114aa5750602081015160408101519051105b6114c65760405162461bcd60e51b815260040161052f90612e06565b6020810151518151511080156114eb5750806000015160400151816020015160400151105b8061151657508051516020820151511080156115165750806020015160400151816000015160400151105b806115305750806020015160400151816000015160400151145b61154c5760405162461bcd60e51b815260040161052f90612cf0565b604080820151905163ea321e4960e01b81526110009163ea321e49916115759190600401612b82565b60206040518083038186803b15801561158d57600080fd5b505afa1580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c591906128a4565b6115e15760405162461bcd60e51b815260040161052f90612fcd565b6115f3816000015182604001516120a4565b801561160c575061160c816020015182604001516120a4565b6116285760405162461bcd60e51b815260040161052f90612da7565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561166657600080fd5b505afa15801561167a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116a291908101906127e1565b9150915060005b81518110156117df576116d38282815181106116c157fe5b6020026020010151856040015161227c565b156117d7576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f09061170b9033908590600401612b5e565b602060405180830381600087803b15801561172557600080fd5b505af1158015611739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175d9190612a4b565b506110006001600160a01b03166335409f7f85848151811061177b57fe5b60200260200101516040518263ffffffff1660e01b815260040161179f9190612b4a565b600060405180830381600087803b1580156117b957600080fd5b505af11580156117cd573d6000803e3d6000fd5b50505050506117df565b6001016116a9565b506040808401519051630e9fbf5160e01b815261200291630e9fbf51916118099190600401612b82565b600060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b50505050505050565b61100381565b601481565b61200481565b60005460ff16156118745760405162461bcd60e51b815260040161052f906130d6565b603260045560966005556000805460ff19166001179055565b61100081565b33611000146118b45760405162461bcd60e51b815260040161052f90612ec3565b60005460ff166118d65760405162461bcd60e51b815260040161052f90612c6e565b6001546118e257611cda565b600154600090600019015b808211611cae576000805b82841015611a115761190861259b565b600260006001878154811061191957fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156119fb5760046005548161198657fe5b048160200151038160200181815250508060026000600188815481106119a857fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611a05565b6001925050611a11565b508360010193506118f8565b828411611ba857611a2061259b565b6002600060018681548110611a3157fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611b1957600460055481611a9e57fe5b04816020015103816020018181525050806002600060018781548110611ac057fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611ba89050565b6002600060018681548110611b2a57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611b6e57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611b9b5750611ba8565b5060001990920191611a11565b818015611bb25750805b15611c91576002600060018681548110611bc857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611c0f57fe5b600091825260209091200154600180546001600160a01b039092169186908110611c3557fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611c6e57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611c9d575050611cae565b5050600190910190600019016118ed565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b6060611cf5611cf0836122e0565b611cfd565b90505b919050565b606081516001148015611d2f5750607f60f81b82600081518110611d1d57fe5b01602001516001600160f81b03191611155b15611d3b575080611cf8565b611cf5611d4d8351608060ff166123c6565b83612498565b6060815160001415611d745750604080516000815260208101909152611cf8565b606082600081518110611d8357fe5b602002602001015190506000600190505b8351811015611dc457611dba82858381518110611dad57fe5b6020026020010151612498565b9150600101611d94565b50611ddd611dd7825160c060ff166123c6565b82612498565b9392505050565b8015611e46576040516375cc7d8960e01b8152612002906375cc7d8990611e0f908690600401612b4a565b600060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b50505050610925565b6040516375cc7d8960e01b8152612002906375cc7d8990611e6b908690600401612b4a565b600060405180830381600087803b158015611e8557600080fd5b505af1925050508015611e96575060015b610925576040516000815260443d1015611eb257506000611f4f565b60046000803e60005160e01c6308c379a08114611ed3576000915050611f4f565b60043d036004833e81513d602482011167ffffffffffffffff82111715611eff57600092505050611f4f565b808301805167ffffffffffffffff811115611f21576000945050505050611f4f565b8060208301013d8601811115611f3f57600095505050505050611f4f565b601f01601f191660405250925050505b80611f5a5750611fa3565b836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c8483604051611f959291906132b6565b60405180910390a250612018565b3d808015611fcd576040519150601f19603f3d011682016040523d82523d6000602084013e611fd2565b606091505b50836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c848360405161200e9291906132b6565b60405180910390a2505b610925565b6000816040516020016120309190612b2e565b60405160208183030381529060405280519060200120836040516020016120579190612b2e565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff81161561209657600191508161209c565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b60608152602001906001900390816120c05750506040805160208082528183019092529192506060919080820181803683370190505090506121058560000151611ce2565b8260008151811061211257fe5b602002602001018190525061212d6020866020015183612515565b61213681611cfd565b8260018151811061214357fe5b602002602001018190525061215b8560400151611ce2565b8260028151811061216857fe5b60200260200101819052506121836020866060015183612515565b61218c81611cfd565b8260038151811061219957fe5b60200260200101819052506121bf60206121b284611d53565b8051906020012083612515565b6040805160b080825260e082019092526060916020820181803683370190505090506121ef818360006020612525565b61220181876080015160206060612525565b61220f818660806030612525565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa61224c57600080fd5b50600161225a82600061257f565b60ff161461226f576000945050505050612071565b5060019695505050505050565b81518151600091600191811480831461229857600092506122d6565b600160208701838101602088015b6002848385100114156122d15780518351146122c55760009650600093505b602092830192016122a6565b505050505b5090949350505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661232457506018612348565b6fffffffffffffffffffffffffffffffff19841661234457506010612348565b5060005b602081101561237e5781818151811061235d57fe5b01602001516001600160f81b031916156123765761237e565b600101612348565b60008160200390506060816040519080825280601f01601f1916602001820160405280156123b3576020820181803683370190505b5080830196909652508452509192915050565b60606801000000000000000083106123f05760405162461bcd60e51b815260040161052f90612dde565b6040805160018082528183019092526060916020820181803683370190505090506037841161244a5782840160f81b8160008151811061242c57fe5b60200101906001600160f81b031916908160001a9053509050612071565b6060612455856122e0565b90508381510160370160f81b8260008151811061246e57fe5b60200101906001600160f81b031916908160001a90535061248f8282612498565b95945050505050565b6060806040519050835180825260208201818101602087015b818310156124c95780518352602092830192016124b1565b50855184518101855292509050808201602086015b818310156124f65780518352602092830192016124de565b508651929092011591909101601f01601f191660405250905092915050565b9091018181526020918201910152565b60005b818110156125785783818151811061253c57fe5b602001015160f81c60f81b85848060010195508151811061255957fe5b60200101906001600160f81b031916908160001a905350600101612528565b5050505050565b6000816001018351101561259257600080fd5b50016001015190565b604051806060016040528060008152602001600081526020016000151581525090565b600082601f8301126125ce578081fd5b81516125e16125dc82613343565b61331c565b818152915060208083019084810160005b84811015612657578151870188603f82011261260d57600080fd5b8381015161261d6125dc82613363565b81815260408b8184860101111561263357600080fd5b61264283888401838701613387565b508652505092820192908201906001016125f2565b505050505092915050565b60008083601f840112612673578182fd5b50813567ffffffffffffffff81111561268a578182fd5b6020830191508360208285010111156126a257600080fd5b9250929050565b600082601f8301126126b9578081fd5b81356126c76125dc82613363565b91508082528360208285010111156126de57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612708578081fd5b61271260a061331c565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561275057600080fd5b61275c848285016126a9565b60808301525092915050565b600060208284031215612779578081fd5b8135611ddd816133b7565b600060208284031215612795578081fd5b8151611ddd816133b7565b6000806000606084860312156127b4578182fd5b83356127bf816133b7565b92506020840135915060408401356127d6816133cf565b809150509250925092565b600080604083850312156127f3578182fd5b825167ffffffffffffffff8082111561280a578384fd5b81850186601f82011261281b578485fd5b8051925061282b6125dc84613343565b80848252602080830192508084018a82838902870101111561284b578889fd5b8894505b86851015612876578051612862816133b7565b84526001949094019392810192810161284f565b50880151909650935050508082111561288d578283fd5b5061289a858286016125be565b9150509250929050565b6000602082840312156128b5578081fd5b8151611ddd816133cf565b600080604083850312156128d2578182fd5b823567ffffffffffffffff808211156128e9578384fd5b6128f5868387016126a9565b9350602085013591508082111561290a578283fd5b5061289a858286016126a9565b6000806000806040858703121561292c578182fd5b843567ffffffffffffffff80821115612943578384fd5b61294f88838901612662565b90965094506020870135915080821115612967578384fd5b5061297487828801612662565b95989497509550505050565b600060208284031215612991578081fd5b813567ffffffffffffffff808211156129a8578283fd5b818401606081870312156129ba578384fd5b6129c4606061331c565b92508035828111156129d4578485fd5b6129e0878284016126f7565b8452506020810135828111156129f4578485fd5b612a00878284016126f7565b602085015250604081013582811115612a17578485fd5b612a23878284016126a9565b6040850152509195945050505050565b600060208284031215612a44578081fd5b5035919050565b600060208284031215612a5c578081fd5b5051919050565b600080600060408486031215612a77578081fd5b833560ff81168114612a87578182fd5b9250602084013567ffffffffffffffff811115612aa2578182fd5b612aae86828701612662565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612afd816020860160208601613387565b601f01601f19169290920160200192915050565b600a81526919195c1c9958d85d195960b21b602082015260400190565b60008251612b40818460208701613387565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611ddd6020830184612ae5565b600082825260406020830152611ddd60408301612b11565b600060408252612bc1604083018688612abb565b8281036020840152612bd4818587612abb565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b600060208252611cf560208301612b11565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526132cf6040830184612ae5565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561333b57600080fd5b604052919050565b600067ffffffffffffffff821115613359578081fd5b5060209081020190565b600067ffffffffffffffff821115613379578081fd5b50601f01601f191660200190565b60005b838110156133a257818101518382015260200161338a565b838111156133b1576000848401525b50505050565b6001600160a01b03811681146133cc57600080fd5b50565b80151581146133cc57600080fdfea164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001002": { "balance": "0x0", - "code": "0x6080604052600436106101fd5760003560e01c806396713da91161010d578063ac431751116100a0578063f1fad1041161006f578063f1fad1041461062b578063f9a2bbc714610640578063fb5478b314610655578063fc3e59081461066a578063fd6a68791461067f57610241565b8063ac4317511461051d578063c81b1662146105ec578063dc927faf14610601578063df8079e91461061657610241565b8063a78abc16116100dc578063a78abc16146104c9578063aa82dce1146104de578063aad56063146104f3578063ab51bb961461050857610241565b806396713da9146104515780639a99b4f0146104665780639dc092621461049f578063a1a11bf5146104b457610241565b806351b4dce31161019057806370fd5bad1161015f57806370fd5bad146103e8578063718a8aa8146103fd57806375d47a0a146104125780637942fd05146104275780637e434d541461043c57610241565b806351b4dce31461036257806351e80672146103775780636d70f7ae1461038c5780636e47b482146103d357610241565b80633dffc387116101cc5780633dffc387146102e157806343756e5c1461030c578063493279b1146103215780634bf6c8821461034d57610241565b80630bee7a67146102465780630e2374a51461027457806328087028146102a55780633a0b0eff146102ba57610241565b3661024157341561023f5760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b34801561025257600080fd5b5061025b610694565b6040805163ffffffff9092168252519081900360200190f35b34801561028057600080fd5b50610289610699565b604080516001600160a01b039092168252519081900360200190f35b3480156102b157600080fd5b5061028961069f565b3480156102c657600080fd5b506102cf6106a5565b60408051918252519081900360200190f35b3480156102ed57600080fd5b506102f66106ab565b6040805160ff9092168252519081900360200190f35b34801561031857600080fd5b506102896106b0565b34801561032d57600080fd5b506103366106b6565b6040805161ffff9092168252519081900360200190f35b34801561035957600080fd5b506102f66106bb565b34801561036e57600080fd5b506102896106c0565b34801561038357600080fd5b506102896106c6565b34801561039857600080fd5b506103bf600480360360208110156103af57600080fd5b50356001600160a01b03166106cc565b604080519115158252519081900360200190f35b3480156103df57600080fd5b506102896106ea565b3480156103f457600080fd5b506102f66106f0565b34801561040957600080fd5b506102f66106f5565b34801561041e57600080fd5b506102896106fa565b34801561043357600080fd5b506102f6610700565b34801561044857600080fd5b50610289610705565b34801561045d57600080fd5b506102f661070b565b34801561047257600080fd5b506102cf6004803603604081101561048957600080fd5b506001600160a01b038135169060200135610710565b3480156104ab57600080fd5b506102896108bb565b3480156104c057600080fd5b506102896108c1565b3480156104d557600080fd5b506103bf6108c7565b3480156104ea57600080fd5b506102896108d0565b3480156104ff57600080fd5b506102896108d6565b34801561051457600080fd5b5061025b6108dc565b34801561052957600080fd5b5061023f6004803603604081101561054057600080fd5b81019060208101813564010000000081111561055b57600080fd5b82018360208201111561056d57600080fd5b8035906020019184600183028401116401000000008311171561058f57600080fd5b9193909290916020810190356401000000008111156105ad57600080fd5b8201836020820111156105bf57600080fd5b803590602001918460018302840111640100000000831117156105e157600080fd5b5090925090506108e1565b3480156105f857600080fd5b50610289610c64565b34801561060d57600080fd5b50610289610c6a565b34801561062257600080fd5b50610289610c70565b34801561063757600080fd5b506102f6610c76565b34801561064c57600080fd5b50610289610c7b565b34801561066157600080fd5b506102cf610c81565b34801561067657600080fd5b506102f6610c8d565b34801561068b57600080fd5b50610289610c92565b606481565b61200181565b61200581565b60015481565b600181565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b600981565b6000805460ff1661078d57600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166107db5760405162461bcd60e51b815260040180806020018281038252602b815260200180610d80602b913960400191505060405180910390fd5b60004783106107ea57476107ec565b825b9050674563918244f400008111156108095750674563918244f400005b801561088a576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610845573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a26108b4565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146109215760405162461bcd60e51b815260040180806020018281038252602e815260200180610dda602e913960400191505060405180910390fd5b61098384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610c989050565b15610a5b57606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060149091149050610a065760405162461bcd60e51b815260040180806020018281038252602c815260200180610e08602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610bd2565b610ac084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610c989050565b15610b9557606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060149091149050610b435760405162461bcd60e51b815260040180806020018281038252602f815260200180610dab602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610bd2565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61200481565b601181565b61100081565b674563918244f4000081565b600381565b61100481565b6000816040516020018082805190602001908083835b60208310610ccd5780518252601f199092019160209182019101610cae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610d3b5780518252601f199092019160209182019101610d1c565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a164736f6c6343000604000a" + "code": "0x6080604052600436106101855760003560e01c80639dc09262116100d1578063ac4317511161008a578063df8079e911610064578063df8079e914610520578063f9a2bbc714610535578063fb5478b31461054a578063fd6a68791461055f576101c9565b8063ac43175114610427578063c81b1662146104f6578063dc927faf1461050b576101c9565b80639dc0926214610390578063a1a11bf5146103a5578063a78abc16146103ba578063aa82dce1146103cf578063aad56063146103e4578063ab51bb96146103f9576101c9565b806351b4dce31161013e5780636e47b482116101185780636e47b4821461031857806375d47a0a1461032d5780637e434d54146103425780639a99b4f014610357576101c9565b806351b4dce3146102a757806351e80672146102bc5780636d70f7ae146102d1576101c9565b80630e2374a5146101ce57806328087028146101ff5780633a0b0eff1461021457806343756e5c1461023b578063493279b1146102505780634bf6c8821461027c576101c9565b366101c95734156101c75760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101da57600080fd5b506101e3610574565b604080516001600160a01b039092168252519081900360200190f35b34801561020b57600080fd5b506101e361057a565b34801561022057600080fd5b50610229610580565b60408051918252519081900360200190f35b34801561024757600080fd5b506101e3610586565b34801561025c57600080fd5b5061026561058c565b6040805161ffff9092168252519081900360200190f35b34801561028857600080fd5b50610291610591565b6040805160ff9092168252519081900360200190f35b3480156102b357600080fd5b506101e3610596565b3480156102c857600080fd5b506101e361059c565b3480156102dd57600080fd5b50610304600480360360208110156102f457600080fd5b50356001600160a01b03166105a2565b604080519115158252519081900360200190f35b34801561032457600080fd5b506101e36105c0565b34801561033957600080fd5b506101e36105c6565b34801561034e57600080fd5b506101e36105cc565b34801561036357600080fd5b506102296004803603604081101561037a57600080fd5b506001600160a01b0381351690602001356105d2565b34801561039c57600080fd5b506101e361077d565b3480156103b157600080fd5b506101e3610783565b3480156103c657600080fd5b50610304610789565b3480156103db57600080fd5b506101e3610792565b3480156103f057600080fd5b506101e3610798565b34801561040557600080fd5b5061040e61079e565b6040805163ffffffff9092168252519081900360200190f35b34801561043357600080fd5b506101c76004803603604081101561044a57600080fd5b81019060208101813564010000000081111561046557600080fd5b82018360208201111561047757600080fd5b8035906020019184600183028401116401000000008311171561049957600080fd5b9193909290916020810190356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460018302840111640100000000831117156104eb57600080fd5b5090925090506107a3565b34801561050257600080fd5b506101e3610b26565b34801561051757600080fd5b506101e3610b2c565b34801561052c57600080fd5b506101e3610b32565b34801561054157600080fd5b506101e3610b38565b34801561055657600080fd5b50610229610b3e565b34801561056b57600080fd5b506101e3610b4a565b61200181565b61200581565b60015481565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b61100881565b61200381565b6000805460ff1661064f57600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff1661069d5760405162461bcd60e51b815260040180806020018281038252602b815260200180610c38602b913960400191505060405180910390fd5b60004783106106ac57476106ae565b825b9050674563918244f400008111156106cb5750674563918244f400005b801561074c576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610707573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a2610776565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146107e35760405162461bcd60e51b815260040180806020018281038252602e815260200180610c92602e913960400191505060405180910390fd5b61084584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610b509050565b1561091d57606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506108c85760405162461bcd60e51b815260040180806020018281038252602c815260200180610cc0602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610a94565b61098284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610b509050565b15610a5757606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060149091149050610a055760405162461bcd60e51b815260040180806020018281038252602f815260200180610c63602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610a94565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61200481565b61100081565b674563918244f4000081565b61100481565b6000816040516020018082805190602001908083835b60208310610b855780518252601f199092019160209182019101610b66565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610bf35780518252601f199092019160209182019101610bd4565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001003": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063a78abc1611610151578063dda83148116100c3578063e405bbc311610087578063e405bbc314610724578063ea54b2aa1461072c578063f1fad10414610734578063f9a2bbc71461073c578063fc3e590814610744578063fd6a68791461074c57610274565b8063dda83148146106a4578063df5fe704146106ca578063df8079e9146106f0578063e1c7392a146106f8578063e2761af01461070057610274565b8063adc879e911610115578063adc879e9146105c7578063c81b1662146105cf578063cba510a9146105d7578063d8169879146105fd578063da8d08f014610676578063dc927faf1461069c57610274565b8063a78abc16146104cf578063aa82dce1146104eb578063aad56063146104f3578063ab51bb96146104fb578063ac4317511461050357610274565b8063564b81ef116101ea57806375d47a0a116101ae57806375d47a0a1461049f5780637942fd05146104a75780637e434d54146104af57806396713da9146104b75780639dc09262146104bf578063a1a11bf5146104c757610274565b8063564b81ef146103455780635c5ae8db146103c25780636e47b4821461048757806370fd5bad1461048f578063718a8aa81461049757610274565b80633dffc3871161023c5780633dffc387146102e857806343756e5c14610306578063493279b11461030e5780634bf6c8821461032d57806351b4dce31461033557806351e806721461033d57610274565b80630bee7a67146102795780630e2374a51461029a5780632657e9b6146102be57806328087028146102d857806333f7798d146102e0575b600080fd5b610281610754565b6040805163ffffffff9092168252519081900360200190f35b6102a2610759565b604080516001600160a01b039092168252519081900360200190f35b6102c661075f565b60408051918252519081900360200190f35b6102a261076a565b6102c6610770565b6102f0610776565b6040805160ff9092168252519081900360200190f35b6102a261077b565b610316610781565b6040805161ffff9092168252519081900360200190f35b6102f0610786565b6102a261078b565b6102a2610791565b61034d610797565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038757818101518382015260200161036f565b50505050905090810190601f1680156103b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360208110156103d857600080fd5b50356001600160401b03166108a2565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610449578181015183820152602001610431565b50505050905090810190601f1680156104765780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102a261095d565b6102f0610963565b6102f0610968565b6102a261096d565b6102f0610973565b6102a2610978565b6102f061097e565b6102a2610983565b6102a2610989565b6104d761098f565b604080519115158252519081900360200190f35b6102a2610998565b6102a261099e565b6102816109a4565b6105c56004803603604081101561051957600080fd5b81019060208101813564010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91939092909160208101903564010000000081111561058657600080fd5b82018360208201111561059857600080fd5b803590602001918460018302840111640100000000831117156105ba57600080fd5b5090925090506109a9565b005b6102c6610a7a565b6102a2610a80565b6102c6600480360360208110156105ed57600080fd5b50356001600160401b0316610a86565b6104d76004803603604081101561061357600080fd5b81019060208101813564010000000081111561062e57600080fd5b82018360208201111561064057600080fd5b8035906020019184600183028401116401000000008311171561066257600080fd5b9193509150356001600160401b0316610aa5565b6102a26004803603602081101561068c57600080fd5b50356001600160401b0316610b65565b6102a2610b80565b6102a2600480360360208110156106ba57600080fd5b50356001600160401b0316610b86565b6104d7600480360360208110156106e057600080fd5b50356001600160401b0316610baa565b6102a2610bec565b6105c5610bf2565b610708610c92565b604080516001600160401b039092168252519081900360200190f35b610708610ca1565b61034d610cbc565b6102f0610cdb565b6102a2610ce0565b6102f0610ce6565b6102a2610ceb565b606481565b61200181565b662386f26fc1000081565b61200581565b60055481565b600181565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561080d57828160ff16815181106107e157fe5b01602001516001600160f81b0319161561080057816001019150610805565b61080d565b6001016107c6565b5060608160ff166040519080825280601f01601f19166020018201604052801561083e576020820181803683370190505b50905060005b8260ff168160ff16101561089a57838160ff168151811061086157fe5b602001015160f81c60f81b828260ff168151811061087b57fe5b60200101906001600160f81b031916908160001a905350600101610844565b509250505090565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156109535780601f1061092857610100808354040283529160200191610953565b820191906000526020600020905b81548152906001019060200180831161093657829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610a00576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610a405760405162461bcd60e51b815260040180806020018281038252602e815260200180610cfc602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610ae857600080fd5b505afa158015610afc573d6000803e3d6000fd5b505050506040513d6020811015610b1257600080fd5b5051610a40576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610be657506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610c4a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610c716040518061024001604052806102208152602001610d2a6102209139610cf1565b505160045550506000805460ff19166001179055662386f26fc10000600555565b6003546001600160401b031681565b6003546801000000000000000090046001600160401b031681565b6040518061024001604052806102208152602001610d2a610220913981565b601181565b61100081565b600381565b61100481565b805160209091019156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063aad5606311610125578063dda83148116100ad578063e2761af01161007c578063e2761af014610678578063e405bbc31461069c578063ea54b2aa146106a4578063f9a2bbc7146106ac578063fd6a6879146106b45761021c565b8063dda831481461061c578063df5fe70414610642578063df8079e914610668578063e1c7392a146106705761021c565b8063c81b1662116100f4578063c81b166214610547578063cba510a91461054f578063d816987914610575578063da8d08f0146105ee578063dc927faf146106145761021c565b8063aad5606314610452578063ab51bb961461045a578063ac4317511461047b578063adc879e91461053f5761021c565b8063564b81ef116101a85780637e434d54116101775780637e434d54146104165780639dc092621461041e578063a1a11bf514610426578063a78abc161461042e578063aa82dce11461044a5761021c565b8063564b81ef146102c45780635c5ae8db146103415780636e47b4821461040657806375d47a0a1461040e5761021c565b806343756e5c116101ef57806343756e5c1461026f578063493279b1146102775780634bf6c8821461029657806351b4dce3146102b457806351e80672146102bc5761021c565b80630e2374a5146102215780632657e9b614610245578063280870281461025f57806333f7798d14610267575b600080fd5b6102296106bc565b604080516001600160a01b039092168252519081900360200190f35b61024d6106c2565b60408051918252519081900360200190f35b6102296106cd565b61024d6106d3565b6102296106d9565b61027f6106df565b6040805161ffff9092168252519081900360200190f35b61029e6106e4565b6040805160ff9092168252519081900360200190f35b6102296106e9565b6102296106ef565b6102cc6106f5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103065781810151838201526020016102ee565b50505050905090810190601f1680156103335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103676004803603602081101561035757600080fd5b50356001600160401b0316610800565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103c85781810151838201526020016103b0565b50505050905090810190601f1680156103f55780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102296108bb565b6102296108c1565b6102296108c7565b6102296108cd565b6102296108d3565b6104366108d9565b604080519115158252519081900360200190f35b6102296108e2565b6102296108e8565b6104626108ee565b6040805163ffffffff9092168252519081900360200190f35b61053d6004803603604081101561049157600080fd5b8101906020810181356401000000008111156104ac57600080fd5b8201836020820111156104be57600080fd5b803590602001918460018302840111640100000000831117156104e057600080fd5b9193909290916020810190356401000000008111156104fe57600080fd5b82018360208201111561051057600080fd5b8035906020019184600183028401116401000000008311171561053257600080fd5b5090925090506108f3565b005b61024d6109c4565b6102296109ca565b61024d6004803603602081101561056557600080fd5b50356001600160401b03166109d0565b6104366004803603604081101561058b57600080fd5b8101906020810181356401000000008111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111640100000000831117156105da57600080fd5b9193509150356001600160401b03166109ef565b6102296004803603602081101561060457600080fd5b50356001600160401b0316610aaf565b610229610aca565b6102296004803603602081101561063257600080fd5b50356001600160401b0316610ad0565b6104366004803603602081101561065857600080fd5b50356001600160401b0316610af4565b610229610b36565b61053d610b3c565b610680610bdc565b604080516001600160401b039092168252519081900360200190f35b610680610beb565b6102cc610c06565b610229610c25565b610229610c2b565b61200181565b662386f26fc1000081565b61200581565b60055481565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561076b57828160ff168151811061073f57fe5b01602001516001600160f81b0319161561075e57816001019150610763565b61076b565b600101610724565b5060608160ff166040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b50905060005b8260ff168160ff1610156107f857838160ff16815181106107bf57fe5b602001015160f81c60f81b828260ff16815181106107d957fe5b60200101906001600160f81b031916908160001a9053506001016107a2565b509250505090565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905084565b61100581565b61100881565b61200381565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff1661094a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461098a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610c3c602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610a3257600080fd5b505afa158015610a46573d6000803e3d6000fd5b505050506040513d6020811015610a5c57600080fd5b505161098a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610b3057506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610b94576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610bbb6040518061024001604052806102208152602001610c6a6102209139610c31565b505160045550506000805460ff19166001179055662386f26fc10000600555565b6003546001600160401b031681565b6003546801000000000000000090046001600160401b031681565b6040518061024001604052806102208152602001610c6a610220913981565b61100081565b61100481565b805160209091019156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001004": { "balance": "176405560900000000000000000", - "code": "0x6080604052600436106104405760003560e01c80639509b98011610234578063c81b16621161012e578063ebf71d53116100b6578063fb063e8f1161007a578063fb063e8f1461104e578063fc1a598f14611063578063fc3e590814610cca578063fd6a687914611096578063ff9c0027146108a057610488565b8063ebf71d5314610fe5578063f014847214610ffa578063f1fad1041461100f578063f9a2bbc714611024578063fa9e91591461103957610488565b8063dc927faf116100fd578063dc927faf14610f49578063df8079e914610f5e578063e04c83a714610f73578063e1c7392a14610f9d578063e8f35cea14610fb257610488565b8063c81b166214610ef9578063c8509d8114610ac8578063cf41984414610f0e578063d9e6dae91461080d57610488565b8063aa7415f5116101bc578063b99328c511610180578063b99328c514610e30578063b9fd21e314610e69578063ba35ead614610e7e578063bbface1f14610e93578063bd46646114610ec657610488565b8063aa7415f514610cdf578063aa82dce114610d26578063aad5606314610d3b578063ab51bb9614610d50578063ac43175114610d6557610488565b80639dc09262116102035780639dc0926214610c76578063a1a11bf514610c8b578063a496fba214610ca0578063a78abc1614610cb5578063a7c9f02d14610cca57610488565b80639509b98014610bda57806396713da914610c135780639a854bbd14610c285780639a99b4f014610c3d57610488565b806359b9278911610345578063727be1f8116102cd578063831d65d111610291578063831d65d114610ac85780638525db0314610b4d5780638b87b21f146107625780638eff336c14610b8657806393ab703f14610bc557610488565b8063727be1f814610a2057806375d47a0a14610a4a5780637942fd0514610a5f578063799758b914610a745780637e434d5414610ab357610488565b80636e056520116103145780636e056520146108b55780636e47b482146109e157806370fd5bad146108a0578063718a8aa8146109f657806371d3086314610a0b57610488565b806359b92789146108615780635d499b1b1461088b578063613684751461080d57806366dea52a146108a057610488565b80633fd8b02f116103c85780634a3acdf4116103975780634a3acdf4146107f85780634bf6c8821461080d57806350432d321461082257806351b4dce31461083757806351e806721461084c57610488565b80633fd8b02f1461078d57806343756e5c146107a257806343a368b9146107b7578063493279b1146107cc57610488565b8063149d14d91161040f578063149d14d91461062157806328087028146106485780632ae454831461065d5780633d713223146106b15780633dffc3871461076257610488565b80630bee7a671461048d5780630e2374a5146104bb5780631182b875146104ec57806312234582146105e657610488565b36610488573415610486576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561049957600080fd5b506104a26110ab565b6040805163ffffffff9092168252519081900360200190f35b3480156104c757600080fd5b506104d06110b0565b604080516001600160a01b039092168252519081900360200190f35b3480156104f857600080fd5b506105716004803603604081101561050f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561053357600080fd5b82018360208201111561054557600080fd5b803590602001918460018302840111600160201b8311171561056657600080fd5b5090925090506110b6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ab578181015183820152602001610593565b50505050905090810190601f1680156105d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105f257600080fd5b506104866004803603604081101561060957600080fd5b506001600160a01b03813581169160200135166110fe565b34801561062d57600080fd5b50610636611178565b60408051918252519081900360200190f35b34801561065457600080fd5b506104d061117e565b34801561066957600080fd5b506106986004803603604081101561068057600080fd5b506001600160a01b0381358116916020013516611184565b6040805192835260208301919091528051918290030190f35b3480156106bd57600080fd5b506104d0600480360360208110156106d457600080fd5b810190602081018135600160201b8111156106ee57600080fd5b82018360208201111561070057600080fd5b803590602001918460018302840111600160201b8311171561072157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506111a8945050505050565b34801561076e57600080fd5b506107776111cc565b6040805160ff9092168252519081900360200190f35b34801561079957600080fd5b506106366111d1565b3480156107ae57600080fd5b506104d06111d7565b3480156107c357600080fd5b506106366111dd565b3480156107d857600080fd5b506107e16111e9565b6040805161ffff9092168252519081900360200190f35b34801561080457600080fd5b506106366111ee565b34801561081957600080fd5b506107776111f4565b34801561082e57600080fd5b506106366111f9565b34801561084357600080fd5b506104d0611204565b34801561085857600080fd5b506104d061120a565b34801561086d57600080fd5b506104d06004803603602081101561088457600080fd5b5035611210565b34801561089757600080fd5b5061063661122b565b3480156108ac57600080fd5b50610777611234565b6109cd600480360360808110156108cb57600080fd5b810190602081018135600160201b8111156108e557600080fd5b8201836020820111156108f757600080fd5b803590602001918460208302840111600160201b8311171561091857600080fd5b919390929091602081019035600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b91935091503567ffffffffffffffff16611239565b604080519115158252519081900360200190f35b3480156109ed57600080fd5b506104d061127f565b348015610a0257600080fd5b50610777611285565b348015610a1757600080fd5b5061063661128a565b348015610a2c57600080fd5b506109cd60048036036020811015610a4357600080fd5b5035611290565b348015610a5657600080fd5b506104d06112cc565b348015610a6b57600080fd5b506107776112d2565b348015610a8057600080fd5b5061048660048036036060811015610a9757600080fd5b508035906001600160a01b0360208201351690604001356112d7565b348015610abf57600080fd5b506104d0611587565b348015610ad457600080fd5b5061048660048036036040811015610aeb57600080fd5b60ff8235169190810190604081016020820135600160201b811115610b0f57600080fd5b820183602082011115610b2157600080fd5b803590602001918460018302840111600160201b83111715610b4257600080fd5b50909250905061158d565b348015610b5957600080fd5b5061048660048036036040811015610b7057600080fd5b50803590602001356001600160a01b03166115d2565b348015610b9257600080fd5b5061048660048036036060811015610ba957600080fd5b508035906001600160a01b03602082013516906040013561173b565b348015610bd157600080fd5b5061063661177b565b348015610be657600080fd5b5061048660048036036040811015610bfd57600080fd5b506001600160a01b038135169060200135611782565b348015610c1f57600080fd5b50610777611844565b348015610c3457600080fd5b50610636611849565b348015610c4957600080fd5b5061063660048036036040811015610c6057600080fd5b506001600160a01b038135169060200135611855565b348015610c8257600080fd5b506104d0611993565b348015610c9757600080fd5b506104d0611999565b348015610cac57600080fd5b5061077761199f565b348015610cc157600080fd5b506109cd6119a4565b348015610cd657600080fd5b506107776119ad565b6109cd60048036036080811015610cf557600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16611239565b348015610d3257600080fd5b506104d06119b2565b348015610d4757600080fd5b506104d06119b8565b348015610d5c57600080fd5b506104a261199f565b348015610d7157600080fd5b5061048660048036036040811015610d8857600080fd5b810190602081018135600160201b811115610da257600080fd5b820183602082011115610db457600080fd5b803590602001918460018302840111600160201b83111715610dd557600080fd5b919390929091602081019035600160201b811115610df257600080fd5b820183602082011115610e0457600080fd5b803590602001918460018302840111600160201b83111715610e2557600080fd5b5090925090506119be565b348015610e3c57600080fd5b5061048660048036036040811015610e5357600080fd5b50803590602001356001600160a01b031661173b565b348015610e7557600080fd5b506106366119fe565b348015610e8a57600080fd5b50610636611a08565b348015610e9f57600080fd5b5061063660048036036020811015610eb657600080fd5b50356001600160a01b0316611a0e565b348015610ed257600080fd5b5061063660048036036020811015610ee957600080fd5b50356001600160a01b0316611a20565b348015610f0557600080fd5b506104d0611a3b565b348015610f1a57600080fd5b5061048660048036036040811015610f3157600080fd5b506001600160a01b0381358116916020013516611a41565b348015610f5557600080fd5b506104d0611d15565b348015610f6a57600080fd5b506104d0611d1b565b348015610f7f57600080fd5b506109cd60048036036020811015610f9657600080fd5b5035611d21565b348015610fa957600080fd5b50610486611dc1565b348015610fbe57600080fd5b5061063660048036036020811015610fd557600080fd5b50356001600160a01b0316611e61565b348015610ff157600080fd5b50610777611e73565b34801561100657600080fd5b50610777611e78565b34801561101b57600080fd5b50610777611e7d565b34801561103057600080fd5b506104d0611e82565b34801561104557600080fd5b50610636611e88565b34801561105a57600080fd5b50610636611e8e565b34801561106f57600080fd5b506105716004803603602081101561108657600080fd5b50356001600160a01b0316611e9c565b3480156110a257600080fd5b506104d0611fc3565b606481565b61200181565b60005460609060ff166110fe576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b336120001461113e5760405162461bcd60e51b815260040180806020018281038252602f815260200180612319602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b603881565b61a8c081565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661113e576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b61100581565b601081565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b600b81565b60005460ff1661131c576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b336130001461135c5760405162461bcd60e51b815260040180806020018281038252602b81526020018061229f602b913960400191505060405180910390fd5b677ce66c50e28400008111156113a35760405162461bcd60e51b815260040180806020018281038252603581526020018061226a6035913960400191505060405180910390fd5b60006221272160e91b841461150d576000848152600460205260409020546001600160a01b031680611416576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a35050611582565b6001600160a01b0381166000908152600260205260409020546114398482611fc9565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561148457600080fd5b505afa158015611498573d6000803e3d6000fd5b505050506040513d60208110156114ae57600080fd5b505110156114fa576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61150686838588612009565b5050611580565b611522826402540be40063ffffffff6120a316565b905080471015611570576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600061157e85828487612009565b505b505b505050565b61200381565b60005460ff166110fe576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b33613000146116125760405162461bcd60e51b815260040180806020018281038252602b81526020018061229f602b913960400191505060405180910390fd5b60006221272160e91b831461167d57506000828152600460205260409020546001600160a01b03168061167d576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b03808216600090815260076020908152604080832093861683529290522080546116e8576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b336110081461113e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123486023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156117bc57600080fd5b505afa1580156117d0573d6000803e3d6000fd5b505050506040513d60208110156117e657600080fd5b50516001600160a01b0316331461113e576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b600981565b677ce66c50e284000081565b6000805460ff1661189b576040805162461bcd60e51b8152602060048201526019602482015260008051602061236b833981519152604482015290519081900360640190fd5b33611005146118db5760405162461bcd60e51b815260040180806020018281038252602f81526020018061223b602f913960400191505060405180910390fd5b60004783106118ea57476118ec565b825b9050670de0b6b3a764000081111561190857600091505061198d565b801561198a576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611944573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b61200281565b61300081565b336110071461113e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806122eb602e913960400191505060405180910390fd5b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff1660021415611a8d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054611b05576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015611b5e576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516611bd1576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114611bc1576040519150601f19603f3d011682016040523d82523d6000602084013e611bc6565b606091505b505080915050611c64565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015611c3457600080fd5b5087f1158015611c48573d6000803e3d6000fd5b50505050506040513d6020811015611c5f57600080fd5b505190505b80611cb6576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b61200481565b60003361200214611d79576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710611db9576040516120029083156108fc029084906000818181858888f19350505050158015611daf573d6000803e3d6000fd5b50600190506111c7565b506000919050565b60005460ff1615611e19576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b601181565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015611f2c57828160ff1681518110611f0057fe5b01602001516001600160f81b03191615611f1f57816001019150611f24565b611f2c565b600101611ee5565b5060608160ff166040519080825280601f01601f191660200182016040528015611f5d576020820181803683370190505b50905060005b8260ff168160ff161015611fb957838160ff1681518110611f8057fe5b602001015160f81c60f81b828260ff1681518110611f9a57fe5b60200101906001600160f81b031916908160001a905350600101611f63565b5095945050505050565b61100481565b60006008821115611ff257611feb836007198401600a0a63ffffffff6120a316565b905061198d565b61198a836008849003600a0a63ffffffff6120fc16565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054612040908463ffffffff61213e16565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b6000826120b25750600061198d565b828202828482816120bf57fe5b041461198a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ca6021913960400191505060405180910390fd5b600061198a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612198565b60008282018381101561198a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081836122245760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121e95781810151838201526020016121d1565b50505050905090810190601f1680156122165780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161223057fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" + "code": "0x6080604052600436106103545760003560e01c80638eff336c116101c6578063b9fd21e3116100f7578063df8079e911610095578063e8f35cea1161006f578063e8f35cea14610df4578063f9a2bbc714610e27578063fc1a598f14610e3c578063fd6a687914610e6f5761039c565b8063df8079e914610da0578063e04c83a714610db5578063e1c7392a14610ddf5761039c565b8063c81b1662116100d1578063c81b166214610d3b578063c8509d8114610945578063cf41984414610d50578063dc927faf14610d8b5761039c565b8063b9fd21e314610cc0578063bbface1f14610cd5578063bd46646114610d085761039c565b8063a78abc1611610164578063aad560631161013e578063aad5606314610b79578063ab51bb9614610b8e578063ac43175114610bbc578063b99328c514610c875761039c565b8063a78abc1614610b08578063aa7415f514610b1d578063aa82dce114610b645761039c565b80639a854bbd116101a05780639a854bbd14610a905780639a99b4f014610aa55780639dc0926214610ade578063a1a11bf514610af35761039c565b80638eff336c14610a0357806393ab703f14610a425780639509b98014610a575761039c565b806351b4dce3116102a057806371d308631161023e578063799758b911610218578063799758b9146108f15780637e434d5414610930578063831d65d1146109455780638525db03146109ca5761039c565b806371d308631461089d578063727be1f8146108b257806375d47a0a146108dc5761039c565b80635d499b1b1161027a5780635d499b1b1461074757806361368475146106b35780636e0565201461075c5780636e47b482146108885761039c565b806351b4dce3146106f357806351e806721461070857806359b927891461071d5761039c565b80633d7132231161030d57806343a368b9116102e757806343a368b914610672578063493279b1146106875780634bf6c882146106b357806350432d32146106de5761039c565b80633d713223146105975780633fd8b02f1461064857806343756e5c1461065d5761039c565b80630e2374a5146103a15780631182b875146103d257806312234582146104cc578063149d14d914610507578063280870281461052e5780632ae45483146105435761039c565b3661039c57341561039a576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b3480156103ad57600080fd5b506103b6610e84565b604080516001600160a01b039092168252519081900360200190f35b3480156103de57600080fd5b50610457600480360360408110156103f557600080fd5b60ff8235169190810190604081016020820135600160201b81111561041957600080fd5b82018360208201111561042b57600080fd5b803590602001918460018302840111600160201b8311171561044c57600080fd5b509092509050610e8a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610491578181015183820152602001610479565b50505050905090810190601f1680156104be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104d857600080fd5b5061039a600480360360408110156104ef57600080fd5b506001600160a01b0381358116916020013516610ed2565b34801561051357600080fd5b5061051c610f4c565b60408051918252519081900360200190f35b34801561053a57600080fd5b506103b6610f52565b34801561054f57600080fd5b5061057e6004803603604081101561056657600080fd5b506001600160a01b0381358116916020013516610f58565b6040805192835260208301919091528051918290030190f35b3480156105a357600080fd5b506103b6600480360360208110156105ba57600080fd5b810190602081018135600160201b8111156105d457600080fd5b8201836020820111156105e657600080fd5b803590602001918460018302840111600160201b8311171561060757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f7c945050505050565b34801561065457600080fd5b5061051c610fa0565b34801561066957600080fd5b506103b6610fa6565b34801561067e57600080fd5b5061051c610fac565b34801561069357600080fd5b5061069c610fb8565b6040805161ffff9092168252519081900360200190f35b3480156106bf57600080fd5b506106c8610fbd565b6040805160ff9092168252519081900360200190f35b3480156106ea57600080fd5b5061051c610fc2565b3480156106ff57600080fd5b506103b6610fcd565b34801561071457600080fd5b506103b6610fd3565b34801561072957600080fd5b506103b66004803603602081101561074057600080fd5b5035610fd9565b34801561075357600080fd5b5061051c610ff4565b6108746004803603608081101561077257600080fd5b810190602081018135600160201b81111561078c57600080fd5b82018360208201111561079e57600080fd5b803590602001918460208302840111600160201b831117156107bf57600080fd5b919390929091602081019035600160201b8111156107dc57600080fd5b8201836020820111156107ee57600080fd5b803590602001918460208302840111600160201b8311171561080f57600080fd5b919390929091602081019035600160201b81111561082c57600080fd5b82018360208201111561083e57600080fd5b803590602001918460208302840111600160201b8311171561085f57600080fd5b91935091503567ffffffffffffffff16610ffd565b604080519115158252519081900360200190f35b34801561089457600080fd5b506103b6611043565b3480156108a957600080fd5b5061051c611049565b3480156108be57600080fd5b50610874600480360360208110156108d557600080fd5b503561104f565b3480156108e857600080fd5b506103b661108b565b3480156108fd57600080fd5b5061039a6004803603606081101561091457600080fd5b508035906001600160a01b036020820135169060400135611091565b34801561093c57600080fd5b506103b6611341565b34801561095157600080fd5b5061039a6004803603604081101561096857600080fd5b60ff8235169190810190604081016020820135600160201b81111561098c57600080fd5b82018360208201111561099e57600080fd5b803590602001918460018302840111600160201b831117156109bf57600080fd5b509092509050611347565b3480156109d657600080fd5b5061039a600480360360408110156109ed57600080fd5b50803590602001356001600160a01b031661138c565b348015610a0f57600080fd5b5061039a60048036036060811015610a2657600080fd5b508035906001600160a01b0360208201351690604001356114f5565b348015610a4e57600080fd5b5061051c611535565b348015610a6357600080fd5b5061039a60048036036040811015610a7a57600080fd5b506001600160a01b03813516906020013561153c565b348015610a9c57600080fd5b5061051c6115fe565b348015610ab157600080fd5b5061051c60048036036040811015610ac857600080fd5b506001600160a01b03813516906020013561160a565b348015610aea57600080fd5b506103b6611748565b348015610aff57600080fd5b506103b661174e565b348015610b1457600080fd5b50610874611754565b61087460048036036080811015610b3357600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16610ffd565b348015610b7057600080fd5b506103b661175d565b348015610b8557600080fd5b506103b6611763565b348015610b9a57600080fd5b50610ba3611769565b6040805163ffffffff9092168252519081900360200190f35b348015610bc857600080fd5b5061039a60048036036040811015610bdf57600080fd5b810190602081018135600160201b811115610bf957600080fd5b820183602082011115610c0b57600080fd5b803590602001918460018302840111600160201b83111715610c2c57600080fd5b919390929091602081019035600160201b811115610c4957600080fd5b820183602082011115610c5b57600080fd5b803590602001918460018302840111600160201b83111715610c7c57600080fd5b50909250905061176e565b348015610c9357600080fd5b5061039a60048036036040811015610caa57600080fd5b50803590602001356001600160a01b03166114f5565b348015610ccc57600080fd5b5061051c6117ae565b348015610ce157600080fd5b5061051c60048036036020811015610cf857600080fd5b50356001600160a01b03166117b8565b348015610d1457600080fd5b5061051c60048036036020811015610d2b57600080fd5b50356001600160a01b03166117ca565b348015610d4757600080fd5b506103b66117e5565b348015610d5c57600080fd5b5061039a60048036036040811015610d7357600080fd5b506001600160a01b03813581169160200135166117eb565b348015610d9757600080fd5b506103b661187e565b348015610dac57600080fd5b506103b6611884565b348015610dc157600080fd5b5061087460048036036020811015610dd857600080fd5b503561188a565b348015610deb57600080fd5b5061039a61192a565b348015610e0057600080fd5b5061051c60048036036020811015610e1757600080fd5b50356001600160a01b03166119ca565b348015610e3357600080fd5b506103b66119dc565b348015610e4857600080fd5b5061045760048036036020811015610e5f57600080fd5b50356001600160a01b03166119e2565b348015610e7b57600080fd5b506103b6611b09565b61200181565b60005460609060ff16610ed2576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b3361200014610f125760405162461bcd60e51b815260040180806020018281038252602f815260200180611e5f602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b60055481565b61100181565b670de0b6b3a764000081565b603881565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610f12576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b61100581565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b60005460ff166110d6576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b33613000146111165760405162461bcd60e51b815260040180806020018281038252602b815260200180611de5602b913960400191505060405180910390fd5b677ce66c50e284000081111561115d5760405162461bcd60e51b8152600401808060200182810382526035815260200180611db06035913960400191505060405180910390fd5b60006221272160e91b84146112c7576000848152600460205260409020546001600160a01b0316806111d0576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a3505061133c565b6001600160a01b0381166000908152600260205260409020546111f38482611b0f565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d602081101561126857600080fd5b505110156112b4576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6112c086838588611b4f565b505061133a565b6112dc826402540be40063ffffffff611be916565b90508047101561132a576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600061133885828487611b4f565b505b505b505050565b61200381565b60005460ff16610ed2576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b33613000146113cc5760405162461bcd60e51b815260040180806020018281038252602b815260200180611de5602b913960400191505060405180910390fd5b60006221272160e91b831461143757506000828152600460205260409020546001600160a01b031680611437576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b03808216600090815260076020908152604080832093861683529290522080546114a2576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814610f125760405162461bcd60e51b8152600401808060200182810382526023815260200180611e8e6023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d60208110156115a057600080fd5b50516001600160a01b03163314610f12576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b677ce66c50e284000081565b6000805460ff16611650576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b33611005146116905760405162461bcd60e51b815260040180806020018281038252602f815260200180611d81602f913960400191505060405180910390fd5b600047831061169f57476116a1565b825b9050670de0b6b3a76400008111156116bd576000915050611742565b801561173f576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156116f9573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610f125760405162461bcd60e51b815260040180806020018281038252602e815260200180611e31602e913960400191505060405180910390fd5b6221272160e91b81565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff1660021415611837576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61100381565b61200481565b600033612002146118e2576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710611922576040516120029083156108fc029084906000818181858888f19350505050158015611918573d6000803e3d6000fd5b5060019050610f9b565b506000919050565b60005460ff1615611982576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015611a7257828160ff1681518110611a4657fe5b01602001516001600160f81b03191615611a6557816001019150611a6a565b611a72565b600101611a2b565b5060608160ff166040519080825280601f01601f191660200182016040528015611aa3576020820181803683370190505b50905060005b8260ff168160ff161015611aff57838160ff1681518110611ac657fe5b602001015160f81c60f81b828260ff1681518110611ae057fe5b60200101906001600160f81b031916908160001a905350600101611aa9565b5095945050505050565b61100481565b60006008821115611b3857611b31836007198401600a0a63ffffffff611be916565b9050611742565b61173f836008849003600a0a63ffffffff611c4216565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054611b86908463ffffffff611c8416565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b600082611bf857506000611742565b82820282848281611c0557fe5b041461173f5760405162461bcd60e51b8152600401808060200182810382526021815260200180611e106021913960400191505060405180910390fd5b600061173f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611cde565b60008282018381101561173f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008183611d6a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d2f578181015183820152602001611d17565b50505050905090810190601f168015611d5c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611d7657fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001005": { "balance": "0x0", - "code": "0x6080604052600436106103545760003560e01c80637e434d54116101c6578063bd4cc830116100f7578063e75d72c711610095578063f9a2bbc71161006f578063f9a2bbc7146109a2578063fc3e5908146109b7578063fd6a6879146109cc578063fdd31fcd146109e15761035b565b8063e75d72c714610930578063e89a302014610963578063f1fad1041461098d5761035b565b8063dc927faf116100d1578063dc927faf146108dc578063dcae76ab146108f1578063df8079e914610906578063e1c7392a1461091b5761035b565b8063bd4cc83014610888578063c81b1662146108b2578063d0ab528a146108c75761035b565b8063a7c6a59d11610164578063ab51bb961161013e578063ab51bb9614610763578063ac43175114610778578063ace9fcc214610849578063af4006811461085e5761035b565b8063a7c6a59d14610724578063aa82dce114610739578063aad560631461074e5761035b565b80639dc09262116101a05780639dc09262146106d0578063a1a11bf5146106e5578063a3c3c0ad146106fa578063a78abc161461070f5761035b565b80637e434d5414610673578063930e1b091461068857806396713da9146106bb5761035b565b806343756e5c116102a05780636f93d2e61161023e57806374f2272d1161021857806374f2272d1461061f57806375d47a0a146106345780637942fd05146106495780637e146cc51461065e5761035b565b80636f93d2e61461059657806370fd5bad146105f5578063718a8aa81461060a5761035b565b806351b4dce31161027a57806351b4dce31461054257806351e8067214610557578063541333071461056c5780636e47b482146105815761035b565b806343756e5c146104ec578063493279b1146105015780634bf6c8821461052d5761035b565b806312950c461161030d57806328087028116102e757806328087028146104795780633a975612146103605780633dffc3871461048e57806340bb43c0146104b95761035b565b806312950c46146104255780631b20087c1461043a5780631c6433121461044f5761035b565b8063081e9d131461036057806308f2ec0614610387578063093f2fc41461039c5780630bee7a67146103b15780630e2374a5146103df57806310e06a76146104105761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610375610a14565b60408051918252519081900360200190f35b34801561039357600080fd5b50610375610a19565b3480156103a857600080fd5b50610375610a1e565b3480156103bd57600080fd5b506103c6610a23565b6040805163ffffffff9092168252519081900360200190f35b3480156103eb57600080fd5b506103f4610a28565b604080516001600160a01b039092168252519081900360200190f35b34801561041c57600080fd5b50610375610a2e565b34801561043157600080fd5b50610375610a34565b34801561044657600080fd5b50610375610a3a565b34801561045b57600080fd5b506103f46004803603602081101561047257600080fd5b5035610a40565b34801561048557600080fd5b506103f4610a67565b34801561049a57600080fd5b506104a3610a14565b6040805160ff9092168252519081900360200190f35b3480156104c557600080fd5b50610375600480360360208110156104dc57600080fd5b50356001600160a01b0316610a6d565b3480156104f857600080fd5b506103f4610a7f565b34801561050d57600080fd5b50610516610a85565b6040805161ffff9092168252519081900360200190f35b34801561053957600080fd5b506104a3610a8a565b34801561054e57600080fd5b506103f4610a8f565b34801561056357600080fd5b506103f4610a95565b34801561057857600080fd5b50610375610a23565b34801561058d57600080fd5b506103f4610a9b565b3480156105a257600080fd5b506105e1600480360360808110156105b957600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610aa1565b604080519115158252519081900360200190f35b34801561060157600080fd5b506104a3610b73565b34801561061657600080fd5b506104a3610b78565b34801561062b57600080fd5b50610375610b7d565b34801561064057600080fd5b506103f4610b83565b34801561065557600080fd5b506104a3610b89565b34801561066a57600080fd5b50610375610b8e565b34801561067f57600080fd5b506103f4610b93565b34801561069457600080fd5b50610375600480360360208110156106ab57600080fd5b50356001600160a01b0316610b99565b3480156106c757600080fd5b506104a3610bab565b3480156106dc57600080fd5b506103f4610bb0565b3480156106f157600080fd5b506103f4610bb6565b34801561070657600080fd5b50610375610bbc565b34801561071b57600080fd5b506105e1610bc2565b34801561073057600080fd5b50610375610bcb565b34801561074557600080fd5b506103f4610bd1565b34801561075a57600080fd5b506103f4610bd7565b34801561076f57600080fd5b506103c6610bdd565b34801561078457600080fd5b506108476004803603604081101561079b57600080fd5b8101906020810181356401000000008111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111640100000000831117156107ea57600080fd5b91939092909160208101903564010000000081111561080857600080fd5b82018360208201111561081a57600080fd5b8035906020019184600183028401116401000000008311171561083c57600080fd5b509092509050610be2565b005b34801561085557600080fd5b50610375610c22565b34801561086a57600080fd5b506103756004803603602081101561088157600080fd5b5035610c28565b34801561089457600080fd5b50610375600480360360208110156108ab57600080fd5b5035610c83565b3480156108be57600080fd5b506103f4610c9c565b3480156108d357600080fd5b50610375610ca2565b3480156108e857600080fd5b506103f4610ca8565b3480156108fd57600080fd5b50610375610cae565b34801561091257600080fd5b506103f4610cb4565b34801561092757600080fd5b50610847610cba565b34801561093c57600080fd5b506108476004803603602081101561095357600080fd5b50356001600160a01b0316610d83565b34801561096f57600080fd5b506103f46004803603602081101561098657600080fd5b5035610edc565b34801561099957600080fd5b506104a3610ee9565b3480156109ae57600080fd5b506103f4610eee565b3480156109c357600080fd5b506104a3610ef4565b3480156109d857600080fd5b506103f4610ef9565b3480156109ed57600080fd5b5061037560048036036020811015610a0457600080fd5b50356001600160a01b0316610eff565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b60068181548110610a4d57fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff16610af9576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361200014610b395760405162461bcd60e51b815260040180806020018281038252602f815260200180610f40602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600281565b601081565b60035481565b61100881565b600b81565b600581565b61200381565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b3361100714610b395760405162461bcd60e51b815260040180806020018281038252602e815260200180610f12602e913960400191505060405180910390fd5b60025481565b600060288211610c39575080610c7e565b816028108015610c4a575060508211155b15610c5757506028610c7e565b605082118015610c685750606e8211155b15610c7857506078819003610c7e565b50600481045b919050565b600060288211610c94575080610c7e565b506028610c7e565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff1615610d12576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610d60576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480610de2576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f19350505050610e925760405161100290819084156108fc029085906000818181858888f19350505050158015610e4c573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050610ed9565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b60088181548110610a4d57fe5b601181565b61100081565b600381565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x6080604052600436106102605760003560e01c8063930e1b0911610144578063c81b1662116100b6578063e1c7392a1161007a578063e1c7392a1461072b578063e75d72c714610740578063e89a302014610773578063f9a2bbc71461079d578063fd6a6879146107b2578063fdd31fcd146107c757610267565b8063c81b1662146106c2578063d0ab528a146106d7578063dc927faf146106ec578063dcae76ab14610701578063df8079e91461071657610267565b8063a7c6a59d11610108578063a7c6a59d1461056f578063aa82dce114610584578063aad5606314610599578063ab51bb96146105ae578063ac431751146105dc578063ace9fcc2146106ad57610267565b8063930e1b09146104e85780639dc092621461051b578063a1a11bf514610530578063a3c3c0ad14610545578063a78abc161461055a57610267565b806343756e5c116101dd5780636e47b482116101a15780636e47b482146104205780636f93d2e61461043557806374f2272d1461049457806375d47a0a146104a95780637e146cc5146104be5780637e434d54146104d357610267565b806343756e5c1461038a578063493279b11461039f5780634bf6c882146103cb57806351b4dce3146103f657806351e806721461040b57610267565b80631b20087c116102245780631b20087c146103035780631c6433121461031857806328087028146103425780633a9756121461026c57806340bb43c01461035757610267565b8063081e9d131461026c578063093f2fc4146102935780630e2374a5146102a857806310e06a76146102d957806312950c46146102ee57610267565b3661026757005b600080fd5b34801561027857600080fd5b506102816107fa565b60408051918252519081900360200190f35b34801561029f57600080fd5b506102816107ff565b3480156102b457600080fd5b506102bd610804565b604080516001600160a01b039092168252519081900360200190f35b3480156102e557600080fd5b5061028161080a565b3480156102fa57600080fd5b50610281610810565b34801561030f57600080fd5b50610281610816565b34801561032457600080fd5b506102bd6004803603602081101561033b57600080fd5b503561081c565b34801561034e57600080fd5b506102bd610843565b34801561036357600080fd5b506102816004803603602081101561037a57600080fd5b50356001600160a01b0316610849565b34801561039657600080fd5b506102bd61085b565b3480156103ab57600080fd5b506103b4610861565b6040805161ffff9092168252519081900360200190f35b3480156103d757600080fd5b506103e0610866565b6040805160ff9092168252519081900360200190f35b34801561040257600080fd5b506102bd61086b565b34801561041757600080fd5b506102bd610871565b34801561042c57600080fd5b506102bd610877565b34801561044157600080fd5b506104806004803603608081101561045857600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135151561087d565b604080519115158252519081900360200190f35b3480156104a057600080fd5b5061028161094f565b3480156104b557600080fd5b506102bd610955565b3480156104ca57600080fd5b5061028161095b565b3480156104df57600080fd5b506102bd610960565b3480156104f457600080fd5b506102816004803603602081101561050b57600080fd5b50356001600160a01b0316610966565b34801561052757600080fd5b506102bd610978565b34801561053c57600080fd5b506102bd61097e565b34801561055157600080fd5b50610281610984565b34801561056657600080fd5b5061048061098a565b34801561057b57600080fd5b50610281610993565b34801561059057600080fd5b506102bd610999565b3480156105a557600080fd5b506102bd61099f565b3480156105ba57600080fd5b506105c36109a5565b6040805163ffffffff9092168252519081900360200190f35b3480156105e857600080fd5b506106ab600480360360408110156105ff57600080fd5b81019060208101813564010000000081111561061a57600080fd5b82018360208201111561062c57600080fd5b8035906020019184600183028401116401000000008311171561064e57600080fd5b91939092909160208101903564010000000081111561066c57600080fd5b82018360208201111561067e57600080fd5b803590602001918460018302840111640100000000831117156106a057600080fd5b5090925090506109aa565b005b3480156106b957600080fd5b506102816109ea565b3480156106ce57600080fd5b506102bd6109f0565b3480156106e357600080fd5b506102816109f6565b3480156106f857600080fd5b506102bd6109fc565b34801561070d57600080fd5b50610281610a02565b34801561072257600080fd5b506102bd610a08565b34801561073757600080fd5b506106ab610a0e565b34801561074c57600080fd5b506106ab6004803603602081101561076357600080fd5b50356001600160a01b0316610ad7565b34801561077f57600080fd5b506102bd6004803603602081101561079657600080fd5b5035610c30565b3480156107a957600080fd5b506102bd610c3d565b3480156107be57600080fd5b506102bd610c43565b3480156107d357600080fd5b50610281600480360360208110156107ea57600080fd5b50356001600160a01b0316610c49565b600181565b605081565b61200181565b600b5481565b60015481565b600c5481565b6006818154811061082957fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff166108d5576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109155760405162461bcd60e51b815260040180806020018281038252602f815260200180610c8a602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60035481565b61100881565b600581565b61200381565b60056020526000908152604090205481565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b33611007146109155760405162461bcd60e51b815260040180806020018281038252602e815260200180610c5c602e913960400191505060405180910390fd5b60025481565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff1615610a66576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610ab4576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480610b36576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f19350505050610be65760405161100290819084156108fc029085906000818181858888f19350505050158015610ba0573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050610c2d565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061082957fe5b61100081565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001006": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c806395468d2611610151578063dc927faf116100c3578063f1fad10411610087578063f1fad1041461055d578063f3ae241514610565578063f9a2bbc71461058b578063fc3e590814610593578063fd30d9b81461059b578063fd6a6879146105a357610274565b8063dc927faf1461053d578063dd91d1c514610279578063df8079e914610545578063e1c7392a1461054d578063e79a198f1461055557610274565b8063a78abc1611610115578063a78abc1614610453578063aa82dce11461045b578063aad5606314610463578063ab51bb961461046b578063ac43175114610473578063c81b16621461053557610274565b806395468d261461042b57806396713da9146104335780639dc092621461043b578063a1a11bf514610443578063a74b83ca1461044b57610274565b8063541d5548116101ea57806375d47a0a116101ae57806375d47a0a146103ad57806378beee67146103b55780637942fd05146103db5780637ae23088146103e35780637e434d54146103fd5780638f83ab131461040557610274565b8063541d5548146103355780636a6a419e1461036f5780636e47b4821461039557806370fd5bad1461039d578063718a8aa8146103a557610274565b80633dffc3871161023c5780633dffc387146102d857806343756e5c146102f6578063493279b1146102fe5780634bf6c8821461031d57806351b4dce31461032557806351e806721461032d57610274565b806303aff02b14610279578063049a5716146102835780630bee7a67146102a75780630e2374a5146102c857806328087028146102d0575b600080fd5b6102816105ab565b005b61028b6105e5565b604080516001600160a01b039092168252519081900360200190f35b6102af6105fd565b6040805163ffffffff9092168252519081900360200190f35b61028b610602565b61028b610608565b6102e061060e565b6040805160ff9092168252519081900360200190f35b61028b610613565b610306610619565b6040805161ffff9092168252519081900360200190f35b6102e061061e565b61028b610623565b61028b610629565b61035b6004803603602081101561034b57600080fd5b50356001600160a01b031661062f565b604080519115158252519081900360200190f35b61035b6004803603602081101561038557600080fd5b50356001600160a01b031661064d565b61028b61066b565b6102e0610671565b6102e0610676565b61028b61067b565b610281600480360360208110156103cb57600080fd5b50356001600160a01b0316610681565b6102e06106cf565b6103eb6106d4565b60408051918252519081900360200190f35b61028b6106e1565b6102816004803603602081101561041b57600080fd5b50356001600160a01b03166106e7565b6103eb610744565b6102e0610750565b61028b610755565b61028b61075b565b61028b610761565b61035b610779565b61028b610782565b61028b610788565b6102af61078e565b6102816004803603604081101561048957600080fd5b8101906020810181356401000000008111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460018302840111640100000000831117156104d857600080fd5b9193909290916020810190356401000000008111156104f657600080fd5b82018360208201111561050857600080fd5b8035906020019184600183028401116401000000008311171561052a57600080fd5b509092509050610793565b61028b610826565b61028b61082c565b61028b610832565b610281610838565b6102816108ba565b6102e0610a73565b61035b6004803603602081101561057b57600080fd5b50356001600160a01b0316610a78565b61028b610a96565b6102e0610a9c565b61035b610aa1565b61028b610aaa565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b73b005741528b86f5952469d80a8614591e3c5b63281565b606481565b61200181565b61200581565b600181565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b3360009081526008602052604090205460ff166105ab5760405162461bcd60e51b8152600401808060200182810382526024815260200180610bab6024913960400191505060405180910390fd5b600b81565b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166105ab576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b67016345785d8a000081565b600981565b61100781565b61100681565b73446aa6e0dc65690403df3f127750da1322941f3e81565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff166107e6576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146105ab5760405162461bcd60e51b815260040180806020018281038252602e815260200180610bcf602e913960400191505060405180910390fd5b61100281565b61100381565b61200481565b60005460ff1615610890576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610915576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610968576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610970610b90565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc916109b4919063ffffffff610ab016565b6040518115909202916000818181858888f193505050501580156109dc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610a12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b601181565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600381565b600a5460ff1681565b61100481565b6000610af283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610af9565b9392505050565b60008184841115610b885760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610b4d578181015183820152602001610b35565b50505050905090810190601f168015610b7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe72656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c80639dc092621161011a578063dc927faf116100ad578063e79a198f1161007c578063e79a198f146104a7578063f3ae2415146104af578063f9a2bbc7146104d5578063fd30d9b8146104dd578063fd6a6879146104e557610206565b8063dc927faf1461048f578063dd91d1c51461020b578063df8079e914610497578063e1c7392a1461049f57610206565b8063aad56063116100e9578063aad560631461039c578063ab51bb96146103a4578063ac431751146103c5578063c81b16621461048757610206565b80639dc092621461037c578063a1a11bf514610384578063a78abc161461038c578063aa82dce11461039457610206565b8063541d55481161019d57806378beee671161016c57806378beee67146103065780637ae230881461032c5780637e434d54146103465780638f83ab131461034e57806395468d261461037457610206565b8063541d5548146102965780636a6a419e146102d05780636e47b482146102f657806375d47a0a146102fe57610206565b8063493279b1116101d9578063493279b1146102495780634bf6c8821461026857806351b4dce31461028657806351e806721461028e57610206565b806303aff02b1461020b5780630e2374a514610215578063280870281461023957806343756e5c14610241575b600080fd5b6102136104ed565b005b61021d610527565b604080516001600160a01b039092168252519081900360200190f35b61021d61052d565b61021d610533565b610251610539565b6040805161ffff9092168252519081900360200190f35b61027061053e565b6040805160ff9092168252519081900360200190f35b61021d610543565b61021d610549565b6102bc600480360360208110156102ac57600080fd5b50356001600160a01b031661054f565b604080519115158252519081900360200190f35b6102bc600480360360208110156102e657600080fd5b50356001600160a01b031661056d565b61021d61058b565b61021d610591565b6102136004803603602081101561031c57600080fd5b50356001600160a01b0316610597565b6103346105e5565b60408051918252519081900360200190f35b61021d6105f2565b6102136004803603602081101561036457600080fd5b50356001600160a01b03166105f8565b610334610655565b61021d610661565b61021d610667565b6102bc61066d565b61021d610676565b61021d61067c565b6103ac610682565b6040805163ffffffff9092168252519081900360200190f35b610213600480360360408110156103db57600080fd5b8101906020810181356401000000008111156103f657600080fd5b82018360208201111561040857600080fd5b8035906020019184600183028401116401000000008311171561042a57600080fd5b91939092909160208101903564010000000081111561044857600080fd5b82018360208201111561045a57600080fd5b8035906020019184600183028401116401000000008311171561047c57600080fd5b509092509050610687565b61021d61071a565b61021d610720565b61021d610726565b61021361072c565b6102136107ae565b6102bc600480360360208110156104c557600080fd5b50356001600160a01b0316610967565b61021d610985565b6102bc61098b565b61021d610994565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200181565b61200581565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b61100881565b3360009081526008602052604090205460ff166104ed5760405162461bcd60e51b8152600401808060200182810382526024815260200180610a956024913960400191505060405180910390fd5b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166104ed576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b67016345785d8a000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff166106da576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146104ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180610ab9602e913960400191505060405180910390fd5b61100281565b61100381565b61200481565b60005460ff1615610784576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610809576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff1661085c576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610864610a7a565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc916108a8919063ffffffff61099a16565b6040518115909202916000818181858888f193505050501580156108d0573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610906573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600a5460ff1681565b61100481565b60006109dc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506109e3565b9392505050565b60008184841115610a725760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a37578181015183820152602001610a1f565b50505050905090810190601f168015610a645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe72656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001007": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063831d65d111610125578063ab51bb96116100ad578063df8079e91161007c578063df8079e91461059d578063f1fad104146105a5578063f9a2bbc7146105ad578063fc3e5908146105b5578063fd6a6879146105bd5761021c565b8063ab51bb9614610585578063c81b16621461058d578063c8509d81146103f8578063dc927faf146105955761021c565b80639dc09262116100f45780639dc0926214610549578063a1a11bf514610551578063a78abc1614610559578063aa82dce114610575578063aad560631461057d5761021c565b8063831d65d1146103f857806388e4194e1461047257806396713da9146105395780639ab1a373146105415761021c565b80634bf6c882116101a857806370fd5bad1161017757806370fd5bad146103d0578063718a8aa8146103d857806375d47a0a146103e05780637942fd05146103e85780637e434d54146103f05761021c565b80634bf6c882146103b057806351b4dce3146103b857806351e80672146103c05780636e47b482146103c85761021c565b80633a21baae116101ef5780633a21baae1461035b5780633dffc3871461036357806343756e5c146103815780634900c4ea14610389578063493279b1146103915761021c565b80630bee7a67146102215780630e2374a5146102425780631182b875146102665780632808702814610353575b600080fd5b6102296105c5565b6040805163ffffffff9092168252519081900360200190f35b61024a6105ca565b604080516001600160a01b039092168252519081900360200190f35b6102de6004803603604081101561027c57600080fd5b60ff8235169190810190604081016020820135600160201b8111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111600160201b831117156102d357600080fd5b5090925090506105d0565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610318578181015183820152602001610300565b50505050905090810190601f1680156103455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a61064c565b610229610652565b61036b610657565b6040805160ff9092168252519081900360200190f35b61024a61065c565b61036b610662565b610399610667565b6040805161ffff9092168252519081900360200190f35b61036b61066c565b61024a610671565b61024a610677565b61024a61067d565b61036b610683565b61036b610688565b61024a61068d565b61036b610693565b61024a610698565b6104706004803603604081101561040e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561043257600080fd5b82018360208201111561044457600080fd5b803590602001918460018302840111600160201b8311171561046557600080fd5b50909250905061069e565b005b6104706004803603606081101561048857600080fd5b810190602081018135600160201b8111156104a257600080fd5b8201836020820111156104b457600080fd5b803590602001918460018302840111600160201b831117156104d557600080fd5b919390929091602081019035600160201b8111156104f257600080fd5b82018360208201111561050457600080fd5b803590602001918460018302840111600160201b8311171561052557600080fd5b9193509150356001600160a01b03166106de565b61036b6107c9565b6102296107ce565b61024a6107d3565b61024a6107d9565b6105616107df565b604080519115158252519081900360200190f35b61024a6107e8565b61024a6107ee565b610229610662565b61024a6107f4565b61024a6107fa565b61024a610800565b61036b610806565b61024a61080b565b61036b610811565b61024a610816565b606481565b61200181565b606033612000146106125760405162461bcd60e51b815260040180806020018281038252602f815260200180610bef602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200581565b606681565b600181565b61100181565b600081565b603881565b600881565b61200681565b61200081565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b33612000146106125760405162461bcd60e51b815260040180806020018281038252602f815260200180610bef602f913960400191505060405180910390fd5b336120061461071e5760405162461bcd60e51b8152600401808060200182810382526031815260200180610c1e6031913960400191505060405180910390fd5b610726610bc4565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506107c08161081c565b50505050505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b61100281565b61100381565b61200481565b601181565b61100081565b600381565b61100481565b600061082b8260400151610bbe565b61089757604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610bb9565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b838110156109045781810151838201526020016108ec565b50505050905090810190601f1680156109315780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561096457818101518382015260200161094c565b50505050905090810190601f1680156109915780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109b257600080fd5b505af19250505080156109c3575060015b610bb5576040516000815260443d10156109df57506000610a7c565b60046000803e60005160e01c6308c379a08114610a00576000915050610a7c565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a2c57600092505050610a7c565b808301805167ffffffffffffffff811115610a4e576000945050505050610a7c565b8060208301013d8601811115610a6c57600095505050505050610a7c565b601f01601f191660405250925050505b80610a875750610b2a565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae6578181015183820152602001610ace565b50505050905090810190601f168015610b135780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610bb9565b3d808015610b54576040519150601f19603f3d011682016040523d82523d6000602084013e610b59565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610ae6578181015183820152602001610ace565b5060005b919050565b3b151590565b6040518060600160405280606081526020016060815260200160006001600160a01b03168152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e7472616374a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806388e4194e116100f9578063ab51bb9611610097578063dc927faf11610071578063dc927faf146104ea578063df8079e9146104f2578063f9a2bbc7146104fa578063fd6a687914610502576101a9565b8063ab51bb96146104da578063c81b1662146104e2578063c8509d8114610355576101a9565b8063a1a11bf5116100d3578063a1a11bf5146104a6578063a78abc16146104ae578063aa82dce1146104ca578063aad56063146104d2576101a9565b806388e4194e146103cf5780639ab1a373146104965780639dc092621461049e576101a9565b80634bf6c882116101665780636e47b482116101405780636e47b4821461033d57806375d47a0a146103455780637e434d541461034d578063831d65d114610355576101a9565b80634bf6c8821461030f57806351b4dce31461032d57806351e8067214610335576101a9565b80630e2374a5146101ae5780631182b875146101d257806328087028146102bf5780633a21baae146102c757806343756e5c146102e8578063493279b1146102f0575b600080fd5b6101b661050a565b604080516001600160a01b039092168252519081900360200190f35b61024a600480360360408110156101e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561020c57600080fd5b82018360208201111561021e57600080fd5b803590602001918460018302840111600160201b8311171561023f57600080fd5b509092509050610510565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028457818101518382015260200161026c565b50505050905090810190601f1680156102b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b661058c565b6102cf610592565b6040805163ffffffff9092168252519081900360200190f35b6101b6610597565b6102f861059d565b6040805161ffff9092168252519081900360200190f35b6103176105a2565b6040805160ff9092168252519081900360200190f35b6101b66105a7565b6101b66105ad565b6101b66105b3565b6101b66105b9565b6101b66105bf565b6103cd6004803603604081101561036b57600080fd5b60ff8235169190810190604081016020820135600160201b81111561038f57600080fd5b8201836020820111156103a157600080fd5b803590602001918460018302840111600160201b831117156103c257600080fd5b5090925090506105c5565b005b6103cd600480360360608110156103e557600080fd5b810190602081018135600160201b8111156103ff57600080fd5b82018360208201111561041157600080fd5b803590602001918460018302840111600160201b8311171561043257600080fd5b919390929091602081019035600160201b81111561044f57600080fd5b82018360208201111561046157600080fd5b803590602001918460018302840111600160201b8311171561048257600080fd5b9193509150356001600160a01b0316610605565b6102cf6106f0565b6101b66106f5565b6101b66106fb565b6104b6610701565b604080519115158252519081900360200190f35b6101b661070a565b6101b6610710565b6102cf610716565b6101b661071b565b6101b6610721565b6101b6610727565b6101b661072d565b6101b6610733565b61200181565b606033612000146105525760405162461bcd60e51b815260040180806020018281038252602f815260200180610b0c602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200581565b606681565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b61100881565b61200381565b33612000146105525760405162461bcd60e51b815260040180806020018281038252602f815260200180610b0c602f913960400191505060405180910390fd5b33612006146106455760405162461bcd60e51b8152600401808060200182810382526031815260200180610b3b6031913960400191505060405180910390fd5b61064d610ae1565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506106e781610739565b50505050505050565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b61100281565b61100381565b61200481565b61100081565b61100481565b60006107488260400151610adb565b6107b457604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610ad6565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015610821578181015183820152602001610809565b50505050905090810190601f16801561084e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015610881578181015183820152602001610869565b50505050905090810190601f1680156108ae5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156108cf57600080fd5b505af19250505080156108e0575060015b610ad2576040516000815260443d10156108fc57506000610999565b60046000803e60005160e01c6308c379a0811461091d576000915050610999565b60043d036004833e81513d602482011167ffffffffffffffff8211171561094957600092505050610999565b808301805167ffffffffffffffff81111561096b576000945050505050610999565b8060208301013d860181111561098957600095505050505050610999565b601f01601f191660405250925050505b806109a45750610a47565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a035781810151838201526020016109eb565b50505050905090810190601f168015610a305780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610ad6565b3d808015610a71576040519150601f19603f3d011682016040523d82523d6000602084013e610a76565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610a035781810151838201526020016109eb565b5060005b919050565b3b151590565b6040518060600160405280606081526020016060815260200160006001600160a01b03168152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001008": { "balance": "0x0", - "code": "0x6080604052600436106103e45760003560e01c80637d078e1311610208578063b795031711610118578063dc927faf116100ab578063f9a2bbc71161007a578063f9a2bbc714610c63578063fa9e915914610c78578063fc3e59081461065c578063fd6a687914610c8d578063fe3a2af514610ca2576103e4565b8063dc927faf14610c0f578063df8079e914610c24578063e605bca014610c39578063f1fad10414610c4e576103e4565b8063c8e704a4116100e7578063c8e704a41461065c578063d117a11014610b79578063d7109ce614610bfa578063d9e6dae91461078a576103e4565b8063b7950317146107de578063bd32d3f91461056d578063c81b166214610b64578063c8509d8114610955576103e4565b80639a854bbd1161019b578063aa82dce11161016a578063aa82dce114610a5a578063aad5606314610a6f578063ab51bb9614610a84578063ab67a485146107de578063ac43175114610a99576103e4565b80639a854bbd14610a065780639dc0926214610a1b578063a1a11bf514610a30578063a78abc1614610a45576103e4565b8063859180fb116101d7578063859180fb1461077557806394553a4e1461059757806395b9ad26146109dc57806396713da9146109f1576103e4565b80637d078e13146105825780637e434d541461092b5780637ec816dd14610940578063831d65d114610955576103e4565b8063493279b11161030357806366dea52a11610296578063718a8aa811610265578063718a8aa8146108bc57806372c4e086146108d157806375d47a0a1461090157806377d9dae8146107f35780637942fd0514610916576103e4565b806366dea52a146107de5780636b3f1307146107f35780636e47b482146108a757806370fd5bad146107de576103e4565b806351e80672116102d257806351e80672146107b45780635d499b1b146107c95780635f558f86146107de578063613684751461078a576103e4565b8063493279b1146107495780634bc81c00146107755780634bf6c8821461078a57806351b4dce31461079f576103e4565b80632d89ac321161037b578063401809f91161034a578063401809f91461065c57806343756e5c14610671578063445fcefe14610686578063487c88ac14610582576103e4565b80632d89ac32146105825780632e02d776146105f657806337e6ecda146106295780633dffc38714610582576103e4565b80631f91600b116103b75780631f91600b1461056d57806323996b531461058257806325c751b71461059757806328087028146105e1576103e4565b80630bee7a67146103e95780630e2374a5146104175780630f212b1b146104485780631182b87514610473575b600080fd5b3480156103f557600080fd5b506103fe610cb7565b6040805163ffffffff9092168252519081900360200190f35b34801561042357600080fd5b5061042c610cbc565b604080516001600160a01b039092168252519081900360200190f35b34801561045457600080fd5b5061045d610cc2565b6040805160ff9092168252519081900360200190f35b34801561047f57600080fd5b506104f86004803603604081101561049657600080fd5b60ff8235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460018302840111600160201b831117156104ed57600080fd5b509092509050610cc7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053257818101518382015260200161051a565b50505050905090810190601f16801561055f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057957600080fd5b5061045d610d43565b34801561058e57600080fd5b5061045d610d48565b6105cd600480360360408110156105ad57600080fd5b5080356001600160a01b0316906020013567ffffffffffffffff16610d4d565b604080519115158252519081900360200190f35b3480156105ed57600080fd5b5061042c610d89565b34801561060257600080fd5b506105cd6004803603602081101561061957600080fd5b50356001600160a01b0316610d8f565b34801561063557600080fd5b506105cd6004803603602081101561064c57600080fd5b50356001600160a01b0316610da4565b34801561066857600080fd5b5061045d610db9565b34801561067d57600080fd5b5061042c610dbe565b34801561069257600080fd5b50610737600480360360208110156106a957600080fd5b810190602081018135600160201b8111156106c357600080fd5b8201836020820111156106d557600080fd5b803590602001918460018302840111600160201b831117156106f657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc4945050505050565b60408051918252519081900360200190f35b34801561075557600080fd5b5061075e610f23565b6040805161ffff9092168252519081900360200190f35b34801561078157600080fd5b5061045d610f28565b34801561079657600080fd5b5061045d610f2d565b3480156107ab57600080fd5b5061042c610f32565b3480156107c057600080fd5b5061042c610f38565b3480156107d557600080fd5b50610737610f3e565b3480156107ea57600080fd5b5061045d610f47565b6105cd6004803603604081101561080957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460018302840111600160201b8311171561086657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d4d945050505050565b3480156108b357600080fd5b5061042c610f4c565b3480156108c857600080fd5b5061045d610f52565b6105cd600480360360208110156108e757600080fd5b810190602081018135600160201b81111561083357600080fd5b34801561090d57600080fd5b5061042c610f57565b34801561092257600080fd5b5061045d610f5d565b34801561093757600080fd5b5061042c610f62565b34801561094c57600080fd5b50610737610f68565b34801561096157600080fd5b506109da6004803603604081101561097857600080fd5b60ff8235169190810190604081016020820135600160201b81111561099c57600080fd5b8201836020820111156109ae57600080fd5b803590602001918460018302840111600160201b831117156109cf57600080fd5b509092509050610f6e565b005b3480156109e857600080fd5b5061045d610fae565b3480156109fd57600080fd5b5061045d610fb3565b348015610a1257600080fd5b50610737610fb8565b348015610a2757600080fd5b5061042c610fc4565b348015610a3c57600080fd5b5061042c610fca565b348015610a5157600080fd5b506105cd610fd0565b348015610a6657600080fd5b5061042c610fd9565b348015610a7b57600080fd5b5061042c610fdf565b348015610a9057600080fd5b506103fe610fe5565b348015610aa557600080fd5b506109da60048036036040811015610abc57600080fd5b810190602081018135600160201b811115610ad657600080fd5b820183602082011115610ae857600080fd5b803590602001918460018302840111600160201b83111715610b0957600080fd5b919390929091602081019035600160201b811115610b2657600080fd5b820183602082011115610b3857600080fd5b803590602001918460018302840111600160201b83111715610b5957600080fd5b509092509050610fea565b348015610b7057600080fd5b5061042c61102a565b348015610b8557600080fd5b50610ba360048036036020811015610b9c57600080fd5b5035611030565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b348015610c0657600080fd5b50610737611088565b348015610c1b57600080fd5b5061042c61108d565b348015610c3057600080fd5b5061042c611093565b348015610c4557600080fd5b50610737611099565b348015610c5a57600080fd5b5061045d61109f565b348015610c6f57600080fd5b5061042c6110a4565b348015610c8457600080fd5b506107376110aa565b348015610c9957600080fd5b5061042c6110b0565b348015610cae57600080fd5b5061045d610fe5565b606481565b61200181565b600681565b60603361200014610d095760405162461bcd60e51b815260040180806020018281038252602f815260200180611201602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b600481565b600181565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b6020810151600090610dd4611196565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610e5c57600092505050610f1e565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610eba57600080fd5b505afa158015610ece573d6000803e3d6000fd5b505050506040513d6020811015610ee457600080fd5b505160808301516060840151919250600091610f059163ffffffff6110b616565b9050610f17818363ffffffff6110b616565b9450505050505b919050565b603881565b600581565b600881565b61200681565b61200081565b6402540be40081565b600281565b61100581565b601081565b61100881565b600b81565b61200381565b60045481565b3361200014610d095760405162461bcd60e51b815260040180806020018281038252602f815260200180611201602f913960400191505060405180910390fd5b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610d095760405162461bcd60e51b815260040180806020018281038252602e8152602001806111d3602e913960400191505060405180910390fd5b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b604d81565b61100381565b61200481565b60055481565b601181565b61100081565b61271081565b61100481565b60006110f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110ff565b9392505050565b6000818484111561118e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561115357818101518382015260200161113b565b50505050905090810190601f1680156111805780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x60806040526004361061020f5760003560e01c80637ec816dd11610118578063ac431751116100a0578063dc927faf1161006f578063dc927faf14610914578063df8079e914610929578063e605bca01461093e578063f9a2bbc714610953578063fd6a6879146109685761020f565b8063ac431751146107b3578063c81b16621461087e578063c8509d8114610695578063d117a110146108935761020f565b8063a1a11bf5116100e7578063a1a11bf514610731578063a78abc1614610746578063aa82dce11461075b578063aad5606314610770578063ab51bb96146107855761020f565b80637ec816dd14610680578063831d65d11461069557806394553a4e1461033f5780639dc092621461071c5761020f565b80634bf6c8821161019b5780636e47b4821161016a5780636e47b4821461061157806372c4e0861461062657806375d47a0a1461065657806377d9dae81461055d5780637e434d541461066b5761020f565b80634bf6c8821461050857806351b4dce31461053357806351e80672146105485780636b3f13071461055d5761020f565b80632e02d776116101e25780632e02d7761461039e57806337e6ecda146103d157806343756e5c14610404578063445fcefe14610419578063493279b1146104dc5761020f565b80630e2374a5146102145780631182b8751461024557806325c751b71461033f5780632808702814610389575b600080fd5b34801561022057600080fd5b5061022961097d565b604080516001600160a01b039092168252519081900360200190f35b34801561025157600080fd5b506102ca6004803603604081101561026857600080fd5b60ff8235169190810190604081016020820135600160201b81111561028c57600080fd5b82018360208201111561029e57600080fd5b803590602001918460018302840111600160201b831117156102bf57600080fd5b509092509050610983565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103045781810151838201526020016102ec565b50505050905090810190601f1680156103315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103756004803603604081101561035557600080fd5b5080356001600160a01b0316906020013567ffffffffffffffff166109ff565b604080519115158252519081900360200190f35b34801561039557600080fd5b50610229610a3b565b3480156103aa57600080fd5b50610375600480360360208110156103c157600080fd5b50356001600160a01b0316610a41565b3480156103dd57600080fd5b50610375600480360360208110156103f457600080fd5b50356001600160a01b0316610a56565b34801561041057600080fd5b50610229610a6b565b34801561042557600080fd5b506104ca6004803603602081101561043c57600080fd5b810190602081018135600160201b81111561045657600080fd5b82018360208201111561046857600080fd5b803590602001918460018302840111600160201b8311171561048957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a71945050505050565b60408051918252519081900360200190f35b3480156104e857600080fd5b506104f1610bd0565b6040805161ffff9092168252519081900360200190f35b34801561051457600080fd5b5061051d610bd5565b6040805160ff9092168252519081900360200190f35b34801561053f57600080fd5b50610229610bda565b34801561055457600080fd5b50610229610be0565b6103756004803603604081101561057357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561059d57600080fd5b8201836020820111156105af57600080fd5b803590602001918460018302840111600160201b831117156105d057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109ff945050505050565b34801561061d57600080fd5b50610229610be6565b6103756004803603602081101561063c57600080fd5b810190602081018135600160201b81111561059d57600080fd5b34801561066257600080fd5b50610229610bec565b34801561067757600080fd5b50610229610bf2565b34801561068c57600080fd5b506104ca610bf8565b3480156106a157600080fd5b5061071a600480360360408110156106b857600080fd5b60ff8235169190810190604081016020820135600160201b8111156106dc57600080fd5b8201836020820111156106ee57600080fd5b803590602001918460018302840111600160201b8311171561070f57600080fd5b509092509050610bfe565b005b34801561072857600080fd5b50610229610c3e565b34801561073d57600080fd5b50610229610c44565b34801561075257600080fd5b50610375610c4a565b34801561076757600080fd5b50610229610c53565b34801561077c57600080fd5b50610229610c59565b34801561079157600080fd5b5061079a610c5f565b6040805163ffffffff9092168252519081900360200190f35b3480156107bf57600080fd5b5061071a600480360360408110156107d657600080fd5b810190602081018135600160201b8111156107f057600080fd5b82018360208201111561080257600080fd5b803590602001918460018302840111600160201b8311171561082357600080fd5b919390929091602081019035600160201b81111561084057600080fd5b82018360208201111561085257600080fd5b803590602001918460018302840111600160201b8311171561087357600080fd5b509092509050610c64565b34801561088a57600080fd5b50610229610ca4565b34801561089f57600080fd5b506108bd600480360360208110156108b657600080fd5b5035610caa565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561092057600080fd5b50610229610d02565b34801561093557600080fd5b50610229610d08565b34801561094a57600080fd5b506104ca610d0e565b34801561095f57600080fd5b50610229610d14565b34801561097457600080fd5b50610229610d1a565b61200181565b606033612000146109c55760405162461bcd60e51b815260040180806020018281038252602f815260200180610e6b602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b61100181565b6020810151600090610a81610e00565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610b0957600092505050610bcb565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b6757600080fd5b505afa158015610b7b573d6000803e3d6000fd5b505050506040513d6020811015610b9157600080fd5b505160808301516060840151919250600091610bb29163ffffffff610d2016565b9050610bc4818363ffffffff610d2016565b9450505050505b919050565b603881565b600881565b61200681565b61200081565b61100581565b61100881565b61200381565b60045481565b33612000146109c55760405162461bcd60e51b815260040180806020018281038252602f815260200180610e6b602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146109c55760405162461bcd60e51b815260040180806020018281038252602e815260200180610e3d602e913960400191505060405180910390fd5b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61200481565b60055481565b61100081565b61100481565b6000610d6283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d69565b9392505050565b60008184841115610df85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002000": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106103e65760003560e01c806374f079b81161020a578063c27cdcfb11610125578063df8079e9116100b8578063f1fad10411610087578063f1fad10414610bac578063f7a251d714610bb4578063f9a2bbc714610c2c578063fc3e590814610c34578063fd6a687914610c3c576103e6565b8063df8079e914610b74578063e1c7392a14610b7c578063e3b0480514610b84578063e6400bbe14610ba4576103e6565b8063d31f968d116100f4578063d31f968d14610b2d578063d76a867514610b5c578063dc40433114610b64578063dc927faf14610b6c576103e6565b8063c27cdcfb14610af5578063c780e9de14610b15578063c81b166214610b1d578063ccc108d714610b25576103e6565b80639dc092621161019d578063aad560631161016c578063aad5606314610a27578063ab51bb9614610a2f578063ac43175114610a37578063b0355f5b146107d6576103e6565b80639dc0926214610a07578063a1a11bf514610a0f578063a78abc1614610a17578063aa82dce114610a1f576103e6565b806384013b6a116101d957806384013b6a1461091c578063863fe4ab146109f75780638cc8f561146108e457806396713da9146109ff576103e6565b806374f079b8146108fc57806375d47a0a146109045780637942fd051461090c5780637e434d5414610914576103e6565b806343756e5c116103055780636a3cb34d116102985780636e47a51a116102675780636e47a51a146108bc5780636e47b482146108dc57806370fd5bad146108e4578063718a8aa8146108ec578063719482d5146108f4576103e6565b80636a3cb34d146108645780636bacff2c1461086c5780636c46aa68146108645780636de380bd146108b4576103e6565b806351e80672116102d457806351e806721461081e5780635692ddd3146108265780635f8321771461082e57806363e1394e1461085c576103e6565b806343756e5c146107fe578063493279b1146108065780634bf6c8821461080e57806351b4dce314610816576103e6565b8063299b533d1161037d5780633a648b151161034c5780633a648b15146106725780633bdc47a6146106ae5780633dffc387146107d6578063422f9050146107de576103e6565b8063299b533d146105f85780632af6f3991461062c5780632ff32aea14610649578063308325f41461066a576103e6565b80631d130935116103b95780631d130935146104685780631e275ae11461048457806322556cdc146105e857806328087028146105f0576103e6565b806305e68258146103eb5780630bee7a67146104095780630e2374a51461042a57806314b3023b1461044e575b600080fd5b6103f3610c44565b6040805160ff9092168252519081900360200190f35b610411610c49565b6040805163ffffffff9092168252519081900360200190f35b610432610c4e565b604080516001600160a01b039092168252519081900360200190f35b610456610c54565b60408051918252519081900360200190f35b610470610c5a565b604080519115158252519081900360200190f35b6105e6600480360361010081101561049b57600080fd5b81018160a081016080820135600160201b8111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111600160201b831117156104eb57600080fd5b919390929091602081019035600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460018302840111600160201b8311171561053b57600080fd5b919390929091602081019035600160201b81111561055857600080fd5b82018360208201111561056a57600080fd5b803590602001918460018302840111600160201b8311171561058b57600080fd5b919390929091602081019035600160201b8111156105a857600080fd5b8201836020820111156105ba57600080fd5b803590602001918460018302840111600160201b831117156105db57600080fd5b509092509050610c63565b005b610456610f04565b610432610f09565b6106156004803603602081101561060e57600080fd5b5035610f0f565b6040805161ffff9092168252519081900360200190f35b6104706004803603602081101561064257600080fd5b5035610f25565b610651610f3a565b60408051600792830b90920b8252519081900360200190f35b610456610f43565b6106926004803603602081101561068857600080fd5b503560ff16610f49565b604080516001600160401b039092168252519081900360200190f35b610761600480360360608110156106c457600080fd5b60ff82351691602081013591810190606081016040820135600160201b8111156106ed57600080fd5b8201836020820111156106ff57600080fd5b803590602001918460018302840111600160201b8311171561072057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f64945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561079b578181015183820152602001610783565b50505050905090810190601f1680156107c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f3610fda565b610470600480360360208110156107f457600080fd5b503560ff16610fdf565b610432610ff4565b610615610ffa565b6103f3610fff565b610432611004565b61043261100a565b610456611010565b6105e66004803603604081101561084457600080fd5b506001600160a01b0381358116916020013516611045565b6104566111be565b6106156111e6565b6108896004803603602081101561088257600080fd5b50356111eb565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b61045661121a565b610432600480360360208110156108d257600080fd5b503560ff16611241565b61043261125c565b6103f36111e6565b6103f3611262565b610615610fda565b610456611267565b61043261126d565b6103f3611273565b610432611278565b6105e6600480360360a081101561093257600080fd5b810190602081018135600160201b81111561094c57600080fd5b82018360208201111561095e57600080fd5b803590602001918460018302840111600160201b8311171561097f57600080fd5b919390929091602081019035600160201b81111561099c57600080fd5b8201836020820111156109ae57600080fd5b803590602001918460018302840111600160201b831117156109cf57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff1661127e565b610456611632565b6103f361163a565b61043261163f565b610432611645565b61047061164b565b610432611654565b61043261165a565b610411610c44565b6105e660048036036040811015610a4d57600080fd5b810190602081018135600160201b811115610a6757600080fd5b820183602082011115610a7957600080fd5b803590602001918460018302840111600160201b83111715610a9a57600080fd5b919390929091602081019035600160201b811115610ab757600080fd5b820183602082011115610ac957600080fd5b803590602001918460018302840111600160201b83111715610aea57600080fd5b509092509050611660565b61069260048036036020811015610b0b57600080fd5b503560ff166116a0565b6104566116bb565b6104326116df565b6105e66116e5565b61047060048036036040811015610b4357600080fd5b5080356001600160a01b0316906020013560ff166118a5565b6107616118c5565b6104566118e4565b6104326118ea565b6104326118f0565b6105e66118f6565b61069260048036036020811015610b9a57600080fd5b503560ff16611988565b6105e66119a3565b6103f3611b1c565b6105e660048036036060811015610bca57600080fd5b60ff8235169190810190604081016020820135600160201b811115610bee57600080fd5b820183602082011115610c0057600080fd5b803590602001918460018302840111600160201b83111715610c2157600080fd5b919350915035611b21565b610432611bc3565b6103f3611bc9565b610432611bce565b600081565b606481565b61200181565b60015481565b600b5460ff1681565b60005460ff16610ca8576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b158015610cf357600080fd5b505afa158015610d07573d6000803e3d6000fd5b505050506040513d6020811015610d1d57600080fd5b5051610d5a5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c9f6023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610da657600080fd5b505afa158015610dba573d6000803e3d6000fd5b505050506040513d6020811015610dd057600080fd5b5051610e0d5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c9f6023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610e86576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610eca576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610f9c576020820181803683370190505b5060218101869052600181018790528281529050604181016000610fbf86611bd4565b509050610fce81838851611bde565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b603881565b600881565b61200681565b61200081565b604080517f43414e43454c5f5452414e534645525f50524f504f53414c00000000000000008152905190819003601801902081565b60005460ff1661108a576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b1580156110cd57600080fd5b505afa1580156110e1573d6000803e3d6000fd5b505050506040513d60208110156110f757600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561113857600080fd5b505afa15801561114c573d6000803e3d6000fd5b505050506040513d602081101561116257600080fd5b505190508061116f575060155b60008211801561117f5750808211155b610eca576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b8152905190819003601001902081565b600281565b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f01902081565b6005602052600090815260409020546001600160a01b031681565b61100581565b601081565b60035481565b61100881565b600b81565b61200381565b60005460ff166112c3576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561130257600080fd5b505afa158015611316573d6000803e3d6000fd5b505050506040513d602081101561132c57600080fd5b505161137f576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b0390811690831681146113ef576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b15801561146457600080fd5b505afa158015611478573d6000803e3d6000fd5b505050506040513d602081101561148e57600080fd5b50516114cb5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c9f6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316611535576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b03908116908316101561159e576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614610e865760ff8181166000908152600a60205260409020805467ffffffffffffffff19166001600160401b038516179055600b541615610eca576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b630100380081565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b3361100714610e865760405162461bcd60e51b815260040180806020018281038252602e815260200180611c51602e913960400191505060405180910390fd5b6008602052600090815260409020546001600160401b031681565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081565b61100281565b60005460ff1661172a576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561176d57600080fd5b505afa158015611781573d6000803e3d6000fd5b505050506040513d602081101561179757600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156117d857600080fd5b505afa1580156117ec573d6000803e3d6000fd5b505050506040513d602081101561180257600080fd5b505190508061180f575060155b60008211801561181f5750808211155b61185e576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16610eca576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b610e1081565b61100381565b61200481565b60005460ff161561194e576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260019081556004805467ffffffffffffffff19166001600160401b03179055600060028190556003819055805460ff19169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166119e8576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015611a2b57600080fd5b505afa158015611a3f573d6000803e3d6000fd5b505050506040513d6020811015611a5557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015611a9657600080fd5b505afa158015611aaa573d6000803e3d6000fd5b505050506040513d6020811015611ac057600080fd5b5051905080611acd575060155b600082118015611add5750808211155b610e86576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b601181565b60005460ff16611b66576040805162461bcd60e51b81526020600482015260196024820152600080516020611c7f833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116610eca5760405162461bcd60e51b8152600401808060200182810382526031815260200180611c206031913960400191505060405180910390fd5b61100081565b600381565b61100481565b8051602090910191565b5b60208110611bfe578251825260209283019290910190601f1901611bdf565b915181516020939093036101000a600019018019909116921691909117905256fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637474686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c806375d47a0a11610151578063c81b1662116100c3578063e1c7392a11610087578063e1c7392a14610862578063e3b048051461086a578063e6400bbe1461088a578063f7a251d714610892578063f9a2bbc71461090a578063fd6a68791461091257610274565b8063c81b166214610813578063ccc108d71461081b578063d31f968d14610823578063dc927faf14610852578063df8079e91461085a57610274565b8063a78abc1611610115578063a78abc16146106fc578063aa82dce114610704578063aad560631461070c578063ab51bb9614610714578063ac43175114610735578063c27cdcfb146107f357610274565b806375d47a0a146106015780637e434d541461060957806384013b6a146106115780639dc09262146106ec578063a1a11bf5146106f457610274565b8063422f9050116101ea57806351e80672116101ae57806351e80672146105535780635f8321771461055b5780636bacff2c146105895780636e47a51a146105d15780636e47b482146105f157806374f079b8146105f957610274565b8063422f9050146104fd57806343756e5c1461051d578063493279b1146105255780634bf6c8821461052d57806351b4dce31461054b57610274565b8063280870281161023c578063280870281461043f578063299b533d146104475780632af6f3991461047b5780632ff32aea14610498578063308325f4146104b95780633a648b15146104c157610274565b80630e2374a51461027957806314b3023b1461029d5780631d130935146102b75780631e275ae1146102d357806322556cdc14610437575b600080fd5b61028161091a565b604080516001600160a01b039092168252519081900360200190f35b6102a5610920565b60408051918252519081900360200190f35b6102bf610926565b604080519115158252519081900360200190f35b61043560048036036101008110156102ea57600080fd5b81018160a081016080820135600160201b81111561030757600080fd5b82018360208201111561031957600080fd5b803590602001918460018302840111600160201b8311171561033a57600080fd5b919390929091602081019035600160201b81111561035757600080fd5b82018360208201111561036957600080fd5b803590602001918460018302840111600160201b8311171561038a57600080fd5b919390929091602081019035600160201b8111156103a757600080fd5b8201836020820111156103b957600080fd5b803590602001918460018302840111600160201b831117156103da57600080fd5b919390929091602081019035600160201b8111156103f757600080fd5b82018360208201111561040957600080fd5b803590602001918460018302840111600160201b8311171561042a57600080fd5b50909250905061092f565b005b6102a5610bd0565b610281610bd5565b6104646004803603602081101561045d57600080fd5b5035610bdb565b6040805161ffff9092168252519081900360200190f35b6102bf6004803603602081101561049157600080fd5b5035610bf1565b6104a0610c06565b60408051600792830b90920b8252519081900360200190f35b6102a5610c0f565b6104e1600480360360208110156104d757600080fd5b503560ff16610c15565b604080516001600160401b039092168252519081900360200190f35b6102bf6004803603602081101561051357600080fd5b503560ff16610c30565b610281610c45565b610464610c4b565b610535610c50565b6040805160ff9092168252519081900360200190f35b610281610c55565b610281610c5b565b6104356004803603604081101561057157600080fd5b506001600160a01b0381358116916020013516610c61565b6105a66004803603602081101561059f57600080fd5b5035610dda565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b610281600480360360208110156105e757600080fd5b503560ff16610e09565b610281610e24565b6102a5610e2a565b610281610e30565b610281610e36565b610435600480360360a081101561062757600080fd5b810190602081018135600160201b81111561064157600080fd5b82018360208201111561065357600080fd5b803590602001918460018302840111600160201b8311171561067457600080fd5b919390929091602081019035600160201b81111561069157600080fd5b8201836020820111156106a357600080fd5b803590602001918460018302840111600160201b831117156106c457600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff16610e3c565b6102816111f0565b6102816111f6565b6102bf6111fc565b610281611205565b61028161120b565b61071c611211565b6040805163ffffffff9092168252519081900360200190f35b6104356004803603604081101561074b57600080fd5b810190602081018135600160201b81111561076557600080fd5b82018360208201111561077757600080fd5b803590602001918460018302840111600160201b8311171561079857600080fd5b919390929091602081019035600160201b8111156107b557600080fd5b8201836020820111156107c757600080fd5b803590602001918460018302840111600160201b831117156107e857600080fd5b509092509050611216565b6104e16004803603602081101561080957600080fd5b503560ff16611256565b610281611271565b610435611277565b6102bf6004803603604081101561083957600080fd5b5080356001600160a01b0316906020013560ff16611437565b610281611457565b61028161145d565b610435611463565b6104e16004803603602081101561088057600080fd5b503560ff166114f5565b610435611510565b610435600480360360608110156108a857600080fd5b60ff8235169190810190604081016020820135600160201b8111156108cc57600080fd5b8201836020820111156108de57600080fd5b803590602001918460018302840111600160201b831117156108ff57600080fd5b919350915035611689565b61028161172b565b610281611731565b61200181565b60015481565b600b5460ff1681565b60005460ff16610974576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b1580156109bf57600080fd5b505afa1580156109d3573d6000803e3d6000fd5b505050506040513d60208110156109e957600080fd5b5051610a265760405162461bcd60e51b81526004018080602001828103825260238152602001806117b76023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610a7257600080fd5b505afa158015610a86573d6000803e3d6000fd5b505050506040513d6020811015610a9c57600080fd5b5051610ad95760405162461bcd60e51b81526004018080602001828103825260238152602001806117b76023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610b52576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610b96576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60096020526000908152604090205460ff1681565b61100181565b603881565b600881565b61200681565b61200081565b60005460ff16610ca6576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d6020811015610d1357600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015610d5457600080fd5b505afa158015610d68573d6000803e3d6000fd5b505050506040513d6020811015610d7e57600080fd5b5051905080610d8b575060155b600082118015610d9b5750808211155b610b96576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b6005602052600090815260409020546001600160a01b031681565b61100581565b60035481565b61100881565b61200381565b60005460ff16610e81576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b158015610ec057600080fd5b505afa158015610ed4573d6000803e3d6000fd5b505050506040513d6020811015610eea57600080fd5b5051610f3d576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610fad576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50516110895760405162461bcd60e51b81526004018080602001828103825260238152602001806117b76023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b03166110f3576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b03908116908316101561115c576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614610b525760ff8181166000908152600a60205260409020805467ffffffffffffffff19166001600160401b038516179055600b541615610b96576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610b525760405162461bcd60e51b815260040180806020018281038252602e815260200180611769602e913960400191505060405180910390fd5b6008602052600090815260409020546001600160401b031681565b61100281565b60005460ff166112bc576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b1580156112ff57600080fd5b505afa158015611313573d6000803e3d6000fd5b505050506040513d602081101561132957600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561136a57600080fd5b505afa15801561137e573d6000803e3d6000fd5b505050506040513d602081101561139457600080fd5b50519050806113a1575060155b6000821180156113b15750808211155b6113f0576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16610b96576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b600660209081526000928352604080842090915290825290205460ff1681565b61100381565b61200481565b60005460ff16156114bb576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260019081556004805467ffffffffffffffff19166001600160401b03179055600060028190556003819055805460ff19169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16611555576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d60208110156115c257600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d602081101561162d57600080fd5b505190508061163a575060155b60008211801561164a5750808211155b610b52576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b60005460ff166116ce576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116610b965760405162461bcd60e51b81526004018080602001828103825260318152602001806117386031913960400191505060405180910390fd5b61100081565b6110048156fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637474686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002001": { "balance": "0x0", - "code": "0x6080604052600436106103d25760003560e01c8063718a8aa8116101fd578063b88a802f11610118578063dc927faf116100ab578063f45fd80b1161007a578063f45fd80b14610c56578063f9a2bbc714610c9b578063fa03f79714610cb0578063fc3e5908146106d3578063fd6a687914610cc5576103d9565b8063dc927faf14610c02578063df8079e914610c17578063edc1a5b014610c2c578063f1fad10414610c41576103d9565b8063c81b1662116100e7578063c81b166214610bb2578063c8509d811461092c578063d61b9b9314610bc7578063d7ecfcb614610890576103d9565b8063b88a802f14610b38578063baaafd3b14610b4d578063bf8546ca14610b62578063c2117d8214610b9d576103d9565b80639dc0926211610190578063aad560631161015f578063aad5606314610a2e578063ab51bb9614610a43578063ac43175114610a58578063b14315df14610b23576103d9565b80639dc09262146109c6578063a1a11bf5146109db578063a78abc16146109f0578063aa82dce114610a19576103d9565b80637e434d54116101cc5780637e434d5414610917578063831d65d11461092c57806392b888a41461066a57806396713da9146109b1576103d9565b8063718a8aa8146108a557806375aca593146108ba57806375d47a0a146108ed5780637942fd0514610902576103d9565b8063413d9c3a116102ed5780635d17c8bd116102805780636bd8f8041161024f5780636bd8f804146108125780636e47b482146108485780636fb7f7eb1461085d57806370fd5bad14610890576103d9565b80635d17c8bd146107be5780635d499b1b146107d357806362b171d2146107e857806369b635b6146107fd576103d9565b80634d99dd16116102bc5780634d99dd161461075357806351b4dce31461077f57806351e8067214610794578063552aaf93146107a9576103d9565b8063413d9c3a146106e857806343756e5c146106fd578063493279b1146107125780634bf6c8821461073e576103d9565b8063151817e311610365578063333ad3e711610334578063333ad3e7146106a957806334c43354146106be5780633dffc3871461066a5780633fdfa7e4146106d3576103d9565b8063151817e31461063f57806317c9efb01461066a578063280870281461067f5780632fdeb11114610694576103d9565b80630c795715116103a15780630c795715146104cc5780630e2374a5146104e15780631182b8751461051257806311fe9ec61461060c576103d9565b8063026e402b146103de578063029859921461040c578063047636d1146104335780630bee7a671461049e576103d9565b366103d957005b600080fd5b61040a600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610cda565b005b34801561041857600080fd5b50610421610d17565b60408051918252519081900360200190f35b34801561043f57600080fd5b506104666004803603602081101561045657600080fd5b50356001600160a01b0316610d1d565b6040518082606080838360005b8381101561048b578181015183820152602001610473565b5050505090500191505060405180910390f35b3480156104aa57600080fd5b506104b3610d6f565b6040805163ffffffff9092168252519081900360200190f35b3480156104d857600080fd5b50610421610d74565b3480156104ed57600080fd5b506104f6610d7a565b604080516001600160a01b039092168252519081900360200190f35b34801561051e57600080fd5b506105976004803603604081101561053557600080fd5b60ff8235169190810190604081016020820135600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460018302840111600160201b8311171561058c57600080fd5b509092509050610d80565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105d15781810151838201526020016105b9565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061857600080fd5b506104216004803603602081101561062f57600080fd5b50356001600160a01b0316610e3f565b34801561064b57600080fd5b50610654610e5a565b6040805160ff9092168252519081900360200190f35b34801561067657600080fd5b50610654610e5f565b34801561068b57600080fd5b506104f6610e64565b3480156106a057600080fd5b50610421610e6a565b3480156106b557600080fd5b506104b3610e70565b3480156106ca57600080fd5b50610421610e75565b3480156106df57600080fd5b50610654610e80565b3480156106f457600080fd5b50610421610e85565b34801561070957600080fd5b506104f6610e8c565b34801561071e57600080fd5b50610727610e92565b6040805161ffff9092168252519081900360200190f35b34801561074a57600080fd5b50610654610e97565b61040a6004803603604081101561076957600080fd5b506001600160a01b038135169060200135610e9c565b34801561078b57600080fd5b506104f6610f61565b3480156107a057600080fd5b506104f6610f67565b3480156107b557600080fd5b50610654610f6d565b3480156107ca57600080fd5b50610421610f72565b3480156107df57600080fd5b50610421610f78565b3480156107f457600080fd5b50610421610f81565b34801561080957600080fd5b50610421611121565b61040a6004803603606081101561082857600080fd5b506001600160a01b03813581169160208101359091169060400135610cda565b34801561085457600080fd5b506104f6611127565b34801561086957600080fd5b506104216004803603602081101561088057600080fd5b50356001600160a01b031661112d565b34801561089c57600080fd5b50610654611148565b3480156108b157600080fd5b5061065461114d565b3480156108c657600080fd5b50610421600480360360208110156108dd57600080fd5b50356001600160a01b0316611152565b3480156108f957600080fd5b506104f661116d565b34801561090e57600080fd5b50610654611173565b34801561092357600080fd5b506104f6611178565b34801561093857600080fd5b5061040a6004803603604081101561094f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561097357600080fd5b82018360208201111561098557600080fd5b803590602001918460018302840111600160201b831117156109a657600080fd5b50909250905061117e565b3480156109bd57600080fd5b506106546111be565b3480156109d257600080fd5b506104f66111c3565b3480156109e757600080fd5b506104f66111c9565b3480156109fc57600080fd5b50610a056111cf565b604080519115158252519081900360200190f35b348015610a2557600080fd5b506104f66111d8565b348015610a3a57600080fd5b506104f66111de565b348015610a4f57600080fd5b506104b3610f6d565b348015610a6457600080fd5b5061040a60048036036040811015610a7b57600080fd5b810190602081018135600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460018302840111600160201b83111715610ac857600080fd5b919390929091602081019035600160201b811115610ae557600080fd5b820183602082011115610af757600080fd5b803590602001918460018302840111600160201b83111715610b1857600080fd5b5090925090506111e4565b348015610b2f57600080fd5b5061065461127b565b348015610b4457600080fd5b50610421611280565b348015610b5957600080fd5b5061042161141d565b348015610b6e57600080fd5b5061042160048036036040811015610b8557600080fd5b506001600160a01b0381358116916020013516611428565b348015610ba957600080fd5b50610421611453565b348015610bbe57600080fd5b506104f6611459565b348015610bd357600080fd5b5061042160048036036040811015610bea57600080fd5b506001600160a01b038135811691602001351661145f565b348015610c0e57600080fd5b506104f661148a565b348015610c2357600080fd5b506104f6611490565b348015610c3857600080fd5b50610421611496565b348015610c4d57600080fd5b506106546114a3565b348015610c6257600080fd5b5061042160048036036060811015610c7957600080fd5b506001600160a01b0381358116916020810135821691604090910135166114a8565b348015610ca757600080fd5b506104f66114dd565b348015610cbc57600080fd5b506104216114e3565b348015610cd157600080fd5b506104f66114e9565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610d256114ef565b610d2d6114ef565b6001600160a01b03929092166000818152600b60209081526040808320548652838352600c82528083205486830152928252600d905281902054908301525090565b606481565b6108fc81565b61200181565b60603361200014610dc25760405162461bcd60e51b815260040180806020018281038252602f81526020018061153c602f913960400191505060405180910390fd5b60005460ff16610e05576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b61200581565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b603881565b600881565b60105460ff1660021415610ee8576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610f1057506402540be4008106155b610dc2576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b61200681565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff1660021415610fd0576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611037576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d806000811461108d576040519150601f19603f3d011682016040523d82523d6000602084013e611092565b606091505b50509050806110da576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b61200381565b3361200014610dc25760405162461bcd60e51b815260040180806020018281038252602f81526020018061153c602f913960400191505060405180910390fd5b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b60005460ff1661123b576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610e055760405162461bcd60e51b815260040180806020018281038252602e81526020018061150e602e913960400191505060405180910390fd5b600481565b60105460009060ff16600214156112cf576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480611333576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b50509050806113d6576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60015490565b61100281565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b601181565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6040518060600160405280600390602082028036833750919291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x6080604052600436106102975760003560e01c806375d47a0a1161015a578063bf8546ca116100c1578063df8079e91161007a578063df8079e9146109e0578063edc1a5b0146109f5578063f45fd80b14610a0a578063f9a2bbc714610a4f578063fa03f79714610a64578063fd6a687914610a795761029e565b8063bf8546ca1461092b578063c2117d8214610966578063c81b16621461097b578063c8509d8114610706578063d61b9b9314610990578063dc927faf146109cb5761029e565b8063aa82dce111610113578063aa82dce1146107de578063aad56063146107f3578063ab51bb9614610808578063ac43175114610836578063b88a802f14610901578063baaafd3b146109165761029e565b806375d47a0a146106dc5780637e434d54146106f1578063831d65d1146107065780639dc092621461078b578063a1a11bf5146107a0578063a78abc16146107b55761029e565b80634bf6c882116101fe57806362b171d2116101b757806362b171d21461060157806369b635b6146106165780636bd8f8041461062b5780636e47b482146106615780636fb7f7eb1461067657806375aca593146106a95761029e565b80634bf6c882146105565780634d99dd161461058157806351b4dce3146105ad57806351e80672146105c25780635d17c8bd146105d75780635d499b1b146105ec5761029e565b806311fe9ec61161025057806311fe9ec6146104a357806328087028146104d65780632fdeb111146104eb57806334c433541461050057806343756e5c14610515578063493279b11461052a5761029e565b8063026e402b146102a357806302985992146102d1578063047636d1146102f85780630c795715146103635780630e2374a5146103785780631182b875146103a95761029e565b3661029e57005b600080fd5b6102cf600480360360408110156102b957600080fd5b506001600160a01b038135169060200135610a8e565b005b3480156102dd57600080fd5b506102e6610acb565b60408051918252519081900360200190f35b34801561030457600080fd5b5061032b6004803603602081101561031b57600080fd5b50356001600160a01b0316610ad1565b6040518082606080838360005b83811015610350578181015183820152602001610338565b5050505090500191505060405180910390f35b34801561036f57600080fd5b506102e6610b23565b34801561038457600080fd5b5061038d610b29565b604080516001600160a01b039092168252519081900360200190f35b3480156103b557600080fd5b5061042e600480360360408110156103cc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103f057600080fd5b82018360208201111561040257600080fd5b803590602001918460018302840111600160201b8311171561042357600080fd5b509092509050610b2f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610468578181015183820152602001610450565b50505050905090810190601f1680156104955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104af57600080fd5b506102e6600480360360208110156104c657600080fd5b50356001600160a01b0316610bee565b3480156104e257600080fd5b5061038d610c09565b3480156104f757600080fd5b506102e6610c0f565b34801561050c57600080fd5b506102e6610c15565b34801561052157600080fd5b5061038d610c20565b34801561053657600080fd5b5061053f610c26565b6040805161ffff9092168252519081900360200190f35b34801561056257600080fd5b5061056b610c2b565b6040805160ff9092168252519081900360200190f35b6102cf6004803603604081101561059757600080fd5b506001600160a01b038135169060200135610c30565b3480156105b957600080fd5b5061038d610cf5565b3480156105ce57600080fd5b5061038d610cfb565b3480156105e357600080fd5b506102e6610d01565b3480156105f857600080fd5b506102e6610d07565b34801561060d57600080fd5b506102e6610d10565b34801561062257600080fd5b506102e6610eb0565b6102cf6004803603606081101561064157600080fd5b506001600160a01b03813581169160208101359091169060400135610a8e565b34801561066d57600080fd5b5061038d610eb6565b34801561068257600080fd5b506102e66004803603602081101561069957600080fd5b50356001600160a01b0316610ebc565b3480156106b557600080fd5b506102e6600480360360208110156106cc57600080fd5b50356001600160a01b0316610ed7565b3480156106e857600080fd5b5061038d610ef2565b3480156106fd57600080fd5b5061038d610ef8565b34801561071257600080fd5b506102cf6004803603604081101561072957600080fd5b60ff8235169190810190604081016020820135600160201b81111561074d57600080fd5b82018360208201111561075f57600080fd5b803590602001918460018302840111600160201b8311171561078057600080fd5b509092509050610efe565b34801561079757600080fd5b5061038d610f3e565b3480156107ac57600080fd5b5061038d610f44565b3480156107c157600080fd5b506107ca610f4a565b604080519115158252519081900360200190f35b3480156107ea57600080fd5b5061038d610f53565b3480156107ff57600080fd5b5061038d610f59565b34801561081457600080fd5b5061081d610f5f565b6040805163ffffffff9092168252519081900360200190f35b34801561084257600080fd5b506102cf6004803603604081101561085957600080fd5b810190602081018135600160201b81111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460018302840111600160201b831117156108a657600080fd5b919390929091602081019035600160201b8111156108c357600080fd5b8201836020820111156108d557600080fd5b803590602001918460018302840111600160201b831117156108f657600080fd5b509092509050610f64565b34801561090d57600080fd5b506102e6610ffb565b34801561092257600080fd5b506102e6611198565b34801561093757600080fd5b506102e66004803603604081101561094e57600080fd5b506001600160a01b03813581169160200135166111a3565b34801561097257600080fd5b506102e66111ce565b34801561098757600080fd5b5061038d6111d4565b34801561099c57600080fd5b506102e6600480360360408110156109b357600080fd5b506001600160a01b03813581169160200135166111da565b3480156109d757600080fd5b5061038d611205565b3480156109ec57600080fd5b5061038d61120b565b348015610a0157600080fd5b506102e6611211565b348015610a1657600080fd5b506102e660048036036060811015610a2d57600080fd5b506001600160a01b03813581169160208101358216916040909101351661121e565b348015610a5b57600080fd5b5061038d611253565b348015610a7057600080fd5b506102e6611259565b348015610a8557600080fd5b5061038d61125f565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610ad9611265565b610ae1611265565b6001600160a01b03929092166000818152600b60209081526040808320548652838352600c82528083205486830152928252600d905281902054908301525090565b6108fc81565b61200181565b60603361200014610b715760405162461bcd60e51b815260040180806020018281038252602f8152602001806112b2602f913960400191505060405180910390fd5b60005460ff16610bb4576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6001600160a01b031660009081526006602052604090205490565b61200581565b60015481565b662386f26fc1000081565b61100181565b603881565b600881565b60105460ff1660021415610c7c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610ca457506402540be4008106155b610b71576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b61200681565b61200081565b60025481565b6402540be40081565b60105460009060ff1660021415610d5f576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480610dc6576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114610e1c576040519150601f19603f3d011682016040523d82523d6000602084013e610e21565b606091505b5050905080610e69576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b6001600160a01b031660009081526008602052604090205490565b61100881565b61200381565b3361200014610b715760405162461bcd60e51b815260040180806020018281038252602f8152602001806112b2602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610fbb576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610bb45760405162461bcd60e51b815260040180806020018281038252602e815260200180611284602e913960400191505060405180910390fd5b60105460009060ff166002141561104a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff1916600217905533600090815260066020526040902054806110ae576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d8060008114611104576040519150601f19603f3d011682016040523d82523d6000602084013e611109565b606091505b5050905080611151576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60015490565b61100281565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6040518060600160405280600390602082028036833750919291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002002": { "balance": "0x0", - "code": "0x608060405260043610620003ff5760003560e01c80638456cb59116200020f578063cbb04d9d1162000123578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000c98578063fb50b31f1462000cbd578063fc0c5ff11462000ce2578063ff69ab611462000cfa57600080fd5b8063e992aaf51462000c15578063efdbf0e11462000c2d578063f1f74d841462000c69578063f1fad1041462000c8157600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000ba8578063daacdb661462000bc0578063dbda7fb31462000bd8578063e8f67c3b1462000bfd57600080fd5b8063cbb04d9d1462000b04578063d115a2061462000b45578063d6ca429d1462000b5e578063d7c2dfc81462000b8357600080fd5b8063ac43175111620001a5578063bff02e201162000170578063bff02e201462000a91578063c38fbec81462000ac7578063c473318f1462000aec578063c8509d8114620008e557600080fd5b8063ac4317511462000a0f578063b187bd261462000a34578063baa7199e1462000a54578063bdceadf31462000a7957600080fd5b80638cd22b2211620001e65780638cd22b22146200097a578063982ef0a7146200099f578063a43569b314620009b6578063aad3ec9614620009ea57600080fd5b80638456cb59146200090a57806386d5450614620009225780638a4d3fa8146200095c57600080fd5b806349f41a42116200031357806364028fbd116200029d57806375cc7d89116200026857806375cc7d89146200089057806376e7d6d614620008b55780638129fc1c14620008cd578063831d65d114620008e557600080fd5b806364028fbd14620007cb578063663706d314620007e25780636ec01b2714620008135780636f8e2fa4146200086b57600080fd5b80634e6fd6c411620002de5780634e6fd6c4146200073257806359491871146200074a5780635e7cc1c9146200076f57806363a036b5146200079457600080fd5b806349f41a4214620006995780634a49ac4c14620006be5780634bf6c88214620006e35780634d99dd16146200070d57600080fd5b80631fa8882b1162000395578063417c73a71162000360578063417c73a714620005e5578063449ecfe6146200060a57806345211bfd146200062f5780634838d165146200065457600080fd5b80631fa8882b14620005555780632b727c86146200056e5780632e8e8c7114620005935780633840998814620005cd57600080fd5b8063092193ab11620003d6578063092193ab14620004a05780630e9fbf5114620004b75780631182b87514620004dc57806317b4f353146200051057600080fd5b8063046f7da2146200041f578063059ddd2214620004375780630661806e146200047957600080fd5b366200041a5760345460ff166001146200041857600080fd5b005b600080fd5b3480156200042c57600080fd5b506200041862000d12565b3480156200044457600080fd5b506200045c62000456366004620089d3565b62000da4565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200048657600080fd5b506200049160365481565b60405190815260200162000470565b62000418620004b1366004620089d3565b620011cc565b348015620004c457600080fd5b5062000418620004d636600462008a3e565b6200181d565b348015620004e957600080fd5b5062000501620004fb36600462008a83565b62001b49565b60405162000470919062008b36565b3480156200051d57600080fd5b506200045c6200052f36600462008c2c565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200056257600080fd5b50620004916201518081565b3480156200057b57600080fd5b506200045c6200058d366004620089d3565b62001be1565b348015620005a057600080fd5b506200045c620005b2366004620089d3565b604d602052600090815260409020546001600160a01b031681565b348015620005da57600080fd5b506200049160375481565b348015620005f257600080fd5b506200041862000604366004620089d3565b62001c36565b3480156200061757600080fd5b506200041862000629366004620089d3565b62001cb8565b3480156200063c57600080fd5b50620004186200064e366004620089d3565b62001e9d565b3480156200066157600080fd5b506200068862000673366004620089d3565b60016020526000908152604090205460ff1681565b604051901515815260200162000470565b348015620006a657600080fd5b5062000418620006b8366004620089d3565b6200209c565b348015620006cb57600080fd5b5062000418620006dd366004620089d3565b620022b8565b348015620006f057600080fd5b50620006fa600881565b60405160ff909116815260200162000470565b3480156200071a57600080fd5b50620004186200072c36600462008c81565b62002334565b3480156200073f57600080fd5b506200045c61dead81565b3480156200075757600080fd5b50620004186200076936600462008cc6565b62002964565b3480156200077c57600080fd5b50620004186200078e36600462008d34565b6200375d565b348015620007a157600080fd5b50620007b9620007b336600462008d54565b62003987565b60405162000470949392919062008dbd565b62000418620007dc36600462008e79565b6200402c565b348015620007ef57600080fd5b506200049162000801366004620089d3565b60446020526000908152604090205481565b3480156200082057600080fd5b506200083862000832366004620089d3565b620046d2565b6040805182516001600160401b039081168252602080850151821690830152928201519092169082015260600162000470565b3480156200087857600080fd5b50620005016200088a366004620089d3565b62004777565b3480156200089d57600080fd5b5062000418620008af366004620089d3565b62004ba3565b348015620008c257600080fd5b5062000491603d5481565b348015620008da57600080fd5b506200041862004d75565b348015620008f257600080fd5b50620004186200090436600462008a83565b6200508c565b3480156200091757600080fd5b5062000418620050ea565b3480156200092f57600080fd5b506200045c62000941366004620089d3565b6043602052600090815260409020546001600160a01b031681565b3480156200096957600080fd5b5062000491670de0b6b3a764000081565b3480156200098757600080fd5b50620004916200099936600462008c81565b62005182565b62000418620009b036600462008f51565b6200523b565b348015620009c357600080fd5b50620009db620009d5366004620089d3565b620058e9565b60405162000470919062008f8b565b348015620009f757600080fd5b506200041862000a0936600462008c81565b62005bd6565b34801562000a1c57600080fd5b506200041862000a2e36600462009008565b62005c43565b34801562000a4157600080fd5b5060005462010000900460ff1662000688565b34801562000a6157600080fd5b506200041862000a73366004620090c1565b62006ae2565b34801562000a8657600080fd5b5062000491603c5481565b34801562000a9e57600080fd5b5062000ab662000ab036600462008d54565b62006caf565b60405162000470939291906200911d565b34801562000ad457600080fd5b506200041862000ae6366004620089d3565b62006e8b565b34801562000af957600080fd5b506200049160385481565b34801562000b1157600080fd5b5062000b2962000b23366004620089d3565b6200714d565b6040805193845291151560208401529082015260600162000470565b34801562000b5257600080fd5b5062000491620186a081565b34801562000b6b57600080fd5b506200041862000b7d3660046200917a565b62007590565b34801562000b9057600080fd5b506200041862000ba236600462009263565b620077b6565b34801562000bb557600080fd5b5062000491603b5481565b34801562000bcd57600080fd5b506200049160495481565b34801562000be557600080fd5b506200045c62000bf7366004620089d3565b620078ac565b34801562000c0a57600080fd5b506200049160355481565b34801562000c2257600080fd5b5062000491603a5481565b34801562000c3a57600080fd5b506200049162000c4c36600462008c2c565b805160208183018101805160468252928201919093012091525481565b34801562000c7657600080fd5b5062000491603e5481565b34801562000c8e57600080fd5b50620006fa601181565b34801562000ca557600080fd5b506200049162000cb736600462008c81565b62007cd6565b34801562000cca57600080fd5b506200041862000cdc36600462009008565b62007d47565b34801562000cef57600080fd5b506200049160395481565b34801562000d0757600080fd5b5062000491604a5481565b600054630100000090046001600160a01b0316331462000d45576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000d6f57604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000e0f90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3d90620092c9565b801562000e8e5780601f1062000e625761010080835404028352916020019162000e8e565b820191906000526020600020905b81548152906001019060200180831162000e7057829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000eb990620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462000ee790620092c9565b801562000f385780601f1062000f0c5761010080835404028352916020019162000f38565b820191906000526020600020905b81548152906001019060200180831162000f1a57829003601f168201915b5050505050815260200160018201805462000f5390620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462000f8190620092c9565b801562000fd25780601f1062000fa65761010080835404028352916020019162000fd2565b820191906000526020600020905b81548152906001019060200180831162000fb457829003601f168201915b5050505050815260200160028201805462000fed90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200101b90620092c9565b80156200106c5780601f1062001040576101008083540402835291602001916200106c565b820191906000526020600020905b8154815290600101906020018083116200104e57829003601f168201915b505050505081526020016003820180546200108790620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620010b590620092c9565b8015620011065780601f10620010da5761010080835404028352916020019162001106565b820191906000526020600020905b815481529060010190602001808311620010e857829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620011a5575050509190925250509051949350505050565b3361100014620011f857604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b038082166000908152604360209081526040808320548416808452604183528184208251610180810184528154871681526001820154871694810194909452600281015490951691830191909152600384015460608301526004840180549194916080840191906200127190620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200129f90620092c9565b8015620012f05780601f10620012c457610100808354040283529160200191620012f0565b820191906000526020600020905b815481529060010190602001808311620012d257829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200131b90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200134990620092c9565b80156200139a5780601f106200136e576101008083540402835291602001916200139a565b820191906000526020600020905b8154815290600101906020018083116200137c57829003601f168201915b50505050508152602001600182018054620013b590620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620013e390620092c9565b8015620014345780601f10620014085761010080835404028352916020019162001434565b820191906000526020600020905b8154815290600101906020018083116200141657829003601f168201915b505050505081526020016002820180546200144f90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200147d90620092c9565b8015620014ce5780601f10620014a257610100808354040283529160200191620014ce565b820191906000526020600020905b815481529060010190602001808311620014b057829003601f168201915b50505050508152602001600382018054620014e990620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200151790620092c9565b8015620015685780601f106200153c5761010080835404028352916020019162001568565b820191906000526020600020905b8154815290600101906020018083116200154a57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162001607575050509190925250505060408101519091506001600160a01b031615806200164457508060e001515b156200170157604051611002903490600081818185875af1925050503d80600081146200168e576040519150601f19603f3d011682016040523d82523d6000602084013e62001693565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016f49060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200175857600080fd5b505af11580156200176d573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620017ae91815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017e391908690600401620092ff565b600060405180830381600087803b158015620017fe57600080fd5b505af115801562001813573d6000803e3d6000fd5b5050505050505b50565b33611001146200184557604051630f22c43960e41b81526110016004820152602401620011ef565b60005462010000900460ff16156200187057604051631785c68160e01b815260040160405180910390fd5b6000604583836040516200188692919062009319565b908152604051908190036020019020546001600160a01b03169050620018ae603f8262007fb1565b620018cc5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038116600090815260416020526040812090620018f462015180426200933f565b604a546000828152604b602052604090205491925011620019285760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200194990849062009362565b909155505060405160469062001963908790879062009319565b908152602001604051809103902054600014158015620019b457504262015180604687876040516200199792919062009319565b908152602001604051809103902054620019b2919062009362565b105b15620019d357604051631898eb6b60e01b815260040160405180910390fd5b600080620019e385600262007fd4565b915091508162001a0657604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001a59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a7f919062009378565b905062001a8d85836200805e565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600260405162001acd9392919062009392565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001b0b916001600160a01b0316908a90600401620092ff565b600060405180830381600087803b15801562001b2657600080fd5b505af115801562001b3b573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001b7357604051630f22c43960e41b81526120006004820152602401620011ef565b60005462010000900460ff161562001b9e57604051631785c68160e01b815260040160405180910390fd5b6034805460ff1916600117905560405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152606401620011ef565b60008162001bf1603f8262007fb1565b62001c0f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038084166000908152604160205260409020600d01541691505b50919050565b600054630100000090046001600160a01b0316331462001c69576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001ce357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001d155760405163b1d02c3d60e01b815260040160405180910390fd5b8062001d23603f8262007fb1565b62001d415760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001d7f57604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001dcf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001df5919062009378565b101562001e15576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001e3b5760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff19169055604980546001919060009062001e5f908490620093cd565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff161562001ec857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001efa5760405163b1d02c3d60e01b815260040160405180910390fd5b62001f0462008153565b62001f11603f8262007fb1565b62001f2f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03821662001f5757604051636520611b60e11b815260040160405180910390fd5b6001600160a01b038281166000908152604360205260409020541615158062001f9857506001600160a01b03821660009081526047602052604090205460ff165b1562001fb757604051631e6f587560e11b815260040160405180910390fd5b600062001fc362008153565b6001600160a01b0381166000908152604160205260409020600c81015491925090429062001ff690620151809062009362565b11156200201657604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b33620020aa603f8262007fb1565b620020c85760405163056e881160e01b815260040160405180910390fd5b60005462010000900460ff1615620020f357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620021255760405163b1d02c3d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152604d602052604090205416156200215f5760405163bebdc75760e01b815260040160405180910390fd5b6200216c603f8362007fb1565b156200218b5760405163bebdc75760e01b815260040160405180910390fd5b336000818152604160205260409020600d01546001600160a01b039081169084168103620021cc5760405163bebdc75760e01b815260040160405180910390fd5b6001600160a01b0381161562002203576001600160a01b0381166000908152604d6020526040902080546001600160a01b03191690555b6001600160a01b038281166000908152604160205260409020600d0180546001600160a01b03191691861691821790551562002268576001600160a01b038481166000908152604d6020526040902080546001600160a01b0319169184169190911790555b836001600160a01b0316816001600160a01b0316836001600160a01b03167fcbb728765de145e99c00e8ae32a325231e850359b7b8a6da3b84d672ab3f1d0a60405160405180910390a450505050565b600054630100000090046001600160a01b03163314620022eb576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff16156200235f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620023915760405163b1d02c3d60e01b815260040160405180910390fd5b816200239f603f8262007fb1565b620023bd5760405163056e881160e01b815260040160405180910390fd5b81600003620023df57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b03808416600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805433949160808401916200244790620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200247590620092c9565b8015620024c65780601f106200249a57610100808354040283529160200191620024c6565b820191906000526020600020905b815481529060010190602001808311620024a857829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620024f190620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200251f90620092c9565b8015620025705780601f10620025445761010080835404028352916020019162002570565b820191906000526020600020905b8154815290600101906020018083116200255257829003601f168201915b505050505081526020016001820180546200258b90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620025b990620092c9565b80156200260a5780601f10620025de576101008083540402835291602001916200260a565b820191906000526020600020905b815481529060010190602001808311620025ec57829003601f168201915b505050505081526020016002820180546200262590620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200265390620092c9565b8015620026a45780601f106200267857610100808354040283529160200191620026a4565b820191906000526020600020905b8154815290600101906020018083116200268657829003601f168201915b50505050508152602001600382018054620026bf90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620026ed90620092c9565b80156200273e5780601f1062002712576101008083540402835291602001916200273e565b820191906000526020600020905b8154815290600101906020018083116200272057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620027dd575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af115801562002857573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200287d919062009378565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b408298028784604051620028ce929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b031603620028fb57620028fb8662008194565b6040808301519051633041949b60e01b815261200591633041949b916200292891908790600401620092ff565b600060405180830381600087803b1580156200294357600080fd5b505af115801562002958573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff16156200298f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029c15760405163b1d02c3d60e01b815260040160405180910390fd5b83620029cf603f8262007fb1565b620029ed5760405163056e881160e01b815260040160405180910390fd5b83620029fb603f8262007fb1565b62002a195760405163056e881160e01b815260040160405180910390fd5b6034805460ff19166001179055600084900362002a4957604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b03160362002a7c5760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002ae490620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002b1290620092c9565b801562002b635780601f1062002b375761010080835404028352916020019162002b63565b820191906000526020600020905b81548152906001019060200180831162002b4557829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002b8e90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002bbc90620092c9565b801562002c0d5780601f1062002be15761010080835404028352916020019162002c0d565b820191906000526020600020905b81548152906001019060200180831162002bef57829003601f168201915b5050505050815260200160018201805462002c2890620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002c5690620092c9565b801562002ca75780601f1062002c7b5761010080835404028352916020019162002ca7565b820191906000526020600020905b81548152906001019060200180831162002c8957829003601f168201915b5050505050815260200160028201805462002cc290620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002cf090620092c9565b801562002d415780601f1062002d155761010080835404028352916020019162002d41565b820191906000526020600020905b81548152906001019060200180831162002d2357829003601f168201915b5050505050815260200160038201805462002d5c90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002d8a90620092c9565b801562002ddb5780601f1062002daf5761010080835404028352916020019162002ddb565b820191906000526020600020905b81548152906001019060200180831162002dbd57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162002e7a57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002f0590620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002f3390620092c9565b801562002f845780601f1062002f585761010080835404028352916020019162002f84565b820191906000526020600020905b81548152906001019060200180831162002f6657829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002faf90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462002fdd90620092c9565b80156200302e5780601f1062003002576101008083540402835291602001916200302e565b820191906000526020600020905b8154815290600101906020018083116200301057829003601f168201915b505050505081526020016001820180546200304990620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200307790620092c9565b8015620030c85780601f106200309c57610100808354040283529160200191620030c8565b820191906000526020600020905b815481529060010190602001808311620030aa57829003601f168201915b50505050508152602001600282018054620030e390620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200311190620092c9565b8015620031625780601f10620031365761010080835404028352916020019162003162565b820191906000526020600020905b8154815290600101906020018083116200314457829003601f168201915b505050505081526020016003820180546200317d90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620031ab90620092c9565b8015620031fc5780601f10620031d057610100808354040283529160200191620031fc565b820191906000526020600020905b815481529060010190602001808311620031de57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200329b5750505050508152505090508060e001518015620032de5750876001600160a01b0316836001600160a01b031614155b15620032fd57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af115801562003354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200337a919062009378565b9050603754811015620033a05760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200343557506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200340d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003433919062009378565b105b1562003454576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a54836200346a9190620093e3565b6200347691906200933f565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d8060008114620034cb576040519150601f19603f3d011682016040523d82523d6000602084013e620034d0565b606091505b5050905080620034f3576040516312171d8360e31b815260040160405180910390fd5b620034ff8284620093cd565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af115801562003555573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200357c919062009378565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e8589604051620035e1939291909283526020830191909152604082015260600190565b60405180910390a4604080516002808252606082018352600092602083019080368337019050509050866040015181600081518110620036255762003625620093fd565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620036605762003660620093fd565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620036a19084908c9060040162009413565b600060405180830381600087803b158015620036bc57600080fd5b505af1158015620036d1573d6000803e3d6000fd5b505050508a1562003743576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200370e929190620092ff565b600060405180830381600087803b1580156200372957600080fd5b505af11580156200373e573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff16156200378857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620037ba5760405163b1d02c3d60e01b815260040160405180910390fd5b620037c462008153565b620037d1603f8262007fb1565b620037ef5760405163056e881160e01b815260040160405180910390fd5b6000620037fb62008153565b6001600160a01b0381166000908152604160205260409020600c8101549192509042906200382e90620151809062009362565b11156200384e57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620038885760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b039081169086161015620038c6576009820154620038c09086906001600160401b03166200943f565b620038e0565b6009820154620038e0906001600160401b0316866200943f565b60098301546001600160401b039182169250600160801b9004168111156200391b5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b606080606060006200399a603f620082ba565b90508086101562004023578415620039b35784620039b5565b805b9450600085620039c68884620093cd565b11620039de57620039d88783620093cd565b620039e0565b855b9050806001600160401b03811115620039fd57620039fd62008b4b565b60405190808252806020026020018201604052801562003a27578160200160208202803683370190505b509450806001600160401b0381111562003a455762003a4562008b4b565b60405190808252806020026020018201604052801562003a6f578160200160208202803683370190505b509350806001600160401b0381111562003a8d5762003a8d62008b4b565b60405190808252806020026020018201604052801562003ac257816020015b606081526020019060019003908162003aac5790505b50925060005b818110156200402057600062003aec62003ae3838b62009362565b603f90620082c5565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003b5990620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003b8790620092c9565b801562003bd85780601f1062003bac5761010080835404028352916020019162003bd8565b820191906000526020600020905b81548152906001019060200180831162003bba57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003c0390620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003c3190620092c9565b801562003c825780601f1062003c565761010080835404028352916020019162003c82565b820191906000526020600020905b81548152906001019060200180831162003c6457829003601f168201915b5050505050815260200160018201805462003c9d90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003ccb90620092c9565b801562003d1c5780601f1062003cf05761010080835404028352916020019162003d1c565b820191906000526020600020905b81548152906001019060200180831162003cfe57829003601f168201915b5050505050815260200160028201805462003d3790620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003d6590620092c9565b801562003db65780601f1062003d8a5761010080835404028352916020019162003db6565b820191906000526020600020905b81548152906001019060200180831162003d9857829003601f168201915b5050505050815260200160038201805462003dd190620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462003dff90620092c9565b801562003e505780601f1062003e245761010080835404028352916020019162003e50565b820191906000526020600020905b81548152906001019060200180831162003e3257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162003eef575050505050815250509050806000015188848151811062003f285762003f28620093fd565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003fc15780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003f95573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003fbb919062009378565b62003fc4565b60005b87848151811062003fd95762003fd9620093fd565b602002602001018181525050806080015186848151811062003fff5762003fff620093fd565b6020026020010181905250505080620040189062009469565b905062003ac8565b50505b92959194509250565b60005462010000900460ff16156200405757604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620040895760405163b1d02c3d60e01b815260040160405180910390fd5b3362004097603f8262007fb1565b15620040b657604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038181166000908152604d60205260409020541615620040f057604051631a0a9b9f60e21b815260040160405180910390fd5b6001600160a01b03888116600090815260436020526040902054161515806200413157506001600160a01b03881660009081526047602052604090205460ff165b156200415057604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200416f92919062009319565b908152604051908190036020019020546001600160a01b0316141580620041b9575060488787604051620041a592919062009319565b9081526040519081900360200190205460ff165b15620041d8576040516311fdb94760e01b815260040160405180910390fd5b6000620041e6838062009485565b604051602001620041f992919062009319565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff1615620042435760405163c0bf414360e01b815260040160405180910390fd5b600062004259670de0b6b3a764000034620093cd565b90506036548110156200427f576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a16620042a757604051636520611b60e11b815260040160405180910390fd5b611388620042bc604087016020880162008d34565b6001600160401b03161180620043025750620042df604086016020870162008d34565b6001600160401b0316620042f7602087018762008d34565b6001600160401b0316115b806200434157506200431b604086016020870162008d34565b6001600160401b031662004336606087016040880162008d34565b6001600160401b0316115b15620043605760405163dc81db8560e01b815260040160405180910390fd5b620043ab62004370858062009485565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620082d392505050565b620043c957604051635dba5ad760e01b815260040160405180910390fd5b620043d8838a8a8a8a62008475565b620043f657604051631647e3cb60e11b815260040160405180910390fd5b6000620044448462004409878062009485565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620085a592505050565b905062004453603f85620086a6565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620044d38b8d836200952d565b508560058201620044e58282620095f5565b5087905060098201620044f982826200972e565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004547908e908e9062009319565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620045ca929190620097fe565b60405180910390a460408051848152602081018590526001600160a01b0387169182917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a3604051633041949b60e01b815261200590633041949b90620046909085908990600401620092ff565b600060405180830381600087803b158015620046ab57600080fd5b505af1158015620046c0573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620046fd603f8262007fb1565b6200471b5760405163056e881160e01b815260040160405180910390fd5b50506001600160a01b031660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915290565b6001600160a01b03808216600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082810191909152600484018054919491608084019190620047e490620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200481290620092c9565b8015620048635780601f10620048375761010080835404028352916020019162004863565b820191906000526020600020905b8154815290600101906020018083116200484557829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200488e90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620048bc90620092c9565b80156200490d5780601f10620048e1576101008083540402835291602001916200490d565b820191906000526020600020905b815481529060010190602001808311620048ef57829003601f168201915b505050505081526020016001820180546200492890620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200495690620092c9565b8015620049a75780601f106200497b57610100808354040283529160200191620049a7565b820191906000526020600020905b8154815290600101906020018083116200498957829003601f168201915b50505050508152602001600282018054620049c290620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620049f090620092c9565b801562004a415780601f1062004a155761010080835404028352916020019162004a41565b820191906000526020600020905b81548152906001019060200180831162004a2357829003601f168201915b5050505050815260200160038201805462004a5c90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462004a8a90620092c9565b801562004adb5780601f1062004aaf5761010080835404028352916020019162004adb565b820191906000526020600020905b81548152906001019060200180831162004abd57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162004b7a5750505091909252505050608001519392505050565b336110011462004bcb57604051630f22c43960e41b81526110016004820152602401620011ef565b6001600160a01b038082166000908152604360205260409020541662004bf3603f8262007fb1565b62004c115760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004c74573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004c9a919062009378565b90506000603d544262004cae919062009362565b905062004cbc83826200805e565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004cfc9392919062009392565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004d3a916001600160a01b0316908890600401620092ff565b600060405180830381600087803b15801562004d5557600080fd5b505af115801562004d6a573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004d965750600054600160ff909116105b8062004db25750303b15801562004db2575060005460ff166001145b62004e175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620011ef565b6000805460ff19166001179055801562004e3b576000805461ff0019166101001790555b33411462004e5c5760405163022d8c9560e31b815260040160405180910390fd5b3a1562004e7c576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d60385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562278d00603e55604a5560408051610760810190915261074080825260609182916200aad6602083013980602001905181019062004f0d91906200983a565b915060405180611160016040528061114081526020016200b216611140913980602001905181019062004f419190620098de565b905060005b825181101562004fb05760016047600085848151811062004f6b5762004f6b620093fd565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004fa88162009469565b905062004f46565b5060005b815181101562005021576001604883838151811062004fd75762004fd7620093fd565b602002602001015160405162004fee9190620099db565b908152604051908190036020019020805491151560ff19909216919091179055620050198162009469565b905062004fb4565b50620050417308e68ec70fa3b629784fdb28887e206ce8561e08620086bd565b505080156200181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b3361200014620050b457604051630f22c43960e41b81526120006004820152602401620011ef565b60405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152606401620011ef565b600054630100000090046001600160a01b031633146200511d576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff16156200514857604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600062005191603f8462007fb1565b620051af5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa1580156200520c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062005232919062009378565b90505b92915050565b60005462010000900460ff16156200526657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620052985760405163b1d02c3d60e01b815260040160405180910390fd5b81620052a6603f8262007fb1565b620052c45760405163056e881160e01b815260040160405180910390fd5b6037543490811015620052ea5760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b03808516600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805433949160808401916200535290620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200538090620092c9565b8015620053d15780601f10620053a557610100808354040283529160200191620053d1565b820191906000526020600020905b815481529060010190602001808311620053b357829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620053fc90620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200542a90620092c9565b80156200547b5780601f106200544f576101008083540402835291602001916200547b565b820191906000526020600020905b8154815290600101906020018083116200545d57829003601f168201915b505050505081526020016001820180546200549690620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620054c490620092c9565b8015620055155780601f10620054e95761010080835404028352916020019162005515565b820191906000526020600020905b815481529060010190602001808311620054f757829003601f168201915b505050505081526020016002820180546200553090620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200555e90620092c9565b8015620055af5780601f106200558357610100808354040283529160200191620055af565b820191906000526020600020905b8154815290600101906020018083116200559157829003601f168201915b50505050508152602001600382018054620055ca90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620055f890620092c9565b8015620056495780601f106200561d5761010080835404028352916020019162005649565b820191906000526020600020905b8154815290600101906020018083116200562b57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620056e85750505050508152505090508060e0015180156200572b5750856001600160a01b0316826001600160a01b031614155b156200574a57604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af11580156200579b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620057c2919062009378565b9050826001600160a01b0316876001600160a01b03167f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04838760405162005813929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b916200584891908790600401620092ff565b600060405180830381600087803b1580156200586357600080fd5b505af115801562005878573d6000803e3d6000fd5b50505050851562001813576040516372f6ad8f60e11b81526120059063e5ed5b1e90620058ac9086908b90600401620092ff565b600060405180830381600087803b158015620058c757600080fd5b505af1158015620058dc573d6000803e3d6000fd5b5050505050505050505050565b620059156040518060800160405280606081526020016060815260200160608152602001606081525090565b8162005923603f8262007fb1565b620059415760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038316600090815260416020526040908190208151608081019092526005018054829082906200597890620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620059a690620092c9565b8015620059f75780601f10620059cb57610100808354040283529160200191620059f7565b820191906000526020600020905b815481529060010190602001808311620059d957829003601f168201915b5050505050815260200160018201805462005a1290620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462005a4090620092c9565b801562005a915780601f1062005a655761010080835404028352916020019162005a91565b820191906000526020600020905b81548152906001019060200180831162005a7357829003601f168201915b5050505050815260200160028201805462005aac90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462005ada90620092c9565b801562005b2b5780601f1062005aff5761010080835404028352916020019162005b2b565b820191906000526020600020905b81548152906001019060200180831162005b0d57829003601f168201915b5050505050815260200160038201805462005b4690620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462005b7490620092c9565b801562005bc55780601f1062005b995761010080835404028352916020019162005bc5565b820191906000526020600020905b81548152906001019060200180831162005ba757829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005c0157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005c335760405163b1d02c3d60e01b815260040160405180910390fd5b62005c3f828262008756565b5050565b336110071462005c6b57604051630f22c43960e41b81526110076004820152602401620011ef565b62005cd86040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562005d93576020811462005d0a5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162005d4d918585808385018382808284376000920191909152509293925050620088bf9050565b90506108fc81108062005d61575061271081115b1562005d8a5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60355562006a9d565b62005e046040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562005ece576020811462005e365783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162005e79918585808385018382808284376000920191909152509293925050620088bf9050565b9050683635c9adc5dea0000081108062005e9c575069152d02c7e14af680000081115b1562005ec55784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60365562006a9d565b62005f41604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562006008576020811462005f735783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162005fb6918585808385018382808284376000920191909152509293925050620088bf9050565b905067016345785d8a000081108062005fd65750678ac7230489e8000081115b1562005fff5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60375562006a9d565b62006079604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620061315760208114620060ab5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f8401819004810282018101909252828152600091620060ee918585808385018382808284376000920191909152509293925050620088bf9050565b9050801580620060ff57506101f481115b15620061285784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60385562006a9d565b6200619a6040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620062575760208114620061cc5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f84018190048102820181019092528281526000916200620f918585808385018382808284376000920191909152509293925050620088bf9050565b90506203f48081108062006225575062278d0081115b156200624e5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b60395562006a9d565b620062c560405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620063725760208114620062f75783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f84018190048102820181019092528281526000916200633a918585808385018382808284376000920191909152509293925050620088bf9050565b90506064811115620063695784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603a5562006a9d565b620063e260405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620064a35760208114620064145783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162006457918585808385018382808284376000920191909152509293925050620088bf9050565b9050674563918244f40000811080620064715750603c5481115b156200649a5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603b5562006a9d565b620065116040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620065d45760208114620065435783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162006586918585808385018382808284376000920191909152509293925050620088bf9050565b905068056bc75e2d63100000811080620065a25750603b548111155b15620065cb5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603c5562006a9d565b620066416040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b15620066fe5760208114620066735783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f8401819004810282018101909252828152600091620066b6918585808385018382808284376000920191909152509293925050620088bf9050565b90506202a300811080620066cc5750603e548110155b15620066f55784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603d5562006a9d565b620067696040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b156200682657602081146200679b5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f8401819004810282018101909252828152600091620067de918585808385018382808284376000920191909152509293925050620088bf9050565b9050620d2f00811080620067f45750603d548111155b156200681d5784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b603e5562006a9d565b620068a06040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b156200694c5760208114620068d25783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604080516020601f840181900481028201810190925282815260009162006915918585808385018382808284376000920191909152509293925050620088bf9050565b905080600003620069435784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b604a5562006a9d565b620069ba6040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088629050565b1562006a7a5760148114620069ec5783838383604051630a5a604160e01b8152600401620011ef9493929190620099f9565b600062006a34601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050620088bf9050565b90506001600160a01b03811662006a685784848484604051630a5a604160e01b8152600401620011ef9493929190620099f9565b62006a7381620088c4565b5062006a9d565b838383836040516325ee20d560e21b8152600401620011ef9493929190620099f9565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e6338484848460405162006ad49493929190620099f9565b60405180910390a150505050565b60005462010000900460ff161562006b0d57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562006b3f5760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b0381111562006b5d5762006b5d62008b4b565b60405190808252806020026020018201604052801562006b87578160200160208202803683370190505b5090506000805b8381101562006c855762006bd087878381811062006bb05762006bb0620093fd565b905060200201602081019062006bc79190620089d3565b603f9062007fb1565b62006bee5760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006c075762006c07620093fd565b905060200201602081019062006c1e9190620089d3565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006c5a5762006c5a620093fd565b6001600160a01b039092166020928302919091019091015262006c7d8162009469565b905062006b8e565b50604051634484077560e01b81526120059063448407759062002928908590889060040162009413565b606080600062006cc0603f620082ba565b90508085101562006e8457831562006cd9578362006cdb565b805b935060008462006cec8784620093cd565b1162006d045762006cfe8683620093cd565b62006d06565b845b9050806001600160401b0381111562006d235762006d2362008b4b565b60405190808252806020026020018201604052801562006d4d578160200160208202803683370190505b509350806001600160401b0381111562006d6b5762006d6b62008b4b565b60405190808252806020026020018201604052801562006d95578160200160208202803683370190505b50925060005b8181101562006e815762006db462003ae3828962009362565b85828151811062006dc95762006dc9620093fd565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006e025762006e02620093fd565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006e565762006e56620093fd565b6001600160a01b039092166020928302919091019091015262006e798162009469565b905062006d9b565b50505b9250925092565b336110011462006eb357604051630f22c43960e41b81526110016004820152602401620011ef565b60005462010000900460ff161562006ede57604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006f06603f8262007fb1565b62006f245760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006f4c62015180426200933f565b604a546000828152604b60205260409020549192501162006f805760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006fa190849062009362565b90915550506001600160a01b0384166000908152604460205260409020541580159062006ff657506001600160a01b038416600090815260446020526040902054429062006ff490620151809062009362565b105b1562007015576040516330abb81d60e21b815260040160405180910390fd5b6000806200702585600062007fd4565b91509150816200704857604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af11580156200709b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620070c1919062009378565b9050620070cf85836200805e565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb2838360006040516200710f9392919062009392565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b91620058ac916001600160a01b0316908a90600401620092ff565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849384938493909291608084019190620071be90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620071ec90620092c9565b80156200723d5780601f1062007211576101008083540402835291602001916200723d565b820191906000526020600020905b8154815290600101906020018083116200721f57829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200726890620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200729690620092c9565b8015620072e75780601f10620072bb57610100808354040283529160200191620072e7565b820191906000526020600020905b815481529060010190602001808311620072c957829003601f168201915b505050505081526020016001820180546200730290620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200733090620092c9565b8015620073815780601f10620073555761010080835404028352916020019162007381565b820191906000526020600020905b8154815290600101906020018083116200736357829003601f168201915b505050505081526020016002820180546200739c90620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620073ca90620092c9565b80156200741b5780601f10620073ef576101008083540402835291602001916200741b565b820191906000526020600020905b815481529060010190602001808311620073fd57829003601f168201915b505050505081526020016003820180546200743690620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200746490620092c9565b8015620074b55780601f106200748957610100808354040283529160200191620074b5565b820191906000526020600020905b8154815290600101906020018083116200749757829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620075545750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff1615620075bb57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620075ed5760405163b1d02c3d60e01b815260040160405180910390fd5b620075f762008153565b62007604603f8262007fb1565b620076225760405163056e881160e01b815260040160405180910390fd5b60006200762e62008153565b6001600160a01b0381166000908152604160205260409020600c8101549192509042906200766190620151809062009362565b11156200768157604051631f92cdbd60e11b815260040160405180910390fd5b6005810180546200769290620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620076c090620092c9565b8015620077115780601f10620076e55761010080835404028352916020019162007711565b820191906000526020600020905b815481529060010190602001808311620076f357829003601f168201915b50505082875250859160058401915081906200772e908262009a24565b506020820151600182019062007745908262009a24565b50604082015160028201906200775c908262009a24565b506060820151600382019062007773908262009a24565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff1615620077e157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620078135760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007834576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620078a55762007892858583818110620078595762007859620093fd565b9050602002016020810190620078709190620089d3565b848484818110620078855762007885620093fd565b9050602002013562008756565b6200789d8162009469565b905062007837565b5050505050565b6001600160a01b03808216600090815260416020908152604080832081516101808101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492938493909160808401916200791790620092c9565b80601f01602080910402602001604051908101604052809291908181526020018280546200794590620092c9565b8015620079965780601f106200796a5761010080835404028352916020019162007996565b820191906000526020600020905b8154815290600101906020018083116200797857829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620079c190620092c9565b80601f0160208091040260200160405190810160405280929190818152602001828054620079ef90620092c9565b801562007a405780601f1062007a145761010080835404028352916020019162007a40565b820191906000526020600020905b81548152906001019060200180831162007a2257829003601f168201915b5050505050815260200160018201805462007a5b90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462007a8990620092c9565b801562007ada5780601f1062007aae5761010080835404028352916020019162007ada565b820191906000526020600020905b81548152906001019060200180831162007abc57829003601f168201915b5050505050815260200160028201805462007af590620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462007b2390620092c9565b801562007b745780601f1062007b485761010080835404028352916020019162007b74565b820191906000526020600020905b81548152906001019060200180831162007b5657829003601f168201915b5050505050815260200160038201805462007b8f90620092c9565b80601f016020809104026020016040519081016040528092919081815260200182805462007bbd90620092c9565b801562007c0e5780601f1062007be25761010080835404028352916020019162007c0e565b820191906000526020600020905b81548152906001019060200180831162007bf057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162007cad5750505091909252505050604001519392505050565b600062007ce5603f8462007fb1565b62007d035760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd90602401620051ee565b60005462010000900460ff161562007d7257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007da45760405163b1d02c3d60e01b815260040160405180910390fd5b62007dae62008153565b62007dbb603f8262007fb1565b62007dd95760405163056e881160e01b815260040160405180910390fd5b600062007de562008153565b905062007df6818787878762008475565b62007e1457604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007e3392919062009319565b908152604051908190036020019020546001600160a01b031614158062007e7d57506048868660405162007e6992919062009319565b9081526040519081900360200190205460ff165b1562007e9c576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007ecb90620151809062009362565b111562007eeb57604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007f01919062009aec565b908152604051908190036020019020556004810162007f228789836200952d565b5042600c820155604051829060459062007f40908a908a9062009319565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007fa0908a908a90620097fe565b60405180910390a250505050505050565b6001600160a01b0381166000908152600183016020526040812054151562005232565b6000806000848460405160200162007fee92919062009b6a565b60408051601f1981840301815291815281516020928301206000818152604c909352912054909150428111156200802e5760008093509350505062008057565b603e546200803d904262009362565b6000928352604c6020526040909220829055506001925090505b9250929050565b600060016200806e603f620082ba565b6200807a9190620093cd565b6049541080159150620080c65760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b0154821115620080db57600b83018290555b600a83015460ff166200814e57600a8301805460ff19166001908117909155604980546000906200810e90849062009362565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b336000908152604d60205260408120546001600160a01b0316156200818f5750336000908152604d60205260409020546001600160a01b031690565b503390565b6001600160a01b0381166000908152604160205260409020600a81015460ff1615620081be575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa1580156200820e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008234919062009378565b101562005c3f576200825681603d544262008250919062009362565b6200805e565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200829d57600080fd5b505af1158015620082b2573d6000803e3d6000fd5b505050505050565b600062005235825490565b600062005232838362008930565b600080829050600381511080620082eb575060098151115b15620082fa5750600092915050565b604181600081518110620083125762008312620093fd565b016020015160f81c1080620083445750605a816000815181106200833a576200833a620093fd565b016020015160f81c115b15620083535750600092915050565b60015b81518110156200846b576030828281518110620083775762008377620093fd565b016020015160f81c1080620083a8575060398282815181106200839e576200839e620093fd565b016020015160f81c115b8015620083f857506041828281518110620083c757620083c7620093fd565b016020015160f81c1080620083f85750605a828281518110620083ee57620083ee620093fd565b016020015160f81c115b80156200844857506061828281518110620084175762008417620093fd565b016020015160f81c1080620084485750607a8282815181106200843e576200843e620093fd565b016020015160f81c115b1562008458575060009392505050565b620084638162009469565b905062008356565b5060019392505050565b600060308414158062008489575060608214155b1562008498575060006200859c565b600086868646604051602001620084b3949392919062009bb4565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a6040516020016200850d95949392919062009be1565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa6200855757600080fd5b50600081600081518110620085705762008570620093fd565b016020015160f81c90506001811462008592576000955050505050506200859c565b6001955050505050505b95945050505050565b60008061200361dead604051620085bc90620089af565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f080158015620085ff573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b81526004016200863392919062009c19565b6000604051808303818588803b1580156200864d57600080fd5b505af115801562008662573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b600062005232836001600160a01b0384166200895d565b600054610100900460ff166200872a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011ef565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008764603f8262007fb1565b620087825760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af1158015620087e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200880c919062009378565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd3992683836040516200885491815260200190565b60405180910390a350505050565b600081604051602001620088779190620099db565b6040516020818303038152906040528051906020012083604051602001620088a09190620099db565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60008260000182815481106200894a576200894a620093fd565b9060005260206000200154905092915050565b6000818152600183016020526040812054620089a65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562005235565b50600062005235565b610e968062009c4083390190565b6001600160a01b03811681146200181a57600080fd5b600060208284031215620089e657600080fd5b8135620089f381620089bd565b9392505050565b60008083601f84011262008a0d57600080fd5b5081356001600160401b0381111562008a2557600080fd5b6020830191508360208285010111156200805757600080fd5b6000806020838503121562008a5257600080fd5b82356001600160401b0381111562008a6957600080fd5b62008a7785828601620089fa565b90969095509350505050565b60008060006040848603121562008a9957600080fd5b833560ff8116811462008aab57600080fd5b925060208401356001600160401b0381111562008ac757600080fd5b62008ad586828701620089fa565b9497909650939450505050565b60005b8381101562008aff57818101518382015260200162008ae5565b50506000910152565b6000815180845262008b2281602086016020860162008ae2565b601f01601f19169290920160200192915050565b60208152600062005232602083018462008b08565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562008b865762008b8662008b4b565b60405290565b604051601f8201601f191681016001600160401b038111828210171562008bb75762008bb762008b4b565b604052919050565b60006001600160401b0382111562008bdb5762008bdb62008b4b565b50601f01601f191660200190565b600062008c0062008bfa8462008bbf565b62008b8c565b905082815283838301111562008c1557600080fd5b828260208301376000602084830101529392505050565b60006020828403121562008c3f57600080fd5b81356001600160401b0381111562008c5657600080fd5b8201601f8101841362008c6857600080fd5b62008c798482356020840162008be9565b949350505050565b6000806040838503121562008c9557600080fd5b823562008ca281620089bd565b946020939093013593505050565b8035801515811462008cc157600080fd5b919050565b6000806000806080858703121562008cdd57600080fd5b843562008cea81620089bd565b9350602085013562008cfc81620089bd565b92506040850135915062008d136060860162008cb0565b905092959194509250565b6001600160401b03811681146200181a57600080fd5b60006020828403121562008d4757600080fd5b8135620089f38162008d1e565b6000806040838503121562008d6857600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101562008db25781516001600160a01b03168752958201959082019060010162008d8b565b509495945050505050565b60808152600062008dd2608083018762008d77565b82810360208481019190915286518083528782019282019060005b8181101562008e0b5784518352938301939183019160010162008ded565b5050848103604086015286518082528282019350600581901b8201830183890160005b8381101562008e6057601f1985840301875262008e4d83835162008b08565b9686019692509085019060010162008e2e565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e081121562008e9657600080fd5b883562008ea381620089bd565b975060208901356001600160401b038082111562008ec057600080fd5b62008ece8c838d01620089fa565b909950975060408b013591508082111562008ee857600080fd5b62008ef68c838d01620089fa565b90975095508591506060605f198401121562008f1157600080fd5b60608b01945060c08b013592508083111562008f2c57600080fd5b505088016080818b03121562008f4157600080fd5b8091505092959891949750929550565b6000806040838503121562008f6557600080fd5b823562008f7281620089bd565b915062008f826020840162008cb0565b90509250929050565b60208152600082516080602084015262008fa960a084018262008b08565b90506020840151601f198085840301604086015262008fc9838362008b08565b9250604086015191508085840301606086015262008fe8838362008b08565b92506060860151915080858403016080860152506200859c828262008b08565b600080600080604085870312156200901f57600080fd5b84356001600160401b03808211156200903757600080fd5b6200904588838901620089fa565b909650945060208701359150808211156200905f57600080fd5b506200906e87828801620089fa565b95989497509550505050565b60008083601f8401126200908d57600080fd5b5081356001600160401b03811115620090a557600080fd5b6020830191508360208260051b85010111156200805757600080fd5b600080600060408486031215620090d757600080fd5b83356001600160401b03811115620090ee57600080fd5b620090fc868287016200907a565b90945092505060208401356200911281620089bd565b809150509250925092565b60608152600062009132606083018662008d77565b828103602084015262009146818662008d77565b915050826040830152949350505050565b600082601f8301126200916957600080fd5b620052328383356020850162008be9565b6000602082840312156200918d57600080fd5b81356001600160401b0380821115620091a557600080fd5b9083019060808286031215620091ba57600080fd5b620091c462008b61565b823582811115620091d457600080fd5b620091e28782860162009157565b825250602083013582811115620091f857600080fd5b620092068782860162009157565b6020830152506040830135828111156200921f57600080fd5b6200922d8782860162009157565b6040830152506060830135828111156200924657600080fd5b620092548782860162009157565b60608301525095945050505050565b600080600080604085870312156200927a57600080fd5b84356001600160401b03808211156200929257600080fd5b620092a0888389016200907a565b90965094506020870135915080821115620092ba57600080fd5b506200906e878288016200907a565b600181811c90821680620092de57607f821691505b60208210810362001c3057634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b6000826200935d57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562005235576200523562009329565b6000602082840312156200938b57600080fd5b5051919050565b838152602081018390526060810160038310620093bf57634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b8181038181111562005235576200523562009329565b808202811582820484141762005235576200523562009329565b634e487b7160e01b600052603260045260246000fd5b60408152600062009428604083018562008d77565b905060018060a01b03831660208301529392505050565b6001600160401b0382811682821603908082111562009462576200946262009329565b5092915050565b6000600182016200947e576200947e62009329565b5060010190565b6000808335601e198436030181126200949d57600080fd5b8301803591506001600160401b03821115620094b857600080fd5b6020019150368190038213156200805757600080fd5b601f8211156200814e57600081815260208120601f850160051c81016020861015620094f75750805b601f850160051c820191505b81811015620082b25782815560010162009503565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009547576200954762008b4b565b6200955f83620095588354620092c9565b83620094ce565b6000601f8411600181146200959257600085156200957d5750838201355b62009589868262009518565b845550620078a5565b600083815260209020601f19861690835b82811015620095c55786850135825560209485019460019092019101620095a3565b5086821015620095e35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b62009601828362009485565b6001600160401b038111156200961b576200961b62008b4b565b62009633816200962c8554620092c9565b85620094ce565b6000601f821160018114620096665760008315620096515750838201355b6200965d848262009518565b865550620096c3565b600085815260209020601f19841690835b8281101562009699578685013582556020948501946001909201910162009677565b5084821015620096b75760001960f88660031b161c19848701351681555b505060018360011b0185555b50505050620096d6602083018362009485565b620096e68183600186016200952d565b5050620096f7604083018362009485565b620097078183600286016200952d565b505062009718606083018362009485565b620097288183600386016200952d565b50505050565b81356200973b8162008d1e565b6001600160401b03811690508154816001600160401b031982161783556020840135620097688162008d1e565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff19831684178117855590850135620097a88162008d1e565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600062008c79602083018486620097d5565b60006001600160401b0382111562009830576200983062008b4b565b5060051b60200190565b600060208083850312156200984e57600080fd5b82516001600160401b038111156200986557600080fd5b8301601f810185136200987757600080fd5b80516200988862008bfa8262009814565b81815260059190911b82018301908381019087831115620098a857600080fd5b928401925b82841015620098d3578351620098c381620089bd565b82529284019290840190620098ad565b979650505050505050565b60006020808385031215620098f257600080fd5b82516001600160401b03808211156200990a57600080fd5b818501915085601f8301126200991f57600080fd5b81516200993062008bfa8262009814565b81815260059190911b830184019084810190888311156200995057600080fd5b8585015b83811015620099ce578051858111156200996e5760008081fd5b8601603f81018b13620099815760008081fd5b8781015160406200999662008bfa8362008bbf565b8281528d82848601011115620099ac5760008081fd5b620099bd838c830184870162008ae2565b865250505091860191860162009954565b5098975050505050505050565b60008251620099ef81846020870162008ae2565b9190910192915050565b60408152600062009a0f604083018688620097d5565b8281036020840152620098d3818587620097d5565b81516001600160401b0381111562009a405762009a4062008b4b565b62009a588162009a518454620092c9565b84620094ce565b602080601f83116001811462009a8c576000841562009a775750858301515b62009a83858262009518565b865550620082b2565b600085815260208120601f198616915b8281101562009abd5788860151825594840194600190910190840162009a9c565b508582101562009adc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835462009afc81620092c9565b6001828116801562009b17576001811462009b2d5762009b5e565b60ff198416875282151583028701945062009b5e565b8760005260208060002060005b8581101562009b555781548a82015290840190820162009b3a565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b16815260006003831062009ba057634e487b7160e01b600052602160045260246000fd5b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b6000865162009bf5818460208b0162008ae2565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b038316815260406020820181905260009062008c799083018462008b0856fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000a164736f6c6343000811000a" + "code": "0x608060405260043610620003e75760003560e01c80638456cb591162000203578063cbb04d9d1162000117578063e8f67c3b11620000ad578063f80a34021162000078578063f80a34021462000c3f578063fb50b31f1462000c64578063fc0c5ff11462000c89578063ff69ab611462000ca157600080fd5b8063e8f67c3b1462000bbb578063e992aaf51462000bd3578063efdbf0e11462000beb578063f1f74d841462000c2757600080fd5b8063d7c2dfc811620000ee578063d7c2dfc81462000b41578063d8ca511f1462000b66578063daacdb661462000b7e578063dbda7fb31462000b9657600080fd5b8063cbb04d9d1462000ac2578063d115a2061462000b03578063d6ca429d1462000b1c57600080fd5b8063ac4317511162000199578063bff02e201162000164578063bff02e201462000a4f578063c38fbec81462000a85578063c473318f1462000aaa578063c8509d8114620008a357600080fd5b8063ac43175114620009cd578063b187bd2614620009f2578063baa7199e1462000a12578063bdceadf31462000a3757600080fd5b80638cd22b2211620001da5780638cd22b221462000938578063982ef0a7146200095d578063a43569b31462000974578063aad3ec9614620009a857600080fd5b80638456cb5914620008c857806386d5450614620008e05780638a4d3fa8146200091a57600080fd5b806349f41a4211620002fb57806364028fbd116200029157806375cc7d89116200025c57806375cc7d89146200084e57806376e7d6d614620008735780638129fc1c146200088b578063831d65d114620008a357600080fd5b806364028fbd1462000789578063663706d314620007a05780636ec01b2714620007d15780636f8e2fa4146200082957600080fd5b80634e6fd6c411620002d25780634e6fd6c414620006f05780635949187114620007085780635e7cc1c9146200072d57806363a036b5146200075257600080fd5b806349f41a4214620006815780634a49ac4c14620006a65780634d99dd1614620006cb57600080fd5b80631fa8882b116200037d578063417c73a71162000348578063417c73a714620005cd578063449ecfe614620005f257806345211bfd14620006175780634838d165146200063c57600080fd5b80631fa8882b146200053d5780632b727c8614620005565780632e8e8c71146200057b5780633840998814620005b557600080fd5b8063092193ab11620003be578063092193ab14620004885780630e9fbf51146200049f5780631182b87514620004c457806317b4f35314620004f857600080fd5b8063046f7da21462000407578063059ddd22146200041f5780630661806e146200046157600080fd5b36620004025760345460ff166001146200040057600080fd5b005b600080fd5b3480156200041457600080fd5b506200040062000cb9565b3480156200042c57600080fd5b50620004446200043e36600462008787565b62000d4b565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046e57600080fd5b506200047960365481565b60405190815260200162000458565b620004006200049936600462008787565b62001173565b348015620004ac57600080fd5b5062000400620004be366004620087e9565b620017c4565b348015620004d157600080fd5b50620004e9620004e33660046200882e565b62001af0565b604051620004589190620088e1565b3480156200050557600080fd5b506200044462000517366004620089b3565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200054a57600080fd5b50620004796201518081565b3480156200056357600080fd5b50620004446200057536600462008787565b62001b88565b3480156200058857600080fd5b50620004446200059a36600462008787565b604d602052600090815260409020546001600160a01b031681565b348015620005c257600080fd5b506200047960375481565b348015620005da57600080fd5b5062000400620005ec36600462008787565b62001bdd565b348015620005ff57600080fd5b50620004006200061136600462008787565b62001c5f565b3480156200062457600080fd5b50620004006200063636600462008787565b62001e44565b3480156200064957600080fd5b50620006706200065b36600462008787565b60016020526000908152604090205460ff1681565b604051901515815260200162000458565b3480156200068e57600080fd5b5062000400620006a036600462008787565b6200201d565b348015620006b357600080fd5b5062000400620006c536600462008787565b62002239565b348015620006d857600080fd5b5062000400620006ea36600462008a08565b620022b5565b348015620006fd57600080fd5b506200044461dead81565b3480156200071557600080fd5b50620004006200072736600462008a46565b620028e5565b3480156200073a57600080fd5b50620004006200074c36600462008ab0565b620036de565b3480156200075f57600080fd5b50620007776200077136600462008ad7565b62003908565b60405162000458949392919062008b40565b620004006200079a36600462008bfc565b62003fad565b348015620007ad57600080fd5b5062000479620007bf36600462008787565b60446020526000908152604090205481565b348015620007de57600080fd5b50620007f6620007f036600462008787565b620045fc565b6040805182516001600160401b039081168252602080850151821690830152928201519092169082015260600162000458565b3480156200083657600080fd5b50620004e96200084836600462008787565b620046a1565b3480156200085b57600080fd5b50620004006200086d36600462008787565b62004acd565b3480156200088057600080fd5b5062000479603d5481565b3480156200089857600080fd5b506200040062004c9f565b348015620008b057600080fd5b5062000400620008c23660046200882e565b62004e6a565b348015620008d557600080fd5b506200040062004ec8565b348015620008ed57600080fd5b5062000444620008ff36600462008787565b6043602052600090815260409020546001600160a01b031681565b3480156200092757600080fd5b5062000479670de0b6b3a764000081565b3480156200094557600080fd5b50620004796200095736600462008a08565b62004f60565b620004006200096e36600462008cd2565b62005019565b3480156200098157600080fd5b50620009996200099336600462008787565b620056c7565b60405162000458919062008d0a565b348015620009b557600080fd5b5062000400620009c736600462008a08565b620059b4565b348015620009da57600080fd5b5062000400620009ec36600462008d87565b62005a21565b348015620009ff57600080fd5b5060005462010000900460ff1662000670565b34801562000a1f57600080fd5b506200040062000a3136600462008e40565b620068c0565b34801562000a4457600080fd5b5062000479603c5481565b34801562000a5c57600080fd5b5062000a7462000a6e36600462008ad7565b62006a8d565b604051620004589392919062008e99565b34801562000a9257600080fd5b506200040062000aa436600462008787565b62006c69565b34801562000ab757600080fd5b506200047960385481565b34801562000acf57600080fd5b5062000ae762000ae136600462008787565b62006f2b565b6040805193845291151560208401529082015260600162000458565b34801562000b1057600080fd5b5062000479620186a081565b34801562000b2957600080fd5b506200040062000b3b36600462008ef6565b6200736e565b34801562000b4e57600080fd5b506200040062000b6036600462008fdf565b62007594565b34801562000b7357600080fd5b5062000479603b5481565b34801562000b8b57600080fd5b506200047960495481565b34801562000ba357600080fd5b506200044462000bb536600462008787565b6200768a565b34801562000bc857600080fd5b506200047960355481565b34801562000be057600080fd5b5062000479603a5481565b34801562000bf857600080fd5b506200047962000c0a366004620089b3565b805160208183018101805160468252928201919093012091525481565b34801562000c3457600080fd5b5062000479603e5481565b34801562000c4c57600080fd5b506200047962000c5e36600462008a08565b62007ab4565b34801562000c7157600080fd5b506200040062000c8336600462008d87565b62007b25565b34801562000c9657600080fd5b506200047960395481565b34801562000cae57600080fd5b5062000479604a5481565b600054630100000090046001600160a01b0316331462000cec576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000d1657604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000db69062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000de49062009045565b801562000e355780601f1062000e095761010080835404028352916020019162000e35565b820191906000526020600020905b81548152906001019060200180831162000e1757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e609062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000e8e9062009045565b801562000edf5780601f1062000eb35761010080835404028352916020019162000edf565b820191906000526020600020905b81548152906001019060200180831162000ec157829003601f168201915b5050505050815260200160018201805462000efa9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000f289062009045565b801562000f795780601f1062000f4d5761010080835404028352916020019162000f79565b820191906000526020600020905b81548152906001019060200180831162000f5b57829003601f168201915b5050505050815260200160028201805462000f949062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000fc29062009045565b8015620010135780601f1062000fe75761010080835404028352916020019162001013565b820191906000526020600020905b81548152906001019060200180831162000ff557829003601f168201915b505050505081526020016003820180546200102e9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200105c9062009045565b8015620010ad5780601f106200108157610100808354040283529160200191620010ad565b820191906000526020600020905b8154815290600101906020018083116200108f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200114c575050509190925250509051949350505050565b33611000146200119f57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161018081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620012189062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620012469062009045565b8015620012975780601f106200126b5761010080835404028352916020019162001297565b820191906000526020600020905b8154815290600101906020018083116200127957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620012c29062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620012f09062009045565b8015620013415780601f10620013155761010080835404028352916020019162001341565b820191906000526020600020905b8154815290600101906020018083116200132357829003601f168201915b505050505081526020016001820180546200135c9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200138a9062009045565b8015620013db5780601f10620013af57610100808354040283529160200191620013db565b820191906000526020600020905b815481529060010190602001808311620013bd57829003601f168201915b50505050508152602001600282018054620013f69062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620014249062009045565b8015620014755780601f10620014495761010080835404028352916020019162001475565b820191906000526020600020905b8154815290600101906020018083116200145757829003601f168201915b50505050508152602001600382018054620014909062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620014be9062009045565b80156200150f5780601f10620014e3576101008083540402835291602001916200150f565b820191906000526020600020905b815481529060010190602001808311620014f157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620015ae575050509190925250505060408101519091506001600160a01b03161580620015eb57508060e001515b15620016a857604051611002903490600081818185875af1925050503d806000811462001635576040519150601f19603f3d011682016040523d82523d6000602084013e6200163a565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d6040516200169b9060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b158015620016ff57600080fd5b505af115801562001714573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea6346040516200175591815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b916200178a919086906004016200907b565b600060405180830381600087803b158015620017a557600080fd5b505af1158015620017ba573d6000803e3d6000fd5b5050505050505b50565b3361100114620017ec57604051630f22c43960e41b8152611001600482015260240162001196565b60005462010000900460ff16156200181757604051631785c68160e01b815260040160405180910390fd5b6000604583836040516200182d92919062009095565b908152604051908190036020019020546001600160a01b0316905062001855603f8262007d5e565b620018735760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260408120906200189b6201518042620090bb565b604a546000828152604b602052604090205491925011620018cf5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b60205260408120805460019290620018f0908490620090de565b90915550506040516046906200190a908790879062009095565b9081526020016040518091039020546000141580156200195b57504262015180604687876040516200193e92919062009095565b908152602001604051809103902054620019599190620090de565b105b156200197a57604051631898eb6b60e01b815260040160405180910390fd5b6000806200198a85600262007d81565b9150915081620019ad57604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001a00573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a269190620090f4565b905062001a34858362007e0b565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600260405162001a74939291906200910e565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001ab2916001600160a01b0316908a906004016200907b565b600060405180830381600087803b15801562001acd57600080fd5b505af115801562001ae2573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001b1a57604051630f22c43960e41b8152612000600482015260240162001196565b60005462010000900460ff161562001b4557604051631785c68160e01b815260040160405180910390fd5b6034805460ff1916600117905560405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015260640162001196565b60008162001b98603f8262007d5e565b62001bb65760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038084166000908152604160205260409020600d01541691505b50919050565b600054630100000090046001600160a01b0316331462001c10576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001c8a57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001cbc5760405163b1d02c3d60e01b815260040160405180910390fd5b8062001cca603f8262007d5e565b62001ce85760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001d2657604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001d76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d9c9190620090f4565b101562001dbc576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001de25760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff19169055604980546001919060009062001e0690849062009149565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff161562001e6f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ea15760405163b1d02c3d60e01b815260040160405180910390fd5b62001eab62007f00565b62001eb8603f8262007d5e565b62001ed65760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03821662001efe57604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161562001f3857604051631e6f587560e11b815260040160405180910390fd5b600062001f4462007f00565b6001600160a01b0381166000908152604160205260409020600c81015491925090429062001f77906201518090620090de565b111562001f9757604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b336200202b603f8262007d5e565b620020495760405163056e881160e01b815260040160405180910390fd5b60005462010000900460ff16156200207457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020a65760405163b1d02c3d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152604d60205260409020541615620020e05760405163bebdc75760e01b815260040160405180910390fd5b620020ed603f8362007d5e565b156200210c5760405163bebdc75760e01b815260040160405180910390fd5b336000818152604160205260409020600d01546001600160a01b0390811690841681036200214d5760405163bebdc75760e01b815260040160405180910390fd5b6001600160a01b0381161562002184576001600160a01b0381166000908152604d6020526040902080546001600160a01b03191690555b6001600160a01b038281166000908152604160205260409020600d0180546001600160a01b031916918616918217905515620021e9576001600160a01b038481166000908152604d6020526040902080546001600160a01b0319169184169190911790555b836001600160a01b0316816001600160a01b0316836001600160a01b03167fcbb728765de145e99c00e8ae32a325231e850359b7b8a6da3b84d672ab3f1d0a60405160405180910390a450505050565b600054630100000090046001600160a01b031633146200226c576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff1615620022e057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620023125760405163b1d02c3d60e01b815260040160405180910390fd5b8162002320603f8262007d5e565b6200233e5760405163056e881160e01b815260040160405180910390fd5b816000036200236057604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b0380841660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620023c89062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620023f69062009045565b8015620024475780601f106200241b5761010080835404028352916020019162002447565b820191906000526020600020905b8154815290600101906020018083116200242957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620024729062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620024a09062009045565b8015620024f15780601f10620024c557610100808354040283529160200191620024f1565b820191906000526020600020905b815481529060010190602001808311620024d357829003601f168201915b505050505081526020016001820180546200250c9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200253a9062009045565b80156200258b5780601f106200255f576101008083540402835291602001916200258b565b820191906000526020600020905b8154815290600101906020018083116200256d57829003601f168201915b50505050508152602001600282018054620025a69062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620025d49062009045565b8015620026255780601f10620025f95761010080835404028352916020019162002625565b820191906000526020600020905b8154815290600101906020018083116200260757829003601f168201915b50505050508152602001600382018054620026409062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200266e9062009045565b8015620026bf5780601f106200269357610100808354040283529160200191620026bf565b820191906000526020600020905b815481529060010190602001808311620026a157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200275e575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af1158015620027d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027fe9190620090f4565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b4082980287846040516200284f929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b0316036200287c576200287c8662007f41565b6040808301519051633041949b60e01b815261200591633041949b91620028a9919087906004016200907b565b600060405180830381600087803b158015620028c457600080fd5b505af1158015620028d9573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff16156200291057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029425760405163b1d02c3d60e01b815260040160405180910390fd5b8362002950603f8262007d5e565b6200296e5760405163056e881160e01b815260040160405180910390fd5b836200297c603f8262007d5e565b6200299a5760405163056e881160e01b815260040160405180910390fd5b6034805460ff191660011790556000849003620029ca57604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029fd5760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002a659062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002a939062009045565b801562002ae45780601f1062002ab85761010080835404028352916020019162002ae4565b820191906000526020600020905b81548152906001019060200180831162002ac657829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002b0f9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002b3d9062009045565b801562002b8e5780601f1062002b625761010080835404028352916020019162002b8e565b820191906000526020600020905b81548152906001019060200180831162002b7057829003601f168201915b5050505050815260200160018201805462002ba99062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002bd79062009045565b801562002c285780601f1062002bfc5761010080835404028352916020019162002c28565b820191906000526020600020905b81548152906001019060200180831162002c0a57829003601f168201915b5050505050815260200160028201805462002c439062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002c719062009045565b801562002cc25780601f1062002c965761010080835404028352916020019162002cc2565b820191906000526020600020905b81548152906001019060200180831162002ca457829003601f168201915b5050505050815260200160038201805462002cdd9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002d0b9062009045565b801562002d5c5780601f1062002d305761010080835404028352916020019162002d5c565b820191906000526020600020905b81548152906001019060200180831162002d3e57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162002dfb57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002e869062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002eb49062009045565b801562002f055780601f1062002ed95761010080835404028352916020019162002f05565b820191906000526020600020905b81548152906001019060200180831162002ee757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002f309062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002f5e9062009045565b801562002faf5780601f1062002f835761010080835404028352916020019162002faf565b820191906000526020600020905b81548152906001019060200180831162002f9157829003601f168201915b5050505050815260200160018201805462002fca9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002ff89062009045565b8015620030495780601f106200301d5761010080835404028352916020019162003049565b820191906000526020600020905b8154815290600101906020018083116200302b57829003601f168201915b50505050508152602001600282018054620030649062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620030929062009045565b8015620030e35780601f10620030b757610100808354040283529160200191620030e3565b820191906000526020600020905b815481529060010190602001808311620030c557829003601f168201915b50505050508152602001600382018054620030fe9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200312c9062009045565b80156200317d5780601f1062003151576101008083540402835291602001916200317d565b820191906000526020600020905b8154815290600101906020018083116200315f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200321c5750505050508152505090508060e0015180156200325f5750876001600160a01b0316836001600160a01b031614155b156200327e57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af1158015620032d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032fb9190620090f4565b9050603754811015620033215760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b0316148015620033b657506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200338e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b49190620090f4565b105b15620033d5576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a5483620033eb91906200915f565b620033f79190620090bb565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d80600081146200344c576040519150601f19603f3d011682016040523d82523d6000602084013e62003451565b606091505b505090508062003474576040516312171d8360e31b815260040160405180910390fd5b62003480828462009149565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af1158015620034d6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620034fd9190620090f4565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e858960405162003562939291909283526020830191909152604082015260600190565b60405180910390a4604080516002808252606082018352600092602083019080368337019050509050866040015181600081518110620035a657620035a662009179565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620035e157620035e162009179565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620036229084908c906004016200918f565b600060405180830381600087803b1580156200363d57600080fd5b505af115801562003652573d6000803e3d6000fd5b505050508a15620036c4576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200368f9291906200907b565b600060405180830381600087803b158015620036aa57600080fd5b505af1158015620036bf573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff16156200370957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200373b5760405163b1d02c3d60e01b815260040160405180910390fd5b6200374562007f00565b62003752603f8262007d5e565b620037705760405163056e881160e01b815260040160405180910390fd5b60006200377c62007f00565b6001600160a01b0381166000908152604160205260409020600c810154919250904290620037af906201518090620090de565b1115620037cf57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620038095760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b03908116908616101562003847576009820154620038419086906001600160401b0316620091bb565b62003861565b600982015462003861906001600160401b031686620091bb565b60098301546001600160401b039182169250600160801b9004168111156200389c5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b606080606060006200391b603f62008067565b90508086101562003fa457841562003934578462003936565b805b945060008562003947888462009149565b116200395f5762003959878362009149565b62003961565b855b9050806001600160401b038111156200397e576200397e620088f6565b604051908082528060200260200182016040528015620039a8578160200160208202803683370190505b509450806001600160401b03811115620039c657620039c6620088f6565b604051908082528060200260200182016040528015620039f0578160200160208202803683370190505b509350806001600160401b0381111562003a0e5762003a0e620088f6565b60405190808252806020026020018201604052801562003a4357816020015b606081526020019060019003908162003a2d5790505b50925060005b8181101562003fa157600062003a6d62003a64838b620090de565b603f9062008072565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003ada9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003b089062009045565b801562003b595780601f1062003b2d5761010080835404028352916020019162003b59565b820191906000526020600020905b81548152906001019060200180831162003b3b57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003b849062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003bb29062009045565b801562003c035780601f1062003bd75761010080835404028352916020019162003c03565b820191906000526020600020905b81548152906001019060200180831162003be557829003601f168201915b5050505050815260200160018201805462003c1e9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003c4c9062009045565b801562003c9d5780601f1062003c715761010080835404028352916020019162003c9d565b820191906000526020600020905b81548152906001019060200180831162003c7f57829003601f168201915b5050505050815260200160028201805462003cb89062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003ce69062009045565b801562003d375780601f1062003d0b5761010080835404028352916020019162003d37565b820191906000526020600020905b81548152906001019060200180831162003d1957829003601f168201915b5050505050815260200160038201805462003d529062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003d809062009045565b801562003dd15780601f1062003da55761010080835404028352916020019162003dd1565b820191906000526020600020905b81548152906001019060200180831162003db357829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162003e70575050505050815250509050806000015188848151811062003ea95762003ea962009179565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003f425780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003f16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003f3c9190620090f4565b62003f45565b60005b87848151811062003f5a5762003f5a62009179565b602002602001018181525050806080015186848151811062003f805762003f8062009179565b602002602001018190525050508062003f9990620091e5565b905062003a49565b50505b92959194509250565b60005462010000900460ff161562003fd857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200400a5760405163b1d02c3d60e01b815260040160405180910390fd5b3362004018603f8262007d5e565b156200403757604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038181166000908152604d602052604090205416156200407157604051631a0a9b9f60e21b815260040160405180910390fd5b6001600160a01b038881166000908152604360205260409020541615620040ab57604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b031660458888604051620040ca92919062009095565b908152604051908190036020019020546001600160a01b03161462004102576040516311fdb94760e01b815260040160405180910390fd5b600062004110838062009201565b6040516020016200412392919062009095565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff16156200416d5760405163c0bf414360e01b815260040160405180910390fd5b600062004183670de0b6b3a76400003462009149565b9050603654811015620041a9576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a16620041d157604051636520611b60e11b815260040160405180910390fd5b611388620041e6604087016020880162008ab0565b6001600160401b031611806200422c575062004209604086016020870162008ab0565b6001600160401b031662004221602087018762008ab0565b6001600160401b0316115b806200426b575062004245604086016020870162008ab0565b6001600160401b031662004260606087016040880162008ab0565b6001600160401b0316115b156200428a5760405163dc81db8560e01b815260040160405180910390fd5b620042d56200429a858062009201565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200808092505050565b620042f357604051635dba5ad760e01b815260040160405180910390fd5b62004302838a8a8a8a62008222565b6200432057604051631647e3cb60e11b815260040160405180910390fd5b60006200436e8462004333878062009201565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200835292505050565b90506200437d603f8562008453565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620043fd8b8d83620092a9565b5085600582016200440f828262009371565b5087905060098201620044238282620094aa565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004471908e908e9062009095565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620044f49291906200957a565b60405180910390a460408051848152602081018590526001600160a01b0387169182917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a3604051633041949b60e01b815261200590633041949b90620045ba90859089906004016200907b565b600060405180830381600087803b158015620045d557600080fd5b505af1158015620045ea573d6000803e3d6000fd5b50505050505050505050505050505050565b60408051606081018252600080825260208201819052918101919091528162004627603f8262007d5e565b620046455760405163056e881160e01b815260040160405180910390fd5b50506001600160a01b031660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915290565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060828101919091526004840180549194916080840191906200470e9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200473c9062009045565b80156200478d5780601f1062004761576101008083540402835291602001916200478d565b820191906000526020600020905b8154815290600101906020018083116200476f57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620047b89062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620047e69062009045565b8015620048375780601f106200480b5761010080835404028352916020019162004837565b820191906000526020600020905b8154815290600101906020018083116200481957829003601f168201915b50505050508152602001600182018054620048529062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620048809062009045565b8015620048d15780601f10620048a557610100808354040283529160200191620048d1565b820191906000526020600020905b815481529060010190602001808311620048b357829003601f168201915b50505050508152602001600282018054620048ec9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200491a9062009045565b80156200496b5780601f106200493f576101008083540402835291602001916200496b565b820191906000526020600020905b8154815290600101906020018083116200494d57829003601f168201915b50505050508152602001600382018054620049869062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620049b49062009045565b801562004a055780601f10620049d95761010080835404028352916020019162004a05565b820191906000526020600020905b815481529060010190602001808311620049e757829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162004aa45750505091909252505050608001519392505050565b336110011462004af557604051630f22c43960e41b8152611001600482015260240162001196565b6001600160a01b038082166000908152604360205260409020541662004b1d603f8262007d5e565b62004b3b5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004b9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004bc49190620090f4565b90506000603d544262004bd89190620090de565b905062004be6838262007e0b565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004c26939291906200910e565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004c64916001600160a01b03169088906004016200907b565b600060405180830381600087803b15801562004c7f57600080fd5b505af115801562004c94573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004cc05750600054600160ff909116105b8062004cdc5750303b15801562004cdc575060005460ff166001145b62004d415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001196565b6000805460ff19166001179055801562004d65576000805461ff0019166101001790555b33411462004d865760405163022d8c9560e31b815260040160405180910390fd5b3a1562004da6576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d60385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562278d00603e55604a5562004e217308e68ec70fa3b629784fdb28887e206ce8561e086200846a565b8015620017c1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004e9257604051630f22c43960e41b8152612000600482015260240162001196565b60405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015260640162001196565b600054630100000090046001600160a01b0316331462004efb576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004f2657604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600062004f6f603f8462007d5e565b62004f8d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa15801562004fea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620050109190620090f4565b90505b92915050565b60005462010000900460ff16156200504457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620050765760405163b1d02c3d60e01b815260040160405180910390fd5b8162005084603f8262007d5e565b620050a25760405163056e881160e01b815260040160405180910390fd5b6037543490811015620050c85760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620051309062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200515e9062009045565b8015620051af5780601f106200518357610100808354040283529160200191620051af565b820191906000526020600020905b8154815290600101906020018083116200519157829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620051da9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620052089062009045565b8015620052595780601f106200522d5761010080835404028352916020019162005259565b820191906000526020600020905b8154815290600101906020018083116200523b57829003601f168201915b50505050508152602001600182018054620052749062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620052a29062009045565b8015620052f35780601f10620052c757610100808354040283529160200191620052f3565b820191906000526020600020905b815481529060010190602001808311620052d557829003601f168201915b505050505081526020016002820180546200530e9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200533c9062009045565b80156200538d5780601f1062005361576101008083540402835291602001916200538d565b820191906000526020600020905b8154815290600101906020018083116200536f57829003601f168201915b50505050508152602001600382018054620053a89062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620053d69062009045565b8015620054275780601f10620053fb5761010080835404028352916020019162005427565b820191906000526020600020905b8154815290600101906020018083116200540957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620054c65750505050508152505090508060e001518015620055095750856001600160a01b0316826001600160a01b031614155b156200552857604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005579573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620055a09190620090f4565b9050826001600160a01b0316876001600160a01b03167f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e048387604051620055f1929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b9162005626919087906004016200907b565b600060405180830381600087803b1580156200564157600080fd5b505af115801562005656573d6000803e3d6000fd5b505050508515620017ba576040516372f6ad8f60e11b81526120059063e5ed5b1e906200568a9086908b906004016200907b565b600060405180830381600087803b158015620056a557600080fd5b505af1158015620056ba573d6000803e3d6000fd5b5050505050505050505050565b620056f36040518060800160405280606081526020016060815260200160608152602001606081525090565b8162005701603f8262007d5e565b6200571f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620057569062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620057849062009045565b8015620057d55780601f10620057a957610100808354040283529160200191620057d5565b820191906000526020600020905b815481529060010190602001808311620057b757829003601f168201915b50505050508152602001600182018054620057f09062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200581e9062009045565b80156200586f5780601f1062005843576101008083540402835291602001916200586f565b820191906000526020600020905b8154815290600101906020018083116200585157829003601f168201915b505050505081526020016002820180546200588a9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620058b89062009045565b8015620059095780601f10620058dd5761010080835404028352916020019162005909565b820191906000526020600020905b815481529060010190602001808311620058eb57829003601f168201915b50505050508152602001600382018054620059249062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620059529062009045565b8015620059a35780601f106200597757610100808354040283529160200191620059a3565b820191906000526020600020905b8154815290600101906020018083116200598557829003601f168201915b505050505081525050915050919050565b60005462010000900460ff1615620059df57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005a115760405163b1d02c3d60e01b815260040160405180910390fd5b62005a1d828262008503565b5050565b336110071462005a4957604051630f22c43960e41b8152611007600482015260240162001196565b62005ab66040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005b71576020811462005ae85783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005b2b9185858083850183828082843760009201919091525092939250506200866c9050565b90506108fc81108062005b3f575061271081115b1562005b685784848484604051630a5a604160e01b815260040162001196949392919062009590565b6035556200687b565b62005be26040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005cac576020811462005c145783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005c579185858083850183828082843760009201919091525092939250506200866c9050565b9050683635c9adc5dea0000081108062005c7a575069152d02c7e14af680000081115b1562005ca35784848484604051630a5a604160e01b815260040162001196949392919062009590565b6036556200687b565b62005d1f604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005de6576020811462005d515783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005d949185858083850183828082843760009201919091525092939250506200866c9050565b905067016345785d8a000081108062005db45750678ac7230489e8000081115b1562005ddd5784848484604051630a5a604160e01b815260040162001196949392919062009590565b6037556200687b565b62005e57604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005f0f576020811462005e895783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005ecc9185858083850183828082843760009201919091525092939250506200866c9050565b905080158062005edd57506101f481115b1562005f065784848484604051630a5a604160e01b815260040162001196949392919062009590565b6038556200687b565b62005f786040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562006035576020811462005faa5783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005fed9185858083850183828082843760009201919091525092939250506200866c9050565b90506203f48081108062006003575062278d0081115b156200602c5784848484604051630a5a604160e01b815260040162001196949392919062009590565b6039556200687b565b620060a360405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620061505760208114620060d55783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620061189185858083850183828082843760009201919091525092939250506200866c9050565b90506064811115620061475784848484604051630a5a604160e01b815260040162001196949392919062009590565b603a556200687b565b620061c060405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620062815760208114620061f25783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620062359185858083850183828082843760009201919091525092939250506200866c9050565b9050674563918244f400008110806200624f5750603c5481115b15620062785784848484604051630a5a604160e01b815260040162001196949392919062009590565b603b556200687b565b620062ef6040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620063b25760208114620063215783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620063649185858083850183828082843760009201919091525092939250506200866c9050565b905068056bc75e2d63100000811080620063805750603b548111155b15620063a95784848484604051630a5a604160e01b815260040162001196949392919062009590565b603c556200687b565b6200641f6040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620064dc5760208114620064515783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620064949185858083850183828082843760009201919091525092939250506200866c9050565b90506202a300811080620064aa5750603e548110155b15620064d35784848484604051630a5a604160e01b815260040162001196949392919062009590565b603d556200687b565b620065476040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620066045760208114620065795783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620065bc9185858083850183828082843760009201919091525092939250506200866c9050565b9050620d2f00811080620065d25750603d548111155b15620065fb5784848484604051630a5a604160e01b815260040162001196949392919062009590565b603e556200687b565b6200667e6040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b156200672a5760208114620066b05783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620066f39185858083850183828082843760009201919091525092939250506200866c9050565b905080600003620067215784848484604051630a5a604160e01b815260040162001196949392919062009590565b604a556200687b565b620067986040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620068585760148114620067ca5783838383604051630a5a604160e01b815260040162001196949392919062009590565b600062006812601484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200866c9050565b90506001600160a01b038116620068465784848484604051630a5a604160e01b815260040162001196949392919062009590565b620068518162008671565b506200687b565b838383836040516325ee20d560e21b815260040162001196949392919062009590565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051620068b2949392919062009590565b60405180910390a150505050565b60005462010000900460ff1615620068eb57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200691d5760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b038111156200693b576200693b620088f6565b60405190808252806020026020018201604052801562006965578160200160208202803683370190505b5090506000805b8381101562006a6357620069ae8787838181106200698e576200698e62009179565b9050602002016020810190620069a5919062008787565b603f9062007d5e565b620069cc5760405163056e881160e01b815260040160405180910390fd5b60416000888884818110620069e557620069e562009179565b9050602002016020810190620069fc919062008787565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006a385762006a3862009179565b6001600160a01b039092166020928302919091019091015262006a5b81620091e5565b90506200696c565b50604051634484077560e01b815261200590634484077590620028a990859088906004016200918f565b606080600062006a9e603f62008067565b90508085101562006c6257831562006ab7578362006ab9565b805b935060008462006aca878462009149565b1162006ae25762006adc868362009149565b62006ae4565b845b9050806001600160401b0381111562006b015762006b01620088f6565b60405190808252806020026020018201604052801562006b2b578160200160208202803683370190505b509350806001600160401b0381111562006b495762006b49620088f6565b60405190808252806020026020018201604052801562006b73578160200160208202803683370190505b50925060005b8181101562006c5f5762006b9262003a648289620090de565b85828151811062006ba75762006ba762009179565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006be05762006be062009179565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006c345762006c3462009179565b6001600160a01b039092166020928302919091019091015262006c5781620091e5565b905062006b79565b50505b9250925092565b336110011462006c9157604051630f22c43960e41b8152611001600482015260240162001196565b60005462010000900460ff161562006cbc57604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006ce4603f8262007d5e565b62006d025760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006d2a6201518042620090bb565b604a546000828152604b60205260409020549192501162006d5e5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006d7f908490620090de565b90915550506001600160a01b0384166000908152604460205260409020541580159062006dd457506001600160a01b038416600090815260446020526040902054429062006dd2906201518090620090de565b105b1562006df3576040516330abb81d60e21b815260040160405180910390fd5b60008062006e0385600062007d81565b915091508162006e2657604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006e79573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006e9f9190620090f4565b905062006ead858362007e0b565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006eed939291906200910e565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b916200568a916001600160a01b0316908a906004016200907b565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384938493849390929160808401919062006f9c9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462006fca9062009045565b80156200701b5780601f1062006fef576101008083540402835291602001916200701b565b820191906000526020600020905b81548152906001019060200180831162006ffd57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070469062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620070749062009045565b8015620070c55780601f106200709957610100808354040283529160200191620070c5565b820191906000526020600020905b815481529060010190602001808311620070a757829003601f168201915b50505050508152602001600182018054620070e09062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200710e9062009045565b80156200715f5780601f1062007133576101008083540402835291602001916200715f565b820191906000526020600020905b8154815290600101906020018083116200714157829003601f168201915b505050505081526020016002820180546200717a9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620071a89062009045565b8015620071f95780601f10620071cd57610100808354040283529160200191620071f9565b820191906000526020600020905b815481529060010190602001808311620071db57829003601f168201915b50505050508152602001600382018054620072149062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620072429062009045565b8015620072935780601f10620072675761010080835404028352916020019162007293565b820191906000526020600020905b8154815290600101906020018083116200727557829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620073325750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200739957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620073cb5760405163b1d02c3d60e01b815260040160405180910390fd5b620073d562007f00565b620073e2603f8262007d5e565b620074005760405163056e881160e01b815260040160405180910390fd5b60006200740c62007f00565b6001600160a01b0381166000908152604160205260409020600c8101549192509042906200743f906201518090620090de565b11156200745f57604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074709062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200749e9062009045565b8015620074ef5780601f10620074c357610100808354040283529160200191620074ef565b820191906000526020600020905b815481529060010190602001808311620074d157829003601f168201915b50505082875250859160058401915081906200750c9082620095c6565b5060208201516001820190620075239082620095c6565b50604082015160028201906200753a9082620095c6565b5060608201516003820190620075519082620095c6565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff1615620075bf57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620075f15760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007612576040516341abc80160e01b815260040160405180910390fd5b60005b8381101562007683576200767085858381811062007637576200763762009179565b90506020020160208101906200764e919062008787565b84848481811062007663576200766362009179565b9050602002013562008503565b6200767b81620091e5565b905062007615565b5050505050565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849390916080840191620076f59062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620077239062009045565b8015620077745780601f10620077485761010080835404028352916020019162007774565b820191906000526020600020905b8154815290600101906020018083116200775657829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200779f9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620077cd9062009045565b80156200781e5780601f10620077f2576101008083540402835291602001916200781e565b820191906000526020600020905b8154815290600101906020018083116200780057829003601f168201915b50505050508152602001600182018054620078399062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620078679062009045565b8015620078b85780601f106200788c57610100808354040283529160200191620078b8565b820191906000526020600020905b8154815290600101906020018083116200789a57829003601f168201915b50505050508152602001600282018054620078d39062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620079019062009045565b8015620079525780601f10620079265761010080835404028352916020019162007952565b820191906000526020600020905b8154815290600101906020018083116200793457829003601f168201915b505050505081526020016003820180546200796d9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200799b9062009045565b8015620079ec5780601f10620079c057610100808354040283529160200191620079ec565b820191906000526020600020905b815481529060010190602001808311620079ce57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162007a8b5750505091909252505050604001519392505050565b600062007ac3603f8462007d5e565b62007ae15760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd9060240162004fcc565b60005462010000900460ff161562007b5057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007b825760405163b1d02c3d60e01b815260040160405180910390fd5b62007b8c62007f00565b62007b99603f8262007d5e565b62007bb75760405163056e881160e01b815260040160405180910390fd5b600062007bc362007f00565b905062007bd4818787878762008222565b62007bf257604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007c1192919062009095565b908152604051908190036020019020546001600160a01b03161462007c49576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007c78906201518090620090de565b111562007c9857604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007cae91906200968e565b908152604051908190036020019020556004810162007ccf878983620092a9565b5042600c820155604051829060459062007ced908a908a9062009095565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007d4d908a908a906200957a565b60405180910390a250505050505050565b6001600160a01b0381166000908152600183016020526040812054151562005010565b6000806000848460405160200162007d9b9291906200970c565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007ddb5760008093509350505062007e04565b603e5462007dea9042620090de565b6000928352604c6020526040909220829055506001925090505b9250929050565b6000600162007e1b603f62008067565b62007e27919062009149565b604954108015915062007e735760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007e8857600b83018290555b600a83015460ff1662007efb57600a8301805460ff191660019081179091556049805460009062007ebb908490620090de565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b336000908152604d60205260408120546001600160a01b03161562007f3c5750336000908152604d60205260409020546001600160a01b031690565b503390565b6001600160a01b0381166000908152604160205260409020600a81015460ff161562007f6b575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa15801562007fbb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007fe19190620090f4565b101562005a1d576200800381603d544262007ffd9190620090de565b62007e0b565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200804a57600080fd5b505af11580156200805f573d6000803e3d6000fd5b505050505050565b600062005013825490565b6000620050108383620086dd565b60008082905060038151108062008098575060098151115b15620080a75750600092915050565b604181600081518110620080bf57620080bf62009179565b016020015160f81c1080620080f15750605a81600081518110620080e757620080e762009179565b016020015160f81c115b15620081005750600092915050565b60015b81518110156200821857603082828151811062008124576200812462009179565b016020015160f81c108062008155575060398282815181106200814b576200814b62009179565b016020015160f81c115b8015620081a55750604182828151811062008174576200817462009179565b016020015160f81c1080620081a55750605a8282815181106200819b576200819b62009179565b016020015160f81c115b8015620081f557506061828281518110620081c457620081c462009179565b016020015160f81c1080620081f55750607a828281518110620081eb57620081eb62009179565b016020015160f81c115b1562008205575060009392505050565b6200821081620091e5565b905062008103565b5060019392505050565b600060308414158062008236575060608214155b15620082455750600062008349565b60008686864660405160200162008260949392919062009756565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a604051602001620082ba95949392919062009783565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa6200830457600080fd5b506000816000815181106200831d576200831d62009179565b016020015160f81c9050600181146200833f5760009550505050505062008349565b6001955050505050505b95945050505050565b60008061200361dead60405162008369906200875c565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f080158015620083ac573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b8152600401620083e0929190620097bb565b6000604051808303818588803b158015620083fa57600080fd5b505af11580156200840f573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b600062005010836001600160a01b0384166200870a565b600054610100900460ff16620084d75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001196565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008511603f8262007d5e565b6200852f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008593573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620085b99190620090f4565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd3992683836040516200860191815260200190565b60405180910390a350505050565b600081604051602001620086249190620097e1565b60405160208183030381529060405280519060200120836040516020016200864d9190620097e1565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6000826000018281548110620086f757620086f762009179565b9060005260206000200154905092915050565b6000818152600183016020526040812054620087535750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562005013565b50600062005013565b610e96806200980083390190565b80356001600160a01b03811681146200878257600080fd5b919050565b6000602082840312156200879a57600080fd5b62005010826200876a565b60008083601f840112620087b857600080fd5b5081356001600160401b03811115620087d057600080fd5b60208301915083602082850101111562007e0457600080fd5b60008060208385031215620087fd57600080fd5b82356001600160401b038111156200881457600080fd5b6200882285828601620087a5565b90969095509350505050565b6000806000604084860312156200884457600080fd5b833560ff811681146200885657600080fd5b925060208401356001600160401b038111156200887257600080fd5b6200888086828701620087a5565b9497909650939450505050565b60005b83811015620088aa57818101518382015260200162008890565b50506000910152565b60008151808452620088cd8160208601602086016200888d565b601f01601f19169290920160200192915050565b602081526000620050106020830184620088b3565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620089315762008931620088f6565b60405290565b60006001600160401b0380841115620089545762008954620088f6565b604051601f8501601f19908116603f011681019082821181831017156200897f576200897f620088f6565b816040528093508581528686860111156200899957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215620089c657600080fd5b81356001600160401b03811115620089dd57600080fd5b8201601f81018413620089ef57600080fd5b62008a008482356020840162008937565b949350505050565b6000806040838503121562008a1c57600080fd5b62008a27836200876a565b946020939093013593505050565b803580151581146200878257600080fd5b6000806000806080858703121562008a5d57600080fd5b62008a68856200876a565b935062008a78602086016200876a565b92506040850135915062008a8f6060860162008a35565b905092959194509250565b6001600160401b0381168114620017c157600080fd5b60006020828403121562008ac357600080fd5b813562008ad08162008a9a565b9392505050565b6000806040838503121562008aeb57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101562008b355781516001600160a01b03168752958201959082019060010162008b0e565b509495945050505050565b60808152600062008b55608083018762008afa565b82810360208481019190915286518083528782019282019060005b8181101562008b8e5784518352938301939183019160010162008b70565b5050848103604086015286518082528282019350600581901b8201830183890160005b8381101562008be357601f1985840301875262008bd0838351620088b3565b9686019692509085019060010162008bb1565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e081121562008c1957600080fd5b62008c24896200876a565b975060208901356001600160401b038082111562008c4157600080fd5b62008c4f8c838d01620087a5565b909950975060408b013591508082111562008c6957600080fd5b62008c778c838d01620087a5565b90975095508591506060605f198401121562008c9257600080fd5b60608b01945060c08b013592508083111562008cad57600080fd5b505088016080818b03121562008cc257600080fd5b8091505092959891949750929550565b6000806040838503121562008ce657600080fd5b62008cf1836200876a565b915062008d016020840162008a35565b90509250929050565b60208152600082516080602084015262008d2860a0840182620088b3565b90506020840151601f198085840301604086015262008d488383620088b3565b9250604086015191508085840301606086015262008d678383620088b3565b9250606086015191508085840301608086015250620083498282620088b3565b6000806000806040858703121562008d9e57600080fd5b84356001600160401b038082111562008db657600080fd5b62008dc488838901620087a5565b9096509450602087013591508082111562008dde57600080fd5b5062008ded87828801620087a5565b95989497509550505050565b60008083601f84011262008e0c57600080fd5b5081356001600160401b0381111562008e2457600080fd5b6020830191508360208260051b850101111562007e0457600080fd5b60008060006040848603121562008e5657600080fd5b83356001600160401b0381111562008e6d57600080fd5b62008e7b8682870162008df9565b909450925062008e909050602085016200876a565b90509250925092565b60608152600062008eae606083018662008afa565b828103602084015262008ec2818662008afa565b915050826040830152949350505050565b600082601f83011262008ee557600080fd5b620050108383356020850162008937565b60006020828403121562008f0957600080fd5b81356001600160401b038082111562008f2157600080fd5b908301906080828603121562008f3657600080fd5b62008f406200890c565b82358281111562008f5057600080fd5b62008f5e8782860162008ed3565b82525060208301358281111562008f7457600080fd5b62008f828782860162008ed3565b60208301525060408301358281111562008f9b57600080fd5b62008fa98782860162008ed3565b60408301525060608301358281111562008fc257600080fd5b62008fd08782860162008ed3565b60608301525095945050505050565b6000806000806040858703121562008ff657600080fd5b84356001600160401b03808211156200900e57600080fd5b6200901c8883890162008df9565b909650945060208701359150808211156200903657600080fd5b5062008ded8782880162008df9565b600181811c908216806200905a57607f821691505b60208210810362001bd757634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600082620090d957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620050135762005013620090a5565b6000602082840312156200910757600080fd5b5051919050565b8381526020810183905260608101600383106200913b57634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b81810381811115620050135762005013620090a5565b8082028115828204841417620050135762005013620090a5565b634e487b7160e01b600052603260045260246000fd5b604081526000620091a4604083018562008afa565b905060018060a01b03831660208301529392505050565b6001600160401b03828116828216039080821115620091de57620091de620090a5565b5092915050565b600060018201620091fa57620091fa620090a5565b5060010190565b6000808335601e198436030181126200921957600080fd5b8301803591506001600160401b038211156200923457600080fd5b60200191503681900382131562007e0457600080fd5b601f82111562007efb57600081815260208120601f850160051c81016020861015620092735750805b601f850160051c820191505b818110156200805f578281556001016200927f565b600019600383901b1c191660019190911b1790565b6001600160401b03831115620092c357620092c3620088f6565b620092db83620092d4835462009045565b836200924a565b6000601f8411600181146200930e5760008515620092f95750838201355b62009305868262009294565b84555062007683565b600083815260209020601f19861690835b828110156200934157868501358255602094850194600190920191016200931f565b50868210156200935f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200937d828362009201565b6001600160401b03811115620093975762009397620088f6565b620093af81620093a8855462009045565b856200924a565b6000601f821160018114620093e25760008315620093cd5750838201355b620093d9848262009294565b8655506200943f565b600085815260209020601f19841690835b82811015620094155786850135825560209485019460019092019101620093f3565b5084821015620094335760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505062009452602083018362009201565b62009462818360018601620092a9565b505062009473604083018362009201565b62009483818360028601620092a9565b505062009494606083018362009201565b620094a4818360038601620092a9565b50505050565b8135620094b78162008a9a565b6001600160401b03811690508154816001600160401b031982161783556020840135620094e48162008a9a565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff19831684178117855590850135620095248162008a9a565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600062008a0060208301848662009551565b604081526000620095a660408301868862009551565b8281036020840152620095bb81858762009551565b979650505050505050565b81516001600160401b03811115620095e257620095e2620088f6565b620095fa81620095f3845462009045565b846200924a565b602080601f8311600181146200962e5760008415620096195750858301515b62009625858262009294565b8655506200805f565b600085815260208120601f198616915b828110156200965f578886015182559484019460019091019084016200963e565b50858210156200967e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200969e8162009045565b60018281168015620096b95760018114620096cf5762009700565b60ff198416875282151583028701945062009700565b8760005260208060002060005b85811015620096f75781548a820152908401908201620096dc565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200974257634e487b7160e01b600052602160045260246000fd5b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b6000865162009797818460208b016200888d565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b038316815260406020820181905260009062008a0090830184620088b3565b60008251620097f58184602087016200888d565b919091019291505056fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000a" }, "0x0000000000000000000000000000000000002003": { "balance": "0x0", - "code": "0x6080604052600436106101e75760003560e01c8063647df75911610102578063a9664feb11610095578063d241c1ea11610064578063d241c1ea1461068d578063dd62ed3e146106cf578063f1fad104146106ef578063f399e22e1461070457600080fd5b8063a9664feb14610600578063aa1966cd14610620578063aad3ec961461064d578063c2cde2b21461066d57600080fd5b806395d89b41116100d157806395d89b411461058b578063a457c2d7146105a0578063a5d059ca146105c0578063a9059cbb146105e057600080fd5b8063647df759146104e85780636bbf22491461050857806370a082311461053557806391faf0b41461056b57600080fd5b8063313ce5671161017a5780634bf6c882116101495780634bf6c8821461048b5780634d99dd16146104a05780635c19a95c146104c05780635e607d76146104d357600080fd5b8063313ce567146103f157806339509351146104135780633a5381b51461043357806345bc4d101461046b57600080fd5b806315d1f898116101b657806315d1f8981461038657806318160ddd1461039c57806323b872dd146103b15780632f2d448a146103d157600080fd5b8063038c0023146102e157806306fdde03146103145780630913db4714610336578063095ea7b31461035657600080fd5b366102dc57336120021461021757604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b60006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190611de4565b6102879042611e13565b6098546000828152609d6020908152604080832093909355609c9052908120805492935034929091906102bb908490611e35565b9250508190555034609860008282546102d49190611e35565b925050819055005b600080fd5b3480156102ed57600080fd5b506103016102fc366004611e60565b610717565b6040519081526020015b60405180910390f35b34801561032057600080fd5b50610329610747565b60405161030b9190611e84565b34801561034257600080fd5b50610301610351366004611e60565b6107d9565b34801561036257600080fd5b50610376610371366004611ed2565b6107fb565b604051901515815260200161030b565b34801561039257600080fd5b5061030160985481565b3480156103a857600080fd5b50606754610301565b3480156103bd57600080fd5b506103766103cc366004611efe565b610813565b3480156103dd57600080fd5b506103016103ec366004611e60565b610837565b3480156103fd57600080fd5b5060125b60405160ff909116815260200161030b565b34801561041f57600080fd5b5061037661042e366004611ed2565b6108fc565b34801561043f57600080fd5b50609754610453906001600160a01b031681565b6040516001600160a01b03909116815260200161030b565b34801561047757600080fd5b50610301610486366004611f3f565b61091e565b34801561049757600080fd5b50610401600881565b3480156104ac57600080fd5b506103016104bb366004611ed2565b610a11565b6103016104ce366004611e60565b610c28565b6104e66104e1366004611f58565b610c9e565b005b3480156104f457600080fd5b50610301610503366004611f3f565b610e11565b34801561051457600080fd5b50610301610523366004611f3f565b609d6020526000908152604090205481565b34801561054157600080fd5b50610301610550366004611e60565b6001600160a01b031660009081526065602052604090205490565b34801561057757600080fd5b50610301610586366004611f3f565b610e50565b34801561059757600080fd5b50610329610e8b565b3480156105ac57600080fd5b506103766105bb366004611ed2565b610e9a565b3480156105cc57600080fd5b506103016105db366004611ed2565b610f15565b3480156105ec57600080fd5b506103766105fb366004611ed2565b611016565b34801561060c57600080fd5b5061030161061b366004611ed2565b611024565b34801561062c57600080fd5b5061030161063b366004611f3f565b609c6020526000908152604090205481565b34801561065957600080fd5b50610301610668366004611ed2565b61114d565b34801561067957600080fd5b50610301610688366004611e60565b6113f0565b34801561069957600080fd5b506106ad6106a8366004611ed2565b61140e565b604080518251815260208084015190820152918101519082015260600161030b565b3480156106db57600080fd5b506103016106ea366004611f82565b611491565b3480156106fb57600080fd5b50610401601181565b6104e6610712366004611fbb565b6114bc565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b035b92915050565b60606068805461075690612040565b80601f016020809104026020016040519081016040528092919081815260200182805461078290612040565b80156107cf5780601f106107a4576101008083540402835291602001916107cf565b820191906000526020600020905b8154815290600101906020018083116107b257829003601f168201915b5050505050905090565b6001600160a01b03811660009081526065602052604081205461074190610e50565b600033610809818585611672565b5060019392505050565b60003361082185828561168b565b61082c8585856116ff565b506001949350505050565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b0381805b828110156108f4576001600160a01b0385166000908152609a6020526040812061088d9083611718565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042106108da576108d384612074565b93506108e1565b50506108f4565b5050806108ed90612074565b9050610863565b509392505050565b60003361080981858561090f8383611491565b6109199190611e35565b611672565b6000336120021461094657604051630f22c43960e41b8152612002600482015260240161020e565b6097546001600160a01b03166000908152606560205260408120549061096b84610e11565b905081811161097a578061097c565b815b609754909150600090610998906001600160a01b031683611789565b6040519091506000906110029083908381818185875af1925050503d80600081146109df576040519150601f19603f3d011682016040523d82523d6000602084013e6109e4565b606091505b5050905080610a06576040516312171d8360e31b815260040160405180910390fd5b50925050505b919050565b60003361200214610a3957604051630f22c43960e41b8152612002600482015260240161020e565b81600003610a5a57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610a9357604051631e9acf1760e31b815260040160405180910390fd5b610a9d8383611789565b905060006120026001600160a01b031663fc0c5ff16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190611de4565b610b0f9042611e35565b6040805160608101825285815260208101859052908101829052909150600085610b38816117be565b60405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160408051601f1981840301815291815281516020928301206000818152609990935291205490915015610ba35760405163b19e911560e01b815260040160405180910390fd5b600081815260996020908152604080832085518155828601516001820155818601516002909101556001600160a01b0389168352609a9091529020610c1f90828154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b50505092915050565b60003361200214610c5057604051630f22c43960e41b8152612002600482015260240161020e565b34600003610c7157604051631f2a200560e01b815260040160405180910390fd5b610c7b82346117e6565b905080600003610a0c57604051639811e0c760e01b815260040160405180910390fd5b3361200214610cc457604051630f22c43960e41b8152612002600482015260240161020e565b346000612710610cde67ffffffffffffffff85168461208d565b610ce89190611e13565b90506000610cf682846120a4565b905060006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5e9190611de4565b610d689042611e13565b6098546000828152609d6020908152604080832093909355609c905290812080549293508492909190610d9c908490611e35565b925050819055508160986000828254610db59190611e35565b9091555050609754610dd0906001600160a01b0316846117e6565b5060408051838152602081018590527ffb0e1482d62102ab9594f69d4c6d693749e3e2bf1c21af272f5456b2d5a4f6b5910160405180910390a15050505050565b6000609854600003610e36576040516307b76ce760e51b815260040160405180910390fd5b609854606754610e46908461208d565b6107419190611e13565b6000610e5b60675490565b600003610e7b57604051632fe8dae960e01b815260040160405180910390fd5b606754609854610e46908461208d565b60606069805461075690612040565b60003381610ea88286611491565b905083811015610f085760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161020e565b61082c8286868403611672565b60003361200214610f3d57604051630f22c43960e41b8152612002600482015260240161020e565b81600003610f5e57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610f9757604051631e9acf1760e31b815260040160405180910390fd5b610fa18383611789565b6040519091506000906120029083908381818185875af1925050503d8060008114610fe8576040519150601f19603f3d011682016040523d82523d6000602084013e610fed565b606091505b505090508061100f576040516312171d8360e31b815260040160405180910390fd5b5092915050565b6000336108098185856116ff565b6001600160a01b0382166000908152609a6020526040812054600f81810b600160801b909204900b0360000361105c57506000610741565b81158061109057506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b61109a57816110c4565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b91506000805b838110156108f4576001600160a01b0385166000908152609a602052604081206110f49083611718565b600081815260996020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252919250906111389085611e35565b935050508061114690612074565b90506110ca565b6000336120021461117557604051630f22c43960e41b8152612002600482015260240161020e565b61117d61180f565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b036000036111c65760405163ad41893760e01b815260040160405180910390fd5b8115806111fa57506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b611204578161122e565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b915060005b82156112e4576001600160a01b0384166000908152609a6020526040812061125a90611868565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042101561129f5750506112e4565b6001600160a01b0386166000908152609a602052604090206112c0906118bc565b5060208101516112d09084611e35565b92506112db856120b7565b94505050611233565b80600003611305576040516303cd8e0960e21b815260040160405180910390fd5b60006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b9190611de4565b90506000856001600160a01b03168284604051600060405180830381858888f193505050503d80600081146113bc576040519150601f19603f3d011682016040523d82523d6000602084013e6113c1565b606091505b50509050806113e3576040516312171d8360e31b815260040160405180910390fd5b5050600180559050610741565b6001600160a01b0381166000908152609b6020526040812054610741565b61143260405180606001604052806000815260200160008152602001600081525090565b6001600160a01b0383166000908152609a602052604081206114549084611718565b6000908152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810191909152949350505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b600054610100900460ff16158080156114dc5750600054600160ff909116105b806114f65750303b1580156114f6575060005460ff166001145b6115595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161020e565b6000805460ff19166001179055801561157c576000805461ff0019166101001790555b33612002146115a257604051630f22c43960e41b8152612002600482015260240161020e565b600083836040516020016115b79291906120ce565b6040516020818303038152906040529050600084846040516020016115dd9291906120fe565b60405160208183030381529060405290506115f88282611941565b611600611986565b609780546001600160a01b0319166001600160a01b038816179055611624346119ad565b5050801561166c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051632028747160e01b815260040160405180910390fd5b60006116978484611491565b9050600019811461166c57818110156116f25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161020e565b61166c8484848403611672565b604051638cd22d1960e01b815260040160405180910390fd5b60008061173b61172784611b1d565b85546117369190600f0b61211c565b611b8b565b8454909150600160801b9004600f90810b9082900b1261176e57604051632d0483c560e21b815260040160405180910390fd5b600f0b60009081526001939093016020525050604090205490565b600061179482610e50565b90506117a08383611bef565b80609860008282546117b291906120a4565b90915550909392505050565b6001600160a01b0381166000908152609b602052604090208054600181018255905b50919050565b60006117f182610e11565b90506117fd8382611d23565b81609860008282546117b29190611e35565b6002600154036118615760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161020e565b6002600155565b60006118838254600f81810b600160801b909204900b131590565b156118a157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b60009081526001909101602052604090205490565b60006118d78254600f81810b600160801b909204900b131590565b156118f557604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60018055565b600054610100900460ff166119685760405162461bcd60e51b815260040161020e90612144565b606861197483826121f3565b50606961198182826121f3565b505050565b600054610100900460ff1661193b5760405162461bcd60e51b815260040161020e90612144565b600054610100900460ff166119d45760405162461bcd60e51b815260040161020e90612144565b60006120026001600160a01b0316638a4d3fa86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3a9190611de4565b90508082111580611a5457506097546001600160a01b0316155b80611a60575060675415155b15611a7e57604051632163e6b960e21b815260040160405180910390fd5b60006120026001600160a01b0316634e6fd6c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae491906122b3565b9050611af08183611d23565b6000611afc83856120a4565b609754909150611b15906001600160a01b031682611d23565b505050609855565b60006001600160ff1b03821115611b875760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161020e565b5090565b80600f81900b8114610a0c5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b606482015260840161020e565b6001600160a01b038216611c4f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161020e565b6001600160a01b03821660009081526065602052604090205481811015611cc35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161020e565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b038216611d795760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161020e565b8060676000828254611d8b9190611e35565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208284031215611df657600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611e3057634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561074157610741611dfd565b6001600160a01b0381168114611e5d57600080fd5b50565b600060208284031215611e7257600080fd5b8135611e7d81611e48565b9392505050565b600060208083528351808285015260005b81811015611eb157858101830151858201604001528201611e95565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215611ee557600080fd5b8235611ef081611e48565b946020939093013593505050565b600080600060608486031215611f1357600080fd5b8335611f1e81611e48565b92506020840135611f2e81611e48565b929592945050506040919091013590565b600060208284031215611f5157600080fd5b5035919050565b600060208284031215611f6a57600080fd5b813567ffffffffffffffff81168114611e7d57600080fd5b60008060408385031215611f9557600080fd5b8235611fa081611e48565b91506020830135611fb081611e48565b809150509250929050565b600080600060408486031215611fd057600080fd5b8335611fdb81611e48565b9250602084013567ffffffffffffffff80821115611ff857600080fd5b818601915086601f83011261200c57600080fd5b81358181111561201b57600080fd5b87602082850101111561202d57600080fd5b6020830194508093505050509250925092565b600181811c9082168061205457607f821691505b6020821081036117e057634e487b7160e01b600052602260045260246000fd5b60006001820161208657612086611dfd565b5060010190565b808202811582820484141761074157610741611dfd565b8181038181111561074157610741611dfd565b6000816120c6576120c6611dfd565b506000190190565b65029ba30b5b2960d51b815281836006830137660810dc99591a5d60ca1b91016006810191909152600d01919050565b611cdd60f21b81528183600283013760009101600201908152919050565b808201828112600083128015821682158216171561213c5761213c611dfd565b505092915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561198157600081815260208120601f850160051c810160208610156121cc5750805b601f850160051c820191505b818110156121eb578281556001016121d8565b505050505050565b815167ffffffffffffffff81111561220d5761220d61218f565b6122218161221b8454612040565b846121a5565b602080601f831160018114612256576000841561223e5750858301515b600019600386901b1c1916600185901b1785556121eb565b600085815260208120601f198616915b8281101561228557888601518255948401946001909101908401612266565b50858210156122a35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156122c557600080fd5b8151611e7d81611e4856fea164736f6c6343000811000a" + "code": "0x6080604052600436106101d15760003560e01c8063647df759116100f7578063a9059cbb11610095578063c2cde2b211610064578063c2cde2b21461063c578063d241c1ea1461065c578063dd62ed3e1461069e578063f399e22e146106be57600080fd5b8063a9059cbb146105af578063a9664feb146105cf578063aa1966cd146105ef578063aad3ec961461061c57600080fd5b806391faf0b4116100d157806391faf0b41461053a57806395d89b411461055a578063a457c2d71461056f578063a5d059ca1461058f57600080fd5b8063647df759146104b75780636bbf2249146104d757806370a082311461050457600080fd5b80632f2d448a1161016f57806345bc4d101161013e57806345bc4d101461044f5780634d99dd161461046f5780635c19a95c1461048f5780635e607d76146104a257600080fd5b80632f2d448a146103bb578063313ce567146103db57806339509351146103f75780633a5381b51461041757600080fd5b8063095ea7b3116101ab578063095ea7b31461034057806315d1f8981461037057806318160ddd1461038657806323b872dd1461039b57600080fd5b8063038c0023146102cb57806306fdde03146102fe5780630913db471461032057600080fd5b366102c657336120021461020157604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b60006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102679190611d9e565b6102719042611dcd565b6098546000828152609d6020908152604080832093909355609c9052908120805492935034929091906102a5908490611def565b9250508190555034609860008282546102be9190611def565b925050819055005b600080fd5b3480156102d757600080fd5b506102eb6102e6366004611e1a565b6106d1565b6040519081526020015b60405180910390f35b34801561030a57600080fd5b50610313610701565b6040516102f59190611e3e565b34801561032c57600080fd5b506102eb61033b366004611e1a565b610793565b34801561034c57600080fd5b5061036061035b366004611e8c565b6107b5565b60405190151581526020016102f5565b34801561037c57600080fd5b506102eb60985481565b34801561039257600080fd5b506067546102eb565b3480156103a757600080fd5b506103606103b6366004611eb8565b6107cd565b3480156103c757600080fd5b506102eb6103d6366004611e1a565b6107f1565b3480156103e757600080fd5b50604051601281526020016102f5565b34801561040357600080fd5b50610360610412366004611e8c565b6108b6565b34801561042357600080fd5b50609754610437906001600160a01b031681565b6040516001600160a01b0390911681526020016102f5565b34801561045b57600080fd5b506102eb61046a366004611ef9565b6108d8565b34801561047b57600080fd5b506102eb61048a366004611e8c565b6109cb565b6102eb61049d366004611e1a565b610be2565b6104b56104b0366004611f12565b610c58565b005b3480156104c357600080fd5b506102eb6104d2366004611ef9565b610dcb565b3480156104e357600080fd5b506102eb6104f2366004611ef9565b609d6020526000908152604090205481565b34801561051057600080fd5b506102eb61051f366004611e1a565b6001600160a01b031660009081526065602052604090205490565b34801561054657600080fd5b506102eb610555366004611ef9565b610e0a565b34801561056657600080fd5b50610313610e45565b34801561057b57600080fd5b5061036061058a366004611e8c565b610e54565b34801561059b57600080fd5b506102eb6105aa366004611e8c565b610ecf565b3480156105bb57600080fd5b506103606105ca366004611e8c565b610fd0565b3480156105db57600080fd5b506102eb6105ea366004611e8c565b610fde565b3480156105fb57600080fd5b506102eb61060a366004611ef9565b609c6020526000908152604090205481565b34801561062857600080fd5b506102eb610637366004611e8c565b611107565b34801561064857600080fd5b506102eb610657366004611e1a565b6113aa565b34801561066857600080fd5b5061067c610677366004611e8c565b6113c8565b60408051825181526020808401519082015291810151908201526060016102f5565b3480156106aa57600080fd5b506102eb6106b9366004611f3c565b61144b565b6104b56106cc366004611f75565b611476565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b035b92915050565b60606068805461071090611ffa565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90611ffa565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b5050505050905090565b6001600160a01b0381166000908152606560205260408120546106fb90610e0a565b6000336107c381858561162c565b5060019392505050565b6000336107db858285611645565b6107e68585856116b9565b506001949350505050565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b0381805b828110156108ae576001600160a01b0385166000908152609a6020526040812061084790836116d2565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042106108945761088d8461202e565b935061089b565b50506108ae565b5050806108a79061202e565b905061081d565b509392505050565b6000336107c38185856108c9838361144b565b6108d39190611def565b61162c565b6000336120021461090057604051630f22c43960e41b815261200260048201526024016101f8565b6097546001600160a01b03166000908152606560205260408120549061092584610dcb565b90508181116109345780610936565b815b609754909150600090610952906001600160a01b031683611743565b6040519091506000906110029083908381818185875af1925050503d8060008114610999576040519150601f19603f3d011682016040523d82523d6000602084013e61099e565b606091505b50509050806109c0576040516312171d8360e31b815260040160405180910390fd5b50925050505b919050565b600033612002146109f357604051630f22c43960e41b815261200260048201526024016101f8565b81600003610a1457604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610a4d57604051631e9acf1760e31b815260040160405180910390fd5b610a578383611743565b905060006120026001600160a01b031663fc0c5ff16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abf9190611d9e565b610ac99042611def565b6040805160608101825285815260208101859052908101829052909150600085610af281611778565b60405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160408051601f1981840301815291815281516020928301206000818152609990935291205490915015610b5d5760405163b19e911560e01b815260040160405180910390fd5b600081815260996020908152604080832085518155828601516001820155818601516002909101556001600160a01b0389168352609a9091529020610bd990828154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b50505092915050565b60003361200214610c0a57604051630f22c43960e41b815261200260048201526024016101f8565b34600003610c2b57604051631f2a200560e01b815260040160405180910390fd5b610c3582346117a0565b9050806000036109c657604051639811e0c760e01b815260040160405180910390fd5b3361200214610c7e57604051630f22c43960e41b815261200260048201526024016101f8565b346000612710610c9867ffffffffffffffff851684612047565b610ca29190611dcd565b90506000610cb0828461205e565b905060006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d189190611d9e565b610d229042611dcd565b6098546000828152609d6020908152604080832093909355609c905290812080549293508492909190610d56908490611def565b925050819055508160986000828254610d6f9190611def565b9091555050609754610d8a906001600160a01b0316846117a0565b5060408051838152602081018590527ffb0e1482d62102ab9594f69d4c6d693749e3e2bf1c21af272f5456b2d5a4f6b5910160405180910390a15050505050565b6000609854600003610df0576040516307b76ce760e51b815260040160405180910390fd5b609854606754610e009084612047565b6106fb9190611dcd565b6000610e1560675490565b600003610e3557604051632fe8dae960e01b815260040160405180910390fd5b606754609854610e009084612047565b60606069805461071090611ffa565b60003381610e62828661144b565b905083811015610ec25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016101f8565b6107e6828686840361162c565b60003361200214610ef757604051630f22c43960e41b815261200260048201526024016101f8565b81600003610f1857604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610f5157604051631e9acf1760e31b815260040160405180910390fd5b610f5b8383611743565b6040519091506000906120029083908381818185875af1925050503d8060008114610fa2576040519150601f19603f3d011682016040523d82523d6000602084013e610fa7565b606091505b5050905080610fc9576040516312171d8360e31b815260040160405180910390fd5b5092915050565b6000336107c38185856116b9565b6001600160a01b0382166000908152609a6020526040812054600f81810b600160801b909204900b03600003611016575060006106fb565b81158061104a57506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b611054578161107e565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b91506000805b838110156108ae576001600160a01b0385166000908152609a602052604081206110ae90836116d2565b600081815260996020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252919250906110f29085611def565b93505050806111009061202e565b9050611084565b6000336120021461112f57604051630f22c43960e41b815261200260048201526024016101f8565b6111376117c9565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b036000036111805760405163ad41893760e01b815260040160405180910390fd5b8115806111b457506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b6111be57816111e8565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b915060005b821561129e576001600160a01b0384166000908152609a6020526040812061121490611822565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042101561125957505061129e565b6001600160a01b0386166000908152609a6020526040902061127a90611876565b50602081015161128a9084611def565b925061129585612071565b945050506111ed565b806000036112bf576040516303cd8e0960e21b815260040160405180910390fd5b60006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113259190611d9e565b90506000856001600160a01b03168284604051600060405180830381858888f193505050503d8060008114611376576040519150601f19603f3d011682016040523d82523d6000602084013e61137b565b606091505b505090508061139d576040516312171d8360e31b815260040160405180910390fd5b50506001805590506106fb565b6001600160a01b0381166000908152609b60205260408120546106fb565b6113ec60405180606001604052806000815260200160008152602001600081525090565b6001600160a01b0383166000908152609a6020526040812061140e90846116d2565b6000908152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810191909152949350505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b600054610100900460ff16158080156114965750600054600160ff909116105b806114b05750303b1580156114b0575060005460ff166001145b6115135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f8565b6000805460ff191660011790558015611536576000805461ff0019166101001790555b336120021461155c57604051630f22c43960e41b815261200260048201526024016101f8565b60008383604051602001611571929190612088565b6040516020818303038152906040529050600084846040516020016115979291906120b8565b60405160208183030381529060405290506115b282826118fb565b6115ba611940565b609780546001600160a01b0319166001600160a01b0388161790556115de34611967565b50508015611626576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051632028747160e01b815260040160405180910390fd5b6000611651848461144b565b9050600019811461162657818110156116ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016101f8565b611626848484840361162c565b604051638cd22d1960e01b815260040160405180910390fd5b6000806116f56116e184611ad7565b85546116f09190600f0b6120d6565b611b45565b8454909150600160801b9004600f90810b9082900b1261172857604051632d0483c560e21b815260040160405180910390fd5b600f0b60009081526001939093016020525050604090205490565b600061174e82610e0a565b905061175a8383611ba9565b806098600082825461176c919061205e565b90915550909392505050565b6001600160a01b0381166000908152609b602052604090208054600181018255905b50919050565b60006117ab82610dcb565b90506117b78382611cdd565b816098600082825461176c9190611def565b60026001540361181b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f8565b6002600155565b600061183d8254600f81810b600160801b909204900b131590565b1561185b57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b60009081526001909101602052604090205490565b60006118918254600f81810b600160801b909204900b131590565b156118af57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60018055565b600054610100900460ff166119225760405162461bcd60e51b81526004016101f8906120fe565b606861192e83826121ad565b50606961193b82826121ad565b505050565b600054610100900460ff166118f55760405162461bcd60e51b81526004016101f8906120fe565b600054610100900460ff1661198e5760405162461bcd60e51b81526004016101f8906120fe565b60006120026001600160a01b0316638a4d3fa86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190611d9e565b90508082111580611a0e57506097546001600160a01b0316155b80611a1a575060675415155b15611a3857604051632163e6b960e21b815260040160405180910390fd5b60006120026001600160a01b0316634e6fd6c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e919061226d565b9050611aaa8183611cdd565b6000611ab6838561205e565b609754909150611acf906001600160a01b031682611cdd565b505050609855565b60006001600160ff1b03821115611b415760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016101f8565b5090565b80600f81900b81146109c65760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016101f8565b6001600160a01b038216611c095760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016101f8565b6001600160a01b03821660009081526065602052604090205481811015611c7d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016101f8565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b038216611d335760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101f8565b8060676000828254611d459190611def565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208284031215611db057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611dea57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156106fb576106fb611db7565b6001600160a01b0381168114611e1757600080fd5b50565b600060208284031215611e2c57600080fd5b8135611e3781611e02565b9392505050565b600060208083528351808285015260005b81811015611e6b57858101830151858201604001528201611e4f565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215611e9f57600080fd5b8235611eaa81611e02565b946020939093013593505050565b600080600060608486031215611ecd57600080fd5b8335611ed881611e02565b92506020840135611ee881611e02565b929592945050506040919091013590565b600060208284031215611f0b57600080fd5b5035919050565b600060208284031215611f2457600080fd5b813567ffffffffffffffff81168114611e3757600080fd5b60008060408385031215611f4f57600080fd5b8235611f5a81611e02565b91506020830135611f6a81611e02565b809150509250929050565b600080600060408486031215611f8a57600080fd5b8335611f9581611e02565b9250602084013567ffffffffffffffff80821115611fb257600080fd5b818601915086601f830112611fc657600080fd5b813581811115611fd557600080fd5b876020828501011115611fe757600080fd5b6020830194508093505050509250925092565b600181811c9082168061200e57607f821691505b60208210810361179a57634e487b7160e01b600052602260045260246000fd5b60006001820161204057612040611db7565b5060010190565b80820281158282048414176106fb576106fb611db7565b818103818111156106fb576106fb611db7565b60008161208057612080611db7565b506000190190565b65029ba30b5b2960d51b815281836006830137660810dc99591a5d60ca1b91016006810191909152600d01919050565b611cdd60f21b81528183600283013760009101600201908152919050565b80820182811260008312801582168215821617156120f6576120f6611db7565b505092915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561193b57600081815260208120601f850160051c810160208610156121865750805b601f850160051c820191505b818110156121a557828155600101612192565b505050505050565b815167ffffffffffffffff8111156121c7576121c7612149565b6121db816121d58454611ffa565b8461215f565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b1785556121a5565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561227f57600080fd5b8151611e3781611e0256fea164736f6c6343000811000a" }, "0x0000000000000000000000000000000000002004": { "balance": "0x0", - "code": "0x6080604052600436106103f35760003560e01c80637b3c71d311610208578063c28bc2fa11610118578063e23a9a52116100ab578063f1fad1041161007a578063f1fad10414610e46578063f23a6e6114610e5b578063f8ce560a14610e87578063fc0c546a14610ea7578063fe0d94c114610ec857600080fd5b8063e23a9a5214610d1b578063ea0217cf14610de6578063eb9019d414610e06578063ece40cc114610e2657600080fd5b8063da95691a116100e7578063da95691a14610c61578063dd4e2ba514610c81578063ddf0b00914610cc7578063deaaa7cc14610ce757600080fd5b8063c28bc2fa14610bef578063c59057e414610c02578063d07f91e914610c22578063d33219b414610c4257600080fd5b8063a7713a701161019b578063b187bd261161016a578063b187bd2614610b55578063b58131b014610b73578063bc197c8114610b88578063c01f9e3714610bb4578063c170ec0b14610bd457600080fd5b8063a7713a7014610ae0578063a890c91014610af5578063ab58fb8e14610b15578063ac43175114610b3557600080fd5b806384b0196e116101d757806384b0196e14610a5857806391ddadf414610a8057806397c3d33414610aac5780639a802a6d14610ac057600080fd5b80637b3c71d3146109ee5780637d5e81e214610a0e5780638129fc1c14610a2e5780638456cb5914610a4357600080fd5b80633932abb1116103035780634a49ac4c1161029657806354fd4d501161026557806354fd4d5014610944578063567813881461096e5780635f398a141461098e57806360c4247f146109ae57806370b0f660146109ce57600080fd5b80634a49ac4c146108b75780634bf5d7e9146108d75780634bf6c882146108ec578063533ddd141461091357600080fd5b8063417c73a7116102d2578063417c73a7146107fc578063438596321461081c578063452115d6146108675780634838d1651461088757600080fd5b80633932abb1146107795780633bccf4fd1461078f5780633e4f49e6146107af57806340e58ee5146107dc57600080fd5b8063150b7a02116103865780632656227d116103555780632656227d146106a25780632d63f693146106b55780632fe3e261146106ec578063328dd9821461072057806332b8113e1461075057600080fd5b8063150b7a02146105fb578063160cbed71461063f57806317977c611461065f57806324bc1a641461068d57600080fd5b8063046f7da2116103c2578063046f7da21461054e57806306f3f9e61461056357806306fdde0314610583578063143489d0146105a557600080fd5b8063013cf08b1461046357806301ffc9a7146104de57806302a251a31461050e578063034201811461052e57600080fd5b3661045e5730610401610edb565b6001600160a01b03161461045c5760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a206d7573742073656e6420746f206578656375746f720060448201526064015b60405180910390fd5b005b600080fd5b34801561046f57600080fd5b5061048361047e366004615c8b565b610ef5565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b3480156104ea57600080fd5b506104fe6104f9366004615ca4565b610fb0565b60405190151581526020016104d5565b34801561051a57600080fd5b50610195545b6040519081526020016104d5565b34801561053a57600080fd5b50610520610549366004615dea565b610fc1565b34801561055a57600080fd5b5061045c6110b9565b34801561056f57600080fd5b5061045c61057e366004615c8b565b611149565b34801561058f57600080fd5b506105986111d4565b6040516104d59190615ee0565b3480156105b157600080fd5b506105e36105c0366004615c8b565b60009081526101636020526040902054600160401b90046001600160a01b031690565b6040516001600160a01b0390911681526020016104d5565b34801561060757600080fd5b50610626610616366004615f08565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016104d5565b34801561064b57600080fd5b5061052061065a3660046160df565b611267565b34801561066b57600080fd5b5061052061067a36600461616e565b6102c36020526000908152604090205481565b34801561069957600080fd5b50610520611352565b6105206106b03660046160df565b611378565b3480156106c157600080fd5b506105206106d0366004615c8b565b600090815261016360205260409020546001600160401b031690565b3480156106f857600080fd5b506105207fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561072c57600080fd5b5061074061073b366004615c8b565b61146b565b6040516104d59493929190616254565b34801561075c57600080fd5b5061028f546040516001600160401b0390911681526020016104d5565b34801561078557600080fd5b5061019454610520565b34801561079b57600080fd5b506105206107aa3660046162a1565b6116fd565b3480156107bb57600080fd5b506107cf6107ca366004615c8b565b611773565b6040516104d59190616305565b3480156107e857600080fd5b5061045c6107f7366004615c8b565b61177e565b34801561080857600080fd5b5061045c61081736600461616e565b6117a9565b34801561082857600080fd5b506104fe61083736600461632d565b60008281526101c6602090815260408083206001600160a01b038516845260080190915290205460ff1692915050565b34801561087357600080fd5b506105206108823660046160df565b61182a565b34801561089357600080fd5b506104fe6108a236600461616e565b60016020526000908152604090205460ff1681565b3480156108c357600080fd5b5061045c6108d236600461616e565b611838565b3480156108e357600080fd5b506105986118b3565b3480156108f857600080fd5b50610901600881565b60405160ff90911681526020016104d5565b34801561091f57600080fd5b506104fe61092e36600461616e565b6102c16020526000908152604090205460ff1681565b34801561095057600080fd5b506040805180820190915260018152603160f81b6020820152610598565b34801561097a57600080fd5b5061052061098936600461635d565b611960565b34801561099a57600080fd5b506105206109a9366004616389565b611989565b3480156109ba57600080fd5b506105206109c9366004615c8b565b6119d3565b3480156109da57600080fd5b5061045c6109e9366004615c8b565b611a88565b3480156109fa57600080fd5b50610520610a0936600461640c565b611b10565b348015610a1a57600080fd5b50610520610a29366004616465565b611b62565b348015610a3a57600080fd5b5061045c611c7d565b348015610a4f57600080fd5b5061045c611eaf565b348015610a6457600080fd5b50610a6d611f45565b6040516104d59796959493929190616505565b348015610a8c57600080fd5b50610a95611fe3565b60405165ffffffffffff90911681526020016104d5565b348015610ab857600080fd5b506064610520565b348015610acc57600080fd5b50610520610adb366004616567565b612057565b348015610aec57600080fd5b5061052061206e565b348015610b0157600080fd5b5061045c610b1036600461616e565b61209b565b348015610b2157600080fd5b50610520610b30366004615c8b565b612123565b348015610b4157600080fd5b5061045c610b503660046165bf565b6121bf565b348015610b6157600080fd5b5060005462010000900460ff166104fe565b348015610b7f57600080fd5b50610520612904565b348015610b9457600080fd5b50610626610ba336600461661e565b63bc197c8160e01b95945050505050565b348015610bc057600080fd5b50610520610bcf366004615c8b565b612910565b348015610be057600080fd5b506102c2546104fe9060ff1681565b61045c610bfd3660046166b1565b61291b565b348015610c0e57600080fd5b50610520610c1d3660046160df565b612a2b565b348015610c2e57600080fd5b5061045c610c3d3660046166f4565b612a65565b348015610c4e57600080fd5b5061022b546001600160a01b03166105e3565b348015610c6d57600080fd5b50610520610c7c36600461671d565b612aed565b348015610c8d57600080fd5b5060408051808201909152601a81527f737570706f72743d627261766f2671756f72756d3d627261766f0000000000006020820152610598565b348015610cd357600080fd5b5061045c610ce2366004615c8b565b612b74565b348015610cf357600080fd5b506105207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610d2757600080fd5b50610db6610d3636600461632d565b60408051606081018252600080825260208201819052918101919091525060009182526101c6602090815260408084206001600160a01b0393909316845260089092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b0316908201526060016104d5565b348015610df257600080fd5b5061045c610e01366004615c8b565b612b97565b348015610e1257600080fd5b50610520610e213660046167be565b612c1f565b348015610e3257600080fd5b5061045c610e41366004615c8b565b612c40565b348015610e5257600080fd5b50610901601181565b348015610e6757600080fd5b50610626610e763660046167ea565b63f23a6e6160e01b95945050505050565b348015610e9357600080fd5b50610520610ea2366004615c8b565b612cc8565b348015610eb357600080fd5b506101f8546105e3906001600160a01b031681565b61045c610ed6366004615c8b565b612d57565b6000610ef061022b546001600160a01b031690565b905090565b8060008080808080808080610f098a612123565b60008c815261016360205260409020549098506001600160401b03169650610f308b612910565b60008c81526101c66020526040812080546005820154600683015460078401546001600160a01b039093169e50949a509850929650919450610f718d611773565b90506002816007811115610f8757610f876162ef565b1493506007816007811115610f9e57610f9e6162ef565b14925050509193959799509193959799565b6000610fbb82612d7a565b92915050565b60008061106561105d7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610ffd929190616852565b60405180910390208b80519060200120604051602001611042959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120612d9f565b868686612dcc565b90506110ab8a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d9250612dea915050565b9a9950505050505050505050565b600054630100000090046001600160a01b031633146110eb576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1661111457604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b611151610edb565b6001600160a01b0316336001600160a01b0316146111815760405162461bcd60e51b815260040161045390616862565b3061118a610edb565b6001600160a01b0316146111c857600080366040516111aa929190616852565b604051809103902090505b806111c1610164612e53565b036111b557505b6111d181612ed2565b50565b606061016280546111e490616899565b80601f016020809104026020016040519081016040528092919081815260200182805461121090616899565b801561125d5780601f106112325761010080835404028352916020019161125d565b820191906000526020600020905b81548152906001019060200180831161124057829003601f168201915b5050505050905090565b6000805462010000900460ff161561129257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156112c35760405163b1d02c3d60e01b815260040160405180910390fd5b60005b855181101561133c576102c160008783815181106112e6576112e66168d3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1661132a57604051630b094f2760e31b815260040160405180910390fd5b80611334816168ff565b9150506112c6565b5061134985858585613043565b95945050505050565b6000610ef06001611361611fe3565b61136b9190616918565b65ffffffffffff16612cc8565b60008061138786868686612a2b565b9050600061139482611773565b905060048160078111156113aa576113aa6162ef565b14806113c7575060058160078111156113c5576113c56162ef565b145b6113e35760405162461bcd60e51b81526004016104539061693e565b6000828152610163602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906114329084815260200190565b60405180910390a16114478288888888613248565b61145482888888886132e9565b61146182888888886133cb565b5095945050505050565b60608060608060006101c66000878152602001908152602001600020905080600101816002018260030183600401838054806020026020016040519081016040528092919081815260200182805480156114ee57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114d0575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561154057602002820191906000526020600020905b81548152602001906001019080831161152c575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561161457838290600052602060002001805461158790616899565b80601f01602080910402602001604051908101604052809291908181526020018280546115b390616899565b80156116005780601f106115d557610100808354040283529160200191611600565b820191906000526020600020905b8154815290600101906020018083116115e357829003601f168201915b505050505081526020019060010190611568565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156116e757838290600052602060002001805461165a90616899565b80601f016020809104026020016040519081016040528092919081815260200182805461168690616899565b80156116d35780601f106116a8576101008083540402835291602001916116d3565b820191906000526020600020905b8154815290600101906020018083116116b657829003601f168201915b50505050508152602001906001019061163b565b5050505090509450945094509450509193509193565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff85166060820152600090819061174b9061105d90608001611042565b905061176887828860405180602001604052806000815250613406565b979650505050505050565b6000610fbb82613429565b60008060008061178d85613576565b93509350935093506117a18484848461182a565b505050505050565b600054630100000090046001600160a01b031633146117db576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b600061134985858585613807565b600054630100000090046001600160a01b0316331461186a576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b6101f85460408051634bf5d7e960e01b815290516060926001600160a01b031691634bf5d7e99160048083019260009291908290030181865afa92505050801561191f57506040513d6000823e601f3d908101601f1916820160405261191c919081019061697f565b60015b61195b575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b60008033905061198184828560405180602001604052806000815250613406565b949350505050565b60008033905061176887828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250612dea915050565b61025e546000908082036119ec57505061025d54919050565b600061025e6119fc6001846169ec565b81548110611a0c57611a0c6168d3565b60009182526020918290206040805180820190915291015463ffffffff8116808352600160201b9091046001600160e01b03169282019290925291508410611a6257602001516001600160e01b03169392505050565b611a77611a6e856138d2565b61025e9061393b565b6001600160e01b0316949350505050565b611a90610edb565b6001600160a01b0316336001600160a01b031614611ac05760405162461bcd60e51b815260040161045390616862565b30611ac9610edb565b6001600160a01b031614611b075760008036604051611ae9929190616852565b604051809103902090505b80611b00610164612e53565b03611af457505b6111d1816139ee565b600080339050611b5886828787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061340692505050565b9695505050505050565b6000805462010000900460ff1615611b8d57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615611bbe5760405163b1d02c3d60e01b815260040160405180910390fd5b611bc6613a31565b3360009081526102c360205260409020548015611c3b576000611be882611773565b90506001816007811115611bfe57611bfe6162ef565b1480611c1b57506000816007811115611c1957611c196162ef565b145b15611c395760405163867f3ee560e01b815260040160405180910390fd5b505b825160208401206000611c5088888885612a2b565b3360009081526102c3602052604090208190559050611c7188888888613adc565b98975050505050505050565b600054610100900460ff1615808015611c9d5750600054600160ff909116105b80611cb75750303b158015611cb7575060005460ff166001145b611d1a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610453565b6000805460ff191660011790558015611d3d576000805461ff0019166101001790555b334114611d5d5760405163022d8c9560e31b815260040160405180910390fd5b3a15611d7c576040516383f1b1d360e01b815260040160405180910390fd5b611da86040518060400160405280600b81526020016a2129a1a3b7bb32b93737b960a91b815250613b44565b611dd4611db760036000616a15565b611dc5600362093a80616a15565b680ad78ebc5ac6200000613b9b565b611ddc613bd2565b611de7612005613bf9565b611df2612006613c29565b611dfc600a613c59565b611e12611e0d600362015180616a15565b613c89565b6110076000526102c16020527f2f832952f0ef896b8c8edd6d16a2e4f2591a90375e33021e3b9ff197f3793fc0805460ff19166001179055611e677308e68ec70fa3b629784fdb28887e206ce8561e08613cb9565b80156111d1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b600054630100000090046001600160a01b03163314611ee1576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1615611f0b57604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6000606080600080600060606098546000801b148015611f655750609954155b611fa95760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610453565b611fb1613d0c565b611fb9613d1b565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6101f854604080516324776b7d60e21b815290516000926001600160a01b0316916391ddadf49160048083019260209291908290030181865afa92505050801561204a575060408051601f3d908101601f1916820190925261204791810190616a37565b60015b61195b57610ef043613d2a565b6000612064848484613d91565b90505b9392505050565b61025e54600090156120935761208561025e613e08565b6001600160e01b0316905090565b5061025d5490565b6120a3610edb565b6001600160a01b0316336001600160a01b0316146120d35760405162461bcd60e51b815260040161045390616862565b306120dc610edb565b6001600160a01b03161461211a57600080366040516120fc929190616852565b604051809103902090505b80612113610164612e53565b0361210757505b6111d181613e38565b61022b54600082815261022c602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa158015612182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a69190616a5f565b9050806001146121b65780612067565b60009392505050565b33611007146121e557604051630f22c43960e41b81526110076004820152602401610453565b61224b6040518060400160405280600b81526020016a766f74696e6744656c617960a81b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea39050565b1561230057602081146122795783838383604051630a5a604160e01b81526004016104539493929190616aa1565b604080516020601f84018190048102820181019092528281526000916122ba918585808385018382808284376000920191909152509293925050613efc9050565b90508015806122cb57506201518081115b156122f15784848484604051630a5a604160e01b81526004016104539493929190616aa1565b6122fa816139ee565b506128c1565b6123676040518060400160405280600c81526020016b1d9bdd1a5b99d4195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea39050565b1561241657602081146123955783838383604051630a5a604160e01b81526004016104539493929190616aa1565b604080516020601f84018190048102820181019092528281526000916123d6918585808385018382808284376000920191909152509293925050613efc9050565b90508015806123e7575062278d0081115b1561240d5784848484604051630a5a604160e01b81526004016104539493929190616aa1565b6122fa81613f01565b612482604051806040016040528060118152602001701c1c9bdc1bdcd85b151a1c995cda1bdb19607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea39050565b1561253857602081146124b05783838383604051630a5a604160e01b81526004016104539493929190616aa1565b604080516020601f84018190048102820181019092528281526000916124f1918585808385018382808284376000920191909152509293925050613efc9050565b9050801580612509575069021e19e0c9bab240000081115b1561252f5784848484604051630a5a604160e01b81526004016104539493929190616aa1565b6122fa81613fa4565b6125a26040518060400160405280600f81526020016e38bab7b93ab6a73ab6b2b930ba37b960891b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea39050565b1561265157602081146125d05783838383604051630a5a604160e01b81526004016104539493929190616aa1565b604080516020601f8401819004810282018101909252828152600091612611918585808385018382808284376000920191909152509293925050613efc9050565b905060058110806126225750601481115b156126485784848484604051630a5a604160e01b81526004016104539493929190616aa1565b6122fa81612ed2565b6126c0604051806040016040528060148152602001736d696e506572696f64416674657251756f72756d60601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea39050565b1561278657600881146126ee5783838383604051630a5a604160e01b81526004016104539493929190616aa1565b6000612734600884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613efc9050565b90506001600160401b038116158061275757506202a300816001600160401b0316115b1561277d5784848484604051630a5a604160e01b81526004016104539493929190616aa1565b6122fa81613fe7565b6127f26040518060400160405280601181526020017033b7bb32b93737b9283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea39050565b156128a057601481146128205783838383604051630a5a604160e01b81526004016104539493929190616aa1565b6000612866601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613efc9050565b90506001600160a01b0381166128975784848484604051630a5a604160e01b81526004016104539493929190616aa1565b6122fa81614053565b838383836040516325ee20d560e21b81526004016104539493929190616aa1565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516128f69493929190616aa1565b60405180910390a150505050565b6000610ef06101965490565b6000610fbb826140bf565b612923610edb565b6001600160a01b0316336001600160a01b0316146129535760405162461bcd60e51b815260040161045390616862565b3061295c610edb565b6001600160a01b03161461299a576000803660405161297c929190616852565b604051809103902090505b80612993610164612e53565b0361298757505b600080856001600160a01b03168585856040516129b8929190616852565b60006040518083038185875af1925050503d80600081146129f5576040519150601f19603f3d011682016040523d82523d6000602084013e6129fa565b606091505b5091509150612a228282604051806060016040528060288152602001616efe602891396140fd565b50505050505050565b600084848484604051602001612a449493929190616ac8565b60408051601f19818403018152919052805160209091012095945050505050565b612a6d610edb565b6001600160a01b0316336001600160a01b031614612a9d5760405162461bcd60e51b815260040161045390616862565b30612aa6610edb565b6001600160a01b031614612ae45760008036604051612ac6929190616852565b604051809103902090505b80612add610164612e53565b03612ad157505b6111d181613fe7565b60008251845114612b515760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a20696e76616c6964207369676e61747572656044820152670e640d8cadccee8d60c31b6064820152608401610453565b612b5f338787878787614116565b611b588686612b6e87876141d4565b85611b62565b600080600080612b8385613576565b93509350935093506117a184848484611267565b612b9f610edb565b6001600160a01b0316336001600160a01b031614612bcf5760405162461bcd60e51b815260040161045390616862565b30612bd8610edb565b6001600160a01b031614612c165760008036604051612bf8929190616852565b604051809103902090505b80612c0f610164612e53565b03612c0357505b6111d181613f01565b60006120678383612c3b60408051602081019091526000815290565b613d91565b612c48610edb565b6001600160a01b0316336001600160a01b031614612c785760405162461bcd60e51b815260040161045390616862565b30612c81610edb565b6001600160a01b031614612cbf5760008036604051612ca1929190616852565b604051809103902090505b80612cb8610164612e53565b03612cac57505b6111d181613fa4565b60006064612cd5836119d3565b6101f854604051632394e7a360e21b8152600481018690526001600160a01b0390911690638e539e8c90602401602060405180830381865afa158015612d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d439190616a5f565b612d4d9190616b13565b610fbb9190616a15565b600080600080612d6685613576565b93509350935093506117a184848484611378565b60006001600160e01b03198216636e665ced60e01b1480610fbb5750610fbb82614306565b6000610fbb612dac6143a2565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000612ddd878787876143ac565b9150915061146181614470565b6000805462010000900460ff1615612e1557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615612e465760405163b1d02c3d60e01b815260040160405180910390fd5b611b5886868686866145ba565b6000612e6e8254600f81810b600160801b909204900b131590565b15612e8c57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b6064811115612f555760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a401610453565b6000612f5f61206e565b90508015801590612f71575061025e54155b15612fd657604080518082019091526000815261025e9060208101612f95846146bd565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b613004612ff1612fe4611fe3565b65ffffffffffff166138d2565b612ffa846146bd565b61025e9190614726565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b60008061305286868686612a2b565b9050600461305f82611773565b6007811115613070576130706162ef565b1461308d5760405162461bcd60e51b81526004016104539061693e565b61022b546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa1580156130d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fc9190616a5f565b61022b5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790613137908a908a908a906000908b90600401616b2a565b602060405180830381865afa158015613154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131789190616a5f565b600083815261022c60205260408082209290925561022b5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb0916131c5918b918b918b91908b908990600401616b78565b600060405180830381600087803b1580156131df57600080fd5b505af11580156131f3573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426132259190616bd0565b604080519283526020830191909152015b60405180910390a15095945050505050565b30613251610edb565b6001600160a01b0316146132e25760005b84518110156117a157306001600160a01b0316858281518110613287576132876168d3565b60200260200101516001600160a01b0316036132d2576132d28382815181106132b2576132b26168d3565b60200260200101518051906020012061016461474190919063ffffffff16565b6132db816168ff565b9050613262565b5050505050565b60005462010000900460ff161561331357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156133445760405163b1d02c3d60e01b815260040160405180910390fd5b60005b84518110156133bd576102c16000868381518110613367576133676168d3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166133ab57604051630b094f2760e31b815260040160405180910390fd5b806133b5816168ff565b915050613347565b506132e2858585858561477d565b306133d4610edb565b6001600160a01b0316146132e25761016454600f81810b600160801b909204900b13156132e2576000610164556132e2565b60006113498585858561342460408051602081019091526000815290565b612dea565b600080613435836147f2565b9050600481600781111561344b5761344b6162ef565b146134565792915050565b600083815261022c602052604090205480613472575092915050565b61022b54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa1580156134bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e09190616be3565b156134ef575060079392505050565b61022b54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa158015613539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355d9190616be3565b1561356c575060059392505050565b5060029392505050565b60608060606000806101c660008781526020019081526020016000209050806001018160020161374883600301805480602002602001604051908101604052809291908181526020016000905b8282101561366f5783829060005260206000200180546135e290616899565b80601f016020809104026020016040519081016040528092919081815260200182805461360e90616899565b801561365b5780601f106136305761010080835404028352916020019161365b565b820191906000526020600020905b81548152906001019060200180831161363e57829003601f168201915b5050505050815260200190600101906135c3565b50505060048601805460408051602080840282018101909252828152935060009084015b8282101561373f5783829060005260206000200180546136b290616899565b80601f01602080910402602001604051908101604052809291908181526020018280546136de90616899565b801561372b5780601f106137005761010080835404028352916020019161372b565b820191906000526020600020905b81548152906001019060200180831161370e57829003601f168201915b505050505081526020019060010190613693565b505050506141d4565b600984015483546040805160208084028201810190925282815291869183018282801561379e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613780575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156137f057602002820191906000526020600020905b8154815260200190600101908083116137dc575b505050505092509450945094509450509193509193565b60008061381686868686612a2b565b60008181526101c660205260409020549091506001600160a01b03163381148061386a5750613843612904565b613868826001613851611fe3565b61385b9190616918565b65ffffffffffff16612c1f565b105b6138c65760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a2070726f706f7365722061626f76652074686044820152661c995cda1bdb1960ca1b6064820152608401610453565b6117688787878761492a565b600063ffffffff8211156139375760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610453565b5090565b81546000908181600581111561399857600061395684614938565b61396090856169ec565b60008881526020902090915081015463ffffffff908116908716101561398857809150613996565b613993816001616bd0565b92505b505b60006139a687878585614a20565b905080156139e1576139cb876139bd6001846169ec565b600091825260209091200190565b54600160201b90046001600160e01b0316611768565b6000979650505050505050565b6101945460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161019455565b6102c25460ff16613ada576a084595161401484a0000006120056001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aac9190616a5f565b1015613acb576040516311b6707f60e01b815260040160405180910390fd5b6102c2805460ff191660011790555b565b6000613b3833868686516001600160401b03811115613afd57613afd615d27565b604051908082528060200260200182016040528015613b3057816020015b6060815260200190600190039081613b1b5790505b508787614116565b61134985858585614a76565b600054610100900460ff16613b6b5760405162461bcd60e51b815260040161045390616c05565b613b9281613b8d6040805180820190915260018152603160f81b602082015290565b614e55565b6111d181614ea4565b600054610100900460ff16613bc25760405162461bcd60e51b815260040161045390616c05565b613bcd838383614edc565b505050565b600054610100900460ff16613ada5760405162461bcd60e51b815260040161045390616c05565b600054610100900460ff16613c205760405162461bcd60e51b815260040161045390616c05565b6111d181614f1e565b600054610100900460ff16613c505760405162461bcd60e51b815260040161045390616c05565b6111d181614f68565b600054610100900460ff16613c805760405162461bcd60e51b815260040161045390616c05565b6111d181614f8f565b600054610100900460ff16613cb05760405162461bcd60e51b815260040161045390616c05565b6111d181614fb6565b600054610100900460ff16613ce05760405162461bcd60e51b815260040161045390616c05565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6060609a80546111e490616899565b6060609b80546111e490616899565b600065ffffffffffff8211156139375760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610453565b6101f854604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613de4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120649190616a5f565b805460009080156121b657613e22836139bd6001846169ec565b54600160201b90046001600160e01b0316612067565b61022b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a161022b80546001600160a01b0319166001600160a01b0392909216919091179055565b600081604051602001613eb69190616c50565b6040516020818303038152906040528051906020012083604051602001613edd9190616c50565b6040516020818303038152906040528051906020012014905092915050565b015190565b60008111613f615760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b6064820152608401610453565b6101955460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161019555565b6101965460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161019655565b61028f54604080516001600160401b03928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a161028f805467ffffffffffffffff19166001600160401b0392909216919091179055565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60008181526101636020526040812060010154610fbb906001600160401b0316600084815261029060205260409020546001600160401b0316614fdd565b6060831561410c575081612067565b6120678383614ff3565b805160208201206000614134878761412e88886141d4565b85612a2b565b60008181526101c6602052604090206009810154919250906141c95780546001600160a01b0319166001600160a01b038a16178155875161417e90600183019060208b0190615ac2565b50865161419490600283019060208a0190615b23565b5085516141aa9060038301906020890190615b5e565b5084516141c09060048301906020880190615bb0565b50600981018390555b505050505050505050565b6060600082516001600160401b038111156141f1576141f1615d27565b60405190808252806020026020018201604052801561422457816020015b606081526020019060019003908161420f5790505b50905060005b81518110156142fe57848181518110614245576142456168d3565b6020026020010151516000146142b557848181518110614267576142676168d3565b602002602001015180519060200120848281518110614288576142886168d3565b60200260200101516040516020016142a1929190616c6c565b6040516020818303038152906040526142d0565b8381815181106142c7576142c76168d3565b60200260200101515b8282815181106142e2576142e26168d3565b6020026020010181905250806142f7906168ff565b905061422a565b509392505050565b600063288ace0360e11b6318df743f60e31b63bf26d89760e01b6379dd796f60e01b6001600160e01b0319861682148061434c57506001600160e01b0319868116908216145b8061436357506001600160e01b0319868116908516145b8061437e57506001600160e01b03198616630271189760e51b145b80611b5857506301ffc9a760e01b6001600160e01b03198716149695505050505050565b6000610ef061501d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156143e35750600090506003614467565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614437573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661446057600060019250925050614467565b9150600090505b94509492505050565b6000816004811115614484576144846162ef565b0361448c5750565b60018160048111156144a0576144a06162ef565b036144ed5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610453565b6002816004811115614501576145016162ef565b0361454e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610453565b6003816004811115614562576145626162ef565b036111d15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610453565b6000806145ca8787878787615091565b600088815261029060205260409020549091506001600160401b03161580156145f757506145f7876151e7565b15611b5857600061461161028f546001600160401b031690565b614619611fe3565b65ffffffffffff1661462b9190616c9d565b905061463688612910565b816001600160401b03161115614685576040516001600160401b038216815288907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b600088815261029060205260409020805467ffffffffffffffff19166001600160401b03929092169190911790559695505050505050565b60006001600160e01b038211156139375760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610453565b600080614734858585615227565b915091505b935093915050565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61022b5460405163e38335e560e01b81526001600160a01b039091169063e38335e59034906147b9908890889088906000908990600401616b2a565b6000604051808303818588803b1580156147d257600080fd5b505af11580156147e6573d6000803e3d6000fd5b50505050505050505050565b600081815261016360205260408120600281015460ff16156148175750600792915050565b6002810154610100900460ff16156148325750600292915050565b600083815261016360205260408120546001600160401b03169081900361489b5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c2069640000006044820152606401610453565b60006148a5611fe3565b65ffffffffffff1690508082106148c157506000949350505050565b60006148cc86612910565b90508181106148e15750600195945050505050565b6148ea866151e7565b801561490d575060008681526101c6602052604090206006810154600590910154115b1561491e5750600495945050505050565b50600395945050505050565b6000611349858585856153c6565b60008160000361494a57506000919050565b600060016149578461547c565b901c6001901b90506001818481614970576149706169ff565b048201901c90506001818481614988576149886169ff565b048201901c905060018184816149a0576149a06169ff565b048201901c905060018184816149b8576149b86169ff565b048201901c905060018184816149d0576149d06169ff565b048201901c905060018184816149e8576149e86169ff565b048201901c90506001818481614a0057614a006169ff565b048201901c905061206781828581614a1a57614a1a6169ff565b04615510565b60005b818310156142fe576000614a37848461551f565b60008781526020902090915063ffffffff86169082015463ffffffff161115614a6257809250614a70565b614a6d816001616bd0565b93505b50614a23565b600033614a83818461553a565b614acf5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73657220726573747269637465640000006044820152606401610453565b6000614ad9611fe3565b65ffffffffffff169050614aeb612904565b614afa83610e216001856169ec565b1015614b625760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b6064820152608401610453565b6000614b778888888880519060200120612a2b565b90508651885114614b9a5760405162461bcd60e51b815260040161045390616cbd565b8551885114614bbb5760405162461bcd60e51b815260040161045390616cbd565b6000885111614c0c5760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c00000000000000006044820152606401610453565b600081815261016360205260409020546001600160401b031615614c7c5760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b6064820152608401610453565b6000614c886101945490565b614c929084616bd0565b90506000614ca06101955490565b614caa9083616bd0565b90506040518060e00160405280614cc08461562b565b6001600160401b031681526001600160a01b038716602082015260006040820152606001614ced8361562b565b6001600160401b03908116825260006020808401829052604080850183905260609485018390528883526101638252918290208551815492870151878501519186166001600160e01b031990941693909317600160401b6001600160a01b039094168402176001600160e01b0316600160e01b60e09290921c91909102178155938501516080860151908416921c0217600183015560a08301516002909201805460c09094015161ffff1990941692151561ff00191692909217610100931515939093029290921790558a517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091859188918e918e91811115614df257614df2615d27565b604051908082528060200260200182016040528015614e2557816020015b6060815260200190600190039081614e105790505b508d88888f604051614e3f99989796959493929190616cfe565b60405180910390a1509098975050505050505050565b600054610100900460ff16614e7c5760405162461bcd60e51b815260040161045390616c05565b609a614e888382616ddc565b50609b614e958282616ddc565b50506000609881905560995550565b600054610100900460ff16614ecb5760405162461bcd60e51b815260040161045390616c05565b610162614ed88282616ddc565b5050565b600054610100900460ff16614f035760405162461bcd60e51b815260040161045390616c05565b614f0c836139ee565b614f1582613f01565b613bcd81613fa4565b600054610100900460ff16614f455760405162461bcd60e51b815260040161045390616c05565b6101f880546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff1661211a5760405162461bcd60e51b815260040161045390616c05565b600054610100900460ff166111c85760405162461bcd60e51b815260040161045390616c05565b600054610100900460ff16612ae45760405162461bcd60e51b815260040161045390616c05565b6000818311614fec5781612067565b5090919050565b8151156150035781518083602001fd5b8060405162461bcd60e51b81526004016104539190615ee0565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f615048615693565b6150506156ec565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008581526101636020526040812060016150ab88611773565b60078111156150bc576150bc6162ef565b146151155760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b6064820152608401610453565b805460009061512f9088906001600160401b031686613d91565b905061513e888888848861571d565b835160000361519357866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516151869493929190616e9b565b60405180910390a2611768565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516151d4959493929190616ec3565b60405180910390a2979650505050505050565b60008181526101c660205260408120600581015461521e610ea285600090815261016360205260409020546001600160401b031690565b11159392505050565b82546000908190801561536d576000615245876139bd6001856169ec565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090871610156152c65760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610453565b805163ffffffff80881691160361530e57846152e7886139bd6001866169ec565b80546001600160e01b0392909216600160201b0263ffffffff90921691909117905561535d565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b6020015192508391506147399050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b029190931617920191909155905081614739565b6000806153d5868686866158bb565b600081815261022c6020526040902054909150156113495761022b54600082815261022c60205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f5916154319160040190815260200190565b600060405180830381600087803b15801561544b57600080fd5b505af115801561545f573d6000803e3d6000fd5b505050600082815261022c60205260408120555095945050505050565b600080608083901c1561549157608092831c92015b604083901c156154a357604092831c92015b602083901c156154b557602092831c92015b601083901c156154c757601092831c92015b600883901c156154d957600892831c92015b600483901c156154eb57600492831c92015b600283901c156154fd57600292831c92015b600183901c15610fbb5760010192915050565b6000818310614fec5781612067565b600061552e6002848418616a15565b61206790848416616bd0565b80516000906034811015615552576001915050610fbb565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b1461558557600192505050610fbb565b6000806155936028856169ec565b90505b8381101561560a576000806155ca8884815181106155b6576155b66168d3565b01602001516001600160f81b0319166159c8565b91509150816155e25760019650505050505050610fbb565b8060ff166004856001600160a01b0316901b179350505080615603906168ff565b9050615596565b50856001600160a01b0316816001600160a01b031614935050505092915050565b60006001600160401b038211156139375760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401610453565b60008061569e613d0c565b8051909150156156b5578051602090910120919050565b60985480156156c45792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806156f7613d1b565b80519091501561570e578051602090910120919050565b60995480156156c45792915050565b60008581526101c6602090815260408083206001600160a01b038816845260088101909252909120805460ff16156157ad5760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20766f746560448201526c08185b1c9958591e4818d85cdd609a1b6064820152608401610453565b805460ff86166101000261ffff199091161760011781556157cd84615a5a565b81546001600160601b039190911662010000026dffffffffffffffffffffffff00001990911617815560ff851661581d57838260060160008282546158129190616bd0565b90915550612a229050565b60001960ff86160161583d57838260050160008282546158129190616bd0565b60011960ff86160161585d57838260070160008282546158129190616bd0565b60405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20696e766160448201526c6c696420766f7465207479706560981b6064820152608401610453565b6000806158ca86868686612a2b565b905060006158d782611773565b905060028160078111156158ed576158ed6162ef565b1415801561590d5750600681600781111561590a5761590a6162ef565b14155b801561592b57506007816007811115615928576159286162ef565b14155b6159775760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74206163746976650000006044820152606401610453565b6000828152610163602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906132369084815260200190565b60008060f883901c602f811180156159e35750603a8160ff16105b156159f857600194602f199091019350915050565b8060ff166040108015615a0e575060478160ff16105b15615a23576001946036199091019350915050565b8060ff166060108015615a39575060678160ff16105b15615a4e576001946056199091019350915050565b50600093849350915050565b60006001600160601b038211156139375760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401610453565b828054828255906000526020600020908101928215615b17579160200282015b82811115615b1757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615ae2565b50613937929150615c02565b828054828255906000526020600020908101928215615b17579160200282015b82811115615b17578251825591602001919060010190615b43565b828054828255906000526020600020908101928215615ba4579160200282015b82811115615ba45782518290615b949082616ddc565b5091602001919060010190615b7e565b50613937929150615c17565b828054828255906000526020600020908101928215615bf6579160200282015b82811115615bf65782518290615be69082616ddc565b5091602001919060010190615bd0565b50613937929150615c34565b5b808211156139375760008155600101615c03565b80821115613937576000615c2b8282615c51565b50600101615c17565b80821115613937576000615c488282615c51565b50600101615c34565b508054615c5d90616899565b6000825580601f10615c6d575050565b601f0160209004906000526020600020908101906111d19190615c02565b600060208284031215615c9d57600080fd5b5035919050565b600060208284031215615cb657600080fd5b81356001600160e01b03198116811461206757600080fd5b803560ff8116811461195b57600080fd5b60008083601f840112615cf157600080fd5b5081356001600160401b03811115615d0857600080fd5b602083019150836020828501011115615d2057600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615d6557615d65615d27565b604052919050565b60006001600160401b03821115615d8657615d86615d27565b50601f01601f191660200190565b600082601f830112615da557600080fd5b8135615db8615db382615d6d565b615d3d565b818152846020838601011115615dcd57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b031215615e0657600080fd5b88359750615e1660208a01615cce565b965060408901356001600160401b0380821115615e3257600080fd5b615e3e8c838d01615cdf565b909850965060608b0135915080821115615e5757600080fd5b50615e648b828c01615d94565b945050615e7360808a01615cce565b925060a0890135915060c089013590509295985092959890939650565b60005b83811015615eab578181015183820152602001615e93565b50506000910152565b60008151808452615ecc816020860160208601615e90565b601f01601f19169290920160200192915050565b6020815260006120676020830184615eb4565b6001600160a01b03811681146111d157600080fd5b60008060008060808587031215615f1e57600080fd5b8435615f2981615ef3565b93506020850135615f3981615ef3565b92506040850135915060608501356001600160401b03811115615f5b57600080fd5b615f6787828801615d94565b91505092959194509250565b60006001600160401b03821115615f8c57615f8c615d27565b5060051b60200190565b600082601f830112615fa757600080fd5b81356020615fb7615db383615f73565b82815260059290921b84018101918181019086841115615fd657600080fd5b8286015b84811015615ffa578035615fed81615ef3565b8352918301918301615fda565b509695505050505050565b600082601f83011261601657600080fd5b81356020616026615db383615f73565b82815260059290921b8401810191818101908684111561604557600080fd5b8286015b84811015615ffa5780358352918301918301616049565b600082601f83011261607157600080fd5b81356020616081615db383615f73565b82815260059290921b840181019181810190868411156160a057600080fd5b8286015b84811015615ffa5780356001600160401b038111156160c35760008081fd5b6160d18986838b0101615d94565b8452509183019183016160a4565b600080600080608085870312156160f557600080fd5b84356001600160401b038082111561610c57600080fd5b61611888838901615f96565b9550602087013591508082111561612e57600080fd5b61613a88838901616005565b9450604087013591508082111561615057600080fd5b5061615d87828801616060565b949793965093946060013593505050565b60006020828403121561618057600080fd5b813561206781615ef3565b600081518084526020808501945080840160005b838110156161c45781516001600160a01b03168752958201959082019060010161619f565b509495945050505050565b600081518084526020808501945080840160005b838110156161c4578151875295820195908201906001016161e3565b600081518084526020808501808196508360051b8101915082860160005b85811015616247578284038952616235848351615eb4565b9885019893509084019060010161621d565b5091979650505050505050565b608081526000616267608083018761618b565b828103602084015261627981876161cf565b9050828103604084015261628d81866161ff565b9050828103606084015261176881856161ff565b600080600080600060a086880312156162b957600080fd5b853594506162c960208701615cce565b93506162d760408701615cce565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061632757634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561634057600080fd5b82359150602083013561635281615ef3565b809150509250929050565b6000806040838503121561637057600080fd5b8235915061638060208401615cce565b90509250929050565b6000806000806000608086880312156163a157600080fd5b853594506163b160208701615cce565b935060408601356001600160401b03808211156163cd57600080fd5b6163d989838a01615cdf565b909550935060608801359150808211156163f257600080fd5b506163ff88828901615d94565b9150509295509295909350565b6000806000806060858703121561642257600080fd5b8435935061643260208601615cce565b925060408501356001600160401b0381111561644d57600080fd5b61645987828801615cdf565b95989497509550505050565b6000806000806080858703121561647b57600080fd5b84356001600160401b038082111561649257600080fd5b61649e88838901615f96565b955060208701359150808211156164b457600080fd5b6164c088838901616005565b945060408701359150808211156164d657600080fd5b6164e288838901616060565b935060608701359150808211156164f857600080fd5b50615f6787828801615d94565b60ff60f81b8816815260e06020820152600061652460e0830189615eb4565b82810360408401526165368189615eb4565b606084018890526001600160a01b038716608085015260a0840186905283810360c085015290506110ab81856161cf565b60008060006060848603121561657c57600080fd5b833561658781615ef3565b92506020840135915060408401356001600160401b038111156165a957600080fd5b6165b586828701615d94565b9150509250925092565b600080600080604085870312156165d557600080fd5b84356001600160401b03808211156165ec57600080fd5b6165f888838901615cdf565b9096509450602087013591508082111561661157600080fd5b5061645987828801615cdf565b600080600080600060a0868803121561663657600080fd5b853561664181615ef3565b9450602086013561665181615ef3565b935060408601356001600160401b038082111561666d57600080fd5b61667989838a01616005565b9450606088013591508082111561668f57600080fd5b61669b89838a01616005565b935060808801359150808211156163f257600080fd5b600080600080606085870312156166c757600080fd5b84356166d281615ef3565b93506020850135925060408501356001600160401b0381111561644d57600080fd5b60006020828403121561670657600080fd5b81356001600160401b038116811461206757600080fd5b600080600080600060a0868803121561673557600080fd5b85356001600160401b038082111561674c57600080fd5b61675889838a01615f96565b9650602088013591508082111561676e57600080fd5b61677a89838a01616005565b9550604088013591508082111561679057600080fd5b61679c89838a01616060565b945060608801359150808211156167b257600080fd5b61669b89838a01616060565b600080604083850312156167d157600080fd5b82356167dc81615ef3565b946020939093013593505050565b600080600080600060a0868803121561680257600080fd5b853561680d81615ef3565b9450602086013561681d81615ef3565b9350604086013592506060860135915060808601356001600160401b0381111561684657600080fd5b6163ff88828901615d94565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c908216806168ad57607f821691505b6020821081036168cd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201616911576169116168e9565b5060010190565b65ffffffffffff828116828216039080821115616937576169376168e9565b5092915050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b60006020828403121561699157600080fd5b81516001600160401b038111156169a757600080fd5b8201601f810184136169b857600080fd5b80516169c6615db382615d6d565b8181528560208385010111156169db57600080fd5b611349826020830160208601615e90565b81810381811115610fbb57610fbb6168e9565b634e487b7160e01b600052601260045260246000fd5b600082616a3257634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215616a4957600080fd5b815165ffffffffffff8116811461206757600080fd5b600060208284031215616a7157600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000616ab5604083018688616a78565b8281036020840152611768818587616a78565b608081526000616adb608083018761618b565b8281036020840152616aed81876161cf565b90508281036040840152616b0181866161ff565b91505082606083015295945050505050565b8082028115828204841417610fbb57610fbb6168e9565b60a081526000616b3d60a083018861618b565b8281036020840152616b4f81886161cf565b90508281036040840152616b6381876161ff565b60608401959095525050608001529392505050565b60c081526000616b8b60c083018961618b565b8281036020840152616b9d81896161cf565b90508281036040840152616bb181886161ff565b60608401969096525050608081019290925260a0909101529392505050565b80820180821115610fbb57610fbb6168e9565b600060208284031215616bf557600080fd5b8151801515811461206757600080fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251616c62818460208701615e90565b9190910192915050565b6001600160e01b0319831681528151600090616c8f816004850160208701615e90565b919091016004019392505050565b6001600160401b03818116838216019080821115616937576169376168e9565b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b8981526001600160a01b038916602082015261012060408201819052600090616d298382018b61618b565b90508281036060840152616d3d818a6161cf565b90508281036080840152616d5181896161ff565b905082810360a0840152616d6581886161ff565b90508560c08401528460e0840152828103610100840152616d868185615eb4565b9c9b505050505050505050505050565b601f821115613bcd57600081815260208120601f850160051c81016020861015616dbd5750805b601f850160051c820191505b818110156117a157828155600101616dc9565b81516001600160401b03811115616df557616df5615d27565b616e0981616e038454616899565b84616d96565b602080601f831160018114616e3e5760008415616e265750858301515b600019600386901b1c1916600185901b1785556117a1565b600085815260208120601f198616915b82811015616e6d57888601518255948401946001909101908401616e4e565b5085821015616e8b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b84815260ff84166020820152826040820152608060608201526000611b586080830184615eb4565b85815260ff8516602082015283604082015260a060608201526000616eeb60a0830185615eb4565b8281036080840152611c718185615eb456fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765a164736f6c6343000811000a" + "code": "0x6080604052600436106103dd5760003560e01c80637b3c71d3116101fd578063c170ec0b11610118578063deaaa7cc116100ab578063ece40cc11161007a578063ece40cc114610de9578063f23a6e6114610e09578063f8ce560a14610e35578063fc0c546a14610e55578063fe0d94c114610e7657600080fd5b8063deaaa7cc14610caa578063e23a9a5214610cde578063ea0217cf14610da9578063eb9019d414610dc957600080fd5b8063d33219b4116100e7578063d33219b414610c05578063da95691a14610c24578063dd4e2ba514610c44578063ddf0b00914610c8a57600080fd5b8063c170ec0b14610b97578063c28bc2fa14610bb2578063c59057e414610bc5578063d07f91e914610be557600080fd5b8063a7713a7011610190578063b187bd261161015f578063b187bd2614610b18578063b58131b014610b36578063bc197c8114610b4b578063c01f9e3714610b7757600080fd5b8063a7713a7014610aa3578063a890c91014610ab8578063ab58fb8e14610ad8578063ac43175114610af857600080fd5b806384b0196e116101cc57806384b0196e14610a1b57806391ddadf414610a4357806397c3d33414610a6f5780639a802a6d14610a8357600080fd5b80637b3c71d3146109b15780637d5e81e2146109d15780638129fc1c146109f15780638456cb5914610a0657600080fd5b806332b8113e116102f85780634838d1651161028b57806354fd4d501161025a57806354fd4d501461090757806356781388146109315780635f398a141461095157806360c4247f1461097157806370b0f6601461099157600080fd5b80634838d165146108715780634a49ac4c146108a15780634bf5d7e9146108c1578063533ddd14146108d657600080fd5b806340e58ee5116102c757806340e58ee5146107c6578063417c73a7146107e65780634385963214610806578063452115d61461085157600080fd5b806332b8113e1461073a5780633932abb1146107635780633bccf4fd146107795780633e4f49e61461079957600080fd5b8063150b7a02116103705780632656227d1161033f5780632656227d1461068c5780632d63f6931461069f5780632fe3e261146106d6578063328dd9821461070a57600080fd5b8063150b7a02146105e5578063160cbed71461062957806317977c611461064957806324bc1a641461067757600080fd5b8063046f7da2116103ac578063046f7da21461053857806306f3f9e61461054d57806306fdde031461056d578063143489d01461058f57600080fd5b8063013cf08b1461044d57806301ffc9a7146104c857806302a251a3146104f8578063034201811461051857600080fd5b3661044857306103eb610e89565b6001600160a01b0316146104465760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a206d7573742073656e6420746f206578656375746f720060448201526064015b60405180910390fd5b005b600080fd5b34801561045957600080fd5b5061046d610468366004615c39565b610ea3565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b3480156104d457600080fd5b506104e86104e3366004615c52565b610f5e565b60405190151581526020016104bf565b34801561050457600080fd5b50610195545b6040519081526020016104bf565b34801561052457600080fd5b5061050a610533366004615d98565b610f6f565b34801561054457600080fd5b50610446611067565b34801561055957600080fd5b50610446610568366004615c39565b6110f7565b34801561057957600080fd5b50610582611182565b6040516104bf9190615e8e565b34801561059b57600080fd5b506105cd6105aa366004615c39565b60009081526101636020526040902054600160401b90046001600160a01b031690565b6040516001600160a01b0390911681526020016104bf565b3480156105f157600080fd5b50610610610600366004615eb6565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016104bf565b34801561063557600080fd5b5061050a61064436600461608d565b611215565b34801561065557600080fd5b5061050a61066436600461611c565b6102c36020526000908152604090205481565b34801561068357600080fd5b5061050a611300565b61050a61069a36600461608d565b611326565b3480156106ab57600080fd5b5061050a6106ba366004615c39565b600090815261016360205260409020546001600160401b031690565b3480156106e257600080fd5b5061050a7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561071657600080fd5b5061072a610725366004615c39565b611419565b6040516104bf9493929190616202565b34801561074657600080fd5b5061028f546040516001600160401b0390911681526020016104bf565b34801561076f57600080fd5b506101945461050a565b34801561078557600080fd5b5061050a61079436600461624f565b6116ab565b3480156107a557600080fd5b506107b96107b4366004615c39565b611721565b6040516104bf91906162b3565b3480156107d257600080fd5b506104466107e1366004615c39565b61172c565b3480156107f257600080fd5b5061044661080136600461611c565b611757565b34801561081257600080fd5b506104e86108213660046162db565b60008281526101c6602090815260408083206001600160a01b038516845260080190915290205460ff1692915050565b34801561085d57600080fd5b5061050a61086c36600461608d565b6117d8565b34801561087d57600080fd5b506104e861088c36600461611c565b60016020526000908152604090205460ff1681565b3480156108ad57600080fd5b506104466108bc36600461611c565b6117e6565b3480156108cd57600080fd5b50610582611861565b3480156108e257600080fd5b506104e86108f136600461611c565b6102c16020526000908152604090205460ff1681565b34801561091357600080fd5b506040805180820190915260018152603160f81b6020820152610582565b34801561093d57600080fd5b5061050a61094c36600461630b565b61190e565b34801561095d57600080fd5b5061050a61096c366004616337565b611937565b34801561097d57600080fd5b5061050a61098c366004615c39565b611981565b34801561099d57600080fd5b506104466109ac366004615c39565b611a36565b3480156109bd57600080fd5b5061050a6109cc3660046163ba565b611abe565b3480156109dd57600080fd5b5061050a6109ec366004616413565b611b10565b3480156109fd57600080fd5b50610446611c2b565b348015610a1257600080fd5b50610446611e5d565b348015610a2757600080fd5b50610a30611ef3565b6040516104bf97969594939291906164b3565b348015610a4f57600080fd5b50610a58611f91565b60405165ffffffffffff90911681526020016104bf565b348015610a7b57600080fd5b50606461050a565b348015610a8f57600080fd5b5061050a610a9e366004616515565b612005565b348015610aaf57600080fd5b5061050a61201c565b348015610ac457600080fd5b50610446610ad336600461611c565b612049565b348015610ae457600080fd5b5061050a610af3366004615c39565b6120d1565b348015610b0457600080fd5b50610446610b1336600461656d565b61216d565b348015610b2457600080fd5b5060005462010000900460ff166104e8565b348015610b4257600080fd5b5061050a6128b2565b348015610b5757600080fd5b50610610610b663660046165cc565b63bc197c8160e01b95945050505050565b348015610b8357600080fd5b5061050a610b92366004615c39565b6128be565b348015610ba357600080fd5b506102c2546104e89060ff1681565b610446610bc036600461665f565b6128c9565b348015610bd157600080fd5b5061050a610be036600461608d565b6129d9565b348015610bf157600080fd5b50610446610c003660046166a2565b612a13565b348015610c1157600080fd5b5061022b546001600160a01b03166105cd565b348015610c3057600080fd5b5061050a610c3f3660046166cb565b612a9b565b348015610c5057600080fd5b5060408051808201909152601a81527f737570706f72743d627261766f2671756f72756d3d627261766f0000000000006020820152610582565b348015610c9657600080fd5b50610446610ca5366004615c39565b612b22565b348015610cb657600080fd5b5061050a7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610cea57600080fd5b50610d79610cf93660046162db565b60408051606081018252600080825260208201819052918101919091525060009182526101c6602090815260408084206001600160a01b0393909316845260089092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b0316908201526060016104bf565b348015610db557600080fd5b50610446610dc4366004615c39565b612b45565b348015610dd557600080fd5b5061050a610de436600461676c565b612bcd565b348015610df557600080fd5b50610446610e04366004615c39565b612bee565b348015610e1557600080fd5b50610610610e24366004616798565b63f23a6e6160e01b95945050505050565b348015610e4157600080fd5b5061050a610e50366004615c39565b612c76565b348015610e6157600080fd5b506101f8546105cd906001600160a01b031681565b610446610e84366004615c39565b612d05565b6000610e9e61022b546001600160a01b031690565b905090565b8060008080808080808080610eb78a6120d1565b60008c815261016360205260409020549098506001600160401b03169650610ede8b6128be565b60008c81526101c66020526040812080546005820154600683015460078401546001600160a01b039093169e50949a509850929650919450610f1f8d611721565b90506002816007811115610f3557610f3561629d565b1493506007816007811115610f4c57610f4c61629d565b14925050509193959799509193959799565b6000610f6982612d28565b92915050565b60008061101361100b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610fab929190616800565b60405180910390208b80519060200120604051602001610ff0959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120612d4d565b868686612d7a565b90506110598a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d9250612d98915050565b9a9950505050505050505050565b600054630100000090046001600160a01b03163314611099576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff166110c257604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6110ff610e89565b6001600160a01b0316336001600160a01b03161461112f5760405162461bcd60e51b815260040161043d90616810565b30611138610e89565b6001600160a01b0316146111765760008036604051611158929190616800565b604051809103902090505b8061116f610164612e01565b0361116357505b61117f81612e80565b50565b6060610162805461119290616847565b80601f01602080910402602001604051908101604052809291908181526020018280546111be90616847565b801561120b5780601f106111e05761010080835404028352916020019161120b565b820191906000526020600020905b8154815290600101906020018083116111ee57829003601f168201915b5050505050905090565b6000805462010000900460ff161561124057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156112715760405163b1d02c3d60e01b815260040160405180910390fd5b60005b85518110156112ea576102c1600087838151811061129457611294616881565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166112d857604051630b094f2760e31b815260040160405180910390fd5b806112e2816168ad565b915050611274565b506112f785858585612ff1565b95945050505050565b6000610e9e600161130f611f91565b61131991906168c6565b65ffffffffffff16612c76565b600080611335868686866129d9565b9050600061134282611721565b905060048160078111156113585761135861629d565b1480611375575060058160078111156113735761137361629d565b145b6113915760405162461bcd60e51b815260040161043d906168ec565b6000828152610163602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906113e09084815260200190565b60405180910390a16113f582888888886131f6565b6114028288888888613297565b61140f8288888888613379565b5095945050505050565b60608060608060006101c660008781526020019081526020016000209050806001018160020182600301836004018380548060200260200160405190810160405280929190818152602001828054801561149c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161147e575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156114ee57602002820191906000526020600020905b8154815260200190600101908083116114da575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156115c257838290600052602060002001805461153590616847565b80601f016020809104026020016040519081016040528092919081815260200182805461156190616847565b80156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505081526020019060010190611516565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561169557838290600052602060002001805461160890616847565b80601f016020809104026020016040519081016040528092919081815260200182805461163490616847565b80156116815780601f1061165657610100808354040283529160200191611681565b820191906000526020600020905b81548152906001019060200180831161166457829003601f168201915b5050505050815260200190600101906115e9565b5050505090509450945094509450509193509193565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906116f99061100b90608001610ff0565b9050611716878288604051806020016040528060008152506133b4565b979650505050505050565b6000610f69826133d7565b60008060008061173b85613524565b935093509350935061174f848484846117d8565b505050505050565b600054630100000090046001600160a01b03163314611789576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60006112f7858585856137b5565b600054630100000090046001600160a01b03163314611818576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b6101f85460408051634bf5d7e960e01b815290516060926001600160a01b031691634bf5d7e99160048083019260009291908290030181865afa9250505080156118cd57506040513d6000823e601f3d908101601f191682016040526118ca919081019061692d565b60015b611909575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b60008033905061192f848285604051806020016040528060008152506133b4565b949350505050565b60008033905061171687828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250612d98915050565b61025e5460009080820361199a57505061025d54919050565b600061025e6119aa60018461699a565b815481106119ba576119ba616881565b60009182526020918290206040805180820190915291015463ffffffff8116808352600160201b9091046001600160e01b03169282019290925291508410611a1057602001516001600160e01b03169392505050565b611a25611a1c85613880565b61025e906138e9565b6001600160e01b0316949350505050565b611a3e610e89565b6001600160a01b0316336001600160a01b031614611a6e5760405162461bcd60e51b815260040161043d90616810565b30611a77610e89565b6001600160a01b031614611ab55760008036604051611a97929190616800565b604051809103902090505b80611aae610164612e01565b03611aa257505b61117f8161399c565b600080339050611b0686828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133b492505050565b9695505050505050565b6000805462010000900460ff1615611b3b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615611b6c5760405163b1d02c3d60e01b815260040160405180910390fd5b611b746139df565b3360009081526102c360205260409020548015611be9576000611b9682611721565b90506001816007811115611bac57611bac61629d565b1480611bc957506000816007811115611bc757611bc761629d565b145b15611be75760405163867f3ee560e01b815260040160405180910390fd5b505b825160208401206000611bfe888888856129d9565b3360009081526102c3602052604090208190559050611c1f88888888613a8a565b98975050505050505050565b600054610100900460ff1615808015611c4b5750600054600160ff909116105b80611c655750303b158015611c65575060005460ff166001145b611cc85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161043d565b6000805460ff191660011790558015611ceb576000805461ff0019166101001790555b334114611d0b5760405163022d8c9560e31b815260040160405180910390fd5b3a15611d2a576040516383f1b1d360e01b815260040160405180910390fd5b611d566040518060400160405280600b81526020016a2129a1a3b7bb32b93737b960a91b815250613af2565b611d82611d65600360006169c3565b611d73600362093a806169c3565b680ad78ebc5ac6200000613b49565b611d8a613b80565b611d95612005613ba7565b611da0612006613bd7565b611daa600a613c07565b611dc0611dbb6003620151806169c3565b613c37565b6110076000526102c16020527f2f832952f0ef896b8c8edd6d16a2e4f2591a90375e33021e3b9ff197f3793fc0805460ff19166001179055611e157308e68ec70fa3b629784fdb28887e206ce8561e08613c67565b801561117f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b600054630100000090046001600160a01b03163314611e8f576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1615611eb957604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6000606080600080600060606098546000801b148015611f135750609954155b611f575760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161043d565b611f5f613cba565b611f67613cc9565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6101f854604080516324776b7d60e21b815290516000926001600160a01b0316916391ddadf49160048083019260209291908290030181865afa925050508015611ff8575060408051601f3d908101601f19168201909252611ff5918101906169e5565b60015b61190957610e9e43613cd8565b6000612012848484613d3f565b90505b9392505050565b61025e54600090156120415761203361025e613db6565b6001600160e01b0316905090565b5061025d5490565b612051610e89565b6001600160a01b0316336001600160a01b0316146120815760405162461bcd60e51b815260040161043d90616810565b3061208a610e89565b6001600160a01b0316146120c857600080366040516120aa929190616800565b604051809103902090505b806120c1610164612e01565b036120b557505b61117f81613de6565b61022b54600082815261022c602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa158015612130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121549190616a0d565b9050806001146121645780612015565b60009392505050565b336110071461219357604051630f22c43960e41b8152611007600482015260240161043d565b6121f96040518060400160405280600b81526020016a766f74696e6744656c617960a81b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e519050565b156122ae57602081146122275783838383604051630a5a604160e01b815260040161043d9493929190616a4f565b604080516020601f8401819004810282018101909252828152600091612268918585808385018382808284376000920191909152509293925050613eaa9050565b905080158061227957506201518081115b1561229f5784848484604051630a5a604160e01b815260040161043d9493929190616a4f565b6122a88161399c565b5061286f565b6123156040518060400160405280600c81526020016b1d9bdd1a5b99d4195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e519050565b156123c457602081146123435783838383604051630a5a604160e01b815260040161043d9493929190616a4f565b604080516020601f8401819004810282018101909252828152600091612384918585808385018382808284376000920191909152509293925050613eaa9050565b9050801580612395575062278d0081115b156123bb5784848484604051630a5a604160e01b815260040161043d9493929190616a4f565b6122a881613eaf565b612430604051806040016040528060118152602001701c1c9bdc1bdcd85b151a1c995cda1bdb19607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e519050565b156124e6576020811461245e5783838383604051630a5a604160e01b815260040161043d9493929190616a4f565b604080516020601f840181900481028201810190925282815260009161249f918585808385018382808284376000920191909152509293925050613eaa9050565b90508015806124b7575069021e19e0c9bab240000081115b156124dd5784848484604051630a5a604160e01b815260040161043d9493929190616a4f565b6122a881613f52565b6125506040518060400160405280600f81526020016e38bab7b93ab6a73ab6b2b930ba37b960891b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e519050565b156125ff576020811461257e5783838383604051630a5a604160e01b815260040161043d9493929190616a4f565b604080516020601f84018190048102820181019092528281526000916125bf918585808385018382808284376000920191909152509293925050613eaa9050565b905060058110806125d05750601481115b156125f65784848484604051630a5a604160e01b815260040161043d9493929190616a4f565b6122a881612e80565b61266e604051806040016040528060148152602001736d696e506572696f64416674657251756f72756d60601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e519050565b15612734576008811461269c5783838383604051630a5a604160e01b815260040161043d9493929190616a4f565b60006126e2600884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613eaa9050565b90506001600160401b038116158061270557506202a300816001600160401b0316115b1561272b5784848484604051630a5a604160e01b815260040161043d9493929190616a4f565b6122a881613f95565b6127a06040518060400160405280601181526020017033b7bb32b93737b9283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e519050565b1561284e57601481146127ce5783838383604051630a5a604160e01b815260040161043d9493929190616a4f565b6000612814601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613eaa9050565b90506001600160a01b0381166128455784848484604051630a5a604160e01b815260040161043d9493929190616a4f565b6122a881614001565b838383836040516325ee20d560e21b815260040161043d9493929190616a4f565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516128a49493929190616a4f565b60405180910390a150505050565b6000610e9e6101965490565b6000610f698261406d565b6128d1610e89565b6001600160a01b0316336001600160a01b0316146129015760405162461bcd60e51b815260040161043d90616810565b3061290a610e89565b6001600160a01b031614612948576000803660405161292a929190616800565b604051809103902090505b80612941610164612e01565b0361293557505b600080856001600160a01b0316858585604051612966929190616800565b60006040518083038185875af1925050503d80600081146129a3576040519150601f19603f3d011682016040523d82523d6000602084013e6129a8565b606091505b50915091506129d08282604051806060016040528060288152602001616eac602891396140ab565b50505050505050565b6000848484846040516020016129f29493929190616a76565b60408051601f19818403018152919052805160209091012095945050505050565b612a1b610e89565b6001600160a01b0316336001600160a01b031614612a4b5760405162461bcd60e51b815260040161043d90616810565b30612a54610e89565b6001600160a01b031614612a925760008036604051612a74929190616800565b604051809103902090505b80612a8b610164612e01565b03612a7f57505b61117f81613f95565b60008251845114612aff5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a20696e76616c6964207369676e61747572656044820152670e640d8cadccee8d60c31b606482015260840161043d565b612b0d3387878787876140c4565b611b068686612b1c8787614182565b85611b10565b600080600080612b3185613524565b935093509350935061174f84848484611215565b612b4d610e89565b6001600160a01b0316336001600160a01b031614612b7d5760405162461bcd60e51b815260040161043d90616810565b30612b86610e89565b6001600160a01b031614612bc45760008036604051612ba6929190616800565b604051809103902090505b80612bbd610164612e01565b03612bb157505b61117f81613eaf565b60006120158383612be960408051602081019091526000815290565b613d3f565b612bf6610e89565b6001600160a01b0316336001600160a01b031614612c265760405162461bcd60e51b815260040161043d90616810565b30612c2f610e89565b6001600160a01b031614612c6d5760008036604051612c4f929190616800565b604051809103902090505b80612c66610164612e01565b03612c5a57505b61117f81613f52565b60006064612c8383611981565b6101f854604051632394e7a360e21b8152600481018690526001600160a01b0390911690638e539e8c90602401602060405180830381865afa158015612ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf19190616a0d565b612cfb9190616ac1565b610f6991906169c3565b600080600080612d1485613524565b935093509350935061174f84848484611326565b60006001600160e01b03198216636e665ced60e01b1480610f695750610f69826142b4565b6000610f69612d5a614350565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000612d8b8787878761435a565b9150915061140f8161441e565b6000805462010000900460ff1615612dc357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615612df45760405163b1d02c3d60e01b815260040160405180910390fd5b611b068686868686614568565b6000612e1c8254600f81810b600160801b909204900b131590565b15612e3a57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b6064811115612f035760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a40161043d565b6000612f0d61201c565b90508015801590612f1f575061025e54155b15612f8457604080518082019091526000815261025e9060208101612f438461466b565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b612fb2612f9f612f92611f91565b65ffffffffffff16613880565b612fa88461466b565b61025e91906146d4565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b600080613000868686866129d9565b9050600461300d82611721565b600781111561301e5761301e61629d565b1461303b5760405162461bcd60e51b815260040161043d906168ec565b61022b546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015613086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130aa9190616a0d565b61022b5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f427906130e5908a908a908a906000908b90600401616ad8565b602060405180830381865afa158015613102573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131269190616a0d565b600083815261022c60205260408082209290925561022b5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb091613173918b918b918b91908b908990600401616b26565b600060405180830381600087803b15801561318d57600080fd5b505af11580156131a1573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426131d39190616b7e565b604080519283526020830191909152015b60405180910390a15095945050505050565b306131ff610e89565b6001600160a01b0316146132905760005b845181101561174f57306001600160a01b031685828151811061323557613235616881565b60200260200101516001600160a01b0316036132805761328083828151811061326057613260616881565b6020026020010151805190602001206101646146ef90919063ffffffff16565b613289816168ad565b9050613210565b5050505050565b60005462010000900460ff16156132c157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156132f25760405163b1d02c3d60e01b815260040160405180910390fd5b60005b845181101561336b576102c1600086838151811061331557613315616881565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1661335957604051630b094f2760e31b815260040160405180910390fd5b80613363816168ad565b9150506132f5565b50613290858585858561472b565b30613382610e89565b6001600160a01b0316146132905761016454600f81810b600160801b909204900b131561329057600061016455613290565b60006112f7858585856133d260408051602081019091526000815290565b612d98565b6000806133e3836147a0565b905060048160078111156133f9576133f961629d565b146134045792915050565b600083815261022c602052604090205480613420575092915050565b61022b54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa15801561346a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348e9190616b91565b1561349d575060079392505050565b61022b54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa1580156134e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350b9190616b91565b1561351a575060059392505050565b5060029392505050565b60608060606000806101c66000878152602001908152602001600020905080600101816002016136f683600301805480602002602001604051908101604052809291908181526020016000905b8282101561361d57838290600052602060002001805461359090616847565b80601f01602080910402602001604051908101604052809291908181526020018280546135bc90616847565b80156136095780601f106135de57610100808354040283529160200191613609565b820191906000526020600020905b8154815290600101906020018083116135ec57829003601f168201915b505050505081526020019060010190613571565b50505060048601805460408051602080840282018101909252828152935060009084015b828210156136ed57838290600052602060002001805461366090616847565b80601f016020809104026020016040519081016040528092919081815260200182805461368c90616847565b80156136d95780601f106136ae576101008083540402835291602001916136d9565b820191906000526020600020905b8154815290600101906020018083116136bc57829003601f168201915b505050505081526020019060010190613641565b50505050614182565b600984015483546040805160208084028201810190925282815291869183018282801561374c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161372e575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561379e57602002820191906000526020600020905b81548152602001906001019080831161378a575b505050505092509450945094509450509193509193565b6000806137c4868686866129d9565b60008181526101c660205260409020549091506001600160a01b03163381148061381857506137f16128b2565b6138168260016137ff611f91565b61380991906168c6565b65ffffffffffff16612bcd565b105b6138745760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a2070726f706f7365722061626f76652074686044820152661c995cda1bdb1960ca1b606482015260840161043d565b611716878787876148d8565b600063ffffffff8211156138e55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161043d565b5090565b815460009081816005811115613946576000613904846148e6565b61390e908561699a565b60008881526020902090915081015463ffffffff908116908716101561393657809150613944565b613941816001616b7e565b92505b505b6000613954878785856149ce565b9050801561398f576139798761396b60018461699a565b600091825260209091200190565b54600160201b90046001600160e01b0316611716565b6000979650505050505050565b6101945460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161019455565b6102c25460ff16613a88576a084595161401484a0000006120056001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5a9190616a0d565b1015613a79576040516311b6707f60e01b815260040160405180910390fd5b6102c2805460ff191660011790555b565b6000613ae633868686516001600160401b03811115613aab57613aab615cd5565b604051908082528060200260200182016040528015613ade57816020015b6060815260200190600190039081613ac95790505b5087876140c4565b6112f785858585614a24565b600054610100900460ff16613b195760405162461bcd60e51b815260040161043d90616bb3565b613b4081613b3b6040805180820190915260018152603160f81b602082015290565b614e03565b61117f81614e52565b600054610100900460ff16613b705760405162461bcd60e51b815260040161043d90616bb3565b613b7b838383614e8a565b505050565b600054610100900460ff16613a885760405162461bcd60e51b815260040161043d90616bb3565b600054610100900460ff16613bce5760405162461bcd60e51b815260040161043d90616bb3565b61117f81614ecc565b600054610100900460ff16613bfe5760405162461bcd60e51b815260040161043d90616bb3565b61117f81614f16565b600054610100900460ff16613c2e5760405162461bcd60e51b815260040161043d90616bb3565b61117f81614f3d565b600054610100900460ff16613c5e5760405162461bcd60e51b815260040161043d90616bb3565b61117f81614f64565b600054610100900460ff16613c8e5760405162461bcd60e51b815260040161043d90616bb3565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6060609a805461119290616847565b6060609b805461119290616847565b600065ffffffffffff8211156138e55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b606482015260840161043d565b6101f854604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613d92573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120129190616a0d565b8054600090801561216457613dd08361396b60018461699a565b54600160201b90046001600160e01b0316612015565b61022b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a161022b80546001600160a01b0319166001600160a01b0392909216919091179055565b600081604051602001613e649190616bfe565b6040516020818303038152906040528051906020012083604051602001613e8b9190616bfe565b6040516020818303038152906040528051906020012014905092915050565b015190565b60008111613f0f5760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b606482015260840161043d565b6101955460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161019555565b6101965460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161019655565b61028f54604080516001600160401b03928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a161028f805467ffffffffffffffff19166001600160401b0392909216919091179055565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60008181526101636020526040812060010154610f69906001600160401b0316600084815261029060205260409020546001600160401b0316614f8b565b606083156140ba575081612015565b6120158383614fa1565b8051602082012060006140e287876140dc8888614182565b856129d9565b60008181526101c6602052604090206009810154919250906141775780546001600160a01b0319166001600160a01b038a16178155875161412c90600183019060208b0190615a70565b50865161414290600283019060208a0190615ad1565b5085516141589060038301906020890190615b0c565b50845161416e9060048301906020880190615b5e565b50600981018390555b505050505050505050565b6060600082516001600160401b0381111561419f5761419f615cd5565b6040519080825280602002602001820160405280156141d257816020015b60608152602001906001900390816141bd5790505b50905060005b81518110156142ac578481815181106141f3576141f3616881565b6020026020010151516000146142635784818151811061421557614215616881565b60200260200101518051906020012084828151811061423657614236616881565b602002602001015160405160200161424f929190616c1a565b60405160208183030381529060405261427e565b83818151811061427557614275616881565b60200260200101515b82828151811061429057614290616881565b6020026020010181905250806142a5906168ad565b90506141d8565b509392505050565b600063288ace0360e11b6318df743f60e31b63bf26d89760e01b6379dd796f60e01b6001600160e01b031986168214806142fa57506001600160e01b0319868116908216145b8061431157506001600160e01b0319868116908516145b8061432c57506001600160e01b03198616630271189760e51b145b80611b0657506301ffc9a760e01b6001600160e01b03198716149695505050505050565b6000610e9e614fcb565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156143915750600090506003614415565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156143e5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661440e57600060019250925050614415565b9150600090505b94509492505050565b60008160048111156144325761443261629d565b0361443a5750565b600181600481111561444e5761444e61629d565b0361449b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161043d565b60028160048111156144af576144af61629d565b036144fc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161043d565b60038160048111156145105761451061629d565b0361117f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161043d565b600080614578878787878761503f565b600088815261029060205260409020549091506001600160401b03161580156145a557506145a587615195565b15611b065760006145bf61028f546001600160401b031690565b6145c7611f91565b65ffffffffffff166145d99190616c4b565b90506145e4886128be565b816001600160401b03161115614633576040516001600160401b038216815288907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b600088815261029060205260409020805467ffffffffffffffff19166001600160401b03929092169190911790559695505050505050565b60006001600160e01b038211156138e55760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161043d565b6000806146e28585856151d5565b915091505b935093915050565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61022b5460405163e38335e560e01b81526001600160a01b039091169063e38335e5903490614767908890889088906000908990600401616ad8565b6000604051808303818588803b15801561478057600080fd5b505af1158015614794573d6000803e3d6000fd5b50505050505050505050565b600081815261016360205260408120600281015460ff16156147c55750600792915050565b6002810154610100900460ff16156147e05750600292915050565b600083815261016360205260408120546001600160401b0316908190036148495760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000604482015260640161043d565b6000614853611f91565b65ffffffffffff16905080821061486f57506000949350505050565b600061487a866128be565b905081811061488f5750600195945050505050565b61489886615195565b80156148bb575060008681526101c6602052604090206006810154600590910154115b156148cc5750600495945050505050565b50600395945050505050565b60006112f785858585615374565b6000816000036148f857506000919050565b600060016149058461542a565b901c6001901b9050600181848161491e5761491e6169ad565b048201901c90506001818481614936576149366169ad565b048201901c9050600181848161494e5761494e6169ad565b048201901c90506001818481614966576149666169ad565b048201901c9050600181848161497e5761497e6169ad565b048201901c90506001818481614996576149966169ad565b048201901c905060018184816149ae576149ae6169ad565b048201901c9050612015818285816149c8576149c86169ad565b046154be565b60005b818310156142ac5760006149e584846154cd565b60008781526020902090915063ffffffff86169082015463ffffffff161115614a1057809250614a1e565b614a1b816001616b7e565b93505b506149d1565b600033614a3181846154e8565b614a7d5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f7365722072657374726963746564000000604482015260640161043d565b6000614a87611f91565b65ffffffffffff169050614a996128b2565b614aa883610de460018561699a565b1015614b105760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b606482015260840161043d565b6000614b2588888888805190602001206129d9565b90508651885114614b485760405162461bcd60e51b815260040161043d90616c6b565b8551885114614b695760405162461bcd60e51b815260040161043d90616c6b565b6000885111614bba5760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000604482015260640161043d565b600081815261016360205260409020546001600160401b031615614c2a5760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b606482015260840161043d565b6000614c366101945490565b614c409084616b7e565b90506000614c4e6101955490565b614c589083616b7e565b90506040518060e00160405280614c6e846155d9565b6001600160401b031681526001600160a01b038716602082015260006040820152606001614c9b836155d9565b6001600160401b03908116825260006020808401829052604080850183905260609485018390528883526101638252918290208551815492870151878501519186166001600160e01b031990941693909317600160401b6001600160a01b039094168402176001600160e01b0316600160e01b60e09290921c91909102178155938501516080860151908416921c0217600183015560a08301516002909201805460c09094015161ffff1990941692151561ff00191692909217610100931515939093029290921790558a517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091859188918e918e91811115614da057614da0615cd5565b604051908082528060200260200182016040528015614dd357816020015b6060815260200190600190039081614dbe5790505b508d88888f604051614ded99989796959493929190616cac565b60405180910390a1509098975050505050505050565b600054610100900460ff16614e2a5760405162461bcd60e51b815260040161043d90616bb3565b609a614e368382616d8a565b50609b614e438282616d8a565b50506000609881905560995550565b600054610100900460ff16614e795760405162461bcd60e51b815260040161043d90616bb3565b610162614e868282616d8a565b5050565b600054610100900460ff16614eb15760405162461bcd60e51b815260040161043d90616bb3565b614eba8361399c565b614ec382613eaf565b613b7b81613f52565b600054610100900460ff16614ef35760405162461bcd60e51b815260040161043d90616bb3565b6101f880546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166120c85760405162461bcd60e51b815260040161043d90616bb3565b600054610100900460ff166111765760405162461bcd60e51b815260040161043d90616bb3565b600054610100900460ff16612a925760405162461bcd60e51b815260040161043d90616bb3565b6000818311614f9a5781612015565b5090919050565b815115614fb15781518083602001fd5b8060405162461bcd60e51b815260040161043d9190615e8e565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614ff6615641565b614ffe61569a565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600085815261016360205260408120600161505988611721565b600781111561506a5761506a61629d565b146150c35760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b606482015260840161043d565b80546000906150dd9088906001600160401b031686613d3f565b90506150ec88888884886156cb565b835160000361514157866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516151349493929190616e49565b60405180910390a2611716565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051615182959493929190616e71565b60405180910390a2979650505050505050565b60008181526101c66020526040812060058101546151cc610e5085600090815261016360205260409020546001600160401b031690565b11159392505050565b82546000908190801561531b5760006151f38761396b60018561699a565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090871610156152745760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b6579730000000000604482015260640161043d565b805163ffffffff8088169116036152bc57846152958861396b60018661699a565b80546001600160e01b0392909216600160201b0263ffffffff90921691909117905561530b565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b6020015192508391506146e79050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b0291909316179201919091559050816146e7565b60008061538386868686615869565b600081815261022c6020526040902054909150156112f75761022b54600082815261022c60205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f5916153df9160040190815260200190565b600060405180830381600087803b1580156153f957600080fd5b505af115801561540d573d6000803e3d6000fd5b505050600082815261022c60205260408120555095945050505050565b600080608083901c1561543f57608092831c92015b604083901c1561545157604092831c92015b602083901c1561546357602092831c92015b601083901c1561547557601092831c92015b600883901c1561548757600892831c92015b600483901c1561549957600492831c92015b600283901c156154ab57600292831c92015b600183901c15610f695760010192915050565b6000818310614f9a5781612015565b60006154dc60028484186169c3565b61201590848416616b7e565b80516000906034811015615500576001915050610f69565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b1461553357600192505050610f69565b60008061554160288561699a565b90505b838110156155b85760008061557888848151811061556457615564616881565b01602001516001600160f81b031916615976565b91509150816155905760019650505050505050610f69565b8060ff166004856001600160a01b0316901b1793505050806155b1906168ad565b9050615544565b50856001600160a01b0316816001600160a01b031614935050505092915050565b60006001600160401b038211156138e55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b606482015260840161043d565b60008061564c613cba565b805190915015615663578051602090910120919050565b60985480156156725792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806156a5613cc9565b8051909150156156bc578051602090910120919050565b60995480156156725792915050565b60008581526101c6602090815260408083206001600160a01b038816845260088101909252909120805460ff161561575b5760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20766f746560448201526c08185b1c9958591e4818d85cdd609a1b606482015260840161043d565b805460ff86166101000261ffff1990911617600117815561577b84615a08565b81546001600160601b039190911662010000026dffffffffffffffffffffffff00001990911617815560ff85166157cb57838260060160008282546157c09190616b7e565b909155506129d09050565b60001960ff8616016157eb57838260050160008282546157c09190616b7e565b60011960ff86160161580b57838260070160008282546157c09190616b7e565b60405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20696e766160448201526c6c696420766f7465207479706560981b606482015260840161043d565b600080615878868686866129d9565b9050600061588582611721565b9050600281600781111561589b5761589b61629d565b141580156158bb575060068160078111156158b8576158b861629d565b14155b80156158d9575060078160078111156158d6576158d661629d565b14155b6159255760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f7420616374697665000000604482015260640161043d565b6000828152610163602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906131e49084815260200190565b60008060f883901c602f811180156159915750603a8160ff16105b156159a657600194602f199091019350915050565b8060ff1660401080156159bc575060478160ff16105b156159d1576001946036199091019350915050565b8060ff1660601080156159e7575060678160ff16105b156159fc576001946056199091019350915050565b50600093849350915050565b60006001600160601b038211156138e55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b606482015260840161043d565b828054828255906000526020600020908101928215615ac5579160200282015b82811115615ac557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615a90565b506138e5929150615bb0565b828054828255906000526020600020908101928215615ac5579160200282015b82811115615ac5578251825591602001919060010190615af1565b828054828255906000526020600020908101928215615b52579160200282015b82811115615b525782518290615b429082616d8a565b5091602001919060010190615b2c565b506138e5929150615bc5565b828054828255906000526020600020908101928215615ba4579160200282015b82811115615ba45782518290615b949082616d8a565b5091602001919060010190615b7e565b506138e5929150615be2565b5b808211156138e55760008155600101615bb1565b808211156138e5576000615bd98282615bff565b50600101615bc5565b808211156138e5576000615bf68282615bff565b50600101615be2565b508054615c0b90616847565b6000825580601f10615c1b575050565b601f01602090049060005260206000209081019061117f9190615bb0565b600060208284031215615c4b57600080fd5b5035919050565b600060208284031215615c6457600080fd5b81356001600160e01b03198116811461201557600080fd5b803560ff8116811461190957600080fd5b60008083601f840112615c9f57600080fd5b5081356001600160401b03811115615cb657600080fd5b602083019150836020828501011115615cce57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615d1357615d13615cd5565b604052919050565b60006001600160401b03821115615d3457615d34615cd5565b50601f01601f191660200190565b600082601f830112615d5357600080fd5b8135615d66615d6182615d1b565b615ceb565b818152846020838601011115615d7b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b031215615db457600080fd5b88359750615dc460208a01615c7c565b965060408901356001600160401b0380821115615de057600080fd5b615dec8c838d01615c8d565b909850965060608b0135915080821115615e0557600080fd5b50615e128b828c01615d42565b945050615e2160808a01615c7c565b925060a0890135915060c089013590509295985092959890939650565b60005b83811015615e59578181015183820152602001615e41565b50506000910152565b60008151808452615e7a816020860160208601615e3e565b601f01601f19169290920160200192915050565b6020815260006120156020830184615e62565b6001600160a01b038116811461117f57600080fd5b60008060008060808587031215615ecc57600080fd5b8435615ed781615ea1565b93506020850135615ee781615ea1565b92506040850135915060608501356001600160401b03811115615f0957600080fd5b615f1587828801615d42565b91505092959194509250565b60006001600160401b03821115615f3a57615f3a615cd5565b5060051b60200190565b600082601f830112615f5557600080fd5b81356020615f65615d6183615f21565b82815260059290921b84018101918181019086841115615f8457600080fd5b8286015b84811015615fa8578035615f9b81615ea1565b8352918301918301615f88565b509695505050505050565b600082601f830112615fc457600080fd5b81356020615fd4615d6183615f21565b82815260059290921b84018101918181019086841115615ff357600080fd5b8286015b84811015615fa85780358352918301918301615ff7565b600082601f83011261601f57600080fd5b8135602061602f615d6183615f21565b82815260059290921b8401810191818101908684111561604e57600080fd5b8286015b84811015615fa85780356001600160401b038111156160715760008081fd5b61607f8986838b0101615d42565b845250918301918301616052565b600080600080608085870312156160a357600080fd5b84356001600160401b03808211156160ba57600080fd5b6160c688838901615f44565b955060208701359150808211156160dc57600080fd5b6160e888838901615fb3565b945060408701359150808211156160fe57600080fd5b5061610b8782880161600e565b949793965093946060013593505050565b60006020828403121561612e57600080fd5b813561201581615ea1565b600081518084526020808501945080840160005b838110156161725781516001600160a01b03168752958201959082019060010161614d565b509495945050505050565b600081518084526020808501945080840160005b8381101561617257815187529582019590820190600101616191565b600081518084526020808501808196508360051b8101915082860160005b858110156161f55782840389526161e3848351615e62565b988501989350908401906001016161cb565b5091979650505050505050565b6080815260006162156080830187616139565b8281036020840152616227818761617d565b9050828103604084015261623b81866161ad565b9050828103606084015261171681856161ad565b600080600080600060a0868803121561626757600080fd5b8535945061627760208701615c7c565b935061628560408701615c7c565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106162d557634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156162ee57600080fd5b82359150602083013561630081615ea1565b809150509250929050565b6000806040838503121561631e57600080fd5b8235915061632e60208401615c7c565b90509250929050565b60008060008060006080868803121561634f57600080fd5b8535945061635f60208701615c7c565b935060408601356001600160401b038082111561637b57600080fd5b61638789838a01615c8d565b909550935060608801359150808211156163a057600080fd5b506163ad88828901615d42565b9150509295509295909350565b600080600080606085870312156163d057600080fd5b843593506163e060208601615c7c565b925060408501356001600160401b038111156163fb57600080fd5b61640787828801615c8d565b95989497509550505050565b6000806000806080858703121561642957600080fd5b84356001600160401b038082111561644057600080fd5b61644c88838901615f44565b9550602087013591508082111561646257600080fd5b61646e88838901615fb3565b9450604087013591508082111561648457600080fd5b6164908883890161600e565b935060608701359150808211156164a657600080fd5b50615f1587828801615d42565b60ff60f81b8816815260e0602082015260006164d260e0830189615e62565b82810360408401526164e48189615e62565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501529050611059818561617d565b60008060006060848603121561652a57600080fd5b833561653581615ea1565b92506020840135915060408401356001600160401b0381111561655757600080fd5b61656386828701615d42565b9150509250925092565b6000806000806040858703121561658357600080fd5b84356001600160401b038082111561659a57600080fd5b6165a688838901615c8d565b909650945060208701359150808211156165bf57600080fd5b5061640787828801615c8d565b600080600080600060a086880312156165e457600080fd5b85356165ef81615ea1565b945060208601356165ff81615ea1565b935060408601356001600160401b038082111561661b57600080fd5b61662789838a01615fb3565b9450606088013591508082111561663d57600080fd5b61664989838a01615fb3565b935060808801359150808211156163a057600080fd5b6000806000806060858703121561667557600080fd5b843561668081615ea1565b93506020850135925060408501356001600160401b038111156163fb57600080fd5b6000602082840312156166b457600080fd5b81356001600160401b038116811461201557600080fd5b600080600080600060a086880312156166e357600080fd5b85356001600160401b03808211156166fa57600080fd5b61670689838a01615f44565b9650602088013591508082111561671c57600080fd5b61672889838a01615fb3565b9550604088013591508082111561673e57600080fd5b61674a89838a0161600e565b9450606088013591508082111561676057600080fd5b61664989838a0161600e565b6000806040838503121561677f57600080fd5b823561678a81615ea1565b946020939093013593505050565b600080600080600060a086880312156167b057600080fd5b85356167bb81615ea1565b945060208601356167cb81615ea1565b9350604086013592506060860135915060808601356001600160401b038111156167f457600080fd5b6163ad88828901615d42565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c9082168061685b57607f821691505b60208210810361687b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016168bf576168bf616897565b5060010190565b65ffffffffffff8281168282160390808211156168e5576168e5616897565b5092915050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b60006020828403121561693f57600080fd5b81516001600160401b0381111561695557600080fd5b8201601f8101841361696657600080fd5b8051616974615d6182615d1b565b81815285602083850101111561698957600080fd5b6112f7826020830160208601615e3e565b81810381811115610f6957610f69616897565b634e487b7160e01b600052601260045260246000fd5b6000826169e057634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156169f757600080fd5b815165ffffffffffff8116811461201557600080fd5b600060208284031215616a1f57600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000616a63604083018688616a26565b8281036020840152611716818587616a26565b608081526000616a896080830187616139565b8281036020840152616a9b818761617d565b90508281036040840152616aaf81866161ad565b91505082606083015295945050505050565b8082028115828204841417610f6957610f69616897565b60a081526000616aeb60a0830188616139565b8281036020840152616afd818861617d565b90508281036040840152616b1181876161ad565b60608401959095525050608001529392505050565b60c081526000616b3960c0830189616139565b8281036020840152616b4b818961617d565b90508281036040840152616b5f81886161ad565b60608401969096525050608081019290925260a0909101529392505050565b80820180821115610f6957610f69616897565b600060208284031215616ba357600080fd5b8151801515811461201557600080fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251616c10818460208701615e3e565b9190910192915050565b6001600160e01b0319831681528151600090616c3d816004850160208701615e3e565b919091016004019392505050565b6001600160401b038181168382160190808211156168e5576168e5616897565b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b8981526001600160a01b038916602082015261012060408201819052600090616cd78382018b616139565b90508281036060840152616ceb818a61617d565b90508281036080840152616cff81896161ad565b905082810360a0840152616d1381886161ad565b90508560c08401528460e0840152828103610100840152616d348185615e62565b9c9b505050505050505050505050565b601f821115613b7b57600081815260208120601f850160051c81016020861015616d6b5750805b601f850160051c820191505b8181101561174f57828155600101616d77565b81516001600160401b03811115616da357616da3615cd5565b616db781616db18454616847565b84616d44565b602080601f831160018114616dec5760008415616dd45750858301515b600019600386901b1c1916600185901b17855561174f565b600085815260208120601f198616915b82811015616e1b57888601518255948401946001909101908401616dfc565b5085821015616e395787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b84815260ff84166020820152826040820152608060608201526000611b066080830184615e62565b85815260ff8516602082015283604082015260a060608201526000616e9960a0830185615e62565b8281036080840152611c1f8185615e6256fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765a164736f6c6343000811000a" }, "0x0000000000000000000000000000000000002005": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a5780639ab24eb0116100ad578063d505accf1161007c578063d505accf1461049d578063dd62ed3e146104b0578063e5ed5b1e146104c3578063f1127ed8146104d6578063f1fad1041461051357600080fd5b80639ab24eb014610451578063a457c2d714610464578063a9059cbb14610477578063c3cda5201461048a57600080fd5b806384b0196e116100e957806384b0196e146103fc5780638e539e8c1461041757806391ddadf41461042a57806395d89b411461044957600080fd5b806370a08231146103aa57806379cc6790146103d35780637ecebe00146103e15780638129fc1c146103f457600080fd5b8063395093511161019d5780634bf5d7e91161016c5780634bf5d7e91461031b5780634bf6c88214610323578063587cde1e1461032b5780635c19a95c1461036f5780636fcfff451461038257600080fd5b806339509351146102cf5780633a46b1a8146102e257806342966c68146102f5578063448407751461030857600080fd5b806323b872dd116101d957806323b872dd1461028a5780633041949b1461029d578063313ce567146102b25780633644e515146102c757600080fd5b8063039c91fc1461020b57806306fdde031461024a578063095ea7b31461025f57806318160ddd14610282575b600080fd5b6102376102193660046120c7565b61013060209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61025261051b565b6040516102419190612140565b61027261026d366004612153565b6105ad565b6040519015158152602001610241565b603554610237565b61027261029836600461217d565b6105c7565b6102b06102ab3660046120c7565b6105eb565b005b60125b60405160ff9091168152602001610241565b610237610624565b6102726102dd366004612153565b610633565b6102376102f0366004612153565b610655565b6102b06103033660046121b9565b6106da565b6102b06103163660046121d2565b6106f3565b61025261076c565b6102b5600881565b610357610339366004612256565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b039091168152602001610241565b6102b061037d366004612256565b610804565b610395610390366004612256565b610811565b60405163ffffffff9091168152602001610241565b6102376103b8366004612256565b6001600160a01b031660009081526033602052604090205490565b6102b0610303366004612153565b6102376103ef366004612256565b610833565b6102b0610851565b610404610a31565b6040516102419796959493929190612271565b6102376104253660046121b9565b610acf565b610432610b37565b60405165ffffffffffff9091168152602001610241565b610252610b42565b61023761045f366004612256565b610b51565b610272610472366004612153565b610bd3565b610272610485366004612153565b610c4e565b6102b0610498366004612318565b610c5c565b6102b06104ab366004612370565b610d92565b6102376104be3660046120c7565b610ef6565b6102b06104d13660046120c7565b610f21565b6104e96104e43660046123da565b610f51565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610241565b6102b5601181565b60606036805461052a9061241a565b80601f01602080910402602001604051908101604052809291908181526020018280546105569061241a565b80156105a35780601f10610578576101008083540402835291602001916105a3565b820191906000526020600020905b81548152906001019060200180831161058657829003601f168201915b5050505050905090565b6000336105bb818585610fd5565b60019150505b92915050565b6000336105d5858285610fee565b6105e0858585611068565b506001949350505050565b336120021461061657604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b6106208282611081565b5050565b600061062e6111b1565b905090565b6000336105bb8185856106468383610ef6565b6106509190612464565b610fd5565b600061065f610b37565b65ffffffffffff1682106106b15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b604482015260640161060d565b6001600160a01b038316600090815260ff602052604090206106d390836111bb565b9392505050565b60405163e5d8776760e01b815260040160405180910390fd5b336120021461071957604051630f22c43960e41b8152612002600482015260240161060d565b8160005b818110156107655761075585858381811061073a5761073a612477565b905060200201602081019061074f9190612256565b84611081565b61075e8161248d565b905061071d565b5050505050565b606043610777610b37565b65ffffffffffff16146107cc5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f6465000000604482015260640161060d565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b61080e33826112a4565b50565b6001600160a01b038116600090815260ff60205260408120546105c19061131e565b6001600160a01b038116600090815260cb60205260408120546105c1565b600054610100900460ff16158080156108715750600054600160ff909116105b8061088b5750303b15801561088b575060005460ff166001145b6108ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161060d565b6000805460ff191660011790558015610911576000805461ff0019166101001790555b3341146109315760405163022d8c9560e31b815260040160405180910390fd5b3a15610950576040516383f1b1d360e01b815260040160405180910390fd5b6109a4604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506040518060400160405280600681526020016533b7bb21272160d11b815250611387565b6109ac6113b8565b6109e1604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506113e1565b6109e96113b8565b801561080e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000606080600080600060606097546000801b148015610a515750609854155b610a955760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161060d565b610a9d61142b565b610aa561143a565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610ad9610b37565b65ffffffffffff168210610b2b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b604482015260640161060d565b6105c1610100836111bb565b600061062e43611449565b60606037805461052a9061241a565b6001600160a01b038116600090815260ff60205260408120548015610bc0576001600160a01b038316600090815260ff6020526040902080546000198301908110610b9e57610b9e612477565b60009182526020909120015464010000000090046001600160e01b0316610bc3565b60005b6001600160e01b03169392505050565b60003381610be18286610ef6565b905083811015610c415760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161060d565b6105e08286868403610fd5565b6000336105bb818585611068565b83421115610cac5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161060d565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610d2690610d1e9060a001604051602081830303815290604052805190602001206114b0565b8585856114dd565b9050610d3181611505565b8614610d7f5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161060d565b610d8981886112a4565b50505050505050565b83421115610de25760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161060d565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e118c611505565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610e6c826114b0565b90506000610e7c828787876114dd565b9050896001600160a01b0316816001600160a01b031614610edf5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161060d565b610eea8a8a8a610fd5565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3361200214610f4757604051630f22c43960e41b8152612002600482015260240161060d565b61062082826112a4565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110610f9557610f95612477565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b604051632028747160e01b815260040160405180910390fd5b6000610ffa8484610ef6565b9050600019811461106257818110156110555760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161060d565b6110628484848403610fd5565b50505050565b604051638cd22d1960e01b815260040160405180910390fd5b604051630913db4760e01b81526001600160a01b03828116600483015260009190841690630913db4790602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef91906124bc565b6001600160a01b03808516600090815261013060209081526040808320938716835292905220549091508181101561116857600061112d82846124d5565b6001600160a01b038087166000908152610130602090815260408083209389168352929052208490559050611162848261152d565b50611062565b8181111561106257600061117c83836124d5565b6001600160a01b0380871660009081526101306020908152604080832093891683529290522084905590506107658482611537565b600061062e611541565b8154600090818160058111156112155760006111d6846115b5565b6111e090856124d5565b600088815260209020909150869082015463ffffffff16111561120557809150611213565b611210816001612464565b92505b505b80821015611262576000611229838361169d565b600088815260209020909150869082015463ffffffff16111561124e5780915061125c565b611259816001612464565b92505b50611215565b801561128e576000868152602090208101600019015464010000000090046001600160e01b0316611291565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546033845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46110628284836116b8565b600063ffffffff8211156113835760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161060d565b5090565b600054610100900460ff166113ae5760405162461bcd60e51b815260040161060d906124e8565b61062082826117f6565b600054610100900460ff166113df5760405162461bcd60e51b815260040161060d906124e8565b565b600054610100900460ff166114085760405162461bcd60e51b815260040161060d906124e8565b61080e81604051806040016040528060018152602001603160f81b815250611836565b60606099805461052a9061241a565b6060609a805461052a9061241a565b600065ffffffffffff8211156113835760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b606482015260840161060d565b60006105c16114bd6111b1565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006114ee87878787611885565b915091506114fb81611949565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6106208282611a93565b6106208282611b1e565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61156c611b37565b611574611b90565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036115c757506000919050565b600060016115d484611bc1565b901c6001901b905060018184816115ed576115ed612533565b048201901c9050600181848161160557611605612533565b048201901c9050600181848161161d5761161d612533565b048201901c9050600181848161163557611635612533565b048201901c9050600181848161164d5761164d612533565b048201901c9050600181848161166557611665612533565b048201901c9050600181848161167d5761167d612533565b048201901c90506106d38182858161169757611697612533565b04611c55565b60006116ac6002848418612549565b6106d390848416612464565b816001600160a01b0316836001600160a01b0316141580156116da5750600081115b156117f1576001600160a01b03831615611768576001600160a01b038316600090815260ff60205260408120819061171590611c6b85611c77565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161175d929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156117f1576001600160a01b038216600090815260ff60205260408120819061179e90611dec85611c77565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117e6929190918252602082015260400190565b60405180910390a250505b505050565b600054610100900460ff1661181d5760405162461bcd60e51b815260040161060d906124e8565b603661182983826125b9565b5060376117f182826125b9565b600054610100900460ff1661185d5760405162461bcd60e51b815260040161060d906124e8565b609961186983826125b9565b50609a61187682826125b9565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118bc5750600090506003611940565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611910573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661193957600060019250925050611940565b9150600090505b94509492505050565b600081600481111561195d5761195d612679565b036119655750565b600181600481111561197957611979612679565b036119c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161060d565b60028160048111156119da576119da612679565b03611a275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161060d565b6003816004811115611a3b57611a3b612679565b0361080e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161060d565b611a9d8282611df8565b6035546001600160e01b031015611b0f5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161060d565b611062610100611dec83611c77565b611b288282611ec1565b611062610100611c6b83611c77565b600080611b4261142b565b805190915015611b59578051602090910120919050565b6097548015611b685792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611b9b61143a565b805190915015611bb2578051602090910120919050565b6098548015611b685792915050565b600080608083901c15611bd657608092831c92015b604083901c15611be857604092831c92015b602083901c15611bfa57602092831c92015b601083901c15611c0c57601092831c92015b600883901c15611c1e57600892831c92015b600483901c15611c3057600492831c92015b600283901c15611c4257600292831c92015b600183901c156105c15760010192915050565b6000818310611c6457816106d3565b5090919050565b60006106d382846124d5565b82546000908190818115611cc45760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611cd9565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350611cf984868863ffffffff16565b9250600082118015611d235750611d0e610b37565b65ffffffffffff16816000015163ffffffff16145b15611d6857611d3183611ffc565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611de2565b866040518060400160405280611d8c611d7f610b37565b65ffffffffffff1661131e565b63ffffffff168152602001611da086611ffc565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b60006106d38284612464565b6001600160a01b038216611e4e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161060d565b8060356000828254611e609190612464565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361062060008383612065565b6001600160a01b038216611f215760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161060d565b6001600160a01b03821660009081526033602052604090205481811015611f955760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161060d565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36117f183600084612065565b60006001600160e01b038211156113835760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161060d565b6117f18383836001600160a01b03808416600090815260fe60205260409020546117f191166001600160a01b03808516600090815260fe602052604090205416836116b8565b80356001600160a01b03811681146120c257600080fd5b919050565b600080604083850312156120da57600080fd5b6120e3836120ab565b91506120f1602084016120ab565b90509250929050565b6000815180845260005b8181101561212057602081850181015186830182015201612104565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106d360208301846120fa565b6000806040838503121561216657600080fd5b61216f836120ab565b946020939093013593505050565b60008060006060848603121561219257600080fd5b61219b846120ab565b92506121a9602085016120ab565b9150604084013590509250925092565b6000602082840312156121cb57600080fd5b5035919050565b6000806000604084860312156121e757600080fd5b833567ffffffffffffffff808211156121ff57600080fd5b818601915086601f83011261221357600080fd5b81358181111561222257600080fd5b8760208260051b850101111561223757600080fd5b60209283019550935061224d91860190506120ab565b90509250925092565b60006020828403121561226857600080fd5b6106d3826120ab565b60ff60f81b881681526000602060e08184015261229160e084018a6120fa565b83810360408501526122a3818a6120fa565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156122f5578351835292840192918401916001016122d9565b50909c9b505050505050505050505050565b803560ff811681146120c257600080fd5b60008060008060008060c0878903121561233157600080fd5b61233a876120ab565b9550602087013594506040870135935061235660608801612307565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561238b57600080fd5b612394886120ab565b96506123a2602089016120ab565b955060408801359450606088013593506123be60808901612307565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156123ed57600080fd5b6123f6836120ab565b9150602083013563ffffffff8116811461240f57600080fd5b809150509250929050565b600181811c9082168061242e57607f821691505b60208210810361152757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156105c1576105c161244e565b634e487b7160e01b600052603260045260246000fd5b60006001820161249f5761249f61244e565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156124ce57600080fd5b5051919050565b818103818111156105c1576105c161244e565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261256657634e487b7160e01b600052601260045260246000fd5b500490565b601f8211156117f157600081815260208120601f850160051c810160208610156125925750805b601f850160051c820191505b818110156125b15782815560010161259e565b505050505050565b815167ffffffffffffffff8111156125d3576125d36124a6565b6125e7816125e1845461241a565b8461256b565b602080601f83116001811461261c57600084156126045750858301515b600019600386901b1c1916600185901b1785556125b1565b600085815260208120601f198616915b8281101561264b5788860151825594840194600190910190840161262c565b50858210156126695787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea164736f6c6343000811000a" + "code": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f5780639ab24eb0116100a2578063d505accf11610071578063d505accf14610479578063dd62ed3e1461048c578063e5ed5b1e1461049f578063f1127ed8146104b257600080fd5b80639ab24eb01461042d578063a457c2d714610440578063a9059cbb14610453578063c3cda5201461046657600080fd5b806384b0196e116100de57806384b0196e146103d85780638e539e8c146103f357806391ddadf41461040657806395d89b411461042557600080fd5b806370a082311461038657806379cc6790146103af5780637ecebe00146103bd5780638129fc1c146103d057600080fd5b806339509351116101875780634bf5d7e9116101565780634bf5d7e9146102ff578063587cde1e146103075780635c19a95c1461034b5780636fcfff451461035e57600080fd5b806339509351146102b35780633a46b1a8146102c657806342966c68146102d957806344840775146102ec57600080fd5b806323b872dd116101c357806323b872dd146102745780633041949b14610287578063313ce5671461029c5780633644e515146102ab57600080fd5b8063039c91fc146101f557806306fdde0314610234578063095ea7b31461024957806318160ddd1461026c575b600080fd5b61022161020336600461209b565b61013060209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61023c6104ef565b60405161022b9190612114565b61025c610257366004612127565b610581565b604051901515815260200161022b565b603554610221565b61025c610282366004612151565b61059b565b61029a61029536600461209b565b6105bf565b005b6040516012815260200161022b565b6102216105f8565b61025c6102c1366004612127565b610607565b6102216102d4366004612127565b610629565b61029a6102e736600461218d565b6106ae565b61029a6102fa3660046121a6565b6106c7565b61023c610740565b61033361031536600461222a565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b03909116815260200161022b565b61029a61035936600461222a565b6107d8565b61037161036c36600461222a565b6107e5565b60405163ffffffff909116815260200161022b565b61022161039436600461222a565b6001600160a01b031660009081526033602052604090205490565b61029a6102e7366004612127565b6102216103cb36600461222a565b610807565b61029a610825565b6103e0610a05565b60405161022b9796959493929190612245565b61022161040136600461218d565b610aa3565b61040e610b0b565b60405165ffffffffffff909116815260200161022b565b61023c610b16565b61022161043b36600461222a565b610b25565b61025c61044e366004612127565b610ba7565b61025c610461366004612127565b610c22565b61029a6104743660046122ec565b610c30565b61029a610487366004612344565b610d66565b61022161049a36600461209b565b610eca565b61029a6104ad36600461209b565b610ef5565b6104c56104c03660046123ae565b610f25565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161022b565b6060603680546104fe906123ee565b80601f016020809104026020016040519081016040528092919081815260200182805461052a906123ee565b80156105775780601f1061054c57610100808354040283529160200191610577565b820191906000526020600020905b81548152906001019060200180831161055a57829003601f168201915b5050505050905090565b60003361058f818585610fa9565b60019150505b92915050565b6000336105a9858285610fc2565b6105b485858561103c565b506001949350505050565b33612002146105ea57604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b6105f48282611055565b5050565b6000610602611185565b905090565b60003361058f81858561061a8383610eca565b6106249190612438565b610fa9565b6000610633610b0b565b65ffffffffffff1682106106855760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016105e1565b6001600160a01b038316600090815260ff602052604090206106a7908361118f565b9392505050565b60405163e5d8776760e01b815260040160405180910390fd5b33612002146106ed57604051630f22c43960e41b815261200260048201526024016105e1565b8160005b818110156107395761072985858381811061070e5761070e61244b565b9050602002016020810190610723919061222a565b84611055565b61073281612461565b90506106f1565b5050505050565b60604361074b610b0b565b65ffffffffffff16146107a05760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f646500000060448201526064016105e1565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6107e23382611278565b50565b6001600160a01b038116600090815260ff6020526040812054610595906112f2565b6001600160a01b038116600090815260cb6020526040812054610595565b600054610100900460ff16158080156108455750600054600160ff909116105b8061085f5750303b15801561085f575060005460ff166001145b6108c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105e1565b6000805460ff1916600117905580156108e5576000805461ff0019166101001790555b3341146109055760405163022d8c9560e31b815260040160405180910390fd5b3a15610924576040516383f1b1d360e01b815260040160405180910390fd5b610978604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506040518060400160405280600681526020016533b7bb21272160d11b81525061135b565b61098061138c565b6109b5604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506113b5565b6109bd61138c565b80156107e2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000606080600080600060606097546000801b148015610a255750609854155b610a695760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016105e1565b610a716113ff565b610a7961140e565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610aad610b0b565b65ffffffffffff168210610aff5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016105e1565b6105956101008361118f565b60006106024361141d565b6060603780546104fe906123ee565b6001600160a01b038116600090815260ff60205260408120548015610b94576001600160a01b038316600090815260ff6020526040902080546000198301908110610b7257610b7261244b565b60009182526020909120015464010000000090046001600160e01b0316610b97565b60005b6001600160e01b03169392505050565b60003381610bb58286610eca565b905083811015610c155760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105e1565b6105b48286868403610fa9565b60003361058f81858561103c565b83421115610c805760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016105e1565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610cfa90610cf29060a00160405160208183030381529060405280519060200120611484565b8585856114b1565b9050610d05816114d9565b8614610d535760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016105e1565b610d5d8188611278565b50505050505050565b83421115610db65760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016105e1565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610de58c6114d9565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610e4082611484565b90506000610e50828787876114b1565b9050896001600160a01b0316816001600160a01b031614610eb35760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016105e1565b610ebe8a8a8a610fa9565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3361200214610f1b57604051630f22c43960e41b815261200260048201526024016105e1565b6105f48282611278565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110610f6957610f6961244b565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b604051632028747160e01b815260040160405180910390fd5b6000610fce8484610eca565b9050600019811461103657818110156110295760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105e1565b6110368484848403610fa9565b50505050565b604051638cd22d1960e01b815260040160405180910390fd5b604051630913db4760e01b81526001600160a01b03828116600483015260009190841690630913db4790602401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190612490565b6001600160a01b03808516600090815261013060209081526040808320938716835292905220549091508181101561113c57600061110182846124a9565b6001600160a01b0380871660009081526101306020908152604080832093891683529290522084905590506111368482611501565b50611036565b8181111561103657600061115083836124a9565b6001600160a01b038087166000908152610130602090815260408083209389168352929052208490559050610739848261150b565b6000610602611515565b8154600090818160058111156111e95760006111aa84611589565b6111b490856124a9565b600088815260209020909150869082015463ffffffff1611156111d9578091506111e7565b6111e4816001612438565b92505b505b808210156112365760006111fd8383611671565b600088815260209020909150869082015463ffffffff16111561122257809150611230565b61122d816001612438565b92505b506111e9565b8015611262576000868152602090208101600019015464010000000090046001600160e01b0316611265565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546033845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461103682848361168c565b600063ffffffff8211156113575760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016105e1565b5090565b600054610100900460ff166113825760405162461bcd60e51b81526004016105e1906124bc565b6105f482826117ca565b600054610100900460ff166113b35760405162461bcd60e51b81526004016105e1906124bc565b565b600054610100900460ff166113dc5760405162461bcd60e51b81526004016105e1906124bc565b6107e281604051806040016040528060018152602001603160f81b81525061180a565b6060609980546104fe906123ee565b6060609a80546104fe906123ee565b600065ffffffffffff8211156113575760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b60648201526084016105e1565b6000610595611491611185565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006114c287878787611859565b915091506114cf8161191d565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6105f48282611a67565b6105f48282611af2565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611540611b0b565b611548611b64565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008160000361159b57506000919050565b600060016115a884611b95565b901c6001901b905060018184816115c1576115c1612507565b048201901c905060018184816115d9576115d9612507565b048201901c905060018184816115f1576115f1612507565b048201901c9050600181848161160957611609612507565b048201901c9050600181848161162157611621612507565b048201901c9050600181848161163957611639612507565b048201901c9050600181848161165157611651612507565b048201901c90506106a78182858161166b5761166b612507565b04611c29565b6000611680600284841861251d565b6106a790848416612438565b816001600160a01b0316836001600160a01b0316141580156116ae5750600081115b156117c5576001600160a01b0383161561173c576001600160a01b038316600090815260ff6020526040812081906116e990611c3f85611c4b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611731929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156117c5576001600160a01b038216600090815260ff60205260408120819061177290611dc085611c4b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117ba929190918252602082015260400190565b60405180910390a250505b505050565b600054610100900460ff166117f15760405162461bcd60e51b81526004016105e1906124bc565b60366117fd838261258d565b5060376117c5828261258d565b600054610100900460ff166118315760405162461bcd60e51b81526004016105e1906124bc565b609961183d838261258d565b50609a61184a828261258d565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118905750600090506003611914565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156118e4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661190d57600060019250925050611914565b9150600090505b94509492505050565b60008160048111156119315761193161264d565b036119395750565b600181600481111561194d5761194d61264d565b0361199a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105e1565b60028160048111156119ae576119ae61264d565b036119fb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105e1565b6003816004811115611a0f57611a0f61264d565b036107e25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105e1565b611a718282611dcc565b6035546001600160e01b031015611ae35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016105e1565b611036610100611dc083611c4b565b611afc8282611e95565b611036610100611c3f83611c4b565b600080611b166113ff565b805190915015611b2d578051602090910120919050565b6097548015611b3c5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611b6f61140e565b805190915015611b86578051602090910120919050565b6098548015611b3c5792915050565b600080608083901c15611baa57608092831c92015b604083901c15611bbc57604092831c92015b602083901c15611bce57602092831c92015b601083901c15611be057601092831c92015b600883901c15611bf257600892831c92015b600483901c15611c0457600492831c92015b600283901c15611c1657600292831c92015b600183901c156105955760010192915050565b6000818310611c3857816106a7565b5090919050565b60006106a782846124a9565b82546000908190818115611c985760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611cad565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350611ccd84868863ffffffff16565b9250600082118015611cf75750611ce2610b0b565b65ffffffffffff16816000015163ffffffff16145b15611d3c57611d0583611fd0565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611db6565b866040518060400160405280611d60611d53610b0b565b65ffffffffffff166112f2565b63ffffffff168152602001611d7486611fd0565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b60006106a78284612438565b6001600160a01b038216611e225760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105e1565b8060356000828254611e349190612438565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105f460008383612039565b6001600160a01b038216611ef55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105e1565b6001600160a01b03821660009081526033602052604090205481811015611f695760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105e1565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36117c583600084612039565b60006001600160e01b038211156113575760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016105e1565b6117c58383836001600160a01b03808416600090815260fe60205260409020546117c591166001600160a01b03808516600090815260fe6020526040902054168361168c565b80356001600160a01b038116811461209657600080fd5b919050565b600080604083850312156120ae57600080fd5b6120b78361207f565b91506120c56020840161207f565b90509250929050565b6000815180845260005b818110156120f4576020818501810151868301820152016120d8565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106a760208301846120ce565b6000806040838503121561213a57600080fd5b6121438361207f565b946020939093013593505050565b60008060006060848603121561216657600080fd5b61216f8461207f565b925061217d6020850161207f565b9150604084013590509250925092565b60006020828403121561219f57600080fd5b5035919050565b6000806000604084860312156121bb57600080fd5b833567ffffffffffffffff808211156121d357600080fd5b818601915086601f8301126121e757600080fd5b8135818111156121f657600080fd5b8760208260051b850101111561220b57600080fd5b602092830195509350612221918601905061207f565b90509250925092565b60006020828403121561223c57600080fd5b6106a78261207f565b60ff60f81b881681526000602060e08184015261226560e084018a6120ce565b8381036040850152612277818a6120ce565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156122c9578351835292840192918401916001016122ad565b50909c9b505050505050505050505050565b803560ff8116811461209657600080fd5b60008060008060008060c0878903121561230557600080fd5b61230e8761207f565b9550602087013594506040870135935061232a606088016122db565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561235f57600080fd5b6123688861207f565b96506123766020890161207f565b95506040880135945060608801359350612392608089016122db565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156123c157600080fd5b6123ca8361207f565b9150602083013563ffffffff811681146123e357600080fd5b809150509250929050565b600181811c9082168061240257607f821691505b6020821081036114fb57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561059557610595612422565b634e487b7160e01b600052603260045260246000fd5b60006001820161247357612473612422565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156124a257600080fd5b5051919050565b8181038181111561059557610595612422565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261253a57634e487b7160e01b600052601260045260246000fd5b500490565b601f8211156117c557600081815260208120601f850160051c810160208610156125665750805b601f850160051c820191505b8181101561258557828155600101612572565b505050505050565b815167ffffffffffffffff8111156125a7576125a761247a565b6125bb816125b584546123ee565b8461253f565b602080601f8311600181146125f057600084156125d85750858301515b600019600386901b1c1916600185901b178555612585565b600085815260208120601f198616915b8281101561261f57888601518255948401946001909101908401612600565b508582101561263d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea164736f6c6343000811000a" }, "0x0000000000000000000000000000000000002006": { "balance": "0x0", - "code": "0x6080604052600436106101e75760003560e01c80638129fc1c11610102578063bc197c8111610095578063e38335e511610064578063e38335e5146105e1578063f1fad104146105f4578063f23a6e6114610609578063f27a0c921461063557600080fd5b8063bc197c8114610548578063c4d252f514610574578063d45c443514610594578063d547741f146105c157600080fd5b8063a217fddf116100d1578063a217fddf146104d1578063ac431751146104e6578063b08e51c014610506578063b1c5f4271461052857600080fd5b80638129fc1c1461045a5780638f2a0bb01461046f5780638f61f4f51461048f57806391d14854146104b157600080fd5b80632ab0f5291161017a5780634bf6c882116101495780634bf6c882146103d3578063584b153e146103fa57806364d623531461041a5780638065657f1461043a57600080fd5b80632ab0f529146103435780632f2ff15d1461037357806331d507501461039357806336568abe146103b357600080fd5b8063134008d3116101b6578063134008d31461029c57806313bc9f20146102af578063150b7a02146102cf578063248a9ca31461031357600080fd5b806301d5062a146101f357806301ffc9a71461021557806307bd02651461024a5780630d3cf6fc1461027a57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004611aa6565b61064a565b005b34801561022157600080fd5b50610235610230366004611b1a565b61070e565b60405190151581526020015b60405180910390f35b34801561025657600080fd5b5061026c60008051602061258a83398151915281565b604051908152602001610241565b34801561028657600080fd5b5061026c60008051602061254a83398151915281565b6102136102aa366004611b44565b610739565b3480156102bb57600080fd5b506102356102ca366004611baf565b6107dc565b3480156102db57600080fd5b506102fa6102ea366004611c7d565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610241565b34801561031f57600080fd5b5061026c61032e366004611baf565b60009081526065602052604090206001015490565b34801561034f57600080fd5b5061023561035e366004611baf565b60009081526097602052604090205460011490565b34801561037f57600080fd5b5061021361038e366004611ce4565b610802565b34801561039f57600080fd5b506102356103ae366004611baf565b61082c565b3480156103bf57600080fd5b506102136103ce366004611ce4565b610845565b3480156103df57600080fd5b506103e8600881565b60405160ff9091168152602001610241565b34801561040657600080fd5b50610235610415366004611baf565b6108c8565b34801561042657600080fd5b50610213610435366004611baf565b6108df565b34801561044657600080fd5b5061026c610455366004611b44565b610983565b34801561046657600080fd5b506102136109c2565b34801561047b57600080fd5b5061021361048a366004611d54565b610b74565b34801561049b57600080fd5b5061026c60008051602061256a83398151915281565b3480156104bd57600080fd5b506102356104cc366004611ce4565b610cf5565b3480156104dd57600080fd5b5061026c600081565b3480156104f257600080fd5b50610213610501366004611e05565b610d20565b34801561051257600080fd5b5061026c6000805160206125aa83398151915281565b34801561053457600080fd5b5061026c610543366004611e70565b610f0a565b34801561055457600080fd5b506102fa610563366004611f97565b63bc197c8160e01b95945050505050565b34801561058057600080fd5b5061021361058f366004611baf565b610f4f565b3480156105a057600080fd5b5061026c6105af366004611baf565b60009081526097602052604090205490565b3480156105cd57600080fd5b506102136105dc366004611ce4565b611012565b6102136105ef366004611e70565b611037565b34801561060057600080fd5b506103e8601181565b34801561061557600080fd5b506102fa610624366004612040565b63f23a6e6160e01b95945050505050565b34801561064157600080fd5b5060985461026c565b60008051602061256a833981519152610662816111af565b6000610672898989898989610983565b905061067e81846111b9565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516106ba969594939291906120cd565b60405180910390a3831561070357807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516106fa91815260200190565b60405180910390a25b505050505050505050565b60006001600160e01b03198216630271189760e51b14806107335750610733826112a8565b92915050565b60008051602061258a833981519152610753816000610cf5565b6107615761076181336112dd565b6000610771888888888888610983565b905061077d8185611336565b610789888888886113d1565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516107c1949392919061210a565b60405180910390a36107d2816114a4565b5050505050505050565b6000818152609760205260408120546001811180156107fb5750428111155b9392505050565b60008281526065602052604090206001015461081d816111af565b61082783836114dd565b505050565b60008181526097602052604081205481905b1192915050565b6001600160a01b03811633146108ba5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108c48282611563565b5050565b60008181526097602052604081205460019061083e565b3330146109425760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b60648201526084016108b1565b60985460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1609855565b60008686868686866040516020016109a0969594939291906120cd565b6040516020818303038152906040528051906020012090509695505050505050565b600054610100900460ff16158080156109e25750600054600160ff909116105b806109fc5750303b1580156109fc575060005460ff166001145b610a5f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108b1565b6000805460ff191660011790558015610a82576000805461ff0019166101001790555b334114610aa25760405163022d8c9560e31b815260040160405180910390fd5b3a15610ac1576040516383f1b1d360e01b815260040160405180910390fd5b6040805160018082528183019092526000916020808301908036833701905050905061200481600081518110610af957610af961213c565b60200260200101906001600160a01b031690816001600160a01b031681525050610b2a6201518082836120046115ca565b508015610b71576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60008051602061256a833981519152610b8c816111af565b888714610bab5760405162461bcd60e51b81526004016108b190612152565b888514610bca5760405162461bcd60e51b81526004016108b190612152565b6000610bdc8b8b8b8b8b8b8b8b610f0a565b9050610be881846111b9565b60005b8a811015610ca65780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c2857610c2861213c565b9050602002016020810190610c3d9190612195565b8d8d86818110610c4f57610c4f61213c565b905060200201358c8c87818110610c6857610c6861213c565b9050602002810190610c7a91906121b0565b8c8b604051610c8e969594939291906120cd565b60405180910390a3610c9f8161220c565b9050610beb565b508315610ce857807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610cdf91815260200190565b60405180910390a25b5050505050505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3361100714610d4657604051630f22c43960e41b815261100760048201526024016108b1565b610da9604051806040016040528060088152602001676d696e44656c617960c01b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506116039050565b15610ea65760208114610dd75783838383604051630a5a604160e01b81526004016108b19493929190612225565b604080516020601f8401819004810282018101909252828152600091610e1891858580838501838280828437600092019190915250929392505061165c9050565b9050801580610e2957506212750081115b15610e4f5784848484604051630a5a604160e01b81526004016108b19493929190612225565b6040516364d6235360e01b81526004810182905230906364d6235390602401600060405180830381600087803b158015610e8857600080fd5b505af1158015610e9c573d6000803e3d6000fd5b5050505050610ec7565b838383836040516325ee20d560e21b81526004016108b19493929190612225565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610efc9493929190612225565b60405180910390a150505050565b60008888888888888888604051602001610f2b9897969594939291906122da565b60405160208183030381529060405280519060200120905098975050505050505050565b6000805160206125aa833981519152610f67816111af565b610f70826108c8565b610fd65760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b60648201526084016108b1565b6000828152609760205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60008281526065602052604090206001015461102d816111af565b6108278383611563565b60008051602061258a833981519152611051816000610cf5565b61105f5761105f81336112dd565b87861461107e5760405162461bcd60e51b81526004016108b190612152565b87841461109d5760405162461bcd60e51b81526004016108b190612152565b60006110af8a8a8a8a8a8a8a8a610f0a565b90506110bb8185611336565b60005b898110156111995760008b8b838181106110da576110da61213c565b90506020020160208101906110ef9190612195565b905060008a8a848181106111055761110561213c565b9050602002013590503660008a8a868181106111235761112361213c565b905060200281019061113591906121b0565b91509150611145848484846113d1565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161117c949392919061210a565b60405180910390a350505050806111929061220c565b90506110be565b506111a3816114a4565b50505050505050505050565b610b7181336112dd565b6111c28261082c565b156112275760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b60648201526084016108b1565b6098548110156112885760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b60648201526084016108b1565b611292814261237b565b6000928352609760205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061073357506301ffc9a760e01b6001600160e01b0319831614610733565b6112e78282610cf5565b6108c4576112f481611661565b6112ff836020611673565b6040516020016113109291906123b2565b60408051601f198184030181529082905262461bcd60e51b82526108b191600401612427565b61133f826107dc565b61135b5760405162461bcd60e51b81526004016108b19061245a565b80158061137657506000818152609760205260409020546001145b6108c45760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b60648201526084016108b1565b6000846001600160a01b03168484846040516113ee9291906124a4565b60006040518083038185875af1925050503d806000811461142b576040519150601f19603f3d011682016040523d82523d6000602084013e611430565b606091505b505090508061149d5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b60648201526084016108b1565b5050505050565b6114ad816107dc565b6114c95760405162461bcd60e51b81526004016108b19061245a565b600090815260976020526040902060019055565b6114e78282610cf5565b6108c45760008281526065602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561151f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61156d8282610cf5565b156108c45760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166115f15760405162461bcd60e51b81526004016108b1906124b4565b6115fd8484848461180e565b50505050565b60008160405160200161161691906124ff565b604051602081830303815290604052805190602001208360405160200161163d91906124ff565b6040516020818303038152906040528051906020012014905092915050565b015190565b60606107336001600160a01b03831660145b6060600061168283600261251b565b61168d90600261237b565b6001600160401b038111156116a4576116a4611bc8565b6040519080825280601f01601f1916602001820160405280156116ce576020820181803683370190505b509050600360fc1b816000815181106116e9576116e961213c565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117185761171861213c565b60200101906001600160f81b031916908160001a905350600061173c84600261251b565b61174790600161237b565b90505b60018111156117bf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061177b5761177b61213c565b1a60f81b8282815181106117915761179161213c565b60200101906001600160f81b031916908160001a90535060049490941c936117b881612532565b905061174a565b5083156107fb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108b1565b600054610100900460ff166118355760405162461bcd60e51b81526004016108b1906124b4565b61184d60008051602061254a833981519152806119ed565b61187360008051602061256a83398151915260008051602061254a8339815191526119ed565b61189960008051602061258a83398151915260008051602061254a8339815191526119ed565b6118bf6000805160206125aa83398151915260008051602061254a8339815191526119ed565b6118d760008051602061254a83398151915230611a38565b6001600160a01b038116156118fe576118fe60008051602061254a83398151915282611a38565b60005b835181101561196f5761193b60008051602061256a83398151915285838151811061192e5761192e61213c565b6020026020010151611a38565b61195f6000805160206125aa83398151915285838151811061192e5761192e61213c565b6119688161220c565b9050611901565b5060005b82518110156119b0576119a060008051602061258a83398151915284838151811061192e5761192e61213c565b6119a98161220c565b9050611973565b5060988490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d59101610efc565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6108c482826114dd565b80356001600160a01b0381168114611a5957600080fd5b919050565b60008083601f840112611a7057600080fd5b5081356001600160401b03811115611a8757600080fd5b602083019150836020828501011115611a9f57600080fd5b9250929050565b600080600080600080600060c0888a031215611ac157600080fd5b611aca88611a42565b96506020880135955060408801356001600160401b03811115611aec57600080fd5b611af88a828b01611a5e565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611b2c57600080fd5b81356001600160e01b0319811681146107fb57600080fd5b60008060008060008060a08789031215611b5d57600080fd5b611b6687611a42565b95506020870135945060408701356001600160401b03811115611b8857600080fd5b611b9489828a01611a5e565b979a9699509760608101359660809091013595509350505050565b600060208284031215611bc157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c0657611c06611bc8565b604052919050565b600082601f830112611c1f57600080fd5b81356001600160401b03811115611c3857611c38611bc8565b611c4b601f8201601f1916602001611bde565b818152846020838601011115611c6057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611c9357600080fd5b611c9c85611a42565b9350611caa60208601611a42565b92506040850135915060608501356001600160401b03811115611ccc57600080fd5b611cd887828801611c0e565b91505092959194509250565b60008060408385031215611cf757600080fd5b82359150611d0760208401611a42565b90509250929050565b60008083601f840112611d2257600080fd5b5081356001600160401b03811115611d3957600080fd5b6020830191508360208260051b8501011115611a9f57600080fd5b600080600080600080600080600060c08a8c031215611d7257600080fd5b89356001600160401b0380821115611d8957600080fd5b611d958d838e01611d10565b909b50995060208c0135915080821115611dae57600080fd5b611dba8d838e01611d10565b909950975060408c0135915080821115611dd357600080fd5b50611de08c828d01611d10565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060408587031215611e1b57600080fd5b84356001600160401b0380821115611e3257600080fd5b611e3e88838901611a5e565b90965094506020870135915080821115611e5757600080fd5b50611e6487828801611a5e565b95989497509550505050565b60008060008060008060008060a0898b031215611e8c57600080fd5b88356001600160401b0380821115611ea357600080fd5b611eaf8c838d01611d10565b909a50985060208b0135915080821115611ec857600080fd5b611ed48c838d01611d10565b909850965060408b0135915080821115611eed57600080fd5b50611efa8b828c01611d10565b999c989b509699959896976060870135966080013595509350505050565b600082601f830112611f2957600080fd5b813560206001600160401b03821115611f4457611f44611bc8565b8160051b611f53828201611bde565b9283528481018201928281019087851115611f6d57600080fd5b83870192505b84831015611f8c57823582529183019190830190611f73565b979650505050505050565b600080600080600060a08688031215611faf57600080fd5b611fb886611a42565b9450611fc660208701611a42565b935060408601356001600160401b0380821115611fe257600080fd5b611fee89838a01611f18565b9450606088013591508082111561200457600080fd5b61201089838a01611f18565b9350608088013591508082111561202657600080fd5b5061203388828901611c0e565b9150509295509295909350565b600080600080600060a0868803121561205857600080fd5b61206186611a42565b945061206f60208701611a42565b9350604086013592506060860135915060808601356001600160401b0381111561209857600080fd5b61203388828901611c0e565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006120f560a0830186886120a4565b60608301949094525060800152949350505050565b60018060a01b03851681528360208201526060604082015260006121326060830184866120a4565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b6000602082840312156121a757600080fd5b6107fb82611a42565b6000808335601e198436030181126121c757600080fd5b8301803591506001600160401b038211156121e157600080fd5b602001915036819003821315611a9f57600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161221e5761221e6121f6565b5060010190565b6040815260006122396040830186886120a4565b8281036020840152611f8c8185876120a4565b818352600060208085019450848460051b86018460005b878110156122cd5783830389528135601e1988360301811261228457600080fd5b870185810190356001600160401b0381111561229f57600080fd5b8036038213156122ae57600080fd5b6122b98582846120a4565b9a87019a9450505090840190600101612263565b5090979650505050505050565b60a0808252810188905260008960c08301825b8b81101561231b576001600160a01b0361230684611a42565b168252602092830192909101906001016122ed565b5083810360208501528881526001600160fb1b0389111561233b57600080fd5b8860051b9150818a60208301370182810360209081016040850152612363908201878961224c565b60608401959095525050608001529695505050505050565b80820180821115610733576107336121f6565b60005b838110156123a9578181015183820152602001612391565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516123ea81601785016020880161238e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161241b81602884016020880161238e565b01602801949350505050565b602081526000825180602084015261244681604085016020870161238e565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000825161251181846020870161238e565b9190910192915050565b8082028115828204841417610733576107336121f6565b600081612541576125416121f6565b50600019019056fe5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a164736f6c6343000811000a" + "code": "0x6080604052600436106101d15760003560e01c80638129fc1c116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610584578063e38335e5146105a4578063f23a6e61146105b7578063f27a0c92146105e357600080fd5b8063b1c5f427146104eb578063bc197c811461050b578063c4d252f514610537578063d45c44351461055757600080fd5b806391d14854116100d157806391d1485414610474578063a217fddf14610494578063ac431751146104a9578063b08e51c0146104c957600080fd5b80638129fc1c1461041d5780638f2a0bb0146104325780638f61f4f51461045257600080fd5b8063248a9ca31161016f57806336568abe1161013e57806336568abe1461039d578063584b153e146103bd57806364d62353146103dd5780638065657f146103fd57600080fd5b8063248a9ca3146102fd5780632ab0f5291461032d5780632f2ff15d1461035d57806331d507501461037d57600080fd5b80630d3cf6fc116101ab5780630d3cf6fc14610264578063134008d31461028657806313bc9f2014610299578063150b7a02146102b957600080fd5b806301d5062a146101dd57806301ffc9a7146101ff57806307bd02651461023457600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611a54565b6105f8565b005b34801561020b57600080fd5b5061021f61021a366004611ac8565b6106bc565b60405190151581526020015b60405180910390f35b34801561024057600080fd5b5061025660008051602061253b83398151915281565b60405190815260200161022b565b34801561027057600080fd5b506102566000805160206124fb83398151915281565b6101fd610294366004611af2565b6106e7565b3480156102a557600080fd5b5061021f6102b4366004611b5d565b61078a565b3480156102c557600080fd5b506102e46102d4366004611c2b565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161022b565b34801561030957600080fd5b50610256610318366004611b5d565b60009081526065602052604090206001015490565b34801561033957600080fd5b5061021f610348366004611b5d565b60009081526097602052604090205460011490565b34801561036957600080fd5b506101fd610378366004611c92565b6107b0565b34801561038957600080fd5b5061021f610398366004611b5d565b6107da565b3480156103a957600080fd5b506101fd6103b8366004611c92565b6107f3565b3480156103c957600080fd5b5061021f6103d8366004611b5d565b610876565b3480156103e957600080fd5b506101fd6103f8366004611b5d565b61088d565b34801561040957600080fd5b50610256610418366004611af2565b610931565b34801561042957600080fd5b506101fd610970565b34801561043e57600080fd5b506101fd61044d366004611d02565b610b22565b34801561045e57600080fd5b5061025660008051602061251b83398151915281565b34801561048057600080fd5b5061021f61048f366004611c92565b610ca3565b3480156104a057600080fd5b50610256600081565b3480156104b557600080fd5b506101fd6104c4366004611db3565b610cce565b3480156104d557600080fd5b5061025660008051602061255b83398151915281565b3480156104f757600080fd5b50610256610506366004611e1e565b610eb8565b34801561051757600080fd5b506102e4610526366004611f45565b63bc197c8160e01b95945050505050565b34801561054357600080fd5b506101fd610552366004611b5d565b610efd565b34801561056357600080fd5b50610256610572366004611b5d565b60009081526097602052604090205490565b34801561059057600080fd5b506101fd61059f366004611c92565b610fc0565b6101fd6105b2366004611e1e565b610fe5565b3480156105c357600080fd5b506102e46105d2366004611fee565b63f23a6e6160e01b95945050505050565b3480156105ef57600080fd5b50609854610256565b60008051602061251b8339815191526106108161115d565b6000610620898989898989610931565b905061062c8184611167565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516106689695949392919061207b565b60405180910390a383156106b157807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516106a891815260200190565b60405180910390a25b505050505050505050565b60006001600160e01b03198216630271189760e51b14806106e157506106e182611256565b92915050565b60008051602061253b833981519152610701816000610ca3565b61070f5761070f813361128b565b600061071f888888888888610931565b905061072b81856112e4565b6107378888888861137f565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161076f94939291906120b8565b60405180910390a361078081611452565b5050505050505050565b6000818152609760205260408120546001811180156107a95750428111155b9392505050565b6000828152606560205260409020600101546107cb8161115d565b6107d5838361148b565b505050565b60008181526097602052604081205481905b1192915050565b6001600160a01b03811633146108685760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108728282611511565b5050565b6000818152609760205260408120546001906107ec565b3330146108f05760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b606482015260840161085f565b60985460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1609855565b600086868686868660405160200161094e9695949392919061207b565b6040516020818303038152906040528051906020012090509695505050505050565b600054610100900460ff16158080156109905750600054600160ff909116105b806109aa5750303b1580156109aa575060005460ff166001145b610a0d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161085f565b6000805460ff191660011790558015610a30576000805461ff0019166101001790555b334114610a505760405163022d8c9560e31b815260040160405180910390fd5b3a15610a6f576040516383f1b1d360e01b815260040160405180910390fd5b6040805160018082528183019092526000916020808301908036833701905050905061200481600081518110610aa757610aa76120ea565b60200260200101906001600160a01b031690816001600160a01b031681525050610ad8620151808283612004611578565b508015610b1f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60008051602061251b833981519152610b3a8161115d565b888714610b595760405162461bcd60e51b815260040161085f90612100565b888514610b785760405162461bcd60e51b815260040161085f90612100565b6000610b8a8b8b8b8b8b8b8b8b610eb8565b9050610b968184611167565b60005b8a811015610c545780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610bd657610bd66120ea565b9050602002016020810190610beb9190612143565b8d8d86818110610bfd57610bfd6120ea565b905060200201358c8c87818110610c1657610c166120ea565b9050602002810190610c28919061215e565b8c8b604051610c3c9695949392919061207b565b60405180910390a3610c4d816121ba565b9050610b99565b508315610c9657807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610c8d91815260200190565b60405180910390a25b5050505050505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3361100714610cf457604051630f22c43960e41b8152611007600482015260240161085f565b610d57604051806040016040528060088152602001676d696e44656c617960c01b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115b19050565b15610e545760208114610d855783838383604051630a5a604160e01b815260040161085f94939291906121d3565b604080516020601f8401819004810282018101909252828152600091610dc691858580838501838280828437600092019190915250929392505061160a9050565b9050801580610dd757506212750081115b15610dfd5784848484604051630a5a604160e01b815260040161085f94939291906121d3565b6040516364d6235360e01b81526004810182905230906364d6235390602401600060405180830381600087803b158015610e3657600080fd5b505af1158015610e4a573d6000803e3d6000fd5b5050505050610e75565b838383836040516325ee20d560e21b815260040161085f94939291906121d3565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610eaa94939291906121d3565b60405180910390a150505050565b60008888888888888888604051602001610ed998979695949392919061228b565b60405160208183030381529060405280519060200120905098975050505050505050565b60008051602061255b833981519152610f158161115d565b610f1e82610876565b610f845760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b606482015260840161085f565b6000828152609760205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260656020526040902060010154610fdb8161115d565b6107d58383611511565b60008051602061253b833981519152610fff816000610ca3565b61100d5761100d813361128b565b87861461102c5760405162461bcd60e51b815260040161085f90612100565b87841461104b5760405162461bcd60e51b815260040161085f90612100565b600061105d8a8a8a8a8a8a8a8a610eb8565b905061106981856112e4565b60005b898110156111475760008b8b83818110611088576110886120ea565b905060200201602081019061109d9190612143565b905060008a8a848181106110b3576110b36120ea565b9050602002013590503660008a8a868181106110d1576110d16120ea565b90506020028101906110e3919061215e565b915091506110f38484848461137f565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112a94939291906120b8565b60405180910390a35050505080611140906121ba565b905061106c565b5061115181611452565b50505050505050505050565b610b1f813361128b565b611170826107da565b156111d55760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b606482015260840161085f565b6098548110156112365760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b606482015260840161085f565b611240814261232c565b6000928352609760205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b14806106e157506301ffc9a760e01b6001600160e01b03198316146106e1565b6112958282610ca3565b610872576112a28161160f565b6112ad836020611621565b6040516020016112be929190612363565b60408051601f198184030181529082905262461bcd60e51b825261085f916004016123d8565b6112ed8261078a565b6113095760405162461bcd60e51b815260040161085f9061240b565b80158061132457506000818152609760205260409020546001145b6108725760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b606482015260840161085f565b6000846001600160a01b031684848460405161139c929190612455565b60006040518083038185875af1925050503d80600081146113d9576040519150601f19603f3d011682016040523d82523d6000602084013e6113de565b606091505b505090508061144b5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b606482015260840161085f565b5050505050565b61145b8161078a565b6114775760405162461bcd60e51b815260040161085f9061240b565b600090815260976020526040902060019055565b6114958282610ca3565b6108725760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556114cd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61151b8282610ca3565b156108725760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff1661159f5760405162461bcd60e51b815260040161085f90612465565b6115ab848484846117bc565b50505050565b6000816040516020016115c491906124b0565b60405160208183030381529060405280519060200120836040516020016115eb91906124b0565b6040516020818303038152906040528051906020012014905092915050565b015190565b60606106e16001600160a01b03831660145b606060006116308360026124cc565b61163b90600261232c565b6001600160401b0381111561165257611652611b76565b6040519080825280601f01601f19166020018201604052801561167c576020820181803683370190505b509050600360fc1b81600081518110611697576116976120ea565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106116c6576116c66120ea565b60200101906001600160f81b031916908160001a90535060006116ea8460026124cc565b6116f590600161232c565b90505b600181111561176d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611729576117296120ea565b1a60f81b82828151811061173f5761173f6120ea565b60200101906001600160f81b031916908160001a90535060049490941c93611766816124e3565b90506116f8565b5083156107a95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161085f565b600054610100900460ff166117e35760405162461bcd60e51b815260040161085f90612465565b6117fb6000805160206124fb8339815191528061199b565b61182160008051602061251b8339815191526000805160206124fb83398151915261199b565b61184760008051602061253b8339815191526000805160206124fb83398151915261199b565b61186d60008051602061255b8339815191526000805160206124fb83398151915261199b565b6118856000805160206124fb833981519152306119e6565b6001600160a01b038116156118ac576118ac6000805160206124fb833981519152826119e6565b60005b835181101561191d576118e960008051602061251b8339815191528583815181106118dc576118dc6120ea565b60200260200101516119e6565b61190d60008051602061255b8339815191528583815181106118dc576118dc6120ea565b611916816121ba565b90506118af565b5060005b825181101561195e5761194e60008051602061253b8339815191528483815181106118dc576118dc6120ea565b611957816121ba565b9050611921565b5060988490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d59101610eaa565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b610872828261148b565b80356001600160a01b0381168114611a0757600080fd5b919050565b60008083601f840112611a1e57600080fd5b5081356001600160401b03811115611a3557600080fd5b602083019150836020828501011115611a4d57600080fd5b9250929050565b600080600080600080600060c0888a031215611a6f57600080fd5b611a78886119f0565b96506020880135955060408801356001600160401b03811115611a9a57600080fd5b611aa68a828b01611a0c565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611ada57600080fd5b81356001600160e01b0319811681146107a957600080fd5b60008060008060008060a08789031215611b0b57600080fd5b611b14876119f0565b95506020870135945060408701356001600160401b03811115611b3657600080fd5b611b4289828a01611a0c565b979a9699509760608101359660809091013595509350505050565b600060208284031215611b6f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611bb457611bb4611b76565b604052919050565b600082601f830112611bcd57600080fd5b81356001600160401b03811115611be657611be6611b76565b611bf9601f8201601f1916602001611b8c565b818152846020838601011115611c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611c4157600080fd5b611c4a856119f0565b9350611c58602086016119f0565b92506040850135915060608501356001600160401b03811115611c7a57600080fd5b611c8687828801611bbc565b91505092959194509250565b60008060408385031215611ca557600080fd5b82359150611cb5602084016119f0565b90509250929050565b60008083601f840112611cd057600080fd5b5081356001600160401b03811115611ce757600080fd5b6020830191508360208260051b8501011115611a4d57600080fd5b600080600080600080600080600060c08a8c031215611d2057600080fd5b89356001600160401b0380821115611d3757600080fd5b611d438d838e01611cbe565b909b50995060208c0135915080821115611d5c57600080fd5b611d688d838e01611cbe565b909950975060408c0135915080821115611d8157600080fd5b50611d8e8c828d01611cbe565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060408587031215611dc957600080fd5b84356001600160401b0380821115611de057600080fd5b611dec88838901611a0c565b90965094506020870135915080821115611e0557600080fd5b50611e1287828801611a0c565b95989497509550505050565b60008060008060008060008060a0898b031215611e3a57600080fd5b88356001600160401b0380821115611e5157600080fd5b611e5d8c838d01611cbe565b909a50985060208b0135915080821115611e7657600080fd5b611e828c838d01611cbe565b909850965060408b0135915080821115611e9b57600080fd5b50611ea88b828c01611cbe565b999c989b509699959896976060870135966080013595509350505050565b600082601f830112611ed757600080fd5b813560206001600160401b03821115611ef257611ef2611b76565b8160051b611f01828201611b8c565b9283528481018201928281019087851115611f1b57600080fd5b83870192505b84831015611f3a57823582529183019190830190611f21565b979650505050505050565b600080600080600060a08688031215611f5d57600080fd5b611f66866119f0565b9450611f74602087016119f0565b935060408601356001600160401b0380821115611f9057600080fd5b611f9c89838a01611ec6565b94506060880135915080821115611fb257600080fd5b611fbe89838a01611ec6565b93506080880135915080821115611fd457600080fd5b50611fe188828901611bbc565b9150509295509295909350565b600080600080600060a0868803121561200657600080fd5b61200f866119f0565b945061201d602087016119f0565b9350604086013592506060860135915060808601356001600160401b0381111561204657600080fd5b611fe188828901611bbc565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006120a360a083018688612052565b60608301949094525060800152949350505050565b60018060a01b03851681528360208201526060604082015260006120e0606083018486612052565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b60006020828403121561215557600080fd5b6107a9826119f0565b6000808335601e1984360301811261217557600080fd5b8301803591506001600160401b0382111561218f57600080fd5b602001915036819003821315611a4d57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016121cc576121cc6121a4565b5060010190565b6040815260006121e7604083018688612052565b8281036020840152611f3a818587612052565b81835260006020808501808196508560051b810191508460005b8781101561227e5782840389528135601e1988360301811261223557600080fd5b870185810190356001600160401b0381111561225057600080fd5b80360382131561225f57600080fd5b61226a868284612052565b9a87019a9550505090840190600101612214565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156122cc576001600160a01b036122b7846119f0565b1682526020928301929091019060010161229e565b5083810360208501528881526001600160fb1b038911156122ec57600080fd5b8860051b9150818a6020830137018281036020908101604085015261231490820187896121fa565b60608401959095525050608001529695505050505050565b808201808211156106e1576106e16121a4565b60005b8381101561235a578181015183820152602001612342565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161239b81601785016020880161233f565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516123cc81602884016020880161233f565b01602801949350505050565b60208152600082518060208401526123f781604085016020870161233f565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516124c281846020870161233f565b9190910192915050565b80820281158282048414176106e1576106e16121a4565b6000816124f2576124f26121a4565b50600019019056fe5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a164736f6c6343000811000a" }, "0x0000000000000000000000000000000000003000": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80638129fc1c116100a2578063b187bd2611610071578063b187bd261461022c578063bfb5a6a114610237578063e33f8d321461024a578063e842426a1461026d578063f1fad1041461029857600080fd5b80638129fc1c146101fc5780638456cb59146102045780639fcb50121461020c578063ac4317511461021957600080fd5b80634a49ac4c116100de5780634a49ac4c1461017c5780634bf6c8821461018f578063572c9980146101a957806374be2150146101bc57600080fd5b8063046f7da2146101105780632eb4a7ab1461011a578063417c73a7146101365780634838d16514610149575b600080fd5b6101186102a0565b005b61012360685481565b6040519081526020015b60405180910390f35b6101186101443660046116a8565b610328565b61016c6101573660046116a8565b60346020526000908152604090205460ff1681565b604051901515815260200161012d565b61011861018a3660046116a8565b6103a4565b610197600881565b60405160ff909116815260200161012d565b6101186101b73660046116c3565b61041d565b6101ef6040518060400160405280601481526020017342696e616e63652d436861696e2d54696772697360601b81525081565b60405161012d919061173f565b6101186104b3565b610118610625565b60695461016c9060ff1681565b61011861022736600461179b565b6106b1565b60335460ff1661016c565b61011861024536600461184c565b610ad0565b61016c610258366004611926565b6000908152606a602052604090205460ff1690565b606754610280906001600160a01b031681565b6040516001600160a01b03909116815260200161012d565b610197601181565b60335461010090046001600160a01b031633146102d0576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff166102f357604051636cd6020160e01b815260040160405180910390fd5b6033805460ff191690556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f990600090a1565b60335461010090046001600160a01b03163314610358576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19166001179055517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60335461010090046001600160a01b031633146103d4576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60335461010090046001600160a01b0316331461044d576040516306fbb1e360e01b815260040160405180910390fd5b604051638525db0360e01b8152600481018390526001600160a01b038216602482015261100490638525db0390604401600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505050565b600054610100900460ff16158080156104d35750600054600160ff909116105b806104ed5750303b1580156104ed575060005460ff166001145b6105555760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610578576000805461ff0019166101001790555b3341146105985760405163022d8c9560e31b815260040160405180910390fd5b3a156105b7576040516383f1b1d360e01b815260040160405180910390fd5b6105bf610e30565b6105dc7308e68ec70fa3b629784fdb28887e206ce8561e08610e5d565b8015610622576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60335461010090046001600160a01b03163314610655576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff161561067957604051631785c68160e01b815260040160405180910390fd5b6033805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b33611007146106d757604051630f22c43960e41b8152611007600482015260240161054c565b6107416040518060400160405280600f81526020016e617070726f76616c4164647265737360881b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610eac9050565b1561080b576014811461076f5783838383604051630a5a604160e01b815260040161054c9493929190611968565b60006107b5601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610f069050565b90506001600160a01b0381166107e65784848484604051630a5a604160e01b815260040161054c9493929190611968565b606780546001600160a01b0319166001600160a01b0392909216919091179055610a8d565b6108706040518060400160405280600a8152602001691b595c9adb19549bdbdd60b21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610eac9050565b156109405760695460ff1615610899576040516379b3306f60e11b815260040160405180910390fd5b602081146108c25783838383604051630a5a604160e01b815260040161054c9493929190611968565b604080516020601f8401819004810282018101909252828152600091610903918585808385018382808284376000920191909152509293925050610f069050565b90508061092b5784848484604051630a5a604160e01b815260040161054c9493929190611968565b6068556069805460ff19166001179055610a8d565b6109b86040518060400160405280601b81526020017f746f6b656e5265636f766572506f7274616c50726f746563746f72000000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610eac9050565b15610a6c57601481146109e65783838383604051630a5a604160e01b815260040161054c9493929190611968565b6000610a2c601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610f069050565b90506001600160a01b038116610a5d5784848484604051630a5a604160e01b815260040161054c9493929190611968565b610a6681610f0b565b50610a8d565b838383836040516325ee20d560e21b815260040161054c9493929190611968565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610ac29493929190611968565b60405180910390a150505050565b60695460ff16610af35760405163678f619760e11b815260040160405180910390fd5b606854610b135760405163678f619760e11b815260040160405180910390fd5b6067546001600160a01b0316610b3c57604051631a1b977b60e31b815260040160405180910390fd5b60335460ff1615610b6057604051631785c68160e01b815260040160405180910390fd5b610b68610f72565b6000610bf689898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a9081908401838280828437600081840152601f19601f82011690508083019250505050505050610bf18e8e33610fcb565b6110ec565b90506000818c8c604051602001610c0f9392919061199a565b604051602081830303815290604052805190602001209050610c40816000908152606a602052604090205460ff1690565b15610c5d57604051623e493160e81b815260040160405180910390fd5b610d053389898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a908190840183828082843760009201919091525050604080516020808c0282810182019093528b82528994509092508b918b918291908501908490808284376000920191909152506111c492505050565b610d468484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060685491508490506112cf565b610d63576040516309bde33960e01b815260040160405180910390fd5b6000818152606a602052604090819020805460ff191660011790555163799758b960e01b8152600481018d9052336024820152604481018c90526110049063799758b990606401600060405180830381600087803b158015610dc457600080fd5b505af1158015610dd8573d6000803e3d6000fd5b505050507f39cc0b7297a0ef9102d75ebc4919ffec0347d50008c2b865eda4125d5812cb64828d338e604051610e1194939291906119c1565b60405180910390a15050610e2460018055565b50505050505050505050565b600054610100900460ff16610e575760405162461bcd60e51b815260040161054c906119f9565b60018055565b600054610100900460ff16610e845760405162461bcd60e51b815260040161054c906119f9565b603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081604051602001610ebf9190611a44565b6040516020818303038152906040528051906020012083604051602001610ee69190611a44565b604051602081830303815290604052805190602001201490505b92915050565b015190565b6033546040516001600160a01b0380841692610100900416907f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b90600090a3603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600260015403610fc45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002600155565b600060026040518060400160405280601481526020017342696e616e63652d436861696e2d54696772697360601b8152506110288560405160200161101291815260200190565b60405160208183030381529060405260006112e5565b6040516bffffffffffffffffffffffff19606087901b1660208201526110619060340160405160208183030381529060405260016112e5565b6110778860405160200161101291815260200190565b60405160200161108a9493929190611a60565b60408051601f19818403018152908290526110a491611a44565b602060405180830381855afa1580156110c1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110e49190611b8f565b949350505050565b6060835160211461111057604051638152ea1b60e01b815260040160405180910390fd5b825160401461113257604051635e4bd79760e11b815260040160405180910390fd5b604080516020808252818301909252600091602082018180368337019050509050826020820152600085858360405160200161117093929190611bbe565b60408051808303601f190181526014808452838301909252925060009190602082018180368337019050509050815160146020830182602086016069600019fa6111b957600080fd5b509695505050505050565b606060005b825181101561122257818382815181106111e5576111e5611c01565b60200260200101516040516020016111fe929190611c17565b6040516020818303038152906040529150808061121a90611c4f565b9150506111c9565b5060006040518060400160405280601481526020017342696e616e63652d436861696e2d54696772697360601b8152508787866068548660405160200161126e96959493929190611c68565b60408051601f1981840301815291905280516020909101206067549091506001600160a01b031661129f86836114b7565b6001600160a01b0316146112c6576040516356b00a4f60e11b815260040160405180910390fd5b50505050505050565b6000826112dc8584611551565b14949350505050565b60606000835160026112f79190611cd9565b67ffffffffffffffff81111561130f5761130f611ba8565b6040519080825280601f01601f191660200182016040528015611339576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b855181101561147f5781825187838151811061138557611385611c01565b0160200151611397919060f81c611d06565b815181106113a7576113a7611c01565b01602001516001600160f81b031916836113c2836002611cd9565b815181106113d2576113d2611c01565b60200101906001600160f81b031916908160001a9053508182518783815181106113fe576113fe611c01565b0160200151611410919060f81c611d1a565b8151811061142057611420611c01565b01602001516001600160f81b0319168361143b836002611cd9565b611446906001611d2e565b8151811061145657611456611c01565b60200101906001600160f81b031916908160001a9053508061147781611c4f565b915050611367565b5083156114af57816040516020016114979190611d41565b60405160208183030381529060405292505050610f00565b509392505050565b600082516041146114db576040516356b00a4f60e11b815260040160405180910390fd5b60208301516040840151606085015160001a601b81101561150457611501601b82611d6b565b90505b601b8160ff1610806115195750601c8160ff16115b15611537576040516356b00a4f60e11b815260040160405180910390fd5b600061154586838686611596565b50979650505050505050565b600081815b84518110156114af576115828286838151811061157557611575611c01565b602002602001015161165a565b91508061158e81611c4f565b915050611556565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115cd5750600090506003611651565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611621573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661164a57600060019250925050611651565b9150600090505b94509492505050565b6000818310611676576000828152602084905260409020611685565b60008381526020839052604090205b9392505050565b80356001600160a01b03811681146116a357600080fd5b919050565b6000602082840312156116ba57600080fd5b6116858261168c565b600080604083850312156116d657600080fd5b823591506116e66020840161168c565b90509250929050565b60005b8381101561170a5781810151838201526020016116f2565b50506000910152565b6000815180845261172b8160208601602086016116ef565b601f01601f19169290920160200192915050565b6020815260006116856020830184611713565b60008083601f84011261176457600080fd5b50813567ffffffffffffffff81111561177c57600080fd5b60208301915083602082850101111561179457600080fd5b9250929050565b600080600080604085870312156117b157600080fd5b843567ffffffffffffffff808211156117c957600080fd5b6117d588838901611752565b909650945060208701359150808211156117ee57600080fd5b506117fb87828801611752565b95989497509550505050565b60008083601f84011261181957600080fd5b50813567ffffffffffffffff81111561183157600080fd5b6020830191508360208260051b850101111561179457600080fd5b60008060008060008060008060008060c08b8d03121561186b57600080fd5b8a35995060208b0135985060408b013567ffffffffffffffff8082111561189157600080fd5b61189d8e838f01611752565b909a50985060608d01359150808211156118b657600080fd5b6118c28e838f01611752565b909850965060808d01359150808211156118db57600080fd5b6118e78e838f01611752565b909650945060a08d013591508082111561190057600080fd5b5061190d8d828e01611807565b915080935050809150509295989b9194979a5092959850565b60006020828403121561193857600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60408152600061197c60408301868861193f565b828103602084015261198f81858761193f565b979650505050505050565b600084516119ac8184602089016116ef565b91909101928352506020820152604001919050565b6080815260006119d46080830187611713565b6020830195909552506001600160a01b03929092166040830152606090910152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251611a568184602087016116ef565b9190910192915050565b7f7b226163636f756e745f6e756d626572223a2230222c22636861696e5f6964228152611d1160f11b602082015260008551611aa3816022850160208a016116ef565b7f222c2264617461223a6e756c6c2c226d656d6f223a22222c226d736773223a5b6022918401918201526a3d9130b6b7bab73a111d1160a91b60428201528551611af481604d840160208a016116ef565b6e1116113932b1b4b834b2b73a111d1160891b604d92909101918201528451611b2481605c8401602089016116ef565b711116113a37b5b2b72fb9bcb6b137b6111d1160711b605c92909101918201528351611b5781606e8401602088016116ef565b7f227d5d2c2273657175656e6365223a2230222c22736f75726365223a2230227d606e9290910191820152608e019695505050505050565b600060208284031215611ba157600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b60008451611bd08184602089016116ef565b845190830190611be48183602089016116ef565b8451910190611bf78183602088016116ef565b0195945050505050565b634e487b7160e01b600052603260045260246000fd5b60008351611c298184602088016116ef565b9190910191825250602001919050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c6157611c61611c39565b5060010190565b60008751611c7a818460208c016116ef565b606088901b6bffffffffffffffffffffffff19169083019081528651611ca7816014840160208b016116ef565b0160148101869052603481018590528351611cc98160548401602088016116ef565b0160540198975050505050505050565b8082028115828204841417610f0057610f00611c39565b634e487b7160e01b600052601260045260246000fd5b600082611d1557611d15611cf0565b500490565b600082611d2957611d29611cf0565b500690565b80820180821115610f0057610f00611c39565b61060f60f31b815260008251611d5e8160028501602087016116ef565b9190910160020192915050565b60ff8181168382160190811115610f0057610f00611c3956fea164736f6c6343000811000a" + "code": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638129fc1c11610097578063b187bd2611610066578063b187bd26146101fc578063bfb5a6a114610207578063e33f8d321461021a578063e842426a1461023d57600080fd5b80638129fc1c146101cc5780638456cb59146101d45780639fcb5012146101dc578063ac431751146101e957600080fd5b80634838d165116100d35780634838d165146101335780634a49ac4c14610166578063572c99801461017957806374be21501461018c57600080fd5b8063046f7da2146100fa5780632eb4a7ab14610104578063417c73a714610120575b600080fd5b610102610268565b005b61010d60685481565b6040519081526020015b60405180910390f35b61010261012e366004611670565b6102f0565b610156610141366004611670565b60346020526000908152604090205460ff1681565b6040519015158152602001610117565b610102610174366004611670565b61036c565b61010261018736600461168b565b6103e5565b6101bf6040518060400160405280601481526020017342696e616e63652d436861696e2d54696772697360601b81525081565b6040516101179190611707565b61010261047b565b6101026105ed565b6069546101569060ff1681565b6101026101f7366004611763565b610679565b60335460ff16610156565b610102610215366004611814565b610a98565b6101566102283660046118ee565b6000908152606a602052604090205460ff1690565b606754610250906001600160a01b031681565b6040516001600160a01b039091168152602001610117565b60335461010090046001600160a01b03163314610298576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff166102bb57604051636cd6020160e01b815260040160405180910390fd5b6033805460ff191690556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f990600090a1565b60335461010090046001600160a01b03163314610320576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19166001179055517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60335461010090046001600160a01b0316331461039c576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60335461010090046001600160a01b03163314610415576040516306fbb1e360e01b815260040160405180910390fd5b604051638525db0360e01b8152600481018390526001600160a01b038216602482015261100490638525db0390604401600060405180830381600087803b15801561045f57600080fd5b505af1158015610473573d6000803e3d6000fd5b505050505050565b600054610100900460ff161580801561049b5750600054600160ff909116105b806104b55750303b1580156104b5575060005460ff166001145b61051d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610540576000805461ff0019166101001790555b3341146105605760405163022d8c9560e31b815260040160405180910390fd5b3a1561057f576040516383f1b1d360e01b815260040160405180910390fd5b610587610df8565b6105a47308e68ec70fa3b629784fdb28887e206ce8561e08610e25565b80156105ea576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60335461010090046001600160a01b0316331461061d576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff161561064157604051631785c68160e01b815260040160405180910390fd5b6033805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b336110071461069f57604051630f22c43960e41b81526110076004820152602401610514565b6107096040518060400160405280600f81526020016e617070726f76616c4164647265737360881b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e749050565b156107d357601481146107375783838383604051630a5a604160e01b81526004016105149493929190611930565b600061077d601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610ece9050565b90506001600160a01b0381166107ae5784848484604051630a5a604160e01b81526004016105149493929190611930565b606780546001600160a01b0319166001600160a01b0392909216919091179055610a55565b6108386040518060400160405280600a8152602001691b595c9adb19549bdbdd60b21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e749050565b156109085760695460ff1615610861576040516379b3306f60e11b815260040160405180910390fd5b6020811461088a5783838383604051630a5a604160e01b81526004016105149493929190611930565b604080516020601f84018190048102820181019092528281526000916108cb918585808385018382808284376000920191909152509293925050610ece9050565b9050806108f35784848484604051630a5a604160e01b81526004016105149493929190611930565b6068556069805460ff19166001179055610a55565b6109806040518060400160405280601b81526020017f746f6b656e5265636f766572506f7274616c50726f746563746f72000000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e749050565b15610a3457601481146109ae5783838383604051630a5a604160e01b81526004016105149493929190611930565b60006109f4601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610ece9050565b90506001600160a01b038116610a255784848484604051630a5a604160e01b81526004016105149493929190611930565b610a2e81610ed3565b50610a55565b838383836040516325ee20d560e21b81526004016105149493929190611930565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610a8a9493929190611930565b60405180910390a150505050565b60695460ff16610abb5760405163678f619760e11b815260040160405180910390fd5b606854610adb5760405163678f619760e11b815260040160405180910390fd5b6067546001600160a01b0316610b0457604051631a1b977b60e31b815260040160405180910390fd5b60335460ff1615610b2857604051631785c68160e01b815260040160405180910390fd5b610b30610f3a565b6000610bbe89898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a9081908401838280828437600081840152601f19601f82011690508083019250505050505050610bb98e8e33610f93565b6110b4565b90506000818c8c604051602001610bd793929190611962565b604051602081830303815290604052805190602001209050610c08816000908152606a602052604090205460ff1690565b15610c2557604051623e493160e81b815260040160405180910390fd5b610ccd3389898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a908190840183828082843760009201919091525050604080516020808c0282810182019093528b82528994509092508b918b9182919085019084908082843760009201919091525061118c92505050565b610d0e848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506068549150849050611297565b610d2b576040516309bde33960e01b815260040160405180910390fd5b6000818152606a602052604090819020805460ff191660011790555163799758b960e01b8152600481018d9052336024820152604481018c90526110049063799758b990606401600060405180830381600087803b158015610d8c57600080fd5b505af1158015610da0573d6000803e3d6000fd5b505050507f39cc0b7297a0ef9102d75ebc4919ffec0347d50008c2b865eda4125d5812cb64828d338e604051610dd99493929190611989565b60405180910390a15050610dec60018055565b50505050505050505050565b600054610100900460ff16610e1f5760405162461bcd60e51b8152600401610514906119c1565b60018055565b600054610100900460ff16610e4c5760405162461bcd60e51b8152600401610514906119c1565b603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081604051602001610e879190611a0c565b6040516020818303038152906040528051906020012083604051602001610eae9190611a0c565b604051602081830303815290604052805190602001201490505b92915050565b015190565b6033546040516001600160a01b0380841692610100900416907f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b90600090a3603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600260015403610f8c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610514565b6002600155565b600060026040518060400160405280601481526020017342696e616e63652d436861696e2d54696772697360601b815250610ff085604051602001610fda91815260200190565b60405160208183030381529060405260006112ad565b6040516bffffffffffffffffffffffff19606087901b1660208201526110299060340160405160208183030381529060405260016112ad565b61103f88604051602001610fda91815260200190565b6040516020016110529493929190611a28565b60408051601f198184030181529082905261106c91611a0c565b602060405180830381855afa158015611089573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110ac9190611b57565b949350505050565b606083516021146110d857604051638152ea1b60e01b815260040160405180910390fd5b82516040146110fa57604051635e4bd79760e11b815260040160405180910390fd5b604080516020808252818301909252600091602082018180368337019050509050826020820152600085858360405160200161113893929190611b86565b60408051808303601f190181526014808452838301909252925060009190602082018180368337019050509050815160146020830182602086016069600019fa61118157600080fd5b509695505050505050565b606060005b82518110156111ea57818382815181106111ad576111ad611bc9565b60200260200101516040516020016111c6929190611bdf565b604051602081830303815290604052915080806111e290611c17565b915050611191565b5060006040518060400160405280601481526020017342696e616e63652d436861696e2d54696772697360601b8152508787866068548660405160200161123696959493929190611c30565b60408051601f1981840301815291905280516020909101206067549091506001600160a01b0316611267868361147f565b6001600160a01b03161461128e576040516356b00a4f60e11b815260040160405180910390fd5b50505050505050565b6000826112a48584611519565b14949350505050565b60606000835160026112bf9190611ca1565b67ffffffffffffffff8111156112d7576112d7611b70565b6040519080825280601f01601f191660200182016040528015611301576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b85518110156114475781825187838151811061134d5761134d611bc9565b016020015161135f919060f81c611cce565b8151811061136f5761136f611bc9565b01602001516001600160f81b0319168361138a836002611ca1565b8151811061139a5761139a611bc9565b60200101906001600160f81b031916908160001a9053508182518783815181106113c6576113c6611bc9565b01602001516113d8919060f81c611ce2565b815181106113e8576113e8611bc9565b01602001516001600160f81b03191683611403836002611ca1565b61140e906001611cf6565b8151811061141e5761141e611bc9565b60200101906001600160f81b031916908160001a9053508061143f81611c17565b91505061132f565b508315611477578160405160200161145f9190611d09565b60405160208183030381529060405292505050610ec8565b509392505050565b600082516041146114a3576040516356b00a4f60e11b815260040160405180910390fd5b60208301516040840151606085015160001a601b8110156114cc576114c9601b82611d33565b90505b601b8160ff1610806114e15750601c8160ff16115b156114ff576040516356b00a4f60e11b815260040160405180910390fd5b600061150d8683868661155e565b50979650505050505050565b600081815b84518110156114775761154a8286838151811061153d5761153d611bc9565b6020026020010151611622565b91508061155681611c17565b91505061151e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115955750600090506003611619565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115e9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661161257600060019250925050611619565b9150600090505b94509492505050565b600081831061163e57600082815260208490526040902061164d565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461166b57600080fd5b919050565b60006020828403121561168257600080fd5b61164d82611654565b6000806040838503121561169e57600080fd5b823591506116ae60208401611654565b90509250929050565b60005b838110156116d25781810151838201526020016116ba565b50506000910152565b600081518084526116f38160208601602086016116b7565b601f01601f19169290920160200192915050565b60208152600061164d60208301846116db565b60008083601f84011261172c57600080fd5b50813567ffffffffffffffff81111561174457600080fd5b60208301915083602082850101111561175c57600080fd5b9250929050565b6000806000806040858703121561177957600080fd5b843567ffffffffffffffff8082111561179157600080fd5b61179d8883890161171a565b909650945060208701359150808211156117b657600080fd5b506117c38782880161171a565b95989497509550505050565b60008083601f8401126117e157600080fd5b50813567ffffffffffffffff8111156117f957600080fd5b6020830191508360208260051b850101111561175c57600080fd5b60008060008060008060008060008060c08b8d03121561183357600080fd5b8a35995060208b0135985060408b013567ffffffffffffffff8082111561185957600080fd5b6118658e838f0161171a565b909a50985060608d013591508082111561187e57600080fd5b61188a8e838f0161171a565b909850965060808d01359150808211156118a357600080fd5b6118af8e838f0161171a565b909650945060a08d01359150808211156118c857600080fd5b506118d58d828e016117cf565b915080935050809150509295989b9194979a5092959850565b60006020828403121561190057600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000611944604083018688611907565b8281036020840152611957818587611907565b979650505050505050565b600084516119748184602089016116b7565b91909101928352506020820152604001919050565b60808152600061199c60808301876116db565b6020830195909552506001600160a01b03929092166040830152606090910152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251611a1e8184602087016116b7565b9190910192915050565b7f7b226163636f756e745f6e756d626572223a2230222c22636861696e5f6964228152611d1160f11b602082015260008551611a6b816022850160208a016116b7565b7f222c2264617461223a6e756c6c2c226d656d6f223a22222c226d736773223a5b6022918401918201526a3d9130b6b7bab73a111d1160a91b60428201528551611abc81604d840160208a016116b7565b6e1116113932b1b4b834b2b73a111d1160891b604d92909101918201528451611aec81605c8401602089016116b7565b711116113a37b5b2b72fb9bcb6b137b6111d1160711b605c92909101918201528351611b1f81606e8401602088016116b7565b7f227d5d2c2273657175656e6365223a2230222c22736f75726365223a2230227d606e9290910191820152608e019695505050505050565b600060208284031215611b6957600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b60008451611b988184602089016116b7565b845190830190611bac8183602089016116b7565b8451910190611bbf8183602088016116b7565b0195945050505050565b634e487b7160e01b600052603260045260246000fd5b60008351611bf18184602088016116b7565b9190910191825250602001919050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c2957611c29611c01565b5060010190565b60008751611c42818460208c016116b7565b606088901b6bffffffffffffffffffffffff19169083019081528651611c6f816014840160208b016116b7565b0160148101869052603481018590528351611c918160548401602088016116b7565b0160540198975050505050505050565b8082028115828204841417610ec857610ec8611c01565b634e487b7160e01b600052601260045260246000fd5b600082611cdd57611cdd611cb8565b500490565b600082611cf157611cf1611cb8565b500690565b80820180821115610ec857610ec8611c01565b61060f60f31b815260008251611d268160028501602087016116b7565b9190910160020192915050565b60ff8181168382160190811115610ec857610ec8611c0156fea164736f6c6343000811000a" }, "0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD": { "balance": "0x100000000000000000000" diff --git a/scripts/generate.py b/scripts/generate.py index aab5f8c6..5eee74e5 100644 --- a/scripts/generate.py +++ b/scripts/generate.py @@ -98,9 +98,6 @@ def generate_cross_chain(init_batch_size="50"): os.path.join(work_dir, "contracts", contract), os.path.join(work_dir, "contracts", contract[:-4] + ".bak") ) - replace_parameter(contract, "uint256 public constant CROSS_CHAIN_KEY_PREFIX", f"0x01{hex_chain_id}00") - replace_parameter(contract, "uint256 public constant INIT_BATCH_SIZE", f"{init_batch_size}") - def generate_relayer_hub(whitelist_1, whitelist_2): contract = "deprecated/RelayerHub.sol" @@ -108,9 +105,6 @@ def generate_relayer_hub(whitelist_1, whitelist_2): os.path.join(work_dir, "contracts", contract), os.path.join(work_dir, "contracts", contract[:-4] + ".bak") ) - replace_parameter(contract, "address public constant WHITELIST_1", f"{whitelist_1}") - replace_parameter(contract, "address public constant WHITELIST_2", f"{whitelist_2}") - if network == "dev": replace(contract, r"function whitelistInit\(\) external", "function whitelistInit() public") insert(contract, "alreadyInit = true;", "\t\twhitelistInit();") @@ -140,8 +134,6 @@ def generate_stake_hub( ) replace_parameter(contract, "uint256 public constant BREATHE_BLOCK_INTERVAL", f"{breathe_block_interval}") - replace_parameter(contract, "bytes private constant INIT_BC_CONSENSUS_ADDRESSES", f"{init_bc_consensus_addresses}") - replace_parameter(contract, "bytes private constant INIT_BC_VOTE_ADDRESSES", f"{init_bc_vote_addresses}") replace(contract, r"maxElectedValidators = .*;", f"maxElectedValidators = {max_elected_validators};") replace(contract, r"unbondPeriod = .*;", f"unbondPeriod = {unbond_period};") From f4b5ab31d5683ebe5c5f688829561572f55d0753 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 21:06:49 +0800 Subject: [PATCH 24/52] fix: remove unused code --- contracts/BSCValidatorSet.sol | 5 ++--- contracts/System.sol | 3 --- contracts/TokenHub.sol | 8 -------- contracts/deprecated/RelayerIncentivize.sol | 14 -------------- 4 files changed, 2 insertions(+), 28 deletions(-) diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 1c8f9d0d..45def722 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -97,7 +97,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica uint256[19] slots; } - /*----------------- cross chain package -----------------*/ struct ValidatorSetPackage { uint8 packageType; Validator[] validatorSet; @@ -157,7 +156,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica /*----------------- init -----------------*/ function init() external onlyNotInit { (ValidatorSetPackage memory validatorSetPkg, bool valid) = - getValidatorSet(INIT_VALIDATORSET_BYTES); + decodeValidatorSet(INIT_VALIDATORSET_BYTES); require(valid, "failed to parse init validatorSet"); for (uint256 i; i < validatorSetPkg.validatorSet.length; ++i) { currentValidatorSet.push(validatorSetPkg.validatorSet[i]); @@ -1062,7 +1061,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit validatorExitMaintenance(validator); } - function getValidatorSet(bytes memory msgBytes) + function decodeValidatorSet(bytes memory msgBytes) internal pure returns (ValidatorSetPackage memory, bool) diff --git a/contracts/System.sol b/contracts/System.sol index 9dc8c0e3..1f785c78 100644 --- a/contracts/System.sol +++ b/contracts/System.sol @@ -8,10 +8,7 @@ contract System { bool public alreadyInit; uint32 public constant CODE_OK = 0; - - uint8 public constant STAKING_CHANNELID = 0x08; uint16 public constant bscChainID = 0x0038; - address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001; address public constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002; diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index 90dc4b65..0e476128 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -116,14 +116,6 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR return actualAmount; } - function claimMigrationFund(uint256 amount) external onlyStakeHub returns (bool) { - if (address(this).balance >= amount) { - payable(STAKE_HUB_ADDR).transfer(amount); - return true; - } - return false; - } - function getMiniRelayFee() external view override returns (uint256) { return relayFee; } diff --git a/contracts/deprecated/RelayerIncentivize.sol b/contracts/deprecated/RelayerIncentivize.sol index c1b82768..4554a985 100644 --- a/contracts/deprecated/RelayerIncentivize.sol +++ b/contracts/deprecated/RelayerIncentivize.sol @@ -64,20 +64,6 @@ contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber { revert("deprecated"); } - function claimRelayerReward(address relayerAddr) external { - uint256 reward = relayerRewardVault[relayerAddr]; - require(reward > 0, "no relayer reward"); - relayerRewardVault[relayerAddr] = 0; - address payable recipient = address(uint160(relayerAddr)); - if (!recipient.send(reward)) { - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); - systemPayable.transfer(reward); - emit rewardToRelayer(SYSTEM_REWARD_ADDR, reward); - return; - } - emit rewardToRelayer(relayerAddr, reward); - } - function updateParam(string calldata key, bytes calldata value) external override onlyGov { revert("deprecated"); } From 798651e34c25bd4c675a2ea1bfdb2dac41f9a268 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 3 Sep 2024 21:10:09 +0800 Subject: [PATCH 25/52] feat: sync genesis.json --- genesis.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/genesis.json b/genesis.json index b0008266..882eb263 100644 --- a/genesis.json +++ b/genesis.json @@ -46,47 +46,47 @@ }, "0x0000000000000000000000000000000000001000": { "balance": "0x0", - "code": "0x6080604052600436106104615760003560e01c80638c5d749d1161023f578063c81b166211610139578063e1c7392a116100b6578063f92eb86b1161007a578063f92eb86b14610bac578063f9a2bbc714610bc1578063fccc281314610bd6578063fd4ad81f14610beb578063fd6a687914610c1a57610468565b8063e1c7392a14610b2f578063e40716a114610b44578063ea321e4914610b59578063eb57e20214610b79578063f340fa0114610b9957610468565b8063d68fb56a116100fd578063d68fb56a14610ac6578063daacdb6614610adb578063dc927faf14610af0578063df8079e914610b05578063e086c7b114610b1a57610468565b8063c81b166214610a67578063c8509d8114610829578063cb75a59214610a7c578063ce910b0c14610a91578063d58918ae14610ab157610468565b8063aa82dce1116101c7578063aef198a91161018b578063aef198a9146109f1578063b7ab4db514610a06578063b8cf4ef114610a28578063c466689d14610a3d578063c6d3394514610a5257610468565b8063aa82dce114610965578063aad560631461097a578063ab51bb961461098f578063ac431751146109b1578063ad3c9da6146109d157610468565b80639fe0f8161161020e5780639fe0f816146108fc578063a0dc275814610911578063a1a11bf514610926578063a5422d5c1461093b578063a78abc161461095057610468565b80638c5d749d1461089d5780638d19a410146108b25780639369d7de146108d25780639dc09262146108e757610468565b80634df6e0c31161035b57806375d47a0a116102d8578063831d65d11161029c578063831d65d114610829578063862498821461084957806388b32f111461085e5780638a7beb01146108735780638b5ad0c91461088857610468565b806375d47a0a146107c057806378dfed4a146107d55780637a84ca2a146107ea5780637e434d54146107ff578063820dcaa81461081457610468565b8063565c56b31161031f578063565c56b31461072457806360eba4fe1461074457806362b72cf5146107645780636969a25c146107795780636e47b482146107ab57610468565b80634df6e0c3146106b05780635192c82c146106c557806351b4dce3146106da57806351e80672146106ef57806355614fcc1461070457610468565b80632a0ffb6e116103e95780633b071dcc116103ad5780633b071dcc1461061f57806343756e5c1461064257806345cf9daf14610657578063493279b11461066c5780634bf6c8821461068e57610468565b80632a0ffb6e1461057f578063300c35671461059f578063321d398a146105bf5780633365af3a146105df57806335409f7f146105ff57610468565b8063152ad3b811610430578063152ad3b8146104fe5780631bd14ed8146105205780631e4c1524146105355780631ff1806914610555578063280870281461056a57610468565b806304c4fec61461046d57806307a56847146104845780630e2374a5146104af5780631182b875146104d157610468565b3661046857005b600080fd5b34801561047957600080fd5b50610482610c2f565b005b34801561049057600080fd5b50610499610ca3565b6040516104a69190616d7f565b60405180910390f35b3480156104bb57600080fd5b506104c4610ca9565b6040516104a69190616135565b3480156104dd57600080fd5b506104f16104ec36600461601b565b610caf565b6040516104a69190616255565b34801561050a57600080fd5b50610513610dcb565b6040516104a6919061624a565b34801561052c57600080fd5b50610499610dd4565b34801561054157600080fd5b50610482610550366004615e49565b610dda565b34801561056157600080fd5b5061049961110e565b34801561057657600080fd5b506104c4611114565b34801561058b57600080fd5b5061048261059a366004615da9565b61111a565b3480156105ab57600080fd5b506104826105ba366004615de1565b61113b565b3480156105cb57600080fd5b506105136105da366004615fc8565b611484565b3480156105eb57600080fd5b506105136105fa366004615fc8565b611553565b34801561060b57600080fd5b5061048261061a366004615da9565b611604565b34801561062b57600080fd5b50610634611769565b6040516104a69291906161da565b34801561064e57600080fd5b506104c4611a45565b34801561066357600080fd5b50610499611a4b565b34801561067857600080fd5b50610681611a51565b6040516104a69190616d70565b34801561069a57600080fd5b506106a3611a56565b6040516104a69190616dc3565b3480156106bc57600080fd5b50610634611a5b565b3480156106d157600080fd5b50610499611be7565b3480156106e657600080fd5b506104c4611bed565b3480156106fb57600080fd5b506104c4611bf3565b34801561071057600080fd5b5061051361071f366004615da9565b611bf9565b34801561073057600080fd5b5061049961073f366004615da9565b611c35565b34801561075057600080fd5b506104f161075f366004615fc8565b611c86565b34801561077057600080fd5b50610499611d2c565b34801561078557600080fd5b50610799610794366004615fc8565b611d32565b6040516104a696959493929190616162565b3480156107b757600080fd5b506104c4611d96565b3480156107cc57600080fd5b506104c4611d9c565b3480156107e157600080fd5b50610499611da2565b3480156107f657600080fd5b50610499611da8565b34801561080b57600080fd5b506104c4611dae565b34801561082057600080fd5b50610499611db4565b34801561083557600080fd5b5061048261084436600461601b565b611dba565b34801561085557600080fd5b50610499611ddb565b34801561086a57600080fd5b50610499611de1565b34801561087f57600080fd5b50610513611de7565b34801561089457600080fd5b50610499611df0565b3480156108a957600080fd5b50610499611df6565b3480156108be57600080fd5b506104996108cd366004615da9565b611e13565b3480156108de57600080fd5b50610482611e53565b3480156108f357600080fd5b506104c4611f67565b34801561090857600080fd5b50610499611f6d565b34801561091d57600080fd5b50610499611f72565b34801561093257600080fd5b506104c4611f77565b34801561094757600080fd5b506104f1611f7d565b34801561095c57600080fd5b50610513611f9c565b34801561097157600080fd5b506104c4611fa5565b34801561098657600080fd5b506104c4611fab565b34801561099b57600080fd5b506109a4611fb1565b6040516104a69190616db2565b3480156109bd57600080fd5b506104826109cc366004615f6c565b611fb6565b3480156109dd57600080fd5b506104996109ec366004615da9565b6129a8565b3480156109fd57600080fd5b506104996129ba565b348015610a1257600080fd5b50610a1b6129c7565b6040516104a691906161c7565b348015610a3457600080fd5b50610499612ab2565b348015610a4957600080fd5b50610499612ab7565b348015610a5e57600080fd5b50610499612abd565b348015610a7357600080fd5b506104c4612ac2565b348015610a8857600080fd5b50610499612ac8565b348015610a9d57600080fd5b506104f1610aac366004615fc8565b612ace565b348015610abd57600080fd5b50610499612adb565b348015610ad257600080fd5b50610499612ae1565b348015610ae757600080fd5b50610499612b20565b348015610afc57600080fd5b506104c4612b26565b348015610b1157600080fd5b506104c4612b2c565b348015610b2657600080fd5b50610499612b32565b348015610b3b57600080fd5b50610482612b37565b348015610b5057600080fd5b50610499612ce0565b348015610b6557600080fd5b50610513610b74366004615f2d565b612ce6565b348015610b8557600080fd5b50610482610b94366004615da9565b612e6c565b610482610ba7366004615da9565b612f74565b348015610bb857600080fd5b5061049961332a565b348015610bcd57600080fd5b506104c4613330565b348015610be257600080fd5b506104c4613336565b348015610bf757600080fd5b50610c0b610c06366004615fc8565b61333c565b6040516104a693929190616d88565b348015610c2657600080fd5b506104c46133fe565b6000610c3a33611e13565b9050600b8181548110610c4957fe5b600091825260209091206001601690920201015460ff16610c855760405162461bcd60e51b8152600401610c7c90616a27565b60405180910390fd5b6000610c8f612ae1565b9050610c9e3383836001613404565b505050565b60095481565b61200181565b60005460609060ff16610cd45760405162461bcd60e51b8152600401610c7c906163dd565b3361200014610cf55760405162461bcd60e51b8152600401610c7c90616b88565b600b54610db357610d04615955565b60015460005b81811015610daf57600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff1916911515919091179055604086015180518794610d8b93600080516020616e78833981519152909101920190615984565b506060820151610da190600383019060136159fe565b505050806001019050610d0a565b5050505b60405162461bcd60e51b8152600401610c7c9061668c565b60075460ff1681565b600f5481565b334114610df95760405162461bcd60e51b8152600401610c7c90616bd7565b3a15610e175760405162461bcd60e51b8152600401610c7c90616966565b8251604080518281526020808402820101909152606090828015610e5557816020015b610e42615a2b565b815260200190600190039081610e3a5790505b50905060005b82811015610eff576040518060c00160405280878381518110610e7a57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001868381518110610ebc57fe5b60200260200101516001600160401b031681526020016000151581526020016000815250828281518110610eec57fe5b6020908102919091010152600101610e5b565b50606080610f0d83866135f6565b9150915060005b60015481101561100357600060018281548110610f2d57fe5b906000526020600020906004020160030154905080600014610ffa57600060018381548110610f5857fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab8260018581548110610f8c57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b168152610fc7926001600160a01b039092169101616135565b6000604051808303818588803b158015610fe057600080fd5b505af1158015610ff4573d6000803e3d6000fd5b50505050505b50600101610f14565b504715611071577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516110399190616d7f565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561106f573d6000803e3d6000fd5b505b6000600355815115611087576110878282613ae0565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b61200581565b3361200214610db35760405162461bcd60e51b8152600401610c7c90616d39565b33411461115a5760405162461bcd60e51b8152600401610c7c90616bd7565b601054431161117b5760405162461bcd60e51b8152600401610c7c906165b6565b3a156111995760405162461bcd60e51b8152600401610c7c90616966565b60005460ff166111bb5760405162461bcd60e51b8152600401610c7c906163dd565b60006110023168056bc75e2d631000008111156111f2576111eb8168056bc75e2d6310000063ffffffff6142cf16565b91506111f9565b505061147a565b6040516309a99b4f60e41b815261100290639a99b4f0906112209030908690600401616149565b602060405180830381600087803b15801561123a57600080fd5b505af115801561124e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112729190615fe0565b91508161128057505061147a565b6000805b848110156112ae5785858281811061129857fe5b9050602002013582019150806001019050611284565b50806112bc5750505061147a565b6000806000805b8981101561147257848989838181106112d857fe5b905060200201358802816112e857fe5b0493508a8a828181106112f757fe5b905060200201602081019061130c9190615da9565b6001600160a01b0381166000908152600460205260409020549093509150811561142857600060018084038154811061134157fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156113ae57836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516113a19190616d7f565b60405180910390a2611422565b6003546113c1908663ffffffff61431116565b60039081558101546113d9908663ffffffff61431116565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611419908890616d7f565b60405180910390a25b5061146a565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516114619190616d7f565b60405180910390a25b6001016112c3565b505050505050505b5050436010555050565b60015460009082106114985750600061154e565b60006001600160a01b0316600183815481106114b057fe5b60009182526020909120600490910201546001600160a01b031614806114e0575060085415806114e05750600a54155b806114ef575060085460095410155b8061150057506114fe82611553565b155b8061152957506000600b838154811061151557fe5b906000526020600020906016020160000154115b8061153d575060016115396129c7565b5111155b1561154a5750600061154e565b5060015b919050565b60015460009082106115675750600061154e565b600b5482106115a4576001828154811061157d57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615905061154e565b600182815481106115b157fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156115fe5750600b82815481106115e557fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b546116c257611613615955565b60015460005b818110156116be57600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff191691151591909117905560408601518051879461169a93600080516020616e78833981519152909101920190615984565b5060608201516116b090600383019060136159fe565b505050806001019050611619565b5050505b3361100114806116d3575033612002145b6116ef5760405162461bcd60e51b8152600401610c7c90616414565b6001600160a01b038116600090815260046020526040902054806117135750611766565b6001810390506000600b828154811061172857fe5b600091825260209091206001601690920201015460ff16905061174b8383614336565b80156117545750805b15610c9e576009805460001901905550505b50565b60015460609081906000805b828110156117bc576001818154811061178a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117b4576001909101905b600101611775565b506060816040519080825280602002602001820160405280156117e9578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561182257816020015b606081526020019060019003908161180d5790505b50600b546000945090915084141561199d5760005b84811015611997576001818154811061184c57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661198f576001818154811061187c57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106118a757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b81815481106118d457fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561196c5780601f106119415761010080835404028352916020019161196c565b820191906000526020600020905b81548152906001019060200180831161194f57829003601f168201915b505050505082858151811061197d57fe5b60209081029190910101526001909301925b600101611837565b50611a39565b60005b84811015611a3757600181815481106119b557fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611a2f57600181815481106119e557fe5b600091825260209091206004909102015483516001600160a01b0390911690849086908110611a1057fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016119a0565b505b909450925050505b9091565b61100181565b60085481565b603881565b600881565b6060806000600e549050600080600c5411611a77576015611a7b565b600c545b90506060611a876129c7565b90506060611a94826146f9565b905082825111611aab579094509250611a41915050565b83838351031015611abd578282510393505b8315611af35760c84304611ad983838388880360008a8a614867565b611af18383838888038989038a8b8b8b510301614867565b505b606083604051908082528060200260200182016040528015611b1f578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611b5857816020015b6060815260200190600190039081611b435790505b50905060005b85811015611bd957848181518110611b7257fe5b6020026020010151838281518110611b8657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611bb257fe5b6020026020010151828281518110611bc657fe5b6020908102919091010152600101611b5e565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611c2157600091505061154e565b60001901611c2e81611553565b9392505050565b6001600160a01b03811660009081526004602052604081205480611c5d57600091505061154e565b600180820381548110611c6c57fe5b906000526020600020906004020160030154915050919050565b60128181548110611c9357fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611d245780601f10611cf957610100808354040283529160200191611d24565b820191906000526020600020905b815481529060010190602001808311611d0757829003601f168201915b505050505081565b60105481565b60018181548110611d3f57fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b61100881565b6103e881565b600c5481565b61200381565b61271081565b3361200014610db35760405162461bcd60e51b8152600401610c7c90616b88565b60025481565b60115481565b60145460ff1681565b600a5481565b600060175460001415611e0b57506001611e10565b506017545b90565b6001600160a01b03811660009081526004602052604081205480611e495760405162461bcd60e51b8152600401610c7c90616b10565b6000190192915050565b600b54611f1157611e62615955565b60015460005b81811015611f0d57600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff1916911515919091179055604086015180518794611ee993600080516020616e78833981519152909101920190615984565b506060820151611eff90600383019060136159fe565b505050806001019050611e68565b5050505b600854611f1e5760036008555b600a54611f2b576002600a555b6000611f3633611e13565b9050611f4181611484565b611f5d5760405162461bcd60e51b8152600401610c7c906168e2565b61176633826149be565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef8152602001616e986105ef913981565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16611fd85760405162461bcd60e51b8152600401610c7c906163dd565b3361100714611ff95760405162461bcd60e51b8152600401610c7c90616994565b61205984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614a569050565b1561210e576020811461207e5760405162461bcd60e51b8152600401610c7c9061629a565b604080516020601f84018190048102820181019092528281526000916120bc91858580838501838280828437600092019190915250614aaf92505050565b90506127106120e86018546120dc600f548561431190919063ffffffff16565b9063ffffffff61431116565b11156121065760405162461bcd60e51b8152600401610c7c906166b0565b600655612965565b61217884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614a569050565b15612212576020811461219d5760405162461bcd60e51b8152600401610c7c906162d1565b604080516020601f84018190048102820181019092528281526000916121db91858580838501838280828437600092019190915250614aaf92505050565b600c54909150806121ea575060155b8082106122095760405162461bcd60e51b8152600401610c7c906165f8565b50600855612965565b61227b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614a569050565b1561231457602081146122a05760405162461bcd60e51b8152600401610c7c90616363565b604080516020601f84018190048102820181019092528281526000916122de91858580838501838280828437600092019190915250614aaf92505050565b90506000811180156122f05750600a81105b61230c5760405162461bcd60e51b8152600401610c7c90616c6c565b600a55612965565b61238884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614a569050565b1561241757602081146123ad5760405162461bcd60e51b8152600401610c7c90616317565b604080516020601f84018190048102820181019092528281526000916123eb91858580838501838280828437600092019190915250614aaf92505050565b9050600d5481111561240f5760405162461bcd60e51b8152600401610c7c906167b9565b600e55612965565b61248084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614a569050565b1561250257602081146124a55760405162461bcd60e51b8152600401610c7c906169e2565b604080516020601f84018190048102820181019092528281526000916124e391858580838501838280828437600092019190915250614aaf92505050565b600d819055600e549091508110156124fc57600d54600e555b50612965565b61256684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614a569050565b15612614576020811461258b5760405162461bcd60e51b8152600401610c7c906163a8565b604080516020601f84018190048102820181019092528281526000916125c991858580838501838280828437600092019190915250614aaf92505050565b9050600081116125eb5760405162461bcd60e51b8152600401610c7c90616511565b606481111561260c5760405162461bcd60e51b8152600401610c7c90616559565b600c55612965565b61268084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614a569050565b1561272957602081146126a55760405162461bcd60e51b8152600401610c7c90616c24565b604080516020601f84018190048102820181019092528281526000916126e391858580838501838280828437600092019190915250614aaf92505050565b90506127106127036018546120dc6006548561431190919063ffffffff16565b11156127215760405162461bcd60e51b8152600401610c7c90616482565b600f55612965565b61279d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614a569050565b1561284657602081146127c25760405162461bcd60e51b8152600401610c7c9061673f565b604080516020601f840181900481028201810190925282815260009161280091858580838501838280828437600092019190915250614aaf92505050565b9050612710612820600f546120dc6006548561431190919063ffffffff16565b111561283e5760405162461bcd60e51b8152600401610c7c90616853565b601855612965565b6128a784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614a569050565b1561294d57602081146128cc5760405162461bcd60e51b8152600401610c7c90616655565b604080516020601f840181900481028201810190925282815260009161290a91858580838501838280828437600092019190915250614aaf92505050565b90506003811015801561291e575060098111155b806129295750806001145b6129455760405162461bcd60e51b8152600401610c7c90616a8a565b601755612965565b60405162461bcd60e51b8152600401610c7c90616cc9565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161299a9493929190616268565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156129f6576129e281611553565b156129ee578160010191505b6001016129d1565b50606081604051908082528060200260200182016040528015612a23578160200160208202803683370190505b5090506000915060005b83811015612aaa57612a3e81611553565b15612aa25760018181548110612a5057fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612a7b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612a2d565b509250505090565b601581565b61027181565b600281565b61100281565b60175481565b60138181548110611c9357fe5b60185481565b6000612aeb6129c7565b519050600080600c5411612b00576015612b04565b600c545b905080821115612b12578091505b81612b1c57600191505b5090565b60055481565b61100381565b61200481565b606481565b60005460ff1615612b5a5760405162461bcd60e51b8152600401610c7c90616a53565b612b62615a60565b6000612b886040518061062001604052806105ef8152602001616e986105ef9139614ab4565b9150915080612ba95760405162461bcd60e51b8152600401610c7c90616b47565b60005b826020015151811015612cce57600183602001518281518110612bcb57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612ca157fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612bac565b50506000805460ff1916600117905550565b600d5481565b601354600090815b81811015612def57612dd785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612d3f57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612dcd5780601f10612da257610100808354040283529160200191612dcd565b820191906000526020600020905b815481529060010190602001808311612db057829003601f168201915b5050505050614c70565b15612de7576001925050506115fe565b600101612cee565b5060125460005b81811015612e6057612e4786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612d3f57fe5b15612e5857600193505050506115fe565b600101612df6565b50600095945050505050565b3361100114612e8d5760405162461bcd60e51b8152600401610c7c90616cf0565b600b54612f4b57612e9c615955565b60015460005b81811015612f4757600b80546001810182556000919091528351600080516020616e5883398151915260169092029182019081556020808601516000805160206174878339815191528401805460ff1916911515919091179055604086015180518794612f2393600080516020616e78833981519152909101920190615984565b506060820151612f3990600383019060136159fe565b505050806001019050612ea2565b5050505b6000612f5682614cd4565b9050612f6181611484565b15612f7057612f7082826149be565b5050565b334114612f935760405162461bcd60e51b8152600401610c7c90616bd7565b60005460ff16612fb55760405162461bcd60e51b8152600401610c7c906163dd565b60003411612fd55760405162461bcd60e51b8152600401610c7c9061678a565b3a15612ff35760405162461bcd60e51b8152600401610c7c90616966565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661303357610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561304a57506000601854115b1561306f57600160175403601754438161306057fe5b06601854028161306c57fe5b04015b60008311801561307f5750600081115b1561312c5760006130a861271061309c348563ffffffff614e5716565b9063ffffffff614e9116565b9050801561312a576040516110029082156108fc029083906000818181858888f193505050501580156130df573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d8160405161310f9190616d7f565b60405180910390a1613127848263ffffffff6142cf16565b93505b505b60008311801561313e57506000600654115b156131e457600061316061271061309c60065434614e5790919063ffffffff16565b905080156131e25760405161dead9082156108fc029083906000818181858888f19350505050158015613197573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516131c79190616d7f565b60405180910390a16131df848263ffffffff6142cf16565b93505b505b81156132e25760006001808403815481106131fb57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561326857846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48560405161325b9190616d7f565b60405180910390a26132dc565b60035461327b908563ffffffff61431116565b6003908155810154613293908563ffffffff61431116565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055906132d3908790616d7f565b60405180910390a25b50613324565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b48460405161331b9190616d7f565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061334957fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff909116949192918301828280156133f45780601f106133c9576101008083540402835291602001916133f4565b820191906000526020600020905b8154815290600101906020018083116133d757829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613415575082155b806134205750600954155b1561342d575060006135ee565b60096000815460019003919050819055506000613478600a5461309c8661309c600b8a8154811061345a57fe5b6000918252602090912060169091020154439063ffffffff6142cf16565b90506000600b868154811061348957fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156134ee57600080fd5b505afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615ff8565b91509150600093508083106135a45761353f8888614336565b506040516328aa02b160e01b8152611001906328aa02b190613569908b9087908a906004016161a4565b600060405180830381600087803b15801561358357600080fd5b505af1158015613597573d6000803e3d6000fd5b50505050600193506135b6565b8183106135b6576135b488614cd4565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b606080600080808080613607612ae1565b6001549091505b801561383957600181039250600b838154811061362757fe5b600091825260209091206001601690920201015460ff1661364757613830565b6001838154811061365457fe5b600091825260208220600490910201546001600160a01b0316955061367e90869085908590613404565b93508361368a57613830565b60405163436aa28360e11b81526000908190612002906386d54506906136b4908a90600401616135565b60206040518083038186803b1580156136cc57600080fd5b505afa1580156136e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137049190615dc5565b90506001600160a01b0381161561378d576040516302ceee9160e11b81526120029063059ddd229061373a908490600401616135565b60206040518083038186803b15801561375257600080fd5b505afa158015613766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378a9190615dc5565b91505b60005b8c5181101561382c57876001600160a01b03168d82815181106137af57fe5b6020026020010151600001516001600160a01b031614806137f85750826001600160a01b03168d82815181106137e157fe5b6020026020010151600001516001600160a01b0316145b156138245760018d828151811061380b57fe5b602090810291909101015190151560809091015261382c565b600101613790565b5050505b6000190161360e565b5060005b89518110156138a65789818151811061385257fe5b60200260200101516080015180613892575060006001600160a01b03168a828151811061387b57fe5b6020026020010151600001516001600160a01b0316145b1561389e578560010195505b60010161383d565b508851851061398e5760408051600180825281830190925290816020015b6138cc615a2b565b8152602001906001900390816138c4575050604080516001808252818301909252919850602082015b60608152602001906001900390816138f55790505095508860008151811061391957fe5b60200260200101518760008151811061392e57fe5b60200260200101819052508760008151811061394657fe5b60200260200101518660008151811061395b57fe5b602002602001018190525060008760008151811061397557fe5b6020908102919091010151901515608090910152613ad3565b848951036040519080825280602002602001820160405280156139cb57816020015b6139b8615a2b565b8152602001906001900390816139b05790505b50965084895103604051908082528060200260200182016040528015613a0557816020015b60608152602001906001900390816139f05790505b5095506000915060005b8951811015613ad157898181518110613a2457fe5b602002602001015160800151158015613a67575060006001600160a01b03168a8281518110613a4f57fe5b6020026020010151600001516001600160a01b031614155b15613ac957898181518110613a7857fe5b6020026020010151888481518110613a8c57fe5b6020026020010181905250888181518110613aa357fe5b6020026020010151878481518110613ab757fe5b60200260200101819052508260010192505b600101613a0f565b505b50505050505b9250929050565b600154825160005b82811015613bfd576001613afa615a2b565b60018381548110613b0757fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613bd157878181518110613b9757fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613bc95760009250613bd1565b600101613b83565b508115613bf35780516001600160a01b03166000908152600460205260408120555b5050600101613ae8565b5080821115613cbc57805b82811015613cba576001805480613c1b57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613c6e57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613ca06002830182615a84565b613cae600383016000615ac8565b50509055600101613c08565b505b6000818310613ccb5781613ccd565b825b905060005b8181101561407157613d7f868281518110613ce957fe5b602002602001015160018381548110613cfe57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152614ed3565b613f33578060010160046000888481518110613d9757fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110613dd357fe5b602002602001015160018281548110613de857fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110613ea357fe5b6020026020010151600b8281548110613eb857fe5b90600052602060002090601602016002019080519060200190613edc929190615984565b506000600b8281548110613eec57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110613f1d57fe5b6000918252602090912060169091020155614069565b858181518110613f3f57fe5b60200260200101516060015160018281548110613f5857fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b0316021790555061401e858281518110613f9c57fe5b6020026020010151600b8381548110613fb157fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612dcd5780601f10612da257610100808354040283529160200191612dcd565b6140695784818151811061402e57fe5b6020026020010151600b828154811061404357fe5b90600052602060002090601602016002019080519060200190614067929190615984565b505b600101613cd2565b508282111561424957614082615955565b835b838110156142465785818151811061409857fe5b6020026020010151826040018190525060018782815181106140b657fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616e588339815191528101918255858301516000805160206174878339815191528201805491151560ff19909216919091179055928501518051869492936141ec93600080516020616e7883398151915201920190615984565b50606082015161420290600383019060136159fe565b505050806001016004600089848151811061421957fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101614084565b50505b614251614f2f565b614259615111565b6000600981905560015493505b838110156142c7576000600b828154811061427d57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106142ae57fe5b6000918252602090912060169091020155600101614266565b505050505050565b6000611c2e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152ff565b600082820183811015611c2e5760405162461bcd60e51b8152600401610c7c9061644b565b6000806001838154811061434657fe5b906000526020600020906004020160030154905060006001808054905003905060016143706129c7565b51116143a55760006001858154811061438557fe5b9060005260206000209060040201600301819055506000925050506115fe565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143de9190616d7f565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156145cb576001816001018154811061441f57fe5b90600052602060002090600402016001828154811061443a57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106144fb57fe5b9060005260206000209060160201600b828154811061451657fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff199092169190911790556002808401805461456d938386019390821615610100026000190190911604615ad7565b5061458060038281019084016013615b4c565b5090505080600101600460006001848154811061459957fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614401565b5060018054806145d757fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061462a57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061465c6002830182615a84565b61466a600383016000615ac8565b50509055600081838161467957fe5b04905080156146ed5760015460005b818110156146ea576146c183600183815481106146a157fe5b90600052602060002090600402016003015461431190919063ffffffff16565b600182815481106146ce57fe5b6000918252602090912060036004909202010155600101614688565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561473857816020015b60608152602001906001900390816147235790505b50600b54909150831461474f57925061154e915050565b60005b8281101561485e57600b60016004600089858151811061476e57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106147a257fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561483a5780601f1061480f5761010080835404028352916020019161483a565b820191906000526020600020905b81548152906001019060200180831161481d57829003601f168201915b505050505082828151811061484b57fe5b6020908102919091010152600101614752565b50949350505050565b60005b828110156149b4576000828783880160405160200161488a929190616127565b6040516020818303038152906040528051906020012060001c816148aa57fe5b069050808501828701146149ab57600089838801815181106148c857fe5b60200260200101519050606089848901815181106148e257fe5b602002602001015190508a838801815181106148fa57fe5b60200260200101518b858a018151811061491057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061493f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061496d57fe5b60200260200101518a858a018151811061498357fe5b6020026020010181905250808a8489018151811061499d57fe5b602002602001018190525050505b5060010161486a565b5050505050505050565b600980546001908101909155600b8054839081106149d857fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b8281548110614a0e57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614a69919061610b565b6040516020818303038152906040528051906020012083604051602001614a90919061610b565b6040516020818303038152906040528051906020012014905092915050565b015190565b614abc615a60565b6000614ac6615a60565b614ace615b76565b614adf614ada8661532b565b615350565b90506000805b614aee8361539a565b15614c625780614b1357614b09614b04846153bb565b615409565b60ff168452614c5a565b8060011415614c55576060614b2f614b2a856153bb565b615489565b90508051604051908082528060200260200182016040528015614b6c57816020015b614b59615a2b565b815260200190600190039081614b515790505b5085602001819052508051604051908082528060200260200182016040528015614baa57816020015b6060815260200190600190039081614b955790505b50604086015260005b8151811015614c4a57614bc4615a2b565b60606000614be4858581518110614bd757fe5b602002602001015161555a565b92509250925080614c04578860009a509a50505050505050505050614c6b565b8289602001518581518110614c1557fe5b60200260200101819052508189604001518581518110614c3157fe5b6020026020010181905250505050806001019050614bb3565b506001925050614c5a565b614c62565b600101614ae5565b50919350909150505b915091565b815181516000916001918114808314614c8c5760009250614cca565b600160208701838101602088015b600284838510011415614cc5578051835114614cb95760009650600093505b60209283019201614c9a565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614cfd5750600019905061154e565b600181039050600060018281548110614d1257fe5b9060005260206000209060040201600301549050600060018381548110614d3557fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614d8e908590616d7f565b60405180910390a280614da65782935050505061154e565b6000818381614db157fe5b0490508015614e4d5760005b84811015614dff57614dd682600183815481106146a157fe5b60018281548110614de357fe5b6000918252602090912060036004909202010155600101614dbd565b50600180549085015b81811015614e4a57614e2183600183815481106146a157fe5b60018281548110614e2e57fe5b6000918252602090912060036004909202010155600101614e08565b50505b5091949350505050565b600082614e66575060006115fe565b82820282848281614e7357fe5b0414611c2e5760405162461bcd60e51b8152600401610c7c90616925565b6000611c2e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615674565b805182516000916001600160a01b039182169116148015614f0d575081602001516001600160a01b031683602001516001600160a01b0316145b8015611c2e5750506040908101519101516001600160a01b0390811691161490565b60125460135480821115614f7a57805b82811015614f78576012805480614f5257fe5b600190038181906000526020600020016000614f6e9190615a84565b9055600101614f3f565b505b6000818310614f895781614f8b565b825b905060005b818110156150a35761504860128281548110614fa857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156150365780601f1061500b57610100808354040283529160200191615036565b820191906000526020600020905b81548152906001019060200180831161501957829003601f168201915b505050505060138381548110612d3f57fe5b61509b576013818154811061505957fe5b906000526020600020016012828154811061507057fe5b906000526020600020019080546001816001161561010002031660029004615099929190615ad7565b505b600101614f90565b5082821115610c9e57825b82811015613324576012601382815481106150c557fe5b6000918252602080832084546001818101875595855291909320929091018054615108949390920192909160026101009282161592909202600019011604615ad7565b506001016150ae565b601354600b548082111561515c57805b8281101561515a57601380548061513457fe5b6001900381819060005260206000200160006151509190615a84565b9055600101615121565b505b600081831061516b578161516d565b825b905060005b8181101561528c5761522a6013828154811061518a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156152185780601f106151ed57610100808354040283529160200191615218565b820191906000526020600020905b8154815290600101906020018083116151fb57829003601f168201915b5050505050600b8381548110613fb157fe5b61528457600b818154811061523b57fe5b90600052602060002090601602016002016013828154811061525957fe5b906000526020600020019080546001816001161561010002031660029004615282929190615ad7565b505b600101615172565b5082821115610c9e57825b82811015613324576013600b82815481106152ae57fe5b6000918252602080832084546001808201875595855291909320601692909202909201600290810180546152f695939094019390926000199082161561010002011604615ad7565b50600101615297565b600081848411156153235760405162461bcd60e51b8152600401610c7c9190616255565b505050900390565b615333615b96565b506040805180820190915281518152602082810190820152919050565b615358615b76565b615361826156ab565b61536a57600080fd5b600061537983602001516156e5565b60208085015160408051808201909152868152920190820152915050919050565b60006153a4615b96565b505080518051602091820151919092015191011190565b6153c3615b96565b6153cc8261539a565b6153d557600080fd5b602082015160006153e582615748565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061541e57508151602110155b61542757600080fd5b600061543683602001516156e5565b9050808360000151101561545c5760405162461bcd60e51b8152600401610c7c90616ad9565b82516020808501518301805192849003929183101561485e57506020919091036101000a90049392505050565b6060615494826156ab565b61549d57600080fd5b60006154a883615829565b90506060816040519080825280602002602001820160405280156154e657816020015b6154d3615b96565b8152602001906001900390816154cb5790505b50905060006154f885602001516156e5565b60208601510190506000805b8481101561554f5761551583615748565b915060405180604001604052808381526020018481525084828151811061553857fe5b602090810291909101015291810191600101615504565b509195945050505050565b615562615a2b565b6060600061556e615a2b565b6060615578615b76565b61558187615350565b90506000805b6155908361539a565b1561566557806155bb576155ab6155a6846153bb565b615885565b6001600160a01b0316855261565d565b80600114156155e3576155d06155a6846153bb565b6001600160a01b0316602086015261565d565b806002141561560b576155f86155a6846153bb565b6001600160a01b0316604086015261565d565b806003141561563757615620614b04846153bb565b6001600160401b031660608601526001915061565d565b80600414156156585761565161564c846153bb565b61589f565b935061565d565b615665565b600101615587565b50929791965091945092505050565b600081836156955760405162461bcd60e51b8152600401610c7c9190616255565b5060008385816156a157fe5b0495945050505050565b80516000906156bc5750600061154e565b6020820151805160001a9060c08210156156db5760009250505061154e565b5060019392505050565b8051600090811a60808110156156ff57600091505061154e565b60b881108061571a575060c0811080159061571a575060f881105b1561572957600191505061154e565b60c081101561573d5760b51901905061154e565b60f51901905061154e565b80516000908190811a60808110156157635760019150615822565b60b881101561577857607e1981019150615822565b60c08110156157c957600060b78203600186019550806020036101000a8651049150600181018201935050808310156157c35760405162461bcd60e51b8152600401610c7c90616828565b50615822565b60f88110156157de5760be1981019150615822565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156158205760405162461bcd60e51b8152600401610c7c90616828565b505b5092915050565b805160009061583a5750600061154e565b6000809050600061584e84602001516156e5565b602085015185519181019250015b8082101561587c5761586d82615748565b8201915082600101925061585c565b50909392505050565b805160009060151461589657600080fd5b6115fe82615409565b80516060906158ad57600080fd5b60006158bc83602001516156e5565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156158f3576020820181803683370190505b509050600081602001905061485e8487602001510182858061591457610c9e565b5b60208110615934578251825260209283019290910190601f1901615915565b915181516020939093036101000a6000190180199091169216919091179052565b6040518060800160405280600081526020016000151581526020016060815260200161597f615bb0565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106159c557805160ff19168380011785556159f2565b828001600101855582156159f2579182015b828111156159f25782518255916020019190600101906159d7565b50612b1c929150615bcf565b82601381019282156159f257916020028201828111156159f25782518255916020019190600101906159d7565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615aaa5750611766565b601f0160209004906000526020600020908101906117669190615bcf565b50611766906013810190615bcf565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615b1057805485556159f2565b828001600101855582156159f257600052602060002091601f016020900482015b828111156159f2578254825591600101919060010190615b31565b82601381019282156159f257918201828111156159f2578254825591600101919060010190615b31565b6040518060400160405280615b89615b96565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b611e1091905b80821115612b1c5760008155600101615bd5565b80356115fe81616e42565b60008083601f840112615c05578182fd5b5081356001600160401b03811115615c1b578182fd5b6020830191508360208083028501011115613ad957600080fd5b6000601f8381840112615c46578182fd5b8235615c59615c5482616df7565b616dd1565b818152925060208084019085810160005b84811015615ceb578135880189603f820112615c8557600080fd5b838101356001600160401b03811115615c9d57600080fd5b615cae818901601f19168601616dd1565b81815260408c81848601011115615cc457600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615c6a565b50505050505092915050565b600082601f830112615d07578081fd5b8135615d15615c5482616df7565b818152915060208083019084810181840286018201871015615d3657600080fd5b6000805b85811015615ceb5782356001600160401b0381168114615d58578283fd5b85529383019391830191600101615d3a565b60008083601f840112615d7b578182fd5b5081356001600160401b03811115615d91578182fd5b602083019150836020828501011115613ad957600080fd5b600060208284031215615dba578081fd5b8135611c2e81616e42565b600060208284031215615dd6578081fd5b8151611c2e81616e42565b60008060008060408587031215615df6578283fd5b84356001600160401b0380821115615e0c578485fd5b615e1888838901615bf4565b90965094506020870135915080821115615e30578384fd5b50615e3d87828801615bf4565b95989497509550505050565b600080600060608486031215615e5d578283fd5b83356001600160401b0380821115615e73578485fd5b81860187601f820112615e84578586fd5b80359250615e94615c5484616df7565b80848252602080830192508084018b828389028701011115615eb457898afd5b8994505b86851015615ede57615eca8c82615be9565b845260019490940193928101928101615eb8565b509097508801359350505080821115615ef5578384fd5b615f0187838801615cf7565b93506040860135915080821115615f16578283fd5b50615f2386828701615c35565b9150509250925092565b60008060208385031215615f3f578182fd5b82356001600160401b03811115615f54578283fd5b615f6085828601615d6a565b90969095509350505050565b60008060008060408587031215615f81578384fd5b84356001600160401b0380821115615f97578586fd5b615fa388838901615d6a565b90965094506020870135915080821115615fbb578384fd5b50615e3d87828801615d6a565b600060208284031215615fd9578081fd5b5035919050565b600060208284031215615ff1578081fd5b5051919050565b6000806040838503121561600a578182fd5b505080516020909101519092909150565b60008060006040848603121561602f578081fd5b833560ff8116811461603f578182fd5b925060208401356001600160401b03811115616059578182fd5b61606586828701615d6a565b9497909650939450505050565b6000815180845260208085019450808401835b838110156160aa5781516001600160a01b031687529582019590820190600101616085565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526160f7816020860160208601616e16565b601f01601f19169290920160200192915050565b6000825161611d818460208701616e16565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611c2e6020830184616072565b6000604082526161ed6040830185616072565b602083820381850152818551808452828401915082838202850101838801865b8381101561623b57601f198784030185526162298383516160df565b9486019492509085019060010161620d565b50909998505050505050505050565b901515815260200190565b600060208252611c2e60208301846160df565b60006040825261627c6040830186886160b5565b828103602084015261628f8185876160b5565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152616da960608301846160df565b95945050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715616def57600080fd5b604052919050565b60006001600160401b03821115616e0c578081fd5b5060209081020190565b60005b83811015616e31578181015183820152602001616e19565b838111156133245750506000910152565b6001600160a01b038116811461176657600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" + "code": "0x6080604052600436106104565760003560e01c80638c5d749d1161023f578063c81b166211610139578063e1c7392a116100b6578063f92eb86b1161007a578063f92eb86b14610b7f578063f9a2bbc714610b94578063fccc281314610ba9578063fd4ad81f14610bbe578063fd6a687914610bed5761045d565b8063e1c7392a14610b02578063e40716a114610b17578063ea321e4914610b2c578063eb57e20214610b4c578063f340fa0114610b6c5761045d565b8063d68fb56a116100fd578063d68fb56a14610a99578063daacdb6614610aae578063dc927faf14610ac3578063df8079e914610ad8578063e086c7b114610aed5761045d565b8063c81b166214610a3a578063c8509d81146107fc578063cb75a59214610a4f578063ce910b0c14610a64578063d58918ae14610a845761045d565b8063aa82dce1116101c7578063aef198a91161018b578063aef198a9146109c4578063b7ab4db5146109d9578063b8cf4ef1146109fb578063c466689d14610a10578063c6d3394514610a255761045d565b8063aa82dce114610938578063aad560631461094d578063ab51bb9614610962578063ac43175114610984578063ad3c9da6146109a45761045d565b80639fe0f8161161020e5780639fe0f816146108cf578063a0dc2758146108e4578063a1a11bf5146108f9578063a5422d5c1461090e578063a78abc16146109235761045d565b80638c5d749d146108705780638d19a410146108855780639369d7de146108a55780639dc09262146108ba5761045d565b80635192c82c1161035057806375d47a0a116102d8578063831d65d11161029c578063831d65d1146107fc578063862498821461081c57806388b32f11146108315780638a7beb01146108465780638b5ad0c91461085b5761045d565b806375d47a0a1461079357806378dfed4a146107a85780637a84ca2a146107bd5780637e434d54146107d2578063820dcaa8146107e75761045d565b8063565c56b31161031f578063565c56b3146106f757806360eba4fe1461071757806362b72cf5146107375780636969a25c1461074c5780636e47b4821461077e5761045d565b80635192c82c1461069857806351b4dce3146106ad57806351e80672146106c257806355614fcc146106d75761045d565b80632a0ffb6e116103de5780633b071dcc116103a25780633b071dcc1461061457806343756e5c1461063757806345cf9daf1461064c578063493279b1146106615780634df6e0c3146106835761045d565b80632a0ffb6e14610574578063300c356714610594578063321d398a146105b45780633365af3a146105d457806335409f7f146105f45761045d565b8063152ad3b811610425578063152ad3b8146104f35780631bd14ed8146105155780631e4c15241461052a5780631ff180691461054a578063280870281461055f5761045d565b806304c4fec61461046257806307a56847146104795780630e2374a5146104a45780631182b875146104c65761045d565b3661045d57005b600080fd5b34801561046e57600080fd5b50610477610c02565b005b34801561048557600080fd5b5061048e610c76565b60405161049b9190616d4d565b60405180910390f35b3480156104b057600080fd5b506104b9610c7c565b60405161049b9190616103565b3480156104d257600080fd5b506104e66104e1366004615fe9565b610c82565b60405161049b9190616223565b3480156104ff57600080fd5b50610508610d9e565b60405161049b9190616218565b34801561052157600080fd5b5061048e610da7565b34801561053657600080fd5b50610477610545366004615e17565b610dad565b34801561055657600080fd5b5061048e6110e1565b34801561056b57600080fd5b506104b96110e7565b34801561058057600080fd5b5061047761058f366004615d77565b6110ed565b3480156105a057600080fd5b506104776105af366004615daf565b61110e565b3480156105c057600080fd5b506105086105cf366004615f96565b611457565b3480156105e057600080fd5b506105086105ef366004615f96565b611526565b34801561060057600080fd5b5061047761060f366004615d77565b6115d7565b34801561062057600080fd5b5061062961173c565b60405161049b9291906161a8565b34801561064357600080fd5b506104b9611a18565b34801561065857600080fd5b5061048e611a1e565b34801561066d57600080fd5b50610676611a24565b60405161049b9190616d3e565b34801561068f57600080fd5b50610629611a29565b3480156106a457600080fd5b5061048e611bb5565b3480156106b957600080fd5b506104b9611bbb565b3480156106ce57600080fd5b506104b9611bc1565b3480156106e357600080fd5b506105086106f2366004615d77565b611bc7565b34801561070357600080fd5b5061048e610712366004615d77565b611c03565b34801561072357600080fd5b506104e6610732366004615f96565b611c54565b34801561074357600080fd5b5061048e611cfa565b34801561075857600080fd5b5061076c610767366004615f96565b611d00565b60405161049b96959493929190616130565b34801561078a57600080fd5b506104b9611d64565b34801561079f57600080fd5b506104b9611d6a565b3480156107b457600080fd5b5061048e611d70565b3480156107c957600080fd5b5061048e611d76565b3480156107de57600080fd5b506104b9611d7c565b3480156107f357600080fd5b5061048e611d82565b34801561080857600080fd5b50610477610817366004615fe9565b611d88565b34801561082857600080fd5b5061048e611da9565b34801561083d57600080fd5b5061048e611daf565b34801561085257600080fd5b50610508611db5565b34801561086757600080fd5b5061048e611dbe565b34801561087c57600080fd5b5061048e611dc4565b34801561089157600080fd5b5061048e6108a0366004615d77565b611de1565b3480156108b157600080fd5b50610477611e21565b3480156108c657600080fd5b506104b9611f35565b3480156108db57600080fd5b5061048e611f3b565b3480156108f057600080fd5b5061048e611f40565b34801561090557600080fd5b506104b9611f45565b34801561091a57600080fd5b506104e6611f4b565b34801561092f57600080fd5b50610508611f6a565b34801561094457600080fd5b506104b9611f73565b34801561095957600080fd5b506104b9611f79565b34801561096e57600080fd5b50610977611f7f565b60405161049b9190616d80565b34801561099057600080fd5b5061047761099f366004615f3a565b611f84565b3480156109b057600080fd5b5061048e6109bf366004615d77565b612976565b3480156109d057600080fd5b5061048e612988565b3480156109e557600080fd5b506109ee612995565b60405161049b9190616195565b348015610a0757600080fd5b5061048e612a80565b348015610a1c57600080fd5b5061048e612a85565b348015610a3157600080fd5b5061048e612a8b565b348015610a4657600080fd5b506104b9612a90565b348015610a5b57600080fd5b5061048e612a96565b348015610a7057600080fd5b506104e6610a7f366004615f96565b612a9c565b348015610a9057600080fd5b5061048e612aa9565b348015610aa557600080fd5b5061048e612aaf565b348015610aba57600080fd5b5061048e612aee565b348015610acf57600080fd5b506104b9612af4565b348015610ae457600080fd5b506104b9612afa565b348015610af957600080fd5b5061048e612b00565b348015610b0e57600080fd5b50610477612b05565b348015610b2357600080fd5b5061048e612cae565b348015610b3857600080fd5b50610508610b47366004615efb565b612cb4565b348015610b5857600080fd5b50610477610b67366004615d77565b612e3a565b610477610b7a366004615d77565b612f42565b348015610b8b57600080fd5b5061048e6132f8565b348015610ba057600080fd5b506104b96132fe565b348015610bb557600080fd5b506104b9613304565b348015610bca57600080fd5b50610bde610bd9366004615f96565b61330a565b60405161049b93929190616d56565b348015610bf957600080fd5b506104b96133cc565b6000610c0d33611de1565b9050600b8181548110610c1c57fe5b600091825260209091206001601690920201015460ff16610c585760405162461bcd60e51b8152600401610c4f906169f5565b60405180910390fd5b6000610c62612aaf565b9050610c7133838360016133d2565b505050565b60095481565b61200181565b60005460609060ff16610ca75760405162461bcd60e51b8152600401610c4f906163ab565b3361200014610cc85760405162461bcd60e51b8152600401610c4f90616b56565b600b54610d8657610cd7615923565b60015460005b81811015610d8257600b80546001810182556000919091528351600080516020616e1883398151915260169092029182019081556020808601516000805160206174478339815191528401805460ff1916911515919091179055604086015180518794610d5e93600080516020616e38833981519152909101920190615952565b506060820151610d7490600383019060136159cc565b505050806001019050610cdd565b5050505b60405162461bcd60e51b8152600401610c4f9061665a565b60075460ff1681565b600f5481565b334114610dcc5760405162461bcd60e51b8152600401610c4f90616ba5565b3a15610dea5760405162461bcd60e51b8152600401610c4f90616934565b8251604080518281526020808402820101909152606090828015610e2857816020015b610e156159f9565b815260200190600190039081610e0d5790505b50905060005b82811015610ed2576040518060c00160405280878381518110610e4d57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001868381518110610e8f57fe5b60200260200101516001600160401b031681526020016000151581526020016000815250828281518110610ebf57fe5b6020908102919091010152600101610e2e565b50606080610ee083866135c4565b9150915060005b600154811015610fd657600060018281548110610f0057fe5b906000526020600020906004020160030154905080600014610fcd57600060018381548110610f2b57fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab8260018581548110610f5f57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b168152610f9a926001600160a01b039092169101616103565b6000604051808303818588803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b50505050505b50600101610ee7565b504715611044577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d4760405161100c9190616d4d565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015611042573d6000803e3d6000fd5b505b600060035581511561105a5761105a8282613aae565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b61200581565b3361200214610d865760405162461bcd60e51b8152600401610c4f90616d07565b33411461112d5760405162461bcd60e51b8152600401610c4f90616ba5565b601054431161114e5760405162461bcd60e51b8152600401610c4f90616584565b3a1561116c5760405162461bcd60e51b8152600401610c4f90616934565b60005460ff1661118e5760405162461bcd60e51b8152600401610c4f906163ab565b60006110023168056bc75e2d631000008111156111c5576111be8168056bc75e2d6310000063ffffffff61429d16565b91506111cc565b505061144d565b6040516309a99b4f60e41b815261100290639a99b4f0906111f39030908690600401616117565b602060405180830381600087803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112459190615fae565b91508161125357505061144d565b6000805b848110156112815785858281811061126b57fe5b9050602002013582019150806001019050611257565b508061128f5750505061144d565b6000806000805b8981101561144557848989838181106112ab57fe5b905060200201358802816112bb57fe5b0493508a8a828181106112ca57fe5b90506020020160208101906112df9190615d77565b6001600160a01b038116600090815260046020526040902054909350915081156113fb57600060018084038154811061131457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561138157836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516113749190616d4d565b60405180910390a26113f5565b600354611394908663ffffffff6142df16565b60039081558101546113ac908663ffffffff6142df16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b2906113ec908890616d4d565b60405180910390a25b5061143d565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516114349190616d4d565b60405180910390a25b600101611296565b505050505050505b5050436010555050565b600154600090821061146b57506000611521565b60006001600160a01b03166001838154811061148357fe5b60009182526020909120600490910201546001600160a01b031614806114b3575060085415806114b35750600a54155b806114c2575060085460095410155b806114d357506114d182611526565b155b806114fc57506000600b83815481106114e857fe5b906000526020600020906016020160000154115b806115105750600161150c612995565b5111155b1561151d57506000611521565b5060015b919050565b600154600090821061153a57506000611521565b600b548210611577576001828154811061155057fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611521565b6001828154811061158457fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156115d15750600b82815481106115b857fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b54611695576115e6615923565b60015460005b8181101561169157600b80546001810182556000919091528351600080516020616e1883398151915260169092029182019081556020808601516000805160206174478339815191528401805460ff191691151591909117905560408601518051879461166d93600080516020616e38833981519152909101920190615952565b50606082015161168390600383019060136159cc565b5050508060010190506115ec565b5050505b3361100114806116a6575033612002145b6116c25760405162461bcd60e51b8152600401610c4f906163e2565b6001600160a01b038116600090815260046020526040902054806116e65750611739565b6001810390506000600b82815481106116fb57fe5b600091825260209091206001601690920201015460ff16905061171e8383614304565b80156117275750805b15610c71576009805460001901905550505b50565b60015460609081906000805b8281101561178f576001818154811061175d57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611787576001909101905b600101611748565b506060816040519080825280602002602001820160405280156117bc578160200160208202803683370190505b5090506060826040519080825280602002602001820160405280156117f557816020015b60608152602001906001900390816117e05790505b50600b54600094509091508414156119705760005b8481101561196a576001818154811061181f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611962576001818154811061184f57fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061187a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b81815481106118a757fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561193f5780601f106119145761010080835404028352916020019161193f565b820191906000526020600020905b81548152906001019060200180831161192257829003601f168201915b505050505082858151811061195057fe5b60209081029190910101526001909301925b60010161180a565b50611a0c565b60005b84811015611a0a576001818154811061198857fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611a0257600181815481106119b857fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106119e357fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611973565b505b909450925050505b9091565b61100181565b60085481565b603881565b6060806000600e549050600080600c5411611a45576015611a49565b600c545b90506060611a55612995565b90506060611a62826146c7565b905082825111611a79579094509250611a14915050565b83838351031015611a8b578282510393505b8315611ac15760c84304611aa783838388880360008a8a614835565b611abf8383838888038989038a8b8b8b510301614835565b505b606083604051908082528060200260200182016040528015611aed578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611b2657816020015b6060815260200190600190039081611b115790505b50905060005b85811015611ba757848181518110611b4057fe5b6020026020010151838281518110611b5457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611b8057fe5b6020026020010151828281518110611b9457fe5b6020908102919091010152600101611b2c565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611bef576000915050611521565b60001901611bfc81611526565b9392505050565b6001600160a01b03811660009081526004602052604081205480611c2b576000915050611521565b600180820381548110611c3a57fe5b906000526020600020906004020160030154915050919050565b60128181548110611c6157fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611cf25780601f10611cc757610100808354040283529160200191611cf2565b820191906000526020600020905b815481529060010190602001808311611cd557829003601f168201915b505050505081565b60105481565b60018181548110611d0d57fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b61100881565b6103e881565b600c5481565b61200381565b61271081565b3361200014610d865760405162461bcd60e51b8152600401610c4f90616b56565b60025481565b60115481565b60145460ff1681565b600a5481565b600060175460001415611dd957506001611dde565b506017545b90565b6001600160a01b03811660009081526004602052604081205480611e175760405162461bcd60e51b8152600401610c4f90616ade565b6000190192915050565b600b54611edf57611e30615923565b60015460005b81811015611edb57600b80546001810182556000919091528351600080516020616e1883398151915260169092029182019081556020808601516000805160206174478339815191528401805460ff1916911515919091179055604086015180518794611eb793600080516020616e38833981519152909101920190615952565b506060820151611ecd90600383019060136159cc565b505050806001019050611e36565b5050505b600854611eec5760036008555b600a54611ef9576002600a555b6000611f0433611de1565b9050611f0f81611457565b611f2b5760405162461bcd60e51b8152600401610c4f906168b0565b611739338261498c565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef8152602001616e586105ef913981565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16611fa65760405162461bcd60e51b8152600401610c4f906163ab565b3361100714611fc75760405162461bcd60e51b8152600401610c4f90616962565b61202784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614a249050565b156120dc576020811461204c5760405162461bcd60e51b8152600401610c4f90616268565b604080516020601f840181900481028201810190925282815260009161208a91858580838501838280828437600092019190915250614a7d92505050565b90506127106120b66018546120aa600f54856142df90919063ffffffff16565b9063ffffffff6142df16565b11156120d45760405162461bcd60e51b8152600401610c4f9061667e565b600655612933565b61214684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614a249050565b156121e0576020811461216b5760405162461bcd60e51b8152600401610c4f9061629f565b604080516020601f84018190048102820181019092528281526000916121a991858580838501838280828437600092019190915250614a7d92505050565b600c54909150806121b8575060155b8082106121d75760405162461bcd60e51b8152600401610c4f906165c6565b50600855612933565b61224984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614a249050565b156122e2576020811461226e5760405162461bcd60e51b8152600401610c4f90616331565b604080516020601f84018190048102820181019092528281526000916122ac91858580838501838280828437600092019190915250614a7d92505050565b90506000811180156122be5750600a81105b6122da5760405162461bcd60e51b8152600401610c4f90616c3a565b600a55612933565b61235684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614a249050565b156123e5576020811461237b5760405162461bcd60e51b8152600401610c4f906162e5565b604080516020601f84018190048102820181019092528281526000916123b991858580838501838280828437600092019190915250614a7d92505050565b9050600d548111156123dd5760405162461bcd60e51b8152600401610c4f90616787565b600e55612933565b61244e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614a249050565b156124d057602081146124735760405162461bcd60e51b8152600401610c4f906169b0565b604080516020601f84018190048102820181019092528281526000916124b191858580838501838280828437600092019190915250614a7d92505050565b600d819055600e549091508110156124ca57600d54600e555b50612933565b61253484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614a249050565b156125e257602081146125595760405162461bcd60e51b8152600401610c4f90616376565b604080516020601f840181900481028201810190925282815260009161259791858580838501838280828437600092019190915250614a7d92505050565b9050600081116125b95760405162461bcd60e51b8152600401610c4f906164df565b60648111156125da5760405162461bcd60e51b8152600401610c4f90616527565b600c55612933565b61264e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614a249050565b156126f757602081146126735760405162461bcd60e51b8152600401610c4f90616bf2565b604080516020601f84018190048102820181019092528281526000916126b191858580838501838280828437600092019190915250614a7d92505050565b90506127106126d16018546120aa600654856142df90919063ffffffff16565b11156126ef5760405162461bcd60e51b8152600401610c4f90616450565b600f55612933565b61276b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614a249050565b1561281457602081146127905760405162461bcd60e51b8152600401610c4f9061670d565b604080516020601f84018190048102820181019092528281526000916127ce91858580838501838280828437600092019190915250614a7d92505050565b90506127106127ee600f546120aa600654856142df90919063ffffffff16565b111561280c5760405162461bcd60e51b8152600401610c4f90616821565b601855612933565b61287584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614a249050565b1561291b576020811461289a5760405162461bcd60e51b8152600401610c4f90616623565b604080516020601f84018190048102820181019092528281526000916128d891858580838501838280828437600092019190915250614a7d92505050565b9050600381101580156128ec575060098111155b806128f75750806001145b6129135760405162461bcd60e51b8152600401610c4f90616a58565b601755612933565b60405162461bcd60e51b8152600401610c4f90616c97565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516129689493929190616236565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156129c4576129b081611526565b156129bc578160010191505b60010161299f565b506060816040519080825280602002602001820160405280156129f1578160200160208202803683370190505b5090506000915060005b83811015612a7857612a0c81611526565b15612a705760018181548110612a1e57fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612a4957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b6001016129fb565b509250505090565b601581565b61027181565b600281565b61100281565b60175481565b60138181548110611c6157fe5b60185481565b6000612ab9612995565b519050600080600c5411612ace576015612ad2565b600c545b905080821115612ae0578091505b81612aea57600191505b5090565b60055481565b61100381565b61200481565b606481565b60005460ff1615612b285760405162461bcd60e51b8152600401610c4f90616a21565b612b30615a2e565b6000612b566040518061062001604052806105ef8152602001616e586105ef9139614a82565b9150915080612b775760405162461bcd60e51b8152600401610c4f90616b15565b60005b826020015151811015612c9c57600183602001518281518110612b9957fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612c6f57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612b7a565b50506000805460ff1916600117905550565b600d5481565b601354600090815b81811015612dbd57612da585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612d0d57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d9b5780601f10612d7057610100808354040283529160200191612d9b565b820191906000526020600020905b815481529060010190602001808311612d7e57829003601f168201915b5050505050614c3e565b15612db5576001925050506115d1565b600101612cbc565b5060125460005b81811015612e2e57612e1586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612d0d57fe5b15612e2657600193505050506115d1565b600101612dc4565b50600095945050505050565b3361100114612e5b5760405162461bcd60e51b8152600401610c4f90616cbe565b600b54612f1957612e6a615923565b60015460005b81811015612f1557600b80546001810182556000919091528351600080516020616e1883398151915260169092029182019081556020808601516000805160206174478339815191528401805460ff1916911515919091179055604086015180518794612ef193600080516020616e38833981519152909101920190615952565b506060820151612f0790600383019060136159cc565b505050806001019050612e70565b5050505b6000612f2482614ca2565b9050612f2f81611457565b15612f3e57612f3e828261498c565b5050565b334114612f615760405162461bcd60e51b8152600401610c4f90616ba5565b60005460ff16612f835760405162461bcd60e51b8152600401610c4f906163ab565b60003411612fa35760405162461bcd60e51b8152600401610c4f90616758565b3a15612fc15760405162461bcd60e51b8152600401610c4f90616934565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661300157610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561301857506000601854115b1561303d57600160175403601754438161302e57fe5b06601854028161303a57fe5b04015b60008311801561304d5750600081115b156130fa57600061307661271061306a348563ffffffff614e2516565b9063ffffffff614e5f16565b905080156130f8576040516110029082156108fc029083906000818181858888f193505050501580156130ad573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516130dd9190616d4d565b60405180910390a16130f5848263ffffffff61429d16565b93505b505b60008311801561310c57506000600654115b156131b257600061312e61271061306a60065434614e2590919063ffffffff16565b905080156131b05760405161dead9082156108fc029083906000818181858888f19350505050158015613165573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516131959190616d4d565b60405180910390a16131ad848263ffffffff61429d16565b93505b505b81156132b05760006001808403815481106131c957fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561323657846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4856040516132299190616d4d565b60405180910390a26132aa565b600354613249908563ffffffff6142df16565b6003908155810154613261908563ffffffff6142df16565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055906132a1908790616d4d565b60405180910390a25b506132f2565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516132e99190616d4d565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061331757fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff909116949192918301828280156133c25780601f10613397576101008083540402835291602001916133c2565b820191906000526020600020905b8154815290600101906020018083116133a557829003601f168201915b5050505050905083565b61100481565b6000600a54600014806133e3575082155b806133ee5750600954155b156133fb575060006135bc565b60096000815460019003919050819055506000613446600a5461306a8661306a600b8a8154811061342857fe5b6000918252602090912060169091020154439063ffffffff61429d16565b90506000600b868154811061345757fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156134bc57600080fd5b505afa1580156134d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f49190615fc6565b91509150600093508083106135725761350d8888614304565b506040516328aa02b160e01b8152611001906328aa02b190613537908b9087908a90600401616172565b600060405180830381600087803b15801561355157600080fd5b505af1158015613565573d6000803e3d6000fd5b5050505060019350613584565b8183106135845761358288614ca2565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b6060806000808080806135d5612aaf565b6001549091505b801561380757600181039250600b83815481106135f557fe5b600091825260209091206001601690920201015460ff16613615576137fe565b6001838154811061362257fe5b600091825260208220600490910201546001600160a01b0316955061364c908690859085906133d2565b935083613658576137fe565b60405163436aa28360e11b81526000908190612002906386d5450690613682908a90600401616103565b60206040518083038186803b15801561369a57600080fd5b505afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d29190615d93565b90506001600160a01b0381161561375b576040516302ceee9160e11b81526120029063059ddd2290613708908490600401616103565b60206040518083038186803b15801561372057600080fd5b505afa158015613734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137589190615d93565b91505b60005b8c518110156137fa57876001600160a01b03168d828151811061377d57fe5b6020026020010151600001516001600160a01b031614806137c65750826001600160a01b03168d82815181106137af57fe5b6020026020010151600001516001600160a01b0316145b156137f25760018d82815181106137d957fe5b60209081029190910101519015156080909101526137fa565b60010161375e565b5050505b600019016135dc565b5060005b89518110156138745789818151811061382057fe5b60200260200101516080015180613860575060006001600160a01b03168a828151811061384957fe5b6020026020010151600001516001600160a01b0316145b1561386c578560010195505b60010161380b565b508851851061395c5760408051600180825281830190925290816020015b61389a6159f9565b815260200190600190039081613892575050604080516001808252818301909252919850602082015b60608152602001906001900390816138c3579050509550886000815181106138e757fe5b6020026020010151876000815181106138fc57fe5b60200260200101819052508760008151811061391457fe5b60200260200101518660008151811061392957fe5b602002602001018190525060008760008151811061394357fe5b6020908102919091010151901515608090910152613aa1565b8489510360405190808252806020026020018201604052801561399957816020015b6139866159f9565b81526020019060019003908161397e5790505b509650848951036040519080825280602002602001820160405280156139d357816020015b60608152602001906001900390816139be5790505b5095506000915060005b8951811015613a9f578981815181106139f257fe5b602002602001015160800151158015613a35575060006001600160a01b03168a8281518110613a1d57fe5b6020026020010151600001516001600160a01b031614155b15613a9757898181518110613a4657fe5b6020026020010151888481518110613a5a57fe5b6020026020010181905250888181518110613a7157fe5b6020026020010151878481518110613a8557fe5b60200260200101819052508260010192505b6001016139dd565b505b50505050505b9250929050565b600154825160005b82811015613bcb576001613ac86159f9565b60018381548110613ad557fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613b9f57878181518110613b6557fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613b975760009250613b9f565b600101613b51565b508115613bc15780516001600160a01b03166000908152600460205260408120555b5050600101613ab6565b5080821115613c8a57805b82811015613c88576001805480613be957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613c3c57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613c6e6002830182615a52565b613c7c600383016000615a96565b50509055600101613bd6565b505b6000818310613c995781613c9b565b825b905060005b8181101561403f57613d4d868281518110613cb757fe5b602002602001015160018381548110613ccc57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152614ea1565b613f01578060010160046000888481518110613d6557fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110613da157fe5b602002602001015160018281548110613db657fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110613e7157fe5b6020026020010151600b8281548110613e8657fe5b90600052602060002090601602016002019080519060200190613eaa929190615952565b506000600b8281548110613eba57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110613eeb57fe5b6000918252602090912060169091020155614037565b858181518110613f0d57fe5b60200260200101516060015160018281548110613f2657fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b03160217905550613fec858281518110613f6a57fe5b6020026020010151600b8381548110613f7f57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612d9b5780601f10612d7057610100808354040283529160200191612d9b565b61403757848181518110613ffc57fe5b6020026020010151600b828154811061401157fe5b90600052602060002090601602016002019080519060200190614035929190615952565b505b600101613ca0565b508282111561421757614050615923565b835b838110156142145785818151811061406657fe5b60200260200101518260400181905250600187828151811061408457fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616e188339815191528101918255858301516000805160206174478339815191528201805491151560ff19909216919091179055928501518051869492936141ba93600080516020616e3883398151915201920190615952565b5060608201516141d090600383019060136159cc565b50505080600101600460008984815181106141e757fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101614052565b50505b61421f614efd565b6142276150df565b6000600981905560015493505b83811015614295576000600b828154811061424b57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061427c57fe5b6000918252602090912060169091020155600101614234565b505050505050565b6000611bfc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152cd565b600082820183811015611bfc5760405162461bcd60e51b8152600401610c4f90616419565b6000806001838154811061431457fe5b9060005260206000209060040201600301549050600060018080549050039050600161433e612995565b51116143735760006001858154811061435357fe5b9060005260206000209060040201600301819055506000925050506115d1565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143ac9190616d4d565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561459957600181600101815481106143ed57fe5b90600052602060002090600402016001828154811061440857fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106144c957fe5b9060005260206000209060160201600b82815481106144e457fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff199092169190911790556002808401805461453b938386019390821615610100026000190190911604615aa5565b5061454e60038281019084016013615b1a565b5090505080600101600460006001848154811061456757fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020556001016143cf565b5060018054806145a557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806145f857fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061462a6002830182615a52565b614638600383016000615a96565b50509055600081838161464757fe5b04905080156146bb5760015460005b818110156146b85761468f836001838154811061466f57fe5b9060005260206000209060040201600301546142df90919063ffffffff16565b6001828154811061469c57fe5b6000918252602090912060036004909202010155600101614656565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561470657816020015b60608152602001906001900390816146f15790505b50600b54909150831461471d579250611521915050565b60005b8281101561482c57600b60016004600089858151811061473c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054038154811061477057fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156148085780601f106147dd57610100808354040283529160200191614808565b820191906000526020600020905b8154815290600101906020018083116147eb57829003601f168201915b505050505082828151811061481957fe5b6020908102919091010152600101614720565b50949350505050565b60005b8281101561498257600082878388016040516020016148589291906160f5565b6040516020818303038152906040528051906020012060001c8161487857fe5b06905080850182870114614979576000898388018151811061489657fe5b60200260200101519050606089848901815181106148b057fe5b602002602001015190508a838801815181106148c857fe5b60200260200101518b858a01815181106148de57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061490d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061493b57fe5b60200260200101518a858a018151811061495157fe5b6020026020010181905250808a8489018151811061496b57fe5b602002602001018190525050505b50600101614838565b5050505050505050565b600980546001908101909155600b8054839081106149a657fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106149dc57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614a3791906160d9565b6040516020818303038152906040528051906020012083604051602001614a5e91906160d9565b6040516020818303038152906040528051906020012014905092915050565b015190565b614a8a615a2e565b6000614a94615a2e565b614a9c615b44565b614aad614aa8866152f9565b61531e565b90506000805b614abc83615368565b15614c305780614ae157614ad7614ad284615389565b6153d7565b60ff168452614c28565b8060011415614c23576060614afd614af885615389565b615457565b90508051604051908082528060200260200182016040528015614b3a57816020015b614b276159f9565b815260200190600190039081614b1f5790505b5085602001819052508051604051908082528060200260200182016040528015614b7857816020015b6060815260200190600190039081614b635790505b50604086015260005b8151811015614c1857614b926159f9565b60606000614bb2858581518110614ba557fe5b6020026020010151615528565b92509250925080614bd2578860009a509a50505050505050505050614c39565b8289602001518581518110614be357fe5b60200260200101819052508189604001518581518110614bff57fe5b6020026020010181905250505050806001019050614b81565b506001925050614c28565b614c30565b600101614ab3565b50919350909150505b915091565b815181516000916001918114808314614c5a5760009250614c98565b600160208701838101602088015b600284838510011415614c93578051835114614c875760009650600093505b60209283019201614c68565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614ccb57506000199050611521565b600181039050600060018281548110614ce057fe5b9060005260206000209060040201600301549050600060018381548110614d0357fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614d5c908590616d4d565b60405180910390a280614d7457829350505050611521565b6000818381614d7f57fe5b0490508015614e1b5760005b84811015614dcd57614da4826001838154811061466f57fe5b60018281548110614db157fe5b6000918252602090912060036004909202010155600101614d8b565b50600180549085015b81811015614e1857614def836001838154811061466f57fe5b60018281548110614dfc57fe5b6000918252602090912060036004909202010155600101614dd6565b50505b5091949350505050565b600082614e34575060006115d1565b82820282848281614e4157fe5b0414611bfc5760405162461bcd60e51b8152600401610c4f906168f3565b6000611bfc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615642565b805182516000916001600160a01b039182169116148015614edb575081602001516001600160a01b031683602001516001600160a01b0316145b8015611bfc5750506040908101519101516001600160a01b0390811691161490565b60125460135480821115614f4857805b82811015614f46576012805480614f2057fe5b600190038181906000526020600020016000614f3c9190615a52565b9055600101614f0d565b505b6000818310614f575781614f59565b825b905060005b818110156150715761501660128281548110614f7657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156150045780601f10614fd957610100808354040283529160200191615004565b820191906000526020600020905b815481529060010190602001808311614fe757829003601f168201915b505050505060138381548110612d0d57fe5b615069576013818154811061502757fe5b906000526020600020016012828154811061503e57fe5b906000526020600020019080546001816001161561010002031660029004615067929190615aa5565b505b600101614f5e565b5082821115610c7157825b828110156132f25760126013828154811061509357fe5b60009182526020808320845460018181018755958552919093209290910180546150d6949390920192909160026101009282161592909202600019011604615aa5565b5060010161507c565b601354600b548082111561512a57805b8281101561512857601380548061510257fe5b60019003818190600052602060002001600061511e9190615a52565b90556001016150ef565b505b6000818310615139578161513b565b825b905060005b8181101561525a576151f86013828154811061515857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156151e65780601f106151bb576101008083540402835291602001916151e6565b820191906000526020600020905b8154815290600101906020018083116151c957829003601f168201915b5050505050600b8381548110613f7f57fe5b61525257600b818154811061520957fe5b90600052602060002090601602016002016013828154811061522757fe5b906000526020600020019080546001816001161561010002031660029004615250929190615aa5565b505b600101615140565b5082821115610c7157825b828110156132f2576013600b828154811061527c57fe5b6000918252602080832084546001808201875595855291909320601692909202909201600290810180546152c495939094019390926000199082161561010002011604615aa5565b50600101615265565b600081848411156152f15760405162461bcd60e51b8152600401610c4f9190616223565b505050900390565b615301615b64565b506040805180820190915281518152602082810190820152919050565b615326615b44565b61532f82615679565b61533857600080fd5b600061534783602001516156b3565b60208085015160408051808201909152868152920190820152915050919050565b6000615372615b64565b505080518051602091820151919092015191011190565b615391615b64565b61539a82615368565b6153a357600080fd5b602082015160006153b382615716565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906153ec57508151602110155b6153f557600080fd5b600061540483602001516156b3565b9050808360000151101561542a5760405162461bcd60e51b8152600401610c4f90616aa7565b82516020808501518301805192849003929183101561482c57506020919091036101000a90049392505050565b606061546282615679565b61546b57600080fd5b6000615476836157f7565b90506060816040519080825280602002602001820160405280156154b457816020015b6154a1615b64565b8152602001906001900390816154995790505b50905060006154c685602001516156b3565b60208601510190506000805b8481101561551d576154e383615716565b915060405180604001604052808381526020018481525084828151811061550657fe5b6020908102919091010152918101916001016154d2565b509195945050505050565b6155306159f9565b6060600061553c6159f9565b6060615546615b44565b61554f8761531e565b90506000805b61555e83615368565b1561563357806155895761557961557484615389565b615853565b6001600160a01b0316855261562b565b80600114156155b15761559e61557484615389565b6001600160a01b0316602086015261562b565b80600214156155d9576155c661557484615389565b6001600160a01b0316604086015261562b565b8060031415615605576155ee614ad284615389565b6001600160401b031660608601526001915061562b565b80600414156156265761561f61561a84615389565b61586d565b935061562b565b615633565b600101615555565b50929791965091945092505050565b600081836156635760405162461bcd60e51b8152600401610c4f9190616223565b50600083858161566f57fe5b0495945050505050565b805160009061568a57506000611521565b6020820151805160001a9060c08210156156a957600092505050611521565b5060019392505050565b8051600090811a60808110156156cd576000915050611521565b60b88110806156e8575060c081108015906156e8575060f881105b156156f7576001915050611521565b60c081101561570b5760b519019050611521565b60f519019050611521565b80516000908190811a608081101561573157600191506157f0565b60b881101561574657607e19810191506157f0565b60c081101561579757600060b78203600186019550806020036101000a8651049150600181018201935050808310156157915760405162461bcd60e51b8152600401610c4f906167f6565b506157f0565b60f88110156157ac5760be19810191506157f0565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156157ee5760405162461bcd60e51b8152600401610c4f906167f6565b505b5092915050565b805160009061580857506000611521565b6000809050600061581c84602001516156b3565b602085015185519181019250015b8082101561584a5761583b82615716565b8201915082600101925061582a565b50909392505050565b805160009060151461586457600080fd5b6115d1826153d7565b805160609061587b57600080fd5b600061588a83602001516156b3565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156158c1576020820181803683370190505b509050600081602001905061482c848760200151018285806158e257610c71565b5b60208110615902578251825260209283019290910190601f19016158e3565b915181516020939093036101000a6000190180199091169216919091179052565b6040518060800160405280600081526020016000151581526020016060815260200161594d615b7e565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061599357805160ff19168380011785556159c0565b828001600101855582156159c0579182015b828111156159c05782518255916020019190600101906159a5565b50612aea929150615b9d565b82601381019282156159c057916020028201828111156159c05782518255916020019190600101906159a5565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615a785750611739565b601f0160209004906000526020600020908101906117399190615b9d565b50611739906013810190615b9d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615ade57805485556159c0565b828001600101855582156159c057600052602060002091601f016020900482015b828111156159c0578254825591600101919060010190615aff565b82601381019282156159c057918201828111156159c0578254825591600101919060010190615aff565b6040518060400160405280615b57615b64565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b611dde91905b80821115612aea5760008155600101615ba3565b80356115d181616e02565b60008083601f840112615bd3578182fd5b5081356001600160401b03811115615be9578182fd5b6020830191508360208083028501011115613aa757600080fd5b6000601f8381840112615c14578182fd5b8235615c27615c2282616db7565b616d91565b818152925060208084019085810160005b84811015615cb9578135880189603f820112615c5357600080fd5b838101356001600160401b03811115615c6b57600080fd5b615c7c818901601f19168601616d91565b81815260408c81848601011115615c9257600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615c38565b50505050505092915050565b600082601f830112615cd5578081fd5b8135615ce3615c2282616db7565b818152915060208083019084810181840286018201871015615d0457600080fd5b6000805b85811015615cb95782356001600160401b0381168114615d26578283fd5b85529383019391830191600101615d08565b60008083601f840112615d49578182fd5b5081356001600160401b03811115615d5f578182fd5b602083019150836020828501011115613aa757600080fd5b600060208284031215615d88578081fd5b8135611bfc81616e02565b600060208284031215615da4578081fd5b8151611bfc81616e02565b60008060008060408587031215615dc4578283fd5b84356001600160401b0380821115615dda578485fd5b615de688838901615bc2565b90965094506020870135915080821115615dfe578384fd5b50615e0b87828801615bc2565b95989497509550505050565b600080600060608486031215615e2b578283fd5b83356001600160401b0380821115615e41578485fd5b81860187601f820112615e52578586fd5b80359250615e62615c2284616db7565b80848252602080830192508084018b828389028701011115615e8257898afd5b8994505b86851015615eac57615e988c82615bb7565b845260019490940193928101928101615e86565b509097508801359350505080821115615ec3578384fd5b615ecf87838801615cc5565b93506040860135915080821115615ee4578283fd5b50615ef186828701615c03565b9150509250925092565b60008060208385031215615f0d578182fd5b82356001600160401b03811115615f22578283fd5b615f2e85828601615d38565b90969095509350505050565b60008060008060408587031215615f4f578384fd5b84356001600160401b0380821115615f65578586fd5b615f7188838901615d38565b90965094506020870135915080821115615f89578384fd5b50615e0b87828801615d38565b600060208284031215615fa7578081fd5b5035919050565b600060208284031215615fbf578081fd5b5051919050565b60008060408385031215615fd8578182fd5b505080516020909101519092909150565b600080600060408486031215615ffd578081fd5b833560ff8116811461600d578182fd5b925060208401356001600160401b03811115616027578182fd5b61603386828701615d38565b9497909650939450505050565b6000815180845260208085019450808401835b838110156160785781516001600160a01b031687529582019590820190600101616053565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526160c5816020860160208601616dd6565b601f01601f19169290920160200192915050565b600082516160eb818460208701616dd6565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611bfc6020830184616040565b6000604082526161bb6040830185616040565b602083820381850152818551808452828401915082838202850101838801865b8381101561620957601f198784030185526161f78383516160ad565b948601949250908501906001016161db565b50909998505050505050505050565b901515815260200190565b600060208252611bfc60208301846160ad565b60006040825261624a604083018688616083565b828103602084015261625d818587616083565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152616d7760608301846160ad565b95945050505050565b63ffffffff91909116815260200190565b6040518181016001600160401b0381118282101715616daf57600080fd5b604052919050565b60006001600160401b03821115616dcc578081fd5b5060209081020190565b60005b83811015616df1578181015183820152602001616dd9565b838111156132f25750506000910152565b6001600160a01b038116811461173957600080fdfe0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001001": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102955760003560e01c80637e434d5411610167578063c80d4b8f116100ce578063dcc6f15611610087578063dcc6f156146104d6578063df8079e9146104de578063e1c7392a146104e6578063f9a2bbc7146104ee578063fc4333cd146104f6578063fd6a6879146104fe57610295565b8063c80d4b8f14610498578063c81b1662146104a0578063c8509d8114610425578063c96be4cb146104a8578063cc844b73146104bb578063dc927faf146104ce57610295565b8063a78abc1611610120578063a78abc1614610450578063aa82dce114610458578063aad5606314610460578063ab51bb9614610468578063ac0af6291461047d578063ac4317511461048557610295565b80637e434d54146104155780638256ace61461041d578063831d65d1146104255780639dc09262146104385780639f804f5f14610440578063a1a11bf51461044857610295565b806343756e5c1161020b578063567a372d116101c4578063567a372d146103da5780635bfb4990146103e257806362b72cf5146103f55780636e47b482146103fd57806375d47a0a146104055780637912a65d1461040d57610295565b806343756e5c14610390578063493279b1146103985780634bf6c882146103ad57806350055f90146103c257806351b4dce3146103ca57806351e80672146103d257610295565b8063280870281161025d578063280870281461032457806328aa02b11461032c5780633306ccca1461033f57806335aa2e441461035457806337c8dab914610367578063389f4f711461038857610295565b80630e2374a51461029a5780631182b875146102b857806322d1e80b146102d857806323bac5a2146102ed578063279621181461030f575b600080fd5b6102a2610506565b6040516102af9190612b4a565b60405180910390f35b6102cb6102c6366004612a63565b61050c565b6040516102af9190612b82565b6102e0610572565b6040516102af9190612b77565b6103006102fb366004612768565b61057b565b6040516102af939291906132e5565b61032261031d3660046128c0565b61059e565b005b6102a26108f3565b61032261033a3660046127a0565b6108f9565b61034761092a565b6040516102af91906132ad565b6102a2610362366004612a33565b610930565b61037a610375366004612768565b610957565b6040516102af9291906132d7565b6103476109ae565b6102a26109b4565b6103a06109ba565b6040516102af919061329e565b6103b56109bf565b6040516102af919061330e565b6103476109c4565b6102a26109ca565b6102a26109d0565b6103476109d6565b6103226103f0366004612768565b6109dc565b610347610a64565b6102a2610a6a565b6102a2610a70565b610347610a76565b6102a2610a7b565b61037a610a81565b610322610433366004612a63565b610a8b565b6102a2610aac565b610347610ab2565b6102a2610ab8565b6102e0610abe565b6102a2610ac7565b6102a2610acd565b610470610ad3565b6040516102af91906132fd565b610347610ad8565b610322610493366004612917565b610add565b610347611079565b6102a261107e565b6103226104b6366004612768565b611084565b6103226104c9366004612980565b6113a1565b6102a2611840565b610347611846565b6102a261184b565b610322611851565b6102a261188d565b610322611893565b6102a2611cdc565b61200181565b606033612000146105385760405162461bcd60e51b815260040161052f90613178565b60405180910390fd5b60005460ff1661055a5760405162461bcd60e51b815260040161052f90612c6e565b60405162461bcd60e51b815260040161052f90612e3d565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166105c05760405162461bcd60e51b815260040161052f90612c6e565b6006546105cd5760146006555b6008546105db576170806008555b8151158015906105eb5750805115155b6106075760405162461bcd60e51b815260040161052f9061310d565b60408051600380825260808201909252606091816020015b606081526020019060019003908161061f5790505090506106406038611ce2565b8160008151811061064d57fe5b602002602001018190525061066183611cfd565b8160018151811061066e57fe5b602002602001018190525061068282611cfd565b8160028151811061068f57fe5b602002602001018190525060606106a582611d53565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa6106e657600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d5450690610719908690600401612b4a565b60206040518083038186803b15801561073157600080fd5b505afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190612784565b6001600160a01b031614156107905760405162461bcd60e51b815260040161052f90612c3e565b43600854820110156107b45760405162461bcd60e51b815260040161052f90612bdf565b604051631871f7d960e31b81526120029063c38fbec8906107d9908590600401612b4a565b600060405180830381600087803b1580156107f357600080fd5b505af1158015610807573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f9150610830908590600401612b4a565b600060405180830381600087803b15801561084a57600080fd5b505af115801561085e573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906108969033908590600401612b5e565b602060405180830381600087803b1580156108b057600080fd5b505af11580156108c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e89190612a4b565b505050505050505050565b61200581565b336110001461091a5760405162461bcd60e51b815260040161052f90612ec3565b610925838383611de4565b505050565b61708081565b6001818154811061093d57fe5b6000918252602090912001546001600160a01b0316905081565b60008061096261259b565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b61100181565b603881565b600881565b60065481565b61200681565b61200081565b60045481565b33611000146109fd5760405162461bcd60e51b815260040161052f90612ec3565b60005460ff16610a1f5760405162461bcd60e51b815260040161052f90612c6e565b806001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c6000604051610a599190612b95565b60405180910390a250565b60035481565b61100581565b61100881565b603281565b61200381565b6004546005549091565b33612000146105385760405162461bcd60e51b815260040161052f90613178565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610aff5760405162461bcd60e51b815260040161052f90612c6e565b3361100714610b205760405162461bcd60e51b815260040161052f90612ffc565b610b8b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b6020820152915061201d9050565b15610c265760208114610bb05760405162461bcd60e51b815260040161052f90612e4f565b604080516020601f8401819004810282018101909252828152600091610bee9185858083850183828082843760009201919091525061207792505050565b905060018110158015610c02575060055481105b610c1e5760405162461bcd60e51b815260040161052f90613133565b600455611036565b610c8c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b6020820152915061201d9050565b15610d285760208114610cb15760405162461bcd60e51b815260040161052f9061304a565b604080516020601f8401819004810282018101909252828152600091610cef9185858083850183828082843760009201919091525061207792505050565b90506103e88111158015610d04575060045481115b610d205760405162461bcd60e51b815260040161052f90612d27565b600555611036565b610d9584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b6020820152915061201d9050565b15610e2f5760208114610dba5760405162461bcd60e51b815260040161052f90612f84565b604080516020601f8401819004810282018101909252828152600091610df89185858083850183828082843760009201919091525061207792505050565b9050600a8110158015610e0b5750606481105b610e275760405162461bcd60e51b815260040161052f9061308c565b600655611036565b610ea384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c61736800000000000000006020820152915061201d9050565b15610f1a5760208114610ec85760405162461bcd60e51b815260040161052f90612d5c565b604080516020601f8401819004810282018101909252828152610f04919084848083850183828082843760009201919091525061207c92505050565b6007805460ff1916911515919091179055611036565b610f8184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b6020820152915061201d9050565b1561101e5760208114610fa65760405162461bcd60e51b815260040161052f90612f13565b604080516020601f8401819004810282018101909252828152600091610fe49185858083850183828082843760009201919091525061207792505050565b90506170808110158015610ffa5750620d2f0081105b6110165760405162461bcd60e51b815260040161052f90612ca5565b600855611036565b60405162461bcd60e51b815260040161052f90613214565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161106b9493929190612bad565b60405180910390a150505050565b609681565b61100281565b3341146110a35760405162461bcd60e51b815260040161052f906131c7565b60005460ff166110c55760405162461bcd60e51b815260040161052f90612c6e565b60035443116110e65760405162461bcd60e51b815260040161052f90613269565b3a156111045760405162461bcd60e51b815260040161052f90612f56565b60405163155853f360e21b8152611000906355614fcc90611129908490600401612b4a565b60206040518083038186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117991906128a4565b6111825761139a565b61118a61259b565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff1615801592820192909252906111e557602081018051600101905261123e565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161125057fe5b066112c857600060208201526040516335409f7f60e01b8152611000906335409f7f90611281908590600401612b4a565b600060405180830381600087803b15801561129b57600080fd5b505af11580156112af573d6000803e3d6000fd5b505050506112c38282602001516000611de4565b611334565b6004548160200151816112d757fe5b06611334576040516375abf10160e11b81526110009063eb57e20290611301908590600401612b4a565b600060405180830381600087803b15801561131b57600080fd5b505af115801561132f573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166113c35760405162461bcd60e51b815260040161052f90612c6e565b60075460ff166113e55760405162461bcd60e51b815260040161052f90612c09565b6006546113f25760146006555b600854611400576170806008555b60085481516040015143910111801561142457504360085482602001516040015101115b6114405760405162461bcd60e51b815260040161052f9061323b565b80602001516020015181600001516020015114801561146e5750806020015160600151816000015160600151145b1561148b5760405162461bcd60e51b815260040161052f90612e96565b8051604081015190511080156114aa5750602081015160408101519051105b6114c65760405162461bcd60e51b815260040161052f90612e06565b6020810151518151511080156114eb5750806000015160400151816020015160400151105b8061151657508051516020820151511080156115165750806020015160400151816000015160400151105b806115305750806020015160400151816000015160400151145b61154c5760405162461bcd60e51b815260040161052f90612cf0565b604080820151905163ea321e4960e01b81526110009163ea321e49916115759190600401612b82565b60206040518083038186803b15801561158d57600080fd5b505afa1580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c591906128a4565b6115e15760405162461bcd60e51b815260040161052f90612fcd565b6115f3816000015182604001516120a4565b801561160c575061160c816020015182604001516120a4565b6116285760405162461bcd60e51b815260040161052f90612da7565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561166657600080fd5b505afa15801561167a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116a291908101906127e1565b9150915060005b81518110156117df576116d38282815181106116c157fe5b6020026020010151856040015161227c565b156117d7576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f09061170b9033908590600401612b5e565b602060405180830381600087803b15801561172557600080fd5b505af1158015611739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175d9190612a4b565b506110006001600160a01b03166335409f7f85848151811061177b57fe5b60200260200101516040518263ffffffff1660e01b815260040161179f9190612b4a565b600060405180830381600087803b1580156117b957600080fd5b505af11580156117cd573d6000803e3d6000fd5b50505050506117df565b6001016116a9565b506040808401519051630e9fbf5160e01b815261200291630e9fbf51916118099190600401612b82565b600060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b50505050505050565b61100381565b601481565b61200481565b60005460ff16156118745760405162461bcd60e51b815260040161052f906130d6565b603260045560966005556000805460ff19166001179055565b61100081565b33611000146118b45760405162461bcd60e51b815260040161052f90612ec3565b60005460ff166118d65760405162461bcd60e51b815260040161052f90612c6e565b6001546118e257611cda565b600154600090600019015b808211611cae576000805b82841015611a115761190861259b565b600260006001878154811061191957fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156119fb5760046005548161198657fe5b048160200151038160200181815250508060026000600188815481106119a857fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611a05565b6001925050611a11565b508360010193506118f8565b828411611ba857611a2061259b565b6002600060018681548110611a3157fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611b1957600460055481611a9e57fe5b04816020015103816020018181525050806002600060018781548110611ac057fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611ba89050565b6002600060018681548110611b2a57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611b6e57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611b9b5750611ba8565b5060001990920191611a11565b818015611bb25750805b15611c91576002600060018681548110611bc857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611c0f57fe5b600091825260209091200154600180546001600160a01b039092169186908110611c3557fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611c6e57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611c9d575050611cae565b5050600190910190600019016118ed565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b6060611cf5611cf0836122e0565b611cfd565b90505b919050565b606081516001148015611d2f5750607f60f81b82600081518110611d1d57fe5b01602001516001600160f81b03191611155b15611d3b575080611cf8565b611cf5611d4d8351608060ff166123c6565b83612498565b6060815160001415611d745750604080516000815260208101909152611cf8565b606082600081518110611d8357fe5b602002602001015190506000600190505b8351811015611dc457611dba82858381518110611dad57fe5b6020026020010151612498565b9150600101611d94565b50611ddd611dd7825160c060ff166123c6565b82612498565b9392505050565b8015611e46576040516375cc7d8960e01b8152612002906375cc7d8990611e0f908690600401612b4a565b600060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b50505050610925565b6040516375cc7d8960e01b8152612002906375cc7d8990611e6b908690600401612b4a565b600060405180830381600087803b158015611e8557600080fd5b505af1925050508015611e96575060015b610925576040516000815260443d1015611eb257506000611f4f565b60046000803e60005160e01c6308c379a08114611ed3576000915050611f4f565b60043d036004833e81513d602482011167ffffffffffffffff82111715611eff57600092505050611f4f565b808301805167ffffffffffffffff811115611f21576000945050505050611f4f565b8060208301013d8601811115611f3f57600095505050505050611f4f565b601f01601f191660405250925050505b80611f5a5750611fa3565b836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c8483604051611f959291906132b6565b60405180910390a250612018565b3d808015611fcd576040519150601f19603f3d011682016040523d82523d6000602084013e611fd2565b606091505b50836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c848360405161200e9291906132b6565b60405180910390a2505b610925565b6000816040516020016120309190612b2e565b60405160208183030381529060405280519060200120836040516020016120579190612b2e565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff81161561209657600191508161209c565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b60608152602001906001900390816120c05750506040805160208082528183019092529192506060919080820181803683370190505090506121058560000151611ce2565b8260008151811061211257fe5b602002602001018190525061212d6020866020015183612515565b61213681611cfd565b8260018151811061214357fe5b602002602001018190525061215b8560400151611ce2565b8260028151811061216857fe5b60200260200101819052506121836020866060015183612515565b61218c81611cfd565b8260038151811061219957fe5b60200260200101819052506121bf60206121b284611d53565b8051906020012083612515565b6040805160b080825260e082019092526060916020820181803683370190505090506121ef818360006020612525565b61220181876080015160206060612525565b61220f818660806030612525565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa61224c57600080fd5b50600161225a82600061257f565b60ff161461226f576000945050505050612071565b5060019695505050505050565b81518151600091600191811480831461229857600092506122d6565b600160208701838101602088015b6002848385100114156122d15780518351146122c55760009650600093505b602092830192016122a6565b505050505b5090949350505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661232457506018612348565b6fffffffffffffffffffffffffffffffff19841661234457506010612348565b5060005b602081101561237e5781818151811061235d57fe5b01602001516001600160f81b031916156123765761237e565b600101612348565b60008160200390506060816040519080825280601f01601f1916602001820160405280156123b3576020820181803683370190505b5080830196909652508452509192915050565b60606801000000000000000083106123f05760405162461bcd60e51b815260040161052f90612dde565b6040805160018082528183019092526060916020820181803683370190505090506037841161244a5782840160f81b8160008151811061242c57fe5b60200101906001600160f81b031916908160001a9053509050612071565b6060612455856122e0565b90508381510160370160f81b8260008151811061246e57fe5b60200101906001600160f81b031916908160001a90535061248f8282612498565b95945050505050565b6060806040519050835180825260208201818101602087015b818310156124c95780518352602092830192016124b1565b50855184518101855292509050808201602086015b818310156124f65780518352602092830192016124de565b508651929092011591909101601f01601f191660405250905092915050565b9091018181526020918201910152565b60005b818110156125785783818151811061253c57fe5b602001015160f81c60f81b85848060010195508151811061255957fe5b60200101906001600160f81b031916908160001a905350600101612528565b5050505050565b6000816001018351101561259257600080fd5b50016001015190565b604051806060016040528060008152602001600081526020016000151581525090565b600082601f8301126125ce578081fd5b81516125e16125dc82613343565b61331c565b818152915060208083019084810160005b84811015612657578151870188603f82011261260d57600080fd5b8381015161261d6125dc82613363565b81815260408b8184860101111561263357600080fd5b61264283888401838701613387565b508652505092820192908201906001016125f2565b505050505092915050565b60008083601f840112612673578182fd5b50813567ffffffffffffffff81111561268a578182fd5b6020830191508360208285010111156126a257600080fd5b9250929050565b600082601f8301126126b9578081fd5b81356126c76125dc82613363565b91508082528360208285010111156126de57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612708578081fd5b61271260a061331c565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561275057600080fd5b61275c848285016126a9565b60808301525092915050565b600060208284031215612779578081fd5b8135611ddd816133b7565b600060208284031215612795578081fd5b8151611ddd816133b7565b6000806000606084860312156127b4578182fd5b83356127bf816133b7565b92506020840135915060408401356127d6816133cf565b809150509250925092565b600080604083850312156127f3578182fd5b825167ffffffffffffffff8082111561280a578384fd5b81850186601f82011261281b578485fd5b8051925061282b6125dc84613343565b80848252602080830192508084018a82838902870101111561284b578889fd5b8894505b86851015612876578051612862816133b7565b84526001949094019392810192810161284f565b50880151909650935050508082111561288d578283fd5b5061289a858286016125be565b9150509250929050565b6000602082840312156128b5578081fd5b8151611ddd816133cf565b600080604083850312156128d2578182fd5b823567ffffffffffffffff808211156128e9578384fd5b6128f5868387016126a9565b9350602085013591508082111561290a578283fd5b5061289a858286016126a9565b6000806000806040858703121561292c578182fd5b843567ffffffffffffffff80821115612943578384fd5b61294f88838901612662565b90965094506020870135915080821115612967578384fd5b5061297487828801612662565b95989497509550505050565b600060208284031215612991578081fd5b813567ffffffffffffffff808211156129a8578283fd5b818401606081870312156129ba578384fd5b6129c4606061331c565b92508035828111156129d4578485fd5b6129e0878284016126f7565b8452506020810135828111156129f4578485fd5b612a00878284016126f7565b602085015250604081013582811115612a17578485fd5b612a23878284016126a9565b6040850152509195945050505050565b600060208284031215612a44578081fd5b5035919050565b600060208284031215612a5c578081fd5b5051919050565b600080600060408486031215612a77578081fd5b833560ff81168114612a87578182fd5b9250602084013567ffffffffffffffff811115612aa2578182fd5b612aae86828701612662565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612afd816020860160208601613387565b601f01601f19169290920160200192915050565b600a81526919195c1c9958d85d195960b21b602082015260400190565b60008251612b40818460208701613387565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611ddd6020830184612ae5565b600082825260406020830152611ddd60408301612b11565b600060408252612bc1604083018688612abb565b8281036020840152612bd4818587612abb565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b600060208252611cf560208301612b11565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526132cf6040830184612ae5565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561333b57600080fd5b604052919050565b600067ffffffffffffffff821115613359578081fd5b5060209081020190565b600067ffffffffffffffff821115613379578081fd5b50601f01601f191660200190565b60005b838110156133a257818101518382015260200161338a565b838111156133b1576000848401525b50505050565b6001600160a01b03811681146133cc57600080fd5b50565b80151581146133cc57600080fdfea164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80638256ace61161015c578063c80d4b8f116100ce578063dcc6f15611610087578063dcc6f156146104b6578063df8079e9146104be578063e1c7392a146104c6578063f9a2bbc7146104ce578063fc4333cd146104d6578063fd6a6879146104de5761028a565b8063c80d4b8f14610478578063c81b166214610480578063c8509d8114610405578063c96be4cb14610488578063cc844b731461049b578063dc927faf146104ae5761028a565b8063a78abc1611610120578063a78abc1614610430578063aa82dce114610438578063aad5606314610440578063ab51bb9614610448578063ac0af6291461045d578063ac431751146104655761028a565b80638256ace6146103fd578063831d65d1146104055780639dc09262146104185780639f804f5f14610420578063a1a11bf5146104285761028a565b806343756e5c116102005780635bfb4990116101b95780635bfb4990146103c257806362b72cf5146103d55780636e47b482146103dd57806375d47a0a146103e55780637912a65d146103ed5780637e434d54146103f55761028a565b806343756e5c14610385578063493279b11461038d57806350055f90146103a257806351b4dce3146103aa57806351e80672146103b2578063567a372d146103ba5761028a565b80632808702811610252578063280870281461031957806328aa02b1146103215780633306ccca1461033457806335aa2e441461034957806337c8dab91461035c578063389f4f711461037d5761028a565b80630e2374a51461028f5780631182b875146102ad57806322d1e80b146102cd57806323bac5a2146102e25780632796211814610304575b600080fd5b6102976104e6565b6040516102a49190612b25565b60405180910390f35b6102c06102bb366004612a3e565b6104ec565b6040516102a49190612b5d565b6102d5610552565b6040516102a49190612b52565b6102f56102f0366004612743565b61055b565b6040516102a4939291906132c0565b61031761031236600461289b565b61057e565b005b6102976108d3565b61031761032f36600461277b565b6108d9565b61033c61090a565b6040516102a49190613288565b610297610357366004612a0e565b610910565b61036f61036a366004612743565b610937565b6040516102a49291906132b2565b61033c61098e565b610297610994565b61039561099a565b6040516102a49190613279565b61033c61099f565b6102976109a5565b6102976109ab565b61033c6109b1565b6103176103d0366004612743565b6109b7565b61033c610a3f565b610297610a45565b610297610a4b565b61033c610a51565b610297610a56565b61036f610a5c565b610317610413366004612a3e565b610a66565b610297610a87565b61033c610a8d565b610297610a93565b6102d5610a99565b610297610aa2565b610297610aa8565b610450610aae565b6040516102a491906132d8565b61033c610ab3565b6103176104733660046128f2565b610ab8565b61033c611054565b610297611059565b610317610496366004612743565b61105f565b6103176104a936600461295b565b61137c565b61029761181b565b61033c611821565b610297611826565b61031761182c565b610297611868565b61031761186e565b610297611cb7565b61200181565b606033612000146105185760405162461bcd60e51b815260040161050f90613153565b60405180910390fd5b60005460ff1661053a5760405162461bcd60e51b815260040161050f90612c49565b60405162461bcd60e51b815260040161050f90612e18565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166105a05760405162461bcd60e51b815260040161050f90612c49565b6006546105ad5760146006555b6008546105bb576170806008555b8151158015906105cb5750805115155b6105e75760405162461bcd60e51b815260040161050f906130e8565b60408051600380825260808201909252606091816020015b60608152602001906001900390816105ff5790505090506106206038611cbd565b8160008151811061062d57fe5b602002602001018190525061064183611cd8565b8160018151811061064e57fe5b602002602001018190525061066282611cd8565b8160028151811061066f57fe5b6020026020010181905250606061068582611d2e565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa6106c657600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d54506906106f9908690600401612b25565b60206040518083038186803b15801561071157600080fd5b505afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610749919061275f565b6001600160a01b031614156107705760405162461bcd60e51b815260040161050f90612c19565b43600854820110156107945760405162461bcd60e51b815260040161050f90612bba565b604051631871f7d960e31b81526120029063c38fbec8906107b9908590600401612b25565b600060405180830381600087803b1580156107d357600080fd5b505af11580156107e7573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f9150610810908590600401612b25565b600060405180830381600087803b15801561082a57600080fd5b505af115801561083e573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906108769033908590600401612b39565b602060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c89190612a26565b505050505050505050565b61200581565b33611000146108fa5760405162461bcd60e51b815260040161050f90612e9e565b610905838383611dbf565b505050565b61708081565b6001818154811061091d57fe5b6000918252602090912001546001600160a01b0316905081565b600080610942612576565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b61100181565b603881565b60065481565b61200681565b61200081565b60045481565b33611000146109d85760405162461bcd60e51b815260040161050f90612e9e565b60005460ff166109fa5760405162461bcd60e51b815260040161050f90612c49565b806001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c6000604051610a349190612b70565b60405180910390a250565b60035481565b61100581565b61100881565b603281565b61200381565b6004546005549091565b33612000146105185760405162461bcd60e51b815260040161050f90613153565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610ada5760405162461bcd60e51b815260040161050f90612c49565b3361100714610afb5760405162461bcd60e51b815260040161050f90612fd7565b610b6684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611ff89050565b15610c015760208114610b8b5760405162461bcd60e51b815260040161050f90612e2a565b604080516020601f8401819004810282018101909252828152600091610bc99185858083850183828082843760009201919091525061205292505050565b905060018110158015610bdd575060055481105b610bf95760405162461bcd60e51b815260040161050f9061310e565b600455611011565b610c6784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611ff89050565b15610d035760208114610c8c5760405162461bcd60e51b815260040161050f90613025565b604080516020601f8401819004810282018101909252828152600091610cca9185858083850183828082843760009201919091525061205292505050565b90506103e88111158015610cdf575060045481115b610cfb5760405162461bcd60e51b815260040161050f90612d02565b600555611011565b610d7084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b60208201529150611ff89050565b15610e0a5760208114610d955760405162461bcd60e51b815260040161050f90612f5f565b604080516020601f8401819004810282018101909252828152600091610dd39185858083850183828082843760009201919091525061205292505050565b9050600a8110158015610de65750606481105b610e025760405162461bcd60e51b815260040161050f90613067565b600655611011565b610e7e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611ff89050565b15610ef55760208114610ea35760405162461bcd60e51b815260040161050f90612d37565b604080516020601f8401819004810282018101909252828152610edf919084848083850183828082843760009201919091525061205792505050565b6007805460ff1916911515919091179055611011565b610f5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b60208201529150611ff89050565b15610ff95760208114610f815760405162461bcd60e51b815260040161050f90612eee565b604080516020601f8401819004810282018101909252828152600091610fbf9185858083850183828082843760009201919091525061205292505050565b90506170808110158015610fd55750620d2f0081105b610ff15760405162461bcd60e51b815260040161050f90612c80565b600855611011565b60405162461bcd60e51b815260040161050f906131ef565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516110469493929190612b88565b60405180910390a150505050565b609681565b61100281565b33411461107e5760405162461bcd60e51b815260040161050f906131a2565b60005460ff166110a05760405162461bcd60e51b815260040161050f90612c49565b60035443116110c15760405162461bcd60e51b815260040161050f90613244565b3a156110df5760405162461bcd60e51b815260040161050f90612f31565b60405163155853f360e21b8152611000906355614fcc90611104908490600401612b25565b60206040518083038186803b15801561111c57600080fd5b505afa158015611130573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611154919061287f565b61115d57611375565b611165612576565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff1615801592820192909252906111c0576020810180516001019052611219565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161122b57fe5b066112a357600060208201526040516335409f7f60e01b8152611000906335409f7f9061125c908590600401612b25565b600060405180830381600087803b15801561127657600080fd5b505af115801561128a573d6000803e3d6000fd5b5050505061129e8282602001516000611dbf565b61130f565b6004548160200151816112b257fe5b0661130f576040516375abf10160e11b81526110009063eb57e202906112dc908590600401612b25565b600060405180830381600087803b1580156112f657600080fd5b505af115801561130a573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff1661139e5760405162461bcd60e51b815260040161050f90612c49565b60075460ff166113c05760405162461bcd60e51b815260040161050f90612be4565b6006546113cd5760146006555b6008546113db576170806008555b6008548151604001514391011180156113ff57504360085482602001516040015101115b61141b5760405162461bcd60e51b815260040161050f90613216565b8060200151602001518160000151602001511480156114495750806020015160600151816000015160600151145b156114665760405162461bcd60e51b815260040161050f90612e71565b8051604081015190511080156114855750602081015160408101519051105b6114a15760405162461bcd60e51b815260040161050f90612de1565b6020810151518151511080156114c65750806000015160400151816020015160400151105b806114f157508051516020820151511080156114f15750806020015160400151816000015160400151105b8061150b5750806020015160400151816000015160400151145b6115275760405162461bcd60e51b815260040161050f90612ccb565b604080820151905163ea321e4960e01b81526110009163ea321e49916115509190600401612b5d565b60206040518083038186803b15801561156857600080fd5b505afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a0919061287f565b6115bc5760405162461bcd60e51b815260040161050f90612fa8565b6115ce8160000151826040015161207f565b80156115e757506115e78160200151826040015161207f565b6116035760405162461bcd60e51b815260040161050f90612d82565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561164157600080fd5b505afa158015611655573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261167d91908101906127bc565b9150915060005b81518110156117ba576116ae82828151811061169c57fe5b60200260200101518560400151612257565b156117b2576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906116e69033908590600401612b39565b602060405180830381600087803b15801561170057600080fd5b505af1158015611714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117389190612a26565b506110006001600160a01b03166335409f7f85848151811061175657fe5b60200260200101516040518263ffffffff1660e01b815260040161177a9190612b25565b600060405180830381600087803b15801561179457600080fd5b505af11580156117a8573d6000803e3d6000fd5b50505050506117ba565b600101611684565b506040808401519051630e9fbf5160e01b815261200291630e9fbf51916117e49190600401612b5d565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b50505050505050565b61100381565b601481565b61200481565b60005460ff161561184f5760405162461bcd60e51b815260040161050f906130b1565b603260045560966005556000805460ff19166001179055565b61100081565b336110001461188f5760405162461bcd60e51b815260040161050f90612e9e565b60005460ff166118b15760405162461bcd60e51b815260040161050f90612c49565b6001546118bd57611cb5565b600154600090600019015b808211611c89576000805b828410156119ec576118e3612576565b60026000600187815481106118f457fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156119d65760046005548161196157fe5b0481602001510381602001818152505080600260006001888154811061198357fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff19169115159190911790556119e0565b60019250506119ec565b508360010193506118d3565b828411611b83576119fb612576565b6002600060018681548110611a0c57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611af457600460055481611a7957fe5b04816020015103816020018181525050806002600060018781548110611a9b57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611b839050565b6002600060018681548110611b0557fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611b4957fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611b765750611b83565b50600019909201916119ec565b818015611b8d5750805b15611c6c576002600060018681548110611ba357fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611bea57fe5b600091825260209091200154600180546001600160a01b039092169186908110611c1057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611c4957fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611c78575050611c89565b5050600190910190600019016118c8565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b6060611cd0611ccb836122bb565b611cd8565b90505b919050565b606081516001148015611d0a5750607f60f81b82600081518110611cf857fe5b01602001516001600160f81b03191611155b15611d16575080611cd3565b611cd0611d288351608060ff166123a1565b83612473565b6060815160001415611d4f5750604080516000815260208101909152611cd3565b606082600081518110611d5e57fe5b602002602001015190506000600190505b8351811015611d9f57611d9582858381518110611d8857fe5b6020026020010151612473565b9150600101611d6f565b50611db8611db2825160c060ff166123a1565b82612473565b9392505050565b8015611e21576040516375cc7d8960e01b8152612002906375cc7d8990611dea908690600401612b25565b600060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b50505050610905565b6040516375cc7d8960e01b8152612002906375cc7d8990611e46908690600401612b25565b600060405180830381600087803b158015611e6057600080fd5b505af1925050508015611e71575060015b610905576040516000815260443d1015611e8d57506000611f2a565b60046000803e60005160e01c6308c379a08114611eae576000915050611f2a565b60043d036004833e81513d602482011167ffffffffffffffff82111715611eda57600092505050611f2a565b808301805167ffffffffffffffff811115611efc576000945050505050611f2a565b8060208301013d8601811115611f1a57600095505050505050611f2a565b601f01601f191660405250925050505b80611f355750611f7e565b836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c8483604051611f70929190613291565b60405180910390a250611ff3565b3d808015611fa8576040519150601f19603f3d011682016040523d82523d6000602084013e611fad565b606091505b50836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c8483604051611fe9929190613291565b60405180910390a2505b610905565b60008160405160200161200b9190612b09565b60405160208183030381529060405280519060200120836040516020016120329190612b09565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615612071576001915081612077565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b606081526020019060019003908161209b5750506040805160208082528183019092529192506060919080820181803683370190505090506120e08560000151611cbd565b826000815181106120ed57fe5b602002602001018190525061210860208660200151836124f0565b61211181611cd8565b8260018151811061211e57fe5b60200260200101819052506121368560400151611cbd565b8260028151811061214357fe5b602002602001018190525061215e60208660600151836124f0565b61216781611cd8565b8260038151811061217457fe5b602002602001018190525061219a602061218d84611d2e565b80519060200120836124f0565b6040805160b080825260e082019092526060916020820181803683370190505090506121ca818360006020612500565b6121dc81876080015160206060612500565b6121ea818660806030612500565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa61222757600080fd5b50600161223582600061255a565b60ff161461224a57600094505050505061204c565b5060019695505050505050565b81518151600091600191811480831461227357600092506122b1565b600160208701838101602088015b6002848385100114156122ac5780518351146122a05760009650600093505b60209283019201612281565b505050505b5090949350505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166122ff57506018612323565b6fffffffffffffffffffffffffffffffff19841661231f57506010612323565b5060005b60208110156123595781818151811061233857fe5b01602001516001600160f81b0319161561235157612359565b600101612323565b60008160200390506060816040519080825280601f01601f19166020018201604052801561238e576020820181803683370190505b5080830196909652508452509192915050565b60606801000000000000000083106123cb5760405162461bcd60e51b815260040161050f90612db9565b604080516001808252818301909252606091602082018180368337019050509050603784116124255782840160f81b8160008151811061240757fe5b60200101906001600160f81b031916908160001a905350905061204c565b6060612430856122bb565b90508381510160370160f81b8260008151811061244957fe5b60200101906001600160f81b031916908160001a90535061246a8282612473565b95945050505050565b6060806040519050835180825260208201818101602087015b818310156124a457805183526020928301920161248c565b50855184518101855292509050808201602086015b818310156124d15780518352602092830192016124b9565b508651929092011591909101601f01601f191660405250905092915050565b9091018181526020918201910152565b60005b818110156125535783818151811061251757fe5b602001015160f81c60f81b85848060010195508151811061253457fe5b60200101906001600160f81b031916908160001a905350600101612503565b5050505050565b6000816001018351101561256d57600080fd5b50016001015190565b604051806060016040528060008152602001600081526020016000151581525090565b600082601f8301126125a9578081fd5b81516125bc6125b782613310565b6132e9565b818152915060208083019084810160005b84811015612632578151870188603f8201126125e857600080fd5b838101516125f86125b782613330565b81815260408b8184860101111561260e57600080fd5b61261d83888401838701613354565b508652505092820192908201906001016125cd565b505050505092915050565b60008083601f84011261264e578182fd5b50813567ffffffffffffffff811115612665578182fd5b60208301915083602082850101111561267d57600080fd5b9250929050565b600082601f830112612694578081fd5b81356126a26125b782613330565b91508082528360208285010111156126b957600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156126e3578081fd5b6126ed60a06132e9565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561272b57600080fd5b61273784828501612684565b60808301525092915050565b600060208284031215612754578081fd5b8135611db881613384565b600060208284031215612770578081fd5b8151611db881613384565b60008060006060848603121561278f578182fd5b833561279a81613384565b92506020840135915060408401356127b18161339c565b809150509250925092565b600080604083850312156127ce578182fd5b825167ffffffffffffffff808211156127e5578384fd5b81850186601f8201126127f6578485fd5b805192506128066125b784613310565b80848252602080830192508084018a828389028701011115612826578889fd5b8894505b8685101561285157805161283d81613384565b84526001949094019392810192810161282a565b508801519096509350505080821115612868578283fd5b5061287585828601612599565b9150509250929050565b600060208284031215612890578081fd5b8151611db88161339c565b600080604083850312156128ad578182fd5b823567ffffffffffffffff808211156128c4578384fd5b6128d086838701612684565b935060208501359150808211156128e5578283fd5b5061287585828601612684565b60008060008060408587031215612907578182fd5b843567ffffffffffffffff8082111561291e578384fd5b61292a8883890161263d565b90965094506020870135915080821115612942578384fd5b5061294f8782880161263d565b95989497509550505050565b60006020828403121561296c578081fd5b813567ffffffffffffffff80821115612983578283fd5b81840160608187031215612995578384fd5b61299f60606132e9565b92508035828111156129af578485fd5b6129bb878284016126d2565b8452506020810135828111156129cf578485fd5b6129db878284016126d2565b6020850152506040810135828111156129f2578485fd5b6129fe87828401612684565b6040850152509195945050505050565b600060208284031215612a1f578081fd5b5035919050565b600060208284031215612a37578081fd5b5051919050565b600080600060408486031215612a52578081fd5b833560ff81168114612a62578182fd5b9250602084013567ffffffffffffffff811115612a7d578182fd5b612a898682870161263d565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612ad8816020860160208601613354565b601f01601f19169290920160200192915050565b600a81526919195c1c9958d85d195960b21b602082015260400190565b60008251612b1b818460208701613354565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611db86020830184612ac0565b600082825260406020830152611db860408301612aec565b600060408252612b9c604083018688612a96565b8281036020840152612baf818587612a96565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b600060208252611cd060208301612aec565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526132aa6040830184612ac0565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561330857600080fd5b604052919050565b600067ffffffffffffffff821115613326578081fd5b5060209081020190565b600067ffffffffffffffff821115613346578081fd5b50601f01601f191660200190565b60005b8381101561336f578181015183820152602001613357565b8381111561337e576000848401525b50505050565b6001600160a01b038116811461339957600080fd5b50565b801515811461339957600080fdfea164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001002": { "balance": "0x0", - "code": "0x6080604052600436106101855760003560e01c80639dc09262116100d1578063ac4317511161008a578063df8079e911610064578063df8079e914610520578063f9a2bbc714610535578063fb5478b31461054a578063fd6a68791461055f576101c9565b8063ac43175114610427578063c81b1662146104f6578063dc927faf1461050b576101c9565b80639dc0926214610390578063a1a11bf5146103a5578063a78abc16146103ba578063aa82dce1146103cf578063aad56063146103e4578063ab51bb96146103f9576101c9565b806351b4dce31161013e5780636e47b482116101185780636e47b4821461031857806375d47a0a1461032d5780637e434d54146103425780639a99b4f014610357576101c9565b806351b4dce3146102a757806351e80672146102bc5780636d70f7ae146102d1576101c9565b80630e2374a5146101ce57806328087028146101ff5780633a0b0eff1461021457806343756e5c1461023b578063493279b1146102505780634bf6c8821461027c576101c9565b366101c95734156101c75760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101da57600080fd5b506101e3610574565b604080516001600160a01b039092168252519081900360200190f35b34801561020b57600080fd5b506101e361057a565b34801561022057600080fd5b50610229610580565b60408051918252519081900360200190f35b34801561024757600080fd5b506101e3610586565b34801561025c57600080fd5b5061026561058c565b6040805161ffff9092168252519081900360200190f35b34801561028857600080fd5b50610291610591565b6040805160ff9092168252519081900360200190f35b3480156102b357600080fd5b506101e3610596565b3480156102c857600080fd5b506101e361059c565b3480156102dd57600080fd5b50610304600480360360208110156102f457600080fd5b50356001600160a01b03166105a2565b604080519115158252519081900360200190f35b34801561032457600080fd5b506101e36105c0565b34801561033957600080fd5b506101e36105c6565b34801561034e57600080fd5b506101e36105cc565b34801561036357600080fd5b506102296004803603604081101561037a57600080fd5b506001600160a01b0381351690602001356105d2565b34801561039c57600080fd5b506101e361077d565b3480156103b157600080fd5b506101e3610783565b3480156103c657600080fd5b50610304610789565b3480156103db57600080fd5b506101e3610792565b3480156103f057600080fd5b506101e3610798565b34801561040557600080fd5b5061040e61079e565b6040805163ffffffff9092168252519081900360200190f35b34801561043357600080fd5b506101c76004803603604081101561044a57600080fd5b81019060208101813564010000000081111561046557600080fd5b82018360208201111561047757600080fd5b8035906020019184600183028401116401000000008311171561049957600080fd5b9193909290916020810190356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460018302840111640100000000831117156104eb57600080fd5b5090925090506107a3565b34801561050257600080fd5b506101e3610b26565b34801561051757600080fd5b506101e3610b2c565b34801561052c57600080fd5b506101e3610b32565b34801561054157600080fd5b506101e3610b38565b34801561055657600080fd5b50610229610b3e565b34801561056b57600080fd5b506101e3610b4a565b61200181565b61200581565b60015481565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b61100881565b61200381565b6000805460ff1661064f57600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff1661069d5760405162461bcd60e51b815260040180806020018281038252602b815260200180610c38602b913960400191505060405180910390fd5b60004783106106ac57476106ae565b825b9050674563918244f400008111156106cb5750674563918244f400005b801561074c576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610707573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a2610776565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146107e35760405162461bcd60e51b815260040180806020018281038252602e815260200180610c92602e913960400191505060405180910390fd5b61084584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610b509050565b1561091d57606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506108c85760405162461bcd60e51b815260040180806020018281038252602c815260200180610cc0602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610a94565b61098284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610b509050565b15610a5757606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060149091149050610a055760405162461bcd60e51b815260040180806020018281038252602f815260200180610c63602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610a94565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61200481565b61100081565b674563918244f4000081565b61100481565b6000816040516020018082805190602001908083835b60208310610b855780518252601f199092019160209182019101610b66565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610bf35780518252601f199092019160209182019101610bd4565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a164736f6c6343000604000a" + "code": "0x60806040526004361061016a5760003560e01c80639dc09262116100d1578063ac4317511161008a578063df8079e911610064578063df8079e9146104da578063f9a2bbc7146104ef578063fb5478b314610504578063fd6a687914610519576101ae565b8063ac431751146103e1578063c81b1662146104b0578063dc927faf146104c5576101ae565b80639dc092621461034a578063a1a11bf51461035f578063a78abc1614610374578063aa82dce114610389578063aad560631461039e578063ab51bb96146103b3576101ae565b806351e806721161012357806351e80672146102765780636d70f7ae1461028b5780636e47b482146102d257806375d47a0a146102e75780637e434d54146102fc5780639a99b4f014610311576101ae565b80630e2374a5146101b357806328087028146101e45780633a0b0eff146101f957806343756e5c14610220578063493279b11461023557806351b4dce314610261576101ae565b366101ae5734156101ac5760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101bf57600080fd5b506101c861052e565b604080516001600160a01b039092168252519081900360200190f35b3480156101f057600080fd5b506101c8610534565b34801561020557600080fd5b5061020e61053a565b60408051918252519081900360200190f35b34801561022c57600080fd5b506101c8610540565b34801561024157600080fd5b5061024a610546565b6040805161ffff9092168252519081900360200190f35b34801561026d57600080fd5b506101c861054b565b34801561028257600080fd5b506101c8610551565b34801561029757600080fd5b506102be600480360360208110156102ae57600080fd5b50356001600160a01b0316610557565b604080519115158252519081900360200190f35b3480156102de57600080fd5b506101c8610575565b3480156102f357600080fd5b506101c861057b565b34801561030857600080fd5b506101c8610581565b34801561031d57600080fd5b5061020e6004803603604081101561033457600080fd5b506001600160a01b038135169060200135610587565b34801561035657600080fd5b506101c8610732565b34801561036b57600080fd5b506101c8610738565b34801561038057600080fd5b506102be61073e565b34801561039557600080fd5b506101c8610747565b3480156103aa57600080fd5b506101c861074d565b3480156103bf57600080fd5b506103c8610753565b6040805163ffffffff9092168252519081900360200190f35b3480156103ed57600080fd5b506101ac6004803603604081101561040457600080fd5b81019060208101813564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b91939092909160208101903564010000000081111561047157600080fd5b82018360208201111561048357600080fd5b803590602001918460018302840111640100000000831117156104a557600080fd5b509092509050610758565b3480156104bc57600080fd5b506101c8610adb565b3480156104d157600080fd5b506101c8610ae1565b3480156104e657600080fd5b506101c8610ae7565b3480156104fb57600080fd5b506101c8610aed565b34801561051057600080fd5b5061020e610af3565b34801561052557600080fd5b506101c8610aff565b61200181565b61200581565b60015481565b61100181565b603881565b61200681565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b61100881565b61200381565b6000805460ff1661060457600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166106525760405162461bcd60e51b815260040180806020018281038252602b815260200180610bed602b913960400191505060405180910390fd5b60004783106106615747610663565b825b9050674563918244f400008111156106805750674563918244f400005b8015610701576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156106bc573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261072b565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146107985760405162461bcd60e51b815260040180806020018281038252602e815260200180610c47602e913960400191505060405180910390fd5b6107fa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610b059050565b156108d257606082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350506014909114905061087d5760405162461bcd60e51b815260040180806020018281038252602c815260200180610c75602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610a49565b61093784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610b059050565b15610a0c57606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506109ba5760405162461bcd60e51b815260040180806020018281038252602f815260200180610c18602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610a49565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61200481565b61100081565b674563918244f4000081565b61100481565b6000816040516020018082805190602001908083835b60208310610b3a5780518252601f199092019160209182019101610b1b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610ba85780518252601f199092019160209182019101610b89565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001003": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063aad5606311610125578063dda83148116100ad578063e2761af01161007c578063e2761af014610678578063e405bbc31461069c578063ea54b2aa146106a4578063f9a2bbc7146106ac578063fd6a6879146106b45761021c565b8063dda831481461061c578063df5fe70414610642578063df8079e914610668578063e1c7392a146106705761021c565b8063c81b1662116100f4578063c81b166214610547578063cba510a91461054f578063d816987914610575578063da8d08f0146105ee578063dc927faf146106145761021c565b8063aad5606314610452578063ab51bb961461045a578063ac4317511461047b578063adc879e91461053f5761021c565b8063564b81ef116101a85780637e434d54116101775780637e434d54146104165780639dc092621461041e578063a1a11bf514610426578063a78abc161461042e578063aa82dce11461044a5761021c565b8063564b81ef146102c45780635c5ae8db146103415780636e47b4821461040657806375d47a0a1461040e5761021c565b806343756e5c116101ef57806343756e5c1461026f578063493279b1146102775780634bf6c8821461029657806351b4dce3146102b457806351e80672146102bc5761021c565b80630e2374a5146102215780632657e9b614610245578063280870281461025f57806333f7798d14610267575b600080fd5b6102296106bc565b604080516001600160a01b039092168252519081900360200190f35b61024d6106c2565b60408051918252519081900360200190f35b6102296106cd565b61024d6106d3565b6102296106d9565b61027f6106df565b6040805161ffff9092168252519081900360200190f35b61029e6106e4565b6040805160ff9092168252519081900360200190f35b6102296106e9565b6102296106ef565b6102cc6106f5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103065781810151838201526020016102ee565b50505050905090810190601f1680156103335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103676004803603602081101561035757600080fd5b50356001600160401b0316610800565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103c85781810151838201526020016103b0565b50505050905090810190601f1680156103f55780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102296108bb565b6102296108c1565b6102296108c7565b6102296108cd565b6102296108d3565b6104366108d9565b604080519115158252519081900360200190f35b6102296108e2565b6102296108e8565b6104626108ee565b6040805163ffffffff9092168252519081900360200190f35b61053d6004803603604081101561049157600080fd5b8101906020810181356401000000008111156104ac57600080fd5b8201836020820111156104be57600080fd5b803590602001918460018302840111640100000000831117156104e057600080fd5b9193909290916020810190356401000000008111156104fe57600080fd5b82018360208201111561051057600080fd5b8035906020019184600183028401116401000000008311171561053257600080fd5b5090925090506108f3565b005b61024d6109c4565b6102296109ca565b61024d6004803603602081101561056557600080fd5b50356001600160401b03166109d0565b6104366004803603604081101561058b57600080fd5b8101906020810181356401000000008111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111640100000000831117156105da57600080fd5b9193509150356001600160401b03166109ef565b6102296004803603602081101561060457600080fd5b50356001600160401b0316610aaf565b610229610aca565b6102296004803603602081101561063257600080fd5b50356001600160401b0316610ad0565b6104366004803603602081101561065857600080fd5b50356001600160401b0316610af4565b610229610b36565b61053d610b3c565b610680610bdc565b604080516001600160401b039092168252519081900360200190f35b610680610beb565b6102cc610c06565b610229610c25565b610229610c2b565b61200181565b662386f26fc1000081565b61200581565b60055481565b61100181565b603881565b600881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561076b57828160ff168151811061073f57fe5b01602001516001600160f81b0319161561075e57816001019150610763565b61076b565b600101610724565b5060608160ff166040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b50905060005b8260ff168160ff1610156107f857838160ff16815181106107bf57fe5b602001015160f81c60f81b828260ff16815181106107d957fe5b60200101906001600160f81b031916908160001a9053506001016107a2565b509250505090565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905084565b61100581565b61100881565b61200381565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff1661094a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461098a5760405162461bcd60e51b815260040180806020018281038252602e815260200180610c3c602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610a3257600080fd5b505afa158015610a46573d6000803e3d6000fd5b505050506040513d6020811015610a5c57600080fd5b505161098a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610b3057506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610b94576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610bbb6040518061024001604052806102208152602001610c6a6102209139610c31565b505160045550506000805460ff19166001179055662386f26fc10000600555565b6003546001600160401b031681565b6003546801000000000000000090046001600160401b031681565b6040518061024001604052806102208152602001610c6a610220913981565b61100081565b61100481565b805160209091019156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063aad5606311610125578063dda83148116100ad578063e2761af01161007c578063e2761af01461064f578063e405bbc314610673578063ea54b2aa1461067b578063f9a2bbc714610683578063fd6a68791461068b57610211565b8063dda83148146105f3578063df5fe70414610619578063df8079e91461063f578063e1c7392a1461064757610211565b8063c81b1662116100f4578063c81b16621461051e578063cba510a914610526578063d81698791461054c578063da8d08f0146105c5578063dc927faf146105eb57610211565b8063aad5606314610429578063ab51bb9614610431578063ac43175114610452578063adc879e91461051657610211565b8063564b81ef116101a85780637e434d54116101775780637e434d54146103ed5780639dc09262146103f5578063a1a11bf5146103fd578063a78abc1614610405578063aa82dce11461042157610211565b8063564b81ef1461029b5780635c5ae8db146103185780636e47b482146103dd57806375d47a0a146103e557610211565b806343756e5c116101e457806343756e5c14610264578063493279b11461026c57806351b4dce31461028b57806351e806721461029357610211565b80630e2374a5146102165780632657e9b61461023a578063280870281461025457806333f7798d1461025c575b600080fd5b61021e610693565b604080516001600160a01b039092168252519081900360200190f35b610242610699565b60408051918252519081900360200190f35b61021e6106a4565b6102426106aa565b61021e6106b0565b6102746106b6565b6040805161ffff9092168252519081900360200190f35b61021e6106bb565b61021e6106c1565b6102a36106c7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102dd5781810151838201526020016102c5565b50505050905090810190601f16801561030a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033e6004803603602081101561032e57600080fd5b50356001600160401b03166107d2565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561039f578181015183820152602001610387565b50505050905090810190601f1680156103cc5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61021e61088d565b61021e610893565b61021e610899565b61021e61089f565b61021e6108a5565b61040d6108ab565b604080519115158252519081900360200190f35b61021e6108b4565b61021e6108ba565b6104396108c0565b6040805163ffffffff9092168252519081900360200190f35b6105146004803603604081101561046857600080fd5b81019060208101813564010000000081111561048357600080fd5b82018360208201111561049557600080fd5b803590602001918460018302840111640100000000831117156104b757600080fd5b9193909290916020810190356401000000008111156104d557600080fd5b8201836020820111156104e757600080fd5b8035906020019184600183028401116401000000008311171561050957600080fd5b5090925090506108c5565b005b610242610996565b61021e61099c565b6102426004803603602081101561053c57600080fd5b50356001600160401b03166109a2565b61040d6004803603604081101561056257600080fd5b81019060208101813564010000000081111561057d57600080fd5b82018360208201111561058f57600080fd5b803590602001918460018302840111640100000000831117156105b157600080fd5b9193509150356001600160401b03166109c1565b61021e600480360360208110156105db57600080fd5b50356001600160401b0316610a81565b61021e610a9c565b61021e6004803603602081101561060957600080fd5b50356001600160401b0316610aa2565b61040d6004803603602081101561062f57600080fd5b50356001600160401b0316610ac6565b61021e610b08565b610514610b0e565b610657610bae565b604080516001600160401b039092168252519081900360200190f35b610657610bbd565b6102a3610bd8565b61021e610bf7565b61021e610bfd565b61200181565b662386f26fc1000081565b61200581565b60055481565b61100181565b603881565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561073d57828160ff168151811061071157fe5b01602001516001600160f81b0319161561073057816001019150610735565b61073d565b6001016106f6565b5060608160ff166040519080825280601f01601f19166020018201604052801561076e576020820181803683370190505b50905060005b8260ff168160ff1610156107ca57838160ff168151811061079157fe5b602001015160f81c60f81b828260ff16815181106107ab57fe5b60200101906001600160f81b031916908160001a905350600101610774565b509250505090565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905084565b61100581565b61100881565b61200381565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff1661091c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461095c5760405162461bcd60e51b815260040180806020018281038252602e815260200180610c0e602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610a0457600080fd5b505afa158015610a18573d6000803e3d6000fd5b505050506040513d6020811015610a2e57600080fd5b505161095c576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610b0257506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610b66576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610b8d6040518061024001604052806102208152602001610c3c6102209139610c03565b505160045550506000805460ff19166001179055662386f26fc10000600555565b6003546001600160401b031681565b6003546801000000000000000090046001600160401b031681565b6040518061024001604052806102208152602001610c3c610220913981565b61100081565b61100481565b805160209091019156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001004": { "balance": "176405560900000000000000000", - "code": "0x6080604052600436106103545760003560e01c80638eff336c116101c6578063b9fd21e3116100f7578063df8079e911610095578063e8f35cea1161006f578063e8f35cea14610df4578063f9a2bbc714610e27578063fc1a598f14610e3c578063fd6a687914610e6f5761039c565b8063df8079e914610da0578063e04c83a714610db5578063e1c7392a14610ddf5761039c565b8063c81b1662116100d1578063c81b166214610d3b578063c8509d8114610945578063cf41984414610d50578063dc927faf14610d8b5761039c565b8063b9fd21e314610cc0578063bbface1f14610cd5578063bd46646114610d085761039c565b8063a78abc1611610164578063aad560631161013e578063aad5606314610b79578063ab51bb9614610b8e578063ac43175114610bbc578063b99328c514610c875761039c565b8063a78abc1614610b08578063aa7415f514610b1d578063aa82dce114610b645761039c565b80639a854bbd116101a05780639a854bbd14610a905780639a99b4f014610aa55780639dc0926214610ade578063a1a11bf514610af35761039c565b80638eff336c14610a0357806393ab703f14610a425780639509b98014610a575761039c565b806351b4dce3116102a057806371d308631161023e578063799758b911610218578063799758b9146108f15780637e434d5414610930578063831d65d1146109455780638525db03146109ca5761039c565b806371d308631461089d578063727be1f8146108b257806375d47a0a146108dc5761039c565b80635d499b1b1161027a5780635d499b1b1461074757806361368475146106b35780636e0565201461075c5780636e47b482146108885761039c565b806351b4dce3146106f357806351e806721461070857806359b927891461071d5761039c565b80633d7132231161030d57806343a368b9116102e757806343a368b914610672578063493279b1146106875780634bf6c882146106b357806350432d32146106de5761039c565b80633d713223146105975780633fd8b02f1461064857806343756e5c1461065d5761039c565b80630e2374a5146103a15780631182b875146103d257806312234582146104cc578063149d14d914610507578063280870281461052e5780632ae45483146105435761039c565b3661039c57341561039a576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b3480156103ad57600080fd5b506103b6610e84565b604080516001600160a01b039092168252519081900360200190f35b3480156103de57600080fd5b50610457600480360360408110156103f557600080fd5b60ff8235169190810190604081016020820135600160201b81111561041957600080fd5b82018360208201111561042b57600080fd5b803590602001918460018302840111600160201b8311171561044c57600080fd5b509092509050610e8a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610491578181015183820152602001610479565b50505050905090810190601f1680156104be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104d857600080fd5b5061039a600480360360408110156104ef57600080fd5b506001600160a01b0381358116916020013516610ed2565b34801561051357600080fd5b5061051c610f4c565b60408051918252519081900360200190f35b34801561053a57600080fd5b506103b6610f52565b34801561054f57600080fd5b5061057e6004803603604081101561056657600080fd5b506001600160a01b0381358116916020013516610f58565b6040805192835260208301919091528051918290030190f35b3480156105a357600080fd5b506103b6600480360360208110156105ba57600080fd5b810190602081018135600160201b8111156105d457600080fd5b8201836020820111156105e657600080fd5b803590602001918460018302840111600160201b8311171561060757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f7c945050505050565b34801561065457600080fd5b5061051c610fa0565b34801561066957600080fd5b506103b6610fa6565b34801561067e57600080fd5b5061051c610fac565b34801561069357600080fd5b5061069c610fb8565b6040805161ffff9092168252519081900360200190f35b3480156106bf57600080fd5b506106c8610fbd565b6040805160ff9092168252519081900360200190f35b3480156106ea57600080fd5b5061051c610fc2565b3480156106ff57600080fd5b506103b6610fcd565b34801561071457600080fd5b506103b6610fd3565b34801561072957600080fd5b506103b66004803603602081101561074057600080fd5b5035610fd9565b34801561075357600080fd5b5061051c610ff4565b6108746004803603608081101561077257600080fd5b810190602081018135600160201b81111561078c57600080fd5b82018360208201111561079e57600080fd5b803590602001918460208302840111600160201b831117156107bf57600080fd5b919390929091602081019035600160201b8111156107dc57600080fd5b8201836020820111156107ee57600080fd5b803590602001918460208302840111600160201b8311171561080f57600080fd5b919390929091602081019035600160201b81111561082c57600080fd5b82018360208201111561083e57600080fd5b803590602001918460208302840111600160201b8311171561085f57600080fd5b91935091503567ffffffffffffffff16610ffd565b604080519115158252519081900360200190f35b34801561089457600080fd5b506103b6611043565b3480156108a957600080fd5b5061051c611049565b3480156108be57600080fd5b50610874600480360360208110156108d557600080fd5b503561104f565b3480156108e857600080fd5b506103b661108b565b3480156108fd57600080fd5b5061039a6004803603606081101561091457600080fd5b508035906001600160a01b036020820135169060400135611091565b34801561093c57600080fd5b506103b6611341565b34801561095157600080fd5b5061039a6004803603604081101561096857600080fd5b60ff8235169190810190604081016020820135600160201b81111561098c57600080fd5b82018360208201111561099e57600080fd5b803590602001918460018302840111600160201b831117156109bf57600080fd5b509092509050611347565b3480156109d657600080fd5b5061039a600480360360408110156109ed57600080fd5b50803590602001356001600160a01b031661138c565b348015610a0f57600080fd5b5061039a60048036036060811015610a2657600080fd5b508035906001600160a01b0360208201351690604001356114f5565b348015610a4e57600080fd5b5061051c611535565b348015610a6357600080fd5b5061039a60048036036040811015610a7a57600080fd5b506001600160a01b03813516906020013561153c565b348015610a9c57600080fd5b5061051c6115fe565b348015610ab157600080fd5b5061051c60048036036040811015610ac857600080fd5b506001600160a01b03813516906020013561160a565b348015610aea57600080fd5b506103b6611748565b348015610aff57600080fd5b506103b661174e565b348015610b1457600080fd5b50610874611754565b61087460048036036080811015610b3357600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16610ffd565b348015610b7057600080fd5b506103b661175d565b348015610b8557600080fd5b506103b6611763565b348015610b9a57600080fd5b50610ba3611769565b6040805163ffffffff9092168252519081900360200190f35b348015610bc857600080fd5b5061039a60048036036040811015610bdf57600080fd5b810190602081018135600160201b811115610bf957600080fd5b820183602082011115610c0b57600080fd5b803590602001918460018302840111600160201b83111715610c2c57600080fd5b919390929091602081019035600160201b811115610c4957600080fd5b820183602082011115610c5b57600080fd5b803590602001918460018302840111600160201b83111715610c7c57600080fd5b50909250905061176e565b348015610c9357600080fd5b5061039a60048036036040811015610caa57600080fd5b50803590602001356001600160a01b03166114f5565b348015610ccc57600080fd5b5061051c6117ae565b348015610ce157600080fd5b5061051c60048036036020811015610cf857600080fd5b50356001600160a01b03166117b8565b348015610d1457600080fd5b5061051c60048036036020811015610d2b57600080fd5b50356001600160a01b03166117ca565b348015610d4757600080fd5b506103b66117e5565b348015610d5c57600080fd5b5061039a60048036036040811015610d7357600080fd5b506001600160a01b03813581169160200135166117eb565b348015610d9757600080fd5b506103b661187e565b348015610dac57600080fd5b506103b6611884565b348015610dc157600080fd5b5061087460048036036020811015610dd857600080fd5b503561188a565b348015610deb57600080fd5b5061039a61192a565b348015610e0057600080fd5b5061051c60048036036020811015610e1757600080fd5b50356001600160a01b03166119ca565b348015610e3357600080fd5b506103b66119dc565b348015610e4857600080fd5b5061045760048036036020811015610e5f57600080fd5b50356001600160a01b03166119e2565b348015610e7b57600080fd5b506103b6611b09565b61200181565b60005460609060ff16610ed2576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b3361200014610f125760405162461bcd60e51b815260040180806020018281038252602f815260200180611e5f602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b60055481565b61100181565b670de0b6b3a764000081565b603881565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610f12576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b61100581565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b60005460ff166110d6576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b33613000146111165760405162461bcd60e51b815260040180806020018281038252602b815260200180611de5602b913960400191505060405180910390fd5b677ce66c50e284000081111561115d5760405162461bcd60e51b8152600401808060200182810382526035815260200180611db06035913960400191505060405180910390fd5b60006221272160e91b84146112c7576000848152600460205260409020546001600160a01b0316806111d0576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a3505061133c565b6001600160a01b0381166000908152600260205260409020546111f38482611b0f565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d602081101561126857600080fd5b505110156112b4576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6112c086838588611b4f565b505061133a565b6112dc826402540be40063ffffffff611be916565b90508047101561132a576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600061133885828487611b4f565b505b505b505050565b61200381565b60005460ff16610ed2576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b33613000146113cc5760405162461bcd60e51b815260040180806020018281038252602b815260200180611de5602b913960400191505060405180910390fd5b60006221272160e91b831461143757506000828152600460205260409020546001600160a01b031680611437576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b03808216600090815260076020908152604080832093861683529290522080546114a2576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814610f125760405162461bcd60e51b8152600401808060200182810382526023815260200180611e8e6023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d60208110156115a057600080fd5b50516001600160a01b03163314610f12576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b677ce66c50e284000081565b6000805460ff16611650576040805162461bcd60e51b81526020600482015260196024820152600080516020611eb1833981519152604482015290519081900360640190fd5b33611005146116905760405162461bcd60e51b815260040180806020018281038252602f815260200180611d81602f913960400191505060405180910390fd5b600047831061169f57476116a1565b825b9050670de0b6b3a76400008111156116bd576000915050611742565b801561173f576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156116f9573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610f125760405162461bcd60e51b815260040180806020018281038252602e815260200180611e31602e913960400191505060405180910390fd5b6221272160e91b81565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff1660021415611837576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61100381565b61200481565b600033612002146118e2576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710611922576040516120029083156108fc029084906000818181858888f19350505050158015611918573d6000803e3d6000fd5b5060019050610f9b565b506000919050565b60005460ff1615611982576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015611a7257828160ff1681518110611a4657fe5b01602001516001600160f81b03191615611a6557816001019150611a6a565b611a72565b600101611a2b565b5060608160ff166040519080825280601f01601f191660200182016040528015611aa3576020820181803683370190505b50905060005b8260ff168160ff161015611aff57838160ff1681518110611ac657fe5b602001015160f81c60f81b828260ff1681518110611ae057fe5b60200101906001600160f81b031916908160001a905350600101611aa9565b5095945050505050565b61100481565b60006008821115611b3857611b31836007198401600a0a63ffffffff611be916565b9050611742565b61173f836008849003600a0a63ffffffff611c4216565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054611b86908463ffffffff611c8416565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b600082611bf857506000611742565b82820282848281611c0557fe5b041461173f5760405162461bcd60e51b8152600401808060200182810382526021815260200180611e106021913960400191505060405180910390fd5b600061173f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611cde565b60008282018381101561173f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008183611d6a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d2f578181015183820152602001611d17565b50505050905090810190601f168015611d5c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611d7657fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" + "code": "0x60806040526004361061031e5760003560e01c80638eff336c116101ab578063b99328c5116100f7578063dc927faf11610095578063e8f35cea1161006f578063e8f35cea14610d94578063f9a2bbc714610dc7578063fc1a598f14610ddc578063fd6a687914610e0f57610366565b8063dc927faf14610d55578063df8079e914610d6a578063e1c7392a14610d7f57610366565b8063bd466461116100d1578063bd46646114610cd2578063c81b166214610d05578063c8509d811461090f578063cf41984414610d1a57610366565b8063b99328c514610c51578063b9fd21e314610c8a578063bbface1f14610c9f57610366565b8063a1a11bf511610164578063aa82dce11161013e578063aa82dce114610b2e578063aad5606314610b43578063ab51bb9614610b58578063ac43175114610b8657610366565b8063a1a11bf514610abd578063a78abc1614610ad2578063aa7415f514610ae757610366565b80638eff336c146109cd57806393ab703f14610a0c5780639509b98014610a215780639a854bbd14610a5a5780639a99b4f014610a6f5780639dc0926214610aa857610366565b806351e806721161026a57806371d3086311610223578063799758b9116101fd578063799758b9146108bb5780637e434d54146108fa578063831d65d11461090f5780638525db031461099457610366565b806371d3086314610867578063727be1f81461087c57806375d47a0a146108a657610366565b806351e80672146106a757806359b92789146106bc5780635d499b1b146106e657806361368475146106fb5780636e056520146107265780636e47b4821461085257610366565b80633d713223116102d757806343a368b9116102b157806343a368b91461063c578063493279b11461065157806350432d321461067d57806351b4dce31461069257610366565b80633d713223146105615780633fd8b02f1461061257806343756e5c1461062757610366565b80630e2374a51461036b5780631182b8751461039c5780631223458214610496578063149d14d9146104d157806328087028146104f85780632ae454831461050d57610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610e24565b604080516001600160a01b039092168252519081900360200190f35b3480156103a857600080fd5b50610421600480360360408110156103bf57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e357600080fd5b8201836020820111156103f557600080fd5b803590602001918460018302840111600160201b8311171561041657600080fd5b509092509050610e2a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045b578181015183820152602001610443565b50505050905090810190601f1680156104885780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104a257600080fd5b50610364600480360360408110156104b957600080fd5b506001600160a01b0381358116916020013516610e72565b3480156104dd57600080fd5b506104e6610eec565b60408051918252519081900360200190f35b34801561050457600080fd5b50610380610ef2565b34801561051957600080fd5b506105486004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516610ef8565b6040805192835260208301919091528051918290030190f35b34801561056d57600080fd5b506103806004803603602081101561058457600080fd5b810190602081018135600160201b81111561059e57600080fd5b8201836020820111156105b057600080fd5b803590602001918460018302840111600160201b831117156105d157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f1c945050505050565b34801561061e57600080fd5b506104e6610f3d565b34801561063357600080fd5b50610380610f43565b34801561064857600080fd5b506104e6610f49565b34801561065d57600080fd5b50610666610f55565b6040805161ffff9092168252519081900360200190f35b34801561068957600080fd5b506104e6610f5a565b34801561069e57600080fd5b50610380610f65565b3480156106b357600080fd5b50610380610f6b565b3480156106c857600080fd5b50610380600480360360208110156106df57600080fd5b5035610f71565b3480156106f257600080fd5b506104e6610f8c565b34801561070757600080fd5b50610710610f95565b6040805160ff9092168252519081900360200190f35b61083e6004803603608081101561073c57600080fd5b810190602081018135600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b919390929091602081019035600160201b8111156107a657600080fd5b8201836020820111156107b857600080fd5b803590602001918460208302840111600160201b831117156107d957600080fd5b919390929091602081019035600160201b8111156107f657600080fd5b82018360208201111561080857600080fd5b803590602001918460208302840111600160201b8311171561082957600080fd5b91935091503567ffffffffffffffff16610f9a565b604080519115158252519081900360200190f35b34801561085e57600080fd5b50610380610fe0565b34801561087357600080fd5b506104e6610fe6565b34801561088857600080fd5b5061083e6004803603602081101561089f57600080fd5b5035610fec565b3480156108b257600080fd5b50610380611028565b3480156108c757600080fd5b50610364600480360360608110156108de57600080fd5b508035906001600160a01b03602082013516906040013561102e565b34801561090657600080fd5b506103806112de565b34801561091b57600080fd5b506103646004803603604081101561093257600080fd5b60ff8235169190810190604081016020820135600160201b81111561095657600080fd5b82018360208201111561096857600080fd5b803590602001918460018302840111600160201b8311171561098957600080fd5b5090925090506112e4565b3480156109a057600080fd5b50610364600480360360408110156109b757600080fd5b50803590602001356001600160a01b0316611329565b3480156109d957600080fd5b50610364600480360360608110156109f057600080fd5b508035906001600160a01b036020820135169060400135611492565b348015610a1857600080fd5b506104e66114d2565b348015610a2d57600080fd5b5061036460048036036040811015610a4457600080fd5b506001600160a01b0381351690602001356114d9565b348015610a6657600080fd5b506104e661159b565b348015610a7b57600080fd5b506104e660048036036040811015610a9257600080fd5b506001600160a01b0381351690602001356115a7565b348015610ab457600080fd5b506103806116e5565b348015610ac957600080fd5b506103806116eb565b348015610ade57600080fd5b5061083e6116f1565b61083e60048036036080811015610afd57600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16610f9a565b348015610b3a57600080fd5b506103806116fa565b348015610b4f57600080fd5b50610380611700565b348015610b6457600080fd5b50610b6d611706565b6040805163ffffffff9092168252519081900360200190f35b348015610b9257600080fd5b5061036460048036036040811015610ba957600080fd5b810190602081018135600160201b811115610bc357600080fd5b820183602082011115610bd557600080fd5b803590602001918460018302840111600160201b83111715610bf657600080fd5b919390929091602081019035600160201b811115610c1357600080fd5b820183602082011115610c2557600080fd5b803590602001918460018302840111600160201b83111715610c4657600080fd5b50909250905061170b565b348015610c5d57600080fd5b5061036460048036036040811015610c7457600080fd5b50803590602001356001600160a01b0316611492565b348015610c9657600080fd5b506104e661174b565b348015610cab57600080fd5b506104e660048036036020811015610cc257600080fd5b50356001600160a01b0316611755565b348015610cde57600080fd5b506104e660048036036020811015610cf557600080fd5b50356001600160a01b0316611767565b348015610d1157600080fd5b50610380611782565b348015610d2657600080fd5b5061036460048036036040811015610d3d57600080fd5b506001600160a01b0381358116916020013516611788565b348015610d6157600080fd5b5061038061181b565b348015610d7657600080fd5b50610380611821565b348015610d8b57600080fd5b50610364611827565b348015610da057600080fd5b506104e660048036036020811015610db757600080fd5b50356001600160a01b03166118c7565b348015610dd357600080fd5b506103806118d9565b348015610de857600080fd5b5061042160048036036020811015610dff57600080fd5b50356001600160a01b03166118df565b348015610e1b57600080fd5b50610380611a06565b61200181565b60005460609060ff16610e72576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b3361200014610eb25760405162461bcd60e51b815260040180806020018281038252602f815260200180611d5c602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020908101516000908152600490915260409020546001600160a01b031690565b60055481565b61100181565b670de0b6b3a764000081565b603881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600881565b6000805460ff16610eb2576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b61100581565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b60005460ff16611073576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b33613000146110b35760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce2602b913960400191505060405180910390fd5b677ce66c50e28400008111156110fa5760405162461bcd60e51b8152600401808060200182810382526035815260200180611cad6035913960400191505060405180910390fd5b60006221272160e91b8414611264576000848152600460205260409020546001600160a01b03168061116d576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a350506112d9565b6001600160a01b0381166000908152600260205260409020546111908482611a0c565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d602081101561120557600080fd5b50511015611251576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61125d86838588611a4c565b50506112d7565b611279826402540be40063ffffffff611ae616565b9050804710156112c7576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b60006112d585828487611a4c565b505b505b505050565b61200381565b60005460ff16610e72576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b33613000146113695760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce2602b913960400191505060405180910390fd5b60006221272160e91b83146113d457506000828152600460205260409020546001600160a01b0316806113d4576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b038082166000908152600760209081526040808320938616835292905220805461143f576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814610eb25760405162461bcd60e51b8152600401808060200182810382526023815260200180611d8b6023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561151357600080fd5b505afa158015611527573d6000803e3d6000fd5b505050506040513d602081101561153d57600080fd5b50516001600160a01b03163314610eb2576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b677ce66c50e284000081565b6000805460ff166115ed576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b336110051461162d5760405162461bcd60e51b815260040180806020018281038252602f815260200180611c7e602f913960400191505060405180910390fd5b600047831061163c574761163e565b825b9050670de0b6b3a764000081111561165a5760009150506116df565b80156116dc576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611696573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610eb25760405162461bcd60e51b815260040180806020018281038252602e815260200180611d2e602e913960400191505060405180910390fd5b6221272160e91b81565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff16600214156117d4576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61100381565b61200481565b60005460ff161561187f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff16101561196f57828160ff168151811061194357fe5b01602001516001600160f81b0319161561196257816001019150611967565b61196f565b600101611928565b5060608160ff166040519080825280601f01601f1916602001820160405280156119a0576020820181803683370190505b50905060005b8260ff168160ff1610156119fc57838160ff16815181106119c357fe5b602001015160f81c60f81b828260ff16815181106119dd57fe5b60200101906001600160f81b031916908160001a9053506001016119a6565b5095945050505050565b61100481565b60006008821115611a3557611a2e836007198401600a0a63ffffffff611ae616565b90506116df565b6116dc836008849003600a0a63ffffffff611b3f16565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054611a83908463ffffffff611b8116565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b600082611af5575060006116df565b82820282848281611b0257fe5b04146116dc5760405162461bcd60e51b8152600401808060200182810382526021815260200180611d0d6021913960400191505060405180910390fd5b60006116dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bdb565b6000828201838110156116dc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008183611c675760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c2c578181015183820152602001611c14565b50505050905090810190601f168015611c595780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611c7357fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001005": { "balance": "0x0", - "code": "0x6080604052600436106102605760003560e01c8063930e1b0911610144578063c81b1662116100b6578063e1c7392a1161007a578063e1c7392a1461072b578063e75d72c714610740578063e89a302014610773578063f9a2bbc71461079d578063fd6a6879146107b2578063fdd31fcd146107c757610267565b8063c81b1662146106c2578063d0ab528a146106d7578063dc927faf146106ec578063dcae76ab14610701578063df8079e91461071657610267565b8063a7c6a59d11610108578063a7c6a59d1461056f578063aa82dce114610584578063aad5606314610599578063ab51bb96146105ae578063ac431751146105dc578063ace9fcc2146106ad57610267565b8063930e1b09146104e85780639dc092621461051b578063a1a11bf514610530578063a3c3c0ad14610545578063a78abc161461055a57610267565b806343756e5c116101dd5780636e47b482116101a15780636e47b482146104205780636f93d2e61461043557806374f2272d1461049457806375d47a0a146104a95780637e146cc5146104be5780637e434d54146104d357610267565b806343756e5c1461038a578063493279b11461039f5780634bf6c882146103cb57806351b4dce3146103f657806351e806721461040b57610267565b80631b20087c116102245780631b20087c146103035780631c6433121461031857806328087028146103425780633a9756121461026c57806340bb43c01461035757610267565b8063081e9d131461026c578063093f2fc4146102935780630e2374a5146102a857806310e06a76146102d957806312950c46146102ee57610267565b3661026757005b600080fd5b34801561027857600080fd5b506102816107fa565b60408051918252519081900360200190f35b34801561029f57600080fd5b506102816107ff565b3480156102b457600080fd5b506102bd610804565b604080516001600160a01b039092168252519081900360200190f35b3480156102e557600080fd5b5061028161080a565b3480156102fa57600080fd5b50610281610810565b34801561030f57600080fd5b50610281610816565b34801561032457600080fd5b506102bd6004803603602081101561033b57600080fd5b503561081c565b34801561034e57600080fd5b506102bd610843565b34801561036357600080fd5b506102816004803603602081101561037a57600080fd5b50356001600160a01b0316610849565b34801561039657600080fd5b506102bd61085b565b3480156103ab57600080fd5b506103b4610861565b6040805161ffff9092168252519081900360200190f35b3480156103d757600080fd5b506103e0610866565b6040805160ff9092168252519081900360200190f35b34801561040257600080fd5b506102bd61086b565b34801561041757600080fd5b506102bd610871565b34801561042c57600080fd5b506102bd610877565b34801561044157600080fd5b506104806004803603608081101561045857600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135151561087d565b604080519115158252519081900360200190f35b3480156104a057600080fd5b5061028161094f565b3480156104b557600080fd5b506102bd610955565b3480156104ca57600080fd5b5061028161095b565b3480156104df57600080fd5b506102bd610960565b3480156104f457600080fd5b506102816004803603602081101561050b57600080fd5b50356001600160a01b0316610966565b34801561052757600080fd5b506102bd610978565b34801561053c57600080fd5b506102bd61097e565b34801561055157600080fd5b50610281610984565b34801561056657600080fd5b5061048061098a565b34801561057b57600080fd5b50610281610993565b34801561059057600080fd5b506102bd610999565b3480156105a557600080fd5b506102bd61099f565b3480156105ba57600080fd5b506105c36109a5565b6040805163ffffffff9092168252519081900360200190f35b3480156105e857600080fd5b506106ab600480360360408110156105ff57600080fd5b81019060208101813564010000000081111561061a57600080fd5b82018360208201111561062c57600080fd5b8035906020019184600183028401116401000000008311171561064e57600080fd5b91939092909160208101903564010000000081111561066c57600080fd5b82018360208201111561067e57600080fd5b803590602001918460018302840111640100000000831117156106a057600080fd5b5090925090506109aa565b005b3480156106b957600080fd5b506102816109ea565b3480156106ce57600080fd5b506102bd6109f0565b3480156106e357600080fd5b506102816109f6565b3480156106f857600080fd5b506102bd6109fc565b34801561070d57600080fd5b50610281610a02565b34801561072257600080fd5b506102bd610a08565b34801561073757600080fd5b506106ab610a0e565b34801561074c57600080fd5b506106ab6004803603602081101561076357600080fd5b50356001600160a01b0316610ad7565b34801561077f57600080fd5b506102bd6004803603602081101561079657600080fd5b5035610c30565b3480156107a957600080fd5b506102bd610c3d565b3480156107be57600080fd5b506102bd610c43565b3480156107d357600080fd5b50610281600480360360208110156107ea57600080fd5b50356001600160a01b0316610c49565b600181565b605081565b61200181565b600b5481565b60015481565b600c5481565b6006818154811061082957fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b6000805460ff166108d5576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109155760405162461bcd60e51b815260040180806020018281038252602f815260200180610c8a602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60035481565b61100881565b600581565b61200381565b60056020526000908152604090205481565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b33611007146109155760405162461bcd60e51b815260040180806020018281038252602e815260200180610c5c602e913960400191505060405180910390fd5b60025481565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff1615610a66576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610ab4576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480610b36576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f19350505050610be65760405161100290819084156108fc029085906000818181858888f19350505050158015610ba0573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050610c2d565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061082957fe5b61100081565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x60806040526004361061024a5760003560e01c8063930e1b0911610139578063ace9fcc2116100b6578063df8079e91161007a578063df8079e9146106d5578063e1c7392a146106ea578063e89a3020146106ff578063f9a2bbc714610729578063fd6a68791461073e578063fdd31fcd1461075357610251565b8063ace9fcc21461066c578063c81b166214610681578063d0ab528a14610696578063dc927faf146106ab578063dcae76ab146106c057610251565b8063a7c6a59d116100fd578063a7c6a59d1461052e578063aa82dce114610543578063aad5606314610558578063ab51bb961461056d578063ac4317511461059b57610251565b8063930e1b09146104a75780639dc09262146104da578063a1a11bf5146104ef578063a3c3c0ad14610504578063a78abc161461051957610251565b806343756e5c116101c75780636f93d2e61161018b5780636f93d2e6146103f457806374f2272d1461045357806375d47a0a146104685780637e146cc51461047d5780637e434d541461049257610251565b806343756e5c14610374578063493279b11461038957806351b4dce3146103b557806351e80672146103ca5780636e47b482146103df57610251565b80631b20087c1161020e5780631b20087c146102ed5780631c64331214610302578063280870281461032c5780633a9756121461025657806340bb43c01461034157610251565b8063081e9d1314610256578063093f2fc41461027d5780630e2374a51461029257806310e06a76146102c357806312950c46146102d857610251565b3661025157005b600080fd5b34801561026257600080fd5b5061026b610786565b60408051918252519081900360200190f35b34801561028957600080fd5b5061026b61078b565b34801561029e57600080fd5b506102a7610790565b604080516001600160a01b039092168252519081900360200190f35b3480156102cf57600080fd5b5061026b610796565b3480156102e457600080fd5b5061026b61079c565b3480156102f957600080fd5b5061026b6107a2565b34801561030e57600080fd5b506102a76004803603602081101561032557600080fd5b50356107a8565b34801561033857600080fd5b506102a76107cf565b34801561034d57600080fd5b5061026b6004803603602081101561036457600080fd5b50356001600160a01b03166107d5565b34801561038057600080fd5b506102a76107e7565b34801561039557600080fd5b5061039e6107ed565b6040805161ffff9092168252519081900360200190f35b3480156103c157600080fd5b506102a76107f2565b3480156103d657600080fd5b506102a76107f8565b3480156103eb57600080fd5b506102a76107fe565b34801561040057600080fd5b5061043f6004803603608081101561041757600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610804565b604080519115158252519081900360200190f35b34801561045f57600080fd5b5061026b6108d6565b34801561047457600080fd5b506102a76108dc565b34801561048957600080fd5b5061026b6108e2565b34801561049e57600080fd5b506102a76108e7565b3480156104b357600080fd5b5061026b600480360360208110156104ca57600080fd5b50356001600160a01b03166108ed565b3480156104e657600080fd5b506102a76108ff565b3480156104fb57600080fd5b506102a7610905565b34801561051057600080fd5b5061026b61090b565b34801561052557600080fd5b5061043f610911565b34801561053a57600080fd5b5061026b61091a565b34801561054f57600080fd5b506102a7610920565b34801561056457600080fd5b506102a7610926565b34801561057957600080fd5b5061058261092c565b6040805163ffffffff9092168252519081900360200190f35b3480156105a757600080fd5b5061066a600480360360408110156105be57600080fd5b8101906020810181356401000000008111156105d957600080fd5b8201836020820111156105eb57600080fd5b8035906020019184600183028401116401000000008311171561060d57600080fd5b91939092909160208101903564010000000081111561062b57600080fd5b82018360208201111561063d57600080fd5b8035906020019184600183028401116401000000008311171561065f57600080fd5b509092509050610931565b005b34801561067857600080fd5b5061026b610971565b34801561068d57600080fd5b506102a7610977565b3480156106a257600080fd5b5061026b61097d565b3480156106b757600080fd5b506102a7610983565b3480156106cc57600080fd5b5061026b610989565b3480156106e157600080fd5b506102a761098f565b3480156106f657600080fd5b5061066a610995565b34801561070b57600080fd5b506102a76004803603602081101561072257600080fd5b5035610a5e565b34801561073557600080fd5b506102a7610a6b565b34801561074a57600080fd5b506102a7610a71565b34801561075f57600080fd5b5061026b6004803603602081101561077657600080fd5b50356001600160a01b0316610a77565b600181565b605081565b61200181565b600b5481565b60015481565b600c5481565b600681815481106107b557fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b603881565b61200681565b61200081565b61100581565b6000805460ff1661085c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336120001461089c5760405162461bcd60e51b815260040180806020018281038252602f815260200180610ab8602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60035481565b61100881565b600581565b61200381565b60056020526000908152604090205481565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b336110071461089c5760405162461bcd60e51b815260040180806020018281038252602e815260200180610a8a602e913960400191505060405180910390fd5b60025481565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff16156109ed576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610a3b576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b600881815481106107b557fe5b61100081565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001006": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c80639dc092621161011a578063dc927faf116100ad578063e79a198f1161007c578063e79a198f146104a7578063f3ae2415146104af578063f9a2bbc7146104d5578063fd30d9b8146104dd578063fd6a6879146104e557610206565b8063dc927faf1461048f578063dd91d1c51461020b578063df8079e914610497578063e1c7392a1461049f57610206565b8063aad56063116100e9578063aad560631461039c578063ab51bb96146103a4578063ac431751146103c5578063c81b16621461048757610206565b80639dc092621461037c578063a1a11bf514610384578063a78abc161461038c578063aa82dce11461039457610206565b8063541d55481161019d57806378beee671161016c57806378beee67146103065780637ae230881461032c5780637e434d54146103465780638f83ab131461034e57806395468d261461037457610206565b8063541d5548146102965780636a6a419e146102d05780636e47b482146102f657806375d47a0a146102fe57610206565b8063493279b1116101d9578063493279b1146102495780634bf6c8821461026857806351b4dce31461028657806351e806721461028e57610206565b806303aff02b1461020b5780630e2374a514610215578063280870281461023957806343756e5c14610241575b600080fd5b6102136104ed565b005b61021d610527565b604080516001600160a01b039092168252519081900360200190f35b61021d61052d565b61021d610533565b610251610539565b6040805161ffff9092168252519081900360200190f35b61027061053e565b6040805160ff9092168252519081900360200190f35b61021d610543565b61021d610549565b6102bc600480360360208110156102ac57600080fd5b50356001600160a01b031661054f565b604080519115158252519081900360200190f35b6102bc600480360360208110156102e657600080fd5b50356001600160a01b031661056d565b61021d61058b565b61021d610591565b6102136004803603602081101561031c57600080fd5b50356001600160a01b0316610597565b6103346105e5565b60408051918252519081900360200190f35b61021d6105f2565b6102136004803603602081101561036457600080fd5b50356001600160a01b03166105f8565b610334610655565b61021d610661565b61021d610667565b6102bc61066d565b61021d610676565b61021d61067c565b6103ac610682565b6040805163ffffffff9092168252519081900360200190f35b610213600480360360408110156103db57600080fd5b8101906020810181356401000000008111156103f657600080fd5b82018360208201111561040857600080fd5b8035906020019184600183028401116401000000008311171561042a57600080fd5b91939092909160208101903564010000000081111561044857600080fd5b82018360208201111561045a57600080fd5b8035906020019184600183028401116401000000008311171561047c57600080fd5b509092509050610687565b61021d61071a565b61021d610720565b61021d610726565b61021361072c565b6102136107ae565b6102bc600480360360208110156104c557600080fd5b50356001600160a01b0316610967565b61021d610985565b6102bc61098b565b61021d610994565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200181565b61200581565b61100181565b603881565b600881565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b61100881565b3360009081526008602052604090205460ff166104ed5760405162461bcd60e51b8152600401808060200182810382526024815260200180610a956024913960400191505060405180910390fd5b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166104ed576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b67016345785d8a000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff166106da576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146104ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180610ab9602e913960400191505060405180910390fd5b61100281565b61100381565b61200481565b60005460ff1615610784576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610809576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff1661085c576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610864610a7a565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc916108a8919063ffffffff61099a16565b6040518115909202916000818181858888f193505050501580156108d0573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610906573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600a5460ff1681565b61100481565b60006109dc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506109e3565b9392505050565b60008184841115610a725760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a37578181015183820152602001610a1f565b50505050905090810190601f168015610a645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe72656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80639dc092621161011a578063dc927faf116100ad578063e79a198f1161007c578063e79a198f1461047e578063f3ae241514610486578063f9a2bbc7146104ac578063fd30d9b8146104b4578063fd6a6879146104bc576101fb565b8063dc927faf14610466578063dd91d1c514610200578063df8079e91461046e578063e1c7392a14610476576101fb565b8063aad56063116100e9578063aad5606314610373578063ab51bb961461037b578063ac4317511461039c578063c81b16621461045e576101fb565b80639dc0926214610353578063a1a11bf51461035b578063a78abc1614610363578063aa82dce11461036b576101fb565b80636a6a419e116101925780637ae23088116101615780637ae23088146103035780637e434d541461031d5780638f83ab131461032557806395468d261461034b576101fb565b80636a6a419e146102a75780636e47b482146102cd57806375d47a0a146102d557806378beee67146102dd576101fb565b8063493279b1116101ce578063493279b11461023e57806351b4dce31461025d57806351e8067214610265578063541d55481461026d576101fb565b806303aff02b146102005780630e2374a51461020a578063280870281461022e57806343756e5c14610236575b600080fd5b6102086104c4565b005b6102126104fe565b604080516001600160a01b039092168252519081900360200190f35b610212610504565b61021261050a565b610246610510565b6040805161ffff9092168252519081900360200190f35b610212610515565b61021261051b565b6102936004803603602081101561028357600080fd5b50356001600160a01b0316610521565b604080519115158252519081900360200190f35b610293600480360360208110156102bd57600080fd5b50356001600160a01b031661053f565b61021261055d565b610212610563565b610208600480360360208110156102f357600080fd5b50356001600160a01b0316610569565b61030b6105b7565b60408051918252519081900360200190f35b6102126105c4565b6102086004803603602081101561033b57600080fd5b50356001600160a01b03166105ca565b61030b610627565b610212610633565b610212610639565b61029361063f565b610212610648565b61021261064e565b610383610654565b6040805163ffffffff9092168252519081900360200190f35b610208600480360360408110156103b257600080fd5b8101906020810181356401000000008111156103cd57600080fd5b8201836020820111156103df57600080fd5b8035906020019184600183028401116401000000008311171561040157600080fd5b91939092909160208101903564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b509092509050610659565b6102126106ec565b6102126106f2565b6102126106f8565b6102086106fe565b610208610780565b6102936004803603602081101561049c57600080fd5b50356001600160a01b0316610939565b610212610957565b61029361095d565b610212610966565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200181565b61200581565b61100181565b603881565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b61100881565b3360009081526008602052604090205460ff166104c45760405162461bcd60e51b8152600401808060200182810382526024815260200180610a676024913960400191505060405180910390fd5b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166104c4576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b67016345785d8a000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff166106ac576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146104c45760405162461bcd60e51b815260040180806020018281038252602e815260200180610a8b602e913960400191505060405180910390fd5b61100281565b61100381565b61200481565b60005460ff1615610756576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff166107db576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff1661082e576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610836610a4c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc9161087a919063ffffffff61096c16565b6040518115909202916000818181858888f193505050501580156108a2573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f193505050501580156108d8573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600a5460ff1681565b61100481565b60006109ae83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506109b5565b9392505050565b60008184841115610a445760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a095781810151838201526020016109f1565b50505050905090810190601f168015610a365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe72656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001007": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806388e4194e116100f9578063ab51bb9611610097578063dc927faf11610071578063dc927faf146104ea578063df8079e9146104f2578063f9a2bbc7146104fa578063fd6a687914610502576101a9565b8063ab51bb96146104da578063c81b1662146104e2578063c8509d8114610355576101a9565b8063a1a11bf5116100d3578063a1a11bf5146104a6578063a78abc16146104ae578063aa82dce1146104ca578063aad56063146104d2576101a9565b806388e4194e146103cf5780639ab1a373146104965780639dc092621461049e576101a9565b80634bf6c882116101665780636e47b482116101405780636e47b4821461033d57806375d47a0a146103455780637e434d541461034d578063831d65d114610355576101a9565b80634bf6c8821461030f57806351b4dce31461032d57806351e8067214610335576101a9565b80630e2374a5146101ae5780631182b875146101d257806328087028146102bf5780633a21baae146102c757806343756e5c146102e8578063493279b1146102f0575b600080fd5b6101b661050a565b604080516001600160a01b039092168252519081900360200190f35b61024a600480360360408110156101e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561020c57600080fd5b82018360208201111561021e57600080fd5b803590602001918460018302840111600160201b8311171561023f57600080fd5b509092509050610510565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028457818101518382015260200161026c565b50505050905090810190601f1680156102b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b661058c565b6102cf610592565b6040805163ffffffff9092168252519081900360200190f35b6101b6610597565b6102f861059d565b6040805161ffff9092168252519081900360200190f35b6103176105a2565b6040805160ff9092168252519081900360200190f35b6101b66105a7565b6101b66105ad565b6101b66105b3565b6101b66105b9565b6101b66105bf565b6103cd6004803603604081101561036b57600080fd5b60ff8235169190810190604081016020820135600160201b81111561038f57600080fd5b8201836020820111156103a157600080fd5b803590602001918460018302840111600160201b831117156103c257600080fd5b5090925090506105c5565b005b6103cd600480360360608110156103e557600080fd5b810190602081018135600160201b8111156103ff57600080fd5b82018360208201111561041157600080fd5b803590602001918460018302840111600160201b8311171561043257600080fd5b919390929091602081019035600160201b81111561044f57600080fd5b82018360208201111561046157600080fd5b803590602001918460018302840111600160201b8311171561048257600080fd5b9193509150356001600160a01b0316610605565b6102cf6106f0565b6101b66106f5565b6101b66106fb565b6104b6610701565b604080519115158252519081900360200190f35b6101b661070a565b6101b6610710565b6102cf610716565b6101b661071b565b6101b6610721565b6101b6610727565b6101b661072d565b6101b6610733565b61200181565b606033612000146105525760405162461bcd60e51b815260040180806020018281038252602f815260200180610b0c602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200581565b606681565b61100181565b603881565b600881565b61200681565b61200081565b61100581565b61100881565b61200381565b33612000146105525760405162461bcd60e51b815260040180806020018281038252602f815260200180610b0c602f913960400191505060405180910390fd5b33612006146106455760405162461bcd60e51b8152600401808060200182810382526031815260200180610b3b6031913960400191505060405180910390fd5b61064d610ae1565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506106e781610739565b50505050505050565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b61100281565b61100381565b61200481565b61100081565b61100481565b60006107488260400151610adb565b6107b457604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610ad6565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015610821578181015183820152602001610809565b50505050905090810190601f16801561084e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015610881578181015183820152602001610869565b50505050905090810190601f1680156108ae5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156108cf57600080fd5b505af19250505080156108e0575060015b610ad2576040516000815260443d10156108fc57506000610999565b60046000803e60005160e01c6308c379a0811461091d576000915050610999565b60043d036004833e81513d602482011167ffffffffffffffff8211171561094957600092505050610999565b808301805167ffffffffffffffff81111561096b576000945050505050610999565b8060208301013d860181111561098957600095505050505050610999565b601f01601f191660405250925050505b806109a45750610a47565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a035781810151838201526020016109eb565b50505050905090810190601f168015610a305780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610ad6565b3d808015610a71576040519150601f19603f3d011682016040523d82523d6000602084013e610a76565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610a035781810151838201526020016109eb565b5060005b919050565b3b151590565b6040518060600160405280606081526020016060815260200160006001600160a01b03168152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e7472616374a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80639ab1a373116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf146104b1578063df8079e9146104b9578063f9a2bbc7146104c1578063fd6a6879146104c95761018e565b8063ab51bb96146104a1578063c81b1662146104a9578063c8509d811461031c5761018e565b80639ab1a3731461045d5780639dc0926214610465578063a1a11bf51461046d578063a78abc1614610475578063aa82dce114610491578063aad56063146104995761018e565b806351b4dce31161014b57806375d47a0a1161012557806375d47a0a1461030c5780637e434d5414610314578063831d65d11461031c57806388e4194e146103965761018e565b806351b4dce3146102f457806351e80672146102fc5780636e47b482146103045761018e565b80630e2374a5146101935780631182b875146101b757806328087028146102a45780633a21baae146102ac57806343756e5c146102cd578063493279b1146102d5575b600080fd5b61019b6104d1565b604080516001600160a01b039092168252519081900360200190f35b61022f600480360360408110156101cd57600080fd5b60ff8235169190810190604081016020820135600160201b8111156101f157600080fd5b82018360208201111561020357600080fd5b803590602001918460018302840111600160201b8311171561022457600080fd5b5090925090506104d7565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610269578181015183820152602001610251565b50505050905090810190601f1680156102965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b610553565b6102b4610559565b6040805163ffffffff9092168252519081900360200190f35b61019b61055e565b6102dd610564565b6040805161ffff9092168252519081900360200190f35b61019b610569565b61019b61056f565b61019b610575565b61019b61057b565b61019b610581565b6103946004803603604081101561033257600080fd5b60ff8235169190810190604081016020820135600160201b81111561035657600080fd5b82018360208201111561036857600080fd5b803590602001918460018302840111600160201b8311171561038957600080fd5b509092509050610587565b005b610394600480360360608110156103ac57600080fd5b810190602081018135600160201b8111156103c657600080fd5b8201836020820111156103d857600080fd5b803590602001918460018302840111600160201b831117156103f957600080fd5b919390929091602081019035600160201b81111561041657600080fd5b82018360208201111561042857600080fd5b803590602001918460018302840111600160201b8311171561044957600080fd5b9193509150356001600160a01b03166105c7565b6102b46106b2565b61019b6106b7565b61019b6106bd565b61047d6106c3565b604080519115158252519081900360200190f35b61019b6106cc565b61019b6106d2565b6102b46106d8565b61019b6106dd565b61019b6106e3565b61019b6106e9565b61019b6106ef565b61019b6106f5565b61200181565b606033612000146105195760405162461bcd60e51b815260040180806020018281038252602f815260200180610ace602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200581565b606681565b61100181565b603881565b61200681565b61200081565b61100581565b61100881565b61200381565b33612000146105195760405162461bcd60e51b815260040180806020018281038252602f815260200180610ace602f913960400191505060405180910390fd5b33612006146106075760405162461bcd60e51b8152600401808060200182810382526031815260200180610afd6031913960400191505060405180910390fd5b61060f610aa3565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506106a9816106fb565b50505050505050565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b61100281565b61100381565b61200481565b61100081565b61100481565b600061070a8260400151610a9d565b61077657604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610a98565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b838110156107e35781810151838201526020016107cb565b50505050905090810190601f1680156108105780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561084357818101518382015260200161082b565b50505050905090810190601f1680156108705780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561089157600080fd5b505af19250505080156108a2575060015b610a94576040516000815260443d10156108be5750600061095b565b60046000803e60005160e01c6308c379a081146108df57600091505061095b565b60043d036004833e81513d602482011167ffffffffffffffff8211171561090b5760009250505061095b565b808301805167ffffffffffffffff81111561092d57600094505050505061095b565b8060208301013d860181111561094b5760009550505050505061095b565b601f01601f191660405250925050505b806109665750610a09565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b838110156109c55781810151838201526020016109ad565b50505050905090810190601f1680156109f25780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610a98565b3d808015610a33576040519150601f19603f3d011682016040523d82523d6000602084013e610a38565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d9385939283929183019190850190808383600083156109c55781810151838201526020016109ad565b5060005b919050565b3b151590565b6040518060600160405280606081526020016060815260200160006001600160a01b03168152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001008": { "balance": "0x0", - "code": "0x60806040526004361061020f5760003560e01c80637ec816dd11610118578063ac431751116100a0578063dc927faf1161006f578063dc927faf14610914578063df8079e914610929578063e605bca01461093e578063f9a2bbc714610953578063fd6a6879146109685761020f565b8063ac431751146107b3578063c81b16621461087e578063c8509d8114610695578063d117a110146108935761020f565b8063a1a11bf5116100e7578063a1a11bf514610731578063a78abc1614610746578063aa82dce11461075b578063aad5606314610770578063ab51bb96146107855761020f565b80637ec816dd14610680578063831d65d11461069557806394553a4e1461033f5780639dc092621461071c5761020f565b80634bf6c8821161019b5780636e47b4821161016a5780636e47b4821461061157806372c4e0861461062657806375d47a0a1461065657806377d9dae81461055d5780637e434d541461066b5761020f565b80634bf6c8821461050857806351b4dce31461053357806351e80672146105485780636b3f13071461055d5761020f565b80632e02d776116101e25780632e02d7761461039e57806337e6ecda146103d157806343756e5c14610404578063445fcefe14610419578063493279b1146104dc5761020f565b80630e2374a5146102145780631182b8751461024557806325c751b71461033f5780632808702814610389575b600080fd5b34801561022057600080fd5b5061022961097d565b604080516001600160a01b039092168252519081900360200190f35b34801561025157600080fd5b506102ca6004803603604081101561026857600080fd5b60ff8235169190810190604081016020820135600160201b81111561028c57600080fd5b82018360208201111561029e57600080fd5b803590602001918460018302840111600160201b831117156102bf57600080fd5b509092509050610983565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103045781810151838201526020016102ec565b50505050905090810190601f1680156103315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103756004803603604081101561035557600080fd5b5080356001600160a01b0316906020013567ffffffffffffffff166109ff565b604080519115158252519081900360200190f35b34801561039557600080fd5b50610229610a3b565b3480156103aa57600080fd5b50610375600480360360208110156103c157600080fd5b50356001600160a01b0316610a41565b3480156103dd57600080fd5b50610375600480360360208110156103f457600080fd5b50356001600160a01b0316610a56565b34801561041057600080fd5b50610229610a6b565b34801561042557600080fd5b506104ca6004803603602081101561043c57600080fd5b810190602081018135600160201b81111561045657600080fd5b82018360208201111561046857600080fd5b803590602001918460018302840111600160201b8311171561048957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a71945050505050565b60408051918252519081900360200190f35b3480156104e857600080fd5b506104f1610bd0565b6040805161ffff9092168252519081900360200190f35b34801561051457600080fd5b5061051d610bd5565b6040805160ff9092168252519081900360200190f35b34801561053f57600080fd5b50610229610bda565b34801561055457600080fd5b50610229610be0565b6103756004803603604081101561057357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561059d57600080fd5b8201836020820111156105af57600080fd5b803590602001918460018302840111600160201b831117156105d057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109ff945050505050565b34801561061d57600080fd5b50610229610be6565b6103756004803603602081101561063c57600080fd5b810190602081018135600160201b81111561059d57600080fd5b34801561066257600080fd5b50610229610bec565b34801561067757600080fd5b50610229610bf2565b34801561068c57600080fd5b506104ca610bf8565b3480156106a157600080fd5b5061071a600480360360408110156106b857600080fd5b60ff8235169190810190604081016020820135600160201b8111156106dc57600080fd5b8201836020820111156106ee57600080fd5b803590602001918460018302840111600160201b8311171561070f57600080fd5b509092509050610bfe565b005b34801561072857600080fd5b50610229610c3e565b34801561073d57600080fd5b50610229610c44565b34801561075257600080fd5b50610375610c4a565b34801561076757600080fd5b50610229610c53565b34801561077c57600080fd5b50610229610c59565b34801561079157600080fd5b5061079a610c5f565b6040805163ffffffff9092168252519081900360200190f35b3480156107bf57600080fd5b5061071a600480360360408110156107d657600080fd5b810190602081018135600160201b8111156107f057600080fd5b82018360208201111561080257600080fd5b803590602001918460018302840111600160201b8311171561082357600080fd5b919390929091602081019035600160201b81111561084057600080fd5b82018360208201111561085257600080fd5b803590602001918460018302840111600160201b8311171561087357600080fd5b509092509050610c64565b34801561088a57600080fd5b50610229610ca4565b34801561089f57600080fd5b506108bd600480360360208110156108b657600080fd5b5035610caa565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561092057600080fd5b50610229610d02565b34801561093557600080fd5b50610229610d08565b34801561094a57600080fd5b506104ca610d0e565b34801561095f57600080fd5b50610229610d14565b34801561097457600080fd5b50610229610d1a565b61200181565b606033612000146109c55760405162461bcd60e51b815260040180806020018281038252602f815260200180610e6b602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b61100181565b6020810151600090610a81610e00565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610b0957600092505050610bcb565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b6757600080fd5b505afa158015610b7b573d6000803e3d6000fd5b505050506040513d6020811015610b9157600080fd5b505160808301516060840151919250600091610bb29163ffffffff610d2016565b9050610bc4818363ffffffff610d2016565b9450505050505b919050565b603881565b600881565b61200681565b61200081565b61100581565b61100881565b61200381565b60045481565b33612000146109c55760405162461bcd60e51b815260040180806020018281038252602f815260200180610e6b602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146109c55760405162461bcd60e51b815260040180806020018281038252602e815260200180610e3d602e913960400191505060405180910390fd5b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61200481565b60055481565b61100081565b61100481565b6000610d6283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d69565b9392505050565b60008184841115610df85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x6080604052600436106102045760003560e01c80637ec816dd11610118578063ac431751116100a0578063dc927faf1161006f578063dc927faf146108de578063df8079e9146108f3578063e605bca014610908578063f9a2bbc71461091d578063fd6a68791461093257610204565b8063ac4317511461077d578063c81b166214610848578063c8509d811461065f578063d117a1101461085d57610204565b8063a1a11bf5116100e7578063a1a11bf5146106fb578063a78abc1614610710578063aa82dce114610725578063aad560631461073a578063ab51bb961461074f57610204565b80637ec816dd1461064a578063831d65d11461065f57806394553a4e146103345780639dc09262146106e657610204565b8063493279b11161019b5780636e47b4821161016a5780636e47b482146105db57806372c4e086146105f057806375d47a0a1461062057806377d9dae8146105275780637e434d541461063557610204565b8063493279b1146104d157806351b4dce3146104fd57806351e80672146105125780636b3f13071461052757610204565b80632e02d776116101d75780632e02d7761461039357806337e6ecda146103c657806343756e5c146103f9578063445fcefe1461040e57610204565b80630e2374a5146102095780631182b8751461023a57806325c751b714610334578063280870281461037e575b600080fd5b34801561021557600080fd5b5061021e610947565b604080516001600160a01b039092168252519081900360200190f35b34801561024657600080fd5b506102bf6004803603604081101561025d57600080fd5b60ff8235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460018302840111600160201b831117156102b457600080fd5b50909250905061094d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f95781810151838201526020016102e1565b50505050905090810190601f1680156103265780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036a6004803603604081101561034a57600080fd5b5080356001600160a01b0316906020013567ffffffffffffffff166109c9565b604080519115158252519081900360200190f35b34801561038a57600080fd5b5061021e610a05565b34801561039f57600080fd5b5061036a600480360360208110156103b657600080fd5b50356001600160a01b0316610a0b565b3480156103d257600080fd5b5061036a600480360360208110156103e957600080fd5b50356001600160a01b0316610a20565b34801561040557600080fd5b5061021e610a35565b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a3b945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610b9a565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b5061021e610b9f565b34801561051e57600080fd5b5061021e610ba5565b61036a6004803603604081101561053d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561056757600080fd5b82018360208201111561057957600080fd5b803590602001918460018302840111600160201b8311171561059a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109c9945050505050565b3480156105e757600080fd5b5061021e610bab565b61036a6004803603602081101561060657600080fd5b810190602081018135600160201b81111561056757600080fd5b34801561062c57600080fd5b5061021e610bb1565b34801561064157600080fd5b5061021e610bb7565b34801561065657600080fd5b506104bf610bbd565b34801561066b57600080fd5b506106e46004803603604081101561068257600080fd5b60ff8235169190810190604081016020820135600160201b8111156106a657600080fd5b8201836020820111156106b857600080fd5b803590602001918460018302840111600160201b831117156106d957600080fd5b509092509050610bc3565b005b3480156106f257600080fd5b5061021e610c03565b34801561070757600080fd5b5061021e610c09565b34801561071c57600080fd5b5061036a610c0f565b34801561073157600080fd5b5061021e610c18565b34801561074657600080fd5b5061021e610c1e565b34801561075b57600080fd5b50610764610c24565b6040805163ffffffff9092168252519081900360200190f35b34801561078957600080fd5b506106e4600480360360408110156107a057600080fd5b810190602081018135600160201b8111156107ba57600080fd5b8201836020820111156107cc57600080fd5b803590602001918460018302840111600160201b831117156107ed57600080fd5b919390929091602081019035600160201b81111561080a57600080fd5b82018360208201111561081c57600080fd5b803590602001918460018302840111600160201b8311171561083d57600080fd5b509092509050610c29565b34801561085457600080fd5b5061021e610c69565b34801561086957600080fd5b506108876004803603602081101561088057600080fd5b5035610c6f565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b3480156108ea57600080fd5b5061021e610cc7565b3480156108ff57600080fd5b5061021e610ccd565b34801561091457600080fd5b506104bf610cd3565b34801561092957600080fd5b5061021e610cd9565b34801561093e57600080fd5b5061021e610cdf565b61200181565b6060336120001461098f5760405162461bcd60e51b815260040180806020018281038252602f815260200180610e30602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b61100181565b6020810151600090610a4b610dc5565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610ad357600092505050610b95565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d6020811015610b5b57600080fd5b505160808301516060840151919250600091610b7c9163ffffffff610ce516565b9050610b8e818363ffffffff610ce516565b9450505050505b919050565b603881565b61200681565b61200081565b61100581565b61100881565b61200381565b60045481565b336120001461098f5760405162461bcd60e51b815260040180806020018281038252602f815260200180610e30602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b336110071461098f5760405162461bcd60e51b815260040180806020018281038252602e815260200180610e02602e913960400191505060405180910390fd5b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61200481565b60055481565b61100081565b61100481565b6000610d2783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d2e565b9392505050565b60008184841115610dbd5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d82578181015183820152602001610d6a565b50505050905090810190601f168015610daf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002000": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c806375d47a0a11610151578063c81b1662116100c3578063e1c7392a11610087578063e1c7392a14610862578063e3b048051461086a578063e6400bbe1461088a578063f7a251d714610892578063f9a2bbc71461090a578063fd6a68791461091257610274565b8063c81b166214610813578063ccc108d71461081b578063d31f968d14610823578063dc927faf14610852578063df8079e91461085a57610274565b8063a78abc1611610115578063a78abc16146106fc578063aa82dce114610704578063aad560631461070c578063ab51bb9614610714578063ac43175114610735578063c27cdcfb146107f357610274565b806375d47a0a146106015780637e434d541461060957806384013b6a146106115780639dc09262146106ec578063a1a11bf5146106f457610274565b8063422f9050116101ea57806351e80672116101ae57806351e80672146105535780635f8321771461055b5780636bacff2c146105895780636e47a51a146105d15780636e47b482146105f157806374f079b8146105f957610274565b8063422f9050146104fd57806343756e5c1461051d578063493279b1146105255780634bf6c8821461052d57806351b4dce31461054b57610274565b8063280870281161023c578063280870281461043f578063299b533d146104475780632af6f3991461047b5780632ff32aea14610498578063308325f4146104b95780633a648b15146104c157610274565b80630e2374a51461027957806314b3023b1461029d5780631d130935146102b75780631e275ae1146102d357806322556cdc14610437575b600080fd5b61028161091a565b604080516001600160a01b039092168252519081900360200190f35b6102a5610920565b60408051918252519081900360200190f35b6102bf610926565b604080519115158252519081900360200190f35b61043560048036036101008110156102ea57600080fd5b81018160a081016080820135600160201b81111561030757600080fd5b82018360208201111561031957600080fd5b803590602001918460018302840111600160201b8311171561033a57600080fd5b919390929091602081019035600160201b81111561035757600080fd5b82018360208201111561036957600080fd5b803590602001918460018302840111600160201b8311171561038a57600080fd5b919390929091602081019035600160201b8111156103a757600080fd5b8201836020820111156103b957600080fd5b803590602001918460018302840111600160201b831117156103da57600080fd5b919390929091602081019035600160201b8111156103f757600080fd5b82018360208201111561040957600080fd5b803590602001918460018302840111600160201b8311171561042a57600080fd5b50909250905061092f565b005b6102a5610bd0565b610281610bd5565b6104646004803603602081101561045d57600080fd5b5035610bdb565b6040805161ffff9092168252519081900360200190f35b6102bf6004803603602081101561049157600080fd5b5035610bf1565b6104a0610c06565b60408051600792830b90920b8252519081900360200190f35b6102a5610c0f565b6104e1600480360360208110156104d757600080fd5b503560ff16610c15565b604080516001600160401b039092168252519081900360200190f35b6102bf6004803603602081101561051357600080fd5b503560ff16610c30565b610281610c45565b610464610c4b565b610535610c50565b6040805160ff9092168252519081900360200190f35b610281610c55565b610281610c5b565b6104356004803603604081101561057157600080fd5b506001600160a01b0381358116916020013516610c61565b6105a66004803603602081101561059f57600080fd5b5035610dda565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b610281600480360360208110156105e757600080fd5b503560ff16610e09565b610281610e24565b6102a5610e2a565b610281610e30565b610281610e36565b610435600480360360a081101561062757600080fd5b810190602081018135600160201b81111561064157600080fd5b82018360208201111561065357600080fd5b803590602001918460018302840111600160201b8311171561067457600080fd5b919390929091602081019035600160201b81111561069157600080fd5b8201836020820111156106a357600080fd5b803590602001918460018302840111600160201b831117156106c457600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff16610e3c565b6102816111f0565b6102816111f6565b6102bf6111fc565b610281611205565b61028161120b565b61071c611211565b6040805163ffffffff9092168252519081900360200190f35b6104356004803603604081101561074b57600080fd5b810190602081018135600160201b81111561076557600080fd5b82018360208201111561077757600080fd5b803590602001918460018302840111600160201b8311171561079857600080fd5b919390929091602081019035600160201b8111156107b557600080fd5b8201836020820111156107c757600080fd5b803590602001918460018302840111600160201b831117156107e857600080fd5b509092509050611216565b6104e16004803603602081101561080957600080fd5b503560ff16611256565b610281611271565b610435611277565b6102bf6004803603604081101561083957600080fd5b5080356001600160a01b0316906020013560ff16611437565b610281611457565b61028161145d565b610435611463565b6104e16004803603602081101561088057600080fd5b503560ff166114f5565b610435611510565b610435600480360360608110156108a857600080fd5b60ff8235169190810190604081016020820135600160201b8111156108cc57600080fd5b8201836020820111156108de57600080fd5b803590602001918460018302840111600160201b831117156108ff57600080fd5b919350915035611689565b61028161172b565b610281611731565b61200181565b60015481565b600b5460ff1681565b60005460ff16610974576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b1580156109bf57600080fd5b505afa1580156109d3573d6000803e3d6000fd5b505050506040513d60208110156109e957600080fd5b5051610a265760405162461bcd60e51b81526004018080602001828103825260238152602001806117b76023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610a7257600080fd5b505afa158015610a86573d6000803e3d6000fd5b505050506040513d6020811015610a9c57600080fd5b5051610ad95760405162461bcd60e51b81526004018080602001828103825260238152602001806117b76023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610b52576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610b96576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60096020526000908152604090205460ff1681565b61100181565b603881565b600881565b61200681565b61200081565b60005460ff16610ca6576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d6020811015610d1357600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015610d5457600080fd5b505afa158015610d68573d6000803e3d6000fd5b505050506040513d6020811015610d7e57600080fd5b5051905080610d8b575060155b600082118015610d9b5750808211155b610b96576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b6005602052600090815260409020546001600160a01b031681565b61100581565b60035481565b61100881565b61200381565b60005460ff16610e81576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b158015610ec057600080fd5b505afa158015610ed4573d6000803e3d6000fd5b505050506040513d6020811015610eea57600080fd5b5051610f3d576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610fad576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50516110895760405162461bcd60e51b81526004018080602001828103825260238152602001806117b76023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b03166110f3576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b03908116908316101561115c576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614610b525760ff8181166000908152600a60205260409020805467ffffffffffffffff19166001600160401b038516179055600b541615610b96576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610b525760405162461bcd60e51b815260040180806020018281038252602e815260200180611769602e913960400191505060405180910390fd5b6008602052600090815260409020546001600160401b031681565b61100281565b60005460ff166112bc576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b1580156112ff57600080fd5b505afa158015611313573d6000803e3d6000fd5b505050506040513d602081101561132957600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561136a57600080fd5b505afa15801561137e573d6000803e3d6000fd5b505050506040513d602081101561139457600080fd5b50519050806113a1575060155b6000821180156113b15750808211155b6113f0576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16610b96576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b600660209081526000928352604080842090915290825290205460ff1681565b61100381565b61200481565b60005460ff16156114bb576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260019081556004805467ffffffffffffffff19166001600160401b03179055600060028190556003819055805460ff19169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16611555576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d60208110156115c257600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d602081101561162d57600080fd5b505190508061163a575060155b60008211801561164a5750808211155b610b52576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b60005460ff166116ce576040805162461bcd60e51b81526020600482015260196024820152600080516020611797833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116610b965760405162461bcd60e51b81526004018080602001828103825260318152602001806117386031913960400191505060405180910390fd5b61100081565b6110048156fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637474686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102695760003560e01c806375d47a0a11610151578063c81b1662116100c3578063e1c7392a11610087578063e1c7392a14610839578063e3b0480514610841578063e6400bbe14610861578063f7a251d714610869578063f9a2bbc7146108e1578063fd6a6879146108e957610269565b8063c81b1662146107ea578063ccc108d7146107f2578063d31f968d146107fa578063dc927faf14610829578063df8079e91461083157610269565b8063a78abc1611610115578063a78abc16146106d3578063aa82dce1146106db578063aad56063146106e3578063ab51bb96146106eb578063ac4317511461070c578063c27cdcfb146107ca57610269565b806375d47a0a146105d85780637e434d54146105e057806384013b6a146105e85780639dc09262146106c3578063a1a11bf5146106cb57610269565b80633a648b15116101ea57806351e80672116101ae57806351e806721461052a5780635f832177146105325780636bacff2c146105605780636e47a51a146105a85780636e47b482146105c857806374f079b8146105d057610269565b80633a648b15146104b6578063422f9050146104f257806343756e5c14610512578063493279b11461051a57806351b4dce31461052257610269565b806328087028116102315780632808702814610434578063299b533d1461043c5780632af6f399146104705780632ff32aea1461048d578063308325f4146104ae57610269565b80630e2374a51461026e57806314b3023b146102925780631d130935146102ac5780631e275ae1146102c857806322556cdc1461042c575b600080fd5b6102766108f1565b604080516001600160a01b039092168252519081900360200190f35b61029a6108f7565b60408051918252519081900360200190f35b6102b46108fd565b604080519115158252519081900360200190f35b61042a60048036036101008110156102df57600080fd5b81018160a081016080820135600160201b8111156102fc57600080fd5b82018360208201111561030e57600080fd5b803590602001918460018302840111600160201b8311171561032f57600080fd5b919390929091602081019035600160201b81111561034c57600080fd5b82018360208201111561035e57600080fd5b803590602001918460018302840111600160201b8311171561037f57600080fd5b919390929091602081019035600160201b81111561039c57600080fd5b8201836020820111156103ae57600080fd5b803590602001918460018302840111600160201b831117156103cf57600080fd5b919390929091602081019035600160201b8111156103ec57600080fd5b8201836020820111156103fe57600080fd5b803590602001918460018302840111600160201b8311171561041f57600080fd5b509092509050610906565b005b61029a610ba7565b610276610bac565b6104596004803603602081101561045257600080fd5b5035610bb2565b6040805161ffff9092168252519081900360200190f35b6102b46004803603602081101561048657600080fd5b5035610bc8565b610495610bdd565b60408051600792830b90920b8252519081900360200190f35b61029a610be6565b6104d6600480360360208110156104cc57600080fd5b503560ff16610bec565b604080516001600160401b039092168252519081900360200190f35b6102b46004803603602081101561050857600080fd5b503560ff16610c07565b610276610c1c565b610459610c22565b610276610c27565b610276610c2d565b61042a6004803603604081101561054857600080fd5b506001600160a01b0381358116916020013516610c33565b61057d6004803603602081101561057657600080fd5b5035610dac565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b610276600480360360208110156105be57600080fd5b503560ff16610ddb565b610276610df6565b61029a610dfc565b610276610e02565b610276610e08565b61042a600480360360a08110156105fe57600080fd5b810190602081018135600160201b81111561061857600080fd5b82018360208201111561062a57600080fd5b803590602001918460018302840111600160201b8311171561064b57600080fd5b919390929091602081019035600160201b81111561066857600080fd5b82018360208201111561067a57600080fd5b803590602001918460018302840111600160201b8311171561069b57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff16610e0e565b6102766111c2565b6102766111c8565b6102b46111ce565b6102766111d7565b6102766111dd565b6106f36111e3565b6040805163ffffffff9092168252519081900360200190f35b61042a6004803603604081101561072257600080fd5b810190602081018135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b919390929091602081019035600160201b81111561078c57600080fd5b82018360208201111561079e57600080fd5b803590602001918460018302840111600160201b831117156107bf57600080fd5b5090925090506111e8565b6104d6600480360360208110156107e057600080fd5b503560ff16611228565b610276611243565b61042a611249565b6102b46004803603604081101561081057600080fd5b5080356001600160a01b0316906020013560ff16611409565b610276611429565b61027661142f565b61042a611435565b6104d66004803603602081101561085757600080fd5b503560ff166114c7565b61042a6114e2565b61042a6004803603606081101561087f57600080fd5b60ff8235169190810190604081016020820135600160201b8111156108a357600080fd5b8201836020820111156108b557600080fd5b803590602001918460018302840111600160201b831117156108d657600080fd5b91935091503561165b565b6102766116fd565b610276611703565b61200181565b60015481565b600b5460ff1681565b60005460ff1661094b576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d60208110156109c057600080fd5b50516109fd5760405162461bcd60e51b81526004018080602001828103825260238152602001806117896023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d6020811015610a7357600080fd5b5051610ab05760405162461bcd60e51b81526004018080602001828103825260238152602001806117896023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610b29576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610b6d576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60096020526000908152604090205460ff1681565b61100181565b603881565b61200681565b61200081565b60005460ff16610c78576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015610cbb57600080fd5b505afa158015610ccf573d6000803e3d6000fd5b505050506040513d6020811015610ce557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015610d2657600080fd5b505afa158015610d3a573d6000803e3d6000fd5b505050506040513d6020811015610d5057600080fd5b5051905080610d5d575060155b600082118015610d6d5750808211155b610b6d576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b6005602052600090815260409020546001600160a01b031681565b61100581565b60035481565b61100881565b61200381565b60005460ff16610e53576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b158015610e9257600080fd5b505afa158015610ea6573d6000803e3d6000fd5b505050506040513d6020811015610ebc57600080fd5b5051610f0f576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610f7f576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b505161105b5760405162461bcd60e51b81526004018080602001828103825260238152602001806117896023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b03166110c5576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b03908116908316101561112e576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614610b295760ff8181166000908152600a60205260409020805467ffffffffffffffff19166001600160401b038516179055600b541615610b6d576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610b295760405162461bcd60e51b815260040180806020018281038252602e81526020018061173b602e913960400191505060405180910390fd5b6008602052600090815260409020546001600160401b031681565b61100281565b60005460ff1661128e576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b1580156112d157600080fd5b505afa1580156112e5573d6000803e3d6000fd5b505050506040513d60208110156112fb57600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561133c57600080fd5b505afa158015611350573d6000803e3d6000fd5b505050506040513d602081101561136657600080fd5b5051905080611373575060155b6000821180156113835750808211155b6113c2576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16610b6d576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b600660209081526000928352604080842090915290825290205460ff1681565b61100381565b61200481565b60005460ff161561148d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260019081556004805467ffffffffffffffff19166001600160401b03179055600060028190556003819055805460ff19169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16611527576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561156a57600080fd5b505afa15801561157e573d6000803e3d6000fd5b505050506040513d602081101561159457600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156115d557600080fd5b505afa1580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b505190508061160c575060155b60008211801561161c5750808211155b610b29576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b60005460ff166116a0576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116610b6d5760405162461bcd60e51b815260040180806020018281038252603181526020018061170a6031913960400191505060405180910390fd5b61100081565b6110048156fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637474686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002001": { "balance": "0x0", - "code": "0x6080604052600436106102975760003560e01c806375d47a0a1161015a578063bf8546ca116100c1578063df8079e91161007a578063df8079e9146109e0578063edc1a5b0146109f5578063f45fd80b14610a0a578063f9a2bbc714610a4f578063fa03f79714610a64578063fd6a687914610a795761029e565b8063bf8546ca1461092b578063c2117d8214610966578063c81b16621461097b578063c8509d8114610706578063d61b9b9314610990578063dc927faf146109cb5761029e565b8063aa82dce111610113578063aa82dce1146107de578063aad56063146107f3578063ab51bb9614610808578063ac43175114610836578063b88a802f14610901578063baaafd3b146109165761029e565b806375d47a0a146106dc5780637e434d54146106f1578063831d65d1146107065780639dc092621461078b578063a1a11bf5146107a0578063a78abc16146107b55761029e565b80634bf6c882116101fe57806362b171d2116101b757806362b171d21461060157806369b635b6146106165780636bd8f8041461062b5780636e47b482146106615780636fb7f7eb1461067657806375aca593146106a95761029e565b80634bf6c882146105565780634d99dd161461058157806351b4dce3146105ad57806351e80672146105c25780635d17c8bd146105d75780635d499b1b146105ec5761029e565b806311fe9ec61161025057806311fe9ec6146104a357806328087028146104d65780632fdeb111146104eb57806334c433541461050057806343756e5c14610515578063493279b11461052a5761029e565b8063026e402b146102a357806302985992146102d1578063047636d1146102f85780630c795715146103635780630e2374a5146103785780631182b875146103a95761029e565b3661029e57005b600080fd5b6102cf600480360360408110156102b957600080fd5b506001600160a01b038135169060200135610a8e565b005b3480156102dd57600080fd5b506102e6610acb565b60408051918252519081900360200190f35b34801561030457600080fd5b5061032b6004803603602081101561031b57600080fd5b50356001600160a01b0316610ad1565b6040518082606080838360005b83811015610350578181015183820152602001610338565b5050505090500191505060405180910390f35b34801561036f57600080fd5b506102e6610b23565b34801561038457600080fd5b5061038d610b29565b604080516001600160a01b039092168252519081900360200190f35b3480156103b557600080fd5b5061042e600480360360408110156103cc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103f057600080fd5b82018360208201111561040257600080fd5b803590602001918460018302840111600160201b8311171561042357600080fd5b509092509050610b2f565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610468578181015183820152602001610450565b50505050905090810190601f1680156104955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104af57600080fd5b506102e6600480360360208110156104c657600080fd5b50356001600160a01b0316610bee565b3480156104e257600080fd5b5061038d610c09565b3480156104f757600080fd5b506102e6610c0f565b34801561050c57600080fd5b506102e6610c15565b34801561052157600080fd5b5061038d610c20565b34801561053657600080fd5b5061053f610c26565b6040805161ffff9092168252519081900360200190f35b34801561056257600080fd5b5061056b610c2b565b6040805160ff9092168252519081900360200190f35b6102cf6004803603604081101561059757600080fd5b506001600160a01b038135169060200135610c30565b3480156105b957600080fd5b5061038d610cf5565b3480156105ce57600080fd5b5061038d610cfb565b3480156105e357600080fd5b506102e6610d01565b3480156105f857600080fd5b506102e6610d07565b34801561060d57600080fd5b506102e6610d10565b34801561062257600080fd5b506102e6610eb0565b6102cf6004803603606081101561064157600080fd5b506001600160a01b03813581169160208101359091169060400135610a8e565b34801561066d57600080fd5b5061038d610eb6565b34801561068257600080fd5b506102e66004803603602081101561069957600080fd5b50356001600160a01b0316610ebc565b3480156106b557600080fd5b506102e6600480360360208110156106cc57600080fd5b50356001600160a01b0316610ed7565b3480156106e857600080fd5b5061038d610ef2565b3480156106fd57600080fd5b5061038d610ef8565b34801561071257600080fd5b506102cf6004803603604081101561072957600080fd5b60ff8235169190810190604081016020820135600160201b81111561074d57600080fd5b82018360208201111561075f57600080fd5b803590602001918460018302840111600160201b8311171561078057600080fd5b509092509050610efe565b34801561079757600080fd5b5061038d610f3e565b3480156107ac57600080fd5b5061038d610f44565b3480156107c157600080fd5b506107ca610f4a565b604080519115158252519081900360200190f35b3480156107ea57600080fd5b5061038d610f53565b3480156107ff57600080fd5b5061038d610f59565b34801561081457600080fd5b5061081d610f5f565b6040805163ffffffff9092168252519081900360200190f35b34801561084257600080fd5b506102cf6004803603604081101561085957600080fd5b810190602081018135600160201b81111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460018302840111600160201b831117156108a657600080fd5b919390929091602081019035600160201b8111156108c357600080fd5b8201836020820111156108d557600080fd5b803590602001918460018302840111600160201b831117156108f657600080fd5b509092509050610f64565b34801561090d57600080fd5b506102e6610ffb565b34801561092257600080fd5b506102e6611198565b34801561093757600080fd5b506102e66004803603604081101561094e57600080fd5b506001600160a01b03813581169160200135166111a3565b34801561097257600080fd5b506102e66111ce565b34801561098757600080fd5b5061038d6111d4565b34801561099c57600080fd5b506102e6600480360360408110156109b357600080fd5b506001600160a01b03813581169160200135166111da565b3480156109d757600080fd5b5061038d611205565b3480156109ec57600080fd5b5061038d61120b565b348015610a0157600080fd5b506102e6611211565b348015610a1657600080fd5b506102e660048036036060811015610a2d57600080fd5b506001600160a01b03813581169160208101358216916040909101351661121e565b348015610a5b57600080fd5b5061038d611253565b348015610a7057600080fd5b506102e6611259565b348015610a8557600080fd5b5061038d61125f565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610ad9611265565b610ae1611265565b6001600160a01b03929092166000818152600b60209081526040808320548652838352600c82528083205486830152928252600d905281902054908301525090565b6108fc81565b61200181565b60603361200014610b715760405162461bcd60e51b815260040180806020018281038252602f8152602001806112b2602f913960400191505060405180910390fd5b60005460ff16610bb4576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6001600160a01b031660009081526006602052604090205490565b61200581565b60015481565b662386f26fc1000081565b61100181565b603881565b600881565b60105460ff1660021415610c7c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610ca457506402540be4008106155b610b71576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b61200681565b61200081565b60025481565b6402540be40081565b60105460009060ff1660021415610d5f576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480610dc6576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114610e1c576040519150601f19603f3d011682016040523d82523d6000602084013e610e21565b606091505b5050905080610e69576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b6001600160a01b031660009081526008602052604090205490565b61100881565b61200381565b3361200014610b715760405162461bcd60e51b815260040180806020018281038252602f8152602001806112b2602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610fbb576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610bb45760405162461bcd60e51b815260040180806020018281038252602e815260200180611284602e913960400191505060405180910390fd5b60105460009060ff166002141561104a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff1916600217905533600090815260066020526040902054806110ae576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d8060008114611104576040519150601f19603f3d011682016040523d82523d6000602084013e611109565b606091505b5050905080611151576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60015490565b61100281565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6040518060600160405280600390602082028036833750919291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + "code": "0x60806040526004361061028c5760003560e01c806375d47a0a1161015a578063bf8546ca116100c1578063df8079e91161007a578063df8079e9146109aa578063edc1a5b0146109bf578063f45fd80b146109d4578063f9a2bbc714610a19578063fa03f79714610a2e578063fd6a687914610a4357610293565b8063bf8546ca146108f5578063c2117d8214610930578063c81b166214610945578063c8509d81146106d0578063d61b9b931461095a578063dc927faf1461099557610293565b8063aa82dce111610113578063aa82dce1146107a8578063aad56063146107bd578063ab51bb96146107d2578063ac43175114610800578063b88a802f146108cb578063baaafd3b146108e057610293565b806375d47a0a146106a65780637e434d54146106bb578063831d65d1146106d05780639dc0926214610755578063a1a11bf51461076a578063a78abc161461077f57610293565b8063493279b1116101fe57806362b171d2116101b757806362b171d2146105cb57806369b635b6146105e05780636bd8f804146105f55780636e47b4821461062b5780636fb7f7eb1461064057806375aca5931461067357610293565b8063493279b11461051f5780634d99dd161461054b57806351b4dce31461057757806351e806721461058c5780635d17c8bd146105a15780635d499b1b146105b657610293565b80631182b875116102505780631182b8751461039e57806311fe9ec61461049857806328087028146104cb5780632fdeb111146104e057806334c43354146104f557806343756e5c1461050a57610293565b8063026e402b1461029857806302985992146102c6578063047636d1146102ed5780630c795715146103585780630e2374a51461036d57610293565b3661029357005b600080fd5b6102c4600480360360408110156102ae57600080fd5b506001600160a01b038135169060200135610a58565b005b3480156102d257600080fd5b506102db610a95565b60408051918252519081900360200190f35b3480156102f957600080fd5b506103206004803603602081101561031057600080fd5b50356001600160a01b0316610a9b565b6040518082606080838360005b8381101561034557818101518382015260200161032d565b5050505090500191505060405180910390f35b34801561036457600080fd5b506102db610aed565b34801561037957600080fd5b50610382610af3565b604080516001600160a01b039092168252519081900360200190f35b3480156103aa57600080fd5b50610423600480360360408110156103c157600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e557600080fd5b8201836020820111156103f757600080fd5b803590602001918460018302840111600160201b8311171561041857600080fd5b509092509050610af9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045d578181015183820152602001610445565b50505050905090810190601f16801561048a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104a457600080fd5b506102db600480360360208110156104bb57600080fd5b50356001600160a01b0316610bb8565b3480156104d757600080fd5b50610382610bd3565b3480156104ec57600080fd5b506102db610bd9565b34801561050157600080fd5b506102db610bdf565b34801561051657600080fd5b50610382610bea565b34801561052b57600080fd5b50610534610bf0565b6040805161ffff9092168252519081900360200190f35b6102c46004803603604081101561056157600080fd5b506001600160a01b038135169060200135610bf5565b34801561058357600080fd5b50610382610cba565b34801561059857600080fd5b50610382610cc0565b3480156105ad57600080fd5b506102db610cc6565b3480156105c257600080fd5b506102db610ccc565b3480156105d757600080fd5b506102db610cd5565b3480156105ec57600080fd5b506102db610e75565b6102c46004803603606081101561060b57600080fd5b506001600160a01b03813581169160208101359091169060400135610a58565b34801561063757600080fd5b50610382610e7b565b34801561064c57600080fd5b506102db6004803603602081101561066357600080fd5b50356001600160a01b0316610e81565b34801561067f57600080fd5b506102db6004803603602081101561069657600080fd5b50356001600160a01b0316610e9c565b3480156106b257600080fd5b50610382610eb7565b3480156106c757600080fd5b50610382610ebd565b3480156106dc57600080fd5b506102c4600480360360408110156106f357600080fd5b60ff8235169190810190604081016020820135600160201b81111561071757600080fd5b82018360208201111561072957600080fd5b803590602001918460018302840111600160201b8311171561074a57600080fd5b509092509050610ec3565b34801561076157600080fd5b50610382610f03565b34801561077657600080fd5b50610382610f09565b34801561078b57600080fd5b50610794610f0f565b604080519115158252519081900360200190f35b3480156107b457600080fd5b50610382610f18565b3480156107c957600080fd5b50610382610f1e565b3480156107de57600080fd5b506107e7610f24565b6040805163ffffffff9092168252519081900360200190f35b34801561080c57600080fd5b506102c46004803603604081101561082357600080fd5b810190602081018135600160201b81111561083d57600080fd5b82018360208201111561084f57600080fd5b803590602001918460018302840111600160201b8311171561087057600080fd5b919390929091602081019035600160201b81111561088d57600080fd5b82018360208201111561089f57600080fd5b803590602001918460018302840111600160201b831117156108c057600080fd5b509092509050610f29565b3480156108d757600080fd5b506102db610fc0565b3480156108ec57600080fd5b506102db61115d565b34801561090157600080fd5b506102db6004803603604081101561091857600080fd5b506001600160a01b0381358116916020013516611168565b34801561093c57600080fd5b506102db611193565b34801561095157600080fd5b50610382611199565b34801561096657600080fd5b506102db6004803603604081101561097d57600080fd5b506001600160a01b038135811691602001351661119f565b3480156109a157600080fd5b506103826111ca565b3480156109b657600080fd5b506103826111d0565b3480156109cb57600080fd5b506102db6111d6565b3480156109e057600080fd5b506102db600480360360608110156109f757600080fd5b506001600160a01b0381358116916020810135821691604090910135166111e3565b348015610a2557600080fd5b50610382611218565b348015610a3a57600080fd5b506102db61121e565b348015610a4f57600080fd5b50610382611224565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610aa361122a565b610aab61122a565b6001600160a01b03929092166000818152600b60209081526040808320548652838352600c82528083205486830152928252600d905281902054908301525090565b6108fc81565b61200181565b60603361200014610b3b5760405162461bcd60e51b815260040180806020018281038252602f815260200180611277602f913960400191505060405180910390fd5b60005460ff16610b7e576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6001600160a01b031660009081526006602052604090205490565b61200581565b60015481565b662386f26fc1000081565b61100181565b603881565b60105460ff1660021415610c41576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610c6957506402540be4008106155b610b3b576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b61200681565b61200081565b60025481565b6402540be40081565b60105460009060ff1660021415610d24576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480610d8b576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114610de1576040519150601f19603f3d011682016040523d82523d6000602084013e610de6565b606091505b5050905080610e2e576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b6001600160a01b031660009081526008602052604090205490565b61100881565b61200381565b3361200014610b3b5760405162461bcd60e51b815260040180806020018281038252602f815260200180611277602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610f80576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610b7e5760405162461bcd60e51b815260040180806020018281038252602e815260200180611249602e913960400191505060405180910390fd5b60105460009060ff166002141561100f576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480611073576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d80600081146110c9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ce565b606091505b5050905080611116576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60015490565b61100281565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6040518060600160405280600390602082028036833750919291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000002002": { "balance": "0x0", From 48e79b2bc2c2d4745553a24c2ad561b58786b4c6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 4 Sep 2024 16:57:18 +0800 Subject: [PATCH 26/52] feat: remove unused tests --- test/RelayerHub.t.sol | 344 ----------- test/RelayerIncentivize.t.sol | 222 ------- test/SlashIndicator.t.sol | 91 --- test/StakeHub.t.sol | 96 --- test/Staking.t.sol | 478 --------------- test/TokenHub.t.sol | 1031 --------------------------------- test/ValidatorSet.t.sol | 9 - 7 files changed, 2271 deletions(-) delete mode 100644 test/RelayerHub.t.sol delete mode 100644 test/RelayerIncentivize.t.sol delete mode 100644 test/Staking.t.sol delete mode 100644 test/TokenHub.t.sol diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol deleted file mode 100644 index 38748aff..00000000 --- a/test/RelayerHub.t.sol +++ /dev/null @@ -1,344 +0,0 @@ -pragma solidity ^0.8.10; - -import "./utils/Deployer.sol"; - -contract RelayerHubTest is Deployer { - event relayerUpdated(address _from, address _to); - event managerRemoved(address _manager); - event relayerAddedProvisionally(address _relayer); - - function setUp() public { } - - function testAddManager() public { - address manager = addNewManager(); - address newRelayer = _getNextUserAddress(); - - // check if manager is there and can add a relayer - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerAddedProvisionally(newRelayer); - relayerHub.updateRelayer(newRelayer); - assertFalse(relayerHub.isRelayer(newRelayer)); - - vm.prank(newRelayer, newRelayer); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer); - relayerHub.acceptBeingRelayer(manager); - - // do updateRelayer() with the existing relayer - vm.prank(manager, manager); - vm.expectRevert(bytes("relayer already exists")); - relayerHub.updateRelayer(newRelayer); - - // do illegal call - vm.prank(newRelayer, newRelayer); - vm.expectRevert(bytes("manager does not exist")); - relayerHub.updateRelayer(manager); - - // check if relayer is added - bool isRelayerTrue = relayerHub.isRelayer(newRelayer); - assertTrue(isRelayerTrue); - - // check if manager is added - bool isManagerTrue = relayerHub.isManager(manager); - assertTrue(isManagerTrue); - - // set relayer to something else - address newRelayer2 = _getNextUserAddress(); - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerAddedProvisionally(newRelayer2); - relayerHub.updateRelayer(newRelayer2); - assertFalse(relayerHub.isRelayer(newRelayer2)); - - vm.prank(newRelayer2, newRelayer2); - emit relayerUpdated(newRelayer, newRelayer2); - relayerHub.acceptBeingRelayer(manager); - - // set relayer to 0 - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(newRelayer2, payable(address(0))); - relayerHub.updateRelayer(payable(address(0))); - - // ensure 0 address is not a relayer - assertFalse(relayerHub.isRelayer(address(0))); - - // remove manager test i.e. for removeManager() - bytes memory keyRemoveManager = "removeManager"; - vm.expectEmit(true, true, false, true); - emit managerRemoved(manager); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - _updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(relayerHub)); - - // check if relayer got removed - bool isRelayerFalse = relayerHub.isRelayer(newRelayer2); - assertFalse(isRelayerFalse); - - // check if manager got removed - bool isManagerFalse = relayerHub.isManager(manager); - assertFalse(isManagerFalse); - - // check if the manager can remove himself - bytes memory keyAddManager = "addManager"; - _updateParamByGovHub(keyAddManager, valueManagerBytes, address(relayerHub)); - vm.prank(manager, manager); - relayerHub.removeManagerByHimself(); - } - - function testRelayerAddingRemoving() public { - address manager = addNewManager(); - address newRelayer = _getNextUserAddress(); - - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerAddedProvisionally(newRelayer); - relayerHub.updateRelayer(newRelayer); - assertFalse(relayerHub.isRelayer(newRelayer)); - - vm.prank(newRelayer, newRelayer); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer); - relayerHub.acceptBeingRelayer(manager); - - // set relayer to 0 - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(newRelayer, payable(address(0))); - relayerHub.updateRelayer(payable(address(0))); - - // get a new manager, have its relayer registered and then try to remove the relayer for this manager - address manager2 = addNewManager(); - address newRelayer2 = _getNextUserAddress(); - vm.prank(manager2, manager2); - vm.expectEmit(true, true, false, true); - emit relayerAddedProvisionally(newRelayer2); - relayerHub.updateRelayer(newRelayer2); - assertFalse(relayerHub.isRelayer(newRelayer2)); - - vm.prank(newRelayer2, newRelayer2); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer2); - relayerHub.acceptBeingRelayer(manager2); - - // set relayer to 0 - vm.prank(manager2, manager2); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(newRelayer2, payable(address(0))); - relayerHub.updateRelayer(payable(address(0))); - } - - // this checks if the previously existing unregister() function can support safe exit for existing relayers after hardfork - function testUnregister() public { - address existingRelayer1 = 0xb005741528b86F5952469d80A8614591E3c5B632; - vm.prank(existingRelayer1, existingRelayer1); - relayerHub.unregister(); - - address existingRelayer2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; - vm.prank(existingRelayer2, existingRelayer2); - relayerHub.unregister(); - - address nonExistingRelayer = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; - vm.prank(nonExistingRelayer, nonExistingRelayer); - vm.expectRevert(bytes("relayer do not exist")); - relayerHub.unregister(); - } - - // deprecated test - // this checks if the relayer transition can work after hardfork - // function testCurrentRelayerTransition() public { - // RelayerHub relayerHub = helperGetrelayerHub(); - // - // // an existing manager/relayer won't be shown to be valid since update() isn't called - // // note that for pre-hardfork, the relayer and manager are the same for simplicity - // address existingRelayer1 = 0xb005741528b86F5952469d80A8614591E3c5B632; - // bool isManagerFalse = relayerHub.isManager(existingRelayer1); - // assertFalse(isManagerFalse); - // bool isRelayerFalse = relayerHub.isRelayer(existingRelayer1); - // assertFalse(isRelayerFalse); - // - // // now we call update() and the existing relayer/manager should be shown to be valid - // vm.expectEmit(true, true, false, true); - // emit relayerUpdated(payable(address(0)), relayerHub.WHITELIST_1()); - // relayerHub.whitelistInit(); - // bool isManagerTrue = relayerHub.isManager(existingRelayer1); - // assertTrue(isManagerTrue); - // bool isRelayerTrue = relayerHub.isRelayer(existingRelayer1); - // assertTrue(isRelayerTrue); - // - // // for completeness, now we test that a non-existing address isn't a relayer or manager - // address nonExistingRelayer = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; - // bool isManagerFalse2 = relayerHub.isManager(nonExistingRelayer); - // assertFalse(isManagerFalse2); - // bool isRelayerFalse2 = relayerHub.isRelayer(nonExistingRelayer); - // assertFalse(isRelayerFalse2); - // } - - // // helperGetrelayerHub() deploys the new RelayerHub into the existing mainnet data so that we can test - // // data compatibility - // function helperGetrelayerHub() internal returns (RelayerHub) { - // RelayerHub relayerHub; - // - // bytes memory relayerCode = vm.getDeployedCode("RelayerHub.sol"); - // vm.etch(RELAYERHUB_CONTRACT_ADDR, relayerCode); - // relayerHub = RelayerHub(RELAYERHUB_CONTRACT_ADDR); - // - // return relayerHub; - // } - - // Helper function to add a new manager through RelayerHub - function addNewManager() internal returns (address) { - bytes memory keyAddManager = "addManager"; - address manager = _getNextUserAddress(); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - _updateParamByGovHub(keyAddManager, valueManagerBytes, address(relayerHub)); - return manager; - } - - function testRelayerAddingRemoving2() public { - address manager = addNewManager(); - address newRelayer = _getNextUserAddress(); - - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerAddedProvisionally(newRelayer); - relayerHub.updateRelayer(newRelayer); - assertFalse(relayerHub.isRelayer(newRelayer)); - - vm.prank(newRelayer, newRelayer); - emit relayerUpdated(payable(address(0)), newRelayer); - relayerHub.acceptBeingRelayer(manager); - - address manager2 = addNewManager(); - address newRelayer2 = _getNextUserAddress(); - - vm.prank(manager2, manager2); - vm.expectEmit(true, true, false, true); - emit relayerAddedProvisionally(newRelayer2); - relayerHub.updateRelayer(newRelayer2); - assertFalse(relayerHub.isRelayer(newRelayer2)); - - vm.prank(newRelayer2, newRelayer2); - emit relayerUpdated(payable(address(0)), newRelayer2); - relayerHub.acceptBeingRelayer(manager2); - - // set relayer to 0 for first manager - vm.prank(manager, manager); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(newRelayer, payable(address(0))); - relayerHub.updateRelayer(payable(address(0))); - - // set relayer to 0 for second manager - vm.prank(manager2, manager2); - vm.expectEmit(true, true, false, true); - emit relayerUpdated(newRelayer2, payable(address(0))); - relayerHub.updateRelayer(payable(address(0))); - } - - function testContractRelayer() public { - address manager = addNewManager(); - - uint64 nonceManager = vm.getNonce(manager); - - address contractAddress = address(bytes20(keccak256(abi.encodePacked(manager, nonceManager)))); - - // add the above address as relayer address which currently doesn't have code - vm.prank(manager, manager); - relayerHub.updateRelayer(contractAddress); - - bytes memory bytecode = - "0x60606040525b600080fd00a165627a7a7230582012c9bd00152fa1c480f6827f81515bb19c3e63bf7ed9ffbb5fda0265983ac7980029"; - - vm.etch(contractAddress, bytecode); - - assertEq(bytes32(bytecode), bytes32(address(contractAddress).code)); - - // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer - assertFalse(relayerHub.isRelayer(contractAddress)); - - // check if a contract relayer fails - vm.prank(contractAddress, contractAddress); - vm.expectRevert(bytes("provisional relayer is a contract")); - relayerHub.acceptBeingRelayer(manager); - } - - function testProxyContractRelayer() public { - address manager = addNewManager(); - - uint64 nonceManager = vm.getNonce(manager); - - address contractAddress = address(bytes20(keccak256(abi.encodePacked(manager, nonceManager)))); - - // add the above address as relayer address which currently doesn't have code - vm.prank(manager, manager); - relayerHub.updateRelayer(contractAddress); - - // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer - assertFalse(relayerHub.isRelayer(contractAddress)); - - // check if a proxy relayer fails - vm.prank(contractAddress, manager); - vm.expectRevert(bytes("provisional relayer is a proxy")); - relayerHub.acceptBeingRelayer(manager); - } - - // testManagerDeleteProvisionalRelayerRegistration checks the following scenario: - // If a relayer is added provisionally and the manager gets deleted by governance BEFORE relayer registers itself - // then it shouldn't be able to register. - function testManagerDeleteProvisionalRelayerRegistration() public { - address manager = addNewManager(); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - address newRelayer = _getNextUserAddress(); - - // add the above address as relayer address which currently doesn't have code - vm.prank(manager, manager); - relayerHub.updateRelayer(newRelayer); - - // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer - assertFalse(relayerHub.isRelayer(newRelayer)); - - // now delete manager before the relayer accepts being a relayer - bytes memory keyRemoveManager = "removeManager"; - _updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(relayerHub)); - - assertFalse(relayerHub.isProvisionalRelayer(newRelayer)); - - // now the relayer tries to register itself which should fail as its manager is already removed - vm.prank(newRelayer, newRelayer); - vm.expectRevert(bytes("relayer is not a provisional relayer")); - relayerHub.acceptBeingRelayer(manager); - assertFalse(relayerHub.isRelayer(newRelayer)); - } - - function testDeleteProvisionalRelayerWhileRemovingRelayer() public { - // Say a manager is there and adds its relayer provisionally and then decides to set it to address(0) - // In this case the relayer is added as a provisional only and not full relayer - // So the provisional relayer should also be deleted, especially if the relayer is yet to add itself as a full relayer - address manager = addNewManager(); - address newRelayer = _getNextUserAddress(); - - vm.prank(manager, manager); - relayerHub.updateRelayer(newRelayer); - assertTrue(relayerHub.isProvisionalRelayer(newRelayer)); - - // Now remove the relayer and ensure that it is deleted being a provisional relayer as well - vm.prank(manager, manager); - relayerHub.updateRelayer(address(0)); - assertFalse(relayerHub.isProvisionalRelayer(newRelayer)); - } - - function testCorrectManagerForAcceptRelayer() public { - address manager = addNewManager(); - address newRelayer = _getNextUserAddress(); - - vm.prank(manager, manager); - relayerHub.updateRelayer(newRelayer); - assertTrue(relayerHub.isProvisionalRelayer(newRelayer)); - - address randomManager = _getNextUserAddress(); - vm.prank(newRelayer, newRelayer); - vm.expectRevert("provisional is not set for this manager"); - relayerHub.acceptBeingRelayer(randomManager); - } -} diff --git a/test/RelayerIncentivize.t.sol b/test/RelayerIncentivize.t.sol deleted file mode 100644 index 49a635a1..00000000 --- a/test/RelayerIncentivize.t.sol +++ /dev/null @@ -1,222 +0,0 @@ -pragma solidity ^0.8.10; - -import "./utils/Deployer.sol"; - -contract RelayerIncentivizeTest is Deployer { - uint256 public roundSize; - uint256 public maximumWeight; - uint256 public gasPrice; - - function setUp() public { - gasPrice = tx.gasprice; - roundSize = incentivize.ROUND_SIZE(); - maximumWeight = incentivize.MAXIMUM_WEIGHT(); - - bytes memory key = "dynamicExtraIncentiveAmount"; - bytes memory valueBytes = abi.encode(uint256(0)); - _updateParamByGovHub(key, valueBytes, address(incentivize)); - } - - function testHeaderRelay() public { - uint256 roundSeq = incentivize.roundSequence(); - vm.startPrank(address(crossChain)); - while (incentivize.roundSequence() == roundSeq) { - incentivize.addReward(_getNextUserAddress(), payable(address(crossChain)), 1e16, false); - } - ++roundSeq; - - address payable[] memory addrs = new address payable[](8); - uint256[] memory bals = new uint256[](8); - for (uint256 i; i < 8; ++i) { - addrs[i] = _getNextUserAddress(); - vm.label(addrs[i], vm.toString(i)); - bals[i] = addrs[i].balance; - } - - for (uint256 i; i < 1; ++i) { - incentivize.addReward(addrs[0], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 2; ++i) { - incentivize.addReward(addrs[1], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 3; ++i) { - incentivize.addReward(addrs[2], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 4; ++i) { - incentivize.addReward(addrs[3], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 5; ++i) { - incentivize.addReward(addrs[4], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 40; ++i) { - incentivize.addReward(addrs[5], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 41; ++i) { - incentivize.addReward(addrs[6], payable(address(crossChain)), 1e16, false); - } - for (uint256 i; i < 4; ++i) { - incentivize.addReward(addrs[7], payable(address(crossChain)), 1e16, false); - } - - assertEq(incentivize.roundSequence(), roundSeq + 1, "wrong sequence"); - - uint256[] memory rewards = new uint256[](8); - for (uint256 i; i < 8; ++i) { - incentivize.claimRelayerReward(addrs[i]); - rewards[i] = addrs[i].balance - bals[i]; - } - - assertGe(rewards[1], rewards[0], "wrong reward"); - assertGe(rewards[2], rewards[1], "wrong reward"); - assertGe(rewards[3], rewards[2], "wrong reward"); - assertGe(rewards[4], rewards[3], "wrong reward"); - assertGe(rewards[5], rewards[4], "wrong reward"); - assertEq(rewards[6], rewards[5], "wrong reward"); - assertEq(rewards[7], rewards[3], "wrong reward"); - - vm.stopPrank(); - } - - function testPackageRelay() public { - uint256 roundSeq = incentivize.roundSequence(); - vm.startPrank(address(crossChain)); - while (incentivize.roundSequence() == roundSeq) { - incentivize.addReward(_getNextUserAddress(), payable(address(crossChain)), 1e16, false); - } - ++roundSeq; - - address payable[] memory addrs = new address payable[](8); - uint256[] memory bals = new uint256[](8); - uint256[] memory txFees = new uint256[](8); - for (uint256 i; i < 8; ++i) { - addrs[i] = _getNextUserAddress(); - vm.label(addrs[i], vm.toString(i)); - bals[i] = addrs[i].balance; - } - - uint256 gas; - gas = gasleft(); - for (uint256 i; i < 1; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[0], 1e16, false); - } - txFees[0] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 2; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[1], 1e16, false); - } - txFees[1] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 3; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[2], 1e16, false); - } - txFees[2] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 4; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[3], 1e16, false); - } - txFees[3] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 5; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[4], 1e16, false); - } - txFees[4] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 40; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[5], 1e16, false); - } - txFees[5] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 41; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[6], 1e16, false); - } - txFees[6] = gasPrice * (gas - gasleft()); - gas = gasleft(); - for (uint256 i; i < 4; ++i) { - incentivize.addReward(payable(address(crossChain)), addrs[7], 1e16, false); - } - txFees[7] = gasPrice * (gas - gasleft()); - - assertEq(incentivize.roundSequence(), roundSeq + 1, "wrong sequence"); - - uint256[] memory rewards = new uint256[](8); - for (uint256 i; i < 8; ++i) { - incentivize.claimRelayerReward(addrs[i]); - rewards[i] = addrs[i].balance - bals[i] - txFees[i]; - } - - assertGe(rewards[1], rewards[0], "wrong reward"); - assertGe(rewards[2], rewards[1], "wrong reward"); - assertGe(rewards[3], rewards[2], "wrong reward"); - assertGe(rewards[4], rewards[3], "wrong reward"); - assertGe(rewards[5], rewards[4], "wrong reward"); - assertGe(rewards[5], rewards[6], "wrong reward"); - assertGe(rewards[7], rewards[3], "wrong reward"); // get extra 1/80 of total reward - assertGe(rewards[5], rewards[7], "wrong reward"); // get extra 1/80 of total reward - - vm.stopPrank(); - } - - function testNonPayableAddress() public { - uint256 roundSeq = incentivize.roundSequence(); - vm.startPrank(address(crossChain)); - while (incentivize.roundSequence() == roundSeq) { - incentivize.addReward(_getNextUserAddress(), payable(address(crossChain)), 1e16, false); - } - ++roundSeq; - - uint256 balanceSystemReward = address(systemReward).balance; - for (uint256 i; i < 50; ++i) { - incentivize.addReward(payable(address(lightClient)), relayer, 1e16, false); - } - for (uint256 i; i < 49; ++i) { - incentivize.addReward(relayer, payable(address(lightClient)), 1e16, false); - } - incentivize.addReward(relayer, payable(address(lightClient)), 1e16, false); - - incentivize.claimRelayerReward(address(lightClient)); - incentivize.claimRelayerReward(relayer); - uint256 newBalanceSystemReward = address(systemReward).balance; - - assertEq( - newBalanceSystemReward, balanceSystemReward + 506250000000000000, "wrong amount to systemReward contract" - ); - assertEq(incentivize.roundSequence(), roundSeq + 1, "wrong sequence"); - - vm.stopPrank(); - } - - function testDynamicExtraIncentive() public { - uint256 roundSeq = incentivize.roundSequence(); - vm.startPrank(address(crossChain)); - while (incentivize.roundSequence() == roundSeq) { - incentivize.addReward(_getNextUserAddress(), payable(address(crossChain)), 1e16, false); - } - ++roundSeq; - incentivize.claimRelayerReward(relayer); - - uint256 balance = relayer.balance; - for (uint256 i; i < roundSize; ++i) { - incentivize.addReward(relayer, payable(address(crossChain)), 2e16, false); - } - assertEq(incentivize.roundSequence(), ++roundSeq, "wrong sequence"); - incentivize.claimRelayerReward(relayer); - uint256 reward1 = relayer.balance - balance; - balance = relayer.balance; - - vm.stopPrank(); - bytes memory key = "dynamicExtraIncentiveAmount"; - bytes memory valueBytes = abi.encode(uint256(1e16)); - _updateParamByGovHub(key, valueBytes, address(incentivize)); - - vm.startPrank(address(crossChain)); - for (uint256 i; i < roundSize; ++i) { - incentivize.addReward(relayer, payable(address(crossChain)), 1e16, false); - } - assertEq(incentivize.roundSequence(), ++roundSeq, "wrong sequence"); - incentivize.claimRelayerReward(relayer); - uint256 reward2 = relayer.balance - balance; - assertEq(reward2, reward1, "wrong reward"); - - vm.stopPrank(); - } -} diff --git a/test/SlashIndicator.t.sol b/test/SlashIndicator.t.sol index 3ebdcf74..4ac1fa24 100644 --- a/test/SlashIndicator.t.sol +++ b/test/SlashIndicator.t.sol @@ -35,15 +35,6 @@ contract SlashIndicatorTest is Deployer { // set gas price to zero to send system slash tx vm.txGasPrice(0); vm.mockCall(address(0x66), "", hex"01"); - - // close staking channel - // remove this after final sunset hard fork - if (crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)) { - bytes memory key = "enableOrDisableChannel"; - bytes memory valueBytes = bytes(hex"0800"); - _updateParamByGovHub(key, valueBytes, address(crossChain)); - assertTrue(!crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)); - } } function testGov() public { @@ -108,88 +99,6 @@ contract SlashIndicatorTest is Deployer { bscValidatorSet.enterMaintenance(); } - function testMaintenanceFix() public { - assert(bscValidatorSet.isCurrentValidator(validatorLast)); - - (uint256 misdemeanorThreshold,) = slashIndicator.getSlashThresholds(); - (, uint256 countBefore) = slashIndicator.getSlashIndicator(validatorLast); - - uint256 height = block.number; - for (uint256 i = countBefore; i < misdemeanorThreshold; i++) { - vm.prank(coinbase); - slashIndicator.slash(validatorLast); - height++; - vm.roll(height); - } - - (, uint256 countAfter) = slashIndicator.getSlashIndicator(validatorLast); - assertEq(countAfter, misdemeanorThreshold); - - // validatorLast already enter maintenance after misdemeanor - assert(!bscValidatorSet.isCurrentValidator(validatorLast)); - - // should felony - vm.roll(height + 1000000); - - vm.prank(validatorLast); - vm.expectRevert(bytes("can not enter Temporary Maintenance")); - bscValidatorSet.enterMaintenance(); - - // exit maintenance - vm.prank(validatorLast); - // can not avoid downtime slash by reducing gasLimit - vm.expectRevert(); - bscValidatorSet.exitMaintenance{ gas: 550000 }(); - - vm.prank(validatorLast); - bscValidatorSet.exitMaintenance{ gas: 1000000 }(); - } - - function testMaintenanceFix2() public { - address[] memory _consensusAddrs = bscValidatorSet.getValidators(); - uint256 numOfMaintainingBefore = bscValidatorSet.numOfMaintaining(); - assert(bscValidatorSet.isCurrentValidator(validatorLast)); - - (uint256 misdemeanorThreshold,) = slashIndicator.getSlashThresholds(); - (, uint256 countBefore) = slashIndicator.getSlashIndicator(validatorLast); - - uint256 height = block.number; - for (uint256 i = countBefore; i < misdemeanorThreshold; i++) { - vm.prank(coinbase); - slashIndicator.slash(validatorLast); - height++; - vm.roll(height); - } - - (, uint256 countAfter) = slashIndicator.getSlashIndicator(validatorLast); - assertEq(countAfter, misdemeanorThreshold); - - // validatorLast already enter maintenance after misdemeanor - assert(!bscValidatorSet.isCurrentValidator(validatorLast)); - assertEq(bscValidatorSet.numOfMaintaining(), numOfMaintainingBefore + 1); - - // should felony - vm.roll(height + 1000000); - - uint256 len = _consensusAddrs.length; - uint64[] memory _votingPowers = new uint64[](len); - bytes[] memory _voteAddrs = new bytes[](len); - for (uint256 i = 0; i < len; i++) { - _votingPowers[i] = uint64(1); - _voteAddrs[i] = bytes("11"); - } - - // close STAKE channel - bytes memory value = abi.encodePacked(STAKING_CHANNELID, uint8(0)); - vm.prank(GOV_HUB_ADDR); - crossChain.updateParam("enableOrDisableChannel", value); - - vm.prank(coinbase); - bscValidatorSet.updateValidatorSetV2(_consensusAddrs, _votingPowers, _voteAddrs); - - assertEq(bscValidatorSet.numOfMaintaining(), numOfMaintainingBefore); - } - function testMisdemeanor() public { (, address[] memory consensusAddrs, uint64[] memory votingPowers, bytes[] memory voteAddrs) = _batchCreateValidators(21); diff --git a/test/StakeHub.t.sol b/test/StakeHub.t.sol index 79c08d7e..6380486f 100644 --- a/test/StakeHub.t.sol +++ b/test/StakeHub.t.sol @@ -450,65 +450,7 @@ contract StakeHubTest is Deployer { assertApproxEqAbs(preDelegatorBnbAmount, curDelegatorBnbAmount, 1); // there may be 1 delta due to the precision } - function testUpdateValidatorSetTransitionStage() public { - // open staking channel - if (!crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)) { - bytes memory key = "enableOrDisableChannel"; - bytes memory value = bytes(hex"0801"); - _updateParamByGovHub(key, value, address(crossChain)); - assertTrue(crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)); - } - - uint256 length = stakeHub.maxElectedValidators(); - address[] memory newConsensusAddrs = new address[](length); - uint64[] memory newVotingPower = new uint64[](length); - bytes[] memory newVoteAddrs = new bytes[](length); - address operatorAddress; - address consensusAddress; - uint64 votingPower; - bytes memory voteAddress; - for (uint256 i; i < length; ++i) { - votingPower = (2000 + uint64(i) * 2 + 1) * 1e8; - (operatorAddress,,,) = _createValidator(uint256(votingPower) * 1e10); - consensusAddress = stakeHub.getValidatorConsensusAddress(operatorAddress); - voteAddress = stakeHub.getValidatorVoteAddress(operatorAddress); - newConsensusAddrs[length - i - 1] = consensusAddress; - newVotingPower[length - i - 1] = votingPower; - newVoteAddrs[length - i - 1] = voteAddress; - } - vm.prank(block.coinbase); - vm.txGasPrice(0); - bscValidatorSet.updateValidatorSetV2(newConsensusAddrs, newVotingPower, newVoteAddrs); - - for (uint256 i; i < length; ++i) { - votingPower = (2000 + uint64(i) * 2) * 1e8; - newConsensusAddrs[length - i - 1] = _getNextUserAddress(); - newVotingPower[length - i - 1] = votingPower; - newVoteAddrs[length - i - 1] = bytes(vm.toString(newConsensusAddrs[i])); - } - vm.prank(address(crossChain)); - bscValidatorSet.handleSynPackage( - STAKING_CHANNELID, _encodeValidatorSetUpdatePack(newConsensusAddrs, newVotingPower, newVoteAddrs) - ); - - (,,, uint64 preVotingPower,,) = bscValidatorSet.currentValidatorSet(0); - uint64 curVotingPower; - for (uint256 i = 1; i < length; ++i) { - (,,, curVotingPower,,) = bscValidatorSet.currentValidatorSet(i); - assert(curVotingPower <= preVotingPower); - preVotingPower = curVotingPower; - } - } - function testUpdateValidatorSetV2() public { - // close staking channel - if (crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)) { - bytes memory key = "enableOrDisableChannel"; - bytes memory value = bytes(hex"0800"); - _updateParamByGovHub(key, value, address(crossChain)); - assertFalse(crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)); - } - uint256 length = stakeHub.maxElectedValidators(); address[] memory newConsensusAddrs = new address[](length); uint64[] memory newVotingPower = new uint64[](length); @@ -531,44 +473,6 @@ contract StakeHubTest is Deployer { bscValidatorSet.updateValidatorSetV2(newConsensusAddrs, newVotingPower, newVoteAddrs); } - function testHandleMigrationSynPackage() public { - address delegator = _getNextUserAddress(); - uint256 delegation = 1 ether; - (address validator,, address credit,) = _createValidator(2000 ether); - - // failed for validator not existed - bytes[] memory elements = new bytes[](4); - elements[0] = delegator.encodeAddress(); - elements[1] = delegator.encodeAddress(); - elements[2] = delegator.encodeAddress(); - elements[3] = delegation.encodeUint(); - - vm.expectEmit(true, true, true, true, address(stakeHub)); - emit MigrateFailed(delegator, delegator, delegation, StakeMigrationRespCode.VALIDATOR_NOT_EXISTED); - vm.prank(address(crossChain)); - stakeHub.handleSynPackage(BC_FUSION_CHANNELID, elements.encodeList()); - assertEq(address(stakeHub).balance, 0, "StakeHub balance should be 0"); - - // failed for claim fund failed - elements[0] = validator.encodeAddress(); - vm.deal(TOKEN_HUB_ADDR, 0); - - vm.expectEmit(true, true, true, true, address(stakeHub)); - emit MigrateFailed(validator, delegator, delegation, StakeMigrationRespCode.CLAIM_FUND_FAILED); - vm.prank(address(crossChain)); - stakeHub.handleSynPackage(BC_FUSION_CHANNELID, elements.encodeList()); - - // success case - vm.deal(TOKEN_HUB_ADDR, 100 ether); - vm.expectEmit(true, true, true, true, address(stakeHub)); - emit MigrateSuccess(validator, delegator, delegation, delegation); - vm.prank(address(crossChain)); - stakeHub.handleSynPackage(BC_FUSION_CHANNELID, elements.encodeList()); - - uint256 shares = IStakeCredit(credit).balanceOf(delegator); - assertEq(shares, delegation); - } - function testEncodeLegacyBytes() public { address[] memory cAddresses = new address[](56); bytes[] memory vAddresses = new bytes[](34); diff --git a/test/Staking.t.sol b/test/Staking.t.sol deleted file mode 100644 index 582873c2..00000000 --- a/test/Staking.t.sol +++ /dev/null @@ -1,478 +0,0 @@ -pragma solidity ^0.8.10; - -import "./utils/Deployer.sol"; - -contract StakingTest is Deployer { - using RLPEncode for *; - - event delegateSubmitted( - address indexed delegator, address indexed validator, uint256 amount, uint256 oracleRelayerFee - ); - event undelegateSubmitted( - address indexed delegator, address indexed validator, uint256 amount, uint256 oracleRelayerFee - ); - event redelegateSubmitted( - address indexed delegator, - address indexed validatorSrc, - address indexed validatorDst, - uint256 amount, - uint256 oracleRelayerFee - ); - event rewardReceived(address indexed delegator, uint256 amount); - event rewardClaimed(address indexed delegator, uint256 amount); - event undelegatedReceived(address indexed delegator, address indexed validator, uint256 amount); - event undelegatedClaimed(address indexed delegator, uint256 amount); - event delegateSuccess(address indexed delegator, address indexed validator, uint256 amount); - event undelegateSuccess(address indexed delegator, address indexed validator, uint256 amount); - event delegateFailed(address indexed delegator, address indexed validator, uint256 amount, uint8 errCode); - event undelegateFailed(address indexed delegator, address indexed validator, uint256 amount, uint8 errCode); - event redelegateFailed( - address indexed delegator, address indexed valSrc, address indexed valDst, uint256 amount, uint8 errCode - ); - event crashResponse(uint8 indexed eventCode); - - uint8 public constant EVENT_DELEGATE = 0x01; - uint8 public constant EVENT_UNDELEGATE = 0x02; - uint8 public constant EVENT_REDELEGATE = 0x03; - uint8 public constant EVENT_DISTRIBUTE_REWARD = 0x04; - uint8 public constant EVENT_DISTRIBUTE_UNDELEGATED = 0x05; - - uint256 public relayFee; - uint256 public bSCRelayFee; - uint256 public minDelegation; - uint256 public decimal; - - receive() external payable { } - - function setUp() public { - bytes memory key = "addOrUpdateChannel"; - bytes memory value = abi.encodePacked(CROSS_STAKE_CHANNELID, uint8(1), address(staking)); - _updateParamByGovHub(key, value, address(crossChain)); - - // to init the staking contract - address validator = _getNextUserAddress(); - staking.delegate{ value: 101 ether }(validator, 100 ether); - relayFee = staking.getRelayerFee(); - bSCRelayFee = staking.bSCRelayerFee(); - minDelegation = staking.getMinDelegation(); - decimal = staking.TEN_DECIMALS(); - - bytes[] memory elements = new bytes[](3); - elements[0] = address(this).encodeAddress(); - elements[1] = validator.encodeAddress(); - elements[2] = (1e20 / decimal).encodeUint(); - bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - vm.prank(address(crossChain)); - staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - } - - // function testGov1(uint256 value) public { - // vm.assume(value > relayFee); - // - // bytes memory key = "minDelegation"; - // bytes memory valueBytes = abi.encode(value); - // vm.expectEmit(false, false, false, true, address(staking)); - // emit paramChange(string(key), valueBytes); - // _updateParamByGovHub(key, valueBytes, address(staking)); - // assertEq(value, staking.minDelegation()); - // } - // - // function testGov2(uint32 value) public { - // vm.assume(uint256(value) * decimal > bSCRelayFee); - // - // bytes memory key = "relayerFee"; - // bytes memory valueBytes = abi.encode(uint256(value) * decimal); - // vm.expectEmit(false, false, false, true, address(staking)); - // emit paramChange(string(key), valueBytes); - // _updateParamByGovHub(key, valueBytes, address(staking)); - // assertEq(uint256(value) * decimal, staking.relayerFee()); - // } - // - // function testGov3(uint32 value) public { - // vm.assume(value > 0); - // vm.assume(uint256(value) * decimal < relayFee); - // - // bytes memory key = "bSCRelayerFee"; - // bytes memory valueBytes = abi.encode(uint256(value) * decimal); - // vm.expectEmit(false, false, false, true, address(staking)); - // emit paramChange(string(key), valueBytes); - // _updateParamByGovHub(key, valueBytes, address(staking)); - // assertEq(uint256(value) * decimal, staking.bSCRelayerFee()); - // } - // - // function testDelegate(uint16 amount) public { - // vm.assume(amount > 0); - // address validator = _getNextUserAddress(); - // uint256 bigAmount = uint256(amount) * minDelegation; - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = (bigAmount / decimal).encodeUint(); - // - // uint256 sendValue = minDelegation + relayFee + 1; - // vm.expectRevert(bytes("precision loss in conversion")); - // staking.delegate{value: sendValue}(validator, minDelegation); - // - // sendValue = minDelegation + relayFee; - // vm.expectRevert(bytes("precision loss in conversion")); - // staking.delegate{value: sendValue}(validator, minDelegation + 1); - // - // vm.expectRevert(bytes("invalid delegate amount")); - // staking.delegate{value: sendValue}(validator, 1e18); - // - // sendValue = minDelegation; - // vm.expectRevert(bytes("not enough msg value")); - // staking.delegate{value: sendValue}(validator, minDelegation); - // - // sendValue = minDelegation + relayFee / 2; - // vm.expectRevert(bytes("not enough msg value")); - // staking.delegate{value: sendValue}(validator, minDelegation); - // - // sendValue = bigAmount + relayFee; - // vm.expectEmit(true, true, false, true, address(staking)); - // emit delegateSubmitted(address(this), validator, bigAmount, relayFee - bSCRelayFee); - // staking.delegate{value: sendValue}(validator, bigAmount); - // - // uint256 delegatedBefore = staking.getDelegated(address(this), validator); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.expectEmit(true, true, false, true, address(staking)); - // emit delegateSuccess(address(this), validator, bigAmount); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // assertEq(bigAmount + delegatedBefore, staking.getDelegated(address(this), validator)); - // } - // - // function testUndelegate(uint16 amount) public { - // vm.assume(amount > 0); - // address validator = _getNextUserAddress(); - // uint256 bigAmount = uint256(amount) * minDelegation; - // uint256 sendValue = relayFee + bigAmount + 2 * minDelegation + bSCRelayFee / 10; - // staking.delegate{value: sendValue}(validator, bigAmount + 2 * minDelegation + bSCRelayFee / 10); - // - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = ((bigAmount + 2 * minDelegation + bSCRelayFee / 10) / decimal).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // - // vm.expectRevert(bytes("precision loss in conversion")); - // staking.undelegate{value: relayFee}(validator, bigAmount + 1); - // - // vm.expectRevert(bytes("precision loss in conversion")); - // staking.undelegate{value: relayFee + 1}(validator, bigAmount); - // - // vm.expectRevert(bytes("invalid amount")); - // staking.undelegate{value: relayFee}(validator, minDelegation / 10); - // - // vm.expectRevert(bytes("not enough relay fee")); - // staking.undelegate{value: relayFee / 10}(validator, bigAmount); - // - // vm.expectRevert(bytes("not enough funds")); - // staking.undelegate{value: relayFee}(_getNextUserAddress(), bigAmount); - // - // vm.expectEmit(true, true, false, true, address(staking)); - // emit undelegateSubmitted(address(this), validator, bigAmount, relayFee - bSCRelayFee); - // staking.undelegate{value: relayFee}(validator, bigAmount); - // - // elements[2] = (bigAmount / decimal).encodeUint(); - // ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_UNDELEGATE, elements.encodeList())); - // vm.expectEmit(true, true, false, true, address(staking)); - // emit undelegateSuccess(address(this), validator, bigAmount); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // - // vm.expectRevert(bytes("pending undelegation exist")); - // staking.undelegate{value: relayFee}(validator, minDelegation); - // - // skip(8 days); - // vm.expectRevert(bytes("insufficient balance after undelegate")); - // staking.undelegate{value: relayFee}(validator, 2 * minDelegation); - // - // vm.expectEmit(true, true, false, true, address(staking)); - // emit undelegateSubmitted(address(this), validator, minDelegation, relayFee - bSCRelayFee); - // staking.undelegate{value: relayFee}(validator, minDelegation); - // } - // - // function testRedelegate(uint16 amount) public { - // vm.assume(amount > 0); - // - // address srcValidator = _getNextUserAddress(); - // address dstValidator = _getNextUserAddress(); - // uint256 bigAmount = uint256(amount) * minDelegation; - // uint256 sendValue = relayFee + bigAmount + 2 * minDelegation + bSCRelayFee / 10; - // staking.delegate{value: sendValue}(srcValidator, bigAmount + 2 * minDelegation + bSCRelayFee / 10); - // - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = srcValidator.encodeAddress(); - // elements[2] = ((bigAmount + 2 * minDelegation + bSCRelayFee / 10) / decimal).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // - // vm.expectRevert(bytes("precision loss in conversion")); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, bigAmount + 1); - // - // vm.expectRevert(bytes("precision loss in conversion")); - // staking.redelegate{value: relayFee + 1}(srcValidator, dstValidator, bigAmount); - // - // vm.expectRevert(bytes("invalid redelegation")); - // staking.redelegate{value: relayFee}(srcValidator, srcValidator, bigAmount); - // - // vm.expectRevert(bytes("invalid amount")); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, minDelegation / 10); - // - // console2.log(staking.getDelegated(address(this), srcValidator)); - // vm.expectRevert(bytes("not enough funds")); - // staking.redelegate{value: relayFee}(dstValidator, srcValidator, bigAmount); - // - // vm.expectRevert(bytes("not enough relay fee")); - // staking.redelegate{value: relayFee / 10}(srcValidator, dstValidator, bigAmount); - // - // vm.expectEmit(true, true, false, true, address(staking)); - // emit redelegateSubmitted(address(this), srcValidator, dstValidator, bigAmount, relayFee - bSCRelayFee); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, bigAmount); - // - // bytes[] memory elements1 = new bytes[](4); - // elements1[0] = address(this).encodeAddress(); - // elements1[1] = srcValidator.encodeAddress(); - // elements1[2] = dstValidator.encodeAddress(); - // elements1[3] = (bigAmount / decimal).encodeUint(); - // ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_REDELEGATE, elements1.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // - // vm.expectRevert(bytes("pending redelegation exist")); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, bigAmount); - // - // skip(8 days); - // vm.expectRevert(bytes("insufficient balance after redelegate")); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, 2 * minDelegation); - // - // vm.expectEmit(true, true, false, true, address(staking)); - // emit redelegateSubmitted(address(this), srcValidator, dstValidator, minDelegation, relayFee - bSCRelayFee); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, minDelegation); - // } - // - // function testHandleRewardSynPackage(uint256 reward) public { - // vm.assume(reward > 0); - // vm.assume(reward <= 1e18); - // - // uint256 sendValue = minDelegation + relayFee; - // address validator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(validator, minDelegation); - // - // bytes[] memory elements = new bytes[](3); - // elements[0] = EVENT_DISTRIBUTE_REWARD.encodeUint(); - // elements[1] = address(this).encodeAddress(); - // elements[2] = reward.encodeUint(); - // - // vm.expectEmit(true, false, false, true, address(staking)); - // emit rewardReceived(address(this), reward); - // vm.startPrank(address(crossChain)); - // staking.handleSynPackage(CROSS_STAKE_CHANNELID, elements.encodeList()); - // vm.stopPrank(); - // assertEq(reward, staking.getDistributedReward(address(this))); - // - // vm.expectEmit(true, false, false, true, address(staking)); - // emit rewardClaimed(address(this), reward); - // staking.claimReward(); - // assertEq(0, staking.getDistributedReward(address(this))); - // } - // - // function testHandleUndelegatedSynPackage(uint16 amount) public { - // vm.assume(amount > 0); - // uint256 sendValue = amount * minDelegation + relayFee; - // address validator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(validator, amount * minDelegation); - // - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = (amount * minDelegation / decimal).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // - // bytes[] memory elements1 = new bytes[](4); - // elements1[0] = EVENT_DISTRIBUTE_UNDELEGATED.encodeUint(); - // elements1[1] = address(this).encodeAddress(); - // elements1[2] = validator.encodeAddress(); - // elements1[3] = (amount * minDelegation).encodeUint(); - // - // vm.expectEmit(true, true, false, true, address(staking)); - // emit undelegatedReceived(address(this), validator, amount * minDelegation); - // vm.startPrank(address(crossChain)); - // staking.handleSynPackage(CROSS_STAKE_CHANNELID, elements1.encodeList()); - // vm.stopPrank(); - // assertEq(amount * minDelegation, staking.getUndelegated(address(this))); - // - // vm.expectEmit(true, false, false, true, address(staking)); - // emit undelegatedClaimed(address(this), amount * minDelegation); - // staking.claimUndelegated(); - // assertEq(0, staking.getUndelegated(address(this))); - // } - // - // function testHandleDelegateAckPackage() public { - // uint16 amount = 5; - // uint256 sendValue = amount * minDelegation + relayFee; - // address validator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(validator, amount * minDelegation); - // - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = (amount * minDelegation / decimal).encodeUint(); - // - // bytes memory ackPack = _genAckPack(uint8(0), uint8(1), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.expectEmit(true, true, false, true, address(staking)); - // emit delegateFailed(address(this), validator, amount * minDelegation, uint8(1)); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // } - // - // function testHandleUndelegateAckPackage(uint16 amount) public { - // vm.assume(amount > 0); - // uint256 sendValue = amount * minDelegation + relayFee; - // address validator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(validator, amount * minDelegation); - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = (amount * minDelegation / decimal).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // staking.undelegate{value: relayFee}(validator, amount * minDelegation); - // - // ackPack = _genAckPack(uint8(0), uint8(1), _RLPEncode(EVENT_UNDELEGATE, elements.encodeList())); - // vm.expectEmit(true, true, false, true, address(staking)); - // emit undelegateFailed(address(this), validator, amount * minDelegation, uint8(1)); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // } - // - // function testHandleRedelegateAckPackage(uint16 amount) public { - // vm.assume(amount > 0); - // uint256 sendValue = amount * minDelegation + relayFee; - // address srcValidator = _getNextUserAddress(); - // address dstValidator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(srcValidator, amount * minDelegation); - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = srcValidator.encodeAddress(); - // elements[2] = (amount * minDelegation / decimal).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, amount * minDelegation); - // - // bytes[] memory elements1 = new bytes[](4); - // elements1[0] = address(this).encodeAddress(); - // elements1[1] = srcValidator.encodeAddress(); - // elements1[2] = dstValidator.encodeAddress(); - // elements1[3] = (amount * minDelegation / decimal).encodeUint(); - // - // ackPack = _genAckPack(uint8(0), uint8(1), _RLPEncode(EVENT_REDELEGATE, elements1.encodeList())); - // vm.expectEmit(true, true, true, true, address(staking)); - // emit redelegateFailed(address(this), srcValidator, dstValidator, amount * minDelegation, uint8(1)); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // } - // - // function testHandleDelegateFailAckPackage(uint16 amount) public { - // vm.assume(amount > 0); - // uint256 sendValue = amount * minDelegation + relayFee; - // address validator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(validator, amount * minDelegation); - // - // uint256 bcAmount = amount * minDelegation / decimal; - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = (bcAmount).encodeUint(); - // - // uint8 eventCode = EVENT_DELEGATE; - // vm.expectEmit(false, false, false, true, address(staking)); - // emit crashResponse(eventCode); - // vm.startPrank(address(crossChain)); - // staking.handleFailAckPackage(CROSS_STAKE_CHANNELID, _RLPEncode(eventCode, elements.encodeList())); - // vm.stopPrank(); - // } - // - // function testHandleUndelegateFailAckPackage(uint16 amount) public { - // vm.assume(amount > 0); - // uint256 sendValue = amount * minDelegation + relayFee; - // address validator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(validator, amount * minDelegation); - // - // uint256 bcAmount = amount * minDelegation / decimal; - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = validator.encodeAddress(); - // elements[2] = (bcAmount).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // staking.undelegate{value: relayFee}(validator, amount * minDelegation); - // - // uint8 eventCode = EVENT_UNDELEGATE; - // vm.expectEmit(false, false, false, true, address(staking)); - // emit crashResponse(eventCode); - // vm.startPrank(address(crossChain)); - // staking.handleFailAckPackage(CROSS_STAKE_CHANNELID, _RLPEncode(eventCode, elements.encodeList())); - // vm.stopPrank(); - // } - // - // function testHandleRedelegateFailAckPackage(uint16 amount) public { - // vm.assume(amount > 0); - // uint256 sendValue = amount * minDelegation + relayFee; - // address srcValidator = _getNextUserAddress(); - // staking.delegate{value: sendValue}(srcValidator, amount * minDelegation); - // - // address dstValidator = _getNextUserAddress(); - // uint256 bcAmount = amount * minDelegation / decimal; - // bytes[] memory elements = new bytes[](3); - // elements[0] = address(this).encodeAddress(); - // elements[1] = srcValidator.encodeAddress(); - // elements[2] = (bcAmount).encodeUint(); - // bytes memory ackPack = _genAckPack(uint8(1), uint8(0), _RLPEncode(EVENT_DELEGATE, elements.encodeList())); - // vm.prank(address(crossChain)); - // staking.handleAckPackage(CROSS_STAKE_CHANNELID, ackPack); - // staking.redelegate{value: relayFee}(srcValidator, dstValidator, amount * minDelegation); - // - // bytes[] memory elements1 = new bytes[](4); - // elements1[0] = address(this).encodeAddress(); - // elements1[1] = srcValidator.encodeAddress(); - // elements1[2] = dstValidator.encodeAddress(); - // elements1[3] = (bcAmount).encodeUint(); - // - // uint8 eventCode = EVENT_REDELEGATE; - // vm.expectEmit(false, false, false, true, address(staking)); - // emit crashResponse(eventCode); - // vm.startPrank(address(crossChain)); - // staking.handleFailAckPackage(CROSS_STAKE_CHANNELID, _RLPEncode(eventCode, elements1.encodeList())); - // vm.stopPrank(); - // } - - function _RLPEncode(uint8 eventType, bytes memory msgBytes) internal pure returns (bytes memory output) { - bytes[] memory elements = new bytes[](2); - elements[0] = eventType.encodeUint(); - elements[1] = msgBytes.encodeBytes(); - output = elements.encodeList(); - } - - function _genAckPack( - uint8 status, - uint8 errCode, - bytes memory paramBytes - ) internal pure returns (bytes memory output) { - bytes[] memory elements = new bytes[](3); - elements[0] = status.encodeUint(); - elements[1] = errCode.encodeUint(); - elements[2] = paramBytes.encodeBytes(); - output = elements.encodeList(); - } -} diff --git a/test/TokenHub.t.sol b/test/TokenHub.t.sol deleted file mode 100644 index e4b82e3f..00000000 --- a/test/TokenHub.t.sol +++ /dev/null @@ -1,1031 +0,0 @@ -pragma solidity ^0.8.10; - -import "./utils/Deployer.sol"; - -import "./utils/test_token/ABCToken.sol"; -import "./utils/test_token/DEFToken.sol"; -import "./utils/test_token/MaliciousToken.sol"; -import "./utils/test_token/MiniToken.sol"; -import "./utils/test_token/XYZToken.sol"; - -contract TokenHubTest is Deployer { - using RLPEncode for *; - using RLPDecode for *; - - uint256 public constant INIT_LOCK_PERIOD = 12 hours; - - event bindFailure(address indexed contractAddr, string bep2Symbol, uint32 failedReason); - event bindSuccess(address indexed contractAddr, string bep2Symbol, uint256 totalSupply, uint256 peggyAmount); - event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee); - event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status); - - ABCToken public abcToken; - DEFToken public defToken; - XYZToken public xyzToken; - MaliciousToken public maliciousToken; - MiniToken public miniToken; - - receive() external payable { } - - function setUp() public { - abcToken = new ABCToken(); - vm.label(address(abcToken), "ABCToken"); - - defToken = new DEFToken(); - vm.label(address(defToken), "DEFToken"); - - xyzToken = new XYZToken(); - vm.label(address(xyzToken), "XYZToken"); - - maliciousToken = new MaliciousToken(); - vm.label(address(maliciousToken), "MaliciousToken"); - - miniToken = new MiniToken(); - vm.label(address(miniToken), "MiniToken"); - } - - function testBindFailed() public { - bytes memory pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - - (, bytes32 symbol, address addr, uint256 totalSupply, uint256 peggyAmount, uint8 decimal,) = - tokenManager.bindPackageRecord(bytes32("ABC-9C7")); - assertEq(symbol, bytes32("ABC-9C7"), "wrong symbol"); - assertEq(addr, address(abcToken), "wrong token address"); - assertEq(totalSupply, 1e8 * 1e18, "wrong total supply"); - assertEq(peggyAmount, 99e6 * 1e18, "wrong peggy amount"); - assertEq(decimal, 18); - - uint256 lockAmount = tokenManager.queryRequiredLockAmountForBind("ABC-9C7"); - assertEq(lockAmount, 1e6 * 1e18, "wrong lock amount"); - - vm.startPrank(relayer); - vm.expectRevert(bytes("only bep20 owner can approve this bind request")); - tokenManager.approveBind(address(abcToken), "ABC-9C7"); - - vm.expectRevert(bytes("contact address doesn't equal to the contract address in bind request")); - tokenManager.approveBind(address(0), "ABC-9C7"); - vm.stopPrank(); - - vm.expectRevert(bytes("allowance is not enough")); - tokenManager.approveBind(address(abcToken), "ABC-9C7"); - - // Bind expired - abcToken.approve(address(tokenManager), 1e6 * 1e18); - vm.warp(block.timestamp + 5); - vm.expectEmit(true, false, false, true, address(tokenManager)); - emit bindFailure(address(abcToken), "ABC-9C7", 1); - tokenManager.approveBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - - pack = buildBindPackage(uint8(0), bytes32("DEF-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - - abcToken.approve(address(tokenManager), 1e6 * 1e18); - vm.expectEmit(true, false, false, true, address(tokenManager)); - emit bindFailure(address(abcToken), "DEF-9C7", 2); - tokenManager.approveBind{ value: 1e16 }(address(abcToken), "DEF-9C7"); - } - - function testRejectAndExpireBind() public { - bytes memory pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - - vm.prank(relayer); - vm.expectRevert(bytes("only bep20 owner can reject")); - tokenManager.rejectBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - - vm.expectEmit(true, false, false, true, address(tokenManager)); - emit bindFailure(address(abcToken), "ABC-9C7", 7); - tokenManager.rejectBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - - pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - - vm.prank(relayer); - vm.expectRevert(bytes("bind request is not expired")); - tokenManager.expireBind{ value: 1e16 }("ABC-9C7"); - - vm.warp(block.timestamp + 5); - vm.expectEmit(true, false, false, true, address(tokenManager)); - emit bindFailure(address(abcToken), "ABC-9C7", 1); - tokenManager.expireBind{ value: 1e16 }("ABC-9C7"); - } - - function testBindMaliciousToken() public { - bytes memory pack = - buildBindPackage(uint8(0), bytes32("MALICIOU-A09"), address(maliciousToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - - maliciousToken.approve(address(tokenManager), 1e8 * 1e18); - tokenManager.approveBind{ value: 1e16 }(address(maliciousToken), "MALICIOU-A09"); - string memory bep2Symbol = tokenHub.getBoundBep2Symbol(address(maliciousToken)); - assertEq(bep2Symbol, "MALICIOU-A09", "wrong bep2 token symbol"); - - address recipient = _getNextUserAddress(); - address refundAddr = _getNextUserAddress(); - uint256 amount = 115e17; - assertEq(maliciousToken.balanceOf(recipient), 0); - pack = buildTransferInPackage(bytes32("MALICIOU-A09"), address(maliciousToken), amount, recipient, refundAddr); - vm.prank(address(crossChain)); - vm.expectRevert(bytes("malicious method")); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - - // refund - bytes[] memory elements = new bytes[](4); - bytes[] memory amt = new bytes[](1); - bytes[] memory addr = new bytes[](1); - amt[0] = amount.encodeUint(); - addr[0] = address(this).encodeAddress(); - elements[0] = address(maliciousToken).encodeAddress(); - elements[1] = amt.encodeList(); - elements[2] = addr.encodeList(); - elements[3] = uint32(1).encodeUint(); - - vm.prank(address(crossChain)); - vm.expectRevert(bytes("malicious method")); - tokenHub.handleAckPackage(TRANSFER_OUT_CHANNELID, elements.encodeList()); - } - - function testBindAndTransferIn() public { - // Bind - bytes memory pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - abcToken.approve(address(tokenManager), 1e6 * 1e18); - tokenManager.approveBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - - assertEq(tokenHub.getBoundBep2Symbol(address(abcToken)), "ABC-9C7", "wrong bep2 symbol"); - assertEq(tokenHub.getBoundContract("ABC-9C7"), address(abcToken), "wrong token contract address"); - assertEq(address(tokenManager).balance, 0, "tokenManager balance should be 0"); - - // Expired transferIn - address recipient = _getNextUserAddress(); - address refundAddr = _getNextUserAddress(); - assertEq(abcToken.balanceOf(recipient), 0); - pack = buildTransferInPackage(bytes32("ABC-9C7"), address(abcToken), 115e17, recipient, refundAddr); - - vm.warp(block.timestamp + 5); - vm.prank(address(crossChain)); - bytes memory payload = tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - RLPDecode.Iterator memory iter = payload.toRLPItem().iterator(); - bool success; - uint256 idx; - bytes32 bep2TokenSymbol; - uint256 refAmount; - address refAddr; - uint32 status; - while (iter.hasNext()) { - if (idx == 0) { - bep2TokenSymbol = bytes32(iter.next().toUint()); - assertEq(bep2TokenSymbol, bytes32("ABC-9C7"), "wrong token symbol in refund package"); - } else if (idx == 1) { - refAmount = iter.next().toUint(); - assertEq(refAmount, 115e7, "wrong amount in refund package"); - } else if (idx == 2) { - refAddr = iter.next().toAddress(); - assertEq(refAddr, refundAddr, "wrong refund address in refund package"); - } else if (idx == 3) { - status = uint32(iter.next().toUint()); - assertEq(status, uint32(0x01), "wrong status code in refund package"); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode refund package failed"); - - // TransferIn succeed - recipient = _getNextUserAddress(); - refundAddr = _getNextUserAddress(); - assertEq(abcToken.balanceOf(recipient), 0); - pack = buildTransferInPackage(bytes32("ABC-9C7"), address(abcToken), 115e17, recipient, refundAddr); - vm.prank(address(crossChain)); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - assertEq(abcToken.balanceOf(recipient), 115e17, "wrong balance"); - - // BNB transferIn - recipient = _getNextUserAddress(); - refundAddr = _getNextUserAddress(); - pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 1e18, recipient, refundAddr); - uint256 balance = recipient.balance; - vm.prank(address(crossChain)); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - assertEq(recipient.balance - balance, 1e18, "wrong balance"); - - // TODO try a large relayer fee - - // BNB transferIn to a non-payable address - recipient = address(lightClient); - refundAddr = _getNextUserAddress(); - pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 1e18, recipient, refundAddr); - balance = recipient.balance; - vm.prank(address(crossChain)); - payload = tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - assertEq(recipient.balance, balance); - iter = payload.toRLPItem().iterator(); - success = false; - idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - bep2TokenSymbol = bytes32(iter.next().toUint()); - assertEq(bep2TokenSymbol, bytes32("BNB"), "wrong token symbol in refund package"); - } else if (idx == 1) { - refAmount = iter.next().toUint(); - assertEq(refAmount, 1e8, "wrong amount in refund package"); - } else if (idx == 2) { - refAddr = iter.next().toAddress(); - assertEq(refAddr, refundAddr, "wrong refund address in refund package"); - } else if (idx == 3) { - status = uint32(iter.next().toUint()); - assertEq(status, uint32(0x04), "wrong status code in refund package"); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode refund package failed"); - } - - function testLargeTransferIn() public { - // Bind - bytes memory pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - abcToken.approve(address(tokenManager), 1e6 * 1e18); - tokenManager.approveBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - - assertEq(tokenHub.getBoundBep2Symbol(address(abcToken)), "ABC-9C7", "wrong bep2 symbol"); - assertEq(tokenHub.getBoundContract("ABC-9C7"), address(abcToken), "wrong token contract address"); - assertEq(address(tokenManager).balance, 0, "tokenManager balance should be 0"); - - // Expired transferIn - address recipient = _getNextUserAddress(); - address refundAddr = _getNextUserAddress(); - assertEq(abcToken.balanceOf(recipient), 0); - pack = buildTransferInPackage(bytes32("ABC-9C7"), address(abcToken), 115e17, recipient, refundAddr); - - vm.warp(block.timestamp + 5); - vm.prank(address(crossChain)); - bytes memory payload = tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - RLPDecode.Iterator memory iter = payload.toRLPItem().iterator(); - bool success; - uint256 idx; - bytes32 bep2TokenSymbol; - uint256 refAmount; - address refAddr; - uint32 status; - while (iter.hasNext()) { - if (idx == 0) { - bep2TokenSymbol = bytes32(iter.next().toUint()); - assertEq(bep2TokenSymbol, bytes32("ABC-9C7"), "wrong token symbol in refund package"); - } else if (idx == 1) { - refAmount = iter.next().toUint(); - assertEq(refAmount, 115e7, "wrong amount in refund package"); - } else if (idx == 2) { - refAddr = iter.next().toAddress(); - assertEq(refAddr, refundAddr, "wrong refund address in refund package"); - } else if (idx == 3) { - status = uint32(iter.next().toUint()); - assertEq(status, uint32(0x01), "wrong status code in refund package"); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode refund package failed"); - - // TransferIn succeed - recipient = _getNextUserAddress(); - refundAddr = _getNextUserAddress(); - assertEq(abcToken.balanceOf(recipient), 0); - pack = buildTransferInPackage(bytes32("ABC-9C7"), address(abcToken), 115e17, recipient, refundAddr); - vm.prank(address(crossChain)); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - assertEq(abcToken.balanceOf(recipient), 115e17, "wrong balance"); - - // BNB transferIn without lock - address _recipient = _getNextUserAddress(); - address _refundAddr = _getNextUserAddress(); - bytes memory _pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 9999 * 1e18, _recipient, _refundAddr); - uint256 balance = _recipient.balance; - vm.prank(address(crossChain)); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, _pack); - assertEq(_recipient.balance - balance, 9999 * 1e18, "wrong balance"); - - // BNB transferIn with lock - _recipient = _getNextUserAddress(); - _refundAddr = _getNextUserAddress(); - _pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 10000 * 1e18, _recipient, _refundAddr); - balance = _recipient.balance; - vm.prank(address(crossChain)); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, _pack); - // while BNB amount >= 10000 ether, locking fixed hours - assertEq(_recipient.balance - balance, 0, "wrong balance"); - (uint256 amount, uint256 unlockAt) = tokenHub.lockInfoMap(address(0), _recipient); - assertEq(amount, 10000 * 1e18, "wrong locked amount"); - assertEq(unlockAt, block.timestamp + INIT_LOCK_PERIOD, "wrong unlockAt"); - - // withdraw unlocked BNB - vm.warp(block.timestamp + INIT_LOCK_PERIOD); - tokenHub.withdrawUnlockedToken(address(0), _recipient); - assertEq(_recipient.balance - balance, 10000 * 1e18, "wrong balance"); - - // BNB transferIn to a non-payable address - _recipient = address(lightClient); - _refundAddr = _getNextUserAddress(); - _pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 1e18, _recipient, _refundAddr); - balance = _recipient.balance; - vm.prank(address(crossChain)); - bytes memory _payload = tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, _pack); - assertEq(_recipient.balance, balance); - iter = _payload.toRLPItem().iterator(); - success = false; - idx = 0; - while (iter.hasNext()) { - if (idx == 0) { - bep2TokenSymbol = bytes32(iter.next().toUint()); - assertEq(bep2TokenSymbol, bytes32("BNB"), "wrong token symbol in refund package"); - } else if (idx == 1) { - refAmount = iter.next().toUint(); - assertEq(refAmount, 1e8, "wrong amount in refund package"); - } else if (idx == 2) { - refAddr = iter.next().toAddress(); - assertEq(refAddr, _refundAddr, "wrong refund address in refund package"); - } else if (idx == 3) { - status = uint32(iter.next().toUint()); - assertEq(status, uint32(0x04), "wrong status code in refund package"); - success = true; - } else { - break; - } - ++idx; - } - require(success, "rlp decode refund package failed"); - } - - function testSuspend() public { - address[] memory _validators = bscValidatorSet.getValidators(); - vm.prank(_validators[0]); - crossChain.suspend(); - assert(crossChain.isSuspended()); - - vm.prank(_validators[0]); - vm.expectRevert(bytes("suspended")); - crossChain.suspend(); - - // // BNB transferIn with lock - // address _recipient = _getNextUserAddress(); - // address _refundAddr = _getNextUserAddress(); - // bytes memory _pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 10000 * 1e18, _recipient, _refundAddr); - // uint256 balance = _recipient.balance; - // uint256 amount; - // uint256 unlockAt; - - address relayer = 0x446AA6E0DC65690403dF3F127750da1322941F3e; - uint64 height = crossChain.channelSyncedHeaderMap(TRANSFER_IN_CHANNELID); - uint64 seq = crossChain.channelReceiveSequenceMap(TRANSFER_IN_CHANNELID); - vm.startPrank(relayer, relayer); - vm.expectRevert(bytes("suspended")); - crossChain.handlePackage("", "", height, seq, TRANSFER_IN_CHANNELID); - vm.stopPrank(); - - vm.prank(_validators[0]); - crossChain.reopen(); - assert(crossChain.isSuspended()); - vm.prank(_validators[1]); - crossChain.reopen(); - assert(!crossChain.isSuspended()); - vm.prank(relayer, relayer); - vm.expectRevert(bytes("invalid merkle proof")); - crossChain.handlePackage("", "", height, seq, TRANSFER_IN_CHANNELID); - } - - function testCancelTransfer() public { - // BNB transferIn with lock - address _recipient = _getNextUserAddress(); - address _refundAddr = _getNextUserAddress(); - bytes memory _pack = buildTransferInPackage(bytes32("BNB"), address(0x0), 10000 * 1e18, _recipient, _refundAddr); - uint256 balance = _recipient.balance; - uint256 amount; - uint256 unlockAt; - - vm.prank(address(crossChain)); - tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, _pack); - - // while BNB amount >= 10000 ether, locking fixed hours - assertEq(_recipient.balance - balance, 0, "wrong balance"); - (amount, unlockAt) = tokenHub.lockInfoMap(address(0), _recipient); - assertEq(amount, 10000 * 1e18, "wrong locked amount"); - assertEq(unlockAt, block.timestamp + INIT_LOCK_PERIOD, "wrong unlockAt"); - - // cancelTransferIn by validators - address[] memory _validators = bscValidatorSet.getValidators(); - vm.prank(_validators[0]); - crossChain.cancelTransfer(address(0), _recipient); - (amount, unlockAt) = tokenHub.lockInfoMap(address(0), _recipient); - assertEq(amount, 10000 * 1e18, "wrong locked amount"); - assertEq(unlockAt, block.timestamp + INIT_LOCK_PERIOD, "wrong unlockAt"); - - vm.prank(_validators[1]); - crossChain.cancelTransfer(address(0), _recipient); - (amount, unlockAt) = tokenHub.lockInfoMap(address(0), _recipient); - assertEq(amount, 0, "wrong locked amount after cancelTransfer"); - } - - // function testTransferOut() public { - // bytes memory pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - // vm.prank(address(crossChain)); - // tokenManager.handleSynPackage(BIND_CHANNELID, pack); - // - // abcToken.approve(address(tokenManager), 1e8 * 1e18); - // tokenManager.approveBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - // - // uint64 expireTime = uint64(block.timestamp + 150); - // address recipient = 0xd719dDfA57bb1489A08DF33BDE4D5BA0A9998C60; - // uint256 amount = 1e8; - // uint256 relayerFee = 1e14; - // - // vm.expectRevert(bytes("received BNB amount should be no less than the minimum relayFee")); - // tokenHub.transferOut{ value: relayerFee }(address(abcToken), recipient, amount, expireTime); - // - // relayerFee = 1e16; - // vm.expectRevert(bytes("invalid transfer amount: precision loss in amount conversion")); - // tokenHub.transferOut{ value: relayerFee }(address(abcToken), recipient, amount, expireTime); - // - // amount = 1e18; - // vm.expectRevert(bytes("invalid received BNB amount: precision loss in amount conversion")); - // tokenHub.transferOut{ value: relayerFee + 1 }(address(abcToken), recipient, amount, expireTime); - // - // vm.expectRevert(bytes("BEP20: transfer amount exceeds allowance")); - // tokenHub.transferOut{ value: relayerFee }(address(abcToken), recipient, amount, expireTime); - // - // vm.expectRevert(bytes("the contract has not been bound to any bep2 token")); - // tokenHub.transferOut{ value: relayerFee }(address(defToken), recipient, amount, expireTime); - // - // vm.expectRevert(bytes("received BNB amount should be no less than the minimum relayFee")); - // tokenHub.transferOut(address(abcToken), recipient, amount, expireTime); - // - // uint256 balance = abcToken.balanceOf(address(this)); - // abcToken.approve(address(tokenHub), amount); - // vm.expectEmit(true, false, false, true, address(tokenHub)); - // emit transferOutSuccess(address(abcToken), address(this), amount, relayerFee); - // tokenHub.transferOut{ value: relayerFee }(address(abcToken), recipient, amount, expireTime); - // assertEq(abcToken.balanceOf(address(this)), balance - amount, "wrong balance"); - // - // // refund - // uint256[] memory amounts = new uint256[](1); - // address[] memory refundAddrs = new address[](1); - // amounts[0] = amount; - // refundAddrs[0] = address(this); - // bytes memory package = buildRefundPackage(address(abcToken), amounts, refundAddrs, uint32(1)); - // - // vm.prank(address(crossChain)); - // vm.expectEmit(true, false, false, true, address(tokenHub)); - // emit refundSuccess(address(abcToken), address(this), amount, 1); - // tokenHub.handleAckPackage(TRANSFER_OUT_CHANNELID, package); - // assertEq(abcToken.balanceOf(address(this)), balance, "wrong balance"); - // - // // Fail ack refund - // uint256 length = 5; - // uint256[] memory balances = new uint256[](length); - // address[] memory recipients = new address[](length); - // amounts = new uint256[](length); - // refundAddrs = new address[](length); - // for (uint256 i; i < length; ++i) { - // amounts[i] = (i + 1) * 1e6; - // recipient = _getNextUserAddress(); - // balances[i] = abcToken.balanceOf(recipient); - // recipients[i] = recipient; - // refundAddrs[i] = recipient; - // } - // - // package = - // buildBatchTransferOutFailAckPackage(bytes32("ABC-9C7"), address(abcToken), amounts, recipients, refundAddrs); - // vm.prank(address(crossChain)); - // tokenHub.handleFailAckPackage(TRANSFER_OUT_CHANNELID, package); - // for (uint256 i; i < length; ++i) { - // assertEq(abcToken.balanceOf(recipients[i]) - balances[i], amounts[i] * 1e10, "wrong balance"); - // } - // } - - function testBatchTransferOutBNB() public { - uint64 expireTime = uint64(block.timestamp + 150); - address[] memory recipients = new address[](2); - address[] memory refundAddrs = new address[](2); - uint256[] memory amounts = new uint256[](2); - address recipient = _getNextUserAddress(); - for (uint256 i; i < 2; ++i) { - recipients[i] = recipient; - refundAddrs[i] = _getNextUserAddress(); - amounts[i] = 5e9; - } - - vm.expectRevert(bytes("invalid transfer amount: precision loss in amount conversion")); - tokenHub.batchTransferOutBNB{ value: 5e16 }(recipients, amounts, refundAddrs, expireTime); - - amounts[0] = 1e16; - amounts[1] = 2e16; - vm.expectEmit(true, false, false, true, address(tokenHub)); - emit transferOutSuccess(address(0x0), address(this), 3e16, 2e16); - tokenHub.batchTransferOutBNB{ value: 5e16 }(recipients, amounts, refundAddrs, expireTime); - } - - // function testOverflow() public { - // uint64 expireTime = uint64(block.timestamp + 150); - // address recipient = 0xd719dDfA57bb1489A08DF33BDE4D5BA0A9998C60; - // uint256 amount = 115792089237316195423570985008687907853269984665640564039457584007903129639936; - // uint256 relayerFee = 1e16; - // - // vm.expectRevert(bytes("SafeMath: addition overflow")); - // tokenHub.transferOut{ value: relayerFee }(address(0), recipient, amount, expireTime); - // - // // batch transfer out - // address[] memory recipients = new address[](2); - // address[] memory refundAddrs = new address[](2); - // uint256[] memory amounts = new uint256[](2); - // recipient = _getNextUserAddress(); - // for (uint256 i; i < 2; ++i) { - // recipients[i] = recipient; - // refundAddrs[i] = _getNextUserAddress(); - // } - // amounts[0] = 100000000000000000000000000000000000000000000000000000000000000000000000000000; - // amounts[1] = 15792089237316195423570985008687907853269984665640564039457584007910000000000; - // - // vm.expectRevert(bytes("SafeMath: addition overflow")); - // tokenHub.batchTransferOutBNB{ value: 2e16 }(recipients, amounts, refundAddrs, expireTime); - // } - - // function testUnbind() public { - // // Bind first - // bytes memory pack = buildBindPackage(uint8(0), bytes32("ABC-9C7"), address(abcToken), 1e8, 99e6, uint8(18)); - // vm.prank(address(crossChain)); - // tokenManager.handleSynPackage(BIND_CHANNELID, pack); - // - // abcToken.approve(address(tokenManager), 1e8 * 1e18); - // tokenManager.approveBind{ value: 1e16 }(address(abcToken), "ABC-9C7"); - // - // // Unbind - // pack = buildBindPackage(uint8(1), bytes32("ABC-9C7"), address(abcToken), 0, 0, uint8(0)); - // vm.prank(address(crossChain)); - // tokenManager.handleSynPackage(BIND_CHANNELID, pack); - // - // assertEq(tokenHub.getBoundBep2Symbol(address(abcToken)), "", "wrong symbol"); - // assertEq(tokenHub.getBoundContract("ABC-9C7"), address(0x0), "wrong token contract address"); - // - // // TransferIn failed - // address recipient = _getNextUserAddress(); - // address refundAddr = _getNextUserAddress(); - // assertEq(abcToken.balanceOf(recipient), 0); - // pack = buildTransferInPackage(bytes32("ABC-9C7"), address(abcToken), 115e17, recipient, refundAddr); - // vm.prank(address(crossChain)); - // tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - // assertEq(abcToken.balanceOf(recipient), 0, "wrong balance"); - // - // // TransferOut refund - // recipient = _getNextUserAddress(); - // uint256 amount = 1e18; - // uint256[] memory amounts = new uint256[](1); - // address[] memory refundAddrs = new address[](1); - // amounts[0] = amount; - // refundAddrs[0] = recipient; - // bytes memory package = buildRefundPackage(address(abcToken), amounts, refundAddrs, uint32(1)); - // abcToken.transfer(address(tokenHub), amount); - // - // vm.prank(address(crossChain)); - // vm.expectEmit(true, false, false, true, address(tokenHub)); - // emit refundSuccess(address(abcToken), recipient, amount, 1); - // tokenHub.handleAckPackage(TRANSFER_OUT_CHANNELID, package); - // assertEq(abcToken.balanceOf(recipient), amount, "wrong balance"); - // - // // TransferOut failed - // uint64 expireTime = uint64(block.timestamp + 150); - // uint256 relayerFee = 1e14; - // recipient = 0xd719dDfA57bb1489A08DF33BDE4D5BA0A9998C60; - // amount = 1e8; - // - // abcToken.approve(address(tokenHub), amount); - // vm.expectRevert(bytes("the contract has not been bound to any bep2 token")); - // tokenHub.transferOut{ value: relayerFee }(address(abcToken), recipient, amount, expireTime); - // } - - // function testMiniToken() public { - // // Bind - // bytes memory pack = buildBindPackage(uint8(0), bytes32("XYZ-9C7M"), address(miniToken), 1e4, 5e3, uint8(18)); - // vm.prank(address(crossChain)); - // tokenManager.handleSynPackage(BIND_CHANNELID, pack); - // - // miniToken.approve(address(tokenManager), 5e3 * 1e18); - // vm.expectEmit(true, false, false, true, address(tokenManager)); - // emit bindSuccess(address(miniToken), "XYZ-9C7M", 1e4 * 1e18, 5e3 * 1e18); - // tokenManager.approveBind{ value: 1e16 }(address(miniToken), "XYZ-9C7M"); - // - // assertEq(tokenHub.getBoundBep2Symbol(address(miniToken)), "XYZ-9C7M", "wrong bep2 symbol"); - // assertEq(tokenHub.getBoundContract("XYZ-9C7M"), address(miniToken), "wrong token contract address"); - // - // // TransferIn - // address recipient = _getNextUserAddress(); - // address refundAddr = _getNextUserAddress(); - // assertEq(miniToken.balanceOf(recipient), 0); - // pack = buildTransferInPackage(bytes32("XYZ-9C7M"), address(miniToken), 1e18, recipient, refundAddr); - // vm.prank(address(crossChain)); - // tokenHub.handleSynPackage(TRANSFER_IN_CHANNELID, pack); - // assertEq(miniToken.balanceOf(recipient), 1e18, "wrong balance"); - // - // // TransferOut - // uint64 expireTime = uint64(block.timestamp + 150); - // uint256 amount = 1e18; - // uint256 relayerFee = 1e16; - // recipient = _getNextUserAddress(); - // - // miniToken.approve(address(tokenHub), amount); - // vm.expectEmit(true, false, false, true, address(tokenHub)); - // emit transferOutSuccess(address(miniToken), address(this), 1e18, 1e16); - // tokenHub.transferOut{ value: relayerFee }(address(miniToken), recipient, amount, expireTime); - // - // // TransferOut failed - // amount = 5e17; - // recipient = _getNextUserAddress(); - // - // miniToken.approve(address(tokenHub), amount); - // vm.expectRevert(bytes("For miniToken, the transfer amount must not be less than 1")); - // tokenHub.transferOut{ value: relayerFee }(address(miniToken), recipient, amount, expireTime); - // } - - function testMirrorFailed() public { - uint256 mirrorFee = 1e20; - uint256 syncFee = 1e19; - - bytes memory key = "mirrorFee"; - bytes memory valueBytes = abi.encodePacked(mirrorFee); - _updateParamByGovHub(key, valueBytes, address(tokenManager)); - assertEq(tokenManager.mirrorFee(), mirrorFee, "wrong mirrorFee"); - - key = "syncFee"; - valueBytes = abi.encodePacked(syncFee); - _updateParamByGovHub(key, valueBytes, address(tokenManager)); - assertEq(tokenManager.syncFee(), syncFee, "wrong syncFee"); - - // Bind miniToken - bytes memory pack = buildBindPackage(uint8(0), bytes32("XYZ-9C7M"), address(miniToken), 1e4, 5e3, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - miniToken.approve(address(tokenManager), 5e3 * 1e18); - tokenManager.approveBind{ value: 1e16 }(address(miniToken), "XYZ-9C7M"); - - // Mirror failed - uint64 expireTime = uint64(block.timestamp + 300); - uint256 miniRelayerFee = tokenHub.getMiniRelayFee(); - vm.expectRevert(bytes("already bound")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(miniToken), expireTime); - - expireTime = uint64(block.timestamp + 100); - vm.expectRevert(bytes("expireTime must be two minutes later and one day earlier")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setName(""); - expireTime = uint64(block.timestamp + 300); - vm.expectRevert(bytes("name length must be in [1,32]")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setName("XYZ TokenXYZ TokenXYZ TokenXYZ Token"); - vm.expectRevert(bytes("name length must be in [1,32]")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setName("XYZ Token"); - xyzToken.setSymbol("X"); - vm.expectRevert(bytes("symbol length must be in [2,8]")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setSymbol("XYZXYZXYZ"); - vm.expectRevert(bytes("symbol length must be in [2,8]")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setSymbol("X-Z"); - vm.expectRevert(bytes("symbol should only contain alphabet and number")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setSymbol("X_Z"); - vm.expectRevert(bytes("symbol should only contain alphabet and number")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setSymbol("XYZ"); - xyzToken.setDecimals(1); - vm.expectRevert(bytes("too large total supply")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setDecimals(87); - vm.expectRevert(bytes("too large decimals")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setDecimals(18); - xyzToken.setTotalSupply(1e18 * 1e18); - vm.expectRevert(bytes("too large total supply")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - vm.expectRevert(bytes("msg.value must be N * 1e10 and greater than sum of miniRelayFee and mirrorFee")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee + 1e9 }(address(xyzToken), expireTime); - - vm.expectRevert(bytes("msg.value must be N * 1e10 and greater than sum of miniRelayFee and mirrorFee")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee - 1e9 }(address(xyzToken), expireTime); - - xyzToken.setTotalSupply(1e8 * 1e18); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - assertEq(address(tokenManager).balance, mirrorFee, "wrong balance in tokenManager"); - vm.expectRevert(bytes("mirror pending")); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - // Mirror fail ack - pack = buildMirrorFailAckPackage( - address(this), - address(xyzToken), - bytes32("XYZ Token"), - uint8(18), - bytes32("XYZ"), - 1e8 * 1e18, - mirrorFee / 1e10, - expireTime - ); - vm.prank(address(crossChain)); - tokenManager.handleFailAckPackage(MIRROR_CHANNELID, pack); - assertEq(address(tokenManager).balance, 0, "wrong balance in tokenManager"); - - // Mirror ack - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - assertEq(address(tokenManager).balance, mirrorFee, "wrong balance in tokenManager"); - pack = buildMirrorAckPackage(address(this), address(xyzToken), uint8(18), bytes32(""), mirrorFee, uint8(1)); - vm.prank(address(crossChain)); - tokenManager.handleAckPackage(MIRROR_CHANNELID, pack); - assertEq(address(tokenManager).balance, 0, "wrong balance in tokenManager"); - } - - function testMirrorAndSncSucceed() public { - uint256 mirrorFee = 1e20; - uint256 syncFee = 1e19; - - bytes memory key = "mirrorFee"; - bytes memory valueBytes = abi.encodePacked(mirrorFee); - _updateParamByGovHub(key, valueBytes, address(tokenManager)); - assertEq(tokenManager.mirrorFee(), mirrorFee, "wrong mirrorFee"); - - key = "syncFee"; - valueBytes = abi.encodePacked(syncFee); - _updateParamByGovHub(key, valueBytes, address(tokenManager)); - assertEq(tokenManager.syncFee(), syncFee, "wrong syncFee"); - - uint64 expireTime = uint64(block.timestamp + 150); - uint256 miniRelayerFee = tokenHub.getMiniRelayFee(); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - assertEq(address(tokenManager).balance, mirrorFee, "wrong balance in tokenManager"); - - bytes memory pack = - buildMirrorAckPackage(address(this), address(xyzToken), uint8(18), bytes32("XYZ-123"), mirrorFee, uint8(0)); - vm.prank(address(crossChain)); - tokenManager.handleAckPackage(MIRROR_CHANNELID, pack); - assertEq(address(tokenManager).balance, 0, "wrong balance in tokenManager"); - assertEq(tokenHub.getBoundBep2Symbol(address(xyzToken)), "XYZ-123", "wrong bep2 symbol"); - - xyzToken.mint(1e8 * 1e18); - uint256 totalSupply = xyzToken.totalSupply(); - - // sync - tokenManager.sync{ value: miniRelayerFee + syncFee }(address(xyzToken), expireTime); - assertEq(address(tokenManager).balance, syncFee, "wrong balance in tokenManager"); - - // sync fail ack - pack = buildSyncFailAckPackage( - address(this), address(xyzToken), bytes32("XYZ"), totalSupply, syncFee / 1e10, expireTime - ); - vm.prank(address(crossChain)); - tokenManager.handleFailAckPackage(SYNC_CHANNELID, pack); - assertEq(address(tokenManager).balance, 0, "wrong balance in tokenManager"); - - // sync success - tokenManager.sync{ value: miniRelayerFee + syncFee }(address(xyzToken), expireTime); - assertEq(address(tokenManager).balance, syncFee, "wrong balance in tokenManager"); - pack = buildSyncAckPackage(address(this), address(xyzToken), syncFee, uint8(0)); - vm.prank(address(crossChain)); - tokenManager.handleAckPackage(SYNC_CHANNELID, pack); - assertEq(address(tokenManager).balance, 0, "wrong balance in tokenManager"); - } - - function testSyncFailed() public { - uint256 mirrorFee = 1e20; - uint256 syncFee = 1e19; - - bytes memory key = "mirrorFee"; - bytes memory valueBytes = abi.encodePacked(mirrorFee); - _updateParamByGovHub(key, valueBytes, address(tokenManager)); - assertEq(tokenManager.mirrorFee(), mirrorFee, "wrong mirrorFee"); - - key = "syncFee"; - valueBytes = abi.encodePacked(syncFee); - _updateParamByGovHub(key, valueBytes, address(tokenManager)); - assertEq(tokenManager.syncFee(), syncFee, "wrong syncFee"); - - // Bond mini token - bytes memory pack = buildBindPackage(uint8(0), bytes32("XYZ-9C7M"), address(miniToken), 1e4, 5e3, uint8(18)); - vm.prank(address(crossChain)); - tokenManager.handleSynPackage(BIND_CHANNELID, pack); - miniToken.approve(address(tokenManager), 5e3 * 1e18); - tokenManager.approveBind{ value: 1e16 }(address(miniToken), "XYZ-9C7M"); - - // Mirror xyz - uint64 expireTime = uint64(block.timestamp + 300); - uint256 miniRelayerFee = tokenHub.getMiniRelayFee(); - tokenManager.mirror{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - pack = - buildMirrorAckPackage(address(this), address(xyzToken), uint8(18), bytes32("XYZ-123"), mirrorFee, uint8(0)); - vm.prank(address(crossChain)); - tokenManager.handleAckPackage(MIRROR_CHANNELID, pack); - - // Sync failed - vm.expectRevert(bytes("not bound")); - tokenManager.sync{ value: miniRelayerFee + mirrorFee }(address(defToken), expireTime); - - vm.expectRevert(bytes("not bound by mirror")); - tokenManager.sync{ value: miniRelayerFee + mirrorFee }(address(miniToken), expireTime); - - expireTime = uint64(block.timestamp + 100); - vm.expectRevert(bytes("expireTime must be two minutes later and one day earlier")); - tokenManager.sync{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - expireTime = uint64(block.timestamp + 300); - xyzToken.setTotalSupply(1e18 * 1e18); - vm.expectRevert(bytes("too large total supply")); - tokenManager.sync{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - - xyzToken.setTotalSupply(1e8 * 1e18); - tokenManager.sync{ value: miniRelayerFee + mirrorFee }(address(xyzToken), expireTime); - } - - function buildBindPackage( - uint8 bindType, - bytes32 symbol, - address addr, - uint256 totalSupply, - uint256 peggyAmount, - uint8 decimal - ) internal view returns (bytes memory) { - uint256 timestamp = block.timestamp; - uint256 expireTime = timestamp + 3; - bytes[] memory elements = new bytes[](7); - elements[0] = bindType.encodeUint(); - elements[1] = abi.encodePacked(symbol).encodeBytes(); - elements[2] = addr.encodeAddress(); - elements[3] = (totalSupply * (10 ** decimal)).encodeUint(); - elements[4] = (peggyAmount * (10 ** decimal)).encodeUint(); - elements[5] = decimal.encodeUint(); - elements[6] = expireTime.encodeUint(); - return elements.encodeList(); - } - - function buildTransferInPackage( - bytes32 symbol, - address tokenAddr, - uint256 amount, - address recipient, - address refundAddr - ) internal view returns (bytes memory) { - uint256 timestamp = block.timestamp; - uint256 expireTime = timestamp + 3; - bytes[] memory elements = new bytes[](6); - elements[0] = abi.encodePacked(symbol).encodeBytes(); - elements[1] = tokenAddr.encodeAddress(); - elements[2] = amount.encodeUint(); - elements[3] = recipient.encodeAddress(); - elements[4] = refundAddr.encodeAddress(); - elements[5] = expireTime.encodeUint(); - return elements.encodeList(); - } - - function buildBatchTransferOutFailAckPackage( - bytes32 symbol, - address tokenAddr, - uint256[] memory amounts, - address[] memory recipients, - address[] memory refundAddrs - ) internal view returns (bytes memory) { - uint256 length = amounts.length; - bytes[] memory amtBytes = new bytes[](length); - bytes[] memory recipientBytes = new bytes[](length); - bytes[] memory refundAddrBytes = new bytes[](length); - for (uint256 i; i < length; ++i) { - amtBytes[i] = amounts[i].encodeUint(); - recipientBytes[i] = recipients[i].encodeAddress(); - refundAddrBytes[i] = refundAddrs[i].encodeAddress(); - } - - uint256 timestamp = block.timestamp; - uint256 expireTime = timestamp + 150; - bytes[] memory elements = new bytes[](6); - elements[0] = abi.encodePacked(symbol).encodeBytes(); - elements[1] = tokenAddr.encodeAddress(); - elements[2] = amtBytes.encodeList(); - elements[3] = recipientBytes.encodeList(); - elements[4] = refundAddrBytes.encodeList(); - elements[5] = expireTime.encodeUint(); - return elements.encodeList(); - } - - function buildRefundPackage( - address tokenAddr, - uint256[] memory amounts, - address[] memory recipients, - uint32 status - ) internal pure returns (bytes memory) { - uint256 length = amounts.length; - bytes[] memory amtBytes = new bytes[](length); - bytes[] memory recipientBytes = new bytes[](length); - for (uint256 i; i < length; ++i) { - amtBytes[i] = amounts[i].encodeUint(); - recipientBytes[i] = recipients[i].encodeAddress(); - } - - bytes[] memory elements = new bytes[](4); - elements[0] = tokenAddr.encodeAddress(); - elements[1] = amtBytes.encodeList(); - elements[2] = recipientBytes.encodeList(); - elements[3] = status.encodeUint(); - return elements.encodeList(); - } - - function buildMirrorAckPackage( - address sender, - address tokenAddr, - uint8 decimal, - bytes32 symbol, - uint256 mirrorFee, - uint8 errCode - ) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](6); - elements[0] = sender.encodeAddress(); - elements[1] = tokenAddr.encodeAddress(); - elements[2] = decimal.encodeUint(); - elements[3] = abi.encodePacked(symbol).encodeBytes(); - elements[4] = mirrorFee.encodeUint(); - elements[5] = errCode.encodeUint(); - return elements.encodeList(); - } - - function buildMirrorFailAckPackage( - address sender, - address tokenAddr, - bytes32 name, - uint8 decimal, - bytes32 symbol, - uint256 supply, - uint256 mirrorFee, - uint256 expireTime - ) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](8); - elements[0] = sender.encodeAddress(); - elements[1] = tokenAddr.encodeAddress(); - elements[2] = abi.encodePacked(name).encodeBytes(); - elements[3] = abi.encodePacked(symbol).encodeBytes(); - elements[4] = supply.encodeUint(); - elements[5] = decimal.encodeUint(); - elements[6] = mirrorFee.encodeUint(); - elements[7] = expireTime.encodeUint(); - return elements.encodeList(); - } - - function buildSyncAckPackage( - address sender, - address tokenAddr, - uint256 syncFee, - uint8 errCode - ) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](6); - elements[0] = sender.encodeAddress(); - elements[1] = tokenAddr.encodeAddress(); - elements[2] = syncFee.encodeUint(); - elements[3] = errCode.encodeUint(); - return elements.encodeList(); - } - - function buildSyncFailAckPackage( - address sender, - address tokenAddr, - bytes32 symbol, - uint256 supply, - uint256 syncFee, - uint256 expireTime - ) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](6); - elements[0] = sender.encodeAddress(); - elements[1] = tokenAddr.encodeAddress(); - elements[2] = abi.encodePacked(symbol).encodeBytes(); - elements[3] = supply.encodeUint(); - elements[4] = syncFee.encodeUint(); - elements[5] = expireTime.encodeUint(); - return elements.encodeList(); - } -} diff --git a/test/ValidatorSet.t.sol b/test/ValidatorSet.t.sol index c6d3c3c9..7ea42739 100644 --- a/test/ValidatorSet.t.sol +++ b/test/ValidatorSet.t.sol @@ -56,15 +56,6 @@ contract ValidatorSetTest is Deployer { // set gas price to zero to send system slash tx vm.txGasPrice(0); vm.mockCall(address(0x66), "", hex"01"); - - // close staking channel - // remove this after final sunset hard fork - if (crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)) { - key = "enableOrDisableChannel"; - valueBytes = bytes(hex"0800"); - _updateParamByGovHub(key, valueBytes, address(crossChain)); - assertTrue(!crossChain.registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)); - } } function testDeposit(uint256 amount) public { From 7709ada066b6d5baae3000c6e769106360e020b1 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 4 Sep 2024 17:03:36 +0800 Subject: [PATCH 27/52] feat: remove lint ci check --- .github/workflows/unit-test.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index d40fb6b1..2f2734bc 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -37,10 +37,6 @@ jobs: forge install --no-git --no-commit foundry-rs/forge-std@v1.7.3 forge --version - - name: Lint Check - run: | - npm run lint:check - - name: Build run: | forge build From cfd697a3b9c92fb9eb46d9c1efef08653a3c41b8 Mon Sep 17 00:00:00 2001 From: Roshan Date: Thu, 5 Sep 2024 11:23:25 +0800 Subject: [PATCH 28/52] feat: clean unused code in generate.py --- package.json | 2 +- scripts/generate.py | 81 ++++++--------------------------------------- 2 files changed, 11 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 4e326982..96cb433a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint:write": "forge fmt ./contracts/BSCTimelock.sol ./contracts/GovToken.sol ./contracts/BSCGovernor.sol ./contracts/TokenRecoverPortal.sol ./contracts/StakeCredit.sol ./contracts/StakeHub.sol ./contracts/SystemV2.sol ", "generate:mainnet": "poetry run python -m scripts.generate mainnet", "generate:testnet": "poetry run python -m scripts.generate testnet", - "generate:dev": "poetry run python -m scripts.generate dev --epoch \"20\" --misdemeanor-threshold \"5\" --felony-threshold \"10\" --init-felony-slash-scope \"60\" --breathe-block-interval \"1 minutes\" --block-interval \"3 seconds\" --init-bc-consensus-addresses 'hex\"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc\"' --init-bc-vote-addresses 'hex\"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000030b86b3146bdd2200b1dbdb1cea5e40d3451c028cbb4fb03b1826f7f2d82bee76bbd5cd68a74a16a7eceea093fd5826b9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003087ce273bb9b51fd69e50de7a8d9a99cfb3b1a5c6a7b85f6673d137a5a2ce7df3d6ee4e6d579a142d58b0606c4a7a1c27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a33ac14980d85c0d154c5909ebf7a11d455f54beb4d5d0dc1d8b3670b9c4a6b6c450ee3d623ecc48026f09ed1f0b5c1200000000000000000000000000000000\"' --stake-hub-protector \"0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25\" --unbond-period \"2 minutes\" --downtime-jail-time \"2 minutes\" --felony-jail-time \"3 minutes\" --init-voting-delay \"1 minutes / BLOCK_INTERVAL\" --init-voting-period \"2 minutes / BLOCK_INTERVAL\" --init-min-period-after-quorum \"uint64(1 minutes / BLOCK_INTERVAL)\" --governor-protector \"0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25\" --init-minimal-delay \"1 minutes\" --lock-period-for-token-recover \"1 minutes\"" + "generate:dev": "poetry run python -m scripts.generate dev --epoch \"20\" --misdemeanor-threshold \"5\" --felony-threshold \"10\" --init-felony-slash-scope \"60\" --breathe-block-interval \"1 minutes\" --block-interval \"3 seconds\" --stake-hub-protector \"0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25\" --unbond-period \"2 minutes\" --downtime-jail-time \"2 minutes\" --felony-jail-time \"3 minutes\" --init-voting-delay \"1 minutes / BLOCK_INTERVAL\" --init-voting-period \"2 minutes / BLOCK_INTERVAL\" --init-min-period-after-quorum \"uint64(1 minutes / BLOCK_INTERVAL)\" --governor-protector \"0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25\" --init-minimal-delay \"1 minutes\" --lock-period-for-token-recover \"1 minutes\"" }, "dependencies": { "@openzeppelin/contracts": "^4.9.3", diff --git a/scripts/generate.py b/scripts/generate.py index 5eee74e5..2252a680 100644 --- a/scripts/generate.py +++ b/scripts/generate.py @@ -92,24 +92,6 @@ def generate_from_template(data, template_file, output_file): output_file.write(result_string) -def generate_cross_chain(init_batch_size="50"): - contract = "deprecated/CrossChain.sol" - backup_file( - os.path.join(work_dir, "contracts", contract), os.path.join(work_dir, "contracts", contract[:-4] + ".bak") - ) - - -def generate_relayer_hub(whitelist_1, whitelist_2): - contract = "deprecated/RelayerHub.sol" - backup_file( - os.path.join(work_dir, "contracts", contract), os.path.join(work_dir, "contracts", contract[:-4] + ".bak") - ) - - if network == "dev": - replace(contract, r"function whitelistInit\(\) external", "function whitelistInit() public") - insert(contract, "alreadyInit = true;", "\t\twhitelistInit();") - - def generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope): contract = "SlashIndicator.sol" backup_file( @@ -125,8 +107,8 @@ def generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felon def generate_stake_hub( - breathe_block_interval, init_bc_consensus_addresses, init_bc_vote_addresses, max_elected_validators, unbond_period, - downtime_jail_time, felony_jail_time, stake_hub_protector + breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time, + stake_hub_protector ): contract = "StakeHub.sol" backup_file( @@ -195,21 +177,6 @@ def generate_system_reward(): replace(contract, "numOperator = 2;", "numOperator = 4;") -def generate_tendermint_light_client(init_consensus_state_bytes, init_reward_for_validator_ser_change="1e16"): - contract = "deprecated/TendermintLightClient.sol" - backup_file( - os.path.join(work_dir, "contracts", contract), os.path.join(work_dir, "contracts", contract[:-4] + ".bak") - ) - - replace_parameter( - contract, "bytes public constant INIT_CONSENSUS_STATE_BYTES", f"hex\"{init_consensus_state_bytes}\"" - ) - replace_parameter( - contract, "uint256 public constant INIT_REWARD_FOR_VALIDATOR_SER_CHANGE", - f"{init_reward_for_validator_ser_change}" - ) - - def generate_token_hub(lock_period_for_token_recover): contract = "TokenHub.sol" backup_file( @@ -272,7 +239,8 @@ def generate_gov_hub(): if network == "dev": replace( - contract, r"handleSynPackage\(\s*uint8,\s*bytes calldata msgBytes\s*\) external override onlyCrossChainContract", + contract, + r"handleSynPackage\(\s*uint8,\s*bytes calldata msgBytes\s*\) external override onlyCrossChainContract", "handleSynPackage(uint8, bytes calldata msgBytes) external override" ) @@ -290,11 +258,8 @@ def mainnet(): hex_chain_id = convert_chain_id(chain_id) # mainnet init data - init_consensus_bytes = "42696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000" init_burn_ratio = "1000" init_validator_set_bytes = "f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000" - whitelist_1 = "0xb005741528b86F5952469d80A8614591E3c5B632" - whitelist_2 = "0x446AA6E0DC65690403dF3F127750da1322941F3e" source_chain_id = "Binance-Chain-Tigris" epoch = "200" @@ -316,24 +281,19 @@ def mainnet(): init_minimal_delay = "24 hours" lock_period_for_token_recover = "7 days" - init_bc_consensus_addresses = 'hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa"' - init_bc_vote_addresses = 'hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000"' stake_hub_protector = "0x08E68Ec70FA3b629784fDB28887e206ce8561E08" governor_protector = "0x08E68Ec70FA3b629784fDB28887e206ce8561E08" token_recover_portal_protector = "0x08E68Ec70FA3b629784fDB28887e206ce8561E08" generate_system() - generate_cross_chain() generate_system_reward() generate_gov_hub() generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope) - generate_relayer_hub(whitelist_1, whitelist_2) - generate_tendermint_light_client(init_consensus_bytes) generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch) generate_token_recover_portal(source_chain_id, token_recover_portal_protector) generate_stake_hub( - breathe_block_interval, init_bc_consensus_addresses, init_bc_vote_addresses, max_elected_validators, - unbond_period, downtime_jail_time, felony_jail_time, stake_hub_protector + breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time, + stake_hub_protector ) generate_governor( block_interval, init_voting_delay, init_voting_period, init_proposal_threshold, init_quorum_numerator, @@ -354,11 +314,8 @@ def testnet(): hex_chain_id = convert_chain_id(chain_id) # testnet init data - init_consensus_bytes = "42696e616e63652d436861696e2d47616e67657300000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000aea1ac326886b992a991d21a6eb155f41b77867cbf659e78f31d89d8205122a84d1be64f0e9a466c2e66a53433928192783e29f8fa21beb2133499b5ef770f60000000e8d4a5100099308aa365c40554bc89982af505d85da95251445d5dd4a9bb37dd2584fd92d3000000e8d4a5100001776920ff0b0f38d78cf95c033c21adf7045785114e392a7544179652e0a612000000e8d4a51000" init_burn_ratio = "1000" init_validator_set_bytes = "f901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a78410000000" - whitelist_1 = "0x9fB29AAc15b9A4B7F17c3385939b007540f4d791" - whitelist_2 = "0x37B8516a0F88E65D677229b402ec6C1e0E333004" source_chain_id = "Binance-Chain-Ganges" epoch = "200" @@ -380,24 +337,19 @@ def testnet(): init_minimal_delay = "6 hours" lock_period_for_token_recover = "1 days" - init_bc_consensus_addresses = 'hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000001284214b9b9c85549ab3d2b972df0deef66ac2c9000000000000000000000000a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0000000000000000000000000980a75ecd1309ea12fa2ed87a8744fbfc9b863d5000000000000000000000000b71b214cb885500844365e95cd9942c7276e7fd800000000000000000000000035552c16704d214347f29fa77f77da6d75d7c752000000000000000000000000f474cf03cceff28abc65c9cbae594f725c80e12d00000000000000000000000096c5d20b2a975c050e4220be276ace4892f4b41a00000000000000000000000047788386d0ed6c748e03a53160b4b30ed3748cc5000000000000000000000000bdfbc016c1bd481f5d8ca6f754f4b200a7ed66ce000000000000000000000000372e4887005ec21a5aff9ff62eda9e7713e3643700000000000000000000000055c968cf3430f3ba0534ef49ff4b3fbc9086c7ce000000000000000000000000136bd6343049c9690569db79dcd9208a57d342ad000000000000000000000000977ecef7de795cd248d77fd0d080ce3a35dec013000000000000000000000000b334ced91dff560bc9b5b3c30ae613bf335f1813"' - init_bc_vote_addresses = 'hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000308e82934ca974fdcd97f3309de967d3c9c43fa711a8d673af5d75465844bf8969c8d1948d903748ac7b8b1720fa64e50c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b973c2d38487e58fd6e145491b110080fb14ac915a0411fc78f19e09a399ddee0d20c63a75d8f930f1694544ad2dc01b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003089037a9ace3b590165ea1c0c5ac72bf600b7c88c1e435f41932c1132aae1bfa0bb68e46b96ccb12c3415e4d82af717d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a2750ec6dded3dcdc2f351782310b0eadc077db59abca0f0cd26776e2e7acb9f3bce40b1fa5221fd1561226c6263cc5f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b742ad4855bae330426b823e742da31f816cc83bc16d69a9134be0cfb4a1d17ec34f1b5b32d5c20440b8536b1e88f0f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096c9b86c3400e529bfe184056e257c07940bb664636f689e8d2027c834681f8f878b73445261034e946bb2d901b4b87800000000000000000000000000000000"' stake_hub_protector = "0x30151DA466EC8AB345BEF3d6983023E050fb0673" governor_protector = "0x30151DA466EC8AB345BEF3d6983023E050fb0673" token_recover_portal_protector = "0x30151DA466EC8AB345BEF3d6983023E050fb0673" generate_system() - generate_cross_chain() generate_system_reward() generate_gov_hub() generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope) - generate_relayer_hub(whitelist_1, whitelist_2) - generate_tendermint_light_client(init_consensus_bytes) generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch) generate_token_recover_portal(source_chain_id, token_recover_portal_protector) generate_stake_hub( - breathe_block_interval, init_bc_consensus_addresses, init_bc_vote_addresses, max_elected_validators, - unbond_period, downtime_jail_time, felony_jail_time, stake_hub_protector + breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time, + stake_hub_protector ) generate_governor( block_interval, init_voting_delay, init_voting_period, init_proposal_threshold, init_quorum_numerator, @@ -413,19 +365,9 @@ def testnet(): @main.command(help="Generate contracts for dev environment") def dev( dev_chain_id: int = 714, - init_consensus_bytes: - str = "42696e616e63652d436861696e2d4e696c650000000000000000000000000000000000000000000229eca254b3859bffefaf85f4c95da9fbd26527766b784272789c30ec56b380b6eb96442aaab207bc59978ba3dd477690f5c5872334fc39e627723daa97e441e88ba4515150ec3182bc82593df36f8abb25a619187fcfab7e552b94e64ed2deed000000e8d4a51000", init_burn_ratio: Annotated[str, typer.Option(help="init burn ratio of BscValidatorSet")] = "1000", - whitelist_1: Annotated[ - str, typer.Option(help="whitelist relayer1's address")] = "0xA904540818AC9c47f2321F97F1069B9d8746c6DB", - whitelist_2: Annotated[ - str, typer.Option(help="whitelist relayer2's address")] = "0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344", source_chain_id: Annotated[ str, typer.Option(help="source chain id of the token recover portal")] = "Binance-Chain-Ganges", - init_bc_consensus_addresses: - str = 'hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000"', - init_bc_vote_addresses: - str = 'hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000"', stake_hub_protector: Annotated[str, typer.Option(help="assetProtector of StakeHub")] = "address(0xdEaD)", governor_protector: Annotated[str, typer.Option(help="governorProtector of BSCGovernor")] = "address(0xdEaD)", token_recover_portal_protector: Annotated[str, @@ -475,17 +417,14 @@ def dev( raise Exception(f"Error getting init_validatorset_bytes: {e}") generate_system() - generate_cross_chain() generate_system_reward() generate_gov_hub() generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope) - generate_relayer_hub(whitelist_1, whitelist_2) - generate_tendermint_light_client(init_consensus_bytes) generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch) generate_token_recover_portal(source_chain_id, token_recover_portal_protector) generate_stake_hub( - breathe_block_interval, init_bc_consensus_addresses, init_bc_vote_addresses, max_elected_validators, - unbond_period, downtime_jail_time, felony_jail_time, stake_hub_protector + breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time, + stake_hub_protector ) generate_governor( block_interval, init_voting_delay, init_voting_period, init_proposal_threshold, init_quorum_numerator, From 0b0e3943b68f14e4fc950ff63794268e4ab4c9e2 Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 5 Sep 2024 11:52:46 +0800 Subject: [PATCH 29/52] feat: lint code and recover ci lint check --- .github/workflows/unit-test.yml | 4 +++ contracts/GovToken.sol | 4 ++- contracts/StakeCredit.sol | 44 +++++++++++++++++++++-------- contracts/StakeHub.sol | 48 ++++++++++++++++++++++++-------- contracts/TokenRecoverPortal.sol | 4 ++- 5 files changed, 79 insertions(+), 25 deletions(-) diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 2f2734bc..d40fb6b1 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -37,6 +37,10 @@ jobs: forge install --no-git --no-commit foundry-rs/forge-std@v1.7.3 forge --version + - name: Lint Check + run: | + npm run lint:check + - name: Build run: | forge build diff --git a/contracts/GovToken.sol b/contracts/GovToken.sol index 05bbebce..b338e832 100644 --- a/contracts/GovToken.sol +++ b/contracts/GovToken.sol @@ -72,7 +72,9 @@ contract GovToken is _delegate(delegator, delegatee); } - function burn(uint256) public pure override { + function burn( + uint256 + ) public pure override { revert BurnNotAllowed(); } diff --git a/contracts/StakeCredit.sol b/contracts/StakeCredit.sol index b9c727b2..025e875a 100644 --- a/contracts/StakeCredit.sol +++ b/contracts/StakeCredit.sol @@ -98,7 +98,9 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC * @param delegator the address of the delegator * @return shares the amount of shares minted */ - function delegate(address delegator) external payable onlyStakeHub returns (uint256 shares) { + function delegate( + address delegator + ) external payable onlyStakeHub returns (uint256 shares) { if (msg.value == 0) revert ZeroAmount(); shares = _mintAndSync(delegator, msg.value); if (shares == 0) revert ZeroShares(); @@ -181,7 +183,9 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC * @dev Distribute the reward to the validator and all delegators. Only the `StakeHub` contract can call this function. * @param commissionRate the commission rate of the validator */ - function distributeReward(uint64 commissionRate) external payable onlyStakeHub { + function distributeReward( + uint64 commissionRate + ) external payable onlyStakeHub { uint256 bnbAmount = msg.value; uint256 _commission = (bnbAmount * uint256(commissionRate)) / COMMISSION_RATE_BASE; uint256 _reward = bnbAmount - _commission; @@ -202,7 +206,9 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC * @param slashBnbAmount the amount of BNB to be slashed * @return realSlashBnbAmount the real amount of BNB slashed */ - function slash(uint256 slashBnbAmount) external onlyStakeHub returns (uint256) { + function slash( + uint256 slashBnbAmount + ) external onlyStakeHub returns (uint256) { uint256 selfDelegation = balanceOf(validator); uint256 slashShares = getSharesByPooledBNB(slashBnbAmount); @@ -219,7 +225,9 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC /** * @return the amount of shares that corresponds to `_bnbAmount` protocol-controlled BNB. */ - function getSharesByPooledBNB(uint256 bnbAmount) public view returns (uint256) { + function getSharesByPooledBNB( + uint256 bnbAmount + ) public view returns (uint256) { if (totalPooledBNB == 0) revert ZeroTotalPooledBNB(); return (bnbAmount * totalSupply()) / totalPooledBNB; } @@ -227,7 +235,9 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC /** * @return the amount of BNB that corresponds to `_sharesAmount` token shares. */ - function getPooledBNBByShares(uint256 shares) public view returns (uint256) { + function getPooledBNBByShares( + uint256 shares + ) public view returns (uint256) { if (totalSupply() == 0) revert ZeroTotalShares(); return (shares * totalPooledBNB) / totalSupply(); } @@ -243,14 +253,18 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC /** * @return the total length of delegator's pending unbond queue. */ - function pendingUnbondRequest(address delegator) public view returns (uint256) { + function pendingUnbondRequest( + address delegator + ) public view returns (uint256) { return _unbondRequestsQueue[delegator].length(); } /** * @return the total number of delegator's claimable unbond requests. */ - function claimableUnbondRequest(address delegator) public view returns (uint256) { + function claimableUnbondRequest( + address delegator + ) public view returns (uint256) { uint256 length = _unbondRequestsQueue[delegator].length(); uint256 count; for (uint256 i; i < length; ++i) { @@ -290,19 +304,25 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC /** * @return the personal unbond sequence of the delegator. */ - function unbondSequence(address delegator) public view returns (uint256) { + function unbondSequence( + address delegator + ) public view returns (uint256) { return _unbondSequence[delegator].current(); } /** * @return the total amount of BNB staked and reward of the delegator. */ - function getPooledBNB(address account) public view returns (uint256) { + function getPooledBNB( + address account + ) public view returns (uint256) { return getPooledBNBByShares(balanceOf(account)); } /*----------------- internal functions -----------------*/ - function _bootstrapInitialHolder(uint256 initAmount) internal onlyInitializing { + function _bootstrapInitialHolder( + uint256 initAmount + ) internal onlyInitializing { // check before mint uint256 toLock = IStakeHub(STAKE_HUB_ADDR).LOCK_AMOUNT(); if (initAmount <= toLock || validator == address(0) || totalSupply() != 0) revert WrongInitContext(); @@ -330,7 +350,9 @@ contract StakeCredit is SystemV2, Initializable, ReentrancyGuardUpgradeable, ERC totalPooledBNB -= bnbAmount; } - function _useSequence(address delegator) internal returns (uint256 current) { + function _useSequence( + address delegator + ) internal returns (uint256 current) { CountersUpgradeable.Counter storage sequence = _unbondSequence[delegator]; current = sequence.current(); sequence.increment(); diff --git a/contracts/StakeHub.sol b/contracts/StakeHub.sol index 8aee033a..d0e774ad 100644 --- a/contracts/StakeHub.sol +++ b/contracts/StakeHub.sol @@ -223,7 +223,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { event UnexpectedPackage(uint8 channelId, bytes msgBytes); // @dev deprecated /*----------------- modifiers -----------------*/ - modifier validatorExist(address operatorAddress) { + modifier validatorExist( + address operatorAddress + ) { if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExisted(); _; } @@ -278,7 +280,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { /** * @param newAgent the new agent address of the validator, updating to address(0) means remove the old agent. */ - function updateAgent(address newAgent) external validatorExist(msg.sender) whenNotPaused notInBlackList { + function updateAgent( + address newAgent + ) external validatorExist(msg.sender) whenNotPaused notInBlackList { if (agentToOperator[newAgent] != address(0)) revert InvalidAgent(); if (_validatorSet.contains(newAgent)) revert InvalidAgent(); @@ -455,7 +459,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { /** * @param operatorAddress the operator address of the validator to be unjailed */ - function unjail(address operatorAddress) external whenNotPaused notInBlackList validatorExist(operatorAddress) { + function unjail( + address operatorAddress + ) external whenNotPaused notInBlackList validatorExist(operatorAddress) { Validator storage valInfo = _validators[operatorAddress]; if (!valInfo.jailed) revert ValidatorNotJailed(); @@ -620,7 +626,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { /** * @dev This function will be called by consensus engine. So it should never revert. */ - function distributeReward(address consensusAddress) external payable onlyValidatorContract { + function distributeReward( + address consensusAddress + ) external payable onlyValidatorContract { address operatorAddress = consensusToOperator[consensusAddress]; Validator memory valInfo = _validators[operatorAddress]; if (valInfo.creditContract == address(0) || valInfo.jailed) { @@ -638,7 +646,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { /** * @dev Downtime slash. Only the `SlashIndicator` contract can call this function. */ - function downtimeSlash(address consensusAddress) external onlySlash { + function downtimeSlash( + address consensusAddress + ) external onlySlash { address operatorAddress = consensusToOperator[consensusAddress]; if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExisted(); // should never happen Validator storage valInfo = _validators[operatorAddress]; @@ -656,7 +666,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { /** * @dev Malicious vote slash. Only the `SlashIndicator` contract can call this function. */ - function maliciousVoteSlash(bytes calldata voteAddress) external onlySlash whenNotPaused { + function maliciousVoteSlash( + bytes calldata voteAddress + ) external onlySlash whenNotPaused { address operatorAddress = voteToOperator[voteAddress]; if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExisted(); // should never happen Validator storage valInfo = _validators[operatorAddress]; @@ -686,7 +698,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { /** * @dev Double sign slash. Only the `SlashIndicator` contract can call this function. */ - function doubleSignSlash(address consensusAddress) external onlySlash whenNotPaused { + function doubleSignSlash( + address consensusAddress + ) external onlySlash whenNotPaused { address operatorAddress = consensusToOperator[consensusAddress]; if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExisted(); // should never happen Validator storage valInfo = _validators[operatorAddress]; @@ -855,7 +869,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { * * @return consensusAddress the consensus address of the validator */ - function getValidatorConsensusAddress(address operatorAddress) external view returns (address consensusAddress) { + function getValidatorConsensusAddress( + address operatorAddress + ) external view returns (address consensusAddress) { Validator memory valInfo = _validators[operatorAddress]; consensusAddress = valInfo.consensusAddress; } @@ -867,7 +883,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { * * @return creditContract the credit contract address of the validator */ - function getValidatorCreditContract(address operatorAddress) external view returns (address creditContract) { + function getValidatorCreditContract( + address operatorAddress + ) external view returns (address creditContract) { Validator memory valInfo = _validators[operatorAddress]; creditContract = valInfo.creditContract; } @@ -879,7 +897,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { * * @return voteAddress the vote address of the validator */ - function getValidatorVoteAddress(address operatorAddress) external view returns (bytes memory voteAddress) { + function getValidatorVoteAddress( + address operatorAddress + ) external view returns (bytes memory voteAddress) { Validator memory valInfo = _validators[operatorAddress]; voteAddress = valInfo.voteAddress; } @@ -981,7 +1001,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { } /*----------------- internal functions -----------------*/ - function _checkMoniker(string memory moniker) internal pure returns (bool) { + function _checkMoniker( + string memory moniker + ) internal pure returns (bool) { bytes memory bz = bytes(moniker); // 1. moniker length should be between 3 and 9 @@ -1049,7 +1071,9 @@ contract StakeHub is SystemV2, Initializable, Protectable { return creditProxy; } - function _checkValidatorSelfDelegation(address operatorAddress) internal { + function _checkValidatorSelfDelegation( + address operatorAddress + ) internal { Validator storage valInfo = _validators[operatorAddress]; if (valInfo.jailed) { return; diff --git a/contracts/TokenRecoverPortal.sol b/contracts/TokenRecoverPortal.sol index 0ca51e75..db5cc3df 100644 --- a/contracts/TokenRecoverPortal.sol +++ b/contracts/TokenRecoverPortal.sol @@ -86,7 +86,9 @@ contract TokenRecoverPortal is SystemV2, Initializable, ReentrancyGuardUpgradeab * @param node the leaf node of merkle tree. * @return the result of check. */ - function isRecovered(bytes32 node) public view returns (bool) { + function isRecovered( + bytes32 node + ) public view returns (bool) { return recoveredMap[node]; } From 348fe4030ca6749af41d852530ed0a5813b3435e Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 5 Sep 2024 12:13:17 +0800 Subject: [PATCH 30/52] fix: modify vote slash code to avoid reentry --- contracts/SlashIndicator.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index 5aa10d53..62a4ea35 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -252,20 +252,19 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati "verify signature failed" ); + IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); + // reward sender and felony validator if validator found - // TODO: after BC-fusion, we don't need to check if validator is living (address[] memory vals, bytes[] memory voteAddrs) = IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).getLivingValidators(); for (uint256 i; i < voteAddrs.length; ++i) { if (BytesLib.equal(voteAddrs[i], _evidence.voteAddr)) { uint256 amount = (address(SYSTEM_REWARD_ADDR).balance * felonySlashRewardRatio) / 100; - ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(msg.sender, amount); IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(vals[i]); + ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(msg.sender, amount); break; } } - - IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); } function submitDoubleSignEvidence(bytes memory header1, bytes memory header2) public onlyInit { From 7d172f2d92f3a7f563ac78f48c201d13de33ed14 Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 5 Sep 2024 14:37:14 +0800 Subject: [PATCH 31/52] Revert "fix: modify vote slash code to avoid reentry" This reverts commit 348fe4030ca6749af41d852530ed0a5813b3435e. --- contracts/SlashIndicator.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index 62a4ea35..5aa10d53 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -252,19 +252,20 @@ contract SlashIndicator is ISlashIndicator, System, IParamSubscriber, IApplicati "verify signature failed" ); - IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); - // reward sender and felony validator if validator found + // TODO: after BC-fusion, we don't need to check if validator is living (address[] memory vals, bytes[] memory voteAddrs) = IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).getLivingValidators(); for (uint256 i; i < voteAddrs.length; ++i) { if (BytesLib.equal(voteAddrs[i], _evidence.voteAddr)) { uint256 amount = (address(SYSTEM_REWARD_ADDR).balance * felonySlashRewardRatio) / 100; - IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(vals[i]); ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(msg.sender, amount); + IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(vals[i]); break; } } + + IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); } function submitDoubleSignEvidence(bytes memory header1, bytes memory header2) public onlyInit { From 08f7a1f1eaa6bb9dbaefe00a3b1365ae0cab9e1b Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 6 Sep 2024 18:51:22 +0800 Subject: [PATCH 32/52] fix: recover claimMigrationFund in TokenHub --- contracts/TokenHub.sol | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/contracts/TokenHub.sol b/contracts/TokenHub.sol index 0e476128..b42f4cfb 100644 --- a/contracts/TokenHub.sol +++ b/contracts/TokenHub.sol @@ -105,15 +105,11 @@ contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemR address payable to, uint256 amount ) external override onlyInit onlyRelayerIncentivize returns (uint256) { - uint256 actualAmount = amount < address(this).balance ? amount : address(this).balance; - if (actualAmount > REWARD_UPPER_LIMIT) { - return 0; - } - if (actualAmount > 0) { - to.transfer(actualAmount); - emit rewardTo(to, actualAmount); - } - return actualAmount; + revert("deprecated"); + } + + function claimMigrationFund(uint256 amount) external onlyStakeHub returns (bool) { + revert("deprecated"); } function getMiniRelayFee() external view override returns (uint256) { From 3ad33b14299342779506125594db9660e993f3f8 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 6 Sep 2024 18:54:39 +0800 Subject: [PATCH 33/52] feat: sync genesis.json --- genesis.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genesis.json b/genesis.json index 882eb263..dd8c32de 100644 --- a/genesis.json +++ b/genesis.json @@ -62,7 +62,7 @@ }, "0x0000000000000000000000000000000000001004": { "balance": "176405560900000000000000000", - "code": "0x60806040526004361061031e5760003560e01c80638eff336c116101ab578063b99328c5116100f7578063dc927faf11610095578063e8f35cea1161006f578063e8f35cea14610d94578063f9a2bbc714610dc7578063fc1a598f14610ddc578063fd6a687914610e0f57610366565b8063dc927faf14610d55578063df8079e914610d6a578063e1c7392a14610d7f57610366565b8063bd466461116100d1578063bd46646114610cd2578063c81b166214610d05578063c8509d811461090f578063cf41984414610d1a57610366565b8063b99328c514610c51578063b9fd21e314610c8a578063bbface1f14610c9f57610366565b8063a1a11bf511610164578063aa82dce11161013e578063aa82dce114610b2e578063aad5606314610b43578063ab51bb9614610b58578063ac43175114610b8657610366565b8063a1a11bf514610abd578063a78abc1614610ad2578063aa7415f514610ae757610366565b80638eff336c146109cd57806393ab703f14610a0c5780639509b98014610a215780639a854bbd14610a5a5780639a99b4f014610a6f5780639dc0926214610aa857610366565b806351e806721161026a57806371d3086311610223578063799758b9116101fd578063799758b9146108bb5780637e434d54146108fa578063831d65d11461090f5780638525db031461099457610366565b806371d3086314610867578063727be1f81461087c57806375d47a0a146108a657610366565b806351e80672146106a757806359b92789146106bc5780635d499b1b146106e657806361368475146106fb5780636e056520146107265780636e47b4821461085257610366565b80633d713223116102d757806343a368b9116102b157806343a368b91461063c578063493279b11461065157806350432d321461067d57806351b4dce31461069257610366565b80633d713223146105615780633fd8b02f1461061257806343756e5c1461062757610366565b80630e2374a51461036b5780631182b8751461039c5780631223458214610496578063149d14d9146104d157806328087028146104f85780632ae454831461050d57610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610e24565b604080516001600160a01b039092168252519081900360200190f35b3480156103a857600080fd5b50610421600480360360408110156103bf57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e357600080fd5b8201836020820111156103f557600080fd5b803590602001918460018302840111600160201b8311171561041657600080fd5b509092509050610e2a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045b578181015183820152602001610443565b50505050905090810190601f1680156104885780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104a257600080fd5b50610364600480360360408110156104b957600080fd5b506001600160a01b0381358116916020013516610e72565b3480156104dd57600080fd5b506104e6610eec565b60408051918252519081900360200190f35b34801561050457600080fd5b50610380610ef2565b34801561051957600080fd5b506105486004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516610ef8565b6040805192835260208301919091528051918290030190f35b34801561056d57600080fd5b506103806004803603602081101561058457600080fd5b810190602081018135600160201b81111561059e57600080fd5b8201836020820111156105b057600080fd5b803590602001918460018302840111600160201b831117156105d157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f1c945050505050565b34801561061e57600080fd5b506104e6610f3d565b34801561063357600080fd5b50610380610f43565b34801561064857600080fd5b506104e6610f49565b34801561065d57600080fd5b50610666610f55565b6040805161ffff9092168252519081900360200190f35b34801561068957600080fd5b506104e6610f5a565b34801561069e57600080fd5b50610380610f65565b3480156106b357600080fd5b50610380610f6b565b3480156106c857600080fd5b50610380600480360360208110156106df57600080fd5b5035610f71565b3480156106f257600080fd5b506104e6610f8c565b34801561070757600080fd5b50610710610f95565b6040805160ff9092168252519081900360200190f35b61083e6004803603608081101561073c57600080fd5b810190602081018135600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b919390929091602081019035600160201b8111156107a657600080fd5b8201836020820111156107b857600080fd5b803590602001918460208302840111600160201b831117156107d957600080fd5b919390929091602081019035600160201b8111156107f657600080fd5b82018360208201111561080857600080fd5b803590602001918460208302840111600160201b8311171561082957600080fd5b91935091503567ffffffffffffffff16610f9a565b604080519115158252519081900360200190f35b34801561085e57600080fd5b50610380610fe0565b34801561087357600080fd5b506104e6610fe6565b34801561088857600080fd5b5061083e6004803603602081101561089f57600080fd5b5035610fec565b3480156108b257600080fd5b50610380611028565b3480156108c757600080fd5b50610364600480360360608110156108de57600080fd5b508035906001600160a01b03602082013516906040013561102e565b34801561090657600080fd5b506103806112de565b34801561091b57600080fd5b506103646004803603604081101561093257600080fd5b60ff8235169190810190604081016020820135600160201b81111561095657600080fd5b82018360208201111561096857600080fd5b803590602001918460018302840111600160201b8311171561098957600080fd5b5090925090506112e4565b3480156109a057600080fd5b50610364600480360360408110156109b757600080fd5b50803590602001356001600160a01b0316611329565b3480156109d957600080fd5b50610364600480360360608110156109f057600080fd5b508035906001600160a01b036020820135169060400135611492565b348015610a1857600080fd5b506104e66114d2565b348015610a2d57600080fd5b5061036460048036036040811015610a4457600080fd5b506001600160a01b0381351690602001356114d9565b348015610a6657600080fd5b506104e661159b565b348015610a7b57600080fd5b506104e660048036036040811015610a9257600080fd5b506001600160a01b0381351690602001356115a7565b348015610ab457600080fd5b506103806116e5565b348015610ac957600080fd5b506103806116eb565b348015610ade57600080fd5b5061083e6116f1565b61083e60048036036080811015610afd57600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16610f9a565b348015610b3a57600080fd5b506103806116fa565b348015610b4f57600080fd5b50610380611700565b348015610b6457600080fd5b50610b6d611706565b6040805163ffffffff9092168252519081900360200190f35b348015610b9257600080fd5b5061036460048036036040811015610ba957600080fd5b810190602081018135600160201b811115610bc357600080fd5b820183602082011115610bd557600080fd5b803590602001918460018302840111600160201b83111715610bf657600080fd5b919390929091602081019035600160201b811115610c1357600080fd5b820183602082011115610c2557600080fd5b803590602001918460018302840111600160201b83111715610c4657600080fd5b50909250905061170b565b348015610c5d57600080fd5b5061036460048036036040811015610c7457600080fd5b50803590602001356001600160a01b0316611492565b348015610c9657600080fd5b506104e661174b565b348015610cab57600080fd5b506104e660048036036020811015610cc257600080fd5b50356001600160a01b0316611755565b348015610cde57600080fd5b506104e660048036036020811015610cf557600080fd5b50356001600160a01b0316611767565b348015610d1157600080fd5b50610380611782565b348015610d2657600080fd5b5061036460048036036040811015610d3d57600080fd5b506001600160a01b0381358116916020013516611788565b348015610d6157600080fd5b5061038061181b565b348015610d7657600080fd5b50610380611821565b348015610d8b57600080fd5b50610364611827565b348015610da057600080fd5b506104e660048036036020811015610db757600080fd5b50356001600160a01b03166118c7565b348015610dd357600080fd5b506103806118d9565b348015610de857600080fd5b5061042160048036036020811015610dff57600080fd5b50356001600160a01b03166118df565b348015610e1b57600080fd5b50610380611a06565b61200181565b60005460609060ff16610e72576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b3361200014610eb25760405162461bcd60e51b815260040180806020018281038252602f815260200180611d5c602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020908101516000908152600490915260409020546001600160a01b031690565b60055481565b61100181565b670de0b6b3a764000081565b603881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600881565b6000805460ff16610eb2576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b61100581565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b60005460ff16611073576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b33613000146110b35760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce2602b913960400191505060405180910390fd5b677ce66c50e28400008111156110fa5760405162461bcd60e51b8152600401808060200182810382526035815260200180611cad6035913960400191505060405180910390fd5b60006221272160e91b8414611264576000848152600460205260409020546001600160a01b03168061116d576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a350506112d9565b6001600160a01b0381166000908152600260205260409020546111908482611a0c565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d602081101561120557600080fd5b50511015611251576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61125d86838588611a4c565b50506112d7565b611279826402540be40063ffffffff611ae616565b9050804710156112c7576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b60006112d585828487611a4c565b505b505b505050565b61200381565b60005460ff16610e72576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b33613000146113695760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce2602b913960400191505060405180910390fd5b60006221272160e91b83146113d457506000828152600460205260409020546001600160a01b0316806113d4576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b038082166000908152600760209081526040808320938616835292905220805461143f576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814610eb25760405162461bcd60e51b8152600401808060200182810382526023815260200180611d8b6023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561151357600080fd5b505afa158015611527573d6000803e3d6000fd5b505050506040513d602081101561153d57600080fd5b50516001600160a01b03163314610eb2576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b677ce66c50e284000081565b6000805460ff166115ed576040805162461bcd60e51b81526020600482015260196024820152600080516020611dae833981519152604482015290519081900360640190fd5b336110051461162d5760405162461bcd60e51b815260040180806020018281038252602f815260200180611c7e602f913960400191505060405180910390fd5b600047831061163c574761163e565b825b9050670de0b6b3a764000081111561165a5760009150506116df565b80156116dc576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611696573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610eb25760405162461bcd60e51b815260040180806020018281038252602e815260200180611d2e602e913960400191505060405180910390fd5b6221272160e91b81565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff16600214156117d4576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61100381565b61200481565b60005460ff161561187f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff16101561196f57828160ff168151811061194357fe5b01602001516001600160f81b0319161561196257816001019150611967565b61196f565b600101611928565b5060608160ff166040519080825280601f01601f1916602001820160405280156119a0576020820181803683370190505b50905060005b8260ff168160ff1610156119fc57838160ff16815181106119c357fe5b602001015160f81c60f81b828260ff16815181106119dd57fe5b60200101906001600160f81b031916908160001a9053506001016119a6565b5095945050505050565b61100481565b60006008821115611a3557611a2e836007198401600a0a63ffffffff611ae616565b90506116df565b6116dc836008849003600a0a63ffffffff611b3f16565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054611a83908463ffffffff611b8116565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b600082611af5575060006116df565b82820282848281611b0257fe5b04146116dc5760405162461bcd60e51b8152600401808060200182810382526021815260200180611d0d6021913960400191505060405180910390fd5b60006116dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bdb565b6000828201838110156116dc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008183611c675760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c2c578181015183820152602001611c14565b50505050905090810190601f168015611c595780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611c7357fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" + "code": "0x6080604052600436106103395760003560e01c806393ab703f116101ab578063b9fd21e3116100f7578063df8079e911610095578063e8f35cea1161006f578063e8f35cea14610dd9578063f9a2bbc714610e0c578063fc1a598f14610e21578063fd6a687914610e5457610381565b8063df8079e914610d85578063e04c83a714610d9a578063e1c7392a14610dc457610381565b8063c81b1662116100d1578063c81b166214610d20578063c8509d811461092a578063cf41984414610d35578063dc927faf14610d7057610381565b8063b9fd21e314610ca5578063bbface1f14610cba578063bd46646114610ced57610381565b8063a78abc1611610164578063aad560631161013e578063aad5606314610b5e578063ab51bb9614610b73578063ac43175114610ba1578063b99328c514610c6c57610381565b8063a78abc1614610aed578063aa7415f514610b02578063aa82dce114610b4957610381565b806393ab703f14610a275780639509b98014610a3c5780639a854bbd14610a755780639a99b4f014610a8a5780639dc0926214610ac3578063a1a11bf514610ad857610381565b806351e8067211610285578063727be1f8116102235780637e434d54116101fd5780637e434d5414610915578063831d65d11461092a5780638525db03146109af5780638eff336c146109e857610381565b8063727be1f81461089757806375d47a0a146108c1578063799758b9146108d657610381565b8063613684751161025f57806361368475146107165780636e056520146107415780636e47b4821461086d57806371d308631461088257610381565b806351e80672146106c257806359b92789146106d75780635d499b1b1461070157610381565b80633d713223116102f257806343a368b9116102cc57806343a368b914610657578063493279b11461066c57806350432d321461069857806351b4dce3146106ad57610381565b80633d7132231461057c5780633fd8b02f1461062d57806343756e5c1461064257610381565b80630e2374a5146103865780631182b875146103b757806312234582146104b1578063149d14d9146104ec57806328087028146105135780632ae454831461052857610381565b3661038157341561037f576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561039257600080fd5b5061039b610e69565b604080516001600160a01b039092168252519081900360200190f35b3480156103c357600080fd5b5061043c600480360360408110156103da57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103fe57600080fd5b82018360208201111561041057600080fd5b803590602001918460018302840111600160201b8311171561043157600080fd5b509092509050610e6f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047657818101518382015260200161045e565b50505050905090810190601f1680156104a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104bd57600080fd5b5061037f600480360360408110156104d457600080fd5b506001600160a01b0381358116916020013516610eb7565b3480156104f857600080fd5b50610501610f31565b60408051918252519081900360200190f35b34801561051f57600080fd5b5061039b610f37565b34801561053457600080fd5b506105636004803603604081101561054b57600080fd5b506001600160a01b0381358116916020013516610f3d565b6040805192835260208301919091528051918290030190f35b34801561058857600080fd5b5061039b6004803603602081101561059f57600080fd5b810190602081018135600160201b8111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460018302840111600160201b831117156105ec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f61945050505050565b34801561063957600080fd5b50610501610f82565b34801561064e57600080fd5b5061039b610f88565b34801561066357600080fd5b50610501610f8e565b34801561067857600080fd5b50610681610f9a565b6040805161ffff9092168252519081900360200190f35b3480156106a457600080fd5b50610501610f9f565b3480156106b957600080fd5b5061039b610faa565b3480156106ce57600080fd5b5061039b610fb0565b3480156106e357600080fd5b5061039b600480360360208110156106fa57600080fd5b5035610fb6565b34801561070d57600080fd5b50610501610fd1565b34801561072257600080fd5b5061072b610fda565b6040805160ff9092168252519081900360200190f35b6108596004803603608081101561075757600080fd5b810190602081018135600160201b81111561077157600080fd5b82018360208201111561078357600080fd5b803590602001918460208302840111600160201b831117156107a457600080fd5b919390929091602081019035600160201b8111156107c157600080fd5b8201836020820111156107d357600080fd5b803590602001918460208302840111600160201b831117156107f457600080fd5b919390929091602081019035600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b91935091503567ffffffffffffffff16610fdf565b604080519115158252519081900360200190f35b34801561087957600080fd5b5061039b611025565b34801561088e57600080fd5b5061050161102b565b3480156108a357600080fd5b50610859600480360360208110156108ba57600080fd5b5035611031565b3480156108cd57600080fd5b5061039b61106d565b3480156108e257600080fd5b5061037f600480360360608110156108f957600080fd5b508035906001600160a01b036020820135169060400135611073565b34801561092157600080fd5b5061039b611323565b34801561093657600080fd5b5061037f6004803603604081101561094d57600080fd5b60ff8235169190810190604081016020820135600160201b81111561097157600080fd5b82018360208201111561098357600080fd5b803590602001918460018302840111600160201b831117156109a457600080fd5b509092509050611329565b3480156109bb57600080fd5b5061037f600480360360408110156109d257600080fd5b50803590602001356001600160a01b031661136e565b3480156109f457600080fd5b5061037f60048036036060811015610a0b57600080fd5b508035906001600160a01b0360208201351690604001356114d7565b348015610a3357600080fd5b50610501611517565b348015610a4857600080fd5b5061037f60048036036040811015610a5f57600080fd5b506001600160a01b03813516906020013561151e565b348015610a8157600080fd5b506105016115e0565b348015610a9657600080fd5b5061050160048036036040811015610aad57600080fd5b506001600160a01b0381351690602001356115ec565b348015610acf57600080fd5b5061039b611672565b348015610ae457600080fd5b5061039b611678565b348015610af957600080fd5b5061085961167e565b61085960048036036080811015610b1857600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16610fdf565b348015610b5557600080fd5b5061039b611687565b348015610b6a57600080fd5b5061039b61168d565b348015610b7f57600080fd5b50610b88611693565b6040805163ffffffff9092168252519081900360200190f35b348015610bad57600080fd5b5061037f60048036036040811015610bc457600080fd5b810190602081018135600160201b811115610bde57600080fd5b820183602082011115610bf057600080fd5b803590602001918460018302840111600160201b83111715610c1157600080fd5b919390929091602081019035600160201b811115610c2e57600080fd5b820183602082011115610c4057600080fd5b803590602001918460018302840111600160201b83111715610c6157600080fd5b509092509050611698565b348015610c7857600080fd5b5061037f60048036036040811015610c8f57600080fd5b50803590602001356001600160a01b03166114d7565b348015610cb157600080fd5b506105016116d8565b348015610cc657600080fd5b5061050160048036036020811015610cdd57600080fd5b50356001600160a01b03166116e2565b348015610cf957600080fd5b5061050160048036036020811015610d1057600080fd5b50356001600160a01b03166116f4565b348015610d2c57600080fd5b5061039b61170f565b348015610d4157600080fd5b5061037f60048036036040811015610d5857600080fd5b506001600160a01b0381358116916020013516611715565b348015610d7c57600080fd5b5061039b6117a8565b348015610d9157600080fd5b5061039b6117ae565b348015610da657600080fd5b5061085960048036036020811015610dbd57600080fd5b50356117b4565b348015610dd057600080fd5b5061037f61180c565b348015610de557600080fd5b5061050160048036036020811015610dfc57600080fd5b50356001600160a01b03166118ac565b348015610e1857600080fd5b5061039b6118be565b348015610e2d57600080fd5b5061043c60048036036020811015610e4457600080fd5b50356001600160a01b03166118c4565b348015610e6057600080fd5b5061039b6119eb565b61200181565b60005460609060ff16610eb7576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b3361200014610ef75760405162461bcd60e51b815260040180806020018281038252602f815260200180611d4a602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020908101516000908152600490915260409020546001600160a01b031690565b60055481565b61100181565b670de0b6b3a764000081565b603881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600881565b6000805460ff16610ef7576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b61100581565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b60005460ff166110b8576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b33613000146110f85760405162461bcd60e51b815260040180806020018281038252602b815260200180611cd0602b913960400191505060405180910390fd5b677ce66c50e284000081111561113f5760405162461bcd60e51b8152600401808060200182810382526035815260200180611c9b6035913960400191505060405180910390fd5b60006221272160e91b84146112a9576000848152600460205260409020546001600160a01b0316806111b2576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a3505061131e565b6001600160a01b0381166000908152600260205260409020546111d584826119f1565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561122057600080fd5b505afa158015611234573d6000803e3d6000fd5b505050506040513d602081101561124a57600080fd5b50511015611296576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6112a286838588611a3a565b505061131c565b6112be826402540be40063ffffffff611ad416565b90508047101561130c576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600061131a85828487611a3a565b505b505b505050565b61200381565b60005460ff16610eb7576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b33613000146113ae5760405162461bcd60e51b815260040180806020018281038252602b815260200180611cd0602b913960400191505060405180910390fd5b60006221272160e91b831461141957506000828152600460205260409020546001600160a01b031680611419576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526007602090815260408083209386168352929052208054611484576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814610ef75760405162461bcd60e51b8152600401808060200182810382526023815260200180611d796023913960400191505060405180910390fd5b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561155857600080fd5b505afa15801561156c573d6000803e3d6000fd5b505050506040513d602081101561158257600080fd5b50516001600160a01b03163314610ef7576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b677ce66c50e284000081565b6000805460ff16611632576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b3361100514610ef75760405162461bcd60e51b815260040180806020018281038252602f815260200180611c6c602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610ef75760405162461bcd60e51b815260040180806020018281038252602e815260200180611d1c602e913960400191505060405180910390fd5b6221272160e91b81565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff1660021415611761576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61100381565b61200481565b60003361200214610ef7576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b60005460ff1615611864576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff16101561195457828160ff168151811061192857fe5b01602001516001600160f81b031916156119475781600101915061194c565b611954565b60010161190d565b5060608160ff166040519080825280601f01601f191660200182016040528015611985576020820181803683370190505b50905060005b8260ff168160ff1610156119e157838160ff16815181106119a857fe5b602001015160f81c60f81b828260ff16815181106119c257fe5b60200101906001600160f81b031916908160001a90535060010161198b565b5095945050505050565b61100481565b60006008821115611a1a57611a13836007198401600a0a63ffffffff611ad416565b9050611a34565b611a31836008849003600a0a63ffffffff611b2d16565b90505b92915050565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054611a71908463ffffffff611b6f16565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b600082611ae357506000611a34565b82820282848281611af057fe5b0414611a315760405162461bcd60e51b8152600401808060200182810382526021815260200180611cfb6021913960400191505060405180910390fd5b6000611a3183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bc9565b600082820183811015611a31576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008183611c555760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c1a578181015183820152602001611c02565b50505050905090810190601f168015611c475780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611c6157fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" }, "0x0000000000000000000000000000000000001005": { "balance": "0x0", From e0346f708c98a62b27715f904d359352da2d28e9 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 12:16:16 +0800 Subject: [PATCH 34/52] feat: add testnet genesis file --- genesis-testnet.json | 128 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 genesis-testnet.json diff --git a/genesis-testnet.json b/genesis-testnet.json new file mode 100644 index 00000000..76806eee --- /dev/null +++ b/genesis-testnet.json @@ -0,0 +1,128 @@ +{ + "config": { + "chainId": 97, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "ramanujanBlock": 0, + "nielsBlock": 0, + "mirrorSyncBlock":1, + "brunoBlock": 1, + "eulerBlock": 2, + "nanoBlock": 3, + "moranBlock": 3, + "gibbsBlock": 4, + "planckBlock": 5, + "lubanBlock": 6, + "platoBlock": 7, + "berlinBlock": 8, + "londonBlock": 8, + "hertzBlock": 8, + "hertzfixBlock": 8, + "shanghaiTime": 0, + "keplerTime": 0, + "feynmanTime": 0, + "parlia": { + "period": 3, + "epoch": 200 + } + }, + "nonce": "0x0", + "timestamp": "0x5e9da7ce", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000009fb29aac15b9a4b7f17c3385939b007540f4d7910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x2625a00", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE", + "alloc": { + "0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000001000": { + "balance": "0x0", + "code": "0x6080604052600436106104565760003560e01c80638c5d749d1161023f578063c81b166211610139578063e1c7392a116100b6578063f92eb86b1161007a578063f92eb86b14610b7f578063f9a2bbc714610b94578063fccc281314610ba9578063fd4ad81f14610bbe578063fd6a687914610bed5761045d565b8063e1c7392a14610b02578063e40716a114610b17578063ea321e4914610b2c578063eb57e20214610b4c578063f340fa0114610b6c5761045d565b8063d68fb56a116100fd578063d68fb56a14610a99578063daacdb6614610aae578063dc927faf14610ac3578063df8079e914610ad8578063e086c7b114610aed5761045d565b8063c81b166214610a3a578063c8509d81146107fc578063cb75a59214610a4f578063ce910b0c14610a64578063d58918ae14610a845761045d565b8063aa82dce1116101c7578063aef198a91161018b578063aef198a9146109c4578063b7ab4db5146109d9578063b8cf4ef1146109fb578063c466689d14610a10578063c6d3394514610a255761045d565b8063aa82dce114610938578063aad560631461094d578063ab51bb9614610962578063ac43175114610984578063ad3c9da6146109a45761045d565b80639fe0f8161161020e5780639fe0f816146108cf578063a0dc2758146108e4578063a1a11bf5146108f9578063a5422d5c1461090e578063a78abc16146109235761045d565b80638c5d749d146108705780638d19a410146108855780639369d7de146108a55780639dc09262146108ba5761045d565b80635192c82c1161035057806375d47a0a116102d8578063831d65d11161029c578063831d65d1146107fc578063862498821461081c57806388b32f11146108315780638a7beb01146108465780638b5ad0c91461085b5761045d565b806375d47a0a1461079357806378dfed4a146107a85780637a84ca2a146107bd5780637e434d54146107d2578063820dcaa8146107e75761045d565b8063565c56b31161031f578063565c56b3146106f757806360eba4fe1461071757806362b72cf5146107375780636969a25c1461074c5780636e47b4821461077e5761045d565b80635192c82c1461069857806351b4dce3146106ad57806351e80672146106c257806355614fcc146106d75761045d565b80632a0ffb6e116103de5780633b071dcc116103a25780633b071dcc1461061457806343756e5c1461063757806345cf9daf1461064c578063493279b1146106615780634df6e0c3146106835761045d565b80632a0ffb6e14610574578063300c356714610594578063321d398a146105b45780633365af3a146105d457806335409f7f146105f45761045d565b8063152ad3b811610425578063152ad3b8146104f35780631bd14ed8146105155780631e4c15241461052a5780631ff180691461054a578063280870281461055f5761045d565b806304c4fec61461046257806307a56847146104795780630e2374a5146104a45780631182b875146104c65761045d565b3661045d57005b600080fd5b34801561046e57600080fd5b50610477610c02565b005b34801561048557600080fd5b5061048e610c76565b60405161049b9190616d4d565b60405180910390f35b3480156104b057600080fd5b506104b9610c7c565b60405161049b9190616103565b3480156104d257600080fd5b506104e66104e1366004615fe9565b610c82565b60405161049b9190616223565b3480156104ff57600080fd5b50610508610d9e565b60405161049b9190616218565b34801561052157600080fd5b5061048e610da7565b34801561053657600080fd5b50610477610545366004615e17565b610dad565b34801561055657600080fd5b5061048e6110e1565b34801561056b57600080fd5b506104b96110e7565b34801561058057600080fd5b5061047761058f366004615d77565b6110ed565b3480156105a057600080fd5b506104776105af366004615daf565b61110e565b3480156105c057600080fd5b506105086105cf366004615f96565b611457565b3480156105e057600080fd5b506105086105ef366004615f96565b611526565b34801561060057600080fd5b5061047761060f366004615d77565b6115d7565b34801561062057600080fd5b5061062961173c565b60405161049b9291906161a8565b34801561064357600080fd5b506104b9611a18565b34801561065857600080fd5b5061048e611a1e565b34801561066d57600080fd5b50610676611a24565b60405161049b9190616d3e565b34801561068f57600080fd5b50610629611a29565b3480156106a457600080fd5b5061048e611bb5565b3480156106b957600080fd5b506104b9611bbb565b3480156106ce57600080fd5b506104b9611bc1565b3480156106e357600080fd5b506105086106f2366004615d77565b611bc7565b34801561070357600080fd5b5061048e610712366004615d77565b611c03565b34801561072357600080fd5b506104e6610732366004615f96565b611c54565b34801561074357600080fd5b5061048e611cfa565b34801561075857600080fd5b5061076c610767366004615f96565b611d00565b60405161049b96959493929190616130565b34801561078a57600080fd5b506104b9611d64565b34801561079f57600080fd5b506104b9611d6a565b3480156107b457600080fd5b5061048e611d70565b3480156107c957600080fd5b5061048e611d76565b3480156107de57600080fd5b506104b9611d7c565b3480156107f357600080fd5b5061048e611d82565b34801561080857600080fd5b50610477610817366004615fe9565b611d88565b34801561082857600080fd5b5061048e611da9565b34801561083d57600080fd5b5061048e611daf565b34801561085257600080fd5b50610508611db5565b34801561086757600080fd5b5061048e611dbe565b34801561087c57600080fd5b5061048e611dc4565b34801561089157600080fd5b5061048e6108a0366004615d77565b611de1565b3480156108b157600080fd5b50610477611e21565b3480156108c657600080fd5b506104b9611f35565b3480156108db57600080fd5b5061048e611f3b565b3480156108f057600080fd5b5061048e611f40565b34801561090557600080fd5b506104b9611f45565b34801561091a57600080fd5b506104e6611f4b565b34801561092f57600080fd5b50610508611f6a565b34801561094457600080fd5b506104b9611f73565b34801561095957600080fd5b506104b9611f79565b34801561096e57600080fd5b50610977611f7f565b60405161049b9190616d80565b34801561099057600080fd5b5061047761099f366004615f3a565b611f84565b3480156109b057600080fd5b5061048e6109bf366004615d77565b612976565b3480156109d057600080fd5b5061048e612988565b3480156109e557600080fd5b506109ee612995565b60405161049b9190616195565b348015610a0757600080fd5b5061048e612a80565b348015610a1c57600080fd5b5061048e612a85565b348015610a3157600080fd5b5061048e612a8b565b348015610a4657600080fd5b506104b9612a90565b348015610a5b57600080fd5b5061048e612a96565b348015610a7057600080fd5b506104e6610a7f366004615f96565b612a9c565b348015610a9057600080fd5b5061048e612aa9565b348015610aa557600080fd5b5061048e612aaf565b348015610aba57600080fd5b5061048e612aee565b348015610acf57600080fd5b506104b9612af4565b348015610ae457600080fd5b506104b9612afa565b348015610af957600080fd5b5061048e612b00565b348015610b0e57600080fd5b50610477612b05565b348015610b2357600080fd5b5061048e612cae565b348015610b3857600080fd5b50610508610b47366004615efb565b612cb4565b348015610b5857600080fd5b50610477610b67366004615d77565b612e3a565b610477610b7a366004615d77565b612f42565b348015610b8b57600080fd5b5061048e6132f8565b348015610ba057600080fd5b506104b96132fe565b348015610bb557600080fd5b506104b9613304565b348015610bca57600080fd5b50610bde610bd9366004615f96565b61330a565b60405161049b93929190616d56565b348015610bf957600080fd5b506104b96133cc565b6000610c0d33611de1565b9050600b8181548110610c1c57fe5b600091825260209091206001601690920201015460ff16610c585760405162461bcd60e51b8152600401610c4f906169f5565b60405180910390fd5b6000610c62612aaf565b9050610c7133838360016133d2565b505050565b60095481565b61200181565b60005460609060ff16610ca75760405162461bcd60e51b8152600401610c4f906163ab565b3361200014610cc85760405162461bcd60e51b8152600401610c4f90616b56565b600b54610d8657610cd7615923565b60015460005b81811015610d8257600b80546001810182556000919091528351600080516020616fc383398151915260169092029182019081556020808601516000805160206170038339815191528401805460ff1916911515919091179055604086015180518794610d5e93600080516020616fe3833981519152909101920190615952565b506060820151610d7490600383019060136159cc565b505050806001019050610cdd565b5050505b60405162461bcd60e51b8152600401610c4f9061665a565b60075460ff1681565b600f5481565b334114610dcc5760405162461bcd60e51b8152600401610c4f90616ba5565b3a15610dea5760405162461bcd60e51b8152600401610c4f90616934565b8251604080518281526020808402820101909152606090828015610e2857816020015b610e156159f9565b815260200190600190039081610e0d5790505b50905060005b82811015610ed2576040518060c00160405280878381518110610e4d57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001868381518110610e8f57fe5b60200260200101516001600160401b031681526020016000151581526020016000815250828281518110610ebf57fe5b6020908102919091010152600101610e2e565b50606080610ee083866135c4565b9150915060005b600154811015610fd657600060018281548110610f0057fe5b906000526020600020906004020160030154905080600014610fcd57600060018381548110610f2b57fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab8260018581548110610f5f57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b168152610f9a926001600160a01b039092169101616103565b6000604051808303818588803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b50505050505b50600101610ee7565b504715611044577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d4760405161100c9190616d4d565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015611042573d6000803e3d6000fd5b505b600060035581511561105a5761105a8282613aae565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b61200581565b3361200214610d865760405162461bcd60e51b8152600401610c4f90616d07565b33411461112d5760405162461bcd60e51b8152600401610c4f90616ba5565b601054431161114e5760405162461bcd60e51b8152600401610c4f90616584565b3a1561116c5760405162461bcd60e51b8152600401610c4f90616934565b60005460ff1661118e5760405162461bcd60e51b8152600401610c4f906163ab565b60006110023168056bc75e2d631000008111156111c5576111be8168056bc75e2d6310000063ffffffff61429d16565b91506111cc565b505061144d565b6040516309a99b4f60e41b815261100290639a99b4f0906111f39030908690600401616117565b602060405180830381600087803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112459190615fae565b91508161125357505061144d565b6000805b848110156112815785858281811061126b57fe5b9050602002013582019150806001019050611257565b508061128f5750505061144d565b6000806000805b8981101561144557848989838181106112ab57fe5b905060200201358802816112bb57fe5b0493508a8a828181106112ca57fe5b90506020020160208101906112df9190615d77565b6001600160a01b038116600090815260046020526040902054909350915081156113fb57600060018084038154811061131457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561138157836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516113749190616d4d565b60405180910390a26113f5565b600354611394908663ffffffff6142df16565b60039081558101546113ac908663ffffffff6142df16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b2906113ec908890616d4d565b60405180910390a25b5061143d565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516114349190616d4d565b60405180910390a25b600101611296565b505050505050505b5050436010555050565b600154600090821061146b57506000611521565b60006001600160a01b03166001838154811061148357fe5b60009182526020909120600490910201546001600160a01b031614806114b3575060085415806114b35750600a54155b806114c2575060085460095410155b806114d357506114d182611526565b155b806114fc57506000600b83815481106114e857fe5b906000526020600020906016020160000154115b806115105750600161150c612995565b5111155b1561151d57506000611521565b5060015b919050565b600154600090821061153a57506000611521565b600b548210611577576001828154811061155057fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611521565b6001828154811061158457fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156115d15750600b82815481106115b857fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b54611695576115e6615923565b60015460005b8181101561169157600b80546001810182556000919091528351600080516020616fc383398151915260169092029182019081556020808601516000805160206170038339815191528401805460ff191691151591909117905560408601518051879461166d93600080516020616fe3833981519152909101920190615952565b50606082015161168390600383019060136159cc565b5050508060010190506115ec565b5050505b3361100114806116a6575033612002145b6116c25760405162461bcd60e51b8152600401610c4f906163e2565b6001600160a01b038116600090815260046020526040902054806116e65750611739565b6001810390506000600b82815481106116fb57fe5b600091825260209091206001601690920201015460ff16905061171e8383614304565b80156117275750805b15610c71576009805460001901905550505b50565b60015460609081906000805b8281101561178f576001818154811061175d57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611787576001909101905b600101611748565b506060816040519080825280602002602001820160405280156117bc578160200160208202803683370190505b5090506060826040519080825280602002602001820160405280156117f557816020015b60608152602001906001900390816117e05790505b50600b54600094509091508414156119705760005b8481101561196a576001818154811061181f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611962576001818154811061184f57fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061187a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b81815481106118a757fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561193f5780601f106119145761010080835404028352916020019161193f565b820191906000526020600020905b81548152906001019060200180831161192257829003601f168201915b505050505082858151811061195057fe5b60209081029190910101526001909301925b60010161180a565b50611a0c565b60005b84811015611a0a576001818154811061198857fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611a0257600181815481106119b857fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106119e357fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611973565b505b909450925050505b9091565b61100181565b60085481565b606181565b6060806000600e549050600080600c5411611a45576015611a49565b600c545b90506060611a55612995565b90506060611a62826146c7565b905082825111611a79579094509250611a14915050565b83838351031015611a8b578282510393505b8315611ac15760c84304611aa783838388880360008a8a614835565b611abf8383838888038989038a8b8b8b510301614835565b505b606083604051908082528060200260200182016040528015611aed578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611b2657816020015b6060815260200190600190039081611b115790505b50905060005b85811015611ba757848181518110611b4057fe5b6020026020010151838281518110611b5457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611b8057fe5b6020026020010151828281518110611b9457fe5b6020908102919091010152600101611b2c565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b03811660009081526004602052604081205480611bef576000915050611521565b60001901611bfc81611526565b9392505050565b6001600160a01b03811660009081526004602052604081205480611c2b576000915050611521565b600180820381548110611c3a57fe5b906000526020600020906004020160030154915050919050565b60128181548110611c6157fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611cf25780601f10611cc757610100808354040283529160200191611cf2565b820191906000526020600020905b815481529060010190602001808311611cd557829003601f168201915b505050505081565b60105481565b60018181548110611d0d57fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b61100881565b6103e881565b600c5481565b61200381565b61271081565b3361200014610d865760405162461bcd60e51b8152600401610c4f90616b56565b60025481565b60115481565b60145460ff1681565b600a5481565b600060175460001415611dd957506001611dde565b506017545b90565b6001600160a01b03811660009081526004602052604081205480611e175760405162461bcd60e51b8152600401610c4f90616ade565b6000190192915050565b600b54611edf57611e30615923565b60015460005b81811015611edb57600b80546001810182556000919091528351600080516020616fc383398151915260169092029182019081556020808601516000805160206170038339815191528401805460ff1916911515919091179055604086015180518794611eb793600080516020616fe3833981519152909101920190615952565b506060820151611ecd90600383019060136159cc565b505050806001019050611e36565b5050505b600854611eec5760036008555b600a54611ef9576002600a555b6000611f0433611de1565b9050611f0f81611457565b611f2b5760405162461bcd60e51b8152600401610c4f906168b0565b611739338261498c565b61100781565b600381565b60c881565b61100681565b604051806101e001604052806101ab8152602001616e186101ab913981565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16611fa65760405162461bcd60e51b8152600401610c4f906163ab565b3361100714611fc75760405162461bcd60e51b8152600401610c4f90616962565b61202784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150614a249050565b156120dc576020811461204c5760405162461bcd60e51b8152600401610c4f90616268565b604080516020601f840181900481028201810190925282815260009161208a91858580838501838280828437600092019190915250614a7d92505050565b90506127106120b66018546120aa600f54856142df90919063ffffffff16565b9063ffffffff6142df16565b11156120d45760405162461bcd60e51b8152600401610c4f9061667e565b600655612933565b61214684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b60208201529150614a249050565b156121e0576020811461216b5760405162461bcd60e51b8152600401610c4f9061629f565b604080516020601f84018190048102820181019092528281526000916121a991858580838501838280828437600092019190915250614a7d92505050565b600c54909150806121b8575060155b8082106121d75760405162461bcd60e51b8152600401610c4f906165c6565b50600855612933565b61224984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b60208201529150614a249050565b156122e2576020811461226e5760405162461bcd60e51b8152600401610c4f90616331565b604080516020601f84018190048102820181019092528281526000916122ac91858580838501838280828437600092019190915250614a7d92505050565b90506000811180156122be5750600a81105b6122da5760405162461bcd60e51b8152600401610c4f90616c3a565b600a55612933565b61235684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e646964617465730000000000000060208201529150614a249050565b156123e5576020811461237b5760405162461bcd60e51b8152600401610c4f906162e5565b604080516020601f84018190048102820181019092528281526000916123b991858580838501838280828437600092019190915250614a7d92505050565b9050600d548111156123dd5760405162461bcd60e51b8152600401610c4f90616787565b600e55612933565b61244e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b60208201529150614a249050565b156124d057602081146124735760405162461bcd60e51b8152600401610c4f906169b0565b604080516020601f84018190048102820181019092528281526000916124b191858580838501838280828437600092019190915250614a7d92505050565b600d819055600e549091508110156124ca57600d54600e555b50612933565b61253484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b60208201529150614a249050565b156125e257602081146125595760405162461bcd60e51b8152600401610c4f90616376565b604080516020601f840181900481028201810190925282815260009161259791858580838501838280828437600092019190915250614a7d92505050565b9050600081116125b95760405162461bcd60e51b8152600401610c4f906164df565b60648111156125da5760405162461bcd60e51b8152600401610c4f90616527565b600c55612933565b61264e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527473797374656d52657761726442617365526174696f60581b60208201529150614a249050565b156126f757602081146126735760405162461bcd60e51b8152600401610c4f90616bf2565b604080516020601f84018190048102820181019092528281526000916126b191858580838501838280828437600092019190915250614a7d92505050565b90506127106126d16018546120aa600654856142df90919063ffffffff16565b11156126ef5760405162461bcd60e51b8152600401610c4f90616450565b600f55612933565b61276b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f73797374656d526577617264416e74694d4556526174696f000000000000000060208201529150614a249050565b1561281457602081146127905760405162461bcd60e51b8152600401610c4f9061670d565b604080516020601f84018190048102820181019092528281526000916127ce91858580838501838280828437600092019190915250614a7d92505050565b90506127106127ee600f546120aa600654856142df90919063ffffffff16565b111561280c5760405162461bcd60e51b8152600401610c4f90616821565b601855612933565b61287584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a8152690e8eae4dc98cadccee8d60b31b60208201529150614a249050565b1561291b576020811461289a5760405162461bcd60e51b8152600401610c4f90616623565b604080516020601f84018190048102820181019092528281526000916128d891858580838501838280828437600092019190915250614a7d92505050565b9050600381101580156128ec575060098111155b806128f75750806001145b6129135760405162461bcd60e51b8152600401610c4f90616a58565b601755612933565b60405162461bcd60e51b8152600401610c4f90616c97565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516129689493929190616236565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156129c4576129b081611526565b156129bc578160010191505b60010161299f565b506060816040519080825280602002602001820160405280156129f1578160200160208202803683370190505b5090506000915060005b83811015612a7857612a0c81611526565b15612a705760018181548110612a1e57fe5b600091825260209091206004909102015482516001600160a01b0390911690839085908110612a4957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b6001016129fb565b509250505090565b601581565b61027181565b600281565b61100281565b60175481565b60138181548110611c6157fe5b60185481565b6000612ab9612995565b519050600080600c5411612ace576015612ad2565b600c545b905080821115612ae0578091505b81612aea57600191505b5090565b60055481565b61100381565b61200481565b606481565b60005460ff1615612b285760405162461bcd60e51b8152600401610c4f90616a21565b612b30615a2e565b6000612b56604051806101e001604052806101ab8152602001616e186101ab9139614a82565b9150915080612b775760405162461bcd60e51b8152600401610c4f90616b15565b60005b826020015151811015612c9c57600183602001518281518110612b9957fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a090930151600390930192909255918601518051918501939185908110612c6f57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612b7a565b50506000805460ff1916600117905550565b600d5481565b601354600090815b81811015612dbd57612da585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612d0d57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d9b5780601f10612d7057610100808354040283529160200191612d9b565b820191906000526020600020905b815481529060010190602001808311612d7e57829003601f168201915b5050505050614c3e565b15612db5576001925050506115d1565b600101612cbc565b5060125460005b81811015612e2e57612e1586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612d0d57fe5b15612e2657600193505050506115d1565b600101612dc4565b50600095945050505050565b3361100114612e5b5760405162461bcd60e51b8152600401610c4f90616cbe565b600b54612f1957612e6a615923565b60015460005b81811015612f1557600b80546001810182556000919091528351600080516020616fc383398151915260169092029182019081556020808601516000805160206170038339815191528401805460ff1916911515919091179055604086015180518794612ef193600080516020616fe3833981519152909101920190615952565b506060820151612f0790600383019060136159cc565b505050806001019050612e70565b5050505b6000612f2482614ca2565b9050612f2f81611457565b15612f3e57612f3e828261498c565b5050565b334114612f615760405162461bcd60e51b8152600401610c4f90616ba5565b60005460ff16612f835760405162461bcd60e51b8152600401610c4f906163ab565b60003411612fa35760405162461bcd60e51b8152600401610c4f90616758565b3a15612fc15760405162461bcd60e51b8152600401610c4f90616934565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661300157610271600f556103e86006556014805460ff191660011790555b600f54601754600110801561301857506000601854115b1561303d57600160175403601754438161302e57fe5b06601854028161303a57fe5b04015b60008311801561304d5750600081115b156130fa57600061307661271061306a348563ffffffff614e2516565b9063ffffffff614e5f16565b905080156130f8576040516110029082156108fc029083906000818181858888f193505050501580156130ad573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516130dd9190616d4d565b60405180910390a16130f5848263ffffffff61429d16565b93505b505b60008311801561310c57506000600654115b156131b257600061312e61271061306a60065434614e2590919063ffffffff16565b905080156131b05760405161dead9082156108fc029083906000818181858888f19350505050158015613165573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516131959190616d4d565b60405180910390a16131ad848263ffffffff61429d16565b93505b505b81156132b05760006001808403815481106131c957fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561323657846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4856040516132299190616d4d565b60405180910390a26132aa565b600354613249908563ffffffff6142df16565b6003908155810154613261908563ffffffff6142df16565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055906132a1908790616d4d565b60405180910390a25b506132f2565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516132e99190616d4d565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b818154811061331757fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff909116949192918301828280156133c25780601f10613397576101008083540402835291602001916133c2565b820191906000526020600020905b8154815290600101906020018083116133a557829003601f168201915b5050505050905083565b61100481565b6000600a54600014806133e3575082155b806133ee5750600954155b156133fb575060006135bc565b60096000815460019003919050819055506000613446600a5461306a8661306a600b8a8154811061342857fe5b6000918252602090912060169091020154439063ffffffff61429d16565b90506000600b868154811061345757fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156134bc57600080fd5b505afa1580156134d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f49190615fc6565b91509150600093508083106135725761350d8888614304565b506040516328aa02b160e01b8152611001906328aa02b190613537908b9087908a90600401616172565b600060405180830381600087803b15801561355157600080fd5b505af1158015613565573d6000803e3d6000fd5b5050505060019350613584565b8183106135845761358288614ca2565b505b6040516001600160a01b038916907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050505b949350505050565b6060806000808080806135d5612aaf565b6001549091505b801561380757600181039250600b83815481106135f557fe5b600091825260209091206001601690920201015460ff16613615576137fe565b6001838154811061362257fe5b600091825260208220600490910201546001600160a01b0316955061364c908690859085906133d2565b935083613658576137fe565b60405163436aa28360e11b81526000908190612002906386d5450690613682908a90600401616103565b60206040518083038186803b15801561369a57600080fd5b505afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d29190615d93565b90506001600160a01b0381161561375b576040516302ceee9160e11b81526120029063059ddd2290613708908490600401616103565b60206040518083038186803b15801561372057600080fd5b505afa158015613734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137589190615d93565b91505b60005b8c518110156137fa57876001600160a01b03168d828151811061377d57fe5b6020026020010151600001516001600160a01b031614806137c65750826001600160a01b03168d82815181106137af57fe5b6020026020010151600001516001600160a01b0316145b156137f25760018d82815181106137d957fe5b60209081029190910101519015156080909101526137fa565b60010161375e565b5050505b600019016135dc565b5060005b89518110156138745789818151811061382057fe5b60200260200101516080015180613860575060006001600160a01b03168a828151811061384957fe5b6020026020010151600001516001600160a01b0316145b1561386c578560010195505b60010161380b565b508851851061395c5760408051600180825281830190925290816020015b61389a6159f9565b815260200190600190039081613892575050604080516001808252818301909252919850602082015b60608152602001906001900390816138c3579050509550886000815181106138e757fe5b6020026020010151876000815181106138fc57fe5b60200260200101819052508760008151811061391457fe5b60200260200101518660008151811061392957fe5b602002602001018190525060008760008151811061394357fe5b6020908102919091010151901515608090910152613aa1565b8489510360405190808252806020026020018201604052801561399957816020015b6139866159f9565b81526020019060019003908161397e5790505b509650848951036040519080825280602002602001820160405280156139d357816020015b60608152602001906001900390816139be5790505b5095506000915060005b8951811015613a9f578981815181106139f257fe5b602002602001015160800151158015613a35575060006001600160a01b03168a8281518110613a1d57fe5b6020026020010151600001516001600160a01b031614155b15613a9757898181518110613a4657fe5b6020026020010151888481518110613a5a57fe5b6020026020010181905250888181518110613a7157fe5b6020026020010151878481518110613a8557fe5b60200260200101819052508260010192505b6001016139dd565b505b50505050505b9250929050565b600154825160005b82811015613bcb576001613ac86159f9565b60018381548110613ad557fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613b9f57878181518110613b6557fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415613b975760009250613b9f565b600101613b51565b508115613bc15780516001600160a01b03166000908152600460205260408120555b5050600101613ab6565b5080821115613c8a57805b82811015613c88576001805480613be957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480613c3c57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590613c6e6002830182615a52565b613c7c600383016000615a96565b50509055600101613bd6565b505b6000818310613c995781613c9b565b825b905060005b8181101561403f57613d4d868281518110613cb757fe5b602002602001015160018381548110613ccc57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152614ea1565b613f01578060010160046000888481518110613d6557fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110613da157fe5b602002602001015160018281548110613db657fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110613e7157fe5b6020026020010151600b8281548110613e8657fe5b90600052602060002090601602016002019080519060200190613eaa929190615952565b506000600b8281548110613eba57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110613eeb57fe5b6000918252602090912060169091020155614037565b858181518110613f0d57fe5b60200260200101516060015160018281548110613f2657fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b03160217905550613fec858281518110613f6a57fe5b6020026020010151600b8381548110613f7f57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612d9b5780601f10612d7057610100808354040283529160200191612d9b565b61403757848181518110613ffc57fe5b6020026020010151600b828154811061401157fe5b90600052602060002090601602016002019080519060200190614035929190615952565b505b600101613ca0565b508282111561421757614050615923565b835b838110156142145785818151811061406657fe5b60200260200101518260400181905250600187828151811061408457fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616fc38339815191528101918255858301516000805160206170038339815191528201805491151560ff19909216919091179055928501518051869492936141ba93600080516020616fe383398151915201920190615952565b5060608201516141d090600383019060136159cc565b50505080600101600460008984815181106141e757fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101614052565b50505b61421f614efd565b6142276150df565b6000600981905560015493505b83811015614295576000600b828154811061424b57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061427c57fe5b6000918252602090912060169091020155600101614234565b505050505050565b6000611bfc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152cd565b600082820183811015611bfc5760405162461bcd60e51b8152600401610c4f90616419565b6000806001838154811061431457fe5b9060005260206000209060040201600301549050600060018080549050039050600161433e612995565b51116143735760006001858154811061435357fe5b9060005260206000209060040201600301819055506000925050506115d1565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143ac9190616d4d565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561459957600181600101815481106143ed57fe5b90600052602060002090600402016001828154811061440857fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106144c957fe5b9060005260206000209060160201600b82815481106144e457fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff199092169190911790556002808401805461453b938386019390821615610100026000190190911604615aa5565b5061454e60038281019084016013615b1a565b5090505080600101600460006001848154811061456757fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020556001016143cf565b5060018054806145a557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806145f857fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061462a6002830182615a52565b614638600383016000615a96565b50509055600081838161464757fe5b04905080156146bb5760015460005b818110156146b85761468f836001838154811061466f57fe5b9060005260206000209060040201600301546142df90919063ffffffff16565b6001828154811061469c57fe5b6000918252602090912060036004909202010155600101614656565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561470657816020015b60608152602001906001900390816146f15790505b50600b54909150831461471d579250611521915050565b60005b8281101561482c57600b60016004600089858151811061473c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054038154811061477057fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156148085780601f106147dd57610100808354040283529160200191614808565b820191906000526020600020905b8154815290600101906020018083116147eb57829003601f168201915b505050505082828151811061481957fe5b6020908102919091010152600101614720565b50949350505050565b60005b8281101561498257600082878388016040516020016148589291906160f5565b6040516020818303038152906040528051906020012060001c8161487857fe5b06905080850182870114614979576000898388018151811061489657fe5b60200260200101519050606089848901815181106148b057fe5b602002602001015190508a838801815181106148c857fe5b60200260200101518b858a01815181106148de57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061490d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061493b57fe5b60200260200101518a858a018151811061495157fe5b6020026020010181905250808a8489018151811061496b57fe5b602002602001018190525050505b50600101614838565b5050505050505050565b600980546001908101909155600b8054839081106149a657fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106149dc57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b600081604051602001614a3791906160d9565b6040516020818303038152906040528051906020012083604051602001614a5e91906160d9565b6040516020818303038152906040528051906020012014905092915050565b015190565b614a8a615a2e565b6000614a94615a2e565b614a9c615b44565b614aad614aa8866152f9565b61531e565b90506000805b614abc83615368565b15614c305780614ae157614ad7614ad284615389565b6153d7565b60ff168452614c28565b8060011415614c23576060614afd614af885615389565b615457565b90508051604051908082528060200260200182016040528015614b3a57816020015b614b276159f9565b815260200190600190039081614b1f5790505b5085602001819052508051604051908082528060200260200182016040528015614b7857816020015b6060815260200190600190039081614b635790505b50604086015260005b8151811015614c1857614b926159f9565b60606000614bb2858581518110614ba557fe5b6020026020010151615528565b92509250925080614bd2578860009a509a50505050505050505050614c39565b8289602001518581518110614be357fe5b60200260200101819052508189604001518581518110614bff57fe5b6020026020010181905250505050806001019050614b81565b506001925050614c28565b614c30565b600101614ab3565b50919350909150505b915091565b815181516000916001918114808314614c5a5760009250614c98565b600160208701838101602088015b600284838510011415614c93578051835114614c875760009650600093505b60209283019201614c68565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614ccb57506000199050611521565b600181039050600060018281548110614ce057fe5b9060005260206000209060040201600301549050600060018381548110614d0357fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614d5c908590616d4d565b60405180910390a280614d7457829350505050611521565b6000818381614d7f57fe5b0490508015614e1b5760005b84811015614dcd57614da4826001838154811061466f57fe5b60018281548110614db157fe5b6000918252602090912060036004909202010155600101614d8b565b50600180549085015b81811015614e1857614def836001838154811061466f57fe5b60018281548110614dfc57fe5b6000918252602090912060036004909202010155600101614dd6565b50505b5091949350505050565b600082614e34575060006115d1565b82820282848281614e4157fe5b0414611bfc5760405162461bcd60e51b8152600401610c4f906168f3565b6000611bfc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615642565b805182516000916001600160a01b039182169116148015614edb575081602001516001600160a01b031683602001516001600160a01b0316145b8015611bfc5750506040908101519101516001600160a01b0390811691161490565b60125460135480821115614f4857805b82811015614f46576012805480614f2057fe5b600190038181906000526020600020016000614f3c9190615a52565b9055600101614f0d565b505b6000818310614f575781614f59565b825b905060005b818110156150715761501660128281548110614f7657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156150045780601f10614fd957610100808354040283529160200191615004565b820191906000526020600020905b815481529060010190602001808311614fe757829003601f168201915b505050505060138381548110612d0d57fe5b615069576013818154811061502757fe5b906000526020600020016012828154811061503e57fe5b906000526020600020019080546001816001161561010002031660029004615067929190615aa5565b505b600101614f5e565b5082821115610c7157825b828110156132f25760126013828154811061509357fe5b60009182526020808320845460018181018755958552919093209290910180546150d6949390920192909160026101009282161592909202600019011604615aa5565b5060010161507c565b601354600b548082111561512a57805b8281101561512857601380548061510257fe5b60019003818190600052602060002001600061511e9190615a52565b90556001016150ef565b505b6000818310615139578161513b565b825b905060005b8181101561525a576151f86013828154811061515857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156151e65780601f106151bb576101008083540402835291602001916151e6565b820191906000526020600020905b8154815290600101906020018083116151c957829003601f168201915b5050505050600b8381548110613f7f57fe5b61525257600b818154811061520957fe5b90600052602060002090601602016002016013828154811061522757fe5b906000526020600020019080546001816001161561010002031660029004615250929190615aa5565b505b600101615140565b5082821115610c7157825b828110156132f2576013600b828154811061527c57fe5b6000918252602080832084546001808201875595855291909320601692909202909201600290810180546152c495939094019390926000199082161561010002011604615aa5565b50600101615265565b600081848411156152f15760405162461bcd60e51b8152600401610c4f9190616223565b505050900390565b615301615b64565b506040805180820190915281518152602082810190820152919050565b615326615b44565b61532f82615679565b61533857600080fd5b600061534783602001516156b3565b60208085015160408051808201909152868152920190820152915050919050565b6000615372615b64565b505080518051602091820151919092015191011190565b615391615b64565b61539a82615368565b6153a357600080fd5b602082015160006153b382615716565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906153ec57508151602110155b6153f557600080fd5b600061540483602001516156b3565b9050808360000151101561542a5760405162461bcd60e51b8152600401610c4f90616aa7565b82516020808501518301805192849003929183101561482c57506020919091036101000a90049392505050565b606061546282615679565b61546b57600080fd5b6000615476836157f7565b90506060816040519080825280602002602001820160405280156154b457816020015b6154a1615b64565b8152602001906001900390816154995790505b50905060006154c685602001516156b3565b60208601510190506000805b8481101561551d576154e383615716565b915060405180604001604052808381526020018481525084828151811061550657fe5b6020908102919091010152918101916001016154d2565b509195945050505050565b6155306159f9565b6060600061553c6159f9565b6060615546615b44565b61554f8761531e565b90506000805b61555e83615368565b1561563357806155895761557961557484615389565b615853565b6001600160a01b0316855261562b565b80600114156155b15761559e61557484615389565b6001600160a01b0316602086015261562b565b80600214156155d9576155c661557484615389565b6001600160a01b0316604086015261562b565b8060031415615605576155ee614ad284615389565b6001600160401b031660608601526001915061562b565b80600414156156265761561f61561a84615389565b61586d565b935061562b565b615633565b600101615555565b50929791965091945092505050565b600081836156635760405162461bcd60e51b8152600401610c4f9190616223565b50600083858161566f57fe5b0495945050505050565b805160009061568a57506000611521565b6020820151805160001a9060c08210156156a957600092505050611521565b5060019392505050565b8051600090811a60808110156156cd576000915050611521565b60b88110806156e8575060c081108015906156e8575060f881105b156156f7576001915050611521565b60c081101561570b5760b519019050611521565b60f519019050611521565b80516000908190811a608081101561573157600191506157f0565b60b881101561574657607e19810191506157f0565b60c081101561579757600060b78203600186019550806020036101000a8651049150600181018201935050808310156157915760405162461bcd60e51b8152600401610c4f906167f6565b506157f0565b60f88110156157ac5760be19810191506157f0565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156157ee5760405162461bcd60e51b8152600401610c4f906167f6565b505b5092915050565b805160009061580857506000611521565b6000809050600061581c84602001516156b3565b602085015185519181019250015b8082101561584a5761583b82615716565b8201915082600101925061582a565b50909392505050565b805160009060151461586457600080fd5b6115d1826153d7565b805160609061587b57600080fd5b600061588a83602001516156b3565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156158c1576020820181803683370190505b509050600081602001905061482c848760200151018285806158e257610c71565b5b60208110615902578251825260209283019290910190601f19016158e3565b915181516020939093036101000a6000190180199091169216919091179052565b6040518060800160405280600081526020016000151581526020016060815260200161594d615b7e565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061599357805160ff19168380011785556159c0565b828001600101855582156159c0579182015b828111156159c05782518255916020019190600101906159a5565b50612aea929150615b9d565b82601381019282156159c057916020028201828111156159c05782518255916020019190600101906159a5565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040518060600160405280600060ff16815260200160608152602001606081525090565b50805460018160011615610100020316600290046000825580601f10615a785750611739565b601f0160209004906000526020600020908101906117399190615b9d565b50611739906013810190615b9d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615ade57805485556159c0565b828001600101855582156159c057600052602060002091601f016020900482015b828111156159c0578254825591600101919060010190615aff565b82601381019282156159c057918201828111156159c0578254825591600101919060010190615aff565b6040518060400160405280615b57615b64565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b611dde91905b80821115612aea5760008155600101615ba3565b80356115d181616e02565b60008083601f840112615bd3578182fd5b5081356001600160401b03811115615be9578182fd5b6020830191508360208083028501011115613aa757600080fd5b6000601f8381840112615c14578182fd5b8235615c27615c2282616db7565b616d91565b818152925060208084019085810160005b84811015615cb9578135880189603f820112615c5357600080fd5b838101356001600160401b03811115615c6b57600080fd5b615c7c818901601f19168601616d91565b81815260408c81848601011115615c9257600080fd5b82818501888401375060009181018601919091528552509282019290820190600101615c38565b50505050505092915050565b600082601f830112615cd5578081fd5b8135615ce3615c2282616db7565b818152915060208083019084810181840286018201871015615d0457600080fd5b6000805b85811015615cb95782356001600160401b0381168114615d26578283fd5b85529383019391830191600101615d08565b60008083601f840112615d49578182fd5b5081356001600160401b03811115615d5f578182fd5b602083019150836020828501011115613aa757600080fd5b600060208284031215615d88578081fd5b8135611bfc81616e02565b600060208284031215615da4578081fd5b8151611bfc81616e02565b60008060008060408587031215615dc4578283fd5b84356001600160401b0380821115615dda578485fd5b615de688838901615bc2565b90965094506020870135915080821115615dfe578384fd5b50615e0b87828801615bc2565b95989497509550505050565b600080600060608486031215615e2b578283fd5b83356001600160401b0380821115615e41578485fd5b81860187601f820112615e52578586fd5b80359250615e62615c2284616db7565b80848252602080830192508084018b828389028701011115615e8257898afd5b8994505b86851015615eac57615e988c82615bb7565b845260019490940193928101928101615e86565b509097508801359350505080821115615ec3578384fd5b615ecf87838801615cc5565b93506040860135915080821115615ee4578283fd5b50615ef186828701615c03565b9150509250925092565b60008060208385031215615f0d578182fd5b82356001600160401b03811115615f22578283fd5b615f2e85828601615d38565b90969095509350505050565b60008060008060408587031215615f4f578384fd5b84356001600160401b0380821115615f65578586fd5b615f7188838901615d38565b90965094506020870135915080821115615f89578384fd5b50615e0b87828801615d38565b600060208284031215615fa7578081fd5b5035919050565b600060208284031215615fbf578081fd5b5051919050565b60008060408385031215615fd8578182fd5b505080516020909101519092909150565b600080600060408486031215615ffd578081fd5b833560ff8116811461600d578182fd5b925060208401356001600160401b03811115616027578182fd5b61603386828701615d38565b9497909650939450505050565b6000815180845260208085019450808401835b838110156160785781516001600160a01b031687529582019590820190600101616053565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526160c5816020860160208601616dd6565b601f01601f19169290920160200192915050565b600082516160eb818460208701616dd6565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b600060208252611bfc6020830184616040565b6000604082526161bb6040830185616040565b602083820381850152818551808452828401915082838202850101838801865b8381101561620957601f198784030185526161f78383516160ad565b948601949250908501906001016161db565b50909998505050505050505050565b901515815260200190565b600060208252611bfc60208301846160ad565b60006040825261624a604083018688616083565b828103602084015261625d818587616083565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526063908201527f7468652073797374656d52657761726442617365526174696f20706c7573206260408201527f75726e526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252601d908201527f6c656e677468206f66207475726e4c656e677468206d69736d61746368000000604082015260600190565b6020808252600a908201526919195c1c9958d85d195960b21b604082015260600190565b60208082526063908201527f746865206275726e526174696f20706c75732073797374656d5265776172644260408201527f617365526174696f20616e642073797374656d526577617264416e74694d455660608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b6020808252602b908201527f6c656e677468206f662073797374656d526577617264416e74694d455652617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526063908201527f7468652073797374656d526577617264416e74694d4556526174696f20706c7560408201527f73206275726e526174696f20616e642073797374656d5265776172644261736560608201527f526174696f206d757374206265206e6f2067726561746572207468616e20313060808201526203030360ec1b60a082015260c00190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252602f908201527f746865207475726e4c656e6774682073686f756c6420626520696e205b332c3960408201526e5d206f7220657175616c20746f203160881b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526028908201527f6c656e677468206f662073797374656d52657761726442617365526174696f206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152616d7760608301846160ad565b95945050505050565b63ffffffff91909116815260200190565b6040518181016001600160401b0381118282101715616daf57600080fd5b604052919050565b60006001600160401b03821115616dcc578081fd5b5060209081020190565b60005b83811015616df1578181015183820152602001616dd9565b838111156132f25750506000910152565b6001600160a01b038116811461173957600080fdfef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a784100000000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001001": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80638256ace61161015c578063c80d4b8f116100ce578063dcc6f15611610087578063dcc6f156146104b6578063df8079e9146104be578063e1c7392a146104c6578063f9a2bbc7146104ce578063fc4333cd146104d6578063fd6a6879146104de5761028a565b8063c80d4b8f14610478578063c81b166214610480578063c8509d8114610405578063c96be4cb14610488578063cc844b731461049b578063dc927faf146104ae5761028a565b8063a78abc1611610120578063a78abc1614610430578063aa82dce114610438578063aad5606314610440578063ab51bb9614610448578063ac0af6291461045d578063ac431751146104655761028a565b80638256ace6146103fd578063831d65d1146104055780639dc09262146104185780639f804f5f14610420578063a1a11bf5146104285761028a565b806343756e5c116102005780635bfb4990116101b95780635bfb4990146103c257806362b72cf5146103d55780636e47b482146103dd57806375d47a0a146103e55780637912a65d146103ed5780637e434d54146103f55761028a565b806343756e5c14610385578063493279b11461038d57806350055f90146103a257806351b4dce3146103aa57806351e80672146103b2578063567a372d146103ba5761028a565b80632808702811610252578063280870281461031957806328aa02b1146103215780633306ccca1461033457806335aa2e441461034957806337c8dab91461035c578063389f4f711461037d5761028a565b80630e2374a51461028f5780631182b875146102ad57806322d1e80b146102cd57806323bac5a2146102e25780632796211814610304575b600080fd5b6102976104e6565b6040516102a49190612b25565b60405180910390f35b6102c06102bb366004612a3e565b6104ec565b6040516102a49190612b5d565b6102d5610552565b6040516102a49190612b52565b6102f56102f0366004612743565b61055b565b6040516102a4939291906132c0565b61031761031236600461289b565b61057e565b005b6102976108d3565b61031761032f36600461277b565b6108d9565b61033c61090a565b6040516102a49190613288565b610297610357366004612a0e565b610910565b61036f61036a366004612743565b610937565b6040516102a49291906132b2565b61033c61098e565b610297610994565b61039561099a565b6040516102a49190613279565b61033c61099f565b6102976109a5565b6102976109ab565b61033c6109b1565b6103176103d0366004612743565b6109b7565b61033c610a3f565b610297610a45565b610297610a4b565b61033c610a51565b610297610a56565b61036f610a5c565b610317610413366004612a3e565b610a66565b610297610a87565b61033c610a8d565b610297610a93565b6102d5610a99565b610297610aa2565b610297610aa8565b610450610aae565b6040516102a491906132d8565b61033c610ab3565b6103176104733660046128f2565b610ab8565b61033c611054565b610297611059565b610317610496366004612743565b61105f565b6103176104a936600461295b565b61137c565b61029761181b565b61033c611821565b610297611826565b61031761182c565b610297611868565b61031761186e565b610297611cb7565b61200181565b606033612000146105185760405162461bcd60e51b815260040161050f90613153565b60405180910390fd5b60005460ff1661053a5760405162461bcd60e51b815260040161050f90612c49565b60405162461bcd60e51b815260040161050f90612e18565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166105a05760405162461bcd60e51b815260040161050f90612c49565b6006546105ad5760146006555b6008546105bb576170806008555b8151158015906105cb5750805115155b6105e75760405162461bcd60e51b815260040161050f906130e8565b60408051600380825260808201909252606091816020015b60608152602001906001900390816105ff5790505090506106206061611cbd565b8160008151811061062d57fe5b602002602001018190525061064183611cd8565b8160018151811061064e57fe5b602002602001018190525061066282611cd8565b8160028151811061066f57fe5b6020026020010181905250606061068582611d2e565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa6106c657600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d54506906106f9908690600401612b25565b60206040518083038186803b15801561071157600080fd5b505afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610749919061275f565b6001600160a01b031614156107705760405162461bcd60e51b815260040161050f90612c19565b43600854820110156107945760405162461bcd60e51b815260040161050f90612bba565b604051631871f7d960e31b81526120029063c38fbec8906107b9908590600401612b25565b600060405180830381600087803b1580156107d357600080fd5b505af11580156107e7573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f9150610810908590600401612b25565b600060405180830381600087803b15801561082a57600080fd5b505af115801561083e573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906108769033908590600401612b39565b602060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c89190612a26565b505050505050505050565b61200581565b33611000146108fa5760405162461bcd60e51b815260040161050f90612e9e565b610905838383611dbf565b505050565b61708081565b6001818154811061091d57fe5b6000918252602090912001546001600160a01b0316905081565b600080610942612576565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b61100181565b606181565b60065481565b61200681565b61200081565b60045481565b33611000146109d85760405162461bcd60e51b815260040161050f90612e9e565b60005460ff166109fa5760405162461bcd60e51b815260040161050f90612c49565b806001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c6000604051610a349190612b70565b60405180910390a250565b60035481565b61100581565b61100881565b603281565b61200381565b6004546005549091565b33612000146105185760405162461bcd60e51b815260040161050f90613153565b61100781565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610ada5760405162461bcd60e51b815260040161050f90612c49565b3361100714610afb5760405162461bcd60e51b815260040161050f90612fd7565b610b6684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611ff89050565b15610c015760208114610b8b5760405162461bcd60e51b815260040161050f90612e2a565b604080516020601f8401819004810282018101909252828152600091610bc99185858083850183828082843760009201919091525061205292505050565b905060018110158015610bdd575060055481105b610bf95760405162461bcd60e51b815260040161050f9061310e565b600455611011565b610c6784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611ff89050565b15610d035760208114610c8c5760405162461bcd60e51b815260040161050f90613025565b604080516020601f8401819004810282018101909252828152600091610cca9185858083850183828082843760009201919091525061205292505050565b90506103e88111158015610cdf575060045481115b610cfb5760405162461bcd60e51b815260040161050f90612d02565b600555611011565b610d7084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b60208201529150611ff89050565b15610e0a5760208114610d955760405162461bcd60e51b815260040161050f90612f5f565b604080516020601f8401819004810282018101909252828152600091610dd39185858083850183828082843760009201919091525061205292505050565b9050600a8110158015610de65750606481105b610e025760405162461bcd60e51b815260040161050f90613067565b600655611011565b610e7e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611ff89050565b15610ef55760208114610ea35760405162461bcd60e51b815260040161050f90612d37565b604080516020601f8401819004810282018101909252828152610edf919084848083850183828082843760009201919091525061205792505050565b6007805460ff1916911515919091179055611011565b610f5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b60208201529150611ff89050565b15610ff95760208114610f815760405162461bcd60e51b815260040161050f90612eee565b604080516020601f8401819004810282018101909252828152600091610fbf9185858083850183828082843760009201919091525061205292505050565b90506170808110158015610fd55750620d2f0081105b610ff15760405162461bcd60e51b815260040161050f90612c80565b600855611011565b60405162461bcd60e51b815260040161050f906131ef565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516110469493929190612b88565b60405180910390a150505050565b609681565b61100281565b33411461107e5760405162461bcd60e51b815260040161050f906131a2565b60005460ff166110a05760405162461bcd60e51b815260040161050f90612c49565b60035443116110c15760405162461bcd60e51b815260040161050f90613244565b3a156110df5760405162461bcd60e51b815260040161050f90612f31565b60405163155853f360e21b8152611000906355614fcc90611104908490600401612b25565b60206040518083038186803b15801561111c57600080fd5b505afa158015611130573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611154919061287f565b61115d57611375565b611165612576565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff1615801592820192909252906111c0576020810180516001019052611219565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161122b57fe5b066112a357600060208201526040516335409f7f60e01b8152611000906335409f7f9061125c908590600401612b25565b600060405180830381600087803b15801561127657600080fd5b505af115801561128a573d6000803e3d6000fd5b5050505061129e8282602001516000611dbf565b61130f565b6004548160200151816112b257fe5b0661130f576040516375abf10160e11b81526110009063eb57e202906112dc908590600401612b25565b600060405180830381600087803b1580156112f657600080fd5b505af115801561130a573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff1661139e5760405162461bcd60e51b815260040161050f90612c49565b60075460ff166113c05760405162461bcd60e51b815260040161050f90612be4565b6006546113cd5760146006555b6008546113db576170806008555b6008548151604001514391011180156113ff57504360085482602001516040015101115b61141b5760405162461bcd60e51b815260040161050f90613216565b8060200151602001518160000151602001511480156114495750806020015160600151816000015160600151145b156114665760405162461bcd60e51b815260040161050f90612e71565b8051604081015190511080156114855750602081015160408101519051105b6114a15760405162461bcd60e51b815260040161050f90612de1565b6020810151518151511080156114c65750806000015160400151816020015160400151105b806114f157508051516020820151511080156114f15750806020015160400151816000015160400151105b8061150b5750806020015160400151816000015160400151145b6115275760405162461bcd60e51b815260040161050f90612ccb565b604080820151905163ea321e4960e01b81526110009163ea321e49916115509190600401612b5d565b60206040518083038186803b15801561156857600080fd5b505afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a0919061287f565b6115bc5760405162461bcd60e51b815260040161050f90612fa8565b6115ce8160000151826040015161207f565b80156115e757506115e78160200151826040015161207f565b6116035760405162461bcd60e51b815260040161050f90612d82565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561164157600080fd5b505afa158015611655573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261167d91908101906127bc565b9150915060005b81518110156117ba576116ae82828151811061169c57fe5b60200260200101518560400151612257565b156117b2576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906116e69033908590600401612b39565b602060405180830381600087803b15801561170057600080fd5b505af1158015611714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117389190612a26565b506110006001600160a01b03166335409f7f85848151811061175657fe5b60200260200101516040518263ffffffff1660e01b815260040161177a9190612b25565b600060405180830381600087803b15801561179457600080fd5b505af11580156117a8573d6000803e3d6000fd5b50505050506117ba565b600101611684565b506040808401519051630e9fbf5160e01b815261200291630e9fbf51916117e49190600401612b5d565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b50505050505050565b61100381565b601481565b61200481565b60005460ff161561184f5760405162461bcd60e51b815260040161050f906130b1565b603260045560966005556000805460ff19166001179055565b61100081565b336110001461188f5760405162461bcd60e51b815260040161050f90612e9e565b60005460ff166118b15760405162461bcd60e51b815260040161050f90612c49565b6001546118bd57611cb5565b600154600090600019015b808211611c89576000805b828410156119ec576118e3612576565b60026000600187815481106118f457fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156119d65760046005548161196157fe5b0481602001510381602001818152505080600260006001888154811061198357fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff19169115159190911790556119e0565b60019250506119ec565b508360010193506118d3565b828411611b83576119fb612576565b6002600060018681548110611a0c57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611af457600460055481611a7957fe5b04816020015103816020018181525050806002600060018781548110611a9b57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611b839050565b6002600060018681548110611b0557fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611b4957fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611b765750611b83565b50600019909201916119ec565b818015611b8d5750805b15611c6c576002600060018681548110611ba357fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611bea57fe5b600091825260209091200154600180546001600160a01b039092169186908110611c1057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611c4957fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611c78575050611c89565b5050600190910190600019016118c8565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b6060611cd0611ccb836122bb565b611cd8565b90505b919050565b606081516001148015611d0a5750607f60f81b82600081518110611cf857fe5b01602001516001600160f81b03191611155b15611d16575080611cd3565b611cd0611d288351608060ff166123a1565b83612473565b6060815160001415611d4f5750604080516000815260208101909152611cd3565b606082600081518110611d5e57fe5b602002602001015190506000600190505b8351811015611d9f57611d9582858381518110611d8857fe5b6020026020010151612473565b9150600101611d6f565b50611db8611db2825160c060ff166123a1565b82612473565b9392505050565b8015611e21576040516375cc7d8960e01b8152612002906375cc7d8990611dea908690600401612b25565b600060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b50505050610905565b6040516375cc7d8960e01b8152612002906375cc7d8990611e46908690600401612b25565b600060405180830381600087803b158015611e6057600080fd5b505af1925050508015611e71575060015b610905576040516000815260443d1015611e8d57506000611f2a565b60046000803e60005160e01c6308c379a08114611eae576000915050611f2a565b60043d036004833e81513d602482011167ffffffffffffffff82111715611eda57600092505050611f2a565b808301805167ffffffffffffffff811115611efc576000945050505050611f2a565b8060208301013d8601811115611f1a57600095505050505050611f2a565b601f01601f191660405250925050505b80611f355750611f7e565b836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c8483604051611f70929190613291565b60405180910390a250611ff3565b3d808015611fa8576040519150601f19603f3d011682016040523d82523d6000602084013e611fad565b606091505b50836001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c8483604051611fe9929190613291565b60405180910390a2505b610905565b60008160405160200161200b9190612b09565b60405160208183030381529060405280519060200120836040516020016120329190612b09565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615612071576001915081612077565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b606081526020019060019003908161209b5750506040805160208082528183019092529192506060919080820181803683370190505090506120e08560000151611cbd565b826000815181106120ed57fe5b602002602001018190525061210860208660200151836124f0565b61211181611cd8565b8260018151811061211e57fe5b60200260200101819052506121368560400151611cbd565b8260028151811061214357fe5b602002602001018190525061215e60208660600151836124f0565b61216781611cd8565b8260038151811061217457fe5b602002602001018190525061219a602061218d84611d2e565b80519060200120836124f0565b6040805160b080825260e082019092526060916020820181803683370190505090506121ca818360006020612500565b6121dc81876080015160206060612500565b6121ea818660806030612500565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa61222757600080fd5b50600161223582600061255a565b60ff161461224a57600094505050505061204c565b5060019695505050505050565b81518151600091600191811480831461227357600092506122b1565b600160208701838101602088015b6002848385100114156122ac5780518351146122a05760009650600093505b60209283019201612281565b505050505b5090949350505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166122ff57506018612323565b6fffffffffffffffffffffffffffffffff19841661231f57506010612323565b5060005b60208110156123595781818151811061233857fe5b01602001516001600160f81b0319161561235157612359565b600101612323565b60008160200390506060816040519080825280601f01601f19166020018201604052801561238e576020820181803683370190505b5080830196909652508452509192915050565b60606801000000000000000083106123cb5760405162461bcd60e51b815260040161050f90612db9565b604080516001808252818301909252606091602082018180368337019050509050603784116124255782840160f81b8160008151811061240757fe5b60200101906001600160f81b031916908160001a905350905061204c565b6060612430856122bb565b90508381510160370160f81b8260008151811061244957fe5b60200101906001600160f81b031916908160001a90535061246a8282612473565b95945050505050565b6060806040519050835180825260208201818101602087015b818310156124a457805183526020928301920161248c565b50855184518101855292509050808201602086015b818310156124d15780518352602092830192016124b9565b508651929092011591909101601f01601f191660405250905092915050565b9091018181526020918201910152565b60005b818110156125535783818151811061251757fe5b602001015160f81c60f81b85848060010195508151811061253457fe5b60200101906001600160f81b031916908160001a905350600101612503565b5050505050565b6000816001018351101561256d57600080fd5b50016001015190565b604051806060016040528060008152602001600081526020016000151581525090565b600082601f8301126125a9578081fd5b81516125bc6125b782613310565b6132e9565b818152915060208083019084810160005b84811015612632578151870188603f8201126125e857600080fd5b838101516125f86125b782613330565b81815260408b8184860101111561260e57600080fd5b61261d83888401838701613354565b508652505092820192908201906001016125cd565b505050505092915050565b60008083601f84011261264e578182fd5b50813567ffffffffffffffff811115612665578182fd5b60208301915083602082850101111561267d57600080fd5b9250929050565b600082601f830112612694578081fd5b81356126a26125b782613330565b91508082528360208285010111156126b957600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156126e3578081fd5b6126ed60a06132e9565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561272b57600080fd5b61273784828501612684565b60808301525092915050565b600060208284031215612754578081fd5b8135611db881613384565b600060208284031215612770578081fd5b8151611db881613384565b60008060006060848603121561278f578182fd5b833561279a81613384565b92506020840135915060408401356127b18161339c565b809150509250925092565b600080604083850312156127ce578182fd5b825167ffffffffffffffff808211156127e5578384fd5b81850186601f8201126127f6578485fd5b805192506128066125b784613310565b80848252602080830192508084018a828389028701011115612826578889fd5b8894505b8685101561285157805161283d81613384565b84526001949094019392810192810161282a565b508801519096509350505080821115612868578283fd5b5061287585828601612599565b9150509250929050565b600060208284031215612890578081fd5b8151611db88161339c565b600080604083850312156128ad578182fd5b823567ffffffffffffffff808211156128c4578384fd5b6128d086838701612684565b935060208501359150808211156128e5578283fd5b5061287585828601612684565b60008060008060408587031215612907578182fd5b843567ffffffffffffffff8082111561291e578384fd5b61292a8883890161263d565b90965094506020870135915080821115612942578384fd5b5061294f8782880161263d565b95989497509550505050565b60006020828403121561296c578081fd5b813567ffffffffffffffff80821115612983578283fd5b81840160608187031215612995578384fd5b61299f60606132e9565b92508035828111156129af578485fd5b6129bb878284016126d2565b8452506020810135828111156129cf578485fd5b6129db878284016126d2565b6020850152506040810135828111156129f2578485fd5b6129fe87828401612684565b6040850152509195945050505050565b600060208284031215612a1f578081fd5b5035919050565b600060208284031215612a37578081fd5b5051919050565b600080600060408486031215612a52578081fd5b833560ff81168114612a62578182fd5b9250602084013567ffffffffffffffff811115612a7d578182fd5b612a898682870161263d565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612ad8816020860160208601613354565b601f01601f19169290920160200192915050565b600a81526919195c1c9958d85d195960b21b602082015260400190565b60008251612b1b818460208701613354565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611db86020830184612ac0565b600082825260406020830152611db860408301612aec565b600060408252612b9c604083018688612a96565b8281036020840152612baf818587612a96565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b600060208252611cd060208301612aec565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526132aa6040830184612ac0565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561330857600080fd5b604052919050565b600067ffffffffffffffff821115613326578081fd5b5060209081020190565b600067ffffffffffffffff821115613346578081fd5b50601f01601f191660200190565b60005b8381101561336f578181015183820152602001613357565b8381111561337e576000848401525b50505050565b6001600160a01b038116811461339957600080fd5b50565b801515811461339957600080fdfea164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001002": { + "balance": "0x0", + "code": "0x60806040526004361061016a5760003560e01c80639dc09262116100d1578063ac4317511161008a578063df8079e911610064578063df8079e9146104da578063f9a2bbc7146104ef578063fb5478b314610504578063fd6a687914610519576101ae565b8063ac431751146103e1578063c81b1662146104b0578063dc927faf146104c5576101ae565b80639dc092621461034a578063a1a11bf51461035f578063a78abc1614610374578063aa82dce114610389578063aad560631461039e578063ab51bb96146103b3576101ae565b806351e806721161012357806351e80672146102765780636d70f7ae1461028b5780636e47b482146102d257806375d47a0a146102e75780637e434d54146102fc5780639a99b4f014610311576101ae565b80630e2374a5146101b357806328087028146101e45780633a0b0eff146101f957806343756e5c14610220578063493279b11461023557806351b4dce314610261576101ae565b366101ae5734156101ac5760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101bf57600080fd5b506101c861052e565b604080516001600160a01b039092168252519081900360200190f35b3480156101f057600080fd5b506101c8610534565b34801561020557600080fd5b5061020e61053a565b60408051918252519081900360200190f35b34801561022c57600080fd5b506101c8610540565b34801561024157600080fd5b5061024a610546565b6040805161ffff9092168252519081900360200190f35b34801561026d57600080fd5b506101c861054b565b34801561028257600080fd5b506101c8610551565b34801561029757600080fd5b506102be600480360360208110156102ae57600080fd5b50356001600160a01b0316610557565b604080519115158252519081900360200190f35b3480156102de57600080fd5b506101c8610575565b3480156102f357600080fd5b506101c861057b565b34801561030857600080fd5b506101c8610581565b34801561031d57600080fd5b5061020e6004803603604081101561033457600080fd5b506001600160a01b038135169060200135610587565b34801561035657600080fd5b506101c8610732565b34801561036b57600080fd5b506101c8610738565b34801561038057600080fd5b506102be61073e565b34801561039557600080fd5b506101c8610747565b3480156103aa57600080fd5b506101c861074d565b3480156103bf57600080fd5b506103c8610753565b6040805163ffffffff9092168252519081900360200190f35b3480156103ed57600080fd5b506101ac6004803603604081101561040457600080fd5b81019060208101813564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b91939092909160208101903564010000000081111561047157600080fd5b82018360208201111561048357600080fd5b803590602001918460018302840111640100000000831117156104a557600080fd5b509092509050610758565b3480156104bc57600080fd5b506101c8610adb565b3480156104d157600080fd5b506101c8610ae1565b3480156104e657600080fd5b506101c8610ae7565b3480156104fb57600080fd5b506101c8610aed565b34801561051057600080fd5b5061020e610af3565b34801561052557600080fd5b506101c8610aff565b61200181565b61200581565b60015481565b61100181565b606181565b61200681565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b61100881565b61200381565b6000805460ff1661060457600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166106525760405162461bcd60e51b815260040180806020018281038252602b815260200180610bed602b913960400191505060405180910390fd5b60004783106106615747610663565b825b9050674563918244f400008111156106805750674563918244f400005b8015610701576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156106bc573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261072b565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b33611007146107985760405162461bcd60e51b815260040180806020018281038252602e815260200180610c47602e913960400191505060405180910390fd5b6107fa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610b059050565b156108d257606082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350506014909114905061087d5760405162461bcd60e51b815260040180806020018281038252602c815260200180610c75602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610a49565b61093784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610b059050565b15610a0c57606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506109ba5760405162461bcd60e51b815260040180806020018281038252602f815260200180610c18602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610a49565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61200481565b61100081565b674563918244f4000081565b61100481565b6000816040516020018082805190602001908083835b60208310610b3a5780518252601f199092019160209182019101610b1b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610ba85780518252601f199092019160209182019101610b89565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001003": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063aad5606311610125578063dda83148116100ad578063e2761af01161007c578063e2761af01461064f578063e405bbc314610673578063ea54b2aa1461067b578063f9a2bbc714610683578063fd6a68791461068b57610211565b8063dda83148146105f3578063df5fe70414610619578063df8079e91461063f578063e1c7392a1461064757610211565b8063c81b1662116100f4578063c81b16621461051e578063cba510a914610526578063d81698791461054c578063da8d08f0146105c5578063dc927faf146105eb57610211565b8063aad5606314610429578063ab51bb9614610431578063ac43175114610452578063adc879e91461051657610211565b8063564b81ef116101a85780637e434d54116101775780637e434d54146103ed5780639dc09262146103f5578063a1a11bf5146103fd578063a78abc1614610405578063aa82dce11461042157610211565b8063564b81ef1461029b5780635c5ae8db146103185780636e47b482146103dd57806375d47a0a146103e557610211565b806343756e5c116101e457806343756e5c14610264578063493279b11461026c57806351b4dce31461028b57806351e806721461029357610211565b80630e2374a5146102165780632657e9b61461023a578063280870281461025457806333f7798d1461025c575b600080fd5b61021e610693565b604080516001600160a01b039092168252519081900360200190f35b610242610699565b60408051918252519081900360200190f35b61021e6106a4565b6102426106aa565b61021e6106b0565b6102746106b6565b6040805161ffff9092168252519081900360200190f35b61021e6106bb565b61021e6106c1565b6102a36106c7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102dd5781810151838201526020016102c5565b50505050905090810190601f16801561030a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033e6004803603602081101561032e57600080fd5b50356001600160401b03166107d2565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561039f578181015183820152602001610387565b50505050905090810190601f1680156103cc5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61021e61088d565b61021e610893565b61021e610899565b61021e61089f565b61021e6108a5565b61040d6108ab565b604080519115158252519081900360200190f35b61021e6108b4565b61021e6108ba565b6104396108c0565b6040805163ffffffff9092168252519081900360200190f35b6105146004803603604081101561046857600080fd5b81019060208101813564010000000081111561048357600080fd5b82018360208201111561049557600080fd5b803590602001918460018302840111640100000000831117156104b757600080fd5b9193909290916020810190356401000000008111156104d557600080fd5b8201836020820111156104e757600080fd5b8035906020019184600183028401116401000000008311171561050957600080fd5b5090925090506108c5565b005b610242610996565b61021e61099c565b6102426004803603602081101561053c57600080fd5b50356001600160401b03166109a2565b61040d6004803603604081101561056257600080fd5b81019060208101813564010000000081111561057d57600080fd5b82018360208201111561058f57600080fd5b803590602001918460018302840111640100000000831117156105b157600080fd5b9193509150356001600160401b03166109c1565b61021e600480360360208110156105db57600080fd5b50356001600160401b0316610a81565b61021e610a9c565b61021e6004803603602081101561060957600080fd5b50356001600160401b0316610aa2565b61040d6004803603602081101561062f57600080fd5b50356001600160401b0316610ac6565b61021e610b08565b610514610b0e565b610657610bae565b604080516001600160401b039092168252519081900360200190f35b610657610bbd565b6102a3610bd8565b61021e610bf7565b61021e610bfd565b61200181565b662386f26fc1000081565b61200581565b60055481565b61100181565b606181565b61200681565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561073d57828160ff168151811061071157fe5b01602001516001600160f81b0319161561073057816001019150610735565b61073d565b6001016106f6565b5060608160ff166040519080825280601f01601f19166020018201604052801561076e576020820181803683370190505b50905060005b8260ff168160ff1610156107ca57838160ff168151811061079157fe5b602001015160f81c60f81b828260ff16815181106107ab57fe5b60200101906001600160f81b031916908160001a905350600101610774565b509250505090565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905084565b61100581565b61100881565b61200381565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff1661091c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461095c5760405162461bcd60e51b815260040180806020018281038252602e815260200180610c0e602e913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610a0457600080fd5b505afa158015610a18573d6000803e3d6000fd5b505050506040513d6020811015610a2e57600080fd5b505161095c576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b0316151580610b0257506003546001600160401b038381169116145b92915050565b61200481565b60005460ff1615610b66576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b600080610b8d6040518061024001604052806102208152602001610c3c6102209139610c03565b505160045550506000805460ff19166001179055662386f26fc10000600555565b6003546001600160401b031681565b6003546801000000000000000090046001600160401b031681565b6040518061024001604052806102208152602001610c3c610220913981565b61100081565b61100481565b805160209091019156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001004": { + "balance": "176405560900000000000000000", + "code": "0x6080604052600436106103395760003560e01c806393ab703f116101ab578063b9fd21e3116100f7578063df8079e911610095578063e8f35cea1161006f578063e8f35cea14610dd9578063f9a2bbc714610e0c578063fc1a598f14610e21578063fd6a687914610e5457610381565b8063df8079e914610d85578063e04c83a714610d9a578063e1c7392a14610dc457610381565b8063c81b1662116100d1578063c81b166214610d20578063c8509d811461092a578063cf41984414610d35578063dc927faf14610d7057610381565b8063b9fd21e314610ca5578063bbface1f14610cba578063bd46646114610ced57610381565b8063a78abc1611610164578063aad560631161013e578063aad5606314610b5e578063ab51bb9614610b73578063ac43175114610ba1578063b99328c514610c6c57610381565b8063a78abc1614610aed578063aa7415f514610b02578063aa82dce114610b4957610381565b806393ab703f14610a275780639509b98014610a3c5780639a854bbd14610a755780639a99b4f014610a8a5780639dc0926214610ac3578063a1a11bf514610ad857610381565b806351e8067211610285578063727be1f8116102235780637e434d54116101fd5780637e434d5414610915578063831d65d11461092a5780638525db03146109af5780638eff336c146109e857610381565b8063727be1f81461089757806375d47a0a146108c1578063799758b9146108d657610381565b8063613684751161025f57806361368475146107165780636e056520146107415780636e47b4821461086d57806371d308631461088257610381565b806351e80672146106c257806359b92789146106d75780635d499b1b1461070157610381565b80633d713223116102f257806343a368b9116102cc57806343a368b914610657578063493279b11461066c57806350432d321461069857806351b4dce3146106ad57610381565b80633d7132231461057c5780633fd8b02f1461062d57806343756e5c1461064257610381565b80630e2374a5146103865780631182b875146103b757806312234582146104b1578063149d14d9146104ec57806328087028146105135780632ae454831461052857610381565b3661038157341561037f576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561039257600080fd5b5061039b610e69565b604080516001600160a01b039092168252519081900360200190f35b3480156103c357600080fd5b5061043c600480360360408110156103da57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103fe57600080fd5b82018360208201111561041057600080fd5b803590602001918460018302840111600160201b8311171561043157600080fd5b509092509050610e6f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047657818101518382015260200161045e565b50505050905090810190601f1680156104a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104bd57600080fd5b5061037f600480360360408110156104d457600080fd5b506001600160a01b0381358116916020013516610eb7565b3480156104f857600080fd5b50610501610f31565b60408051918252519081900360200190f35b34801561051f57600080fd5b5061039b610f37565b34801561053457600080fd5b506105636004803603604081101561054b57600080fd5b506001600160a01b0381358116916020013516610f3d565b6040805192835260208301919091528051918290030190f35b34801561058857600080fd5b5061039b6004803603602081101561059f57600080fd5b810190602081018135600160201b8111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460018302840111600160201b831117156105ec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f61945050505050565b34801561063957600080fd5b50610501610f82565b34801561064e57600080fd5b5061039b610f88565b34801561066357600080fd5b50610501610f8e565b34801561067857600080fd5b50610681610f9a565b6040805161ffff9092168252519081900360200190f35b3480156106a457600080fd5b50610501610f9f565b3480156106b957600080fd5b5061039b610faa565b3480156106ce57600080fd5b5061039b610fb0565b3480156106e357600080fd5b5061039b600480360360208110156106fa57600080fd5b5035610fb6565b34801561070d57600080fd5b50610501610fd1565b34801561072257600080fd5b5061072b610fda565b6040805160ff9092168252519081900360200190f35b6108596004803603608081101561075757600080fd5b810190602081018135600160201b81111561077157600080fd5b82018360208201111561078357600080fd5b803590602001918460208302840111600160201b831117156107a457600080fd5b919390929091602081019035600160201b8111156107c157600080fd5b8201836020820111156107d357600080fd5b803590602001918460208302840111600160201b831117156107f457600080fd5b919390929091602081019035600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b91935091503567ffffffffffffffff16610fdf565b604080519115158252519081900360200190f35b34801561087957600080fd5b5061039b611025565b34801561088e57600080fd5b5061050161102b565b3480156108a357600080fd5b50610859600480360360208110156108ba57600080fd5b5035611031565b3480156108cd57600080fd5b5061039b61106d565b3480156108e257600080fd5b5061037f600480360360608110156108f957600080fd5b508035906001600160a01b036020820135169060400135611073565b34801561092157600080fd5b5061039b611323565b34801561093657600080fd5b5061037f6004803603604081101561094d57600080fd5b60ff8235169190810190604081016020820135600160201b81111561097157600080fd5b82018360208201111561098357600080fd5b803590602001918460018302840111600160201b831117156109a457600080fd5b509092509050611329565b3480156109bb57600080fd5b5061037f600480360360408110156109d257600080fd5b50803590602001356001600160a01b031661136e565b3480156109f457600080fd5b5061037f60048036036060811015610a0b57600080fd5b508035906001600160a01b0360208201351690604001356114d7565b348015610a3357600080fd5b50610501611517565b348015610a4857600080fd5b5061037f60048036036040811015610a5f57600080fd5b506001600160a01b03813516906020013561151e565b348015610a8157600080fd5b506105016115e0565b348015610a9657600080fd5b5061050160048036036040811015610aad57600080fd5b506001600160a01b0381351690602001356115ec565b348015610acf57600080fd5b5061039b611672565b348015610ae457600080fd5b5061039b611678565b348015610af957600080fd5b5061085961167e565b61085960048036036080811015610b1857600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16610fdf565b348015610b5557600080fd5b5061039b611687565b348015610b6a57600080fd5b5061039b61168d565b348015610b7f57600080fd5b50610b88611693565b6040805163ffffffff9092168252519081900360200190f35b348015610bad57600080fd5b5061037f60048036036040811015610bc457600080fd5b810190602081018135600160201b811115610bde57600080fd5b820183602082011115610bf057600080fd5b803590602001918460018302840111600160201b83111715610c1157600080fd5b919390929091602081019035600160201b811115610c2e57600080fd5b820183602082011115610c4057600080fd5b803590602001918460018302840111600160201b83111715610c6157600080fd5b509092509050611698565b348015610c7857600080fd5b5061037f60048036036040811015610c8f57600080fd5b50803590602001356001600160a01b03166114d7565b348015610cb157600080fd5b506105016116d8565b348015610cc657600080fd5b5061050160048036036020811015610cdd57600080fd5b50356001600160a01b03166116e2565b348015610cf957600080fd5b5061050160048036036020811015610d1057600080fd5b50356001600160a01b03166116f4565b348015610d2c57600080fd5b5061039b61170f565b348015610d4157600080fd5b5061037f60048036036040811015610d5857600080fd5b506001600160a01b0381358116916020013516611715565b348015610d7c57600080fd5b5061039b6117a8565b348015610d9157600080fd5b5061039b6117ae565b348015610da657600080fd5b5061085960048036036020811015610dbd57600080fd5b50356117b4565b348015610dd057600080fd5b5061037f61180c565b348015610de557600080fd5b5061050160048036036020811015610dfc57600080fd5b50356001600160a01b03166118ac565b348015610e1857600080fd5b5061039b6118be565b348015610e2d57600080fd5b5061043c60048036036020811015610e4457600080fd5b50356001600160a01b03166118c4565b348015610e6057600080fd5b5061039b6119eb565b61200181565b60005460609060ff16610eb7576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b3361200014610ef75760405162461bcd60e51b815260040180806020018281038252602f815260200180611d4a602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020908101516000908152600490915260409020546001600160a01b031690565b60055481565b61100181565b670de0b6b3a764000081565b606181565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600881565b6000805460ff16610ef7576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b61100581565b60015481565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61100881565b60005460ff166110b8576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b33613000146110f85760405162461bcd60e51b815260040180806020018281038252602b815260200180611cd0602b913960400191505060405180910390fd5b677ce66c50e284000081111561113f5760405162461bcd60e51b8152600401808060200182810382526035815260200180611c9b6035913960400191505060405180910390fd5b60006221272160e91b84146112a9576000848152600460205260409020546001600160a01b0316806111b2576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a3505061131e565b6001600160a01b0381166000908152600260205260409020546111d584826119f1565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561122057600080fd5b505afa158015611234573d6000803e3d6000fd5b505050506040513d602081101561124a57600080fd5b50511015611296576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6112a286838588611a3a565b505061131c565b6112be826402540be40063ffffffff611ad416565b90508047101561130c576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600061131a85828487611a3a565b505b505b505050565b61200381565b60005460ff16610eb7576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b33613000146113ae5760405162461bcd60e51b815260040180806020018281038252602b815260200180611cd0602b913960400191505060405180910390fd5b60006221272160e91b831461141957506000828152600460205260409020546001600160a01b031680611419576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526007602090815260408083209386168352929052208054611484576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814610ef75760405162461bcd60e51b8152600401808060200182810382526023815260200180611d796023913960400191505060405180910390fd5b6201518081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561155857600080fd5b505afa15801561156c573d6000803e3d6000fd5b505050506040513d602081101561158257600080fd5b50516001600160a01b03163314610ef7576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b677ce66c50e284000081565b6000805460ff16611632576040805162461bcd60e51b81526020600482015260196024820152600080516020611d9c833981519152604482015290519081900360640190fd5b3361100514610ef75760405162461bcd60e51b815260040180806020018281038252602f815260200180611c6c602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610ef75760405162461bcd60e51b815260040180806020018281038252602e815260200180611d1c602e913960400191505060405180910390fd5b6221272160e91b81565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60085460ff1660021415611761576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61100381565b61200481565b60003361200214610ef7576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b60005460ff1615611864576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff16101561195457828160ff168151811061192857fe5b01602001516001600160f81b031916156119475781600101915061194c565b611954565b60010161190d565b5060608160ff166040519080825280601f01601f191660200182016040528015611985576020820181803683370190505b50905060005b8260ff168160ff1610156119e157838160ff16815181106119a857fe5b602001015160f81c60f81b828260ff16815181106119c257fe5b60200101906001600160f81b031916908160001a90535060010161198b565b5095945050505050565b61100481565b60006008821115611a1a57611a13836007198401600a0a63ffffffff611ad416565b9050611a34565b611a31836008849003600a0a63ffffffff611b2d16565b90505b92915050565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054611a71908463ffffffff611b6f16565b81554262015180016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b600082611ae357506000611a34565b82820282848281611af057fe5b0414611a315760405162461bcd60e51b8152600401808060200182810382526021815260200180611cfb6021913960400191505060405180910390fd5b6000611a3183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bc9565b600082820183811015611a31576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008183611c555760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c1a578181015183820152602001611c02565b50505050905090810190601f168015611c475780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611c6157fe5b049594505050505056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001005": { + "balance": "0x0", + "code": "0x60806040526004361061024a5760003560e01c8063930e1b0911610139578063ace9fcc2116100b6578063df8079e91161007a578063df8079e9146106d5578063e1c7392a146106ea578063e89a3020146106ff578063f9a2bbc714610729578063fd6a68791461073e578063fdd31fcd1461075357610251565b8063ace9fcc21461066c578063c81b166214610681578063d0ab528a14610696578063dc927faf146106ab578063dcae76ab146106c057610251565b8063a7c6a59d116100fd578063a7c6a59d1461052e578063aa82dce114610543578063aad5606314610558578063ab51bb961461056d578063ac4317511461059b57610251565b8063930e1b09146104a75780639dc09262146104da578063a1a11bf5146104ef578063a3c3c0ad14610504578063a78abc161461051957610251565b806343756e5c116101c75780636f93d2e61161018b5780636f93d2e6146103f457806374f2272d1461045357806375d47a0a146104685780637e146cc51461047d5780637e434d541461049257610251565b806343756e5c14610374578063493279b11461038957806351b4dce3146103b557806351e80672146103ca5780636e47b482146103df57610251565b80631b20087c1161020e5780631b20087c146102ed5780631c64331214610302578063280870281461032c5780633a9756121461025657806340bb43c01461034157610251565b8063081e9d1314610256578063093f2fc41461027d5780630e2374a51461029257806310e06a76146102c357806312950c46146102d857610251565b3661025157005b600080fd5b34801561026257600080fd5b5061026b610786565b60408051918252519081900360200190f35b34801561028957600080fd5b5061026b61078b565b34801561029e57600080fd5b506102a7610790565b604080516001600160a01b039092168252519081900360200190f35b3480156102cf57600080fd5b5061026b610796565b3480156102e457600080fd5b5061026b61079c565b3480156102f957600080fd5b5061026b6107a2565b34801561030e57600080fd5b506102a76004803603602081101561032557600080fd5b50356107a8565b34801561033857600080fd5b506102a76107cf565b34801561034d57600080fd5b5061026b6004803603602081101561036457600080fd5b50356001600160a01b03166107d5565b34801561038057600080fd5b506102a76107e7565b34801561039557600080fd5b5061039e6107ed565b6040805161ffff9092168252519081900360200190f35b3480156103c157600080fd5b506102a76107f2565b3480156103d657600080fd5b506102a76107f8565b3480156103eb57600080fd5b506102a76107fe565b34801561040057600080fd5b5061043f6004803603608081101561041757600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610804565b604080519115158252519081900360200190f35b34801561045f57600080fd5b5061026b6108d6565b34801561047457600080fd5b506102a76108dc565b34801561048957600080fd5b5061026b6108e2565b34801561049e57600080fd5b506102a76108e7565b3480156104b357600080fd5b5061026b600480360360208110156104ca57600080fd5b50356001600160a01b03166108ed565b3480156104e657600080fd5b506102a76108ff565b3480156104fb57600080fd5b506102a7610905565b34801561051057600080fd5b5061026b61090b565b34801561052557600080fd5b5061043f610911565b34801561053a57600080fd5b5061026b61091a565b34801561054f57600080fd5b506102a7610920565b34801561056457600080fd5b506102a7610926565b34801561057957600080fd5b5061058261092c565b6040805163ffffffff9092168252519081900360200190f35b3480156105a757600080fd5b5061066a600480360360408110156105be57600080fd5b8101906020810181356401000000008111156105d957600080fd5b8201836020820111156105eb57600080fd5b8035906020019184600183028401116401000000008311171561060d57600080fd5b91939092909160208101903564010000000081111561062b57600080fd5b82018360208201111561063d57600080fd5b8035906020019184600183028401116401000000008311171561065f57600080fd5b509092509050610931565b005b34801561067857600080fd5b5061026b610971565b34801561068d57600080fd5b506102a7610977565b3480156106a257600080fd5b5061026b61097d565b3480156106b757600080fd5b506102a7610983565b3480156106cc57600080fd5b5061026b610989565b3480156106e157600080fd5b506102a761098f565b3480156106f657600080fd5b5061066a610995565b34801561070b57600080fd5b506102a76004803603602081101561072257600080fd5b5035610a5e565b34801561073557600080fd5b506102a7610a6b565b34801561074a57600080fd5b506102a7610a71565b34801561075f57600080fd5b5061026b6004803603602081101561077657600080fd5b50356001600160a01b0316610a77565b600181565b605081565b61200181565b600b5481565b60015481565b600c5481565b600681815481106107b557fe5b6000918252602090912001546001600160a01b0316905081565b61200581565b60076020526000908152604090205481565b61100181565b606181565b61200681565b61200081565b61100581565b6000805460ff1661085c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336120001461089c5760405162461bcd60e51b815260040180806020018281038252602f815260200180610ab8602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b60035481565b61100881565b600581565b61200381565b60056020526000908152604090205481565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b61200281565b61300081565b600081565b336110071461089c5760405162461bcd60e51b815260040180806020018281038252602e815260200180610a8a602e913960400191505060405180910390fd5b60025481565b61100281565b600e5481565b61100381565b60095481565b61200481565b60005460ff16156109ed576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615610a3b576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b600881815481106107b557fe5b61100081565b61100481565b600d602052600090815260409020548156fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001006": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80639dc092621161011a578063dc927faf116100ad578063e79a198f1161007c578063e79a198f1461047e578063f3ae241514610486578063f9a2bbc7146104ac578063fd30d9b8146104b4578063fd6a6879146104bc576101fb565b8063dc927faf14610466578063dd91d1c514610200578063df8079e91461046e578063e1c7392a14610476576101fb565b8063aad56063116100e9578063aad5606314610373578063ab51bb961461037b578063ac4317511461039c578063c81b16621461045e576101fb565b80639dc0926214610353578063a1a11bf51461035b578063a78abc1614610363578063aa82dce11461036b576101fb565b80636a6a419e116101925780637ae23088116101615780637ae23088146103035780637e434d541461031d5780638f83ab131461032557806395468d261461034b576101fb565b80636a6a419e146102a75780636e47b482146102cd57806375d47a0a146102d557806378beee67146102dd576101fb565b8063493279b1116101ce578063493279b11461023e57806351b4dce31461025d57806351e8067214610265578063541d55481461026d576101fb565b806303aff02b146102005780630e2374a51461020a578063280870281461022e57806343756e5c14610236575b600080fd5b6102086104c4565b005b6102126104fe565b604080516001600160a01b039092168252519081900360200190f35b610212610504565b61021261050a565b610246610510565b6040805161ffff9092168252519081900360200190f35b610212610515565b61021261051b565b6102936004803603602081101561028357600080fd5b50356001600160a01b0316610521565b604080519115158252519081900360200190f35b610293600480360360208110156102bd57600080fd5b50356001600160a01b031661053f565b61021261055d565b610212610563565b610208600480360360208110156102f357600080fd5b50356001600160a01b0316610569565b61030b6105b7565b60408051918252519081900360200190f35b6102126105c4565b6102086004803603602081101561033b57600080fd5b50356001600160a01b03166105ca565b61030b610627565b610212610633565b610212610639565b61029361063f565b610212610648565b61021261064e565b610383610654565b6040805163ffffffff9092168252519081900360200190f35b610208600480360360408110156103b257600080fd5b8101906020810181356401000000008111156103cd57600080fd5b8201836020820111156103df57600080fd5b8035906020019184600183028401116401000000008311171561040157600080fd5b91939092909160208101903564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b509092509050610659565b6102126106ec565b6102126106f2565b6102126106f8565b6102086106fe565b610208610780565b6102936004803603602081101561049c57600080fd5b50356001600160a01b0316610939565b610212610957565b61029361095d565b610212610966565b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200181565b61200581565b61100181565b606181565b61200681565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b61100881565b3360009081526008602052604090205460ff166104c45760405162461bcd60e51b8152600401808060200182810382526024815260200180610a676024913960400191505060405180910390fd5b68056bc75e2d6310000081565b61200381565b3360009081526005602052604090205460ff166104c4576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b67016345785d8a000081565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff166106ac576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146104c45760405162461bcd60e51b815260040180806020018281038252602e815260200180610a8b602e913960400191505060405180910390fd5b61100281565b61100381565b61200481565b60005460ff1615610756576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff166107db576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff1661082e576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610836610a4c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc9161087a919063ffffffff61096c16565b6040518115909202916000818181858888f193505050501580156108a2573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f193505050501580156108d8573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600a5460ff1681565b61100481565b60006109ae83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506109b5565b9392505050565b60008184841115610a445760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a095781810151838201526020016109f1565b50505050905090810190601f168015610a365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe72656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001007": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80639ab1a373116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf146104b1578063df8079e9146104b9578063f9a2bbc7146104c1578063fd6a6879146104c95761018e565b8063ab51bb96146104a1578063c81b1662146104a9578063c8509d811461031c5761018e565b80639ab1a3731461045d5780639dc0926214610465578063a1a11bf51461046d578063a78abc1614610475578063aa82dce114610491578063aad56063146104995761018e565b806351b4dce31161014b57806375d47a0a1161012557806375d47a0a1461030c5780637e434d5414610314578063831d65d11461031c57806388e4194e146103965761018e565b806351b4dce3146102f457806351e80672146102fc5780636e47b482146103045761018e565b80630e2374a5146101935780631182b875146101b757806328087028146102a45780633a21baae146102ac57806343756e5c146102cd578063493279b1146102d5575b600080fd5b61019b6104d1565b604080516001600160a01b039092168252519081900360200190f35b61022f600480360360408110156101cd57600080fd5b60ff8235169190810190604081016020820135600160201b8111156101f157600080fd5b82018360208201111561020357600080fd5b803590602001918460018302840111600160201b8311171561022457600080fd5b5090925090506104d7565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610269578181015183820152602001610251565b50505050905090810190601f1680156102965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b610553565b6102b4610559565b6040805163ffffffff9092168252519081900360200190f35b61019b61055e565b6102dd610564565b6040805161ffff9092168252519081900360200190f35b61019b610569565b61019b61056f565b61019b610575565b61019b61057b565b61019b610581565b6103946004803603604081101561033257600080fd5b60ff8235169190810190604081016020820135600160201b81111561035657600080fd5b82018360208201111561036857600080fd5b803590602001918460018302840111600160201b8311171561038957600080fd5b509092509050610587565b005b610394600480360360608110156103ac57600080fd5b810190602081018135600160201b8111156103c657600080fd5b8201836020820111156103d857600080fd5b803590602001918460018302840111600160201b831117156103f957600080fd5b919390929091602081019035600160201b81111561041657600080fd5b82018360208201111561042857600080fd5b803590602001918460018302840111600160201b8311171561044957600080fd5b9193509150356001600160a01b03166105c7565b6102b46106b2565b61019b6106b7565b61019b6106bd565b61047d6106c3565b604080519115158252519081900360200190f35b61019b6106cc565b61019b6106d2565b6102b46106d8565b61019b6106dd565b61019b6106e3565b61019b6106e9565b61019b6106ef565b61019b6106f5565b61200181565b606033612000146105195760405162461bcd60e51b815260040180806020018281038252602f815260200180610ace602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200581565b606681565b61100181565b606181565b61200681565b61200081565b61100581565b61100881565b61200381565b33612000146105195760405162461bcd60e51b815260040180806020018281038252602f815260200180610ace602f913960400191505060405180910390fd5b33612006146106075760405162461bcd60e51b8152600401808060200182810382526031815260200180610afd6031913960400191505060405180910390fd5b61060f610aa3565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506106a9816106fb565b50505050505050565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b61100281565b61100381565b61200481565b61100081565b61100481565b600061070a8260400151610a9d565b61077657604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610a98565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b838110156107e35781810151838201526020016107cb565b50505050905090810190601f1680156108105780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561084357818101518382015260200161082b565b50505050905090810190601f1680156108705780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561089157600080fd5b505af19250505080156108a2575060015b610a94576040516000815260443d10156108be5750600061095b565b60046000803e60005160e01c6308c379a081146108df57600091505061095b565b60043d036004833e81513d602482011167ffffffffffffffff8211171561090b5760009250505061095b565b808301805167ffffffffffffffff81111561092d57600094505050505061095b565b8060208301013d860181111561094b5760009550505050505061095b565b601f01601f191660405250925050505b806109665750610a09565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b838110156109c55781810151838201526020016109ad565b50505050905090810190601f1680156109f25780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610a98565b3d808015610a33576040519150601f19603f3d011682016040523d82523d6000602084013e610a38565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d9385939283929183019190850190808383600083156109c55781810151838201526020016109ad565b5060005b919050565b3b151590565b6040518060600160405280606081526020016060815260200160006001600160a01b03168152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e7472616374a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000001008": { + "balance": "0x0", + "code": "0x6080604052600436106102045760003560e01c80637ec816dd11610118578063ac431751116100a0578063dc927faf1161006f578063dc927faf146108de578063df8079e9146108f3578063e605bca014610908578063f9a2bbc71461091d578063fd6a68791461093257610204565b8063ac4317511461077d578063c81b166214610848578063c8509d811461065f578063d117a1101461085d57610204565b8063a1a11bf5116100e7578063a1a11bf5146106fb578063a78abc1614610710578063aa82dce114610725578063aad560631461073a578063ab51bb961461074f57610204565b80637ec816dd1461064a578063831d65d11461065f57806394553a4e146103345780639dc09262146106e657610204565b8063493279b11161019b5780636e47b4821161016a5780636e47b482146105db57806372c4e086146105f057806375d47a0a1461062057806377d9dae8146105275780637e434d541461063557610204565b8063493279b1146104d157806351b4dce3146104fd57806351e80672146105125780636b3f13071461052757610204565b80632e02d776116101d75780632e02d7761461039357806337e6ecda146103c657806343756e5c146103f9578063445fcefe1461040e57610204565b80630e2374a5146102095780631182b8751461023a57806325c751b714610334578063280870281461037e575b600080fd5b34801561021557600080fd5b5061021e610947565b604080516001600160a01b039092168252519081900360200190f35b34801561024657600080fd5b506102bf6004803603604081101561025d57600080fd5b60ff8235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460018302840111600160201b831117156102b457600080fd5b50909250905061094d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f95781810151838201526020016102e1565b50505050905090810190601f1680156103265780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036a6004803603604081101561034a57600080fd5b5080356001600160a01b0316906020013567ffffffffffffffff166109c9565b604080519115158252519081900360200190f35b34801561038a57600080fd5b5061021e610a05565b34801561039f57600080fd5b5061036a600480360360208110156103b657600080fd5b50356001600160a01b0316610a0b565b3480156103d257600080fd5b5061036a600480360360208110156103e957600080fd5b50356001600160a01b0316610a20565b34801561040557600080fd5b5061021e610a35565b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a3b945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610b9a565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b5061021e610b9f565b34801561051e57600080fd5b5061021e610ba5565b61036a6004803603604081101561053d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561056757600080fd5b82018360208201111561057957600080fd5b803590602001918460018302840111600160201b8311171561059a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109c9945050505050565b3480156105e757600080fd5b5061021e610bab565b61036a6004803603602081101561060657600080fd5b810190602081018135600160201b81111561056757600080fd5b34801561062c57600080fd5b5061021e610bb1565b34801561064157600080fd5b5061021e610bb7565b34801561065657600080fd5b506104bf610bbd565b34801561066b57600080fd5b506106e46004803603604081101561068257600080fd5b60ff8235169190810190604081016020820135600160201b8111156106a657600080fd5b8201836020820111156106b857600080fd5b803590602001918460018302840111600160201b831117156106d957600080fd5b509092509050610bc3565b005b3480156106f257600080fd5b5061021e610c03565b34801561070757600080fd5b5061021e610c09565b34801561071c57600080fd5b5061036a610c0f565b34801561073157600080fd5b5061021e610c18565b34801561074657600080fd5b5061021e610c1e565b34801561075b57600080fd5b50610764610c24565b6040805163ffffffff9092168252519081900360200190f35b34801561078957600080fd5b506106e4600480360360408110156107a057600080fd5b810190602081018135600160201b8111156107ba57600080fd5b8201836020820111156107cc57600080fd5b803590602001918460018302840111600160201b831117156107ed57600080fd5b919390929091602081019035600160201b81111561080a57600080fd5b82018360208201111561081c57600080fd5b803590602001918460018302840111600160201b8311171561083d57600080fd5b509092509050610c29565b34801561085457600080fd5b5061021e610c69565b34801561086957600080fd5b506108876004803603602081101561088057600080fd5b5035610c6f565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b3480156108ea57600080fd5b5061021e610cc7565b3480156108ff57600080fd5b5061021e610ccd565b34801561091457600080fd5b506104bf610cd3565b34801561092957600080fd5b5061021e610cd9565b34801561093e57600080fd5b5061021e610cdf565b61200181565b6060336120001461098f5760405162461bcd60e51b815260040180806020018281038252602f815260200180610e30602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b6044820152905160009181900360640190fd5b61200581565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b61100181565b6020810151600090610a4b610dc5565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610ad357600092505050610b95565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d6020811015610b5b57600080fd5b505160808301516060840151919250600091610b7c9163ffffffff610ce516565b9050610b8e818363ffffffff610ce516565b9450505050505b919050565b606181565b61200681565b61200081565b61100581565b61100881565b61200381565b60045481565b336120001461098f5760405162461bcd60e51b815260040180806020018281038252602f815260200180610e30602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b336110071461098f5760405162461bcd60e51b815260040180806020018281038252602e815260200180610e02602e913960400191505060405180910390fd5b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61200481565b60055481565b61100081565b61100481565b6000610d2783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d2e565b9392505050565b60008184841115610dbd5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d82578181015183820152602001610d6a565b50505050905090810190601f168015610daf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000002000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102695760003560e01c806375d47a0a11610151578063c81b1662116100c3578063e1c7392a11610087578063e1c7392a14610839578063e3b0480514610841578063e6400bbe14610861578063f7a251d714610869578063f9a2bbc7146108e1578063fd6a6879146108e957610269565b8063c81b1662146107ea578063ccc108d7146107f2578063d31f968d146107fa578063dc927faf14610829578063df8079e91461083157610269565b8063a78abc1611610115578063a78abc16146106d3578063aa82dce1146106db578063aad56063146106e3578063ab51bb96146106eb578063ac4317511461070c578063c27cdcfb146107ca57610269565b806375d47a0a146105d85780637e434d54146105e057806384013b6a146105e85780639dc09262146106c3578063a1a11bf5146106cb57610269565b80633a648b15116101ea57806351e80672116101ae57806351e806721461052a5780635f832177146105325780636bacff2c146105605780636e47a51a146105a85780636e47b482146105c857806374f079b8146105d057610269565b80633a648b15146104b6578063422f9050146104f257806343756e5c14610512578063493279b11461051a57806351b4dce31461052257610269565b806328087028116102315780632808702814610434578063299b533d1461043c5780632af6f399146104705780632ff32aea1461048d578063308325f4146104ae57610269565b80630e2374a51461026e57806314b3023b146102925780631d130935146102ac5780631e275ae1146102c857806322556cdc1461042c575b600080fd5b6102766108f1565b604080516001600160a01b039092168252519081900360200190f35b61029a6108f7565b60408051918252519081900360200190f35b6102b46108fd565b604080519115158252519081900360200190f35b61042a60048036036101008110156102df57600080fd5b81018160a081016080820135600160201b8111156102fc57600080fd5b82018360208201111561030e57600080fd5b803590602001918460018302840111600160201b8311171561032f57600080fd5b919390929091602081019035600160201b81111561034c57600080fd5b82018360208201111561035e57600080fd5b803590602001918460018302840111600160201b8311171561037f57600080fd5b919390929091602081019035600160201b81111561039c57600080fd5b8201836020820111156103ae57600080fd5b803590602001918460018302840111600160201b831117156103cf57600080fd5b919390929091602081019035600160201b8111156103ec57600080fd5b8201836020820111156103fe57600080fd5b803590602001918460018302840111600160201b8311171561041f57600080fd5b509092509050610906565b005b61029a610ba7565b610276610bac565b6104596004803603602081101561045257600080fd5b5035610bb2565b6040805161ffff9092168252519081900360200190f35b6102b46004803603602081101561048657600080fd5b5035610bc8565b610495610bdd565b60408051600792830b90920b8252519081900360200190f35b61029a610be6565b6104d6600480360360208110156104cc57600080fd5b503560ff16610bec565b604080516001600160401b039092168252519081900360200190f35b6102b46004803603602081101561050857600080fd5b503560ff16610c07565b610276610c1c565b610459610c22565b610276610c27565b610276610c2d565b61042a6004803603604081101561054857600080fd5b506001600160a01b0381358116916020013516610c33565b61057d6004803603602081101561057657600080fd5b5035610dac565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b610276600480360360208110156105be57600080fd5b503560ff16610ddb565b610276610df6565b61029a610dfc565b610276610e02565b610276610e08565b61042a600480360360a08110156105fe57600080fd5b810190602081018135600160201b81111561061857600080fd5b82018360208201111561062a57600080fd5b803590602001918460018302840111600160201b8311171561064b57600080fd5b919390929091602081019035600160201b81111561066857600080fd5b82018360208201111561067a57600080fd5b803590602001918460018302840111600160201b8311171561069b57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff16610e0e565b6102766111c2565b6102766111c8565b6102b46111ce565b6102766111d7565b6102766111dd565b6106f36111e3565b6040805163ffffffff9092168252519081900360200190f35b61042a6004803603604081101561072257600080fd5b810190602081018135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b919390929091602081019035600160201b81111561078c57600080fd5b82018360208201111561079e57600080fd5b803590602001918460018302840111600160201b831117156107bf57600080fd5b5090925090506111e8565b6104d6600480360360208110156107e057600080fd5b503560ff16611228565b610276611243565b61042a611249565b6102b46004803603604081101561081057600080fd5b5080356001600160a01b0316906020013560ff16611409565b610276611429565b61027661142f565b61042a611435565b6104d66004803603602081101561085757600080fd5b503560ff166114c7565b61042a6114e2565b61042a6004803603606081101561087f57600080fd5b60ff8235169190810190604081016020820135600160201b8111156108a357600080fd5b8201836020820111156108b557600080fd5b803590602001918460018302840111600160201b831117156108d657600080fd5b91935091503561165b565b6102766116fd565b610276611703565b61200181565b60015481565b600b5460ff1681565b60005460ff1661094b576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d60208110156109c057600080fd5b50516109fd5760405162461bcd60e51b81526004018080602001828103825260238152602001806117896023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d6020811015610a7357600080fd5b5051610ab05760405162461bcd60e51b81526004018080602001828103825260238152602001806117896023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610b29576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610b6d576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60096020526000908152604090205460ff1681565b61100181565b606181565b61200681565b61200081565b60005460ff16610c78576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015610cbb57600080fd5b505afa158015610ccf573d6000803e3d6000fd5b505050506040513d6020811015610ce557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015610d2657600080fd5b505afa158015610d3a573d6000803e3d6000fd5b505050506040513d6020811015610d5057600080fd5b5051905080610d5d575060155b600082118015610d6d5750808211155b610b6d576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b6005602052600090815260409020546001600160a01b031681565b61100581565b60035481565b61100881565b61200381565b60005460ff16610e53576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b158015610e9257600080fd5b505afa158015610ea6573d6000803e3d6000fd5b505050506040513d6020811015610ebc57600080fd5b5051610f0f576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610f7f576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b505161105b5760405162461bcd60e51b81526004018080602001828103825260238152602001806117896023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b03166110c5576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b03908116908316101561112e576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614610b295760ff8181166000908152600a60205260409020805467ffffffffffffffff19166001600160401b038516179055600b541615610b6d576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b3361100714610b295760405162461bcd60e51b815260040180806020018281038252602e81526020018061173b602e913960400191505060405180910390fd5b6008602052600090815260409020546001600160401b031681565b61100281565b60005460ff1661128e576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b1580156112d157600080fd5b505afa1580156112e5573d6000803e3d6000fd5b505050506040513d60208110156112fb57600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561133c57600080fd5b505afa158015611350573d6000803e3d6000fd5b505050506040513d602081101561136657600080fd5b5051905080611373575060155b6000821180156113835750808211155b6113c2576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16610b6d576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b600660209081526000928352604080842090915290825290205460ff1681565b61100381565b61200481565b60005460ff161561148d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260019081556004805467ffffffffffffffff19166001600160401b03179055600060028190556003819055805460ff19169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16611527576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561156a57600080fd5b505afa15801561157e573d6000803e3d6000fd5b505050506040513d602081101561159457600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156115d557600080fd5b505afa1580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b505190508061160c575060155b60008211801561161c5750808211155b610b29576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b60005460ff166116a0576040805162461bcd60e51b81526020600482015260196024820152600080516020611769833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116610b6d5760405162461bcd60e51b815260040180806020018281038252603181526020018061170a6031913960400191505060405180910390fd5b61100081565b6110048156fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637474686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000002001": { + "balance": "0x0", + "code": "0x60806040526004361061028c5760003560e01c806375d47a0a1161015a578063bf8546ca116100c1578063df8079e91161007a578063df8079e9146109aa578063edc1a5b0146109bf578063f45fd80b146109d4578063f9a2bbc714610a19578063fa03f79714610a2e578063fd6a687914610a4357610293565b8063bf8546ca146108f5578063c2117d8214610930578063c81b166214610945578063c8509d81146106d0578063d61b9b931461095a578063dc927faf1461099557610293565b8063aa82dce111610113578063aa82dce1146107a8578063aad56063146107bd578063ab51bb96146107d2578063ac43175114610800578063b88a802f146108cb578063baaafd3b146108e057610293565b806375d47a0a146106a65780637e434d54146106bb578063831d65d1146106d05780639dc0926214610755578063a1a11bf51461076a578063a78abc161461077f57610293565b8063493279b1116101fe57806362b171d2116101b757806362b171d2146105cb57806369b635b6146105e05780636bd8f804146105f55780636e47b4821461062b5780636fb7f7eb1461064057806375aca5931461067357610293565b8063493279b11461051f5780634d99dd161461054b57806351b4dce31461057757806351e806721461058c5780635d17c8bd146105a15780635d499b1b146105b657610293565b80631182b875116102505780631182b8751461039e57806311fe9ec61461049857806328087028146104cb5780632fdeb111146104e057806334c43354146104f557806343756e5c1461050a57610293565b8063026e402b1461029857806302985992146102c6578063047636d1146102ed5780630c795715146103585780630e2374a51461036d57610293565b3661029357005b600080fd5b6102c4600480360360408110156102ae57600080fd5b506001600160a01b038135169060200135610a58565b005b3480156102d257600080fd5b506102db610a95565b60408051918252519081900360200190f35b3480156102f957600080fd5b506103206004803603602081101561031057600080fd5b50356001600160a01b0316610a9b565b6040518082606080838360005b8381101561034557818101518382015260200161032d565b5050505090500191505060405180910390f35b34801561036457600080fd5b506102db610aed565b34801561037957600080fd5b50610382610af3565b604080516001600160a01b039092168252519081900360200190f35b3480156103aa57600080fd5b50610423600480360360408110156103c157600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e557600080fd5b8201836020820111156103f757600080fd5b803590602001918460018302840111600160201b8311171561041857600080fd5b509092509050610af9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045d578181015183820152602001610445565b50505050905090810190601f16801561048a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104a457600080fd5b506102db600480360360208110156104bb57600080fd5b50356001600160a01b0316610bb8565b3480156104d757600080fd5b50610382610bd3565b3480156104ec57600080fd5b506102db610bd9565b34801561050157600080fd5b506102db610bdf565b34801561051657600080fd5b50610382610bea565b34801561052b57600080fd5b50610534610bf0565b6040805161ffff9092168252519081900360200190f35b6102c46004803603604081101561056157600080fd5b506001600160a01b038135169060200135610bf5565b34801561058357600080fd5b50610382610cba565b34801561059857600080fd5b50610382610cc0565b3480156105ad57600080fd5b506102db610cc6565b3480156105c257600080fd5b506102db610ccc565b3480156105d757600080fd5b506102db610cd5565b3480156105ec57600080fd5b506102db610e75565b6102c46004803603606081101561060b57600080fd5b506001600160a01b03813581169160208101359091169060400135610a58565b34801561063757600080fd5b50610382610e7b565b34801561064c57600080fd5b506102db6004803603602081101561066357600080fd5b50356001600160a01b0316610e81565b34801561067f57600080fd5b506102db6004803603602081101561069657600080fd5b50356001600160a01b0316610e9c565b3480156106b257600080fd5b50610382610eb7565b3480156106c757600080fd5b50610382610ebd565b3480156106dc57600080fd5b506102c4600480360360408110156106f357600080fd5b60ff8235169190810190604081016020820135600160201b81111561071757600080fd5b82018360208201111561072957600080fd5b803590602001918460018302840111600160201b8311171561074a57600080fd5b509092509050610ec3565b34801561076157600080fd5b50610382610f03565b34801561077657600080fd5b50610382610f09565b34801561078b57600080fd5b50610794610f0f565b604080519115158252519081900360200190f35b3480156107b457600080fd5b50610382610f18565b3480156107c957600080fd5b50610382610f1e565b3480156107de57600080fd5b506107e7610f24565b6040805163ffffffff9092168252519081900360200190f35b34801561080c57600080fd5b506102c46004803603604081101561082357600080fd5b810190602081018135600160201b81111561083d57600080fd5b82018360208201111561084f57600080fd5b803590602001918460018302840111600160201b8311171561087057600080fd5b919390929091602081019035600160201b81111561088d57600080fd5b82018360208201111561089f57600080fd5b803590602001918460018302840111600160201b831117156108c057600080fd5b509092509050610f29565b3480156108d757600080fd5b506102db610fc0565b3480156108ec57600080fd5b506102db61115d565b34801561090157600080fd5b506102db6004803603604081101561091857600080fd5b506001600160a01b0381358116916020013516611168565b34801561093c57600080fd5b506102db611193565b34801561095157600080fd5b50610382611199565b34801561096657600080fd5b506102db6004803603604081101561097d57600080fd5b506001600160a01b038135811691602001351661119f565b3480156109a157600080fd5b506103826111ca565b3480156109b657600080fd5b506103826111d0565b3480156109cb57600080fd5b506102db6111d6565b3480156109e057600080fd5b506102db600480360360608110156109f757600080fd5b506001600160a01b0381358116916020810135821691604090910135166111e3565b348015610a2557600080fd5b50610382611218565b348015610a3a57600080fd5b506102db61121e565b348015610a4f57600080fd5b50610382611224565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610aa361122a565b610aab61122a565b6001600160a01b03929092166000818152600b60209081526040808320548652838352600c82528083205486830152928252600d905281902054908301525090565b6108fc81565b61200181565b60603361200014610b3b5760405162461bcd60e51b815260040180806020018281038252602f815260200180611277602f913960400191505060405180910390fd5b60005460ff16610b7e576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b6001600160a01b031660009081526006602052604090205490565b61200581565b60015481565b662386f26fc1000081565b61100181565b606181565b60105460ff1660021415610c41576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610c6957506402540be4008106155b610b3b576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b61200681565b61200081565b60025481565b6402540be40081565b60105460009060ff1660021415610d24576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480610d8b576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114610de1576040519150601f19603f3d011682016040523d82523d6000602084013e610de6565b606091505b5050905080610e2e576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b6001600160a01b031660009081526008602052604090205490565b61100881565b61200381565b3361200014610b3b5760405162461bcd60e51b815260040180806020018281038252602f815260200180611277602f913960400191505060405180910390fd5b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b60005460ff16610f80576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714610b7e5760405162461bcd60e51b815260040180806020018281038252602e815260200180611249602e913960400191505060405180910390fd5b60105460009060ff166002141561100f576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480611073576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d80600081146110c9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ce565b606091505b5050905080611116576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60015490565b61100281565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6040518060600160405280600390602082028036833750919291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a164736f6c6343000604000a" + }, + "0x0000000000000000000000000000000000002002": { + "balance": "0x0", + "code": "0x608060405260043610620003e75760003560e01c80638456cb591162000203578063cbb04d9d1162000117578063e8f67c3b11620000ad578063f80a34021162000078578063f80a34021462000c3f578063fb50b31f1462000c64578063fc0c5ff11462000c89578063ff69ab611462000ca157600080fd5b8063e8f67c3b1462000bbb578063e992aaf51462000bd3578063efdbf0e11462000beb578063f1f74d841462000c2757600080fd5b8063d7c2dfc811620000ee578063d7c2dfc81462000b41578063d8ca511f1462000b66578063daacdb661462000b7e578063dbda7fb31462000b9657600080fd5b8063cbb04d9d1462000ac2578063d115a2061462000b03578063d6ca429d1462000b1c57600080fd5b8063ac4317511162000199578063bff02e201162000164578063bff02e201462000a4f578063c38fbec81462000a85578063c473318f1462000aaa578063c8509d8114620008a357600080fd5b8063ac43175114620009cd578063b187bd2614620009f2578063baa7199e1462000a12578063bdceadf31462000a3757600080fd5b80638cd22b2211620001da5780638cd22b221462000938578063982ef0a7146200095d578063a43569b31462000974578063aad3ec9614620009a857600080fd5b80638456cb5914620008c857806386d5450614620008e05780638a4d3fa8146200091a57600080fd5b806349f41a4211620002fb57806364028fbd116200029157806375cc7d89116200025c57806375cc7d89146200084e57806376e7d6d614620008735780638129fc1c146200088b578063831d65d114620008a357600080fd5b806364028fbd1462000789578063663706d314620007a05780636ec01b2714620007d15780636f8e2fa4146200082957600080fd5b80634e6fd6c411620002d25780634e6fd6c414620006f05780635949187114620007085780635e7cc1c9146200072d57806363a036b5146200075257600080fd5b806349f41a4214620006815780634a49ac4c14620006a65780634d99dd1614620006cb57600080fd5b80631fa8882b116200037d578063417c73a71162000348578063417c73a714620005cd578063449ecfe614620005f257806345211bfd14620006175780634838d165146200063c57600080fd5b80631fa8882b146200053d5780632b727c8614620005565780632e8e8c71146200057b5780633840998814620005b557600080fd5b8063092193ab11620003be578063092193ab14620004885780630e9fbf51146200049f5780631182b87514620004c457806317b4f35314620004f857600080fd5b8063046f7da21462000407578063059ddd22146200041f5780630661806e146200046157600080fd5b36620004025760345460ff166001146200040057600080fd5b005b600080fd5b3480156200041457600080fd5b506200040062000cb9565b3480156200042c57600080fd5b50620004446200043e36600462008787565b62000d4b565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046e57600080fd5b506200047960365481565b60405190815260200162000458565b620004006200049936600462008787565b62001173565b348015620004ac57600080fd5b5062000400620004be366004620087e9565b620017c4565b348015620004d157600080fd5b50620004e9620004e33660046200882e565b62001af0565b604051620004589190620088e1565b3480156200050557600080fd5b506200044462000517366004620089b3565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200054a57600080fd5b50620004796201518081565b3480156200056357600080fd5b50620004446200057536600462008787565b62001b88565b3480156200058857600080fd5b50620004446200059a36600462008787565b604d602052600090815260409020546001600160a01b031681565b348015620005c257600080fd5b506200047960375481565b348015620005da57600080fd5b5062000400620005ec36600462008787565b62001bdd565b348015620005ff57600080fd5b50620004006200061136600462008787565b62001c5f565b3480156200062457600080fd5b50620004006200063636600462008787565b62001e44565b3480156200064957600080fd5b50620006706200065b36600462008787565b60016020526000908152604090205460ff1681565b604051901515815260200162000458565b3480156200068e57600080fd5b5062000400620006a036600462008787565b6200201d565b348015620006b357600080fd5b5062000400620006c536600462008787565b62002239565b348015620006d857600080fd5b5062000400620006ea36600462008a08565b620022b5565b348015620006fd57600080fd5b506200044461dead81565b3480156200071557600080fd5b50620004006200072736600462008a46565b620028e5565b3480156200073a57600080fd5b50620004006200074c36600462008ab0565b620036de565b3480156200075f57600080fd5b50620007776200077136600462008ad7565b62003908565b60405162000458949392919062008b40565b620004006200079a36600462008bfc565b62003fad565b348015620007ad57600080fd5b5062000479620007bf36600462008787565b60446020526000908152604090205481565b348015620007de57600080fd5b50620007f6620007f036600462008787565b620045fc565b6040805182516001600160401b039081168252602080850151821690830152928201519092169082015260600162000458565b3480156200083657600080fd5b50620004e96200084836600462008787565b620046a1565b3480156200085b57600080fd5b50620004006200086d36600462008787565b62004acd565b3480156200088057600080fd5b5062000479603d5481565b3480156200089857600080fd5b506200040062004c9f565b348015620008b057600080fd5b5062000400620008c23660046200882e565b62004e6a565b348015620008d557600080fd5b506200040062004ec8565b348015620008ed57600080fd5b5062000444620008ff36600462008787565b6043602052600090815260409020546001600160a01b031681565b3480156200092757600080fd5b5062000479670de0b6b3a764000081565b3480156200094557600080fd5b50620004796200095736600462008a08565b62004f60565b620004006200096e36600462008cd2565b62005019565b3480156200098157600080fd5b50620009996200099336600462008787565b620056c7565b60405162000458919062008d0a565b348015620009b557600080fd5b5062000400620009c736600462008a08565b620059b4565b348015620009da57600080fd5b5062000400620009ec36600462008d87565b62005a21565b348015620009ff57600080fd5b5060005462010000900460ff1662000670565b34801562000a1f57600080fd5b506200040062000a3136600462008e40565b620068c0565b34801562000a4457600080fd5b5062000479603c5481565b34801562000a5c57600080fd5b5062000a7462000a6e36600462008ad7565b62006a8d565b604051620004589392919062008e99565b34801562000a9257600080fd5b506200040062000aa436600462008787565b62006c69565b34801562000ab757600080fd5b506200047960385481565b34801562000acf57600080fd5b5062000ae762000ae136600462008787565b62006f2b565b6040805193845291151560208401529082015260600162000458565b34801562000b1057600080fd5b5062000479620186a081565b34801562000b2957600080fd5b506200040062000b3b36600462008ef6565b6200736e565b34801562000b4e57600080fd5b506200040062000b6036600462008fdf565b62007594565b34801562000b7357600080fd5b5062000479603b5481565b34801562000b8b57600080fd5b506200047960495481565b34801562000ba357600080fd5b506200044462000bb536600462008787565b6200768a565b34801562000bc857600080fd5b506200047960355481565b34801562000be057600080fd5b5062000479603a5481565b34801562000bf857600080fd5b506200047962000c0a366004620089b3565b805160208183018101805160468252928201919093012091525481565b34801562000c3457600080fd5b5062000479603e5481565b34801562000c4c57600080fd5b506200047962000c5e36600462008a08565b62007ab4565b34801562000c7157600080fd5b506200040062000c8336600462008d87565b62007b25565b34801562000c9657600080fd5b506200047960395481565b34801562000cae57600080fd5b5062000479604a5481565b600054630100000090046001600160a01b0316331462000cec576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000d1657604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000db69062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000de49062009045565b801562000e355780601f1062000e095761010080835404028352916020019162000e35565b820191906000526020600020905b81548152906001019060200180831162000e1757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e609062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000e8e9062009045565b801562000edf5780601f1062000eb35761010080835404028352916020019162000edf565b820191906000526020600020905b81548152906001019060200180831162000ec157829003601f168201915b5050505050815260200160018201805462000efa9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000f289062009045565b801562000f795780601f1062000f4d5761010080835404028352916020019162000f79565b820191906000526020600020905b81548152906001019060200180831162000f5b57829003601f168201915b5050505050815260200160028201805462000f949062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462000fc29062009045565b8015620010135780601f1062000fe75761010080835404028352916020019162001013565b820191906000526020600020905b81548152906001019060200180831162000ff557829003601f168201915b505050505081526020016003820180546200102e9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200105c9062009045565b8015620010ad5780601f106200108157610100808354040283529160200191620010ad565b820191906000526020600020905b8154815290600101906020018083116200108f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200114c575050509190925250509051949350505050565b33611000146200119f57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161018081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620012189062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620012469062009045565b8015620012975780601f106200126b5761010080835404028352916020019162001297565b820191906000526020600020905b8154815290600101906020018083116200127957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620012c29062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620012f09062009045565b8015620013415780601f10620013155761010080835404028352916020019162001341565b820191906000526020600020905b8154815290600101906020018083116200132357829003601f168201915b505050505081526020016001820180546200135c9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200138a9062009045565b8015620013db5780601f10620013af57610100808354040283529160200191620013db565b820191906000526020600020905b815481529060010190602001808311620013bd57829003601f168201915b50505050508152602001600282018054620013f69062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620014249062009045565b8015620014755780601f10620014495761010080835404028352916020019162001475565b820191906000526020600020905b8154815290600101906020018083116200145757829003601f168201915b50505050508152602001600382018054620014909062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620014be9062009045565b80156200150f5780601f10620014e3576101008083540402835291602001916200150f565b820191906000526020600020905b815481529060010190602001808311620014f157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620015ae575050509190925250505060408101519091506001600160a01b03161580620015eb57508060e001515b15620016a857604051611002903490600081818185875af1925050503d806000811462001635576040519150601f19603f3d011682016040523d82523d6000602084013e6200163a565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d6040516200169b9060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b158015620016ff57600080fd5b505af115801562001714573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea6346040516200175591815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b916200178a919086906004016200907b565b600060405180830381600087803b158015620017a557600080fd5b505af1158015620017ba573d6000803e3d6000fd5b5050505050505b50565b3361100114620017ec57604051630f22c43960e41b8152611001600482015260240162001196565b60005462010000900460ff16156200181757604051631785c68160e01b815260040160405180910390fd5b6000604583836040516200182d92919062009095565b908152604051908190036020019020546001600160a01b0316905062001855603f8262007d5e565b620018735760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260408120906200189b6201518042620090bb565b604a546000828152604b602052604090205491925011620018cf5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b60205260408120805460019290620018f0908490620090de565b90915550506040516046906200190a908790879062009095565b9081526020016040518091039020546000141580156200195b57504262015180604687876040516200193e92919062009095565b908152602001604051809103902054620019599190620090de565b105b156200197a57604051631898eb6b60e01b815260040160405180910390fd5b6000806200198a85600262007d81565b9150915081620019ad57604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001a00573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a269190620090f4565b905062001a34858362007e0b565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600260405162001a74939291906200910e565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001ab2916001600160a01b0316908a906004016200907b565b600060405180830381600087803b15801562001acd57600080fd5b505af115801562001ae2573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001b1a57604051630f22c43960e41b8152612000600482015260240162001196565b60005462010000900460ff161562001b4557604051631785c68160e01b815260040160405180910390fd5b6034805460ff1916600117905560405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015260640162001196565b60008162001b98603f8262007d5e565b62001bb65760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038084166000908152604160205260409020600d01541691505b50919050565b600054630100000090046001600160a01b0316331462001c10576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001c8a57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001cbc5760405163b1d02c3d60e01b815260040160405180910390fd5b8062001cca603f8262007d5e565b62001ce85760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001d2657604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001d76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d9c9190620090f4565b101562001dbc576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001de25760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff19169055604980546001919060009062001e0690849062009149565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff161562001e6f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ea15760405163b1d02c3d60e01b815260040160405180910390fd5b62001eab62007f00565b62001eb8603f8262007d5e565b62001ed65760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03821662001efe57604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161562001f3857604051631e6f587560e11b815260040160405180910390fd5b600062001f4462007f00565b6001600160a01b0381166000908152604160205260409020600c81015491925090429062001f77906201518090620090de565b111562001f9757604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b336200202b603f8262007d5e565b620020495760405163056e881160e01b815260040160405180910390fd5b60005462010000900460ff16156200207457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020a65760405163b1d02c3d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152604d60205260409020541615620020e05760405163bebdc75760e01b815260040160405180910390fd5b620020ed603f8362007d5e565b156200210c5760405163bebdc75760e01b815260040160405180910390fd5b336000818152604160205260409020600d01546001600160a01b0390811690841681036200214d5760405163bebdc75760e01b815260040160405180910390fd5b6001600160a01b0381161562002184576001600160a01b0381166000908152604d6020526040902080546001600160a01b03191690555b6001600160a01b038281166000908152604160205260409020600d0180546001600160a01b031916918616918217905515620021e9576001600160a01b038481166000908152604d6020526040902080546001600160a01b0319169184169190911790555b836001600160a01b0316816001600160a01b0316836001600160a01b03167fcbb728765de145e99c00e8ae32a325231e850359b7b8a6da3b84d672ab3f1d0a60405160405180910390a450505050565b600054630100000090046001600160a01b031633146200226c576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff1615620022e057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620023125760405163b1d02c3d60e01b815260040160405180910390fd5b8162002320603f8262007d5e565b6200233e5760405163056e881160e01b815260040160405180910390fd5b816000036200236057604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b0380841660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620023c89062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620023f69062009045565b8015620024475780601f106200241b5761010080835404028352916020019162002447565b820191906000526020600020905b8154815290600101906020018083116200242957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620024729062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620024a09062009045565b8015620024f15780601f10620024c557610100808354040283529160200191620024f1565b820191906000526020600020905b815481529060010190602001808311620024d357829003601f168201915b505050505081526020016001820180546200250c9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200253a9062009045565b80156200258b5780601f106200255f576101008083540402835291602001916200258b565b820191906000526020600020905b8154815290600101906020018083116200256d57829003601f168201915b50505050508152602001600282018054620025a69062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620025d49062009045565b8015620026255780601f10620025f95761010080835404028352916020019162002625565b820191906000526020600020905b8154815290600101906020018083116200260757829003601f168201915b50505050508152602001600382018054620026409062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200266e9062009045565b8015620026bf5780601f106200269357610100808354040283529160200191620026bf565b820191906000526020600020905b815481529060010190602001808311620026a157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200275e575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af1158015620027d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027fe9190620090f4565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b4082980287846040516200284f929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b0316036200287c576200287c8662007f41565b6040808301519051633041949b60e01b815261200591633041949b91620028a9919087906004016200907b565b600060405180830381600087803b158015620028c457600080fd5b505af1158015620028d9573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff16156200291057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029425760405163b1d02c3d60e01b815260040160405180910390fd5b8362002950603f8262007d5e565b6200296e5760405163056e881160e01b815260040160405180910390fd5b836200297c603f8262007d5e565b6200299a5760405163056e881160e01b815260040160405180910390fd5b6034805460ff191660011790556000849003620029ca57604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029fd5760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002a659062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002a939062009045565b801562002ae45780601f1062002ab85761010080835404028352916020019162002ae4565b820191906000526020600020905b81548152906001019060200180831162002ac657829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002b0f9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002b3d9062009045565b801562002b8e5780601f1062002b625761010080835404028352916020019162002b8e565b820191906000526020600020905b81548152906001019060200180831162002b7057829003601f168201915b5050505050815260200160018201805462002ba99062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002bd79062009045565b801562002c285780601f1062002bfc5761010080835404028352916020019162002c28565b820191906000526020600020905b81548152906001019060200180831162002c0a57829003601f168201915b5050505050815260200160028201805462002c439062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002c719062009045565b801562002cc25780601f1062002c965761010080835404028352916020019162002cc2565b820191906000526020600020905b81548152906001019060200180831162002ca457829003601f168201915b5050505050815260200160038201805462002cdd9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002d0b9062009045565b801562002d5c5780601f1062002d305761010080835404028352916020019162002d5c565b820191906000526020600020905b81548152906001019060200180831162002d3e57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162002dfb57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002e869062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002eb49062009045565b801562002f055780601f1062002ed95761010080835404028352916020019162002f05565b820191906000526020600020905b81548152906001019060200180831162002ee757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002f309062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002f5e9062009045565b801562002faf5780601f1062002f835761010080835404028352916020019162002faf565b820191906000526020600020905b81548152906001019060200180831162002f9157829003601f168201915b5050505050815260200160018201805462002fca9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462002ff89062009045565b8015620030495780601f106200301d5761010080835404028352916020019162003049565b820191906000526020600020905b8154815290600101906020018083116200302b57829003601f168201915b50505050508152602001600282018054620030649062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620030929062009045565b8015620030e35780601f10620030b757610100808354040283529160200191620030e3565b820191906000526020600020905b815481529060010190602001808311620030c557829003601f168201915b50505050508152602001600382018054620030fe9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200312c9062009045565b80156200317d5780601f1062003151576101008083540402835291602001916200317d565b820191906000526020600020905b8154815290600101906020018083116200315f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b8154815260200190600101908083116200321c5750505050508152505090508060e0015180156200325f5750876001600160a01b0316836001600160a01b031614155b156200327e57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af1158015620032d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032fb9190620090f4565b9050603754811015620033215760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b0316148015620033b657506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200338e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b49190620090f4565b105b15620033d5576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a5483620033eb91906200915f565b620033f79190620090bb565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d80600081146200344c576040519150601f19603f3d011682016040523d82523d6000602084013e62003451565b606091505b505090508062003474576040516312171d8360e31b815260040160405180910390fd5b62003480828462009149565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af1158015620034d6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620034fd9190620090f4565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e858960405162003562939291909283526020830191909152604082015260600190565b60405180910390a4604080516002808252606082018352600092602083019080368337019050509050866040015181600081518110620035a657620035a662009179565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620035e157620035e162009179565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620036229084908c906004016200918f565b600060405180830381600087803b1580156200363d57600080fd5b505af115801562003652573d6000803e3d6000fd5b505050508a15620036c4576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200368f9291906200907b565b600060405180830381600087803b158015620036aa57600080fd5b505af1158015620036bf573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff16156200370957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200373b5760405163b1d02c3d60e01b815260040160405180910390fd5b6200374562007f00565b62003752603f8262007d5e565b620037705760405163056e881160e01b815260040160405180910390fd5b60006200377c62007f00565b6001600160a01b0381166000908152604160205260409020600c810154919250904290620037af906201518090620090de565b1115620037cf57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620038095760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b03908116908616101562003847576009820154620038419086906001600160401b0316620091bb565b62003861565b600982015462003861906001600160401b031686620091bb565b60098301546001600160401b039182169250600160801b9004168111156200389c5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b606080606060006200391b603f62008067565b90508086101562003fa457841562003934578462003936565b805b945060008562003947888462009149565b116200395f5762003959878362009149565b62003961565b855b9050806001600160401b038111156200397e576200397e620088f6565b604051908082528060200260200182016040528015620039a8578160200160208202803683370190505b509450806001600160401b03811115620039c657620039c6620088f6565b604051908082528060200260200182016040528015620039f0578160200160208202803683370190505b509350806001600160401b0381111562003a0e5762003a0e620088f6565b60405190808252806020026020018201604052801562003a4357816020015b606081526020019060019003908162003a2d5790505b50925060005b8181101562003fa157600062003a6d62003a64838b620090de565b603f9062008072565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003ada9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003b089062009045565b801562003b595780601f1062003b2d5761010080835404028352916020019162003b59565b820191906000526020600020905b81548152906001019060200180831162003b3b57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003b849062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003bb29062009045565b801562003c035780601f1062003bd75761010080835404028352916020019162003c03565b820191906000526020600020905b81548152906001019060200180831162003be557829003601f168201915b5050505050815260200160018201805462003c1e9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003c4c9062009045565b801562003c9d5780601f1062003c715761010080835404028352916020019162003c9d565b820191906000526020600020905b81548152906001019060200180831162003c7f57829003601f168201915b5050505050815260200160028201805462003cb89062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003ce69062009045565b801562003d375780601f1062003d0b5761010080835404028352916020019162003d37565b820191906000526020600020905b81548152906001019060200180831162003d1957829003601f168201915b5050505050815260200160038201805462003d529062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462003d809062009045565b801562003dd15780601f1062003da55761010080835404028352916020019162003dd1565b820191906000526020600020905b81548152906001019060200180831162003db357829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162003e70575050505050815250509050806000015188848151811062003ea95762003ea962009179565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003f425780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003f16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003f3c9190620090f4565b62003f45565b60005b87848151811062003f5a5762003f5a62009179565b602002602001018181525050806080015186848151811062003f805762003f8062009179565b602002602001018190525050508062003f9990620091e5565b905062003a49565b50505b92959194509250565b60005462010000900460ff161562003fd857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200400a5760405163b1d02c3d60e01b815260040160405180910390fd5b3362004018603f8262007d5e565b156200403757604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038181166000908152604d602052604090205416156200407157604051631a0a9b9f60e21b815260040160405180910390fd5b6001600160a01b038881166000908152604360205260409020541615620040ab57604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b031660458888604051620040ca92919062009095565b908152604051908190036020019020546001600160a01b03161462004102576040516311fdb94760e01b815260040160405180910390fd5b600062004110838062009201565b6040516020016200412392919062009095565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff16156200416d5760405163c0bf414360e01b815260040160405180910390fd5b600062004183670de0b6b3a76400003462009149565b9050603654811015620041a9576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a16620041d157604051636520611b60e11b815260040160405180910390fd5b611388620041e6604087016020880162008ab0565b6001600160401b031611806200422c575062004209604086016020870162008ab0565b6001600160401b031662004221602087018762008ab0565b6001600160401b0316115b806200426b575062004245604086016020870162008ab0565b6001600160401b031662004260606087016040880162008ab0565b6001600160401b0316115b156200428a5760405163dc81db8560e01b815260040160405180910390fd5b620042d56200429a858062009201565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200808092505050565b620042f357604051635dba5ad760e01b815260040160405180910390fd5b62004302838a8a8a8a62008222565b6200432057604051631647e3cb60e11b815260040160405180910390fd5b60006200436e8462004333878062009201565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200835292505050565b90506200437d603f8562008453565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620043fd8b8d83620092a9565b5085600582016200440f828262009371565b5087905060098201620044238282620094aa565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004471908e908e9062009095565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620044f49291906200957a565b60405180910390a460408051848152602081018590526001600160a01b0387169182917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816917f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04910160405180910390a3604051633041949b60e01b815261200590633041949b90620045ba90859089906004016200907b565b600060405180830381600087803b158015620045d557600080fd5b505af1158015620045ea573d6000803e3d6000fd5b50505050505050505050505050505050565b60408051606081018252600080825260208201819052918101919091528162004627603f8262007d5e565b620046455760405163056e881160e01b815260040160405180910390fd5b50506001600160a01b031660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915290565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060828101919091526004840180549194916080840191906200470e9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200473c9062009045565b80156200478d5780601f1062004761576101008083540402835291602001916200478d565b820191906000526020600020905b8154815290600101906020018083116200476f57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620047b89062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620047e69062009045565b8015620048375780601f106200480b5761010080835404028352916020019162004837565b820191906000526020600020905b8154815290600101906020018083116200481957829003601f168201915b50505050508152602001600182018054620048529062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620048809062009045565b8015620048d15780601f10620048a557610100808354040283529160200191620048d1565b820191906000526020600020905b815481529060010190602001808311620048b357829003601f168201915b50505050508152602001600282018054620048ec9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200491a9062009045565b80156200496b5780601f106200493f576101008083540402835291602001916200496b565b820191906000526020600020905b8154815290600101906020018083116200494d57829003601f168201915b50505050508152602001600382018054620049869062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620049b49062009045565b801562004a055780601f10620049d95761010080835404028352916020019162004a05565b820191906000526020600020905b815481529060010190602001808311620049e757829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162004aa45750505091909252505050608001519392505050565b336110011462004af557604051630f22c43960e41b8152611001600482015260240162001196565b6001600160a01b038082166000908152604360205260409020541662004b1d603f8262007d5e565b62004b3b5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004b9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004bc49190620090f4565b90506000603d544262004bd89190620090de565b905062004be6838262007e0b565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004c26939291906200910e565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004c64916001600160a01b03169088906004016200907b565b600060405180830381600087803b15801562004c7f57600080fd5b505af115801562004c94573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004cc05750600054600160ff909116105b8062004cdc5750303b15801562004cdc575060005460ff166001145b62004d415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001196565b6000805460ff19166001179055801562004d65576000805461ff0019166101001790555b33411462004d865760405163022d8c9560e31b815260040160405180910390fd5b3a1562004da6576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755600960385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562069780603e55604a5562004e217330151da466ec8ab345bef3d6983023e050fb06736200846a565b8015620017c1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004e9257604051630f22c43960e41b8152612000600482015260240162001196565b60405162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015260640162001196565b600054630100000090046001600160a01b0316331462004efb576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004f2657604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600062004f6f603f8462007d5e565b62004f8d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa15801562004fea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620050109190620090f4565b90505b92915050565b60005462010000900460ff16156200504457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620050765760405163b1d02c3d60e01b815260040160405180910390fd5b8162005084603f8262007d5e565b620050a25760405163056e881160e01b815260040160405180910390fd5b6037543490811015620050c85760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620051309062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200515e9062009045565b8015620051af5780601f106200518357610100808354040283529160200191620051af565b820191906000526020600020905b8154815290600101906020018083116200519157829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620051da9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620052089062009045565b8015620052595780601f106200522d5761010080835404028352916020019162005259565b820191906000526020600020905b8154815290600101906020018083116200523b57829003601f168201915b50505050508152602001600182018054620052749062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620052a29062009045565b8015620052f35780601f10620052c757610100808354040283529160200191620052f3565b820191906000526020600020905b815481529060010190602001808311620052d557829003601f168201915b505050505081526020016002820180546200530e9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200533c9062009045565b80156200538d5780601f1062005361576101008083540402835291602001916200538d565b820191906000526020600020905b8154815290600101906020018083116200536f57829003601f168201915b50505050508152602001600382018054620053a89062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620053d69062009045565b8015620054275780601f10620053fb5761010080835404028352916020019162005427565b820191906000526020600020905b8154815290600101906020018083116200540957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620054c65750505050508152505090508060e001518015620055095750856001600160a01b0316826001600160a01b031614155b156200552857604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005579573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620055a09190620090f4565b9050826001600160a01b0316876001600160a01b03167f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e048387604051620055f1929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b9162005626919087906004016200907b565b600060405180830381600087803b1580156200564157600080fd5b505af115801562005656573d6000803e3d6000fd5b505050508515620017ba576040516372f6ad8f60e11b81526120059063e5ed5b1e906200568a9086908b906004016200907b565b600060405180830381600087803b158015620056a557600080fd5b505af1158015620056ba573d6000803e3d6000fd5b5050505050505050505050565b620056f36040518060800160405280606081526020016060815260200160608152602001606081525090565b8162005701603f8262007d5e565b6200571f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620057569062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620057849062009045565b8015620057d55780601f10620057a957610100808354040283529160200191620057d5565b820191906000526020600020905b815481529060010190602001808311620057b757829003601f168201915b50505050508152602001600182018054620057f09062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200581e9062009045565b80156200586f5780601f1062005843576101008083540402835291602001916200586f565b820191906000526020600020905b8154815290600101906020018083116200585157829003601f168201915b505050505081526020016002820180546200588a9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620058b89062009045565b8015620059095780601f10620058dd5761010080835404028352916020019162005909565b820191906000526020600020905b815481529060010190602001808311620058eb57829003601f168201915b50505050508152602001600382018054620059249062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620059529062009045565b8015620059a35780601f106200597757610100808354040283529160200191620059a3565b820191906000526020600020905b8154815290600101906020018083116200598557829003601f168201915b505050505081525050915050919050565b60005462010000900460ff1615620059df57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005a115760405163b1d02c3d60e01b815260040160405180910390fd5b62005a1d828262008503565b5050565b336110071462005a4957604051630f22c43960e41b8152611007600482015260240162001196565b62005ab66040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005b71576020811462005ae85783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005b2b9185858083850183828082843760009201919091525092939250506200866c9050565b90506108fc81108062005b3f575061271081115b1562005b685784848484604051630a5a604160e01b815260040162001196949392919062009590565b6035556200687b565b62005be26040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005cac576020811462005c145783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005c579185858083850183828082843760009201919091525092939250506200866c9050565b9050683635c9adc5dea0000081108062005c7a575069152d02c7e14af680000081115b1562005ca35784848484604051630a5a604160e01b815260040162001196949392919062009590565b6036556200687b565b62005d1f604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005de6576020811462005d515783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005d949185858083850183828082843760009201919091525092939250506200866c9050565b905067016345785d8a000081108062005db45750678ac7230489e8000081115b1562005ddd5784848484604051630a5a604160e01b815260040162001196949392919062009590565b6037556200687b565b62005e57604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562005f0f576020811462005e895783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005ecc9185858083850183828082843760009201919091525092939250506200866c9050565b905080158062005edd57506101f481115b1562005f065784848484604051630a5a604160e01b815260040162001196949392919062009590565b6038556200687b565b62005f786040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b1562006035576020811462005faa5783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f840181900481028201810190925282815260009162005fed9185858083850183828082843760009201919091525092939250506200866c9050565b90506203f48081108062006003575062278d0081115b156200602c5784848484604051630a5a604160e01b815260040162001196949392919062009590565b6039556200687b565b620060a360405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620061505760208114620060d55783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620061189185858083850183828082843760009201919091525092939250506200866c9050565b90506064811115620061475784848484604051630a5a604160e01b815260040162001196949392919062009590565b603a556200687b565b620061c060405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620062815760208114620061f25783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620062359185858083850183828082843760009201919091525092939250506200866c9050565b9050674563918244f400008110806200624f5750603c5481115b15620062785784848484604051630a5a604160e01b815260040162001196949392919062009590565b603b556200687b565b620062ef6040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620063b25760208114620063215783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620063649185858083850183828082843760009201919091525092939250506200866c9050565b905068056bc75e2d63100000811080620063805750603b548111155b15620063a95784848484604051630a5a604160e01b815260040162001196949392919062009590565b603c556200687b565b6200641f6040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620064dc5760208114620064515783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620064949185858083850183828082843760009201919091525092939250506200866c9050565b90506202a300811080620064aa5750603e548110155b15620064d35784848484604051630a5a604160e01b815260040162001196949392919062009590565b603d556200687b565b620065476040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620066045760208114620065795783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620065bc9185858083850183828082843760009201919091525092939250506200866c9050565b9050620d2f00811080620065d25750603d548111155b15620065fb5784848484604051630a5a604160e01b815260040162001196949392919062009590565b603e556200687b565b6200667e6040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b156200672a5760208114620066b05783838383604051630a5a604160e01b815260040162001196949392919062009590565b604080516020601f8401819004810282018101909252828152600091620066f39185858083850183828082843760009201919091525092939250506200866c9050565b905080600003620067215784848484604051630a5a604160e01b815260040162001196949392919062009590565b604a556200687b565b620067986040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200860f9050565b15620068585760148114620067ca5783838383604051630a5a604160e01b815260040162001196949392919062009590565b600062006812601484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506200866c9050565b90506001600160a01b038116620068465784848484604051630a5a604160e01b815260040162001196949392919062009590565b620068518162008671565b506200687b565b838383836040516325ee20d560e21b815260040162001196949392919062009590565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051620068b2949392919062009590565b60405180910390a150505050565b60005462010000900460ff1615620068eb57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200691d5760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b038111156200693b576200693b620088f6565b60405190808252806020026020018201604052801562006965578160200160208202803683370190505b5090506000805b8381101562006a6357620069ae8787838181106200698e576200698e62009179565b9050602002016020810190620069a5919062008787565b603f9062007d5e565b620069cc5760405163056e881160e01b815260040160405180910390fd5b60416000888884818110620069e557620069e562009179565b9050602002016020810190620069fc919062008787565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006a385762006a3862009179565b6001600160a01b039092166020928302919091019091015262006a5b81620091e5565b90506200696c565b50604051634484077560e01b815261200590634484077590620028a990859088906004016200918f565b606080600062006a9e603f62008067565b90508085101562006c6257831562006ab7578362006ab9565b805b935060008462006aca878462009149565b1162006ae25762006adc868362009149565b62006ae4565b845b9050806001600160401b0381111562006b015762006b01620088f6565b60405190808252806020026020018201604052801562006b2b578160200160208202803683370190505b509350806001600160401b0381111562006b495762006b49620088f6565b60405190808252806020026020018201604052801562006b73578160200160208202803683370190505b50925060005b8181101562006c5f5762006b9262003a648289620090de565b85828151811062006ba75762006ba762009179565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006be05762006be062009179565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006c345762006c3462009179565b6001600160a01b039092166020928302919091019091015262006c5781620091e5565b905062006b79565b50505b9250925092565b336110011462006c9157604051630f22c43960e41b8152611001600482015260240162001196565b60005462010000900460ff161562006cbc57604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006ce4603f8262007d5e565b62006d025760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006d2a6201518042620090bb565b604a546000828152604b60205260409020549192501162006d5e5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006d7f908490620090de565b90915550506001600160a01b0384166000908152604460205260409020541580159062006dd457506001600160a01b038416600090815260446020526040902054429062006dd2906201518090620090de565b105b1562006df3576040516330abb81d60e21b815260040160405180910390fd5b60008062006e0385600062007d81565b915091508162006e2657604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006e79573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006e9f9190620090f4565b905062006ead858362007e0b565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006eed939291906200910e565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b916200568a916001600160a01b0316908a906004016200907b565b6001600160a01b038082166000908152604160209081526040808320815161018081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384938493849390929160808401919062006f9c9062009045565b80601f016020809104026020016040519081016040528092919081815260200182805462006fca9062009045565b80156200701b5780601f1062006fef576101008083540402835291602001916200701b565b820191906000526020600020905b81548152906001019060200180831162006ffd57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070469062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620070749062009045565b8015620070c55780601f106200709957610100808354040283529160200191620070c5565b820191906000526020600020905b815481529060010190602001808311620070a757829003601f168201915b50505050508152602001600182018054620070e09062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200710e9062009045565b80156200715f5780601f1062007133576101008083540402835291602001916200715f565b820191906000526020600020905b8154815290600101906020018083116200714157829003601f168201915b505050505081526020016002820180546200717a9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620071a89062009045565b8015620071f95780601f10620071cd57610100808354040283529160200191620071f9565b820191906000526020600020905b815481529060010190602001808311620071db57829003601f168201915b50505050508152602001600382018054620072149062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620072429062009045565b8015620072935780601f10620072675761010080835404028352916020019162007293565b820191906000526020600020905b8154815290600101906020018083116200727557829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b815481526020019060010190808311620073325750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200739957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620073cb5760405163b1d02c3d60e01b815260040160405180910390fd5b620073d562007f00565b620073e2603f8262007d5e565b620074005760405163056e881160e01b815260040160405180910390fd5b60006200740c62007f00565b6001600160a01b0381166000908152604160205260409020600c8101549192509042906200743f906201518090620090de565b11156200745f57604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074709062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200749e9062009045565b8015620074ef5780601f10620074c357610100808354040283529160200191620074ef565b820191906000526020600020905b815481529060010190602001808311620074d157829003601f168201915b50505082875250859160058401915081906200750c9082620095c6565b5060208201516001820190620075239082620095c6565b50604082015160028201906200753a9082620095c6565b5060608201516003820190620075519082620095c6565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff1615620075bf57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620075f15760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007612576040516341abc80160e01b815260040160405180910390fd5b60005b8381101562007683576200767085858381811062007637576200763762009179565b90506020020160208101906200764e919062008787565b84848481811062007663576200766362009179565b9050602002013562008503565b6200767b81620091e5565b905062007615565b5050505050565b6001600160a01b0380821660009081526041602090815260408083208151610180810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849390916080840191620076f59062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620077239062009045565b8015620077745780601f10620077485761010080835404028352916020019162007774565b820191906000526020600020905b8154815290600101906020018083116200775657829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200779f9062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620077cd9062009045565b80156200781e5780601f10620077f2576101008083540402835291602001916200781e565b820191906000526020600020905b8154815290600101906020018083116200780057829003601f168201915b50505050508152602001600182018054620078399062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620078679062009045565b8015620078b85780601f106200788c57610100808354040283529160200191620078b8565b820191906000526020600020905b8154815290600101906020018083116200789a57829003601f168201915b50505050508152602001600282018054620078d39062009045565b80601f0160208091040260200160405190810160405280929190818152602001828054620079019062009045565b8015620079525780601f10620079265761010080835404028352916020019162007952565b820191906000526020600020905b8154815290600101906020018083116200793457829003601f168201915b505050505081526020016003820180546200796d9062009045565b80601f01602080910402602001604051908101604052809291908181526020018280546200799b9062009045565b8015620079ec5780601f10620079c057610100808354040283529160200191620079ec565b820191906000526020600020905b815481529060010190602001808311620079ce57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152600d8301546001600160a01b031660a0830152805161026081019182905260c09092019190600e84019060139082845b81548152602001906001019080831162007a8b5750505091909252505050604001519392505050565b600062007ac3603f8462007d5e565b62007ae15760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd9060240162004fcc565b60005462010000900460ff161562007b5057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007b825760405163b1d02c3d60e01b815260040160405180910390fd5b62007b8c62007f00565b62007b99603f8262007d5e565b62007bb75760405163056e881160e01b815260040160405180910390fd5b600062007bc362007f00565b905062007bd4818787878762008222565b62007bf257604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007c1192919062009095565b908152604051908190036020019020546001600160a01b03161462007c49576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007c78906201518090620090de565b111562007c9857604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007cae91906200968e565b908152604051908190036020019020556004810162007ccf878983620092a9565b5042600c820155604051829060459062007ced908a908a9062009095565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007d4d908a908a906200957a565b60405180910390a250505050505050565b6001600160a01b0381166000908152600183016020526040812054151562005010565b6000806000848460405160200162007d9b9291906200970c565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007ddb5760008093509350505062007e04565b603e5462007dea9042620090de565b6000928352604c6020526040909220829055506001925090505b9250929050565b6000600162007e1b603f62008067565b62007e27919062009149565b604954108015915062007e735760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007e8857600b83018290555b600a83015460ff1662007efb57600a8301805460ff191660019081179091556049805460009062007ebb908490620090de565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b336000908152604d60205260408120546001600160a01b03161562007f3c5750336000908152604d60205260409020546001600160a01b031690565b503390565b6001600160a01b0381166000908152604160205260409020600a81015460ff161562007f6b575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa15801562007fbb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007fe19190620090f4565b101562005a1d576200800381603d544262007ffd9190620090de565b62007e0b565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200804a57600080fd5b505af11580156200805f573d6000803e3d6000fd5b505050505050565b600062005013825490565b6000620050108383620086dd565b60008082905060038151108062008098575060098151115b15620080a75750600092915050565b604181600081518110620080bf57620080bf62009179565b016020015160f81c1080620080f15750605a81600081518110620080e757620080e762009179565b016020015160f81c115b15620081005750600092915050565b60015b81518110156200821857603082828151811062008124576200812462009179565b016020015160f81c108062008155575060398282815181106200814b576200814b62009179565b016020015160f81c115b8015620081a55750604182828151811062008174576200817462009179565b016020015160f81c1080620081a55750605a8282815181106200819b576200819b62009179565b016020015160f81c115b8015620081f557506061828281518110620081c457620081c462009179565b016020015160f81c1080620081f55750607a828281518110620081eb57620081eb62009179565b016020015160f81c115b1562008205575060009392505050565b6200821081620091e5565b905062008103565b5060019392505050565b600060308414158062008236575060608214155b15620082455750600062008349565b60008686864660405160200162008260949392919062009756565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a604051602001620082ba95949392919062009783565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa6200830457600080fd5b506000816000815181106200831d576200831d62009179565b016020015160f81c9050600181146200833f5760009550505050505062008349565b6001955050505050505b95945050505050565b60008061200361dead60405162008369906200875c565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f080158015620083ac573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b8152600401620083e0929190620097bb565b6000604051808303818588803b158015620083fa57600080fd5b505af11580156200840f573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b600062005010836001600160a01b0384166200870a565b600054610100900460ff16620084d75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001196565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008511603f8262007d5e565b6200852f5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008593573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620085b99190620090f4565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd3992683836040516200860191815260200190565b60405180910390a350505050565b600081604051602001620086249190620097e1565b60405160208183030381529060405280519060200120836040516020016200864d9190620097e1565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6000826000018281548110620086f757620086f762009179565b9060005260206000200154905092915050565b6000818152600183016020526040812054620087535750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562005013565b50600062005013565b610e96806200980083390190565b80356001600160a01b03811681146200878257600080fd5b919050565b6000602082840312156200879a57600080fd5b62005010826200876a565b60008083601f840112620087b857600080fd5b5081356001600160401b03811115620087d057600080fd5b60208301915083602082850101111562007e0457600080fd5b60008060208385031215620087fd57600080fd5b82356001600160401b038111156200881457600080fd5b6200882285828601620087a5565b90969095509350505050565b6000806000604084860312156200884457600080fd5b833560ff811681146200885657600080fd5b925060208401356001600160401b038111156200887257600080fd5b6200888086828701620087a5565b9497909650939450505050565b60005b83811015620088aa57818101518382015260200162008890565b50506000910152565b60008151808452620088cd8160208601602086016200888d565b601f01601f19169290920160200192915050565b602081526000620050106020830184620088b3565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620089315762008931620088f6565b60405290565b60006001600160401b0380841115620089545762008954620088f6565b604051601f8501601f19908116603f011681019082821181831017156200897f576200897f620088f6565b816040528093508581528686860111156200899957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215620089c657600080fd5b81356001600160401b03811115620089dd57600080fd5b8201601f81018413620089ef57600080fd5b62008a008482356020840162008937565b949350505050565b6000806040838503121562008a1c57600080fd5b62008a27836200876a565b946020939093013593505050565b803580151581146200878257600080fd5b6000806000806080858703121562008a5d57600080fd5b62008a68856200876a565b935062008a78602086016200876a565b92506040850135915062008a8f6060860162008a35565b905092959194509250565b6001600160401b0381168114620017c157600080fd5b60006020828403121562008ac357600080fd5b813562008ad08162008a9a565b9392505050565b6000806040838503121562008aeb57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101562008b355781516001600160a01b03168752958201959082019060010162008b0e565b509495945050505050565b60808152600062008b55608083018762008afa565b82810360208481019190915286518083528782019282019060005b8181101562008b8e5784518352938301939183019160010162008b70565b5050848103604086015286518082528282019350600581901b8201830183890160005b8381101562008be357601f1985840301875262008bd0838351620088b3565b9686019692509085019060010162008bb1565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e081121562008c1957600080fd5b62008c24896200876a565b975060208901356001600160401b038082111562008c4157600080fd5b62008c4f8c838d01620087a5565b909950975060408b013591508082111562008c6957600080fd5b62008c778c838d01620087a5565b90975095508591506060605f198401121562008c9257600080fd5b60608b01945060c08b013592508083111562008cad57600080fd5b505088016080818b03121562008cc257600080fd5b8091505092959891949750929550565b6000806040838503121562008ce657600080fd5b62008cf1836200876a565b915062008d016020840162008a35565b90509250929050565b60208152600082516080602084015262008d2860a0840182620088b3565b90506020840151601f198085840301604086015262008d488383620088b3565b9250604086015191508085840301606086015262008d678383620088b3565b9250606086015191508085840301608086015250620083498282620088b3565b6000806000806040858703121562008d9e57600080fd5b84356001600160401b038082111562008db657600080fd5b62008dc488838901620087a5565b9096509450602087013591508082111562008dde57600080fd5b5062008ded87828801620087a5565b95989497509550505050565b60008083601f84011262008e0c57600080fd5b5081356001600160401b0381111562008e2457600080fd5b6020830191508360208260051b850101111562007e0457600080fd5b60008060006040848603121562008e5657600080fd5b83356001600160401b0381111562008e6d57600080fd5b62008e7b8682870162008df9565b909450925062008e909050602085016200876a565b90509250925092565b60608152600062008eae606083018662008afa565b828103602084015262008ec2818662008afa565b915050826040830152949350505050565b600082601f83011262008ee557600080fd5b620050108383356020850162008937565b60006020828403121562008f0957600080fd5b81356001600160401b038082111562008f2157600080fd5b908301906080828603121562008f3657600080fd5b62008f406200890c565b82358281111562008f5057600080fd5b62008f5e8782860162008ed3565b82525060208301358281111562008f7457600080fd5b62008f828782860162008ed3565b60208301525060408301358281111562008f9b57600080fd5b62008fa98782860162008ed3565b60408301525060608301358281111562008fc257600080fd5b62008fd08782860162008ed3565b60608301525095945050505050565b6000806000806040858703121562008ff657600080fd5b84356001600160401b03808211156200900e57600080fd5b6200901c8883890162008df9565b909650945060208701359150808211156200903657600080fd5b5062008ded8782880162008df9565b600181811c908216806200905a57607f821691505b60208210810362001bd757634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600082620090d957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620050135762005013620090a5565b6000602082840312156200910757600080fd5b5051919050565b8381526020810183905260608101600383106200913b57634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b81810381811115620050135762005013620090a5565b8082028115828204841417620050135762005013620090a5565b634e487b7160e01b600052603260045260246000fd5b604081526000620091a4604083018562008afa565b905060018060a01b03831660208301529392505050565b6001600160401b03828116828216039080821115620091de57620091de620090a5565b5092915050565b600060018201620091fa57620091fa620090a5565b5060010190565b6000808335601e198436030181126200921957600080fd5b8301803591506001600160401b038211156200923457600080fd5b60200191503681900382131562007e0457600080fd5b601f82111562007efb57600081815260208120601f850160051c81016020861015620092735750805b601f850160051c820191505b818110156200805f578281556001016200927f565b600019600383901b1c191660019190911b1790565b6001600160401b03831115620092c357620092c3620088f6565b620092db83620092d4835462009045565b836200924a565b6000601f8411600181146200930e5760008515620092f95750838201355b62009305868262009294565b84555062007683565b600083815260209020601f19861690835b828110156200934157868501358255602094850194600190920191016200931f565b50868210156200935f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200937d828362009201565b6001600160401b03811115620093975762009397620088f6565b620093af81620093a8855462009045565b856200924a565b6000601f821160018114620093e25760008315620093cd5750838201355b620093d9848262009294565b8655506200943f565b600085815260209020601f19841690835b82811015620094155786850135825560209485019460019092019101620093f3565b5084821015620094335760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505062009452602083018362009201565b62009462818360018601620092a9565b505062009473604083018362009201565b62009483818360028601620092a9565b505062009494606083018362009201565b620094a4818360038601620092a9565b50505050565b8135620094b78162008a9a565b6001600160401b03811690508154816001600160401b031982161783556020840135620094e48162008a9a565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff19831684178117855590850135620095248162008a9a565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600062008a0060208301848662009551565b604081526000620095a660408301868862009551565b8281036020840152620095bb81858762009551565b979650505050505050565b81516001600160401b03811115620095e257620095e2620088f6565b620095fa81620095f3845462009045565b846200924a565b602080601f8311600181146200962e5760008415620096195750858301515b62009625858262009294565b8655506200805f565b600085815260208120601f198616915b828110156200965f578886015182559484019460019091019084016200963e565b50858210156200967e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200969e8162009045565b60018281168015620096b95760018114620096cf5762009700565b60ff198416875282151583028701945062009700565b8760005260208060002060005b85811015620096f75781548a820152908401908201620096dc565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200974257634e487b7160e01b600052602160045260246000fd5b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b6000865162009797818460208b016200888d565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b038316815260406020820181905260009062008a0090830184620088b3565b60008251620097f58184602087016200888d565b919091019291505056fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000a" + }, + "0x0000000000000000000000000000000000002003": { + "balance": "0x0", + "code": "0x6080604052600436106101d15760003560e01c8063647df759116100f7578063a9059cbb11610095578063c2cde2b211610064578063c2cde2b21461063c578063d241c1ea1461065c578063dd62ed3e1461069e578063f399e22e146106be57600080fd5b8063a9059cbb146105af578063a9664feb146105cf578063aa1966cd146105ef578063aad3ec961461061c57600080fd5b806391faf0b4116100d157806391faf0b41461053a57806395d89b411461055a578063a457c2d71461056f578063a5d059ca1461058f57600080fd5b8063647df759146104b75780636bbf2249146104d757806370a082311461050457600080fd5b80632f2d448a1161016f57806345bc4d101161013e57806345bc4d101461044f5780634d99dd161461046f5780635c19a95c1461048f5780635e607d76146104a257600080fd5b80632f2d448a146103bb578063313ce567146103db57806339509351146103f75780633a5381b51461041757600080fd5b8063095ea7b3116101ab578063095ea7b31461034057806315d1f8981461037057806318160ddd1461038657806323b872dd1461039b57600080fd5b8063038c0023146102cb57806306fdde03146102fe5780630913db471461032057600080fd5b366102c657336120021461020157604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b60006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102679190611d9e565b6102719042611dcd565b6098546000828152609d6020908152604080832093909355609c9052908120805492935034929091906102a5908490611def565b9250508190555034609860008282546102be9190611def565b925050819055005b600080fd5b3480156102d757600080fd5b506102eb6102e6366004611e1a565b6106d1565b6040519081526020015b60405180910390f35b34801561030a57600080fd5b50610313610701565b6040516102f59190611e3e565b34801561032c57600080fd5b506102eb61033b366004611e1a565b610793565b34801561034c57600080fd5b5061036061035b366004611e8c565b6107b5565b60405190151581526020016102f5565b34801561037c57600080fd5b506102eb60985481565b34801561039257600080fd5b506067546102eb565b3480156103a757600080fd5b506103606103b6366004611eb8565b6107cd565b3480156103c757600080fd5b506102eb6103d6366004611e1a565b6107f1565b3480156103e757600080fd5b50604051601281526020016102f5565b34801561040357600080fd5b50610360610412366004611e8c565b6108b6565b34801561042357600080fd5b50609754610437906001600160a01b031681565b6040516001600160a01b0390911681526020016102f5565b34801561045b57600080fd5b506102eb61046a366004611ef9565b6108d8565b34801561047b57600080fd5b506102eb61048a366004611e8c565b6109cb565b6102eb61049d366004611e1a565b610be2565b6104b56104b0366004611f12565b610c58565b005b3480156104c357600080fd5b506102eb6104d2366004611ef9565b610dcb565b3480156104e357600080fd5b506102eb6104f2366004611ef9565b609d6020526000908152604090205481565b34801561051057600080fd5b506102eb61051f366004611e1a565b6001600160a01b031660009081526065602052604090205490565b34801561054657600080fd5b506102eb610555366004611ef9565b610e0a565b34801561056657600080fd5b50610313610e45565b34801561057b57600080fd5b5061036061058a366004611e8c565b610e54565b34801561059b57600080fd5b506102eb6105aa366004611e8c565b610ecf565b3480156105bb57600080fd5b506103606105ca366004611e8c565b610fd0565b3480156105db57600080fd5b506102eb6105ea366004611e8c565b610fde565b3480156105fb57600080fd5b506102eb61060a366004611ef9565b609c6020526000908152604090205481565b34801561062857600080fd5b506102eb610637366004611e8c565b611107565b34801561064857600080fd5b506102eb610657366004611e1a565b6113aa565b34801561066857600080fd5b5061067c610677366004611e8c565b6113c8565b60408051825181526020808401519082015291810151908201526060016102f5565b3480156106aa57600080fd5b506102eb6106b9366004611f3c565b61144b565b6104b56106cc366004611f75565b611476565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b035b92915050565b60606068805461071090611ffa565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90611ffa565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b5050505050905090565b6001600160a01b0381166000908152606560205260408120546106fb90610e0a565b6000336107c381858561162c565b5060019392505050565b6000336107db858285611645565b6107e68585856116b9565b506001949350505050565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b0381805b828110156108ae576001600160a01b0385166000908152609a6020526040812061084790836116d2565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042106108945761088d8461202e565b935061089b565b50506108ae565b5050806108a79061202e565b905061081d565b509392505050565b6000336107c38185856108c9838361144b565b6108d39190611def565b61162c565b6000336120021461090057604051630f22c43960e41b815261200260048201526024016101f8565b6097546001600160a01b03166000908152606560205260408120549061092584610dcb565b90508181116109345780610936565b815b609754909150600090610952906001600160a01b031683611743565b6040519091506000906110029083908381818185875af1925050503d8060008114610999576040519150601f19603f3d011682016040523d82523d6000602084013e61099e565b606091505b50509050806109c0576040516312171d8360e31b815260040160405180910390fd5b50925050505b919050565b600033612002146109f357604051630f22c43960e41b815261200260048201526024016101f8565b81600003610a1457604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610a4d57604051631e9acf1760e31b815260040160405180910390fd5b610a578383611743565b905060006120026001600160a01b031663fc0c5ff16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abf9190611d9e565b610ac99042611def565b6040805160608101825285815260208101859052908101829052909150600085610af281611778565b60405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160408051601f1981840301815291815281516020928301206000818152609990935291205490915015610b5d5760405163b19e911560e01b815260040160405180910390fd5b600081815260996020908152604080832085518155828601516001820155818601516002909101556001600160a01b0389168352609a9091529020610bd990828154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b50505092915050565b60003361200214610c0a57604051630f22c43960e41b815261200260048201526024016101f8565b34600003610c2b57604051631f2a200560e01b815260040160405180910390fd5b610c3582346117a0565b9050806000036109c657604051639811e0c760e01b815260040160405180910390fd5b3361200214610c7e57604051630f22c43960e41b815261200260048201526024016101f8565b346000612710610c9867ffffffffffffffff851684612047565b610ca29190611dcd565b90506000610cb0828461205e565b905060006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d189190611d9e565b610d229042611dcd565b6098546000828152609d6020908152604080832093909355609c905290812080549293508492909190610d56908490611def565b925050819055508160986000828254610d6f9190611def565b9091555050609754610d8a906001600160a01b0316846117a0565b5060408051838152602081018590527ffb0e1482d62102ab9594f69d4c6d693749e3e2bf1c21af272f5456b2d5a4f6b5910160405180910390a15050505050565b6000609854600003610df0576040516307b76ce760e51b815260040160405180910390fd5b609854606754610e009084612047565b6106fb9190611dcd565b6000610e1560675490565b600003610e3557604051632fe8dae960e01b815260040160405180910390fd5b606754609854610e009084612047565b60606069805461071090611ffa565b60003381610e62828661144b565b905083811015610ec25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016101f8565b6107e6828686840361162c565b60003361200214610ef757604051630f22c43960e41b815261200260048201526024016101f8565b81600003610f1857604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610f5157604051631e9acf1760e31b815260040160405180910390fd5b610f5b8383611743565b6040519091506000906120029083908381818185875af1925050503d8060008114610fa2576040519150601f19603f3d011682016040523d82523d6000602084013e610fa7565b606091505b5050905080610fc9576040516312171d8360e31b815260040160405180910390fd5b5092915050565b6000336107c38185856116b9565b6001600160a01b0382166000908152609a6020526040812054600f81810b600160801b909204900b03600003611016575060006106fb565b81158061104a57506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b611054578161107e565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b91506000805b838110156108ae576001600160a01b0385166000908152609a602052604081206110ae90836116d2565b600081815260996020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252919250906110f29085611def565b93505050806111009061202e565b9050611084565b6000336120021461112f57604051630f22c43960e41b815261200260048201526024016101f8565b6111376117c9565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b036000036111805760405163ad41893760e01b815260040160405180910390fd5b8115806111b457506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b6111be57816111e8565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b915060005b821561129e576001600160a01b0384166000908152609a6020526040812061121490611822565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042101561125957505061129e565b6001600160a01b0386166000908152609a6020526040902061127a90611876565b50602081015161128a9084611def565b925061129585612071565b945050506111ed565b806000036112bf576040516303cd8e0960e21b815260040160405180910390fd5b60006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113259190611d9e565b90506000856001600160a01b03168284604051600060405180830381858888f193505050503d8060008114611376576040519150601f19603f3d011682016040523d82523d6000602084013e61137b565b606091505b505090508061139d576040516312171d8360e31b815260040160405180910390fd5b50506001805590506106fb565b6001600160a01b0381166000908152609b60205260408120546106fb565b6113ec60405180606001604052806000815260200160008152602001600081525090565b6001600160a01b0383166000908152609a6020526040812061140e90846116d2565b6000908152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810191909152949350505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b600054610100900460ff16158080156114965750600054600160ff909116105b806114b05750303b1580156114b0575060005460ff166001145b6115135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101f8565b6000805460ff191660011790558015611536576000805461ff0019166101001790555b336120021461155c57604051630f22c43960e41b815261200260048201526024016101f8565b60008383604051602001611571929190612088565b6040516020818303038152906040529050600084846040516020016115979291906120b8565b60405160208183030381529060405290506115b282826118fb565b6115ba611940565b609780546001600160a01b0319166001600160a01b0388161790556115de34611967565b50508015611626576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051632028747160e01b815260040160405180910390fd5b6000611651848461144b565b9050600019811461162657818110156116ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016101f8565b611626848484840361162c565b604051638cd22d1960e01b815260040160405180910390fd5b6000806116f56116e184611ad7565b85546116f09190600f0b6120d6565b611b45565b8454909150600160801b9004600f90810b9082900b1261172857604051632d0483c560e21b815260040160405180910390fd5b600f0b60009081526001939093016020525050604090205490565b600061174e82610e0a565b905061175a8383611ba9565b806098600082825461176c919061205e565b90915550909392505050565b6001600160a01b0381166000908152609b602052604090208054600181018255905b50919050565b60006117ab82610dcb565b90506117b78382611cdd565b816098600082825461176c9190611def565b60026001540361181b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f8565b6002600155565b600061183d8254600f81810b600160801b909204900b131590565b1561185b57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b60009081526001909101602052604090205490565b60006118918254600f81810b600160801b909204900b131590565b156118af57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60018055565b600054610100900460ff166119225760405162461bcd60e51b81526004016101f8906120fe565b606861192e83826121ad565b50606961193b82826121ad565b505050565b600054610100900460ff166118f55760405162461bcd60e51b81526004016101f8906120fe565b600054610100900460ff1661198e5760405162461bcd60e51b81526004016101f8906120fe565b60006120026001600160a01b0316638a4d3fa86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190611d9e565b90508082111580611a0e57506097546001600160a01b0316155b80611a1a575060675415155b15611a3857604051632163e6b960e21b815260040160405180910390fd5b60006120026001600160a01b0316634e6fd6c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e919061226d565b9050611aaa8183611cdd565b6000611ab6838561205e565b609754909150611acf906001600160a01b031682611cdd565b505050609855565b60006001600160ff1b03821115611b415760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016101f8565b5090565b80600f81900b81146109c65760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016101f8565b6001600160a01b038216611c095760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016101f8565b6001600160a01b03821660009081526065602052604090205481811015611c7d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016101f8565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b038216611d335760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101f8565b8060676000828254611d459190611def565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208284031215611db057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611dea57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156106fb576106fb611db7565b6001600160a01b0381168114611e1757600080fd5b50565b600060208284031215611e2c57600080fd5b8135611e3781611e02565b9392505050565b600060208083528351808285015260005b81811015611e6b57858101830151858201604001528201611e4f565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215611e9f57600080fd5b8235611eaa81611e02565b946020939093013593505050565b600080600060608486031215611ecd57600080fd5b8335611ed881611e02565b92506020840135611ee881611e02565b929592945050506040919091013590565b600060208284031215611f0b57600080fd5b5035919050565b600060208284031215611f2457600080fd5b813567ffffffffffffffff81168114611e3757600080fd5b60008060408385031215611f4f57600080fd5b8235611f5a81611e02565b91506020830135611f6a81611e02565b809150509250929050565b600080600060408486031215611f8a57600080fd5b8335611f9581611e02565b9250602084013567ffffffffffffffff80821115611fb257600080fd5b818601915086601f830112611fc657600080fd5b813581811115611fd557600080fd5b876020828501011115611fe757600080fd5b6020830194508093505050509250925092565b600181811c9082168061200e57607f821691505b60208210810361179a57634e487b7160e01b600052602260045260246000fd5b60006001820161204057612040611db7565b5060010190565b80820281158282048414176106fb576106fb611db7565b818103818111156106fb576106fb611db7565b60008161208057612080611db7565b506000190190565b65029ba30b5b2960d51b815281836006830137660810dc99591a5d60ca1b91016006810191909152600d01919050565b611cdd60f21b81528183600283013760009101600201908152919050565b80820182811260008312801582168215821617156120f6576120f6611db7565b505092915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561193b57600081815260208120601f850160051c810160208610156121865750805b601f850160051c820191505b818110156121a557828155600101612192565b505050505050565b815167ffffffffffffffff8111156121c7576121c7612149565b6121db816121d58454611ffa565b8461215f565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b1785556121a5565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561227f57600080fd5b8151611e3781611e0256fea164736f6c6343000811000a" + }, + "0x0000000000000000000000000000000000002004": { + "balance": "0x0", + "code": "0x6080604052600436106103dd5760003560e01c80637b3c71d3116101fd578063c170ec0b11610118578063deaaa7cc116100ab578063ece40cc11161007a578063ece40cc114610de9578063f23a6e6114610e09578063f8ce560a14610e35578063fc0c546a14610e55578063fe0d94c114610e7657600080fd5b8063deaaa7cc14610caa578063e23a9a5214610cde578063ea0217cf14610da9578063eb9019d414610dc957600080fd5b8063d33219b4116100e7578063d33219b414610c05578063da95691a14610c24578063dd4e2ba514610c44578063ddf0b00914610c8a57600080fd5b8063c170ec0b14610b97578063c28bc2fa14610bb2578063c59057e414610bc5578063d07f91e914610be557600080fd5b8063a7713a7011610190578063b187bd261161015f578063b187bd2614610b18578063b58131b014610b36578063bc197c8114610b4b578063c01f9e3714610b7757600080fd5b8063a7713a7014610aa3578063a890c91014610ab8578063ab58fb8e14610ad8578063ac43175114610af857600080fd5b806384b0196e116101cc57806384b0196e14610a1b57806391ddadf414610a4357806397c3d33414610a6f5780639a802a6d14610a8357600080fd5b80637b3c71d3146109b15780637d5e81e2146109d15780638129fc1c146109f15780638456cb5914610a0657600080fd5b806332b8113e116102f85780634838d1651161028b57806354fd4d501161025a57806354fd4d501461090757806356781388146109315780635f398a141461095157806360c4247f1461097157806370b0f6601461099157600080fd5b80634838d165146108715780634a49ac4c146108a15780634bf5d7e9146108c1578063533ddd14146108d657600080fd5b806340e58ee5116102c757806340e58ee5146107c6578063417c73a7146107e65780634385963214610806578063452115d61461085157600080fd5b806332b8113e1461073a5780633932abb1146107635780633bccf4fd146107795780633e4f49e61461079957600080fd5b8063150b7a02116103705780632656227d1161033f5780632656227d1461068c5780632d63f6931461069f5780632fe3e261146106d6578063328dd9821461070a57600080fd5b8063150b7a02146105e5578063160cbed71461062957806317977c611461064957806324bc1a641461067757600080fd5b8063046f7da2116103ac578063046f7da21461053857806306f3f9e61461054d57806306fdde031461056d578063143489d01461058f57600080fd5b8063013cf08b1461044d57806301ffc9a7146104c857806302a251a3146104f8578063034201811461051857600080fd5b3661044857306103eb610e89565b6001600160a01b0316146104465760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a206d7573742073656e6420746f206578656375746f720060448201526064015b60405180910390fd5b005b600080fd5b34801561045957600080fd5b5061046d610468366004615c38565b610ea3565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b3480156104d457600080fd5b506104e86104e3366004615c51565b610f5e565b60405190151581526020016104bf565b34801561050457600080fd5b50610195545b6040519081526020016104bf565b34801561052457600080fd5b5061050a610533366004615d97565b610f6f565b34801561054457600080fd5b50610446611067565b34801561055957600080fd5b50610446610568366004615c38565b6110f7565b34801561057957600080fd5b50610582611182565b6040516104bf9190615e8d565b34801561059b57600080fd5b506105cd6105aa366004615c38565b60009081526101636020526040902054600160401b90046001600160a01b031690565b6040516001600160a01b0390911681526020016104bf565b3480156105f157600080fd5b50610610610600366004615eb5565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016104bf565b34801561063557600080fd5b5061050a61064436600461608c565b611215565b34801561065557600080fd5b5061050a61066436600461611b565b6102c36020526000908152604090205481565b34801561068357600080fd5b5061050a611300565b61050a61069a36600461608c565b611326565b3480156106ab57600080fd5b5061050a6106ba366004615c38565b600090815261016360205260409020546001600160401b031690565b3480156106e257600080fd5b5061050a7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561071657600080fd5b5061072a610725366004615c38565b611419565b6040516104bf9493929190616201565b34801561074657600080fd5b5061028f546040516001600160401b0390911681526020016104bf565b34801561076f57600080fd5b506101945461050a565b34801561078557600080fd5b5061050a61079436600461624e565b6116ab565b3480156107a557600080fd5b506107b96107b4366004615c38565b611721565b6040516104bf91906162b2565b3480156107d257600080fd5b506104466107e1366004615c38565b61172c565b3480156107f257600080fd5b5061044661080136600461611b565b611757565b34801561081257600080fd5b506104e86108213660046162da565b60008281526101c6602090815260408083206001600160a01b038516845260080190915290205460ff1692915050565b34801561085d57600080fd5b5061050a61086c36600461608c565b6117d8565b34801561087d57600080fd5b506104e861088c36600461611b565b60016020526000908152604090205460ff1681565b3480156108ad57600080fd5b506104466108bc36600461611b565b6117e6565b3480156108cd57600080fd5b50610582611861565b3480156108e257600080fd5b506104e86108f136600461611b565b6102c16020526000908152604090205460ff1681565b34801561091357600080fd5b506040805180820190915260018152603160f81b6020820152610582565b34801561093d57600080fd5b5061050a61094c36600461630a565b61190e565b34801561095d57600080fd5b5061050a61096c366004616336565b611937565b34801561097d57600080fd5b5061050a61098c366004615c38565b611981565b34801561099d57600080fd5b506104466109ac366004615c38565b611a36565b3480156109bd57600080fd5b5061050a6109cc3660046163b9565b611abe565b3480156109dd57600080fd5b5061050a6109ec366004616412565b611b10565b3480156109fd57600080fd5b50610446611c2b565b348015610a1257600080fd5b50610446611e5c565b348015610a2757600080fd5b50610a30611ef2565b6040516104bf97969594939291906164b2565b348015610a4f57600080fd5b50610a58611f90565b60405165ffffffffffff90911681526020016104bf565b348015610a7b57600080fd5b50606461050a565b348015610a8f57600080fd5b5061050a610a9e366004616514565b612004565b348015610aaf57600080fd5b5061050a61201b565b348015610ac457600080fd5b50610446610ad336600461611b565b612048565b348015610ae457600080fd5b5061050a610af3366004615c38565b6120d0565b348015610b0457600080fd5b50610446610b1336600461656c565b61216c565b348015610b2457600080fd5b5060005462010000900460ff166104e8565b348015610b4257600080fd5b5061050a6128b1565b348015610b5757600080fd5b50610610610b663660046165cb565b63bc197c8160e01b95945050505050565b348015610b8357600080fd5b5061050a610b92366004615c38565b6128bd565b348015610ba357600080fd5b506102c2546104e89060ff1681565b610446610bc036600461665e565b6128c8565b348015610bd157600080fd5b5061050a610be036600461608c565b6129d8565b348015610bf157600080fd5b50610446610c003660046166a1565b612a12565b348015610c1157600080fd5b5061022b546001600160a01b03166105cd565b348015610c3057600080fd5b5061050a610c3f3660046166ca565b612a9a565b348015610c5057600080fd5b5060408051808201909152601a81527f737570706f72743d627261766f2671756f72756d3d627261766f0000000000006020820152610582565b348015610c9657600080fd5b50610446610ca5366004615c38565b612b21565b348015610cb657600080fd5b5061050a7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610cea57600080fd5b50610d79610cf93660046162da565b60408051606081018252600080825260208201819052918101919091525060009182526101c6602090815260408084206001600160a01b0393909316845260089092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b0316908201526060016104bf565b348015610db557600080fd5b50610446610dc4366004615c38565b612b44565b348015610dd557600080fd5b5061050a610de436600461676b565b612bcc565b348015610df557600080fd5b50610446610e04366004615c38565b612bed565b348015610e1557600080fd5b50610610610e24366004616797565b63f23a6e6160e01b95945050505050565b348015610e4157600080fd5b5061050a610e50366004615c38565b612c75565b348015610e6157600080fd5b506101f8546105cd906001600160a01b031681565b610446610e84366004615c38565b612d04565b6000610e9e61022b546001600160a01b031690565b905090565b8060008080808080808080610eb78a6120d0565b60008c815261016360205260409020549098506001600160401b03169650610ede8b6128bd565b60008c81526101c66020526040812080546005820154600683015460078401546001600160a01b039093169e50949a509850929650919450610f1f8d611721565b90506002816007811115610f3557610f3561629c565b1493506007816007811115610f4c57610f4c61629c565b14925050509193959799509193959799565b6000610f6982612d27565b92915050565b60008061101361100b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610fab9291906167ff565b60405180910390208b80519060200120604051602001610ff0959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120612d4c565b868686612d79565b90506110598a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d9250612d97915050565b9a9950505050505050505050565b600054630100000090046001600160a01b03163314611099576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff166110c257604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6110ff610e89565b6001600160a01b0316336001600160a01b03161461112f5760405162461bcd60e51b815260040161043d9061680f565b30611138610e89565b6001600160a01b03161461117657600080366040516111589291906167ff565b604051809103902090505b8061116f610164612e00565b0361116357505b61117f81612e7f565b50565b6060610162805461119290616846565b80601f01602080910402602001604051908101604052809291908181526020018280546111be90616846565b801561120b5780601f106111e05761010080835404028352916020019161120b565b820191906000526020600020905b8154815290600101906020018083116111ee57829003601f168201915b5050505050905090565b6000805462010000900460ff161561124057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156112715760405163b1d02c3d60e01b815260040160405180910390fd5b60005b85518110156112ea576102c1600087838151811061129457611294616880565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166112d857604051630b094f2760e31b815260040160405180910390fd5b806112e2816168ac565b915050611274565b506112f785858585612ff0565b95945050505050565b6000610e9e600161130f611f90565b61131991906168c5565b65ffffffffffff16612c75565b600080611335868686866129d8565b9050600061134282611721565b905060048160078111156113585761135861629c565b1480611375575060058160078111156113735761137361629c565b145b6113915760405162461bcd60e51b815260040161043d906168eb565b6000828152610163602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906113e09084815260200190565b60405180910390a16113f582888888886131f5565b6114028288888888613296565b61140f8288888888613378565b5095945050505050565b60608060608060006101c660008781526020019081526020016000209050806001018160020182600301836004018380548060200260200160405190810160405280929190818152602001828054801561149c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161147e575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156114ee57602002820191906000526020600020905b8154815260200190600101908083116114da575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156115c257838290600052602060002001805461153590616846565b80601f016020809104026020016040519081016040528092919081815260200182805461156190616846565b80156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505081526020019060010190611516565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561169557838290600052602060002001805461160890616846565b80601f016020809104026020016040519081016040528092919081815260200182805461163490616846565b80156116815780601f1061165657610100808354040283529160200191611681565b820191906000526020600020905b81548152906001019060200180831161166457829003601f168201915b5050505050815260200190600101906115e9565b5050505090509450945094509450509193509193565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906116f99061100b90608001610ff0565b9050611716878288604051806020016040528060008152506133b3565b979650505050505050565b6000610f69826133d6565b60008060008061173b85613523565b935093509350935061174f848484846117d8565b505050505050565b600054630100000090046001600160a01b03163314611789576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60006112f7858585856137b4565b600054630100000090046001600160a01b03163314611818576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b6101f85460408051634bf5d7e960e01b815290516060926001600160a01b031691634bf5d7e99160048083019260009291908290030181865afa9250505080156118cd57506040513d6000823e601f3d908101601f191682016040526118ca919081019061692c565b60015b611909575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b60008033905061192f848285604051806020016040528060008152506133b3565b949350505050565b60008033905061171687828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250612d97915050565b61025e5460009080820361199a57505061025d54919050565b600061025e6119aa600184616999565b815481106119ba576119ba616880565b60009182526020918290206040805180820190915291015463ffffffff8116808352600160201b9091046001600160e01b03169282019290925291508410611a1057602001516001600160e01b03169392505050565b611a25611a1c8561387f565b61025e906138e8565b6001600160e01b0316949350505050565b611a3e610e89565b6001600160a01b0316336001600160a01b031614611a6e5760405162461bcd60e51b815260040161043d9061680f565b30611a77610e89565b6001600160a01b031614611ab55760008036604051611a979291906167ff565b604051809103902090505b80611aae610164612e00565b03611aa257505b61117f8161399b565b600080339050611b0686828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133b392505050565b9695505050505050565b6000805462010000900460ff1615611b3b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615611b6c5760405163b1d02c3d60e01b815260040160405180910390fd5b611b746139de565b3360009081526102c360205260409020548015611be9576000611b9682611721565b90506001816007811115611bac57611bac61629c565b1480611bc957506000816007811115611bc757611bc761629c565b145b15611be75760405163867f3ee560e01b815260040160405180910390fd5b505b825160208401206000611bfe888888856129d8565b3360009081526102c3602052604090208190559050611c1f88888888613a89565b98975050505050505050565b600054610100900460ff1615808015611c4b5750600054600160ff909116105b80611c655750303b158015611c65575060005460ff166001145b611cc85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161043d565b6000805460ff191660011790558015611ceb576000805461ff0019166101001790555b334114611d0b5760405163022d8c9560e31b815260040160405180910390fd5b3a15611d2a576040516383f1b1d360e01b815260040160405180910390fd5b611d566040518060400160405280600b81526020016a2129a1a3b7bb32b93737b960a91b815250613af1565b611d82611d65600360006169c2565b611d736003620151806169c2565b68056bc75e2d63100000613b48565b611d8a613b7f565b611d95612005613ba6565b611da0612006613bd6565b611daa600a613c06565b611dbf611dba6003610e106169c2565b613c36565b6110076000526102c16020527f2f832952f0ef896b8c8edd6d16a2e4f2591a90375e33021e3b9ff197f3793fc0805460ff19166001179055611e147330151da466ec8ab345bef3d6983023e050fb0673613c66565b801561117f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b600054630100000090046001600160a01b03163314611e8e576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1615611eb857604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6000606080600080600060606098546000801b148015611f125750609954155b611f565760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161043d565b611f5e613cb9565b611f66613cc8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6101f854604080516324776b7d60e21b815290516000926001600160a01b0316916391ddadf49160048083019260209291908290030181865afa925050508015611ff7575060408051601f3d908101601f19168201909252611ff4918101906169e4565b60015b61190957610e9e43613cd7565b6000612011848484613d3e565b90505b9392505050565b61025e54600090156120405761203261025e613db5565b6001600160e01b0316905090565b5061025d5490565b612050610e89565b6001600160a01b0316336001600160a01b0316146120805760405162461bcd60e51b815260040161043d9061680f565b30612089610e89565b6001600160a01b0316146120c757600080366040516120a99291906167ff565b604051809103902090505b806120c0610164612e00565b036120b457505b61117f81613de5565b61022b54600082815261022c602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa15801561212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121539190616a0c565b9050806001146121635780612014565b60009392505050565b336110071461219257604051630f22c43960e41b8152611007600482015260240161043d565b6121f86040518060400160405280600b81526020016a766f74696e6744656c617960a81b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e509050565b156122ad57602081146122265783838383604051630a5a604160e01b815260040161043d9493929190616a4e565b604080516020601f8401819004810282018101909252828152600091612267918585808385018382808284376000920191909152509293925050613ea99050565b905080158061227857506201518081115b1561229e5784848484604051630a5a604160e01b815260040161043d9493929190616a4e565b6122a78161399b565b5061286e565b6123146040518060400160405280600c81526020016b1d9bdd1a5b99d4195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e509050565b156123c357602081146123425783838383604051630a5a604160e01b815260040161043d9493929190616a4e565b604080516020601f8401819004810282018101909252828152600091612383918585808385018382808284376000920191909152509293925050613ea99050565b9050801580612394575062278d0081115b156123ba5784848484604051630a5a604160e01b815260040161043d9493929190616a4e565b6122a781613eae565b61242f604051806040016040528060118152602001701c1c9bdc1bdcd85b151a1c995cda1bdb19607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e509050565b156124e5576020811461245d5783838383604051630a5a604160e01b815260040161043d9493929190616a4e565b604080516020601f840181900481028201810190925282815260009161249e918585808385018382808284376000920191909152509293925050613ea99050565b90508015806124b6575069021e19e0c9bab240000081115b156124dc5784848484604051630a5a604160e01b815260040161043d9493929190616a4e565b6122a781613f51565b61254f6040518060400160405280600f81526020016e38bab7b93ab6a73ab6b2b930ba37b960891b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e509050565b156125fe576020811461257d5783838383604051630a5a604160e01b815260040161043d9493929190616a4e565b604080516020601f84018190048102820181019092528281526000916125be918585808385018382808284376000920191909152509293925050613ea99050565b905060058110806125cf5750601481115b156125f55784848484604051630a5a604160e01b815260040161043d9493929190616a4e565b6122a781612e7f565b61266d604051806040016040528060148152602001736d696e506572696f64416674657251756f72756d60601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e509050565b15612733576008811461269b5783838383604051630a5a604160e01b815260040161043d9493929190616a4e565b60006126e1600884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea99050565b90506001600160401b038116158061270457506202a300816001600160401b0316115b1561272a5784848484604051630a5a604160e01b815260040161043d9493929190616a4e565b6122a781613f94565b61279f6040518060400160405280601181526020017033b7bb32b93737b9283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e509050565b1561284d57601481146127cd5783838383604051630a5a604160e01b815260040161043d9493929190616a4e565b6000612813601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ea99050565b90506001600160a01b0381166128445784848484604051630a5a604160e01b815260040161043d9493929190616a4e565b6122a781614000565b838383836040516325ee20d560e21b815260040161043d9493929190616a4e565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516128a39493929190616a4e565b60405180910390a150505050565b6000610e9e6101965490565b6000610f698261406c565b6128d0610e89565b6001600160a01b0316336001600160a01b0316146129005760405162461bcd60e51b815260040161043d9061680f565b30612909610e89565b6001600160a01b03161461294757600080366040516129299291906167ff565b604051809103902090505b80612940610164612e00565b0361293457505b600080856001600160a01b03168585856040516129659291906167ff565b60006040518083038185875af1925050503d80600081146129a2576040519150601f19603f3d011682016040523d82523d6000602084013e6129a7565b606091505b50915091506129cf8282604051806060016040528060288152602001616eab602891396140aa565b50505050505050565b6000848484846040516020016129f19493929190616a75565b60408051601f19818403018152919052805160209091012095945050505050565b612a1a610e89565b6001600160a01b0316336001600160a01b031614612a4a5760405162461bcd60e51b815260040161043d9061680f565b30612a53610e89565b6001600160a01b031614612a915760008036604051612a739291906167ff565b604051809103902090505b80612a8a610164612e00565b03612a7e57505b61117f81613f94565b60008251845114612afe5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a20696e76616c6964207369676e61747572656044820152670e640d8cadccee8d60c31b606482015260840161043d565b612b0c3387878787876140c3565b611b068686612b1b8787614181565b85611b10565b600080600080612b3085613523565b935093509350935061174f84848484611215565b612b4c610e89565b6001600160a01b0316336001600160a01b031614612b7c5760405162461bcd60e51b815260040161043d9061680f565b30612b85610e89565b6001600160a01b031614612bc35760008036604051612ba59291906167ff565b604051809103902090505b80612bbc610164612e00565b03612bb057505b61117f81613eae565b60006120148383612be860408051602081019091526000815290565b613d3e565b612bf5610e89565b6001600160a01b0316336001600160a01b031614612c255760405162461bcd60e51b815260040161043d9061680f565b30612c2e610e89565b6001600160a01b031614612c6c5760008036604051612c4e9291906167ff565b604051809103902090505b80612c65610164612e00565b03612c5957505b61117f81613f51565b60006064612c8283611981565b6101f854604051632394e7a360e21b8152600481018690526001600160a01b0390911690638e539e8c90602401602060405180830381865afa158015612ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf09190616a0c565b612cfa9190616ac0565b610f6991906169c2565b600080600080612d1385613523565b935093509350935061174f84848484611326565b60006001600160e01b03198216636e665ced60e01b1480610f695750610f69826142b3565b6000610f69612d5961434f565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000612d8a87878787614359565b9150915061140f8161441d565b6000805462010000900460ff1615612dc257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615612df35760405163b1d02c3d60e01b815260040160405180910390fd5b611b068686868686614567565b6000612e1b8254600f81810b600160801b909204900b131590565b15612e3957604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b6064811115612f025760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a40161043d565b6000612f0c61201b565b90508015801590612f1e575061025e54155b15612f8357604080518082019091526000815261025e9060208101612f428461466a565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b612fb1612f9e612f91611f90565b65ffffffffffff1661387f565b612fa78461466a565b61025e91906146d3565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b600080612fff868686866129d8565b9050600461300c82611721565b600781111561301d5761301d61629c565b1461303a5760405162461bcd60e51b815260040161043d906168eb565b61022b546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015613085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a99190616a0c565b61022b5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f427906130e4908a908a908a906000908b90600401616ad7565b602060405180830381865afa158015613101573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131259190616a0c565b600083815261022c60205260408082209290925561022b5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb091613172918b918b918b91908b908990600401616b25565b600060405180830381600087803b15801561318c57600080fd5b505af11580156131a0573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426131d29190616b7d565b604080519283526020830191909152015b60405180910390a15095945050505050565b306131fe610e89565b6001600160a01b03161461328f5760005b845181101561174f57306001600160a01b031685828151811061323457613234616880565b60200260200101516001600160a01b03160361327f5761327f83828151811061325f5761325f616880565b6020026020010151805190602001206101646146ee90919063ffffffff16565b613288816168ac565b905061320f565b5050505050565b60005462010000900460ff16156132c057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156132f15760405163b1d02c3d60e01b815260040160405180910390fd5b60005b845181101561336a576102c1600086838151811061331457613314616880565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1661335857604051630b094f2760e31b815260040160405180910390fd5b80613362816168ac565b9150506132f4565b5061328f858585858561472a565b30613381610e89565b6001600160a01b03161461328f5761016454600f81810b600160801b909204900b131561328f5760006101645561328f565b60006112f7858585856133d160408051602081019091526000815290565b612d97565b6000806133e28361479f565b905060048160078111156133f8576133f861629c565b146134035792915050565b600083815261022c60205260409020548061341f575092915050565b61022b54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa158015613469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348d9190616b90565b1561349c575060079392505050565b61022b54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa1580156134e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350a9190616b90565b15613519575060059392505050565b5060029392505050565b60608060606000806101c66000878152602001908152602001600020905080600101816002016136f583600301805480602002602001604051908101604052809291908181526020016000905b8282101561361c57838290600052602060002001805461358f90616846565b80601f01602080910402602001604051908101604052809291908181526020018280546135bb90616846565b80156136085780601f106135dd57610100808354040283529160200191613608565b820191906000526020600020905b8154815290600101906020018083116135eb57829003601f168201915b505050505081526020019060010190613570565b50505060048601805460408051602080840282018101909252828152935060009084015b828210156136ec57838290600052602060002001805461365f90616846565b80601f016020809104026020016040519081016040528092919081815260200182805461368b90616846565b80156136d85780601f106136ad576101008083540402835291602001916136d8565b820191906000526020600020905b8154815290600101906020018083116136bb57829003601f168201915b505050505081526020019060010190613640565b50505050614181565b600984015483546040805160208084028201810190925282815291869183018282801561374b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161372d575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561379d57602002820191906000526020600020905b815481526020019060010190808311613789575b505050505092509450945094509450509193509193565b6000806137c3868686866129d8565b60008181526101c660205260409020549091506001600160a01b03163381148061381757506137f06128b1565b6138158260016137fe611f90565b61380891906168c5565b65ffffffffffff16612bcc565b105b6138735760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a2070726f706f7365722061626f76652074686044820152661c995cda1bdb1960ca1b606482015260840161043d565b611716878787876148d7565b600063ffffffff8211156138e45760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161043d565b5090565b815460009081816005811115613945576000613903846148e5565b61390d9085616999565b60008881526020902090915081015463ffffffff908116908716101561393557809150613943565b613940816001616b7d565b92505b505b6000613953878785856149cd565b9050801561398e576139788761396a600184616999565b600091825260209091200190565b54600160201b90046001600160e01b0316611716565b6000979650505050505050565b6101945460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161019455565b6102c25460ff16613a87576a084595161401484a0000006120056001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a599190616a0c565b1015613a78576040516311b6707f60e01b815260040160405180910390fd5b6102c2805460ff191660011790555b565b6000613ae533868686516001600160401b03811115613aaa57613aaa615cd4565b604051908082528060200260200182016040528015613add57816020015b6060815260200190600190039081613ac85790505b5087876140c3565b6112f785858585614a23565b600054610100900460ff16613b185760405162461bcd60e51b815260040161043d90616bb2565b613b3f81613b3a6040805180820190915260018152603160f81b602082015290565b614e02565b61117f81614e51565b600054610100900460ff16613b6f5760405162461bcd60e51b815260040161043d90616bb2565b613b7a838383614e89565b505050565b600054610100900460ff16613a875760405162461bcd60e51b815260040161043d90616bb2565b600054610100900460ff16613bcd5760405162461bcd60e51b815260040161043d90616bb2565b61117f81614ecb565b600054610100900460ff16613bfd5760405162461bcd60e51b815260040161043d90616bb2565b61117f81614f15565b600054610100900460ff16613c2d5760405162461bcd60e51b815260040161043d90616bb2565b61117f81614f3c565b600054610100900460ff16613c5d5760405162461bcd60e51b815260040161043d90616bb2565b61117f81614f63565b600054610100900460ff16613c8d5760405162461bcd60e51b815260040161043d90616bb2565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6060609a805461119290616846565b6060609b805461119290616846565b600065ffffffffffff8211156138e45760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b606482015260840161043d565b6101f854604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613d91573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120119190616a0c565b8054600090801561216357613dcf8361396a600184616999565b54600160201b90046001600160e01b0316612014565b61022b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a161022b80546001600160a01b0319166001600160a01b0392909216919091179055565b600081604051602001613e639190616bfd565b6040516020818303038152906040528051906020012083604051602001613e8a9190616bfd565b6040516020818303038152906040528051906020012014905092915050565b015190565b60008111613f0e5760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b606482015260840161043d565b6101955460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161019555565b6101965460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161019655565b61028f54604080516001600160401b03928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a161028f805467ffffffffffffffff19166001600160401b0392909216919091179055565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60008181526101636020526040812060010154610f69906001600160401b0316600084815261029060205260409020546001600160401b0316614f8a565b606083156140b9575081612014565b6120148383614fa0565b8051602082012060006140e187876140db8888614181565b856129d8565b60008181526101c6602052604090206009810154919250906141765780546001600160a01b0319166001600160a01b038a16178155875161412b90600183019060208b0190615a6f565b50865161414190600283019060208a0190615ad0565b5085516141579060038301906020890190615b0b565b50845161416d9060048301906020880190615b5d565b50600981018390555b505050505050505050565b6060600082516001600160401b0381111561419e5761419e615cd4565b6040519080825280602002602001820160405280156141d157816020015b60608152602001906001900390816141bc5790505b50905060005b81518110156142ab578481815181106141f2576141f2616880565b6020026020010151516000146142625784818151811061421457614214616880565b60200260200101518051906020012084828151811061423557614235616880565b602002602001015160405160200161424e929190616c19565b60405160208183030381529060405261427d565b83818151811061427457614274616880565b60200260200101515b82828151811061428f5761428f616880565b6020026020010181905250806142a4906168ac565b90506141d7565b509392505050565b600063288ace0360e11b6318df743f60e31b63bf26d89760e01b6379dd796f60e01b6001600160e01b031986168214806142f957506001600160e01b0319868116908216145b8061431057506001600160e01b0319868116908516145b8061432b57506001600160e01b03198616630271189760e51b145b80611b0657506301ffc9a760e01b6001600160e01b03198716149695505050505050565b6000610e9e614fca565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156143905750600090506003614414565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156143e4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661440d57600060019250925050614414565b9150600090505b94509492505050565b60008160048111156144315761443161629c565b036144395750565b600181600481111561444d5761444d61629c565b0361449a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161043d565b60028160048111156144ae576144ae61629c565b036144fb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161043d565b600381600481111561450f5761450f61629c565b0361117f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161043d565b600080614577878787878761503e565b600088815261029060205260409020549091506001600160401b03161580156145a457506145a487615194565b15611b065760006145be61028f546001600160401b031690565b6145c6611f90565b65ffffffffffff166145d89190616c4a565b90506145e3886128bd565b816001600160401b03161115614632576040516001600160401b038216815288907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b600088815261029060205260409020805467ffffffffffffffff19166001600160401b03929092169190911790559695505050505050565b60006001600160e01b038211156138e45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161043d565b6000806146e18585856151d4565b915091505b935093915050565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61022b5460405163e38335e560e01b81526001600160a01b039091169063e38335e5903490614766908890889088906000908990600401616ad7565b6000604051808303818588803b15801561477f57600080fd5b505af1158015614793573d6000803e3d6000fd5b50505050505050505050565b600081815261016360205260408120600281015460ff16156147c45750600792915050565b6002810154610100900460ff16156147df5750600292915050565b600083815261016360205260408120546001600160401b0316908190036148485760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000604482015260640161043d565b6000614852611f90565b65ffffffffffff16905080821061486e57506000949350505050565b6000614879866128bd565b905081811061488e5750600195945050505050565b61489786615194565b80156148ba575060008681526101c6602052604090206006810154600590910154115b156148cb5750600495945050505050565b50600395945050505050565b60006112f785858585615373565b6000816000036148f757506000919050565b6000600161490484615429565b901c6001901b9050600181848161491d5761491d6169ac565b048201901c90506001818481614935576149356169ac565b048201901c9050600181848161494d5761494d6169ac565b048201901c90506001818481614965576149656169ac565b048201901c9050600181848161497d5761497d6169ac565b048201901c90506001818481614995576149956169ac565b048201901c905060018184816149ad576149ad6169ac565b048201901c9050612014818285816149c7576149c76169ac565b046154bd565b60005b818310156142ab5760006149e484846154cc565b60008781526020902090915063ffffffff86169082015463ffffffff161115614a0f57809250614a1d565b614a1a816001616b7d565b93505b506149d0565b600033614a3081846154e7565b614a7c5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f7365722072657374726963746564000000604482015260640161043d565b6000614a86611f90565b65ffffffffffff169050614a986128b1565b614aa783610de4600185616999565b1015614b0f5760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b606482015260840161043d565b6000614b2488888888805190602001206129d8565b90508651885114614b475760405162461bcd60e51b815260040161043d90616c6a565b8551885114614b685760405162461bcd60e51b815260040161043d90616c6a565b6000885111614bb95760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000604482015260640161043d565b600081815261016360205260409020546001600160401b031615614c295760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b606482015260840161043d565b6000614c356101945490565b614c3f9084616b7d565b90506000614c4d6101955490565b614c579083616b7d565b90506040518060e00160405280614c6d846155d8565b6001600160401b031681526001600160a01b038716602082015260006040820152606001614c9a836155d8565b6001600160401b03908116825260006020808401829052604080850183905260609485018390528883526101638252918290208551815492870151878501519186166001600160e01b031990941693909317600160401b6001600160a01b039094168402176001600160e01b0316600160e01b60e09290921c91909102178155938501516080860151908416921c0217600183015560a08301516002909201805460c09094015161ffff1990941692151561ff00191692909217610100931515939093029290921790558a517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091859188918e918e91811115614d9f57614d9f615cd4565b604051908082528060200260200182016040528015614dd257816020015b6060815260200190600190039081614dbd5790505b508d88888f604051614dec99989796959493929190616cab565b60405180910390a1509098975050505050505050565b600054610100900460ff16614e295760405162461bcd60e51b815260040161043d90616bb2565b609a614e358382616d89565b50609b614e428282616d89565b50506000609881905560995550565b600054610100900460ff16614e785760405162461bcd60e51b815260040161043d90616bb2565b610162614e858282616d89565b5050565b600054610100900460ff16614eb05760405162461bcd60e51b815260040161043d90616bb2565b614eb98361399b565b614ec282613eae565b613b7a81613f51565b600054610100900460ff16614ef25760405162461bcd60e51b815260040161043d90616bb2565b6101f880546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166120c75760405162461bcd60e51b815260040161043d90616bb2565b600054610100900460ff166111765760405162461bcd60e51b815260040161043d90616bb2565b600054610100900460ff16612a915760405162461bcd60e51b815260040161043d90616bb2565b6000818311614f995781612014565b5090919050565b815115614fb05781518083602001fd5b8060405162461bcd60e51b815260040161043d9190615e8d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614ff5615640565b614ffd615699565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600085815261016360205260408120600161505888611721565b60078111156150695761506961629c565b146150c25760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b606482015260840161043d565b80546000906150dc9088906001600160401b031686613d3e565b90506150eb88888884886156ca565b835160000361514057866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516151339493929190616e48565b60405180910390a2611716565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051615181959493929190616e70565b60405180910390a2979650505050505050565b60008181526101c66020526040812060058101546151cb610e5085600090815261016360205260409020546001600160401b031690565b11159392505050565b82546000908190801561531a5760006151f28761396a600185616999565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090871610156152735760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b6579730000000000604482015260640161043d565b805163ffffffff8088169116036152bb57846152948861396a600186616999565b80546001600160e01b0392909216600160201b0263ffffffff90921691909117905561530a565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b6020015192508391506146e69050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b0291909316179201919091559050816146e6565b60008061538286868686615868565b600081815261022c6020526040902054909150156112f75761022b54600082815261022c60205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f5916153de9160040190815260200190565b600060405180830381600087803b1580156153f857600080fd5b505af115801561540c573d6000803e3d6000fd5b505050600082815261022c60205260408120555095945050505050565b600080608083901c1561543e57608092831c92015b604083901c1561545057604092831c92015b602083901c1561546257602092831c92015b601083901c1561547457601092831c92015b600883901c1561548657600892831c92015b600483901c1561549857600492831c92015b600283901c156154aa57600292831c92015b600183901c15610f695760010192915050565b6000818310614f995781612014565b60006154db60028484186169c2565b61201490848416616b7d565b805160009060348110156154ff576001915050610f69565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b1461553257600192505050610f69565b600080615540602885616999565b90505b838110156155b75760008061557788848151811061556357615563616880565b01602001516001600160f81b031916615975565b915091508161558f5760019650505050505050610f69565b8060ff166004856001600160a01b0316901b1793505050806155b0906168ac565b9050615543565b50856001600160a01b0316816001600160a01b031614935050505092915050565b60006001600160401b038211156138e45760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b606482015260840161043d565b60008061564b613cb9565b805190915015615662578051602090910120919050565b60985480156156715792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806156a4613cc8565b8051909150156156bb578051602090910120919050565b60995480156156715792915050565b60008581526101c6602090815260408083206001600160a01b038816845260088101909252909120805460ff161561575a5760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20766f746560448201526c08185b1c9958591e4818d85cdd609a1b606482015260840161043d565b805460ff86166101000261ffff1990911617600117815561577a84615a07565b81546001600160601b039190911662010000026dffffffffffffffffffffffff00001990911617815560ff85166157ca57838260060160008282546157bf9190616b7d565b909155506129cf9050565b60001960ff8616016157ea57838260050160008282546157bf9190616b7d565b60011960ff86160161580a57838260070160008282546157bf9190616b7d565b60405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20696e766160448201526c6c696420766f7465207479706560981b606482015260840161043d565b600080615877868686866129d8565b9050600061588482611721565b9050600281600781111561589a5761589a61629c565b141580156158ba575060068160078111156158b7576158b761629c565b14155b80156158d8575060078160078111156158d5576158d561629c565b14155b6159245760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f7420616374697665000000604482015260640161043d565b6000828152610163602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906131e39084815260200190565b60008060f883901c602f811180156159905750603a8160ff16105b156159a557600194602f199091019350915050565b8060ff1660401080156159bb575060478160ff16105b156159d0576001946036199091019350915050565b8060ff1660601080156159e6575060678160ff16105b156159fb576001946056199091019350915050565b50600093849350915050565b60006001600160601b038211156138e45760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b606482015260840161043d565b828054828255906000526020600020908101928215615ac4579160200282015b82811115615ac457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615a8f565b506138e4929150615baf565b828054828255906000526020600020908101928215615ac4579160200282015b82811115615ac4578251825591602001919060010190615af0565b828054828255906000526020600020908101928215615b51579160200282015b82811115615b515782518290615b419082616d89565b5091602001919060010190615b2b565b506138e4929150615bc4565b828054828255906000526020600020908101928215615ba3579160200282015b82811115615ba35782518290615b939082616d89565b5091602001919060010190615b7d565b506138e4929150615be1565b5b808211156138e45760008155600101615bb0565b808211156138e4576000615bd88282615bfe565b50600101615bc4565b808211156138e4576000615bf58282615bfe565b50600101615be1565b508054615c0a90616846565b6000825580601f10615c1a575050565b601f01602090049060005260206000209081019061117f9190615baf565b600060208284031215615c4a57600080fd5b5035919050565b600060208284031215615c6357600080fd5b81356001600160e01b03198116811461201457600080fd5b803560ff8116811461190957600080fd5b60008083601f840112615c9e57600080fd5b5081356001600160401b03811115615cb557600080fd5b602083019150836020828501011115615ccd57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615d1257615d12615cd4565b604052919050565b60006001600160401b03821115615d3357615d33615cd4565b50601f01601f191660200190565b600082601f830112615d5257600080fd5b8135615d65615d6082615d1a565b615cea565b818152846020838601011115615d7a57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b031215615db357600080fd5b88359750615dc360208a01615c7b565b965060408901356001600160401b0380821115615ddf57600080fd5b615deb8c838d01615c8c565b909850965060608b0135915080821115615e0457600080fd5b50615e118b828c01615d41565b945050615e2060808a01615c7b565b925060a0890135915060c089013590509295985092959890939650565b60005b83811015615e58578181015183820152602001615e40565b50506000910152565b60008151808452615e79816020860160208601615e3d565b601f01601f19169290920160200192915050565b6020815260006120146020830184615e61565b6001600160a01b038116811461117f57600080fd5b60008060008060808587031215615ecb57600080fd5b8435615ed681615ea0565b93506020850135615ee681615ea0565b92506040850135915060608501356001600160401b03811115615f0857600080fd5b615f1487828801615d41565b91505092959194509250565b60006001600160401b03821115615f3957615f39615cd4565b5060051b60200190565b600082601f830112615f5457600080fd5b81356020615f64615d6083615f20565b82815260059290921b84018101918181019086841115615f8357600080fd5b8286015b84811015615fa7578035615f9a81615ea0565b8352918301918301615f87565b509695505050505050565b600082601f830112615fc357600080fd5b81356020615fd3615d6083615f20565b82815260059290921b84018101918181019086841115615ff257600080fd5b8286015b84811015615fa75780358352918301918301615ff6565b600082601f83011261601e57600080fd5b8135602061602e615d6083615f20565b82815260059290921b8401810191818101908684111561604d57600080fd5b8286015b84811015615fa75780356001600160401b038111156160705760008081fd5b61607e8986838b0101615d41565b845250918301918301616051565b600080600080608085870312156160a257600080fd5b84356001600160401b03808211156160b957600080fd5b6160c588838901615f43565b955060208701359150808211156160db57600080fd5b6160e788838901615fb2565b945060408701359150808211156160fd57600080fd5b5061610a8782880161600d565b949793965093946060013593505050565b60006020828403121561612d57600080fd5b813561201481615ea0565b600081518084526020808501945080840160005b838110156161715781516001600160a01b03168752958201959082019060010161614c565b509495945050505050565b600081518084526020808501945080840160005b8381101561617157815187529582019590820190600101616190565b600081518084526020808501808196508360051b8101915082860160005b858110156161f45782840389526161e2848351615e61565b988501989350908401906001016161ca565b5091979650505050505050565b6080815260006162146080830187616138565b8281036020840152616226818761617c565b9050828103604084015261623a81866161ac565b9050828103606084015261171681856161ac565b600080600080600060a0868803121561626657600080fd5b8535945061627660208701615c7b565b935061628460408701615c7b565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106162d457634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156162ed57600080fd5b8235915060208301356162ff81615ea0565b809150509250929050565b6000806040838503121561631d57600080fd5b8235915061632d60208401615c7b565b90509250929050565b60008060008060006080868803121561634e57600080fd5b8535945061635e60208701615c7b565b935060408601356001600160401b038082111561637a57600080fd5b61638689838a01615c8c565b9095509350606088013591508082111561639f57600080fd5b506163ac88828901615d41565b9150509295509295909350565b600080600080606085870312156163cf57600080fd5b843593506163df60208601615c7b565b925060408501356001600160401b038111156163fa57600080fd5b61640687828801615c8c565b95989497509550505050565b6000806000806080858703121561642857600080fd5b84356001600160401b038082111561643f57600080fd5b61644b88838901615f43565b9550602087013591508082111561646157600080fd5b61646d88838901615fb2565b9450604087013591508082111561648357600080fd5b61648f8883890161600d565b935060608701359150808211156164a557600080fd5b50615f1487828801615d41565b60ff60f81b8816815260e0602082015260006164d160e0830189615e61565b82810360408401526164e38189615e61565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501529050611059818561617c565b60008060006060848603121561652957600080fd5b833561653481615ea0565b92506020840135915060408401356001600160401b0381111561655657600080fd5b61656286828701615d41565b9150509250925092565b6000806000806040858703121561658257600080fd5b84356001600160401b038082111561659957600080fd5b6165a588838901615c8c565b909650945060208701359150808211156165be57600080fd5b5061640687828801615c8c565b600080600080600060a086880312156165e357600080fd5b85356165ee81615ea0565b945060208601356165fe81615ea0565b935060408601356001600160401b038082111561661a57600080fd5b61662689838a01615fb2565b9450606088013591508082111561663c57600080fd5b61664889838a01615fb2565b9350608088013591508082111561639f57600080fd5b6000806000806060858703121561667457600080fd5b843561667f81615ea0565b93506020850135925060408501356001600160401b038111156163fa57600080fd5b6000602082840312156166b357600080fd5b81356001600160401b038116811461201457600080fd5b600080600080600060a086880312156166e257600080fd5b85356001600160401b03808211156166f957600080fd5b61670589838a01615f43565b9650602088013591508082111561671b57600080fd5b61672789838a01615fb2565b9550604088013591508082111561673d57600080fd5b61674989838a0161600d565b9450606088013591508082111561675f57600080fd5b61664889838a0161600d565b6000806040838503121561677e57600080fd5b823561678981615ea0565b946020939093013593505050565b600080600080600060a086880312156167af57600080fd5b85356167ba81615ea0565b945060208601356167ca81615ea0565b9350604086013592506060860135915060808601356001600160401b038111156167f357600080fd5b6163ac88828901615d41565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c9082168061685a57607f821691505b60208210810361687a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016168be576168be616896565b5060010190565b65ffffffffffff8281168282160390808211156168e4576168e4616896565b5092915050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b60006020828403121561693e57600080fd5b81516001600160401b0381111561695457600080fd5b8201601f8101841361696557600080fd5b8051616973615d6082615d1a565b81815285602083850101111561698857600080fd5b6112f7826020830160208601615e3d565b81810381811115610f6957610f69616896565b634e487b7160e01b600052601260045260246000fd5b6000826169df57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156169f657600080fd5b815165ffffffffffff8116811461201457600080fd5b600060208284031215616a1e57600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000616a62604083018688616a25565b8281036020840152611716818587616a25565b608081526000616a886080830187616138565b8281036020840152616a9a818761617c565b90508281036040840152616aae81866161ac565b91505082606083015295945050505050565b8082028115828204841417610f6957610f69616896565b60a081526000616aea60a0830188616138565b8281036020840152616afc818861617c565b90508281036040840152616b1081876161ac565b60608401959095525050608001529392505050565b60c081526000616b3860c0830189616138565b8281036020840152616b4a818961617c565b90508281036040840152616b5e81886161ac565b60608401969096525050608081019290925260a0909101529392505050565b80820180821115610f6957610f69616896565b600060208284031215616ba257600080fd5b8151801515811461201457600080fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251616c0f818460208701615e3d565b9190910192915050565b6001600160e01b0319831681528151600090616c3c816004850160208701615e3d565b919091016004019392505050565b6001600160401b038181168382160190808211156168e4576168e4616896565b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b8981526001600160a01b038916602082015261012060408201819052600090616cd68382018b616138565b90508281036060840152616cea818a61617c565b90508281036080840152616cfe81896161ac565b905082810360a0840152616d1281886161ac565b90508560c08401528460e0840152828103610100840152616d338185615e61565b9c9b505050505050505050505050565b601f821115613b7a57600081815260208120601f850160051c81016020861015616d6a5750805b601f850160051c820191505b8181101561174f57828155600101616d76565b81516001600160401b03811115616da257616da2615cd4565b616db681616db08454616846565b84616d43565b602080601f831160018114616deb5760008415616dd35750858301515b600019600386901b1c1916600185901b17855561174f565b600085815260208120601f198616915b82811015616e1a57888601518255948401946001909101908401616dfb565b5085821015616e385787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b84815260ff84166020820152826040820152608060608201526000611b066080830184615e61565b85815260ff8516602082015283604082015260a060608201526000616e9860a0830185615e61565b8281036080840152611c1f8185615e6156fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765a164736f6c6343000811000a" + }, + "0x0000000000000000000000000000000000002005": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f5780639ab24eb0116100a2578063d505accf11610071578063d505accf14610479578063dd62ed3e1461048c578063e5ed5b1e1461049f578063f1127ed8146104b257600080fd5b80639ab24eb01461042d578063a457c2d714610440578063a9059cbb14610453578063c3cda5201461046657600080fd5b806384b0196e116100de57806384b0196e146103d85780638e539e8c146103f357806391ddadf41461040657806395d89b411461042557600080fd5b806370a082311461038657806379cc6790146103af5780637ecebe00146103bd5780638129fc1c146103d057600080fd5b806339509351116101875780634bf5d7e9116101565780634bf5d7e9146102ff578063587cde1e146103075780635c19a95c1461034b5780636fcfff451461035e57600080fd5b806339509351146102b35780633a46b1a8146102c657806342966c68146102d957806344840775146102ec57600080fd5b806323b872dd116101c357806323b872dd146102745780633041949b14610287578063313ce5671461029c5780633644e515146102ab57600080fd5b8063039c91fc146101f557806306fdde0314610234578063095ea7b31461024957806318160ddd1461026c575b600080fd5b61022161020336600461209b565b61013060209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61023c6104ef565b60405161022b9190612114565b61025c610257366004612127565b610581565b604051901515815260200161022b565b603554610221565b61025c610282366004612151565b61059b565b61029a61029536600461209b565b6105bf565b005b6040516012815260200161022b565b6102216105f8565b61025c6102c1366004612127565b610607565b6102216102d4366004612127565b610629565b61029a6102e736600461218d565b6106ae565b61029a6102fa3660046121a6565b6106c7565b61023c610740565b61033361031536600461222a565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b03909116815260200161022b565b61029a61035936600461222a565b6107d8565b61037161036c36600461222a565b6107e5565b60405163ffffffff909116815260200161022b565b61022161039436600461222a565b6001600160a01b031660009081526033602052604090205490565b61029a6102e7366004612127565b6102216103cb36600461222a565b610807565b61029a610825565b6103e0610a05565b60405161022b9796959493929190612245565b61022161040136600461218d565b610aa3565b61040e610b0b565b60405165ffffffffffff909116815260200161022b565b61023c610b16565b61022161043b36600461222a565b610b25565b61025c61044e366004612127565b610ba7565b61025c610461366004612127565b610c22565b61029a6104743660046122ec565b610c30565b61029a610487366004612344565b610d66565b61022161049a36600461209b565b610eca565b61029a6104ad36600461209b565b610ef5565b6104c56104c03660046123ae565b610f25565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161022b565b6060603680546104fe906123ee565b80601f016020809104026020016040519081016040528092919081815260200182805461052a906123ee565b80156105775780601f1061054c57610100808354040283529160200191610577565b820191906000526020600020905b81548152906001019060200180831161055a57829003601f168201915b5050505050905090565b60003361058f818585610fa9565b60019150505b92915050565b6000336105a9858285610fc2565b6105b485858561103c565b506001949350505050565b33612002146105ea57604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b6105f48282611055565b5050565b6000610602611185565b905090565b60003361058f81858561061a8383610eca565b6106249190612438565b610fa9565b6000610633610b0b565b65ffffffffffff1682106106855760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016105e1565b6001600160a01b038316600090815260ff602052604090206106a7908361118f565b9392505050565b60405163e5d8776760e01b815260040160405180910390fd5b33612002146106ed57604051630f22c43960e41b815261200260048201526024016105e1565b8160005b818110156107395761072985858381811061070e5761070e61244b565b9050602002016020810190610723919061222a565b84611055565b61073281612461565b90506106f1565b5050505050565b60604361074b610b0b565b65ffffffffffff16146107a05760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f646500000060448201526064016105e1565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6107e23382611278565b50565b6001600160a01b038116600090815260ff6020526040812054610595906112f2565b6001600160a01b038116600090815260cb6020526040812054610595565b600054610100900460ff16158080156108455750600054600160ff909116105b8061085f5750303b15801561085f575060005460ff166001145b6108c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105e1565b6000805460ff1916600117905580156108e5576000805461ff0019166101001790555b3341146109055760405163022d8c9560e31b815260040160405180910390fd5b3a15610924576040516383f1b1d360e01b815260040160405180910390fd5b610978604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506040518060400160405280600681526020016533b7bb21272160d11b81525061135b565b61098061138c565b6109b5604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506113b5565b6109bd61138c565b80156107e2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000606080600080600060606097546000801b148015610a255750609854155b610a695760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016105e1565b610a716113ff565b610a7961140e565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610aad610b0b565b65ffffffffffff168210610aff5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016105e1565b6105956101008361118f565b60006106024361141d565b6060603780546104fe906123ee565b6001600160a01b038116600090815260ff60205260408120548015610b94576001600160a01b038316600090815260ff6020526040902080546000198301908110610b7257610b7261244b565b60009182526020909120015464010000000090046001600160e01b0316610b97565b60005b6001600160e01b03169392505050565b60003381610bb58286610eca565b905083811015610c155760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105e1565b6105b48286868403610fa9565b60003361058f81858561103c565b83421115610c805760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016105e1565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610cfa90610cf29060a00160405160208183030381529060405280519060200120611484565b8585856114b1565b9050610d05816114d9565b8614610d535760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016105e1565b610d5d8188611278565b50505050505050565b83421115610db65760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016105e1565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610de58c6114d9565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610e4082611484565b90506000610e50828787876114b1565b9050896001600160a01b0316816001600160a01b031614610eb35760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016105e1565b610ebe8a8a8a610fa9565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3361200214610f1b57604051630f22c43960e41b815261200260048201526024016105e1565b6105f48282611278565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110610f6957610f6961244b565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b604051632028747160e01b815260040160405180910390fd5b6000610fce8484610eca565b9050600019811461103657818110156110295760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105e1565b6110368484848403610fa9565b50505050565b604051638cd22d1960e01b815260040160405180910390fd5b604051630913db4760e01b81526001600160a01b03828116600483015260009190841690630913db4790602401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190612490565b6001600160a01b03808516600090815261013060209081526040808320938716835292905220549091508181101561113c57600061110182846124a9565b6001600160a01b0380871660009081526101306020908152604080832093891683529290522084905590506111368482611501565b50611036565b8181111561103657600061115083836124a9565b6001600160a01b038087166000908152610130602090815260408083209389168352929052208490559050610739848261150b565b6000610602611515565b8154600090818160058111156111e95760006111aa84611589565b6111b490856124a9565b600088815260209020909150869082015463ffffffff1611156111d9578091506111e7565b6111e4816001612438565b92505b505b808210156112365760006111fd8383611671565b600088815260209020909150869082015463ffffffff16111561122257809150611230565b61122d816001612438565b92505b506111e9565b8015611262576000868152602090208101600019015464010000000090046001600160e01b0316611265565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546033845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461103682848361168c565b600063ffffffff8211156113575760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016105e1565b5090565b600054610100900460ff166113825760405162461bcd60e51b81526004016105e1906124bc565b6105f482826117ca565b600054610100900460ff166113b35760405162461bcd60e51b81526004016105e1906124bc565b565b600054610100900460ff166113dc5760405162461bcd60e51b81526004016105e1906124bc565b6107e281604051806040016040528060018152602001603160f81b81525061180a565b6060609980546104fe906123ee565b6060609a80546104fe906123ee565b600065ffffffffffff8211156113575760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b60648201526084016105e1565b6000610595611491611185565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006114c287878787611859565b915091506114cf8161191d565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6105f48282611a67565b6105f48282611af2565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611540611b0b565b611548611b64565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008160000361159b57506000919050565b600060016115a884611b95565b901c6001901b905060018184816115c1576115c1612507565b048201901c905060018184816115d9576115d9612507565b048201901c905060018184816115f1576115f1612507565b048201901c9050600181848161160957611609612507565b048201901c9050600181848161162157611621612507565b048201901c9050600181848161163957611639612507565b048201901c9050600181848161165157611651612507565b048201901c90506106a78182858161166b5761166b612507565b04611c29565b6000611680600284841861251d565b6106a790848416612438565b816001600160a01b0316836001600160a01b0316141580156116ae5750600081115b156117c5576001600160a01b0383161561173c576001600160a01b038316600090815260ff6020526040812081906116e990611c3f85611c4b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611731929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156117c5576001600160a01b038216600090815260ff60205260408120819061177290611dc085611c4b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117ba929190918252602082015260400190565b60405180910390a250505b505050565b600054610100900460ff166117f15760405162461bcd60e51b81526004016105e1906124bc565b60366117fd838261258d565b5060376117c5828261258d565b600054610100900460ff166118315760405162461bcd60e51b81526004016105e1906124bc565b609961183d838261258d565b50609a61184a828261258d565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118905750600090506003611914565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156118e4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661190d57600060019250925050611914565b9150600090505b94509492505050565b60008160048111156119315761193161264d565b036119395750565b600181600481111561194d5761194d61264d565b0361199a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105e1565b60028160048111156119ae576119ae61264d565b036119fb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105e1565b6003816004811115611a0f57611a0f61264d565b036107e25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105e1565b611a718282611dcc565b6035546001600160e01b031015611ae35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016105e1565b611036610100611dc083611c4b565b611afc8282611e95565b611036610100611c3f83611c4b565b600080611b166113ff565b805190915015611b2d578051602090910120919050565b6097548015611b3c5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611b6f61140e565b805190915015611b86578051602090910120919050565b6098548015611b3c5792915050565b600080608083901c15611baa57608092831c92015b604083901c15611bbc57604092831c92015b602083901c15611bce57602092831c92015b601083901c15611be057601092831c92015b600883901c15611bf257600892831c92015b600483901c15611c0457600492831c92015b600283901c15611c1657600292831c92015b600183901c156105955760010192915050565b6000818310611c3857816106a7565b5090919050565b60006106a782846124a9565b82546000908190818115611c985760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611cad565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350611ccd84868863ffffffff16565b9250600082118015611cf75750611ce2610b0b565b65ffffffffffff16816000015163ffffffff16145b15611d3c57611d0583611fd0565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611db6565b866040518060400160405280611d60611d53610b0b565b65ffffffffffff166112f2565b63ffffffff168152602001611d7486611fd0565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b60006106a78284612438565b6001600160a01b038216611e225760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105e1565b8060356000828254611e349190612438565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105f460008383612039565b6001600160a01b038216611ef55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105e1565b6001600160a01b03821660009081526033602052604090205481811015611f695760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105e1565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36117c583600084612039565b60006001600160e01b038211156113575760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016105e1565b6117c58383836001600160a01b03808416600090815260fe60205260409020546117c591166001600160a01b03808516600090815260fe6020526040902054168361168c565b80356001600160a01b038116811461209657600080fd5b919050565b600080604083850312156120ae57600080fd5b6120b78361207f565b91506120c56020840161207f565b90509250929050565b6000815180845260005b818110156120f4576020818501810151868301820152016120d8565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106a760208301846120ce565b6000806040838503121561213a57600080fd5b6121438361207f565b946020939093013593505050565b60008060006060848603121561216657600080fd5b61216f8461207f565b925061217d6020850161207f565b9150604084013590509250925092565b60006020828403121561219f57600080fd5b5035919050565b6000806000604084860312156121bb57600080fd5b833567ffffffffffffffff808211156121d357600080fd5b818601915086601f8301126121e757600080fd5b8135818111156121f657600080fd5b8760208260051b850101111561220b57600080fd5b602092830195509350612221918601905061207f565b90509250925092565b60006020828403121561223c57600080fd5b6106a78261207f565b60ff60f81b881681526000602060e08184015261226560e084018a6120ce565b8381036040850152612277818a6120ce565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156122c9578351835292840192918401916001016122ad565b50909c9b505050505050505050505050565b803560ff8116811461209657600080fd5b60008060008060008060c0878903121561230557600080fd5b61230e8761207f565b9550602087013594506040870135935061232a606088016122db565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561235f57600080fd5b6123688861207f565b96506123766020890161207f565b95506040880135945060608801359350612392608089016122db565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156123c157600080fd5b6123ca8361207f565b9150602083013563ffffffff811681146123e357600080fd5b809150509250929050565b600181811c9082168061240257607f821691505b6020821081036114fb57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561059557610595612422565b634e487b7160e01b600052603260045260246000fd5b60006001820161247357612473612422565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156124a257600080fd5b5051919050565b8181038181111561059557610595612422565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261253a57634e487b7160e01b600052601260045260246000fd5b500490565b601f8211156117c557600081815260208120601f850160051c810160208610156125665750805b601f850160051c820191505b8181101561258557828155600101612572565b505050505050565b815167ffffffffffffffff8111156125a7576125a761247a565b6125bb816125b584546123ee565b8461253f565b602080601f8311600181146125f057600084156125d85750858301515b600019600386901b1c1916600185901b178555612585565b600085815260208120601f198616915b8281101561261f57888601518255948401946001909101908401612600565b508582101561263d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea164736f6c6343000811000a" + }, + "0x0000000000000000000000000000000000002006": { + "balance": "0x0", + "code": "0x6080604052600436106101d15760003560e01c80638129fc1c116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610584578063e38335e5146105a4578063f23a6e61146105b7578063f27a0c92146105e357600080fd5b8063b1c5f427146104eb578063bc197c811461050b578063c4d252f514610537578063d45c44351461055757600080fd5b806391d14854116100d157806391d1485414610474578063a217fddf14610494578063ac431751146104a9578063b08e51c0146104c957600080fd5b80638129fc1c1461041d5780638f2a0bb0146104325780638f61f4f51461045257600080fd5b8063248a9ca31161016f57806336568abe1161013e57806336568abe1461039d578063584b153e146103bd57806364d62353146103dd5780638065657f146103fd57600080fd5b8063248a9ca3146102fd5780632ab0f5291461032d5780632f2ff15d1461035d57806331d507501461037d57600080fd5b80630d3cf6fc116101ab5780630d3cf6fc14610264578063134008d31461028657806313bc9f2014610299578063150b7a02146102b957600080fd5b806301d5062a146101dd57806301ffc9a7146101ff57806307bd02651461023457600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611a53565b6105f8565b005b34801561020b57600080fd5b5061021f61021a366004611ac7565b6106bc565b60405190151581526020015b60405180910390f35b34801561024057600080fd5b5061025660008051602061253a83398151915281565b60405190815260200161022b565b34801561027057600080fd5b506102566000805160206124fa83398151915281565b6101fd610294366004611af1565b6106e7565b3480156102a557600080fd5b5061021f6102b4366004611b5c565b61078a565b3480156102c557600080fd5b506102e46102d4366004611c2a565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161022b565b34801561030957600080fd5b50610256610318366004611b5c565b60009081526065602052604090206001015490565b34801561033957600080fd5b5061021f610348366004611b5c565b60009081526097602052604090205460011490565b34801561036957600080fd5b506101fd610378366004611c91565b6107b0565b34801561038957600080fd5b5061021f610398366004611b5c565b6107da565b3480156103a957600080fd5b506101fd6103b8366004611c91565b6107f3565b3480156103c957600080fd5b5061021f6103d8366004611b5c565b610876565b3480156103e957600080fd5b506101fd6103f8366004611b5c565b61088d565b34801561040957600080fd5b50610256610418366004611af1565b610931565b34801561042957600080fd5b506101fd610970565b34801561043e57600080fd5b506101fd61044d366004611d01565b610b21565b34801561045e57600080fd5b5061025660008051602061251a83398151915281565b34801561048057600080fd5b5061021f61048f366004611c91565b610ca2565b3480156104a057600080fd5b50610256600081565b3480156104b557600080fd5b506101fd6104c4366004611db2565b610ccd565b3480156104d557600080fd5b5061025660008051602061255a83398151915281565b3480156104f757600080fd5b50610256610506366004611e1d565b610eb7565b34801561051757600080fd5b506102e4610526366004611f44565b63bc197c8160e01b95945050505050565b34801561054357600080fd5b506101fd610552366004611b5c565b610efc565b34801561056357600080fd5b50610256610572366004611b5c565b60009081526097602052604090205490565b34801561059057600080fd5b506101fd61059f366004611c91565b610fbf565b6101fd6105b2366004611e1d565b610fe4565b3480156105c357600080fd5b506102e46105d2366004611fed565b63f23a6e6160e01b95945050505050565b3480156105ef57600080fd5b50609854610256565b60008051602061251a8339815191526106108161115c565b6000610620898989898989610931565b905061062c8184611166565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516106689695949392919061207a565b60405180910390a383156106b157807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516106a891815260200190565b60405180910390a25b505050505050505050565b60006001600160e01b03198216630271189760e51b14806106e157506106e182611255565b92915050565b60008051602061253a833981519152610701816000610ca2565b61070f5761070f813361128a565b600061071f888888888888610931565b905061072b81856112e3565b6107378888888861137e565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161076f94939291906120b7565b60405180910390a361078081611451565b5050505050505050565b6000818152609760205260408120546001811180156107a95750428111155b9392505050565b6000828152606560205260409020600101546107cb8161115c565b6107d5838361148a565b505050565b60008181526097602052604081205481905b1192915050565b6001600160a01b03811633146108685760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108728282611510565b5050565b6000818152609760205260408120546001906107ec565b3330146108f05760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b606482015260840161085f565b60985460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1609855565b600086868686868660405160200161094e9695949392919061207a565b6040516020818303038152906040528051906020012090509695505050505050565b600054610100900460ff16158080156109905750600054600160ff909116105b806109aa5750303b1580156109aa575060005460ff166001145b610a0d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161085f565b6000805460ff191660011790558015610a30576000805461ff0019166101001790555b334114610a505760405163022d8c9560e31b815260040160405180910390fd5b3a15610a6f576040516383f1b1d360e01b815260040160405180910390fd5b6040805160018082528183019092526000916020808301908036833701905050905061200481600081518110610aa757610aa76120e9565b60200260200101906001600160a01b031690816001600160a01b031681525050610ad76154608283612004611577565b508015610b1e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60008051602061251a833981519152610b398161115c565b888714610b585760405162461bcd60e51b815260040161085f906120ff565b888514610b775760405162461bcd60e51b815260040161085f906120ff565b6000610b898b8b8b8b8b8b8b8b610eb7565b9050610b958184611166565b60005b8a811015610c535780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610bd557610bd56120e9565b9050602002016020810190610bea9190612142565b8d8d86818110610bfc57610bfc6120e9565b905060200201358c8c87818110610c1557610c156120e9565b9050602002810190610c27919061215d565b8c8b604051610c3b9695949392919061207a565b60405180910390a3610c4c816121b9565b9050610b98565b508315610c9557807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610c8c91815260200190565b60405180910390a25b5050505050505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3361100714610cf357604051630f22c43960e41b8152611007600482015260240161085f565b610d56604051806040016040528060088152602001676d696e44656c617960c01b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115b09050565b15610e535760208114610d845783838383604051630a5a604160e01b815260040161085f94939291906121d2565b604080516020601f8401819004810282018101909252828152600091610dc59185858083850183828082843760009201919091525092939250506116099050565b9050801580610dd657506212750081115b15610dfc5784848484604051630a5a604160e01b815260040161085f94939291906121d2565b6040516364d6235360e01b81526004810182905230906364d6235390602401600060405180830381600087803b158015610e3557600080fd5b505af1158015610e49573d6000803e3d6000fd5b5050505050610e74565b838383836040516325ee20d560e21b815260040161085f94939291906121d2565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610ea994939291906121d2565b60405180910390a150505050565b60008888888888888888604051602001610ed898979695949392919061228a565b60405160208183030381529060405280519060200120905098975050505050505050565b60008051602061255a833981519152610f148161115c565b610f1d82610876565b610f835760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b606482015260840161085f565b6000828152609760205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260656020526040902060010154610fda8161115c565b6107d58383611510565b60008051602061253a833981519152610ffe816000610ca2565b61100c5761100c813361128a565b87861461102b5760405162461bcd60e51b815260040161085f906120ff565b87841461104a5760405162461bcd60e51b815260040161085f906120ff565b600061105c8a8a8a8a8a8a8a8a610eb7565b905061106881856112e3565b60005b898110156111465760008b8b83818110611087576110876120e9565b905060200201602081019061109c9190612142565b905060008a8a848181106110b2576110b26120e9565b9050602002013590503660008a8a868181106110d0576110d06120e9565b90506020028101906110e2919061215d565b915091506110f28484848461137e565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112994939291906120b7565b60405180910390a3505050508061113f906121b9565b905061106b565b5061115081611451565b50505050505050505050565b610b1e813361128a565b61116f826107da565b156111d45760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b606482015260840161085f565b6098548110156112355760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b606482015260840161085f565b61123f814261232b565b6000928352609760205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b14806106e157506301ffc9a760e01b6001600160e01b03198316146106e1565b6112948282610ca2565b610872576112a18161160e565b6112ac836020611620565b6040516020016112bd929190612362565b60408051601f198184030181529082905262461bcd60e51b825261085f916004016123d7565b6112ec8261078a565b6113085760405162461bcd60e51b815260040161085f9061240a565b80158061132357506000818152609760205260409020546001145b6108725760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b606482015260840161085f565b6000846001600160a01b031684848460405161139b929190612454565b60006040518083038185875af1925050503d80600081146113d8576040519150601f19603f3d011682016040523d82523d6000602084013e6113dd565b606091505b505090508061144a5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b606482015260840161085f565b5050505050565b61145a8161078a565b6114765760405162461bcd60e51b815260040161085f9061240a565b600090815260976020526040902060019055565b6114948282610ca2565b6108725760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556114cc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61151a8282610ca2565b156108725760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff1661159e5760405162461bcd60e51b815260040161085f90612464565b6115aa848484846117bb565b50505050565b6000816040516020016115c391906124af565b60405160208183030381529060405280519060200120836040516020016115ea91906124af565b6040516020818303038152906040528051906020012014905092915050565b015190565b60606106e16001600160a01b03831660145b6060600061162f8360026124cb565b61163a90600261232b565b6001600160401b0381111561165157611651611b75565b6040519080825280601f01601f19166020018201604052801561167b576020820181803683370190505b509050600360fc1b81600081518110611696576116966120e9565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106116c5576116c56120e9565b60200101906001600160f81b031916908160001a90535060006116e98460026124cb565b6116f490600161232b565b90505b600181111561176c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611728576117286120e9565b1a60f81b82828151811061173e5761173e6120e9565b60200101906001600160f81b031916908160001a90535060049490941c93611765816124e2565b90506116f7565b5083156107a95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161085f565b600054610100900460ff166117e25760405162461bcd60e51b815260040161085f90612464565b6117fa6000805160206124fa8339815191528061199a565b61182060008051602061251a8339815191526000805160206124fa83398151915261199a565b61184660008051602061253a8339815191526000805160206124fa83398151915261199a565b61186c60008051602061255a8339815191526000805160206124fa83398151915261199a565b6118846000805160206124fa833981519152306119e5565b6001600160a01b038116156118ab576118ab6000805160206124fa833981519152826119e5565b60005b835181101561191c576118e860008051602061251a8339815191528583815181106118db576118db6120e9565b60200260200101516119e5565b61190c60008051602061255a8339815191528583815181106118db576118db6120e9565b611915816121b9565b90506118ae565b5060005b825181101561195d5761194d60008051602061253a8339815191528483815181106118db576118db6120e9565b611956816121b9565b9050611920565b5060988490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d59101610ea9565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b610872828261148a565b80356001600160a01b0381168114611a0657600080fd5b919050565b60008083601f840112611a1d57600080fd5b5081356001600160401b03811115611a3457600080fd5b602083019150836020828501011115611a4c57600080fd5b9250929050565b600080600080600080600060c0888a031215611a6e57600080fd5b611a77886119ef565b96506020880135955060408801356001600160401b03811115611a9957600080fd5b611aa58a828b01611a0b565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611ad957600080fd5b81356001600160e01b0319811681146107a957600080fd5b60008060008060008060a08789031215611b0a57600080fd5b611b13876119ef565b95506020870135945060408701356001600160401b03811115611b3557600080fd5b611b4189828a01611a0b565b979a9699509760608101359660809091013595509350505050565b600060208284031215611b6e57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611bb357611bb3611b75565b604052919050565b600082601f830112611bcc57600080fd5b81356001600160401b03811115611be557611be5611b75565b611bf8601f8201601f1916602001611b8b565b818152846020838601011115611c0d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611c4057600080fd5b611c49856119ef565b9350611c57602086016119ef565b92506040850135915060608501356001600160401b03811115611c7957600080fd5b611c8587828801611bbb565b91505092959194509250565b60008060408385031215611ca457600080fd5b82359150611cb4602084016119ef565b90509250929050565b60008083601f840112611ccf57600080fd5b5081356001600160401b03811115611ce657600080fd5b6020830191508360208260051b8501011115611a4c57600080fd5b600080600080600080600080600060c08a8c031215611d1f57600080fd5b89356001600160401b0380821115611d3657600080fd5b611d428d838e01611cbd565b909b50995060208c0135915080821115611d5b57600080fd5b611d678d838e01611cbd565b909950975060408c0135915080821115611d8057600080fd5b50611d8d8c828d01611cbd565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060408587031215611dc857600080fd5b84356001600160401b0380821115611ddf57600080fd5b611deb88838901611a0b565b90965094506020870135915080821115611e0457600080fd5b50611e1187828801611a0b565b95989497509550505050565b60008060008060008060008060a0898b031215611e3957600080fd5b88356001600160401b0380821115611e5057600080fd5b611e5c8c838d01611cbd565b909a50985060208b0135915080821115611e7557600080fd5b611e818c838d01611cbd565b909850965060408b0135915080821115611e9a57600080fd5b50611ea78b828c01611cbd565b999c989b509699959896976060870135966080013595509350505050565b600082601f830112611ed657600080fd5b813560206001600160401b03821115611ef157611ef1611b75565b8160051b611f00828201611b8b565b9283528481018201928281019087851115611f1a57600080fd5b83870192505b84831015611f3957823582529183019190830190611f20565b979650505050505050565b600080600080600060a08688031215611f5c57600080fd5b611f65866119ef565b9450611f73602087016119ef565b935060408601356001600160401b0380821115611f8f57600080fd5b611f9b89838a01611ec5565b94506060880135915080821115611fb157600080fd5b611fbd89838a01611ec5565b93506080880135915080821115611fd357600080fd5b50611fe088828901611bbb565b9150509295509295909350565b600080600080600060a0868803121561200557600080fd5b61200e866119ef565b945061201c602087016119ef565b9350604086013592506060860135915060808601356001600160401b0381111561204557600080fd5b611fe088828901611bbb565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006120a260a083018688612051565b60608301949094525060800152949350505050565b60018060a01b03851681528360208201526060604082015260006120df606083018486612051565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b60006020828403121561215457600080fd5b6107a9826119ef565b6000808335601e1984360301811261217457600080fd5b8301803591506001600160401b0382111561218e57600080fd5b602001915036819003821315611a4c57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016121cb576121cb6121a3565b5060010190565b6040815260006121e6604083018688612051565b8281036020840152611f39818587612051565b81835260006020808501808196508560051b810191508460005b8781101561227d5782840389528135601e1988360301811261223457600080fd5b870185810190356001600160401b0381111561224f57600080fd5b80360382131561225e57600080fd5b612269868284612051565b9a87019a9550505090840190600101612213565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156122cb576001600160a01b036122b6846119ef565b1682526020928301929091019060010161229d565b5083810360208501528881526001600160fb1b038911156122eb57600080fd5b8860051b9150818a6020830137018281036020908101604085015261231390820187896121f9565b60608401959095525050608001529695505050505050565b808201808211156106e1576106e16121a3565b60005b83811015612359578181015183820152602001612341565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161239a81601785016020880161233e565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516123cb81602884016020880161233e565b01602801949350505050565b60208152600082518060208401526123f681604085016020870161233e565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516124c181846020870161233e565b9190910192915050565b80820281158282048414176106e1576106e16121a3565b6000816124f1576124f16121a3565b50600019019056fe5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a164736f6c6343000811000a" + }, + "0x0000000000000000000000000000000000003000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638129fc1c11610097578063b187bd2611610066578063b187bd26146101fc578063bfb5a6a114610207578063e33f8d321461021a578063e842426a1461023d57600080fd5b80638129fc1c146101cc5780638456cb59146101d45780639fcb5012146101dc578063ac431751146101e957600080fd5b80634838d165116100d35780634838d165146101335780634a49ac4c14610166578063572c99801461017957806374be21501461018c57600080fd5b8063046f7da2146100fa5780632eb4a7ab14610104578063417c73a714610120575b600080fd5b610102610268565b005b61010d60685481565b6040519081526020015b60405180910390f35b61010261012e366004611670565b6102f0565b610156610141366004611670565b60346020526000908152604090205460ff1681565b6040519015158152602001610117565b610102610174366004611670565b61036c565b61010261018736600461168b565b6103e5565b6101bf6040518060400160405280601481526020017342696e616e63652d436861696e2d47616e67657360601b81525081565b6040516101179190611707565b61010261047b565b6101026105ed565b6069546101569060ff1681565b6101026101f7366004611763565b610679565b60335460ff16610156565b610102610215366004611814565b610a98565b6101566102283660046118ee565b6000908152606a602052604090205460ff1690565b606754610250906001600160a01b031681565b6040516001600160a01b039091168152602001610117565b60335461010090046001600160a01b03163314610298576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff166102bb57604051636cd6020160e01b815260040160405180910390fd5b6033805460ff191690556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f990600090a1565b60335461010090046001600160a01b03163314610320576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19166001179055517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60335461010090046001600160a01b0316331461039c576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60335461010090046001600160a01b03163314610415576040516306fbb1e360e01b815260040160405180910390fd5b604051638525db0360e01b8152600481018390526001600160a01b038216602482015261100490638525db0390604401600060405180830381600087803b15801561045f57600080fd5b505af1158015610473573d6000803e3d6000fd5b505050505050565b600054610100900460ff161580801561049b5750600054600160ff909116105b806104b55750303b1580156104b5575060005460ff166001145b61051d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610540576000805461ff0019166101001790555b3341146105605760405163022d8c9560e31b815260040160405180910390fd5b3a1561057f576040516383f1b1d360e01b815260040160405180910390fd5b610587610df8565b6105a47330151da466ec8ab345bef3d6983023e050fb0673610e25565b80156105ea576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60335461010090046001600160a01b0316331461061d576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff161561064157604051631785c68160e01b815260040160405180910390fd5b6033805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b336110071461069f57604051630f22c43960e41b81526110076004820152602401610514565b6107096040518060400160405280600f81526020016e617070726f76616c4164647265737360881b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e749050565b156107d357601481146107375783838383604051630a5a604160e01b81526004016105149493929190611930565b600061077d601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610ece9050565b90506001600160a01b0381166107ae5784848484604051630a5a604160e01b81526004016105149493929190611930565b606780546001600160a01b0319166001600160a01b0392909216919091179055610a55565b6108386040518060400160405280600a8152602001691b595c9adb19549bdbdd60b21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e749050565b156109085760695460ff1615610861576040516379b3306f60e11b815260040160405180910390fd5b6020811461088a5783838383604051630a5a604160e01b81526004016105149493929190611930565b604080516020601f84018190048102820181019092528281526000916108cb918585808385018382808284376000920191909152509293925050610ece9050565b9050806108f35784848484604051630a5a604160e01b81526004016105149493929190611930565b6068556069805460ff19166001179055610a55565b6109806040518060400160405280601b81526020017f746f6b656e5265636f766572506f7274616c50726f746563746f72000000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e749050565b15610a3457601481146109ae5783838383604051630a5a604160e01b81526004016105149493929190611930565b60006109f4601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610ece9050565b90506001600160a01b038116610a255784848484604051630a5a604160e01b81526004016105149493929190611930565b610a2e81610ed3565b50610a55565b838383836040516325ee20d560e21b81526004016105149493929190611930565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610a8a9493929190611930565b60405180910390a150505050565b60695460ff16610abb5760405163678f619760e11b815260040160405180910390fd5b606854610adb5760405163678f619760e11b815260040160405180910390fd5b6067546001600160a01b0316610b0457604051631a1b977b60e31b815260040160405180910390fd5b60335460ff1615610b2857604051631785c68160e01b815260040160405180910390fd5b610b30610f3a565b6000610bbe89898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a9081908401838280828437600081840152601f19601f82011690508083019250505050505050610bb98e8e33610f93565b6110b4565b90506000818c8c604051602001610bd793929190611962565b604051602081830303815290604052805190602001209050610c08816000908152606a602052604090205460ff1690565b15610c2557604051623e493160e81b815260040160405180910390fd5b610ccd3389898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a908190840183828082843760009201919091525050604080516020808c0282810182019093528b82528994509092508b918b9182919085019084908082843760009201919091525061118c92505050565b610d0e848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506068549150849050611297565b610d2b576040516309bde33960e01b815260040160405180910390fd5b6000818152606a602052604090819020805460ff191660011790555163799758b960e01b8152600481018d9052336024820152604481018c90526110049063799758b990606401600060405180830381600087803b158015610d8c57600080fd5b505af1158015610da0573d6000803e3d6000fd5b505050507f39cc0b7297a0ef9102d75ebc4919ffec0347d50008c2b865eda4125d5812cb64828d338e604051610dd99493929190611989565b60405180910390a15050610dec60018055565b50505050505050505050565b600054610100900460ff16610e1f5760405162461bcd60e51b8152600401610514906119c1565b60018055565b600054610100900460ff16610e4c5760405162461bcd60e51b8152600401610514906119c1565b603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081604051602001610e879190611a0c565b6040516020818303038152906040528051906020012083604051602001610eae9190611a0c565b604051602081830303815290604052805190602001201490505b92915050565b015190565b6033546040516001600160a01b0380841692610100900416907f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b90600090a3603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600260015403610f8c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610514565b6002600155565b600060026040518060400160405280601481526020017342696e616e63652d436861696e2d47616e67657360601b815250610ff085604051602001610fda91815260200190565b60405160208183030381529060405260006112ad565b6040516bffffffffffffffffffffffff19606087901b1660208201526110299060340160405160208183030381529060405260016112ad565b61103f88604051602001610fda91815260200190565b6040516020016110529493929190611a28565b60408051601f198184030181529082905261106c91611a0c565b602060405180830381855afa158015611089573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110ac9190611b57565b949350505050565b606083516021146110d857604051638152ea1b60e01b815260040160405180910390fd5b82516040146110fa57604051635e4bd79760e11b815260040160405180910390fd5b604080516020808252818301909252600091602082018180368337019050509050826020820152600085858360405160200161113893929190611b86565b60408051808303601f190181526014808452838301909252925060009190602082018180368337019050509050815160146020830182602086016069600019fa61118157600080fd5b509695505050505050565b606060005b82518110156111ea57818382815181106111ad576111ad611bc9565b60200260200101516040516020016111c6929190611bdf565b604051602081830303815290604052915080806111e290611c17565b915050611191565b5060006040518060400160405280601481526020017342696e616e63652d436861696e2d47616e67657360601b8152508787866068548660405160200161123696959493929190611c30565b60408051601f1981840301815291905280516020909101206067549091506001600160a01b0316611267868361147f565b6001600160a01b03161461128e576040516356b00a4f60e11b815260040160405180910390fd5b50505050505050565b6000826112a48584611519565b14949350505050565b60606000835160026112bf9190611ca1565b67ffffffffffffffff8111156112d7576112d7611b70565b6040519080825280601f01601f191660200182016040528015611301576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b85518110156114475781825187838151811061134d5761134d611bc9565b016020015161135f919060f81c611cce565b8151811061136f5761136f611bc9565b01602001516001600160f81b0319168361138a836002611ca1565b8151811061139a5761139a611bc9565b60200101906001600160f81b031916908160001a9053508182518783815181106113c6576113c6611bc9565b01602001516113d8919060f81c611ce2565b815181106113e8576113e8611bc9565b01602001516001600160f81b03191683611403836002611ca1565b61140e906001611cf6565b8151811061141e5761141e611bc9565b60200101906001600160f81b031916908160001a9053508061143f81611c17565b91505061132f565b508315611477578160405160200161145f9190611d09565b60405160208183030381529060405292505050610ec8565b509392505050565b600082516041146114a3576040516356b00a4f60e11b815260040160405180910390fd5b60208301516040840151606085015160001a601b8110156114cc576114c9601b82611d33565b90505b601b8160ff1610806114e15750601c8160ff16115b156114ff576040516356b00a4f60e11b815260040160405180910390fd5b600061150d8683868661155e565b50979650505050505050565b600081815b84518110156114775761154a8286838151811061153d5761153d611bc9565b6020026020010151611622565b91508061155681611c17565b91505061151e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115955750600090506003611619565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115e9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661161257600060019250925050611619565b9150600090505b94509492505050565b600081831061163e57600082815260208490526040902061164d565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461166b57600080fd5b919050565b60006020828403121561168257600080fd5b61164d82611654565b6000806040838503121561169e57600080fd5b823591506116ae60208401611654565b90509250929050565b60005b838110156116d25781810151838201526020016116ba565b50506000910152565b600081518084526116f38160208601602086016116b7565b601f01601f19169290920160200192915050565b60208152600061164d60208301846116db565b60008083601f84011261172c57600080fd5b50813567ffffffffffffffff81111561174457600080fd5b60208301915083602082850101111561175c57600080fd5b9250929050565b6000806000806040858703121561177957600080fd5b843567ffffffffffffffff8082111561179157600080fd5b61179d8883890161171a565b909650945060208701359150808211156117b657600080fd5b506117c38782880161171a565b95989497509550505050565b60008083601f8401126117e157600080fd5b50813567ffffffffffffffff8111156117f957600080fd5b6020830191508360208260051b850101111561175c57600080fd5b60008060008060008060008060008060c08b8d03121561183357600080fd5b8a35995060208b0135985060408b013567ffffffffffffffff8082111561185957600080fd5b6118658e838f0161171a565b909a50985060608d013591508082111561187e57600080fd5b61188a8e838f0161171a565b909850965060808d01359150808211156118a357600080fd5b6118af8e838f0161171a565b909650945060a08d01359150808211156118c857600080fd5b506118d58d828e016117cf565b915080935050809150509295989b9194979a5092959850565b60006020828403121561190057600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000611944604083018688611907565b8281036020840152611957818587611907565b979650505050505050565b600084516119748184602089016116b7565b91909101928352506020820152604001919050565b60808152600061199c60808301876116db565b6020830195909552506001600160a01b03929092166040830152606090910152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251611a1e8184602087016116b7565b9190910192915050565b7f7b226163636f756e745f6e756d626572223a2230222c22636861696e5f6964228152611d1160f11b602082015260008551611a6b816022850160208a016116b7565b7f222c2264617461223a6e756c6c2c226d656d6f223a22222c226d736773223a5b6022918401918201526a3d9130b6b7bab73a111d1160a91b60428201528551611abc81604d840160208a016116b7565b6e1116113932b1b4b834b2b73a111d1160891b604d92909101918201528451611aec81605c8401602089016116b7565b711116113a37b5b2b72fb9bcb6b137b6111d1160711b605c92909101918201528351611b1f81606e8401602088016116b7565b7f227d5d2c2273657175656e6365223a2230222c22736f75726365223a2230227d606e9290910191820152608e019695505050505050565b600060208284031215611b6957600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b60008451611b988184602089016116b7565b845190830190611bac8183602089016116b7565b8451910190611bbf8183602088016116b7565b0195945050505050565b634e487b7160e01b600052603260045260246000fd5b60008351611bf18184602088016116b7565b9190910191825250602001919050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c2957611c29611c01565b5060010190565b60008751611c42818460208c016116b7565b606088901b6bffffffffffffffffffffffff19169083019081528651611c6f816014840160208b016116b7565b0160148101869052603481018590528351611c918160548401602088016116b7565b0160540198975050505050505050565b8082028115828204841417610ec857610ec8611c01565b634e487b7160e01b600052601260045260246000fd5b600082611cdd57611cdd611cb8565b500490565b600082611cf157611cf1611cb8565b500690565b80820180821115610ec857610ec8611c01565b61060f60f31b815260008251611d268160028501602087016116b7565b9190910160020192915050565b60ff8181168382160190811115610ec857610ec8611c0156fea164736f6c6343000811000a" + }, + "0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD": { + "balance": "0x100000000000000000000" + }, + "0x42D596440775C90db8d9187b47650986E1063493": { + "balance": "0x1000000000000000000000" + }, + "9fB29AAc15b9A4B7F17c3385939b007540f4d791": { + "balance": "0x84595161401484a000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} From e882dad58ecac1ce88fde6f37172df168545504f Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 14:38:51 +0800 Subject: [PATCH 35/52] feat: add ci check bsc repo bytecode --- .../workflows/check-bsc-hardfork-bytecode.yml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/check-bsc-hardfork-bytecode.yml diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml new file mode 100644 index 00000000..aba6e319 --- /dev/null +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -0,0 +1,25 @@ +name: Compare genesis with bytecode files from BSC repo +on: + push: + branches: + - master + - develop + pull_request: + types: [opened, edited, synchronize] + branches: + - master + - develop +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + # pull-requests: read +jobs: + keyword_check: + runs-on: ubuntu-latest + if: contains(github.event.pull_request.title, '[hardfork:') + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Run your CI script + run: echo ${{github.event.pull_request.title}} From 3cfa57bc24ba227f849ad625ade34943796b3f83 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 14:41:53 +0800 Subject: [PATCH 36/52] chores: modify ci check --- .github/workflows/check-bsc-hardfork-bytecode.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index aba6e319..9dcaf8b9 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -16,7 +16,7 @@ permissions: jobs: keyword_check: runs-on: ubuntu-latest - if: contains(github.event.pull_request.title, '[hardfork:') + if: contains(github.event.pull_request.title, ' hardfork]') steps: - name: Checkout repository uses: actions/checkout@v2 From 64c8f7dc4fd2d09995d804c1ac30a3fd3d43add9 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 14:47:00 +0800 Subject: [PATCH 37/52] chores: modify ci check --- .github/workflows/check-bsc-hardfork-bytecode.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 9dcaf8b9..c020a5f5 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -14,7 +14,7 @@ permissions: # Optional: allow read access to pull request. Use with `only-new-issues` option. # pull-requests: read jobs: - keyword_check: + check-keyword: runs-on: ubuntu-latest if: contains(github.event.pull_request.title, ' hardfork]') steps: @@ -23,3 +23,12 @@ jobs: - name: Run your CI script run: echo ${{github.event.pull_request.title}} + + test: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Run your CI script + run: echo "Test" From b4591cd8f0dc757bb30d19ef72fe00e6907d5b80 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:16:48 +0800 Subject: [PATCH 38/52] chores: test ci script --- .../workflows/check-bsc-hardfork-bytecode.yml | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index c020a5f5..8a27e9b2 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -14,21 +14,41 @@ permissions: # Optional: allow read access to pull request. Use with `only-new-issues` option. # pull-requests: read jobs: - check-keyword: + main: runs-on: ubuntu-latest - if: contains(github.event.pull_request.title, ' hardfork]') + if: contains(github.event.pull_request.body, 'hardfork:') steps: - - name: Checkout repository - uses: actions/checkout@v2 + - uses: actions/checkout@master + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v1 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- - - name: Run your CI script - run: echo ${{github.event.pull_request.title}} +# - name: Run your CI script +# run: echo ${{github.event.pull_request.title}} - test: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Install Project Dependencies + run: | + npm install ts-node -g + npm install + +# - name: Extract BSC commitId and hardfork name from PR description +# uses: actions/github-script@v6 +# with: +# script: | +# const prBody = context.payload.pull_request.body || ''; +# console.log("PR description:", prBody); +# return { prBody }; + + - name: Set environment variable from PR description + run: echo "PR_BODY=${{ steps.extract_pr_description.outputs.prBody }}" >> $GITHUB_ENV - - name: Run your CI script - run: echo "Test" + - name: Compare genesis with hardfork bytecode files from BSC repo + run: | + ts-node scripts/check-bsc-hardfork-bytecode.ts From 8905cf1fe8fd4a2bd852c1ba785b168a64a923c6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:25:18 +0800 Subject: [PATCH 39/52] chores: test ci script --- .../workflows/check-bsc-hardfork-bytecode.yml | 2 +- scripts/check-bsc-hardfork-bytecode.ts | 178 ++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 scripts/check-bsc-hardfork-bytecode.ts diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 8a27e9b2..8596526f 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -16,7 +16,7 @@ permissions: jobs: main: runs-on: ubuntu-latest - if: contains(github.event.pull_request.body, 'hardfork:') + if: contains(github.event.pull_request.body, '>CI') steps: - uses: actions/checkout@master - name: Get yarn cache directory path diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts new file mode 100644 index 00000000..3c8daf8c --- /dev/null +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -0,0 +1,178 @@ +import 'dotenv/config'; +import {execSync} from 'child_process'; +import * as fs from "fs"; +import * as fsp from 'fs/promises'; +import * as path from "node:path"; + +const log = console.log; + +let contractNameMap: any = {} +const VALIDATOR_CONTRACT_ADDR = '0x0000000000000000000000000000000000001000'; +contractNameMap[VALIDATOR_CONTRACT_ADDR] = 'ValidatorContract' + +const SLASH_CONTRACT_ADDR = '0x0000000000000000000000000000000000001001'; +contractNameMap[SLASH_CONTRACT_ADDR] = 'SlashContract' + +const SYSTEM_REWARD_ADDR = '0x0000000000000000000000000000000000001002'; +contractNameMap[SYSTEM_REWARD_ADDR] = 'SystemContract' + +const LIGHT_CLIENT_ADDR = '0x0000000000000000000000000000000000001003'; +contractNameMap[LIGHT_CLIENT_ADDR] = 'LightClientContract' + +const TOKEN_HUB_ADDR = '0x0000000000000000000000000000000000001004'; +contractNameMap[TOKEN_HUB_ADDR] = 'TokenHubContract' + +const INCENTIVIZE_ADDR = '0x0000000000000000000000000000000000001005'; +contractNameMap[INCENTIVIZE_ADDR] = 'RelayerIncentivizeContract' + +const RELAYERHUB_CONTRACT_ADDR = '0x0000000000000000000000000000000000001006'; +contractNameMap[RELAYERHUB_CONTRACT_ADDR] = 'RelayerHubContract' + +const GOV_HUB_ADDR = '0x0000000000000000000000000000000000001007'; +contractNameMap[GOV_HUB_ADDR] = 'GovHubContract' + +const TOKEN_MANAGER_ADDR = '0x0000000000000000000000000000000000001008'; +contractNameMap[TOKEN_MANAGER_ADDR] = 'TokenManagerContract' + +const CROSS_CHAIN_CONTRACT_ADDR = '0x0000000000000000000000000000000000002000'; +contractNameMap[CROSS_CHAIN_CONTRACT_ADDR] = 'CrossChainContract' + +const STAKING_CONTRACT_ADDR = '0x0000000000000000000000000000000000002001'; +contractNameMap[STAKING_CONTRACT_ADDR] = 'StakingContract' + +const STAKE_HUB_ADDR = '0x0000000000000000000000000000000000002002'; +contractNameMap[STAKE_HUB_ADDR] = 'StakeHubContract' + +const STAKE_CREDIT_ADDR = '0x0000000000000000000000000000000000002003'; +contractNameMap[STAKE_CREDIT_ADDR] = 'StakeCreditContract' + +const GOVERNOR_ADDR = '0x0000000000000000000000000000000000002004'; +contractNameMap[GOVERNOR_ADDR] = 'GovernorContract' + +const GOV_TOKEN_ADDR = '0x0000000000000000000000000000000000002005'; +contractNameMap[GOV_TOKEN_ADDR] = 'GovTokenContract' + +const TIMELOCK_ADDR = '0x0000000000000000000000000000000000002006'; +contractNameMap[TIMELOCK_ADDR] = 'TimelockContract' + +const TOKEN_RECOVER_PORTAL_ADDR = '0x0000000000000000000000000000000000003000'; +contractNameMap[TOKEN_RECOVER_PORTAL_ADDR] = 'TokenRecoverContract' + +const bscRepoDir = process.env.BSC_REPO_DIR; +const hardforkName = process.env.HARDFORK +const checkHardforkBytecode = async () => { + const bscHardforkBytecodeDir = bscRepoDir + '/core/systemcontracts/' + hardforkName + const mainnetDir = bscHardforkBytecodeDir + '/mainnet' + const testnetDir = bscHardforkBytecodeDir + '/chapel' + + log('---------------------------------------------------------------------------') + log(`Mainnet: compare genesis bytecode with bsc repo`) + const mainnetHardforkFiles = await searchFiles(mainnetDir, 'Contract') + if (mainnetHardforkFiles.length === 0) { + throw new Error(`cannot find any files in ${mainnetDir}`) + } + const mainnetGenesis = __dirname + '/../genesis.json' + await compareGenesisWithHardforkBytecodes(mainnetGenesis, mainnetHardforkFiles) + + log('---------------------------------------------------------------------------') + log(`Testnet: compare genesis bytecode with bsc repo`) + const testnetHardforkFiles = await searchFiles(testnetDir, 'Contract') + if (testnetHardforkFiles.length === 0) { + throw new Error(`cannot find any files in ${testnetDir}`) + } + const testnetGenesis = __dirname + '/../genesis-testnet.json' + await compareGenesisWithHardforkBytecodes(testnetGenesis, testnetHardforkFiles) +}; + +const compareGenesisWithHardforkBytecodes = async (genesisFile: string, files: string[]) => { + const genesis: any = require(genesisFile) + for (const addr in genesis['alloc']) { + if (!genesis['alloc'][addr]['code']) { + continue; + } + + const contractName = contractNameMap[addr] + const bytecode = clear0x(genesis['alloc'][addr]['code']) + + log('---------------------------------------------------------------------------') + log(contractName) + log('bytecode from genesis:', bytecode.length, ) + + const bytecodeFromBsc = getBytecodeFromBscRepo(contractName, files) + log('bytecode from bsc repo:', bytecodeFromBsc.length, ) + + if (bytecode === bytecodeFromBsc) { + log('Success!') + } else { + throw new Error(`bytecode not match for ${contractName}`) + } + } +} + +const getBytecodeFromBscRepo = (contractName: string, files: string[]): string => { + for (let i = 0; i < files.length; i++) { + const file = files[i] + if (file.includes(`/${contractName}`)) { + return clear0x((fs.readFileSync(file)).toString()); + } + } + throw new Error(`cannot find bytecode for ${contractName} in bsc repo`) +} + +const searchFiles = async (searchDir: string, searchSuffix = ''): Promise => { + let fileList: string[] = [] + try { + const files = await fsp.readdir(searchDir); + + for (const file of files) { + const filePath = path.join(searchDir, file); + const stats = await fsp.stat(filePath); + + // recursive search + if (stats.isDirectory()) { + fileList = fileList.concat(await searchFiles(filePath)); + } else { + if (searchSuffix.length > 0 && filePath.endsWith(searchSuffix)) { + // success find target file which ends with searchSuffix + fileList.push(filePath) + } + } + } + } catch (err) { + console.error(`!! Error reading directory ${searchDir}:`, err); + } + + return fileList; +} + +const clear0x = (str: string) => { + if (str.startsWith('0x')) return str.substring(2) + return str +}; + +const main = async () => { + const pr = process.env.PR_BODY + log('PR_BODY:', pr) + const p1 = pr.indexOf('>CI') + const p2 = pr.indexOf('>CI', p1 + 1) + log(p1, p2, pr.substring(p1 + 3, p2)) + + if (!bscRepoDir) { + throw new Error('BSC_REPO_DIR is required in .env') + } + if (!hardforkName) { + throw new Error('HARDFORK is required in .env') + } + + await checkHardforkBytecode(); + + log('All bytecode match!') +}; + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + From 7e1fa4fad5dc099d31d3ef88ba9d5cb301d0871e Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:28:09 +0800 Subject: [PATCH 40/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 8596526f..3b14ec27 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -46,8 +46,8 @@ jobs: # console.log("PR description:", prBody); # return { prBody }; - - name: Set environment variable from PR description - run: echo "PR_BODY=${{ steps.extract_pr_description.outputs.prBody }}" >> $GITHUB_ENV + - name: Extract PR description + run: echo "PR_BODY=${{ github.event.pull_request.body }}" >> $GITHUB_ENV - name: Compare genesis with hardfork bytecode files from BSC repo run: | From 0c5637ad95967a8854f1913f9e291363451de713 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:36:54 +0800 Subject: [PATCH 41/52] chores: test ci script --- .../workflows/check-bsc-hardfork-bytecode.yml | 24 +++++++++++-------- scripts/check-bsc-hardfork-bytecode.ts | 2 ++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 3b14ec27..72225e28 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -38,17 +38,21 @@ jobs: npm install ts-node -g npm install -# - name: Extract BSC commitId and hardfork name from PR description -# uses: actions/github-script@v6 -# with: -# script: | -# const prBody = context.payload.pull_request.body || ''; -# console.log("PR description:", prBody); -# return { prBody }; - - - name: Extract PR description - run: echo "PR_BODY=${{ github.event.pull_request.body }}" >> $GITHUB_ENV + - name: Extract BSC commitId and hardfork name from PR description + id: extract_pr_description + uses: actions/github-script@v6 + with: + script: | + const prBody = context.payload.pull_request.body || ''; + console.log("PR description:", prBody); + const p1 = prBody.indexOf('>CI') + const p2 = prBody.indexOf('>CI', p1 + 1) + const info = prBody.substring(p1 + 3, p2) + console.log(p1, p2, info) + return { prBody, info }; - name: Compare genesis with hardfork bytecode files from BSC repo run: | + export HARDFORK_NAME=${{ steps.extract_pr_description.outputs.info }} + export PR_BODY=${{ steps.extract_pr_description.outputs.prBody }} ts-node scripts/check-bsc-hardfork-bytecode.ts diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts index 3c8daf8c..31bdf7ae 100644 --- a/scripts/check-bsc-hardfork-bytecode.ts +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -153,6 +153,8 @@ const clear0x = (str: string) => { const main = async () => { const pr = process.env.PR_BODY log('PR_BODY:', pr) + const info = process.env.info + log('info:', info) const p1 = pr.indexOf('>CI') const p2 = pr.indexOf('>CI', p1 + 1) log(p1, p2, pr.substring(p1 + 3, p2)) From 6cc7f2f84b966341b7fa9ab0d499d1b623925f3d Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:42:44 +0800 Subject: [PATCH 42/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 72225e28..5bbe0da1 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -47,12 +47,16 @@ jobs: console.log("PR description:", prBody); const p1 = prBody.indexOf('>CI') const p2 = prBody.indexOf('>CI', p1 + 1) - const info = prBody.substring(p1 + 3, p2) - console.log(p1, p2, info) + if (p1 < 0 || p2 < 0) { + throw new Error('PR description does not contain >CI tag'); + } + + const info = JSON.parse(prBody.substring(p1 + 3, p2)) + log('info', info, info.hardfork, info.bsc) return { prBody, info }; - name: Compare genesis with hardfork bytecode files from BSC repo run: | - export HARDFORK_NAME=${{ steps.extract_pr_description.outputs.info }} + export HARDFORK_NAME=${{ steps.extract_pr_description.outputs.info.hardfork }} export PR_BODY=${{ steps.extract_pr_description.outputs.prBody }} ts-node scripts/check-bsc-hardfork-bytecode.ts From 5f57952e206f9b3bf4ac9f2ab007e47e889dd43a Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:43:30 +0800 Subject: [PATCH 43/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 5bbe0da1..3ea45ae1 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -52,7 +52,7 @@ jobs: } const info = JSON.parse(prBody.substring(p1 + 3, p2)) - log('info', info, info.hardfork, info.bsc) + console.log('info', info, info.hardfork, info.bsc) return { prBody, info }; - name: Compare genesis with hardfork bytecode files from BSC repo From 10c1695b342bfbd559539f1497273f739f99f0f6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:48:26 +0800 Subject: [PATCH 44/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 3ea45ae1..23b0de06 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -57,6 +57,5 @@ jobs: - name: Compare genesis with hardfork bytecode files from BSC repo run: | - export HARDFORK_NAME=${{ steps.extract_pr_description.outputs.info.hardfork }} - export PR_BODY=${{ steps.extract_pr_description.outputs.prBody }} + echo ${{ steps.extract_pr_description.outputs.info.hardfork }} ts-node scripts/check-bsc-hardfork-bytecode.ts From d8e351fdf66bf8d768fb2f1d7016704dfc780817 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 16:53:55 +0800 Subject: [PATCH 45/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 23b0de06..0ec289a1 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -39,8 +39,8 @@ jobs: npm install - name: Extract BSC commitId and hardfork name from PR description - id: extract_pr_description uses: actions/github-script@v6 + id: extract_pr_description with: script: | const prBody = context.payload.pull_request.body || ''; @@ -53,9 +53,9 @@ jobs: const info = JSON.parse(prBody.substring(p1 + 3, p2)) console.log('info', info, info.hardfork, info.bsc) - return { prBody, info }; + return { hardfork: info.hardfork }; - name: Compare genesis with hardfork bytecode files from BSC repo run: | - echo ${{ steps.extract_pr_description.outputs.info.hardfork }} + echo ${{ steps.extract_pr_description.outputs.hardfork }} ts-node scripts/check-bsc-hardfork-bytecode.ts From 39255e8e639574be8734de712c85e87fb1d485e6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 17:05:10 +0800 Subject: [PATCH 46/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index 0ec289a1..b7f2366d 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -53,7 +53,7 @@ jobs: const info = JSON.parse(prBody.substring(p1 + 3, p2)) console.log('info', info, info.hardfork, info.bsc) - return { hardfork: info.hardfork }; + core.setOutput('hardfork', info.hardfork) - name: Compare genesis with hardfork bytecode files from BSC repo run: | From 399bab691a765e43a5dd2167dd147c5d501abb84 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 17:10:44 +0800 Subject: [PATCH 47/52] chores: test ci script --- .github/workflows/check-bsc-hardfork-bytecode.yml | 4 +++- scripts/check-bsc-hardfork-bytecode.ts | 9 ++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check-bsc-hardfork-bytecode.yml b/.github/workflows/check-bsc-hardfork-bytecode.yml index b7f2366d..a1654e9a 100644 --- a/.github/workflows/check-bsc-hardfork-bytecode.yml +++ b/.github/workflows/check-bsc-hardfork-bytecode.yml @@ -54,8 +54,10 @@ jobs: const info = JSON.parse(prBody.substring(p1 + 3, p2)) console.log('info', info, info.hardfork, info.bsc) core.setOutput('hardfork', info.hardfork) + core.setOutput('bsc', info.bsc) - name: Compare genesis with hardfork bytecode files from BSC repo run: | - echo ${{ steps.extract_pr_description.outputs.hardfork }} + export HARDFORK=${{ steps.extract_pr_description.outputs.hardfork }} + export BSC_URL=${{ steps.extract_pr_description.outputs.bsc }} ts-node scripts/check-bsc-hardfork-bytecode.ts diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts index 31bdf7ae..f1a40cc3 100644 --- a/scripts/check-bsc-hardfork-bytecode.ts +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -151,13 +151,8 @@ const clear0x = (str: string) => { }; const main = async () => { - const pr = process.env.PR_BODY - log('PR_BODY:', pr) - const info = process.env.info - log('info:', info) - const p1 = pr.indexOf('>CI') - const p2 = pr.indexOf('>CI', p1 + 1) - log(p1, p2, pr.substring(p1 + 3, p2)) + log('process.env.HARDFORK', process.env.HARDFORK) + log('process.env.BSC_URL', process.env.BSC_URL) if (!bscRepoDir) { throw new Error('BSC_REPO_DIR is required in .env') From 031dab564af4657f4d58b4a6f82095200bfde047 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 21:14:00 +0800 Subject: [PATCH 48/52] chores: test ci script --- scripts/check-bsc-hardfork-bytecode.ts | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts index f1a40cc3..69872440 100644 --- a/scripts/check-bsc-hardfork-bytecode.ts +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -58,8 +58,10 @@ contractNameMap[TIMELOCK_ADDR] = 'TimelockContract' const TOKEN_RECOVER_PORTAL_ADDR = '0x0000000000000000000000000000000000003000'; contractNameMap[TOKEN_RECOVER_PORTAL_ADDR] = 'TokenRecoverContract' -const bscRepoDir = process.env.BSC_REPO_DIR; -const hardforkName = process.env.HARDFORK +let hardforkName = process.env.HARDFORK +let bscUrl = process.env.BSC_URL +let bscRepoDir = __dirname + '/bsc' + const checkHardforkBytecode = async () => { const bscHardforkBytecodeDir = bscRepoDir + '/core/systemcontracts/' + hardforkName const mainnetDir = bscHardforkBytecodeDir + '/mainnet' @@ -151,16 +153,25 @@ const clear0x = (str: string) => { }; const main = async () => { - log('process.env.HARDFORK', process.env.HARDFORK) - log('process.env.BSC_URL', process.env.BSC_URL) - if (!bscRepoDir) { - throw new Error('BSC_REPO_DIR is required in .env') - } if (!hardforkName) { throw new Error('HARDFORK is required in .env') } + if (!bscUrl) { + throw new Error('BSC_URL is required in .env') + } + + hardforkName = hardforkName.trim() + bscUrl = bscUrl.trim() + + const p= bscUrl.lastIndexOf('/') + const commitId = bscUrl.substring(p+1) + + log('hardforkName', hardforkName, 'commitId', commitId) + + execSync(`git clone https://github.com/bnb-chain/bsc.git && cd bsc && git checkout ${commitId} && cd ..`) + await checkHardforkBytecode(); log('All bytecode match!') From 5d827205051fc71c051abbc14e78411f1a22e159 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 21:20:41 +0800 Subject: [PATCH 49/52] chores: test ci script --- scripts/check-bsc-hardfork-bytecode.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts index 69872440..41b2ec19 100644 --- a/scripts/check-bsc-hardfork-bytecode.ts +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -60,7 +60,7 @@ contractNameMap[TOKEN_RECOVER_PORTAL_ADDR] = 'TokenRecoverContract' let hardforkName = process.env.HARDFORK let bscUrl = process.env.BSC_URL -let bscRepoDir = __dirname + '/bsc' +let bscRepoDir = '/tmp/bsc' const checkHardforkBytecode = async () => { const bscHardforkBytecodeDir = bscRepoDir + '/core/systemcontracts/' + hardforkName @@ -170,13 +170,20 @@ const main = async () => { log('hardforkName', hardforkName, 'commitId', commitId) - execSync(`git clone https://github.com/bnb-chain/bsc.git && cd bsc && git checkout ${commitId} && cd ..`) + execSync(`cd /tmp && git clone https://github.com/bnb-chain/bsc.git && cd bsc && git checkout ${commitId}`) + + await sleep(5) await checkHardforkBytecode(); log('All bytecode match!') }; +const sleep = async (seconds: number) => { + console.log('sleep', seconds, 's'); + await new Promise((resolve) => setTimeout(resolve, seconds * 1000)); +}; + main() .then(() => process.exit(0)) .catch((error) => { From 9132efb04bf807d39ee6aae0663a9c25c784f402 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 21:24:21 +0800 Subject: [PATCH 50/52] feat: finish ci to check bsc hardfork bytecodes --- scripts/check-bsc-hardfork-bytecode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts index 41b2ec19..cf667729 100644 --- a/scripts/check-bsc-hardfork-bytecode.ts +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -97,7 +97,7 @@ const compareGenesisWithHardforkBytecodes = async (genesisFile: string, files: s const bytecode = clear0x(genesis['alloc'][addr]['code']) log('---------------------------------------------------------------------------') - log(contractName) + log(contractName, addr) log('bytecode from genesis:', bytecode.length, ) const bytecodeFromBsc = getBytecodeFromBscRepo(contractName, files) From dd0457335e04f3d6dcfdca48a2a9fb5685c464c8 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 8 Sep 2024 21:55:58 +0800 Subject: [PATCH 51/52] fix: fix check bsc bytecode script --- scripts/check-bsc-hardfork-bytecode.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/check-bsc-hardfork-bytecode.ts b/scripts/check-bsc-hardfork-bytecode.ts index cf667729..69be3a8d 100644 --- a/scripts/check-bsc-hardfork-bytecode.ts +++ b/scripts/check-bsc-hardfork-bytecode.ts @@ -101,6 +101,11 @@ const compareGenesisWithHardforkBytecodes = async (genesisFile: string, files: s log('bytecode from genesis:', bytecode.length, ) const bytecodeFromBsc = getBytecodeFromBscRepo(contractName, files) + if (!bytecodeFromBsc) { + log(`cannot find bytecode for ${contractName} in bsc repo`) + continue; + } + log('bytecode from bsc repo:', bytecodeFromBsc.length, ) if (bytecode === bytecodeFromBsc) { @@ -111,14 +116,14 @@ const compareGenesisWithHardforkBytecodes = async (genesisFile: string, files: s } } -const getBytecodeFromBscRepo = (contractName: string, files: string[]): string => { +const getBytecodeFromBscRepo = (contractName: string, files: string[]): string | undefined => { for (let i = 0; i < files.length; i++) { const file = files[i] if (file.includes(`/${contractName}`)) { return clear0x((fs.readFileSync(file)).toString()); } } - throw new Error(`cannot find bytecode for ${contractName} in bsc repo`) + return undefined } const searchFiles = async (searchDir: string, searchSuffix = ''): Promise => { From 9383bd923a85e5b7953d4e54ed15f060f7739889 Mon Sep 17 00:00:00 2001 From: Ethan Date: Mon, 9 Sep 2024 15:07:09 +0800 Subject: [PATCH 52/52] feat: update dev genesis generate command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 96cb433a..4a1fa248 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint:write": "forge fmt ./contracts/BSCTimelock.sol ./contracts/GovToken.sol ./contracts/BSCGovernor.sol ./contracts/TokenRecoverPortal.sol ./contracts/StakeCredit.sol ./contracts/StakeHub.sol ./contracts/SystemV2.sol ", "generate:mainnet": "poetry run python -m scripts.generate mainnet", "generate:testnet": "poetry run python -m scripts.generate testnet", - "generate:dev": "poetry run python -m scripts.generate dev --epoch \"20\" --misdemeanor-threshold \"5\" --felony-threshold \"10\" --init-felony-slash-scope \"60\" --breathe-block-interval \"1 minutes\" --block-interval \"3 seconds\" --stake-hub-protector \"0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25\" --unbond-period \"2 minutes\" --downtime-jail-time \"2 minutes\" --felony-jail-time \"3 minutes\" --init-voting-delay \"1 minutes / BLOCK_INTERVAL\" --init-voting-period \"2 minutes / BLOCK_INTERVAL\" --init-min-period-after-quorum \"uint64(1 minutes / BLOCK_INTERVAL)\" --governor-protector \"0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25\" --init-minimal-delay \"1 minutes\" --lock-period-for-token-recover \"1 minutes\"" + "generate:dev": "poetry run python -m scripts.generate dev --epoch \"200\" --init-felony-slash-scope \"60\" --breathe-block-interval \"10 minutes\" --block-interval \"3 seconds\" --stake-hub-protector \"0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186\" --unbond-period \"2 minutes\" --downtime-jail-time \"2 minutes\" --felony-jail-time \"3 minutes\" --init-voting-delay \"1 minutes / BLOCK_INTERVAL\" --init-voting-period \"2 minutes / BLOCK_INTERVAL\" --init-min-period-after-quorum \"uint64(1 minutes / BLOCK_INTERVAL)\" --governor-protector \"0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186\" --init-minimal-delay \"1 minutes\"" }, "dependencies": { "@openzeppelin/contracts": "^4.9.3",