Address Details
contract

0x7EAAb7A96FC311377709b12A81cd87228780af17

Contract Name
CeloVaultImpl
Creator
0xd52632–b62a49 at 0xf00496–5aefc5
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
23123759
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
CeloVaultImpl




Optimization enabled
true
Compiler version
v0.6.12+commit.27d51765




Optimization runs
200
EVM Version
istanbul




Verified at
2021-10-26T03:07:28.312524Z

contract/orbit_bridge/vault/CeloVault.impl.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./Vault.storage.sol";

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IGovernance {
    function required() external view returns(uint);
    function getOwners() external view returns(address[] memory);
    function isOwner(address owner) external view returns(bool);
}

interface IFarm {
    function deposit(uint amount) external;
    function withdrawAll() external;
    function withdraw(address toAddr, uint amount) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function decimals() external view returns (uint8);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}


interface IERC721 {
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

interface IProxy {
    function owner() external view returns (address);
    function getChain() external view returns (string memory);
    function getAdmin() external view returns (address);
    function getImplementation() external view returns (address);
}

library LibCallBridgeReceiver {
    function callReceiver(bool isFungible, uint gasLimitForBridgeReceiver, address tokenAddress, uint256 _int, bytes memory data, address toAddr) internal returns (bool){
        bool result;
        bytes memory callbytes;
        bytes memory returnbytes;
        if (isFungible) {
            callbytes = abi.encodeWithSignature("onTokenBridgeReceived(address,uint256,bytes)", tokenAddress, _int, data);
        } else {
            callbytes = abi.encodeWithSignature("onNFTBridgeReceived(address,uint256,bytes)", tokenAddress, _int, data);
        }
        if (gasLimitForBridgeReceiver > 0) {
            (result, returnbytes) = toAddr.call{gas : gasLimitForBridgeReceiver}(callbytes);
        } else {
            (result, returnbytes) = toAddr.call(callbytes);
        }

        if(!result){
            return false;
        } else {
            (uint flag) = abi.decode(returnbytes, (uint));
            return flag > 0;
        }
    }
}

contract CeloVaultImpl is VaultStorage {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    event Deposit(string toChain, address fromAddr, bytes toAddr, address token, uint8 decimal, uint amount, uint depositId, bytes data);
    event DepositNFT(string toChain, address fromAddr, bytes toAddr, address token, uint tokenId, uint amount, uint depositId, bytes data);

    event Withdraw(string fromChain, bytes fromAddr, bytes toAddr, bytes token, bytes32[] bytes32s, uint[] uints, bytes data);
    event WithdrawNFT(string fromChain, bytes fromAddr, bytes toAddr, bytes token, bytes32[] bytes32s, uint[] uints, bytes data);

    event BridgeReceiverResult(bool success, bytes fromAddress, address tokenAddress, bytes data);

    constructor() public payable {}

    modifier onlyGovernance {
        require(msg.sender == governance_());
        _;
    }

    modifier onlyActivated {
        require(isActivated);
        _;
    }

    modifier onlyPolicyAdmin {
        require(msg.sender == policyAdmin);
        _;
    }

    function admin_() public view returns (address) {
        return IProxy(address(this)).getAdmin();
    }

    function governance_() public view returns (address) {
        return IProxy(admin_()).owner();
    }

    function getVersion() public pure returns(string memory){
        return "CeloVault20210817";
    }

    function setChainSymbol(string memory _chain) public onlyGovernance {
        chain = _chain;
    }

    function getChainId(string memory chainSymbol) public view returns(bytes32){
        return sha256(abi.encodePacked(address(this), chainSymbol));
    }

    function setValidChain(string memory chainSymbol, bool valid, uint fromAddrLen, uint uintsLen) public onlyGovernance {
        bytes32 chainId = getChainId(chainSymbol);
        require(chainId != getChainId(chain));
        isValidChain[chainId] = valid;
        if(valid){
            chainAddressLength[chainId] = fromAddrLen;
            chainUintsLength[chainId] = uintsLen;
        }
        else{
            chainAddressLength[chainId] = 0;
            chainUintsLength[chainId] = 0;
        }
    }

    function setTaxParams(uint _taxRate, address _taxReceiver) public onlyGovernance {
        require(_taxRate < 10000);
        require(_taxReceiver != address(0));
        taxRate = _taxRate;
        taxReceiver = _taxReceiver;
    }

    function setPolicyAdmin(address _policyAdmin) public onlyGovernance {
        require(_policyAdmin != address(0));

        policyAdmin = _policyAdmin;
    }

    function changeActivate(bool activate) public onlyPolicyAdmin {
        isActivated = activate;
    }

    function setSilentToken(address token, bool v) public onlyPolicyAdmin {
        require(token != address(0));

        silentTokenList[token] = v;
    }

    function setFeeGovernance(address payable _feeGovernance) public onlyGovernance {
        require(_feeGovernance != address(0));

        feeGovernance = _feeGovernance;
    }

    function setChainFee(string memory chainSymbol, uint256 _fee, uint256 _feeWithData) public onlyPolicyAdmin {
        bytes32 chainId = getChainId(chainSymbol);
        require(isValidChain[chainId]);

        chainFee[chainId] = _fee;
        chainFeeWithData[chainId] = _feeWithData;
    }

    function setGasLimitForBridgeReceiver(uint256 _gasLimitForBridgeReceiver) public onlyPolicyAdmin {
        gasLimitForBridgeReceiver = _gasLimitForBridgeReceiver;
    }

    function addFarm(address token, address payable proxy) public onlyGovernance {
        require(farms[token] == address(0));

        uint amount;
        if(token == address(0)){
            amount = address(this).balance;
        }
        else{
            amount = IERC20(token).balanceOf(address(this));
        }

        _transferToken(token, proxy, amount);
        IFarm(proxy).deposit(amount);

        farms[token] = proxy;
    }

    function removeFarm(address token, address payable newProxy) public onlyGovernance {
        require(farms[token] != address(0));

        IFarm(farms[token]).withdrawAll();

        if(newProxy != address(0)){
            uint amount;
            if(token == address(0)){
                amount = address(this).balance;
            }
            else{
                amount = IERC20(token).balanceOf(address(this));
            }

            _transferToken(token, newProxy, amount);
            IFarm(newProxy).deposit(amount);
        }

        farms[token] = newProxy;
    }

    function deposit(string memory toChain, bytes memory toAddr) payable public {
        uint256 fee = chainFee[getChainId(toChain)];
        if(fee != 0){
            require(msg.value > fee);
            _transferToken(address(0), feeGovernance, fee);
        }

        _depositToken(address(0), toChain, toAddr, (msg.value).sub(fee), "");
    }

    function deposit(string memory toChain, bytes memory toAddr, bytes memory data) payable public {
        require(data.length != 0);

        uint256 fee = chainFeeWithData[getChainId(toChain)];
        if(fee != 0){
            require(msg.value > fee);
            _transferToken(address(0), feeGovernance, fee);
        }

        _depositToken(address(0), toChain, toAddr, (msg.value).sub(fee), data);
    }

    function depositToken(address token, string memory toChain, bytes memory toAddr, uint amount) public payable {
        require(token != address(0));

        uint256 fee = chainFee[getChainId(toChain)];
        if(fee != 0){
            require(msg.value >= fee);
            _transferToken(address(0), feeGovernance, msg.value);
        }

        _depositToken(token, toChain, toAddr, amount, "");
    }

    function depositToken(address token, string memory toChain, bytes memory toAddr, uint amount, bytes memory data) public payable {
        require(token != address(0));
        require(data.length != 0);

        uint256 fee = chainFeeWithData[getChainId(toChain)];
        if(fee != 0){
            require(msg.value >= fee);
            _transferToken(address(0), feeGovernance, msg.value);
        }

        _depositToken(token, toChain, toAddr, amount, data);
    }

    function _depositToken(address token, string memory toChain, bytes memory toAddr, uint amount, bytes memory data) private onlyActivated {
        require(isValidChain[getChainId(toChain)]);
        require(amount != 0);
        require(!silentTokenList[token]);

        uint8 decimal;
        if(token == address(0)){
            decimal = 18;
        }
        else{
            IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
            decimal = IERC20(token).decimals();
        }
        require(decimal > 0);

        address payable farm = farms[token];
        if(farm != address(0)){
            _transferToken(token, farm, amount);
            IFarm(farm).deposit(amount);
        }

        if(taxRate > 0 && taxReceiver != address(0)){
            uint tax = _payTax(token, amount, decimal);
            amount = amount.sub(tax);
        }

        depositCount = depositCount + 1;
        emit Deposit(toChain, msg.sender, toAddr, token, decimal, amount, depositCount, data);
    }

    function depositNFT(address token, string memory toChain, bytes memory toAddr, uint tokenId) public payable {
        uint256 fee = chainFee[getChainId(toChain)];
        if(fee != 0){
            require(msg.value >= fee);
            _transferToken(address(0), feeGovernance, msg.value);
        }

        _depositNFT(token, toChain, toAddr, tokenId, "");
    }

    function depositNFT(address token, string memory toChain, bytes memory toAddr, uint tokenId, bytes memory data) public payable {
        require(data.length != 0);

        uint256 fee = chainFeeWithData[getChainId(toChain)];
        if(fee != 0){
            require(msg.value >= fee);
            _transferToken(address(0), feeGovernance, msg.value);
        }

        _depositNFT(token, toChain, toAddr, tokenId, data);
    }

    function _depositNFT(address token, string memory toChain, bytes memory toAddr, uint tokenId, bytes memory data) private onlyActivated {
        require(isValidChain[getChainId(toChain)]);
        require(token != address(0));
        require(!silentTokenList[token]);

        require(IERC721(token).ownerOf(tokenId) == msg.sender);
        IERC721(token).transferFrom(msg.sender, address(this), tokenId);
        require(IERC721(token).ownerOf(tokenId) == address(this));

        depositCount = depositCount + 1;
        emit DepositNFT(toChain, msg.sender, toAddr, token, tokenId, 1, depositCount, data);
    }

    // Fix Data Info
    ///@param bytes32s [0]:govId, [1]:txHash
    ///@param uints [0]:amount, [1]:decimal
    function withdraw(
        address hubContract,
        string memory fromChain,
        bytes memory fromAddr,
        address payable toAddr,
        address token,
        bytes32[] memory bytes32s,
        uint[] memory uints,
        bytes memory data,
        uint8[] memory v,
        bytes32[] memory r,
        bytes32[] memory s
    ) public onlyActivated {
        require(bytes32s.length == 2);
        require(uints.length == chainUintsLength[getChainId(fromChain)]);
        require(uints[1] <= 100);
        require(fromAddr.length == chainAddressLength[getChainId(fromChain)]);

        require(bytes32s[0] == sha256(abi.encodePacked(hubContract, chain, address(this))));
        require(isValidChain[getChainId(fromChain)]);

        {
        bytes32 whash = sha256(abi.encodePacked(hubContract, fromChain, chain, fromAddr, toAddr, token, bytes32s, uints, data));

        require(!isUsedWithdrawal[whash]);
        isUsedWithdrawal[whash] = true;

        uint validatorCount = _validate(whash, v, r, s);
        require(validatorCount >= IGovernance(governance_()).required());
        }

        if(farms[token] != address(0)){ // farmProxy 출금
            IFarm(farms[token]).withdraw(toAddr, uints[0]);
        }
        else{ // 일반 출금
            _transferToken(token, toAddr, uints[0]);
        }

        if(isContract(toAddr) && data.length != 0){
            bool result = LibCallBridgeReceiver.callReceiver(true, gasLimitForBridgeReceiver, token, uints[0], data, toAddr);
            emit BridgeReceiverResult(result, fromAddr, token, data);
        }

        emit Withdraw(fromChain, fromAddr, abi.encodePacked(toAddr), abi.encodePacked(token), bytes32s, uints, data);
    }

    // Fix Data Info
    ///@param bytes32s [0]:govId, [1]:txHash
    ///@param uints [0]:amount, [1]:tokenId
    function withdrawNFT(
        address hubContract,
        string memory fromChain,
        bytes memory fromAddr,
        address payable toAddr,
        address token,
        bytes32[] memory bytes32s,
        uint[] memory uints,
        bytes memory data,
        uint8[] memory v,
        bytes32[] memory r,
        bytes32[] memory s
    ) public onlyActivated {
        require(bytes32s.length == 2);
        require(uints.length == chainUintsLength[getChainId(fromChain)]);
        require(fromAddr.length == chainAddressLength[getChainId(fromChain)]);

        require(bytes32s[0] == sha256(abi.encodePacked(hubContract, chain, address(this))));
        require(isValidChain[getChainId(fromChain)]);

        {
        bytes32 whash = sha256(abi.encodePacked("NFT", hubContract, fromChain, chain, fromAddr, toAddr, token, bytes32s, uints, data));

        require(!isUsedWithdrawal[whash]);
        isUsedWithdrawal[whash] = true;

        uint validatorCount = _validate(whash, v, r, s);
        require(validatorCount >= IGovernance(governance_()).required());
        }

        require(IERC721(token).ownerOf(uints[1]) == address(this));
        IERC721(token).transferFrom(address(this), toAddr, uints[1]);
        require(IERC721(token).ownerOf(uints[1]) == toAddr);

        if(isContract(toAddr) && data.length != 0){
            bool result = LibCallBridgeReceiver.callReceiver(false, gasLimitForBridgeReceiver, token, uints[1], data, toAddr);
            emit BridgeReceiverResult(result, fromAddr, token, data);
        }

        emit WithdrawNFT(fromChain, fromAddr, abi.encodePacked(toAddr), abi.encodePacked(token), bytes32s, uints, data);
    }

    function _validate(bytes32 whash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s) private view returns(uint){
        uint validatorCount = 0;
        IGovernance mig = IGovernance(governance_());
        address[] memory vaList = new address[](mig.getOwners().length);

        uint i=0;
        uint j=0;

        for(i; i<v.length; i++){
            address va = ecrecover(whash,v[i],r[i],s[i]);
            if(mig.isOwner(va)){
                for(j=0; j<validatorCount; j++){
                    require(vaList[j] != va);
                }

                vaList[validatorCount] = va;
                validatorCount += 1;
            }
        }

        return validatorCount;
    }

    function _payTax(address token, uint amount, uint8 decimal) private returns (uint tax) {
        tax = amount.mul(taxRate).div(10000);
        if(tax > 0){
            depositCount = depositCount + 1;
            emit Deposit("ORBIT", msg.sender, abi.encodePacked(taxReceiver), token, decimal, tax, depositCount, "");
        }
    }

    function _transferToken(address token, address payable destination, uint amount) private {
        if(token == address(0)){
            (bool transfered,) = destination.call{value : amount}("");
            require(transfered);
        }
        else{
            IERC20(token).safeTransfer(destination, amount);
        }
    }

    function isContract(address _addr) private view returns (bool){
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

    function bytesToAddress(bytes memory bys) public pure returns (address payable addr) {
        assembly {
            addr := mload(add(bys,20))
        }
    }

    receive () external payable { }
    fallback () external payable { }
}
        

/contract/orbit_bridge/vault/Vault.storage.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

contract VaultStorage {
    string public chain;
    bool public isActivated = true;

    uint public depositCount = 0;

    mapping(bytes32 => bool) public isUsedWithdrawal;
    mapping(bytes32 => bool) public isValidChain;

    uint public bridgingFee = 0;
    address payable public feeGovernance;

    mapping(address => address payable) public farms;
    uint public taxRate = 10; // 0.01% interval
    address public taxReceiver = 0xE9f3604B85c9672728eEecf689cf1F0cF7Dd03F2;

    uint public gasLimitForBridgeReceiver;
    mapping(address => bool) public silentTokenList;

    address public policyAdmin;
    mapping(bytes32 => uint256) public chainFee;
    mapping(bytes32 => uint256) public chainFeeWithData;

    mapping(bytes32 => uint256) public chainUintsLength;
    mapping(bytes32 => uint256) public chainAddressLength;
}
          

Contract ABI

[{"type":"constructor","stateMutability":"payable","inputs":[]},{"type":"event","name":"BridgeReceiverResult","inputs":[{"type":"bool","name":"success","internalType":"bool","indexed":false},{"type":"bytes","name":"fromAddress","internalType":"bytes","indexed":false},{"type":"address","name":"tokenAddress","internalType":"address","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"string","name":"toChain","internalType":"string","indexed":false},{"type":"address","name":"fromAddr","internalType":"address","indexed":false},{"type":"bytes","name":"toAddr","internalType":"bytes","indexed":false},{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint8","name":"decimal","internalType":"uint8","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"depositId","internalType":"uint256","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"DepositNFT","inputs":[{"type":"string","name":"toChain","internalType":"string","indexed":false},{"type":"address","name":"fromAddr","internalType":"address","indexed":false},{"type":"bytes","name":"toAddr","internalType":"bytes","indexed":false},{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"depositId","internalType":"uint256","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"string","name":"fromChain","internalType":"string","indexed":false},{"type":"bytes","name":"fromAddr","internalType":"bytes","indexed":false},{"type":"bytes","name":"toAddr","internalType":"bytes","indexed":false},{"type":"bytes","name":"token","internalType":"bytes","indexed":false},{"type":"bytes32[]","name":"bytes32s","internalType":"bytes32[]","indexed":false},{"type":"uint256[]","name":"uints","internalType":"uint256[]","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawNFT","inputs":[{"type":"string","name":"fromChain","internalType":"string","indexed":false},{"type":"bytes","name":"fromAddr","internalType":"bytes","indexed":false},{"type":"bytes","name":"toAddr","internalType":"bytes","indexed":false},{"type":"bytes","name":"token","internalType":"bytes","indexed":false},{"type":"bytes32[]","name":"bytes32s","internalType":"bytes32[]","indexed":false},{"type":"uint256[]","name":"uints","internalType":"uint256[]","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addFarm","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"address","name":"proxy","internalType":"address payable"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin_","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bridgingFee","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"address","name":"addr","internalType":"address payable"}],"name":"bytesToAddress","inputs":[{"type":"bytes","name":"bys","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"chain","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chainAddressLength","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chainFee","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chainFeeWithData","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chainUintsLength","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeActivate","inputs":[{"type":"bool","name":"activate","internalType":"bool"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[{"type":"string","name":"toChain","internalType":"string"},{"type":"bytes","name":"toAddr","internalType":"bytes"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[{"type":"string","name":"toChain","internalType":"string"},{"type":"bytes","name":"toAddr","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"depositCount","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositNFT","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"toChain","internalType":"string"},{"type":"bytes","name":"toAddr","internalType":"bytes"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositNFT","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"toChain","internalType":"string"},{"type":"bytes","name":"toAddr","internalType":"bytes"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"toChain","internalType":"string"},{"type":"bytes","name":"toAddr","internalType":"bytes"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"toChain","internalType":"string"},{"type":"bytes","name":"toAddr","internalType":"bytes"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"farms","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"feeGovernance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasLimitForBridgeReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getChainId","inputs":[{"type":"string","name":"chainSymbol","internalType":"string"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getVersion","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance_","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isActivated","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isUsedWithdrawal","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isValidChain","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"policyAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeFarm","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"address","name":"newProxy","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setChainFee","inputs":[{"type":"string","name":"chainSymbol","internalType":"string"},{"type":"uint256","name":"_fee","internalType":"uint256"},{"type":"uint256","name":"_feeWithData","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setChainSymbol","inputs":[{"type":"string","name":"_chain","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeGovernance","inputs":[{"type":"address","name":"_feeGovernance","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGasLimitForBridgeReceiver","inputs":[{"type":"uint256","name":"_gasLimitForBridgeReceiver","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPolicyAdmin","inputs":[{"type":"address","name":"_policyAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSilentToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"bool","name":"v","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxParams","inputs":[{"type":"uint256","name":"_taxRate","internalType":"uint256"},{"type":"address","name":"_taxReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setValidChain","inputs":[{"type":"string","name":"chainSymbol","internalType":"string"},{"type":"bool","name":"valid","internalType":"bool"},{"type":"uint256","name":"fromAddrLen","internalType":"uint256"},{"type":"uint256","name":"uintsLen","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"silentTokenList","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"taxRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"taxReceiver","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"hubContract","internalType":"address"},{"type":"string","name":"fromChain","internalType":"string"},{"type":"bytes","name":"fromAddr","internalType":"bytes"},{"type":"address","name":"toAddr","internalType":"address payable"},{"type":"address","name":"token","internalType":"address"},{"type":"bytes32[]","name":"bytes32s","internalType":"bytes32[]"},{"type":"uint256[]","name":"uints","internalType":"uint256[]"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint8[]","name":"v","internalType":"uint8[]"},{"type":"bytes32[]","name":"r","internalType":"bytes32[]"},{"type":"bytes32[]","name":"s","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawNFT","inputs":[{"type":"address","name":"hubContract","internalType":"address"},{"type":"string","name":"fromChain","internalType":"string"},{"type":"bytes","name":"fromAddr","internalType":"bytes"},{"type":"address","name":"toAddr","internalType":"address payable"},{"type":"address","name":"token","internalType":"address"},{"type":"bytes32[]","name":"bytes32s","internalType":"bytes32[]"},{"type":"uint256[]","name":"uints","internalType":"uint256[]"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint8[]","name":"v","internalType":"uint8[]"},{"type":"bytes32[]","name":"r","internalType":"bytes32[]"},{"type":"bytes32[]","name":"s","internalType":"bytes32[]"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60806040526001805460ff19168117905560006002819055600555600a600855600980546001600160a01b03191673e9f3604b85c9672728eeecf689cf1f0cf7dd03f2179055615295806100546000396000f3fe60806040526004361061024a5760003560e01c8063854b70c911610139578063c092045a116100b6578063e6ef73d61161007a578063e6ef73d614611952578063f01b246714611967578063f4ab7e6c14611991578063f5a9a76014611a47578063f7b4dc9014611a5c578063f82ef66914611a8657610251565b8063c092045a1461178d578063c763e5a1146117b7578063d3590c20146117cc578063d6f87109146117f6578063e1b7f0841461191f57610251565b8063a420dc8b116100fd578063a420dc8b14611639578063a4baf750146116f7578063ab7d30fd1461170c578063af9e26d81461173f578063b1efb2bc1461175457610251565b8063854b70c914610fa257806389067c5e14610fdd57806392a2265c14610ff25780639d188c16146114615780639f1193911461148b57610251565b8063421adfa0116101c757806358e518961161018b57806358e5189614610d775780635dd3f1c314610d8c5780635e35384c14610da15780636205e9bc14610edc578063771a3a1d14610f8d57610251565b8063421adfa014610be057806342526e4e14610c2f5780634a8c1fb414610ce05780634cf83e3c14610d0957806350d9876f14610d4457610251565b80632dfdf0b51161020e5780632dfdf0b5146108ed5780632ff6ec1d146109025780633374c6001461093d5780633566c107146109ee57806335fbff3c14610bb457610251565b8063074c9847146102535780630a17bd6a1461028f5780630ac09684146102b95780630d8e6e2c146103f45780632ac5ab1b1461047e57610251565b3661025157005b005b34801561025f57600080fd5b5061027d6004803603602081101561027657600080fd5b5035611c4c565b60408051918252519081900360200190f35b34801561029b57600080fd5b5061027d600480360360208110156102b257600080fd5b5035611c5e565b610251600480360360808110156102cf57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156102f957600080fd5b82018360208201111561030b57600080fd5b803590602001918460018302840111600160201b8311171561032c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561037e57600080fd5b82018360208201111561039057600080fd5b803590602001918460018302840111600160201b831117156103b157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611c70915050565b34801561040057600080fd5b50610409611cf4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044357818101518382015260200161042b565b50505050905090810190601f1680156104705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048a57600080fd5b5061025160048036036101608110156104a257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104cc57600080fd5b8201836020820111156104de57600080fd5b803590602001918460018302840111600160201b831117156104ff57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561055157600080fd5b82018360208201111561056357600080fd5b803590602001918460018302840111600160201b8311171561058457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b038535811696602087013590911695919450925060608101915060400135600160201b8111156105ef57600080fd5b82018360208201111561060157600080fd5b803590602001918460208302840111600160201b8311171561062257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561067157600080fd5b82018360208201111561068357600080fd5b803590602001918460208302840111600160201b831117156106a457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106f357600080fd5b82018360208201111561070557600080fd5b803590602001918460018302840111600160201b8311171561072657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561077857600080fd5b82018360208201111561078a57600080fd5b803590602001918460208302840111600160201b831117156107ab57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107fa57600080fd5b82018360208201111561080c57600080fd5b803590602001918460208302840111600160201b8311171561082d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561087c57600080fd5b82018360208201111561088e57600080fd5b803590602001918460208302840111600160201b831117156108af57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d1f945050505050565b3480156108f957600080fd5b5061027d6127c3565b34801561090e57600080fd5b506102516004803603604081101561092557600080fd5b506001600160a01b03813516906020013515156127c9565b34801561094957600080fd5b5061027d6004803603602081101561096057600080fd5b810190602081018135600160201b81111561097a57600080fd5b82018360208201111561098c57600080fd5b803590602001918460018302840111600160201b831117156109ad57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061281e945050505050565b610251600480360360a0811015610a0457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a2e57600080fd5b820183602082011115610a4057600080fd5b803590602001918460018302840111600160201b83111715610a6157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610ab357600080fd5b820183602082011115610ac557600080fd5b803590602001918460018302840111600160201b83111715610ae657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092958435959094909350604081019250602001359050600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460018302840111600160201b83111715610b7357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612928945050505050565b348015610bc057600080fd5b5061025160048036036020811015610bd757600080fd5b50351515612996565b348015610bec57600080fd5b50610c1360048036036020811015610c0357600080fd5b50356001600160a01b03166129c0565b604080516001600160a01b039092168252519081900360200190f35b348015610c3b57600080fd5b50610c1360048036036020811015610c5257600080fd5b810190602081018135600160201b811115610c6c57600080fd5b820183602082011115610c7e57600080fd5b803590602001918460018302840111600160201b83111715610c9f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506129db945050505050565b348015610cec57600080fd5b50610cf56129e2565b604080519115158252519081900360200190f35b348015610d1557600080fd5b5061025160048036036040811015610d2c57600080fd5b506001600160a01b03813581169160200135166129eb565b348015610d5057600080fd5b50610cf560048036036020811015610d6757600080fd5b50356001600160a01b0316612b5d565b348015610d8357600080fd5b50610c13612b72565b348015610d9857600080fd5b5061027d612b81565b61025160048036036080811015610db757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610de157600080fd5b820183602082011115610df357600080fd5b803590602001918460018302840111600160201b83111715610e1457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610e6657600080fd5b820183602082011115610e7857600080fd5b803590602001918460018302840111600160201b83111715610e9957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250612b87915050565b348015610ee857600080fd5b5061025160048036036020811015610eff57600080fd5b810190602081018135600160201b811115610f1957600080fd5b820183602082011115610f2b57600080fd5b803590602001918460018302840111600160201b83111715610f4c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612bf1945050505050565b348015610f9957600080fd5b5061027d612c2d565b348015610fae57600080fd5b5061025160048036036040811015610fc557600080fd5b506001600160a01b0381358116916020013516612c33565b348015610fe957600080fd5b5061027d612e18565b348015610ffe57600080fd5b50610251600480360361016081101561101657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561104057600080fd5b82018360208201111561105257600080fd5b803590602001918460018302840111600160201b8311171561107357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156110c557600080fd5b8201836020820111156110d757600080fd5b803590602001918460018302840111600160201b831117156110f857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b038535811696602087013590911695919450925060608101915060400135600160201b81111561116357600080fd5b82018360208201111561117557600080fd5b803590602001918460208302840111600160201b8311171561119657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156111e557600080fd5b8201836020820111156111f757600080fd5b803590602001918460208302840111600160201b8311171561121857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561126757600080fd5b82018360208201111561127957600080fd5b803590602001918460018302840111600160201b8311171561129a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156112ec57600080fd5b8201836020820111156112fe57600080fd5b803590602001918460208302840111600160201b8311171561131f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561136e57600080fd5b82018360208201111561138057600080fd5b803590602001918460208302840111600160201b831117156113a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156113f057600080fd5b82018360208201111561140257600080fd5b803590602001918460208302840111600160201b8311171561142357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e1e945050505050565b34801561146d57600080fd5b50610cf56004803603602081101561148457600080fd5b5035613747565b610251600480360360608110156114a157600080fd5b810190602081018135600160201b8111156114bb57600080fd5b8201836020820111156114cd57600080fd5b803590602001918460018302840111600160201b831117156114ee57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561154057600080fd5b82018360208201111561155257600080fd5b803590602001918460018302840111600160201b8311171561157357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156115c557600080fd5b8201836020820111156115d757600080fd5b803590602001918460018302840111600160201b831117156115f857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061375c945050505050565b34801561164557600080fd5b506102516004803603608081101561165c57600080fd5b810190602081018135600160201b81111561167657600080fd5b82018360208201111561168857600080fd5b803590602001918460018302840111600160201b831117156116a957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505050803515159150602081013590604001356137d1565b34801561170357600080fd5b50610c1361390c565b34801561171857600080fd5b506102516004803603602081101561172f57600080fd5b50356001600160a01b0316613978565b34801561174b57600080fd5b50610c136139d2565b34801561176057600080fd5b506102516004803603604081101561177757600080fd5b50803590602001356001600160a01b03166139e1565b34801561179957600080fd5b5061027d600480360360208110156117b057600080fd5b5035613a4e565b3480156117c357600080fd5b50610409613a60565b3480156117d857600080fd5b50610251600480360360208110156117ef57600080fd5b5035613aee565b6102516004803603604081101561180c57600080fd5b810190602081018135600160201b81111561182657600080fd5b82018360208201111561183857600080fd5b803590602001918460018302840111600160201b8311171561185957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156118ab57600080fd5b8201836020820111156118bd57600080fd5b803590602001918460018302840111600160201b831117156118de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613b0a945050505050565b34801561192b57600080fd5b506102516004803603602081101561194257600080fd5b50356001600160a01b0316613b82565b34801561195e57600080fd5b50610c13613bdc565b34801561197357600080fd5b50610cf56004803603602081101561198a57600080fd5b5035613beb565b34801561199d57600080fd5b50610251600480360360608110156119b457600080fd5b810190602081018135600160201b8111156119ce57600080fd5b8201836020820111156119e057600080fd5b803590602001918460018302840111600160201b83111715611a0157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060200135613c00565b348015611a5357600080fd5b50610c13613c61565b348015611a6857600080fd5b5061027d60048036036020811015611a7f57600080fd5b5035613ca3565b610251600480360360a0811015611a9c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115611ac657600080fd5b820183602082011115611ad857600080fd5b803590602001918460018302840111600160201b83111715611af957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115611b4b57600080fd5b820183602082011115611b5d57600080fd5b803590602001918460018302840111600160201b83111715611b7e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092958435959094909350604081019250602001359050600160201b811115611bd857600080fd5b820183602082011115611bea57600080fd5b803590602001918460018302840111600160201b83111715611c0b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613cb5945050505050565b60106020526000908152604090205481565b600e6020526000908152604090205481565b6001600160a01b038416611c8357600080fd5b6000600d6000611c928661281e565b815260200190815260200160002054905080600014611cd15780341015611cb857600080fd5b600654611cd1906000906001600160a01b031634613d2e565b611ced8585858560405180602001604052806000815250613db4565b5050505050565b60408051808201909152601181527043656c6f5661756c74323032313038313760781b602082015290565b60015460ff16611d2e57600080fd5b8551600214611d3c57600080fd5b600f6000611d498c61281e565b815260200190815260200160002054855114611d6457600080fd5b606485600181518110611d7357fe5b60200260200101511115611d8657600080fd5b60106000611d938c61281e565b815260200190815260200160002054895114611dae57600080fd5b60028b60003060405160200180846001600160a01b031660601b815260140183805460018160011615610100020316600290048015611e245780601f10611e02576101008083540402835291820191611e24565b820191906000526020600020905b815481529060010190602001808311611e10575b5050826001600160a01b031660601b815260140193505050506040516020818303038152906040526040518082805190602001908083835b60208310611e7b5780518252601f199092019160209182019101611e5c565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611eba573d6000803e3d6000fd5b5050506040513d6020811015611ecf57600080fd5b505186518790600090611ede57fe5b602002602001015114611ef057600080fd5b60046000611efd8c61281e565b815260208101919091526040016000205460ff16611f1a57600080fd5b600060028c8c60008d8d8d8d8d8d604051602001808a6001600160a01b031660601b815260140189805190602001908083835b60208310611f6c5780518252601f199092019160209182019101611f4d565b6001836020036101000a03801982511681845116808217855250505050505090500188805460018160011615610100020316600290048015611fe55780601f10611fc3576101008083540402835291820191611fe5565b820191906000526020600020905b815481529060010190602001808311611fd1575b5050875160208901908083835b602083106120115780518252601f199092019160209182019101611ff2565b6001836020036101000a038019825116818451168082178552505050505050905001866001600160a01b031660601b8152601401856001600160a01b031660601b8152601401848051906020019060200280838360005b83811015612080578181015183820152602001612068565b50505050905001838051906020019060200280838360005b838110156120b0578181015183820152602001612098565b5050505090500182805190602001908083835b602083106120e25780518252601f1990920191602091820191016120c3565b6001836020036101000a03801982511681845116808217855250505050505090500199505050505050505050506040516020818303038152906040526040518082805190602001908083835b6020831061214d5780518252601f19909201916020918201910161212e565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561218c573d6000803e3d6000fd5b5050506040513d60208110156121a157600080fd5b505160008181526003602052604090205490915060ff16156121c257600080fd5b6000818152600360205260408120805460ff191660011790556121e782868686614146565b90506121f1613c61565b6001600160a01b031663dc8452cd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561222957600080fd5b505afa15801561223d573d6000803e3d6000fd5b505050506040513d602081101561225357600080fd5b505181101561226157600080fd5b50506001600160a01b03878116600090815260076020526040902054161561231e576001600160a01b03808816600090815260076020526040812054875192169163f3fef3a3918b918991906122b357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561230157600080fd5b505af1158015612315573d6000803e3d6000fd5b5050505061233d565b61233d87898760008151811061233057fe5b6020026020010151613d2e565b6123468861445e565b80156123525750835115155b1561249d57600061237e6001600a548a8960008151811061236f57fe5b6020026020010151898e61446a565b90507f465957fd2b20cfb78984ff970d1d123f6a7487ba1fa0fcd701af2a792efdce54818b8a8860405180851515815260200180602001846001600160a01b0316815260200180602001838103835286818151815260200191508051906020019080838360005b838110156123fd5781810151838201526020016123e5565b50505050905090810190601f16801561242a5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561245d578181015183820152602001612445565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505b7fa866edf1861d39a9973d7892f3869e1bb4b76bc00d216872c1dd2bc547f2da2e8a8a8a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a8a8a604051808060200180602001806020018060200180602001806020018060200188810388528f818151815260200191508051906020019080838360005b83811015612570578181015183820152602001612558565b50505050905090810190601f16801561259d5780820380516001836020036101000a031916815260200191505b5088810387528e818151815260200191508051906020019080838360005b838110156125d35781810151838201526020016125bb565b50505050905090810190601f1680156126005780820380516001836020036101000a031916815260200191505b5088810386528d5181528d516020918201918f019080838360005b8381101561263357818101518382015260200161261b565b50505050905090810190601f1680156126605780820380516001836020036101000a031916815260200191505b5088810385528c5181528c516020918201918e019080838360005b8381101561269357818101518382015260200161267b565b50505050905090810190601f1680156126c05780820380516001836020036101000a031916815260200191505b5088810384528b5181528b51602091820191808e01910280838360005b838110156126f55781810151838201526020016126dd565b5050505090500188810383528a818151815260200191508051906020019060200280838360005b8381101561273457818101518382015260200161271c565b50505050905001888103825289818151815260200191508051906020019080838360005b83811015612770578181015183820152602001612758565b50505050905090810190601f16801561279d5780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390a15050505050505050505050565b60025481565b600c546001600160a01b031633146127e057600080fd5b6001600160a01b0382166127f357600080fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b60006002308360405160200180836001600160a01b031660601b815260140182805190602001908083835b602083106128685780518252601f199092019160209182019101612849565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526040518082805190602001908083835b602083106128cc5780518252601f1990920191602091820191016128ad565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561290b573d6000803e3d6000fd5b5050506040513d602081101561292057600080fd5b505192915050565b805161293357600080fd5b6000600e60006129428761281e565b815260200190815260200160002054905080600014612981578034101561296857600080fd5b600654612981906000906001600160a01b031634613d2e565b61298e8686868686614789565b505050505050565b600c546001600160a01b031633146129ad57600080fd5b6001805460ff1916911515919091179055565b6007602052600090815260409020546001600160a01b031681565b6014015190565b60015460ff1681565b6129f3613c61565b6001600160a01b0316336001600160a01b031614612a1057600080fd5b6001600160a01b038281166000908152600760205260409020541615612a3557600080fd5b60006001600160a01b038316612a4c575047612ac1565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015612a9257600080fd5b505afa158015612aa6573d6000803e3d6000fd5b505050506040513d6020811015612abc57600080fd5b505190505b612acc838383613d2e565b816001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b1257600080fd5b505af1158015612b26573d6000803e3d6000fd5b505050506001600160a01b03928316600090815260076020526040902080546001600160a01b031916929093169190911790915550565b600b6020526000908152604090205460ff1681565b600c546001600160a01b031681565b600a5481565b6000600d6000612b968661281e565b815260200190815260200160002054905080600014612bd55780341015612bbc57600080fd5b600654612bd5906000906001600160a01b031634613d2e565b611ced8585858560405180602001604052806000815250614789565b612bf9613c61565b6001600160a01b0316336001600160a01b031614612c1657600080fd5b8051612c2990600090602084019061515b565b5050565b60085481565b612c3b613c61565b6001600160a01b0316336001600160a01b031614612c5857600080fd5b6001600160a01b0382811660009081526007602052604090205416612c7c57600080fd5b6001600160a01b0380831660009081526007602052604080822054815163429c145b60e11b8152915193169263853828b69260048084019391929182900301818387803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050506001600160a01b03811615612dea5760006001600160a01b038316612d0a575047612d7f565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d6020811015612d7a57600080fd5b505190505b612d8a838383613d2e565b816001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612dd057600080fd5b505af1158015612de4573d6000803e3d6000fd5b50505050505b6001600160a01b03918216600090815260076020526040902080546001600160a01b03191691909216179055565b60055481565b60015460ff16612e2d57600080fd5b8551600214612e3b57600080fd5b600f6000612e488c61281e565b815260200190815260200160002054855114612e6357600080fd5b60106000612e708c61281e565b815260200190815260200160002054895114612e8b57600080fd5b60028b60003060405160200180846001600160a01b031660601b815260140183805460018160011615610100020316600290048015612f015780601f10612edf576101008083540402835291820191612f01565b820191906000526020600020905b815481529060010190602001808311612eed575b5050826001600160a01b031660601b815260140193505050506040516020818303038152906040526040518082805190602001908083835b60208310612f585780518252601f199092019160209182019101612f39565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612f97573d6000803e3d6000fd5b5050506040513d6020811015612fac57600080fd5b505186518790600090612fbb57fe5b602002602001015114612fcd57600080fd5b60046000612fda8c61281e565b815260208101919091526040016000205460ff16612ff757600080fd5b600060028c8c60008d8d8d8d8d8d60405160200180806213919560ea1b8152506003018a6001600160a01b031660601b815260140189805190602001908083835b602083106130575780518252601f199092019160209182019101613038565b6001836020036101000a038019825116818451168082178552505050505050905001888054600181600116156101000203166002900480156130d05780601f106130ae5761010080835404028352918201916130d0565b820191906000526020600020905b8154815290600101906020018083116130bc575b5050875160208901908083835b602083106130fc5780518252601f1990920191602091820191016130dd565b6001836020036101000a038019825116818451168082178552505050505050905001866001600160a01b031660601b8152601401856001600160a01b031660601b8152601401848051906020019060200280838360005b8381101561316b578181015183820152602001613153565b50505050905001838051906020019060200280838360005b8381101561319b578181015183820152602001613183565b5050505090500182805190602001908083835b602083106131cd5780518252601f1990920191602091820191016131ae565b6001836020036101000a03801982511681845116808217855250505050505090500199505050505050505050506040516020818303038152906040526040518082805190602001908083835b602083106132385780518252601f199092019160209182019101613219565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613277573d6000803e3d6000fd5b5050506040513d602081101561328c57600080fd5b505160008181526003602052604090205490915060ff16156132ad57600080fd5b6000818152600360205260408120805460ff191660011790556132d282868686614146565b90506132dc613c61565b6001600160a01b031663dc8452cd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561331457600080fd5b505afa158015613328573d6000803e3d6000fd5b505050506040513d602081101561333e57600080fd5b505181101561334c57600080fd5b5050306001600160a01b0316876001600160a01b0316636352211e8760018151811061337457fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156133b057600080fd5b505afa1580156133c4573d6000803e3d6000fd5b505050506040513d60208110156133da57600080fd5b50516001600160a01b0316146133ef57600080fd5b866001600160a01b03166323b872dd308a8860018151811061340d57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561346b57600080fd5b505af115801561347f573d6000803e3d6000fd5b50505050876001600160a01b0316876001600160a01b0316636352211e876001815181106134a957fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156134e557600080fd5b505afa1580156134f9573d6000803e3d6000fd5b505050506040513d602081101561350f57600080fd5b50516001600160a01b03161461352457600080fd5b61352d8861445e565b80156135395750835115155b156136755760006135566000600a548a8960018151811061236f57fe5b90507f465957fd2b20cfb78984ff970d1d123f6a7487ba1fa0fcd701af2a792efdce54818b8a8860405180851515815260200180602001846001600160a01b0316815260200180602001838103835286818151815260200191508051906020019080838360005b838110156135d55781810151838201526020016135bd565b50505050905090810190601f1680156136025780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561363557818101518382015260200161361d565b50505050905090810190601f1680156136625780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505b7f14e7aff79a50a1d085c0f52db89b51adb553b691263a070b085f2a01ce1aeaec8a8a8a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a8a8a604051808060200180602001806020018060200180602001806020018060200188810388528f8181518152602001915080519060200190808383600083811015612570578181015183820152602001612558565b60036020526000908152604090205460ff1681565b805161376757600080fd5b6000600e60006137768661281e565b8152602001908152602001600020549050806000146137b45780341161379b57600080fd5b6006546137b4906000906001600160a01b031683613d2e565b6137cb600085856137c53486614b38565b86613db4565b50505050565b6137d9613c61565b6001600160a01b0316336001600160a01b0316146137f657600080fd5b60006138018561281e565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293945061389893929183018282801561388e5780601f106138635761010080835404028352916020019161388e565b820191906000526020600020905b81548152906001019060200180831161387157829003601f168201915b505050505061281e565b8114156138a457600080fd5b6000818152600460205260409020805460ff191685158015919091179091556138ea576000818152601060209081526040808320869055600f9091529020829055611ced565b6000908152601060209081526040808320839055600f90915281205550505050565b6000306001600160a01b0316636e9960c36040518163ffffffff1660e01b815260040160206040518083038186803b15801561394757600080fd5b505afa15801561395b573d6000803e3d6000fd5b505050506040513d602081101561397157600080fd5b5051905090565b613980613c61565b6001600160a01b0316336001600160a01b03161461399d57600080fd5b6001600160a01b0381166139b057600080fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031681565b6139e9613c61565b6001600160a01b0316336001600160a01b031614613a0657600080fd5b6127108210613a1457600080fd5b6001600160a01b038116613a2757600080fd5b600891909155600980546001600160a01b0319166001600160a01b03909216919091179055565b600d6020526000908152604090205481565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015613ae65780601f10613abb57610100808354040283529160200191613ae6565b820191906000526020600020905b815481529060010190602001808311613ac957829003601f168201915b505050505081565b600c546001600160a01b03163314613b0557600080fd5b600a55565b6000600d6000613b198561281e565b815260200190815260200160002054905080600014613b5757803411613b3e57600080fd5b600654613b57906000906001600160a01b031683613d2e565b613b7d60008484613b683486614b38565b60405180602001604052806000815250613db4565b505050565b613b8a613c61565b6001600160a01b0316336001600160a01b031614613ba757600080fd5b6001600160a01b038116613bba57600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031681565b60046020526000908152604090205460ff1681565b600c546001600160a01b03163314613c1757600080fd5b6000613c228461281e565b60008181526004602052604090205490915060ff16613c4057600080fd5b6000908152600d6020908152604080832094909455600e9052919091205550565b6000613c6b61390c565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561394757600080fd5b600f6020526000908152604090205481565b6001600160a01b038516613cc857600080fd5b8051613cd357600080fd5b6000600e6000613ce28761281e565b815260200190815260200160002054905080600014613d215780341015613d0857600080fd5b600654613d21906000906001600160a01b031634613d2e565b61298e8686868686613db4565b6001600160a01b038316613da0576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114613d87576040519150601f19603f3d011682016040523d82523d6000602084013e613d8c565b606091505b5050905080613d9a57600080fd5b50613b7d565b613b7d6001600160a01b0384168383614b9a565b60015460ff16613dc357600080fd5b60046000613dd08661281e565b815260208101919091526040016000205460ff16613ded57600080fd5b81613df757600080fd5b6001600160a01b0385166000908152600b602052604090205460ff1615613e1d57600080fd5b60006001600160a01b038616613e3557506012613eb2565b613e4a6001600160a01b038716333086614bec565b856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613e8357600080fd5b505afa158015613e97573d6000803e3d6000fd5b505050506040513d6020811015613ead57600080fd5b505190505b60008160ff1611613ec257600080fd5b6001600160a01b03808716600090815260076020526040902054168015613f4d57613eee878286613d2e565b806001600160a01b031663b6b55f25856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613f3457600080fd5b505af1158015613f48573d6000803e3d6000fd5b505050505b6000600854118015613f6957506009546001600160a01b031615155b15613f8b576000613f7b888685614c46565b9050613f878582614b38565b9450505b6002546001016002819055507fa6103c513fe87f7876c848403a612d7790465e2531fed80df0c74dae035ce8808633878a86896002548a6040518080602001896001600160a01b0316815260200180602001886001600160a01b031681526020018760ff1681526020018681526020018581526020018060200184810384528c818151815260200191508051906020019080838360005b8381101561403a578181015183820152602001614022565b50505050905090810190601f1680156140675780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b8381101561409a578181015183820152602001614082565b50505050905090810190601f1680156140c75780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b838110156140fa5781810151838201526020016140e2565b50505050905090810190601f1680156141275780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a150505050505050565b60008080614152613c61565b90506060816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561418f57600080fd5b505afa1580156141a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156141cc57600080fd5b8101908080516040519392919084600160201b8211156141eb57600080fd5b90830190602082018581111561420057600080fd5b82518660208202830111600160201b8211171561421c57600080fd5b82525081516020918201928201910280838360005b83811015614249578181015183820152602001614231565b505050509050016040525050505167ffffffffffffffff8111801561426d57600080fd5b50604051908082528060200260200182016040528015614297578160200160208202803683370190505b5090506000805b885182101561445057600060018b8b85815181106142b857fe5b60200260200101518b86815181106142cc57fe5b60200260200101518b87815181106142e057fe5b602002602001015160405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561433c573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316632f54bf6e826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561439557600080fd5b505afa1580156143a9573d6000803e3d6000fd5b505050506040513d60208110156143bf57600080fd5b50511561444457600091505b8582101561441057806001600160a01b03168483815181106143e957fe5b60200260200101516001600160a01b0316141561440557600080fd5b6001909101906143cb565b8084878151811061441d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001860195505b5060019091019061429e565b509298975050505050505050565b3b63ffffffff16151590565b60008060608089156145335787878760405160240180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156144ce5781810151838201526020016144b6565b50505050905090810190601f1680156144fb5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166383c40a1960e01b17905296506145eb945050505050565b87878760405160240180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561458b578181015183820152602001614573565b50505050905090810190601f1680156145b85780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166303266d8b60e01b179052965050505050505b881561469f57846001600160a01b031689836040518082805190602001908083835b6020831061462c5780518252601f19909201916020918201910161460d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d806000811461468f576040519150601f19603f3d011682016040523d82523d6000602084013e614694565b606091505b509093509050614747565b846001600160a01b0316826040518082805190602001908083835b602083106146d95780518252601f1990920191602091820191016146ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461473b576040519150601f19603f3d011682016040523d82523d6000602084013e614740565b606091505b5090935090505b82614758576000935050505061477f565b600081806020019051602081101561476f57600080fd5b50511515945061477f9350505050565b9695505050505050565b60015460ff1661479857600080fd5b600460006147a58661281e565b815260208101919091526040016000205460ff166147c257600080fd5b6001600160a01b0385166147d557600080fd5b6001600160a01b0385166000908152600b602052604090205460ff16156147fb57600080fd5b336001600160a01b0316856001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561484957600080fd5b505afa15801561485d573d6000803e3d6000fd5b505050506040513d602081101561487357600080fd5b50516001600160a01b03161461488857600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038716916323b872dd91606480830192600092919082900301818387803b1580156148dc57600080fd5b505af11580156148f0573d6000803e3d6000fd5b50505050306001600160a01b0316856001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561494257600080fd5b505afa158015614956573d6000803e3d6000fd5b505050506040513d602081101561496c57600080fd5b50516001600160a01b03161461498157600080fd5b6002546001016002819055507f62e144fddae381faa80edcfe1a92bcb629695714557217064b483e69360cf5a284338588866001600254886040518080602001896001600160a01b0316815260200180602001886001600160a01b031681526020018781526020018681526020018581526020018060200184810384528c818151815260200191508051906020019080838360005b83811015614a2e578181015183820152602001614a16565b50505050905090810190601f168015614a5b5780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b83811015614a8e578181015183820152602001614a76565b50505050905090810190601f168015614abb5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015614aee578181015183820152602001614ad6565b50505050905090810190601f168015614b1b5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a15050505050565b600082821115614b8f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613b7d908490614dcd565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526137cb908590614dcd565b6000614c69612710614c6360085486614e7e90919063ffffffff16565b90614ed7565b90508015614dc6576002546001016002819055507fa6103c513fe87f7876c848403a612d7790465e2531fed80df0c74dae035ce88033600960009054906101000a90046001600160a01b031660405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528685856002546040518080602001886001600160a01b0316815260200180602001876001600160a01b031681526020018660ff16815260200185815260200184815260200180602001848103845260058152602001806413d490925560da1b815250602001848103835289818151815260200191508051906020019080838360005b83811015614d7a578181015183820152602001614d62565b50505050905090810190601f168015614da75780820380516001836020036101000a031916815260200191505b5093840390525050600081526040805191829003019650945050505050a15b9392505050565b6060614e22826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f3e9092919063ffffffff16565b805190915015613b7d57808060200190516020811015614e4157600080fd5b5051613b7d5760405162461bcd60e51b815260040180806020018281038252602a815260200180615236602a913960400191505060405180910390fd5b600082614e8d57506000614b94565b82820282848281614e9a57fe5b0414614dc65760405162461bcd60e51b81526004018080602001828103825260218152602001806152156021913960400191505060405180910390fd5b6000808211614f2d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381614f3657fe5b049392505050565b6060614f4d8484600085614f55565b949350505050565b606082471015614f965760405162461bcd60e51b81526004018080602001828103825260268152602001806151ef6026913960400191505060405180910390fd5b614f9f856150b1565b614ff0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061502f5780518252601f199092019160209182019101615010565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615091576040519150601f19603f3d011682016040523d82523d6000602084013e615096565b606091505b50915091506150a68282866150b7565b979650505050505050565b3b151590565b606083156150c6575081614dc6565b8251156150d65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615120578181015183820152602001615108565b50505050905090810190601f16801561514d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061519c57805160ff19168380011785556151c9565b828001600101855582156151c9579182015b828111156151c95782518255916020019190600101906151ae565b506151d59291506151d9565b5090565b5b808211156151d557600081556001016151da56fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220635168011699b306776aba1c5b015d5fcf58b2b185448dc2d820c12280f1c5ce64736f6c634300060c0033

Deployed ByteCode

0x60806040526004361061024a5760003560e01c8063854b70c911610139578063c092045a116100b6578063e6ef73d61161007a578063e6ef73d614611952578063f01b246714611967578063f4ab7e6c14611991578063f5a9a76014611a47578063f7b4dc9014611a5c578063f82ef66914611a8657610251565b8063c092045a1461178d578063c763e5a1146117b7578063d3590c20146117cc578063d6f87109146117f6578063e1b7f0841461191f57610251565b8063a420dc8b116100fd578063a420dc8b14611639578063a4baf750146116f7578063ab7d30fd1461170c578063af9e26d81461173f578063b1efb2bc1461175457610251565b8063854b70c914610fa257806389067c5e14610fdd57806392a2265c14610ff25780639d188c16146114615780639f1193911461148b57610251565b8063421adfa0116101c757806358e518961161018b57806358e5189614610d775780635dd3f1c314610d8c5780635e35384c14610da15780636205e9bc14610edc578063771a3a1d14610f8d57610251565b8063421adfa014610be057806342526e4e14610c2f5780634a8c1fb414610ce05780634cf83e3c14610d0957806350d9876f14610d4457610251565b80632dfdf0b51161020e5780632dfdf0b5146108ed5780632ff6ec1d146109025780633374c6001461093d5780633566c107146109ee57806335fbff3c14610bb457610251565b8063074c9847146102535780630a17bd6a1461028f5780630ac09684146102b95780630d8e6e2c146103f45780632ac5ab1b1461047e57610251565b3661025157005b005b34801561025f57600080fd5b5061027d6004803603602081101561027657600080fd5b5035611c4c565b60408051918252519081900360200190f35b34801561029b57600080fd5b5061027d600480360360208110156102b257600080fd5b5035611c5e565b610251600480360360808110156102cf57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156102f957600080fd5b82018360208201111561030b57600080fd5b803590602001918460018302840111600160201b8311171561032c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561037e57600080fd5b82018360208201111561039057600080fd5b803590602001918460018302840111600160201b831117156103b157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611c70915050565b34801561040057600080fd5b50610409611cf4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044357818101518382015260200161042b565b50505050905090810190601f1680156104705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048a57600080fd5b5061025160048036036101608110156104a257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104cc57600080fd5b8201836020820111156104de57600080fd5b803590602001918460018302840111600160201b831117156104ff57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561055157600080fd5b82018360208201111561056357600080fd5b803590602001918460018302840111600160201b8311171561058457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b038535811696602087013590911695919450925060608101915060400135600160201b8111156105ef57600080fd5b82018360208201111561060157600080fd5b803590602001918460208302840111600160201b8311171561062257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561067157600080fd5b82018360208201111561068357600080fd5b803590602001918460208302840111600160201b831117156106a457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106f357600080fd5b82018360208201111561070557600080fd5b803590602001918460018302840111600160201b8311171561072657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561077857600080fd5b82018360208201111561078a57600080fd5b803590602001918460208302840111600160201b831117156107ab57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107fa57600080fd5b82018360208201111561080c57600080fd5b803590602001918460208302840111600160201b8311171561082d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561087c57600080fd5b82018360208201111561088e57600080fd5b803590602001918460208302840111600160201b831117156108af57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d1f945050505050565b3480156108f957600080fd5b5061027d6127c3565b34801561090e57600080fd5b506102516004803603604081101561092557600080fd5b506001600160a01b03813516906020013515156127c9565b34801561094957600080fd5b5061027d6004803603602081101561096057600080fd5b810190602081018135600160201b81111561097a57600080fd5b82018360208201111561098c57600080fd5b803590602001918460018302840111600160201b831117156109ad57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061281e945050505050565b610251600480360360a0811015610a0457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a2e57600080fd5b820183602082011115610a4057600080fd5b803590602001918460018302840111600160201b83111715610a6157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610ab357600080fd5b820183602082011115610ac557600080fd5b803590602001918460018302840111600160201b83111715610ae657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092958435959094909350604081019250602001359050600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460018302840111600160201b83111715610b7357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612928945050505050565b348015610bc057600080fd5b5061025160048036036020811015610bd757600080fd5b50351515612996565b348015610bec57600080fd5b50610c1360048036036020811015610c0357600080fd5b50356001600160a01b03166129c0565b604080516001600160a01b039092168252519081900360200190f35b348015610c3b57600080fd5b50610c1360048036036020811015610c5257600080fd5b810190602081018135600160201b811115610c6c57600080fd5b820183602082011115610c7e57600080fd5b803590602001918460018302840111600160201b83111715610c9f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506129db945050505050565b348015610cec57600080fd5b50610cf56129e2565b604080519115158252519081900360200190f35b348015610d1557600080fd5b5061025160048036036040811015610d2c57600080fd5b506001600160a01b03813581169160200135166129eb565b348015610d5057600080fd5b50610cf560048036036020811015610d6757600080fd5b50356001600160a01b0316612b5d565b348015610d8357600080fd5b50610c13612b72565b348015610d9857600080fd5b5061027d612b81565b61025160048036036080811015610db757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610de157600080fd5b820183602082011115610df357600080fd5b803590602001918460018302840111600160201b83111715610e1457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610e6657600080fd5b820183602082011115610e7857600080fd5b803590602001918460018302840111600160201b83111715610e9957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250612b87915050565b348015610ee857600080fd5b5061025160048036036020811015610eff57600080fd5b810190602081018135600160201b811115610f1957600080fd5b820183602082011115610f2b57600080fd5b803590602001918460018302840111600160201b83111715610f4c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612bf1945050505050565b348015610f9957600080fd5b5061027d612c2d565b348015610fae57600080fd5b5061025160048036036040811015610fc557600080fd5b506001600160a01b0381358116916020013516612c33565b348015610fe957600080fd5b5061027d612e18565b348015610ffe57600080fd5b50610251600480360361016081101561101657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561104057600080fd5b82018360208201111561105257600080fd5b803590602001918460018302840111600160201b8311171561107357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156110c557600080fd5b8201836020820111156110d757600080fd5b803590602001918460018302840111600160201b831117156110f857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b038535811696602087013590911695919450925060608101915060400135600160201b81111561116357600080fd5b82018360208201111561117557600080fd5b803590602001918460208302840111600160201b8311171561119657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156111e557600080fd5b8201836020820111156111f757600080fd5b803590602001918460208302840111600160201b8311171561121857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561126757600080fd5b82018360208201111561127957600080fd5b803590602001918460018302840111600160201b8311171561129a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156112ec57600080fd5b8201836020820111156112fe57600080fd5b803590602001918460208302840111600160201b8311171561131f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561136e57600080fd5b82018360208201111561138057600080fd5b803590602001918460208302840111600160201b831117156113a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156113f057600080fd5b82018360208201111561140257600080fd5b803590602001918460208302840111600160201b8311171561142357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e1e945050505050565b34801561146d57600080fd5b50610cf56004803603602081101561148457600080fd5b5035613747565b610251600480360360608110156114a157600080fd5b810190602081018135600160201b8111156114bb57600080fd5b8201836020820111156114cd57600080fd5b803590602001918460018302840111600160201b831117156114ee57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561154057600080fd5b82018360208201111561155257600080fd5b803590602001918460018302840111600160201b8311171561157357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156115c557600080fd5b8201836020820111156115d757600080fd5b803590602001918460018302840111600160201b831117156115f857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061375c945050505050565b34801561164557600080fd5b506102516004803603608081101561165c57600080fd5b810190602081018135600160201b81111561167657600080fd5b82018360208201111561168857600080fd5b803590602001918460018302840111600160201b831117156116a957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505050803515159150602081013590604001356137d1565b34801561170357600080fd5b50610c1361390c565b34801561171857600080fd5b506102516004803603602081101561172f57600080fd5b50356001600160a01b0316613978565b34801561174b57600080fd5b50610c136139d2565b34801561176057600080fd5b506102516004803603604081101561177757600080fd5b50803590602001356001600160a01b03166139e1565b34801561179957600080fd5b5061027d600480360360208110156117b057600080fd5b5035613a4e565b3480156117c357600080fd5b50610409613a60565b3480156117d857600080fd5b50610251600480360360208110156117ef57600080fd5b5035613aee565b6102516004803603604081101561180c57600080fd5b810190602081018135600160201b81111561182657600080fd5b82018360208201111561183857600080fd5b803590602001918460018302840111600160201b8311171561185957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156118ab57600080fd5b8201836020820111156118bd57600080fd5b803590602001918460018302840111600160201b831117156118de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613b0a945050505050565b34801561192b57600080fd5b506102516004803603602081101561194257600080fd5b50356001600160a01b0316613b82565b34801561195e57600080fd5b50610c13613bdc565b34801561197357600080fd5b50610cf56004803603602081101561198a57600080fd5b5035613beb565b34801561199d57600080fd5b50610251600480360360608110156119b457600080fd5b810190602081018135600160201b8111156119ce57600080fd5b8201836020820111156119e057600080fd5b803590602001918460018302840111600160201b83111715611a0157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060200135613c00565b348015611a5357600080fd5b50610c13613c61565b348015611a6857600080fd5b5061027d60048036036020811015611a7f57600080fd5b5035613ca3565b610251600480360360a0811015611a9c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115611ac657600080fd5b820183602082011115611ad857600080fd5b803590602001918460018302840111600160201b83111715611af957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115611b4b57600080fd5b820183602082011115611b5d57600080fd5b803590602001918460018302840111600160201b83111715611b7e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092958435959094909350604081019250602001359050600160201b811115611bd857600080fd5b820183602082011115611bea57600080fd5b803590602001918460018302840111600160201b83111715611c0b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613cb5945050505050565b60106020526000908152604090205481565b600e6020526000908152604090205481565b6001600160a01b038416611c8357600080fd5b6000600d6000611c928661281e565b815260200190815260200160002054905080600014611cd15780341015611cb857600080fd5b600654611cd1906000906001600160a01b031634613d2e565b611ced8585858560405180602001604052806000815250613db4565b5050505050565b60408051808201909152601181527043656c6f5661756c74323032313038313760781b602082015290565b60015460ff16611d2e57600080fd5b8551600214611d3c57600080fd5b600f6000611d498c61281e565b815260200190815260200160002054855114611d6457600080fd5b606485600181518110611d7357fe5b60200260200101511115611d8657600080fd5b60106000611d938c61281e565b815260200190815260200160002054895114611dae57600080fd5b60028b60003060405160200180846001600160a01b031660601b815260140183805460018160011615610100020316600290048015611e245780601f10611e02576101008083540402835291820191611e24565b820191906000526020600020905b815481529060010190602001808311611e10575b5050826001600160a01b031660601b815260140193505050506040516020818303038152906040526040518082805190602001908083835b60208310611e7b5780518252601f199092019160209182019101611e5c565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611eba573d6000803e3d6000fd5b5050506040513d6020811015611ecf57600080fd5b505186518790600090611ede57fe5b602002602001015114611ef057600080fd5b60046000611efd8c61281e565b815260208101919091526040016000205460ff16611f1a57600080fd5b600060028c8c60008d8d8d8d8d8d604051602001808a6001600160a01b031660601b815260140189805190602001908083835b60208310611f6c5780518252601f199092019160209182019101611f4d565b6001836020036101000a03801982511681845116808217855250505050505090500188805460018160011615610100020316600290048015611fe55780601f10611fc3576101008083540402835291820191611fe5565b820191906000526020600020905b815481529060010190602001808311611fd1575b5050875160208901908083835b602083106120115780518252601f199092019160209182019101611ff2565b6001836020036101000a038019825116818451168082178552505050505050905001866001600160a01b031660601b8152601401856001600160a01b031660601b8152601401848051906020019060200280838360005b83811015612080578181015183820152602001612068565b50505050905001838051906020019060200280838360005b838110156120b0578181015183820152602001612098565b5050505090500182805190602001908083835b602083106120e25780518252601f1990920191602091820191016120c3565b6001836020036101000a03801982511681845116808217855250505050505090500199505050505050505050506040516020818303038152906040526040518082805190602001908083835b6020831061214d5780518252601f19909201916020918201910161212e565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561218c573d6000803e3d6000fd5b5050506040513d60208110156121a157600080fd5b505160008181526003602052604090205490915060ff16156121c257600080fd5b6000818152600360205260408120805460ff191660011790556121e782868686614146565b90506121f1613c61565b6001600160a01b031663dc8452cd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561222957600080fd5b505afa15801561223d573d6000803e3d6000fd5b505050506040513d602081101561225357600080fd5b505181101561226157600080fd5b50506001600160a01b03878116600090815260076020526040902054161561231e576001600160a01b03808816600090815260076020526040812054875192169163f3fef3a3918b918991906122b357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561230157600080fd5b505af1158015612315573d6000803e3d6000fd5b5050505061233d565b61233d87898760008151811061233057fe5b6020026020010151613d2e565b6123468861445e565b80156123525750835115155b1561249d57600061237e6001600a548a8960008151811061236f57fe5b6020026020010151898e61446a565b90507f465957fd2b20cfb78984ff970d1d123f6a7487ba1fa0fcd701af2a792efdce54818b8a8860405180851515815260200180602001846001600160a01b0316815260200180602001838103835286818151815260200191508051906020019080838360005b838110156123fd5781810151838201526020016123e5565b50505050905090810190601f16801561242a5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561245d578181015183820152602001612445565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505b7fa866edf1861d39a9973d7892f3869e1bb4b76bc00d216872c1dd2bc547f2da2e8a8a8a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a8a8a604051808060200180602001806020018060200180602001806020018060200188810388528f818151815260200191508051906020019080838360005b83811015612570578181015183820152602001612558565b50505050905090810190601f16801561259d5780820380516001836020036101000a031916815260200191505b5088810387528e818151815260200191508051906020019080838360005b838110156125d35781810151838201526020016125bb565b50505050905090810190601f1680156126005780820380516001836020036101000a031916815260200191505b5088810386528d5181528d516020918201918f019080838360005b8381101561263357818101518382015260200161261b565b50505050905090810190601f1680156126605780820380516001836020036101000a031916815260200191505b5088810385528c5181528c516020918201918e019080838360005b8381101561269357818101518382015260200161267b565b50505050905090810190601f1680156126c05780820380516001836020036101000a031916815260200191505b5088810384528b5181528b51602091820191808e01910280838360005b838110156126f55781810151838201526020016126dd565b5050505090500188810383528a818151815260200191508051906020019060200280838360005b8381101561273457818101518382015260200161271c565b50505050905001888103825289818151815260200191508051906020019080838360005b83811015612770578181015183820152602001612758565b50505050905090810190601f16801561279d5780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390a15050505050505050505050565b60025481565b600c546001600160a01b031633146127e057600080fd5b6001600160a01b0382166127f357600080fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b60006002308360405160200180836001600160a01b031660601b815260140182805190602001908083835b602083106128685780518252601f199092019160209182019101612849565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526040518082805190602001908083835b602083106128cc5780518252601f1990920191602091820191016128ad565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561290b573d6000803e3d6000fd5b5050506040513d602081101561292057600080fd5b505192915050565b805161293357600080fd5b6000600e60006129428761281e565b815260200190815260200160002054905080600014612981578034101561296857600080fd5b600654612981906000906001600160a01b031634613d2e565b61298e8686868686614789565b505050505050565b600c546001600160a01b031633146129ad57600080fd5b6001805460ff1916911515919091179055565b6007602052600090815260409020546001600160a01b031681565b6014015190565b60015460ff1681565b6129f3613c61565b6001600160a01b0316336001600160a01b031614612a1057600080fd5b6001600160a01b038281166000908152600760205260409020541615612a3557600080fd5b60006001600160a01b038316612a4c575047612ac1565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015612a9257600080fd5b505afa158015612aa6573d6000803e3d6000fd5b505050506040513d6020811015612abc57600080fd5b505190505b612acc838383613d2e565b816001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b1257600080fd5b505af1158015612b26573d6000803e3d6000fd5b505050506001600160a01b03928316600090815260076020526040902080546001600160a01b031916929093169190911790915550565b600b6020526000908152604090205460ff1681565b600c546001600160a01b031681565b600a5481565b6000600d6000612b968661281e565b815260200190815260200160002054905080600014612bd55780341015612bbc57600080fd5b600654612bd5906000906001600160a01b031634613d2e565b611ced8585858560405180602001604052806000815250614789565b612bf9613c61565b6001600160a01b0316336001600160a01b031614612c1657600080fd5b8051612c2990600090602084019061515b565b5050565b60085481565b612c3b613c61565b6001600160a01b0316336001600160a01b031614612c5857600080fd5b6001600160a01b0382811660009081526007602052604090205416612c7c57600080fd5b6001600160a01b0380831660009081526007602052604080822054815163429c145b60e11b8152915193169263853828b69260048084019391929182900301818387803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050506001600160a01b03811615612dea5760006001600160a01b038316612d0a575047612d7f565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d6020811015612d7a57600080fd5b505190505b612d8a838383613d2e565b816001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612dd057600080fd5b505af1158015612de4573d6000803e3d6000fd5b50505050505b6001600160a01b03918216600090815260076020526040902080546001600160a01b03191691909216179055565b60055481565b60015460ff16612e2d57600080fd5b8551600214612e3b57600080fd5b600f6000612e488c61281e565b815260200190815260200160002054855114612e6357600080fd5b60106000612e708c61281e565b815260200190815260200160002054895114612e8b57600080fd5b60028b60003060405160200180846001600160a01b031660601b815260140183805460018160011615610100020316600290048015612f015780601f10612edf576101008083540402835291820191612f01565b820191906000526020600020905b815481529060010190602001808311612eed575b5050826001600160a01b031660601b815260140193505050506040516020818303038152906040526040518082805190602001908083835b60208310612f585780518252601f199092019160209182019101612f39565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612f97573d6000803e3d6000fd5b5050506040513d6020811015612fac57600080fd5b505186518790600090612fbb57fe5b602002602001015114612fcd57600080fd5b60046000612fda8c61281e565b815260208101919091526040016000205460ff16612ff757600080fd5b600060028c8c60008d8d8d8d8d8d60405160200180806213919560ea1b8152506003018a6001600160a01b031660601b815260140189805190602001908083835b602083106130575780518252601f199092019160209182019101613038565b6001836020036101000a038019825116818451168082178552505050505050905001888054600181600116156101000203166002900480156130d05780601f106130ae5761010080835404028352918201916130d0565b820191906000526020600020905b8154815290600101906020018083116130bc575b5050875160208901908083835b602083106130fc5780518252601f1990920191602091820191016130dd565b6001836020036101000a038019825116818451168082178552505050505050905001866001600160a01b031660601b8152601401856001600160a01b031660601b8152601401848051906020019060200280838360005b8381101561316b578181015183820152602001613153565b50505050905001838051906020019060200280838360005b8381101561319b578181015183820152602001613183565b5050505090500182805190602001908083835b602083106131cd5780518252601f1990920191602091820191016131ae565b6001836020036101000a03801982511681845116808217855250505050505090500199505050505050505050506040516020818303038152906040526040518082805190602001908083835b602083106132385780518252601f199092019160209182019101613219565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613277573d6000803e3d6000fd5b5050506040513d602081101561328c57600080fd5b505160008181526003602052604090205490915060ff16156132ad57600080fd5b6000818152600360205260408120805460ff191660011790556132d282868686614146565b90506132dc613c61565b6001600160a01b031663dc8452cd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561331457600080fd5b505afa158015613328573d6000803e3d6000fd5b505050506040513d602081101561333e57600080fd5b505181101561334c57600080fd5b5050306001600160a01b0316876001600160a01b0316636352211e8760018151811061337457fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156133b057600080fd5b505afa1580156133c4573d6000803e3d6000fd5b505050506040513d60208110156133da57600080fd5b50516001600160a01b0316146133ef57600080fd5b866001600160a01b03166323b872dd308a8860018151811061340d57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561346b57600080fd5b505af115801561347f573d6000803e3d6000fd5b50505050876001600160a01b0316876001600160a01b0316636352211e876001815181106134a957fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156134e557600080fd5b505afa1580156134f9573d6000803e3d6000fd5b505050506040513d602081101561350f57600080fd5b50516001600160a01b03161461352457600080fd5b61352d8861445e565b80156135395750835115155b156136755760006135566000600a548a8960018151811061236f57fe5b90507f465957fd2b20cfb78984ff970d1d123f6a7487ba1fa0fcd701af2a792efdce54818b8a8860405180851515815260200180602001846001600160a01b0316815260200180602001838103835286818151815260200191508051906020019080838360005b838110156135d55781810151838201526020016135bd565b50505050905090810190601f1680156136025780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561363557818101518382015260200161361d565b50505050905090810190601f1680156136625780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505b7f14e7aff79a50a1d085c0f52db89b51adb553b691263a070b085f2a01ce1aeaec8a8a8a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a60405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528a8a8a604051808060200180602001806020018060200180602001806020018060200188810388528f8181518152602001915080519060200190808383600083811015612570578181015183820152602001612558565b60036020526000908152604090205460ff1681565b805161376757600080fd5b6000600e60006137768661281e565b8152602001908152602001600020549050806000146137b45780341161379b57600080fd5b6006546137b4906000906001600160a01b031683613d2e565b6137cb600085856137c53486614b38565b86613db4565b50505050565b6137d9613c61565b6001600160a01b0316336001600160a01b0316146137f657600080fd5b60006138018561281e565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293945061389893929183018282801561388e5780601f106138635761010080835404028352916020019161388e565b820191906000526020600020905b81548152906001019060200180831161387157829003601f168201915b505050505061281e565b8114156138a457600080fd5b6000818152600460205260409020805460ff191685158015919091179091556138ea576000818152601060209081526040808320869055600f9091529020829055611ced565b6000908152601060209081526040808320839055600f90915281205550505050565b6000306001600160a01b0316636e9960c36040518163ffffffff1660e01b815260040160206040518083038186803b15801561394757600080fd5b505afa15801561395b573d6000803e3d6000fd5b505050506040513d602081101561397157600080fd5b5051905090565b613980613c61565b6001600160a01b0316336001600160a01b03161461399d57600080fd5b6001600160a01b0381166139b057600080fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031681565b6139e9613c61565b6001600160a01b0316336001600160a01b031614613a0657600080fd5b6127108210613a1457600080fd5b6001600160a01b038116613a2757600080fd5b600891909155600980546001600160a01b0319166001600160a01b03909216919091179055565b600d6020526000908152604090205481565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015613ae65780601f10613abb57610100808354040283529160200191613ae6565b820191906000526020600020905b815481529060010190602001808311613ac957829003601f168201915b505050505081565b600c546001600160a01b03163314613b0557600080fd5b600a55565b6000600d6000613b198561281e565b815260200190815260200160002054905080600014613b5757803411613b3e57600080fd5b600654613b57906000906001600160a01b031683613d2e565b613b7d60008484613b683486614b38565b60405180602001604052806000815250613db4565b505050565b613b8a613c61565b6001600160a01b0316336001600160a01b031614613ba757600080fd5b6001600160a01b038116613bba57600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031681565b60046020526000908152604090205460ff1681565b600c546001600160a01b03163314613c1757600080fd5b6000613c228461281e565b60008181526004602052604090205490915060ff16613c4057600080fd5b6000908152600d6020908152604080832094909455600e9052919091205550565b6000613c6b61390c565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561394757600080fd5b600f6020526000908152604090205481565b6001600160a01b038516613cc857600080fd5b8051613cd357600080fd5b6000600e6000613ce28761281e565b815260200190815260200160002054905080600014613d215780341015613d0857600080fd5b600654613d21906000906001600160a01b031634613d2e565b61298e8686868686613db4565b6001600160a01b038316613da0576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114613d87576040519150601f19603f3d011682016040523d82523d6000602084013e613d8c565b606091505b5050905080613d9a57600080fd5b50613b7d565b613b7d6001600160a01b0384168383614b9a565b60015460ff16613dc357600080fd5b60046000613dd08661281e565b815260208101919091526040016000205460ff16613ded57600080fd5b81613df757600080fd5b6001600160a01b0385166000908152600b602052604090205460ff1615613e1d57600080fd5b60006001600160a01b038616613e3557506012613eb2565b613e4a6001600160a01b038716333086614bec565b856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613e8357600080fd5b505afa158015613e97573d6000803e3d6000fd5b505050506040513d6020811015613ead57600080fd5b505190505b60008160ff1611613ec257600080fd5b6001600160a01b03808716600090815260076020526040902054168015613f4d57613eee878286613d2e565b806001600160a01b031663b6b55f25856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613f3457600080fd5b505af1158015613f48573d6000803e3d6000fd5b505050505b6000600854118015613f6957506009546001600160a01b031615155b15613f8b576000613f7b888685614c46565b9050613f878582614b38565b9450505b6002546001016002819055507fa6103c513fe87f7876c848403a612d7790465e2531fed80df0c74dae035ce8808633878a86896002548a6040518080602001896001600160a01b0316815260200180602001886001600160a01b031681526020018760ff1681526020018681526020018581526020018060200184810384528c818151815260200191508051906020019080838360005b8381101561403a578181015183820152602001614022565b50505050905090810190601f1680156140675780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b8381101561409a578181015183820152602001614082565b50505050905090810190601f1680156140c75780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b838110156140fa5781810151838201526020016140e2565b50505050905090810190601f1680156141275780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a150505050505050565b60008080614152613c61565b90506060816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561418f57600080fd5b505afa1580156141a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156141cc57600080fd5b8101908080516040519392919084600160201b8211156141eb57600080fd5b90830190602082018581111561420057600080fd5b82518660208202830111600160201b8211171561421c57600080fd5b82525081516020918201928201910280838360005b83811015614249578181015183820152602001614231565b505050509050016040525050505167ffffffffffffffff8111801561426d57600080fd5b50604051908082528060200260200182016040528015614297578160200160208202803683370190505b5090506000805b885182101561445057600060018b8b85815181106142b857fe5b60200260200101518b86815181106142cc57fe5b60200260200101518b87815181106142e057fe5b602002602001015160405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561433c573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316632f54bf6e826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561439557600080fd5b505afa1580156143a9573d6000803e3d6000fd5b505050506040513d60208110156143bf57600080fd5b50511561444457600091505b8582101561441057806001600160a01b03168483815181106143e957fe5b60200260200101516001600160a01b0316141561440557600080fd5b6001909101906143cb565b8084878151811061441d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001860195505b5060019091019061429e565b509298975050505050505050565b3b63ffffffff16151590565b60008060608089156145335787878760405160240180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156144ce5781810151838201526020016144b6565b50505050905090810190601f1680156144fb5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166383c40a1960e01b17905296506145eb945050505050565b87878760405160240180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561458b578181015183820152602001614573565b50505050905090810190601f1680156145b85780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166303266d8b60e01b179052965050505050505b881561469f57846001600160a01b031689836040518082805190602001908083835b6020831061462c5780518252601f19909201916020918201910161460d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d806000811461468f576040519150601f19603f3d011682016040523d82523d6000602084013e614694565b606091505b509093509050614747565b846001600160a01b0316826040518082805190602001908083835b602083106146d95780518252601f1990920191602091820191016146ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461473b576040519150601f19603f3d011682016040523d82523d6000602084013e614740565b606091505b5090935090505b82614758576000935050505061477f565b600081806020019051602081101561476f57600080fd5b50511515945061477f9350505050565b9695505050505050565b60015460ff1661479857600080fd5b600460006147a58661281e565b815260208101919091526040016000205460ff166147c257600080fd5b6001600160a01b0385166147d557600080fd5b6001600160a01b0385166000908152600b602052604090205460ff16156147fb57600080fd5b336001600160a01b0316856001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561484957600080fd5b505afa15801561485d573d6000803e3d6000fd5b505050506040513d602081101561487357600080fd5b50516001600160a01b03161461488857600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038716916323b872dd91606480830192600092919082900301818387803b1580156148dc57600080fd5b505af11580156148f0573d6000803e3d6000fd5b50505050306001600160a01b0316856001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561494257600080fd5b505afa158015614956573d6000803e3d6000fd5b505050506040513d602081101561496c57600080fd5b50516001600160a01b03161461498157600080fd5b6002546001016002819055507f62e144fddae381faa80edcfe1a92bcb629695714557217064b483e69360cf5a284338588866001600254886040518080602001896001600160a01b0316815260200180602001886001600160a01b031681526020018781526020018681526020018581526020018060200184810384528c818151815260200191508051906020019080838360005b83811015614a2e578181015183820152602001614a16565b50505050905090810190601f168015614a5b5780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b83811015614a8e578181015183820152602001614a76565b50505050905090810190601f168015614abb5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015614aee578181015183820152602001614ad6565b50505050905090810190601f168015614b1b5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a15050505050565b600082821115614b8f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613b7d908490614dcd565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526137cb908590614dcd565b6000614c69612710614c6360085486614e7e90919063ffffffff16565b90614ed7565b90508015614dc6576002546001016002819055507fa6103c513fe87f7876c848403a612d7790465e2531fed80df0c74dae035ce88033600960009054906101000a90046001600160a01b031660405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528685856002546040518080602001886001600160a01b0316815260200180602001876001600160a01b031681526020018660ff16815260200185815260200184815260200180602001848103845260058152602001806413d490925560da1b815250602001848103835289818151815260200191508051906020019080838360005b83811015614d7a578181015183820152602001614d62565b50505050905090810190601f168015614da75780820380516001836020036101000a031916815260200191505b5093840390525050600081526040805191829003019650945050505050a15b9392505050565b6060614e22826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f3e9092919063ffffffff16565b805190915015613b7d57808060200190516020811015614e4157600080fd5b5051613b7d5760405162461bcd60e51b815260040180806020018281038252602a815260200180615236602a913960400191505060405180910390fd5b600082614e8d57506000614b94565b82820282848281614e9a57fe5b0414614dc65760405162461bcd60e51b81526004018080602001828103825260218152602001806152156021913960400191505060405180910390fd5b6000808211614f2d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381614f3657fe5b049392505050565b6060614f4d8484600085614f55565b949350505050565b606082471015614f965760405162461bcd60e51b81526004018080602001828103825260268152602001806151ef6026913960400191505060405180910390fd5b614f9f856150b1565b614ff0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061502f5780518252601f199092019160209182019101615010565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615091576040519150601f19603f3d011682016040523d82523d6000602084013e615096565b606091505b50915091506150a68282866150b7565b979650505050505050565b3b151590565b606083156150c6575081614dc6565b8251156150d65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615120578181015183820152602001615108565b50505050905090810190601f16801561514d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061519c57805160ff19168380011785556151c9565b828001600101855582156151c9579182015b828111156151c95782518255916020019190600101906151ae565b506151d59291506151d9565b5090565b5b808211156151d557600081556001016151da56fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220635168011699b306776aba1c5b015d5fcf58b2b185448dc2d820c12280f1c5ce64736f6c634300060c0033