ETH Price: $2,670.06 (+1.08%)

Contract

0xb03CA9354241688264d7f4547857190B75e26944
 

Overview

ETH Balance

0.059127901441775837 ETH

Eth Value

$157.87 (@ $2,670.06/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Transfers Fr...205784422024-08-21 17:19:1140 hrs ago1724260751IN
CheckDot : Bridge
0 ETH0.000222872.86815485
Add Transfers Fr...205578122024-08-18 20:10:234 days ago1724011823IN
CheckDot : Bridge
0 ETH0.000086251.1100205
Add Transfers Fr...205298422024-08-14 22:26:118 days ago1723674371IN
CheckDot : Bridge
0 ETH0.00014541.871533
Init Transfer205025582024-08-11 3:02:2312 days ago1723345343IN
CheckDot : Bridge
0.00384997 ETH0.001385823.31504352
Init Transfer204781772024-08-07 17:25:5915 days ago1723051559IN
CheckDot : Bridge
0.00441775 ETH0.006920516.55552263
Init Transfer204722952024-08-06 21:44:2316 days ago1722980663IN
CheckDot : Bridge
0.0042184 ETH0.000783471.89597407
Init Transfer204662432024-08-06 1:27:4717 days ago1722907667IN
CheckDot : Bridge
0.00414118 ETH0.002460635.95464003
Add Transfers Fr...204624632024-08-05 12:48:1117 days ago1722862091IN
CheckDot : Bridge
0 ETH0.0034235644.05786648
Init Transfer204578702024-08-04 21:26:1118 days ago1722806771IN
CheckDot : Bridge
0.00364786 ETH0.001668073.99043746
Add Transfers Fr...204012832024-07-27 23:52:1126 days ago1722124331IN
CheckDot : Bridge
0 ETH0.00010511.35276172
Init Transfer203827252024-07-25 9:39:4729 days ago1721900387IN
CheckDot : Bridge
0.00330598 ETH0.0015283.65535045
Init Transfer203790352024-07-24 21:18:1129 days ago1721855891IN
CheckDot : Bridge
0.00314472 ETH0.002797746.77063088
Init Transfer203639852024-07-22 18:53:4731 days ago1721674427IN
CheckDot : Bridge
0.00288277 ETH0.003072237.34953365
Init Transfer203637452024-07-22 18:05:2331 days ago1721671523IN
CheckDot : Bridge
0.00288476 ETH0.000400796.71635872
Add Transfers Fr...203636202024-07-22 17:40:1131 days ago1721670011IN
CheckDot : Bridge
0 ETH0.000440475.66845301
Add Transfers Fr...203357552024-07-18 20:20:1135 days ago1721334011IN
CheckDot : Bridge
0 ETH0.0011866511.87828009
Add Transfers Fr...203248332024-07-17 7:44:1137 days ago1721202251IN
CheckDot : Bridge
0 ETH0.000547877.05170331
Add Transfers Fr...203150052024-07-15 22:51:1138 days ago1721083871IN
CheckDot : Bridge
0 ETH0.0009752212.55218564
Add Transfers Fr...203082912024-07-15 0:21:1139 days ago1721002871IN
CheckDot : Bridge
0 ETH0.000218342.18563521
Add Transfers Fr...202932572024-07-12 21:57:2341 days ago1720821443IN
CheckDot : Bridge
0 ETH0.000190882.45652217
Init Transfer202693752024-07-09 13:57:2344 days ago1720533443IN
CheckDot : Bridge
0.00329902 ETH0.002717256.49995981
Add Transfers Fr...202370312024-07-05 1:30:1149 days ago1720143011IN
CheckDot : Bridge
0 ETH0.000801398.02185465
Init Transfer202316942024-07-04 7:35:4750 days ago1720078547IN
CheckDot : Bridge
0.00328549 ETH0.001966274.70380383
Add Transfers Fr...202133642024-07-01 18:09:1152 days ago1719857351IN
CheckDot : Bridge
0 ETH0.001049613.50741532
Add Transfers Fr...201870292024-06-28 1:54:1156 days ago1719539651IN
CheckDot : Bridge
0 ETH0.000366154.71207566
View all transactions

Latest 10 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
199510692024-05-26 2:28:3589 days ago1716690515
CheckDot : Bridge
0.08787072 ETH
194300092024-03-14 1:31:35162 days ago1710379895
CheckDot : Bridge
0.11208799 ETH
192087772024-02-12 1:49:11193 days ago1707702551
CheckDot : Bridge
0.11981671 ETH
189762812024-01-10 11:34:23225 days ago1704886463
CheckDot : Bridge
0.18453931 ETH
188418802023-12-22 14:08:23244 days ago1703254103
CheckDot : Bridge
0.12937655 ETH
187425942023-12-08 16:00:35258 days ago1702051235
CheckDot : Bridge
0.21999388 ETH
183579012023-10-15 19:35:35312 days ago1697398535
CheckDot : Bridge
0.16954302 ETH
181098942023-09-11 1:40:11347 days ago1694396411
CheckDot : Bridge
0.54459386 ETH
171060872023-04-23 2:36:59488 days ago1682217419
CheckDot : Bridge
0.39942404 ETH
168642972023-03-19 21:01:59522 days ago1679259719
CheckDot : Bridge
0.5 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EVMBridge

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : EVMBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./interfaces/IERC20.sol";
import "./utils/TransferHelper.sol";
import "./libs/SafeMath.sol";
import "./libs/SignedSafeMath.sol";

struct Transfer {
    bytes32 hash;
    address from;
    address coin;
    uint256 quantity;
    string  fromChain;
    string  toChain;
    uint256 feesInCDT;
    uint256 feesInETH;
    uint256 blockTimestamp;
    uint256 blockNumber;
    string  data;
}

struct Bridge {
    address addr;
    string chain;
}

struct Validator {
    address addr;
    uint256 warrantyAmount;
    uint256 totalLossAmount;
}

/**
 * @title EVMBridge
 * @author Jeremy Guyet (@jguyet)
 * @dev 
 * Smart Contract for manage the transfers between two blockchains
 * who respect the Ethereum Virtual Machine normal. This Smart contract
 * contains the list of the chains accepted and list all transactions initialized
 * with their hash proof from the destination chain. this smart contract is decentralized
 * but managed by one wallet address (The owner wallet of the CheckDot project).
 * This contract is managed by API in Nodejs and we wait 100 block before transfer anything.
 */
contract EVMBridge {

    using SafeMath for uint256;
    using SignedSafeMath for int256;

    address public token;
    address public owner;
    address public program;
    string  public chain;

    uint256 public feesInDollar;
    uint256 public feesInCDTPercentage;
    uint256 public minimumTransferQuantity;

    uint256 public bridgeFeesInCDT;
    uint256 public lockedQuantity;
    
    uint256 private blocksLength;
    mapping(bytes32 => uint256) private transfersIndexs;
    Transfer[] private transfers;
    mapping(bytes32 => bytes32) private transfersHashs;

    // Private dex information
    address private dex_in;
    address private dex_out;
    address private dex_pool;

    bool internal paused;
    bool internal locked;

    constructor(
        string memory _bridgeChain,
        address _token,
        uint256 _feesInDollar,
        uint256 _feesInCDTPercentage,
        address _dex_in,
        address _dex_out,
        address _dex_pool) {
        require(msg.sender != address(0), "ABORT sender - address(0)");
        token = _token;
        owner = msg.sender;
        program = msg.sender;
        chain = _bridgeChain;
        feesInDollar = _feesInDollar;
        feesInCDTPercentage = _feesInCDTPercentage;
        dex_in = _dex_in;
        dex_out = _dex_out;
        dex_pool = _dex_pool;
        minimumTransferQuantity = 1 ether;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can do this action");
        _;
    }

    modifier onlyProgramOrOwner() {
        require(msg.sender == program || msg.sender == owner, "Only program or Owner");
        _;
    }

    modifier activated() {
        require(paused == false, "Bridge actually paused");
        _;
    }

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }

    function getFeesInDollar() public view returns (uint256) {
        return feesInDollar;
    }

    function setFeesInDollar(uint256 cost) public onlyOwner {
        feesInDollar = cost;
    }

    function getFeesInETH() public view returns (uint256) {
        uint256 oneDollar = getTokenPriceOutFromPoolBalance(dex_in, dex_out, dex_pool);
        return oneDollar.mul(1 ether).div(feesInDollar).mul(100); // multiplication 1 ether pour decaler les decimals.
    }

    function getFeesInCDTByQuantity(uint256 quantity) public view returns (uint256) {
        if (feesInCDTPercentage == 0) {
            return 0;
        }
        uint256 transferFees = quantity.div(100).mul(feesInCDTPercentage);
        return transferFees;
    }

    function setFeesInCDTPercentage(uint256 feesInPercentage) public onlyOwner {
        feesInCDTPercentage = feesInPercentage;
    }
    
    function initTransfer(uint256 quantity, string calldata toChain, string calldata data) public payable noReentrant activated {
        require(msg.value >= getFeesInETH(),
            "PAYMENT_ABORT"
        );
        require(quantity >= minimumTransferQuantity,
            "INSUFISANT_QUANTITY"
        );
        require(IERC20(token).balanceOf(msg.sender) >= quantity, "INSUFISANT_BALANCE");
        require(IERC20(token).allowance(msg.sender, address(this)) >= quantity, "INSUFISANT_ALLOWANCE");
        TransferHelper.safeTransferFrom(token, msg.sender, address(this), quantity);
        
        uint256 transferFeesInCDT = getFeesInCDTByQuantity(quantity);
        uint256 transferQuantity = quantity.sub(transferFeesInCDT);
        uint256 transferETHFees = msg.value;

        bridgeFeesInCDT += transferFeesInCDT;
        uint256 index = transfers.length;
        bytes32 transferHash = _getHash(block.timestamp, 0, msg.sender);

        transfers.push(Transfer(
            transferHash,
            msg.sender,
            token,
            transferQuantity,
            chain,
            toChain,
            transferFeesInCDT,
            transferETHFees,
            block.timestamp,
            block.number,
            data
        ));
        transfersIndexs[transferHash] = index;
        transfersHashs[transferHash] = transferHash;
        lockedQuantity = lockedQuantity.add(transferQuantity);
    }

    function transferExists(bytes32 transferHash) public view returns (bool) {
        return transfersHashs[transferHash] == transferHash;
    }

    function getTransfer(bytes32 transferHash) public view returns (Transfer memory) {
        return transfers[transfersIndexs[transferHash]];
    }

    function getTransferLength() public view returns (uint256) {
        return transfers.length;
    }

    function getTransfers(int256 page, int256 pageSize) external view returns (Transfer[] memory) {
        uint256 poolLength = transfers.length;
        int256 queryStartPoolIndex = int256(poolLength).sub(pageSize.mul(page.add(1))).add(pageSize);
        require(queryStartPoolIndex >= 0, "Out of bounds");
        int256 queryEndPoolIndex = queryStartPoolIndex.sub(pageSize);
        if (queryEndPoolIndex < 0) {
            queryEndPoolIndex = 0;
        }
        int256 currentPoolIndex = queryStartPoolIndex;
        require(uint256(currentPoolIndex) <= poolLength, "Out of bounds");
        Transfer[] memory results = new Transfer[](uint256(currentPoolIndex - queryEndPoolIndex));
        uint256 index = 0;

        for (currentPoolIndex; currentPoolIndex > queryEndPoolIndex; currentPoolIndex--) {
            Transfer memory transfer = transfers[uint256(currentPoolIndex).sub(1)];
            results[index] = transfer;
            index++;
        }
        return results;
    }

    function addLockQuantity(uint256 quantity) public onlyOwner {
        lockedQuantity = lockedQuantity.add(quantity);
    }

    function subLockQuantity(uint256 quantity) public onlyOwner {
       lockedQuantity = lockedQuantity.sub(quantity);
    }

    function collectCDTFees() public onlyOwner {
        require(IERC20(token).balanceOf(address(this)) >= bridgeFeesInCDT, "INSUFISANT_BALANCE");
        TransferHelper.safeTransfer(token, msg.sender, bridgeFeesInCDT);
        bridgeFeesInCDT = 0;
    }

    function deposit(address coin, uint256 quantity) public onlyOwner noReentrant {
        require(IERC20(coin).balanceOf(msg.sender) >= quantity, "INSUFISANT_BALANCE");
        require(IERC20(coin).allowance(msg.sender, address(this)) >= quantity, "INSUFISANT_ALLOWANCE");
        TransferHelper.safeTransferFrom(coin, msg.sender, address(this), quantity);
    }

    function balance() public view returns (uint256){
        return payable(address(this)).balance;
    }

    function depositETH(uint256 quantity) public payable onlyOwner noReentrant {
        require(msg.value >= quantity,
            "PAYMENT_ABORT"
        );
    }

    function withdraw(address coin, uint256 quantity) public onlyOwner noReentrant {
        require(IERC20(coin).balanceOf(address(this)) >= quantity, "INSUFISANT_BALANCE");
        TransferHelper.safeTransfer(coin, msg.sender, quantity);
    }

    function withdrawUnlocked() public onlyOwner noReentrant {
        uint256 balanceOfToken = IERC20(token).balanceOf(address(this));

        require(balanceOfToken >= lockedQuantity, "INSUFISANT_BALANCE");
        TransferHelper.safeTransfer(token, msg.sender, balanceOfToken - lockedQuantity);
    }

    function withdrawETH(uint quantity) public onlyOwner noReentrant {
        require(quantity <= balance(), "Insufficient balance");
        (bool success,)=owner.call{value:quantity}("");
        require(success, "Transfer failed!");
    }

    function emergencyWithdrawAll() external onlyOwner noReentrant {
        (bool success,)= owner.call{value:address(this).balance}("");
        require(success,"Transfer failed!");
    }

    function getLastsTransfers(uint256 size) external view returns (Transfer[] memory) {
        uint256 poolLength = transfers.length;
        uint256 start = 0;
        uint256 memorySize = size;

        if (transfers.length > size) {
            start = transfers.length.sub(size);
        } else {
            memorySize = transfers.length;
        }
        uint256 currentIndex = start;
        Transfer[] memory results = new Transfer[](memorySize);
        uint256 memoryIndex = 0;

        for (currentIndex; currentIndex < poolLength; currentIndex++) {
            Transfer memory transfer = transfers[currentIndex];
            results[memoryIndex++] = transfer;
        }
        return results;
    }

    function addTransfersFrom(string[] memory /* fromChains */, address[] memory transfersAddresses, uint256[] memory amounts, bytes32[] memory _transfersHashs) public onlyProgramOrOwner {
        for (uint256 i = 0; i < transfersAddresses.length; i++) {
            address transferAddress = transfersAddresses[i];
            uint256 amount = amounts[i];
            bytes32 transferHash = _transfersHashs[i];

            require(transfersHashs[transferHash] == 0, "Already transfered");
            TransferHelper.safeTransfer(token, transferAddress, amount);
            transfersHashs[transferHash] = transferHash;
        }
    }

    function getDex() public view returns (address, address, address) {
        return (dex_in, dex_out, dex_pool);
    }

    /**
     * Only 18 decimals tokens.
     */
    function setDex(address _in, address _out, address _pool) public onlyOwner {
        dex_in = _in;
        dex_out = _out;
        dex_pool = _pool;
    }

    function getTokenPriceOutFromPoolBalance(address _in, address _out, address _pool) public view returns (uint256) {
        uint256 balanceIn = IERC20(_in).balanceOf(_pool);
        uint256 balanceOut = IERC20(_out).balanceOf(_pool);
        require(balanceOut > 0);
        return balanceIn.mul(1 ether).div(balanceOut);
        // ex: in=USDC,out=ETH = price of ETH in USDC
        // ex: in=ETH,out=USDC = price of USDC in ETH
    }

    function updateTransferCost(uint256 _feesInDollar) public onlyOwner {
        feesInDollar = _feesInDollar;
    }

    function isPaused() public view returns (bool) {
        return paused;
    }

    function setPaused(bool p) public onlyOwner {
        paused = p;
    }

    function setMinimumTransferQuantity(uint256 quantity) public onlyOwner {
        minimumTransferQuantity = quantity;
    }

    function changeOwner(address newOwner) public onlyOwner {
        require(newOwner != address(0), "No zero address");
        owner = newOwner;
    }

    function changeProgram(address newProgram) public onlyOwner {
        require(newProgram != address(0), "No zero address");
        program = newProgram;
    }

    function _getHash(uint256 timestamp, uint256 nonce, address addr) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(timestamp, addr, nonce));
    }
}

File 2 of 5 : TransferHelper.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }
}

File 3 of 5 : SignedSafeMath.sol
// SPDX-License-Identifier: MIT

/**
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠙⠻⢶⣄⡀⠀⠀⠀⢀⣤⠶⠛⠛⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣇⠀⠀⣙⣿⣦⣤⣴⣿⣁⠀⠀⣸⠇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣡⣾⣿⣿⣿⣿⣿⣿⣿⣷⣌⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣷⣄⡈⢻⣿⡟⢁⣠⣾⣿⣦
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⠘⣿⠃⣿⣿⣿⣿⡏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠈⠛⣰⠿⣆⠛⠁⠀⡀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣦⠀⠘⠛⠋⠀⣴⣿⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣿⣿⣿⡇⠀⠀⠀⢸⣿⣏⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠀⠀⠀⠾⢿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⡿⠟⠋⣁⣠⣤⣤⡶⠶⠶⣤⣄⠈⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢰⣿⣿⣮⣉⣉⣉⣤⣴⣶⣿⣿⣋⡥⠄⠀⠀⠀⠀⠉⢻⣄⠀⠀⠀⠀⠀
⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣋⣁⣤⣀⣀⣤⣤⣤⣤⣄⣿⡄⠀⠀⠀⠀
⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠁⠀⠀⠀⠀⠈⠛⠃⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/

//🦊 Made with ❤ by the devs at Kitso Mintu 🦊

// OpenZeppelin Contracts v4.4.1 (utils/math/SignedSafeMath.sol)
pragma solidity ^0.8.0;

library SignedSafeMath {
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }
    function div(int256 a, int256 b) internal pure returns (int256) {
        return a / b;
    }
    function sub(int256 a, int256 b) internal pure returns (int256) {
        return a - b;
    }
    function add(int256 a, int256 b) internal pure returns (int256) {
        return a + b;
    }
}

File 4 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

/**
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠙⠻⢶⣄⡀⠀⠀⠀⢀⣤⠶⠛⠛⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣇⠀⠀⣙⣿⣦⣤⣴⣿⣁⠀⠀⣸⠇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣡⣾⣿⣿⣿⣿⣿⣿⣿⣷⣌⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣷⣄⡈⢻⣿⡟⢁⣠⣾⣿⣦
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⠘⣿⠃⣿⣿⣿⣿⡏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠈⠛⣰⠿⣆⠛⠁⠀⡀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣦⠀⠘⠛⠋⠀⣴⣿⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣿⣿⣿⡇⠀⠀⠀⢸⣿⣏⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠀⠀⠀⠾⢿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⡿⠟⠋⣁⣠⣤⣤⡶⠶⠶⣤⣄⠈⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢰⣿⣿⣮⣉⣉⣉⣤⣴⣶⣿⣿⣋⡥⠄⠀⠀⠀⠀⠉⢻⣄⠀⠀⠀⠀⠀
⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣋⣁⣤⣀⣀⣤⣤⣤⣤⣄⣿⡄⠀⠀⠀⠀
⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠁⠀⠀⠀⠀⠈⠛⠃⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/

//🦊 Made with ❤ by the devs at Kitsu Mintu 🦊

pragma solidity ^0.8.0;
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 5 of 5 : IERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    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);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "london",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_bridgeChain","type":"string"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_feesInDollar","type":"uint256"},{"internalType":"uint256","name":"_feesInCDTPercentage","type":"uint256"},{"internalType":"address","name":"_dex_in","type":"address"},{"internalType":"address","name":"_dex_out","type":"address"},{"internalType":"address","name":"_dex_pool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"addLockQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"address[]","name":"transfersAddresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes32[]","name":"_transfersHashs","type":"bytes32[]"}],"name":"addTransfersFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeFeesInCDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chain","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProgram","type":"address"}],"name":"changeProgram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectCDTFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"emergencyWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesInCDTPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesInDollar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getFeesInCDTByQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeesInDollar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeesInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"name":"getLastsTransfers","outputs":[{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"fromChain","type":"string"},{"internalType":"string","name":"toChain","type":"string"},{"internalType":"uint256","name":"feesInCDT","type":"uint256"},{"internalType":"uint256","name":"feesInETH","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Transfer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_in","type":"address"},{"internalType":"address","name":"_out","type":"address"},{"internalType":"address","name":"_pool","type":"address"}],"name":"getTokenPriceOutFromPoolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferHash","type":"bytes32"}],"name":"getTransfer","outputs":[{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"fromChain","type":"string"},{"internalType":"string","name":"toChain","type":"string"},{"internalType":"uint256","name":"feesInCDT","type":"uint256"},{"internalType":"uint256","name":"feesInETH","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Transfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"page","type":"int256"},{"internalType":"int256","name":"pageSize","type":"int256"}],"name":"getTransfers","outputs":[{"components":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"fromChain","type":"string"},{"internalType":"string","name":"toChain","type":"string"},{"internalType":"uint256","name":"feesInCDT","type":"uint256"},{"internalType":"uint256","name":"feesInETH","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Transfer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"toChain","type":"string"},{"internalType":"string","name":"data","type":"string"}],"name":"initTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTransferQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"program","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_in","type":"address"},{"internalType":"address","name":"_out","type":"address"},{"internalType":"address","name":"_pool","type":"address"}],"name":"setDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feesInPercentage","type":"uint256"}],"name":"setFeesInCDTPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"setFeesInDollar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMinimumTransferQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"p","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"subLockQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transferHash","type":"bytes32"}],"name":"transferExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feesInDollar","type":"uint256"}],"name":"updateTransferCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawUnlocked","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005fc138038062005fc183398181016040528101906200003791906200055f565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620000aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a19062000692565b60405180910390fd5b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600390805190602001906200018492919062000272565b50846004819055508360058190555082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a76400006006819055505050505050505062000719565b8280546200028090620006e3565b90600052602060002090601f016020900481019282620002a45760008555620002f0565b82601f10620002bf57805160ff1916838001178555620002f0565b82800160010185558215620002f0579182015b82811115620002ef578251825591602001919060010190620002d2565b5b509050620002ff919062000303565b5090565b5b808211156200031e57600081600090555060010162000304565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200038b8262000340565b810181811067ffffffffffffffff82111715620003ad57620003ac62000351565b5b80604052505050565b6000620003c262000322565b9050620003d0828262000380565b919050565b600067ffffffffffffffff821115620003f357620003f262000351565b5b620003fe8262000340565b9050602081019050919050565b60005b838110156200042b5780820151818401526020810190506200040e565b838111156200043b576000848401525b50505050565b6000620004586200045284620003d5565b620003b6565b9050828152602081018484840111156200047757620004766200033b565b5b620004848482856200040b565b509392505050565b600082601f830112620004a457620004a362000336565b5b8151620004b684826020860162000441565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004ec82620004bf565b9050919050565b620004fe81620004df565b81146200050a57600080fd5b50565b6000815190506200051e81620004f3565b92915050565b6000819050919050565b620005398162000524565b81146200054557600080fd5b50565b60008151905062000559816200052e565b92915050565b600080600080600080600060e0888a0312156200058157620005806200032c565b5b600088015167ffffffffffffffff811115620005a257620005a162000331565b5b620005b08a828b016200048c565b9750506020620005c38a828b016200050d565b9650506040620005d68a828b0162000548565b9550506060620005e98a828b0162000548565b9450506080620005fc8a828b016200050d565b93505060a06200060f8a828b016200050d565b92505060c0620006228a828b016200050d565b91505092959891949750929550565b600082825260208201905092915050565b7f41424f52542073656e646572202d206164647265737328302900000000000000600082015250565b60006200067a60198362000631565b9150620006878262000642565b602082019050919050565b60006020820190508181036000830152620006ad816200066b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006fc57607f821691505b60208210811415620007135762000712620006b4565b5b50919050565b61589880620007296000396000f3fe60806040526004361061023b5760003560e01c806381d1f9dc1161012e578063c763e5a1116100ab578063dd1917191161006f578063dd19171914610831578063f14210a614610848578063f3fef3a314610871578063f8228f7b1461089a578063fc0c546a146108c55761023b565b8063c763e5a114610748578063c860ebc614610773578063cdca09471461079e578063d55748ea146107c9578063db18ba7d146108065761023b565b8063a6f9dae1116100f2578063a6f9dae114610684578063a7a2b3c5146106ad578063b187bd26146106d6578063b69ef8a814610701578063c2c68e001461072c5761023b565b806381d1f9dc1461059d57806382149b39146105c85780638da5cb5b146105f3578063946c6a921461061e578063a5d531041461065b5761023b565b80633e035383116101bc5780635358fbda116101805780635358fbda146105015780635829d9441461051d578063649c6c56146105345780636fcd112b1461055d57806375045691146105745761023b565b80633e0353831461041e578063419f75fe1461044957806341b313881461047257806342ae278c1461049b57806347e7ef24146104d85761023b565b80632bda82aa116102035780632bda82aa14610327578063320c0a5f1461036457806336f3f96f1461038d5780633be46cd6146103b85780633d9534b7146103e15761023b565b806316c38b3c1461024057806318fdc2c814610269578063191622ff146102925780631d774838146102bf578063260958a5146102ea575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613d09565b6108f0565b005b34801561027557600080fd5b50610290600480360381019061028b9190613d6c565b61099d565b005b34801561029e57600080fd5b506102a7610a37565b6040516102b693929190613dda565b60405180910390f35b3480156102cb57600080fd5b506102d4610ab0565b6040516102e19190613e20565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613e71565b610ab6565b60405161031e9190614061565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613d6c565b610da4565b60405161035b9190613e20565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613d6c565b610def565b005b34801561039957600080fd5b506103a2610e9d565b6040516103af9190613e20565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613d6c565b610eaa565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613e71565b610f58565b6040516104159190614092565b60405180910390f35b34801561042a57600080fd5b50610433610f77565b6040516104409190613e20565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190613d6c565b610f7d565b005b34801561047e57600080fd5b506104996004803603810190610494919061453d565b611017565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190614614565b611220565b6040516104cf9190613e20565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190614667565b611380565b005b61051b60048036038101906105169190613d6c565b61163e565b005b34801561052957600080fd5b5061053261179a565b005b34801561054057600080fd5b5061055b60048036038101906105569190613d6c565b61194e565b005b34801561056957600080fd5b506105726119e8565b005b34801561058057600080fd5b5061059b60048036038101906105969190614614565b611c2c565b005b3480156105a957600080fd5b506105b2611d84565b6040516105bf9190613e20565b60405180910390f35b3480156105d457600080fd5b506105dd611e42565b6040516105ea9190613e20565b60405180910390f35b3480156105ff57600080fd5b50610608611e48565b60405161061591906146a7565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906146f8565b611e6e565b60405161065291906148f7565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190614919565b61231a565b005b34801561069057600080fd5b506106ab60048036038101906106a69190614919565b61245e565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613d6c565b6125a2565b005b3480156106e257600080fd5b506106eb61263c565b6040516106f89190614092565b60405180910390f35b34801561070d57600080fd5b50610716612653565b6040516107239190613e20565b60405180910390f35b610746600480360381019061074191906149a1565b612672565b005b34801561075457600080fd5b5061075d612d8f565b60405161076a9190614a80565b60405180910390f35b34801561077f57600080fd5b50610788612e1d565b60405161079591906146a7565b60405180910390f35b3480156107aa57600080fd5b506107b3612e43565b6040516107c09190613e20565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613d6c565b612e49565b6040516107fd91906148f7565b60405180910390f35b34801561081257600080fd5b5061081b613215565b6040516108289190613e20565b60405180910390f35b34801561083d57600080fd5b5061084661321f565b005b34801561085457600080fd5b5061086f600480360381019061086a9190613d6c565b613406565b005b34801561087d57600080fd5b5061089860048036038101906108939190614667565b613638565b005b3480156108a657600080fd5b506108af613828565b6040516108bc9190613e20565b60405180910390f35b3480156108d157600080fd5b506108da61382e565b6040516108e791906146a7565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097790614b14565b60405180910390fd5b80600f60146101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490614b14565b60405180910390fd5b8060048190555050565b6000806000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925092509250909192565b60075481565b610abe613b91565b600b600a60008481526020019081526020016000205481548110610ae557610ae4614b34565b5b90600052602060002090600b020160405180610160016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482018054610bcf90614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfb90614b92565b8015610c485780601f10610c1d57610100808354040283529160200191610c48565b820191906000526020600020905b815481529060010190602001808311610c2b57829003601f168201915b50505050508152602001600582018054610c6190614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8d90614b92565b8015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a82018054610d1b90614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4790614b92565b8015610d945780601f10610d6957610100808354040283529160200191610d94565b820191906000526020600020905b815481529060010190602001808311610d7757829003601f168201915b5050505050815250509050919050565b6000806005541415610db95760009050610dea565b6000610de3600554610dd560648661385290919063ffffffff16565b61386890919063ffffffff16565b9050809150505b919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614b14565b60405180910390fd5b610e948160085461387e90919063ffffffff16565b60088190555050565b6000600b80549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190614b14565b60405180910390fd5b610f4f8160085461389490919063ffffffff16565b60088190555050565b600081600c600084815260200190815260200160002054149050919050565b60045481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490614b14565b60405180910390fd5b8060068190555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690614c10565b60405180910390fd5b60005b83518110156112195760008482815181106111205761111f614b34565b5b60200260200101519050600084838151811061113f5761113e614b34565b5b60200260200101519050600084848151811061115e5761115d614b34565b5b602002602001015190506000801b600c600083815260200190815260200160002054146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790614c7c565b60405180910390fd5b6111eb60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846138aa565b80600c600083815260200190815260200160002081905550505050808061121190614ccb565b915050611102565b5050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161125c91906146a7565b60206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac9190614d29565b905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016112e991906146a7565b60206040518083038186803b15801561130157600080fd5b505afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113399190614d29565b90506000811161134857600080fd5b61137581611367670de0b6b3a76400008561386890919063ffffffff16565b61385290919063ffffffff16565b925050509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790614b14565b60405180910390fd5b600f60159054906101000a900460ff1615611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790614da2565b60405180910390fd5b6001600f60156101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016114b591906146a7565b60206040518083038186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115059190614d29565b1015611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d90614e0e565b60405180910390fd5b808273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611582929190614e2e565b60206040518083038186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d29190614d29565b1015611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90614ea3565b60405180910390fd5b61161f823330846139e0565b6000600f60156101000a81548160ff0219169083151502179055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c590614b14565b60405180910390fd5b600f60159054906101000a900460ff161561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614da2565b60405180910390fd5b6001600f60156101000a81548160ff0219169083151502179055508034101561177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390614f0f565b60405180910390fd5b6000600f60156101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190614b14565b60405180910390fd5b60075460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161188691906146a7565b60206040518083038186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190614d29565b1015611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90614e0e565b60405180910390fd5b61194460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336007546138aa565b6000600781905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590614b14565b60405180910390fd5b8060048190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90614b14565b60405180910390fd5b600f60159054906101000a900460ff1615611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90614da2565b60405180910390fd5b6001600f60156101000a81548160ff02191690831515021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b3f91906146a7565b60206040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190614d29565b9050600854811015611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90614e0e565b60405180910390fd5b611c0e60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff163360085484611c099190614f2f565b6138aa565b506000600f60156101000a81548160ff021916908315150217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614b14565b60405180910390fd5b82600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600080611df8600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611220565b9050611e3c6064611e2e600454611e20670de0b6b3a76400008661386890919063ffffffff16565b61385290919063ffffffff16565b61386890919063ffffffff16565b91505090565b60055481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600b8054905090506000611ec684611eb8611ea9611e9a60018a613b1990919063ffffffff16565b88613b2f90919063ffffffff16565b85613b4590919063ffffffff16565b613b1990919063ffffffff16565b90506000811215611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0390614faf565b60405180910390fd5b6000611f218583613b4590919063ffffffff16565b90506000811215611f3157600090505b600082905083811115611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614faf565b60405180910390fd5b60008282611f879190614fcf565b67ffffffffffffffff811115611fa057611f9f6140b2565b5b604051908082528060200260200182016040528015611fd957816020015b611fc6613b91565b815260200190600190039081611fbe5790505b50905060005b8383131561230b576000600b611fff60018661387e90919063ffffffff16565b815481106120105761200f614b34565b5b90600052602060002090600b020160405180610160016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820180546120fa90614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461212690614b92565b80156121735780601f1061214857610100808354040283529160200191612173565b820191906000526020600020905b81548152906001019060200180831161215657829003601f168201915b5050505050815260200160058201805461218c90614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546121b890614b92565b80156122055780601f106121da57610100808354040283529160200191612205565b820191906000526020600020905b8154815290600101906020018083116121e857829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201805461224690614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461227290614b92565b80156122bf5780601f10612294576101008083540402835291602001916122bf565b820191906000526020600020905b8154815290600101906020018083116122a257829003601f168201915b5050505050815250509050808383815181106122de576122dd614b34565b5b602002602001018190525081806122f490614ccb565b92505050828061230390615063565b935050611fdf565b81965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190614b14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561241a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612411906150f8565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e590614b14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612555906150f8565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614b14565b60405180910390fd5b8060058190555050565b6000600f60149054906101000a900460ff16905090565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600f60159054906101000a900460ff16156126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b990614da2565b60405180910390fd5b6001600f60156101000a81548160ff02191690831515021790555060001515600f60149054906101000a900460ff16151514612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90615164565b60405180910390fd5b61273b611d84565b34101561277d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277490614f0f565b60405180910390fd5b6006548510156127c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b9906151d0565b60405180910390fd5b8460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161281c91906146a7565b60206040518083038186803b15801561283457600080fd5b505afa158015612848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286c9190614d29565b10156128ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a490614e0e565b60405180910390fd5b8460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401612909929190614e2e565b60206040518083038186803b15801561292157600080fd5b505afa158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129599190614d29565b101561299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190614ea3565b60405180910390fd5b6129c660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff163330886139e0565b60006129d186610da4565b905060006129e8828861387e90919063ffffffff16565b905060003490508260076000828254612a0191906151f0565b925050819055506000600b8054905090506000612a2042600033613b5b565b9050600b6040518061016001604052808381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160038054612aa190614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054612acd90614b92565b8015612b1a5780601f10612aef57610100808354040283529160200191612b1a565b820191906000526020600020905b815481529060010190602001808311612afd57829003601f168201915b505050505081526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200187815260200185815260200142815260200143815260200189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081525090806001815401808255809150506001900390600052602060002090600b02016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004019080519060200190612cb5929190613c1a565b5060a0820151816005019080519060200190612cd2929190613c1a565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a019080519060200190612d1a929190613c1a565b50505081600a60008381526020019081526020016000208190555080600c600083815260200190815260200160002081905550612d628460085461389490919063ffffffff16565b60088190555050505050506000600f60156101000a81548160ff0219169083151502179055505050505050565b60038054612d9c90614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc890614b92565b8015612e155780601f10612dea57610100808354040283529160200191612e15565b820191906000526020600020905b815481529060010190602001808311612df857829003601f168201915b505050505081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60606000600b80549050905060008084905084600b805490501115612e8757612e8085600b8054905061387e90919063ffffffff16565b9150612e90565b600b8054905090505b600082905060008267ffffffffffffffff811115612eb157612eb06140b2565b5b604051908082528060200260200182016040528015612eea57816020015b612ed7613b91565b815260200190600190039081612ecf5790505b50905060005b85831015613207576000600b8481548110612f0e57612f0d614b34565b5b90600052602060002090600b020160405180610160016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482018054612ff890614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461302490614b92565b80156130715780601f1061304657610100808354040283529160200191613071565b820191906000526020600020905b81548152906001019060200180831161305457829003601f168201915b5050505050815260200160058201805461308a90614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546130b690614b92565b80156131035780601f106130d857610100808354040283529160200191613103565b820191906000526020600020905b8154815290600101906020018083116130e657829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201805461314490614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461317090614b92565b80156131bd5780601f10613192576101008083540402835291602001916131bd565b820191906000526020600020905b8154815290600101906020018083116131a057829003601f168201915b5050505050815250509050808383806131d590614ccb565b9450815181106131e8576131e7614b34565b5b60200260200101819052505082806131ff90614ccb565b935050612ef0565b819650505050505050919050565b6000600454905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614b14565b60405180910390fd5b600f60159054906101000a900460ff16156132ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f690614da2565b60405180910390fd5b6001600f60156101000a81548160ff0219169083151502179055506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161336290615277565b60006040518083038185875af1925050503d806000811461339f576040519150601f19603f3d011682016040523d82523d6000602084013e6133a4565b606091505b50509050806133e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133df906152d8565b60405180910390fd5b506000600f60156101000a81548160ff021916908315150217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348d90614b14565b60405180910390fd5b600f60159054906101000a900460ff16156134e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dd90614da2565b60405180910390fd5b6001600f60156101000a81548160ff021916908315150217905550613509612653565b81111561354b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354290615344565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161359390615277565b60006040518083038185875af1925050503d80600081146135d0576040519150601f19603f3d011682016040523d82523d6000602084013e6135d5565b606091505b5050905080613619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613610906152d8565b60405180910390fd5b506000600f60156101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146136c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136bf90614b14565b60405180910390fd5b600f60159054906101000a900460ff1615613718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370f90614da2565b60405180910390fd5b6001600f60156101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161376d91906146a7565b60206040518083038186803b15801561378557600080fd5b505afa158015613799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bd9190614d29565b10156137fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f590614e0e565b60405180910390fd5b6138098233836138aa565b6000600f60156101000a81548160ff0219169083151502179055505050565b60065481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081836138609190615393565b905092915050565b6000818361387691906153c4565b905092915050565b6000818361388c9190614f2f565b905092915050565b600081836138a291906151f0565b905092915050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016138dc92919061541e565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161392a9190615483565b6000604051808303816000865af19150503d8060008114613967576040519150601f19603f3d011682016040523d82523d6000602084013e61396c565b606091505b509150915081801561399a575060008151148061399957508080602001905181019061399891906154af565b5b5b6139d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d090615528565b60405180910390fd5b5050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401613a1493929190615548565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613a629190615483565b6000604051808303816000865af19150503d8060008114613a9f576040519150601f19603f3d011682016040523d82523d6000602084013e613aa4565b606091505b5091509150818015613ad25750600081511480613ad1575080806020019051810190613ad091906154af565b5b5b613b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b08906155f1565b60405180910390fd5b505050505050565b60008183613b279190615611565b905092915050565b60008183613b3d91906156a5565b905092915050565b60008183613b539190614fcf565b905092915050565b6000838284604051602001613b7293929190615825565b6040516020818303038152906040528051906020012090509392505050565b60405180610160016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001606081525090565b828054613c2690614b92565b90600052602060002090601f016020900481019282613c485760008555613c8f565b82601f10613c6157805160ff1916838001178555613c8f565b82800160010185558215613c8f579182015b82811115613c8e578251825591602001919060010190613c73565b5b509050613c9c9190613ca0565b5090565b5b80821115613cb9576000816000905550600101613ca1565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b613ce681613cd1565b8114613cf157600080fd5b50565b600081359050613d0381613cdd565b92915050565b600060208284031215613d1f57613d1e613cc7565b5b6000613d2d84828501613cf4565b91505092915050565b6000819050919050565b613d4981613d36565b8114613d5457600080fd5b50565b600081359050613d6681613d40565b92915050565b600060208284031215613d8257613d81613cc7565b5b6000613d9084828501613d57565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dc482613d99565b9050919050565b613dd481613db9565b82525050565b6000606082019050613def6000830186613dcb565b613dfc6020830185613dcb565b613e096040830184613dcb565b949350505050565b613e1a81613d36565b82525050565b6000602082019050613e356000830184613e11565b92915050565b6000819050919050565b613e4e81613e3b565b8114613e5957600080fd5b50565b600081359050613e6b81613e45565b92915050565b600060208284031215613e8757613e86613cc7565b5b6000613e9584828501613e5c565b91505092915050565b613ea781613e3b565b82525050565b613eb681613db9565b82525050565b613ec581613d36565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f05578082015181840152602081019050613eea565b83811115613f14576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f3682613ecb565b613f408185613ed6565b9350613f50818560208601613ee7565b613f5981613f1a565b840191505092915050565b600061016083016000830151613f7d6000860182613e9e565b506020830151613f906020860182613ead565b506040830151613fa36040860182613ead565b506060830151613fb66060860182613ebc565b5060808301518482036080860152613fce8282613f2b565b91505060a083015184820360a0860152613fe88282613f2b565b91505060c0830151613ffd60c0860182613ebc565b5060e083015161401060e0860182613ebc565b50610100830151614025610100860182613ebc565b5061012083015161403a610120860182613ebc565b506101408301518482036101408601526140548282613f2b565b9150508091505092915050565b6000602082019050818103600083015261407b8184613f64565b905092915050565b61408c81613cd1565b82525050565b60006020820190506140a76000830184614083565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140ea82613f1a565b810181811067ffffffffffffffff82111715614109576141086140b2565b5b80604052505050565b600061411c613cbd565b905061412882826140e1565b919050565b600067ffffffffffffffff821115614148576141476140b2565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561417e5761417d6140b2565b5b61418782613f1a565b9050602081019050919050565b82818337600083830152505050565b60006141b66141b184614163565b614112565b9050828152602081018484840111156141d2576141d161415e565b5b6141dd848285614194565b509392505050565b600082601f8301126141fa576141f96140ad565b5b813561420a8482602086016141a3565b91505092915050565b60006142266142218461412d565b614112565b9050808382526020820190506020840283018581111561424957614248614159565b5b835b8181101561429057803567ffffffffffffffff81111561426e5761426d6140ad565b5b80860161427b89826141e5565b8552602085019450505060208101905061424b565b5050509392505050565b600082601f8301126142af576142ae6140ad565b5b81356142bf848260208601614213565b91505092915050565b600067ffffffffffffffff8211156142e3576142e26140b2565b5b602082029050602081019050919050565b6142fd81613db9565b811461430857600080fd5b50565b60008135905061431a816142f4565b92915050565b600061433361432e846142c8565b614112565b9050808382526020820190506020840283018581111561435657614355614159565b5b835b8181101561437f578061436b888261430b565b845260208401935050602081019050614358565b5050509392505050565b600082601f83011261439e5761439d6140ad565b5b81356143ae848260208601614320565b91505092915050565b600067ffffffffffffffff8211156143d2576143d16140b2565b5b602082029050602081019050919050565b60006143f66143f1846143b7565b614112565b9050808382526020820190506020840283018581111561441957614418614159565b5b835b81811015614442578061442e8882613d57565b84526020840193505060208101905061441b565b5050509392505050565b600082601f830112614461576144606140ad565b5b81356144718482602086016143e3565b91505092915050565b600067ffffffffffffffff821115614495576144946140b2565b5b602082029050602081019050919050565b60006144b96144b48461447a565b614112565b905080838252602082019050602084028301858111156144dc576144db614159565b5b835b8181101561450557806144f18882613e5c565b8452602084019350506020810190506144de565b5050509392505050565b600082601f830112614524576145236140ad565b5b81356145348482602086016144a6565b91505092915050565b6000806000806080858703121561455757614556613cc7565b5b600085013567ffffffffffffffff81111561457557614574613ccc565b5b6145818782880161429a565b945050602085013567ffffffffffffffff8111156145a2576145a1613ccc565b5b6145ae87828801614389565b935050604085013567ffffffffffffffff8111156145cf576145ce613ccc565b5b6145db8782880161444c565b925050606085013567ffffffffffffffff8111156145fc576145fb613ccc565b5b6146088782880161450f565b91505092959194509250565b60008060006060848603121561462d5761462c613cc7565b5b600061463b8682870161430b565b935050602061464c8682870161430b565b925050604061465d8682870161430b565b9150509250925092565b6000806040838503121561467e5761467d613cc7565b5b600061468c8582860161430b565b925050602061469d85828601613d57565b9150509250929050565b60006020820190506146bc6000830184613dcb565b92915050565b6000819050919050565b6146d5816146c2565b81146146e057600080fd5b50565b6000813590506146f2816146cc565b92915050565b6000806040838503121561470f5761470e613cc7565b5b600061471d858286016146e3565b925050602061472e858286016146e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006101608301600083015161477d6000860182613e9e565b5060208301516147906020860182613ead565b5060408301516147a36040860182613ead565b5060608301516147b66060860182613ebc565b50608083015184820360808601526147ce8282613f2b565b91505060a083015184820360a08601526147e88282613f2b565b91505060c08301516147fd60c0860182613ebc565b5060e083015161481060e0860182613ebc565b50610100830151614825610100860182613ebc565b5061012083015161483a610120860182613ebc565b506101408301518482036101408601526148548282613f2b565b9150508091505092915050565b600061486d8383614764565b905092915050565b6000602082019050919050565b600061488d82614738565b6148978185614743565b9350836020820285016148a985614754565b8060005b858110156148e557848403895281516148c68582614861565b94506148d183614875565b925060208a019950506001810190506148ad565b50829750879550505050505092915050565b600060208201905081810360008301526149118184614882565b905092915050565b60006020828403121561492f5761492e613cc7565b5b600061493d8482850161430b565b91505092915050565b600080fd5b60008083601f840112614961576149606140ad565b5b8235905067ffffffffffffffff81111561497e5761497d614946565b5b60208301915083600182028301111561499a57614999614159565b5b9250929050565b6000806000806000606086880312156149bd576149bc613cc7565b5b60006149cb88828901613d57565b955050602086013567ffffffffffffffff8111156149ec576149eb613ccc565b5b6149f88882890161494b565b9450945050604086013567ffffffffffffffff811115614a1b57614a1a613ccc565b5b614a278882890161494b565b92509250509295509295909350565b600082825260208201905092915050565b6000614a5282613ecb565b614a5c8185614a36565b9350614a6c818560208601613ee7565b614a7581613f1a565b840191505092915050565b60006020820190508181036000830152614a9a8184614a47565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f207468697320616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614afe602183614a36565b9150614b0982614aa2565b604082019050919050565b60006020820190508181036000830152614b2d81614af1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614baa57607f821691505b60208210811415614bbe57614bbd614b63565b5b50919050565b7f4f6e6c792070726f6772616d206f72204f776e65720000000000000000000000600082015250565b6000614bfa601583614a36565b9150614c0582614bc4565b602082019050919050565b60006020820190508181036000830152614c2981614bed565b9050919050565b7f416c7265616479207472616e7366657265640000000000000000000000000000600082015250565b6000614c66601283614a36565b9150614c7182614c30565b602082019050919050565b60006020820190508181036000830152614c9581614c59565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd682613d36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d0957614d08614c9c565b5b600182019050919050565b600081519050614d2381613d40565b92915050565b600060208284031215614d3f57614d3e613cc7565b5b6000614d4d84828501614d14565b91505092915050565b7f4e6f2072652d656e7472616e6379000000000000000000000000000000000000600082015250565b6000614d8c600e83614a36565b9150614d9782614d56565b602082019050919050565b60006020820190508181036000830152614dbb81614d7f565b9050919050565b7f494e5355464953414e545f42414c414e43450000000000000000000000000000600082015250565b6000614df8601283614a36565b9150614e0382614dc2565b602082019050919050565b60006020820190508181036000830152614e2781614deb565b9050919050565b6000604082019050614e436000830185613dcb565b614e506020830184613dcb565b9392505050565b7f494e5355464953414e545f414c4c4f57414e4345000000000000000000000000600082015250565b6000614e8d601483614a36565b9150614e9882614e57565b602082019050919050565b60006020820190508181036000830152614ebc81614e80565b9050919050565b7f5041594d454e545f41424f525400000000000000000000000000000000000000600082015250565b6000614ef9600d83614a36565b9150614f0482614ec3565b602082019050919050565b60006020820190508181036000830152614f2881614eec565b9050919050565b6000614f3a82613d36565b9150614f4583613d36565b925082821015614f5857614f57614c9c565b5b828203905092915050565b7f4f7574206f6620626f756e647300000000000000000000000000000000000000600082015250565b6000614f99600d83614a36565b9150614fa482614f63565b602082019050919050565b60006020820190508181036000830152614fc881614f8c565b9050919050565b6000614fda826146c2565b9150614fe5836146c2565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156150205761501f614c9c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561505857615057614c9c565b5b828203905092915050565b600061506e826146c2565b91507f80000000000000000000000000000000000000000000000000000000000000008214156150a1576150a0614c9c565b5b600182039050919050565b7f4e6f207a65726f20616464726573730000000000000000000000000000000000600082015250565b60006150e2600f83614a36565b91506150ed826150ac565b602082019050919050565b60006020820190508181036000830152615111816150d5565b9050919050565b7f4272696467652061637475616c6c792070617573656400000000000000000000600082015250565b600061514e601683614a36565b915061515982615118565b602082019050919050565b6000602082019050818103600083015261517d81615141565b9050919050565b7f494e5355464953414e545f5155414e5449545900000000000000000000000000600082015250565b60006151ba601383614a36565b91506151c582615184565b602082019050919050565b600060208201905081810360008301526151e9816151ad565b9050919050565b60006151fb82613d36565b915061520683613d36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561523b5761523a614c9c565b5b828201905092915050565b600081905092915050565b50565b6000615261600083615246565b915061526c82615251565b600082019050919050565b600061528282615254565b9150819050919050565b7f5472616e73666572206661696c65642100000000000000000000000000000000600082015250565b60006152c2601083614a36565b91506152cd8261528c565b602082019050919050565b600060208201905081810360008301526152f1816152b5565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b600061532e601483614a36565b9150615339826152f8565b602082019050919050565b6000602082019050818103600083015261535d81615321565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061539e82613d36565b91506153a983613d36565b9250826153b9576153b8615364565b5b828204905092915050565b60006153cf82613d36565b91506153da83613d36565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541357615412614c9c565b5b828202905092915050565b60006040820190506154336000830185613dcb565b6154406020830184613e11565b9392505050565b600081519050919050565b600061545d82615447565b6154678185615246565b9350615477818560208601613ee7565b80840191505092915050565b600061548f8284615452565b915081905092915050565b6000815190506154a981613cdd565b92915050565b6000602082840312156154c5576154c4613cc7565b5b60006154d38482850161549a565b91505092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000615512601f83614a36565b915061551d826154dc565b602082019050919050565b6000602082019050818103600083015261554181615505565b9050919050565b600060608201905061555d6000830186613dcb565b61556a6020830185613dcb565b6155776040830184613e11565b949350505050565b7f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160008201527f494c454400000000000000000000000000000000000000000000000000000000602082015250565b60006155db602483614a36565b91506155e68261557f565b604082019050919050565b6000602082019050818103600083015261560a816155ce565b9050919050565b600061561c826146c2565b9150615627836146c2565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561566257615661614c9c565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561569a57615699614c9c565b5b828201905092915050565b60006156b0826146c2565b91506156bb836146c2565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821160008413600084131616156156fa576156f9614c9c565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161561573757615736614c9c565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561577457615773614c9c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156157b1576157b0614c9c565b5b828202905092915050565b6000819050919050565b6157d76157d282613d36565b6157bc565b82525050565b60008160601b9050919050565b60006157f5826157dd565b9050919050565b6000615807826157ea565b9050919050565b61581f61581a82613db9565b6157fc565b82525050565b600061583182866157c6565b602082019150615841828561580e565b60148201915061585182846157c6565b60208201915081905094935050505056fea2646970667358221220759d741a3a7caae01becb151b16616a7151d6ff288cae22a7f106d3736db9f7d64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cdb37a4fbc2da5b78aa4e41a432792f9533e85cc0000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb1100000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806381d1f9dc1161012e578063c763e5a1116100ab578063dd1917191161006f578063dd19171914610831578063f14210a614610848578063f3fef3a314610871578063f8228f7b1461089a578063fc0c546a146108c55761023b565b8063c763e5a114610748578063c860ebc614610773578063cdca09471461079e578063d55748ea146107c9578063db18ba7d146108065761023b565b8063a6f9dae1116100f2578063a6f9dae114610684578063a7a2b3c5146106ad578063b187bd26146106d6578063b69ef8a814610701578063c2c68e001461072c5761023b565b806381d1f9dc1461059d57806382149b39146105c85780638da5cb5b146105f3578063946c6a921461061e578063a5d531041461065b5761023b565b80633e035383116101bc5780635358fbda116101805780635358fbda146105015780635829d9441461051d578063649c6c56146105345780636fcd112b1461055d57806375045691146105745761023b565b80633e0353831461041e578063419f75fe1461044957806341b313881461047257806342ae278c1461049b57806347e7ef24146104d85761023b565b80632bda82aa116102035780632bda82aa14610327578063320c0a5f1461036457806336f3f96f1461038d5780633be46cd6146103b85780633d9534b7146103e15761023b565b806316c38b3c1461024057806318fdc2c814610269578063191622ff146102925780631d774838146102bf578063260958a5146102ea575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613d09565b6108f0565b005b34801561027557600080fd5b50610290600480360381019061028b9190613d6c565b61099d565b005b34801561029e57600080fd5b506102a7610a37565b6040516102b693929190613dda565b60405180910390f35b3480156102cb57600080fd5b506102d4610ab0565b6040516102e19190613e20565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613e71565b610ab6565b60405161031e9190614061565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613d6c565b610da4565b60405161035b9190613e20565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613d6c565b610def565b005b34801561039957600080fd5b506103a2610e9d565b6040516103af9190613e20565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613d6c565b610eaa565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613e71565b610f58565b6040516104159190614092565b60405180910390f35b34801561042a57600080fd5b50610433610f77565b6040516104409190613e20565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190613d6c565b610f7d565b005b34801561047e57600080fd5b506104996004803603810190610494919061453d565b611017565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190614614565b611220565b6040516104cf9190613e20565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190614667565b611380565b005b61051b60048036038101906105169190613d6c565b61163e565b005b34801561052957600080fd5b5061053261179a565b005b34801561054057600080fd5b5061055b60048036038101906105569190613d6c565b61194e565b005b34801561056957600080fd5b506105726119e8565b005b34801561058057600080fd5b5061059b60048036038101906105969190614614565b611c2c565b005b3480156105a957600080fd5b506105b2611d84565b6040516105bf9190613e20565b60405180910390f35b3480156105d457600080fd5b506105dd611e42565b6040516105ea9190613e20565b60405180910390f35b3480156105ff57600080fd5b50610608611e48565b60405161061591906146a7565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906146f8565b611e6e565b60405161065291906148f7565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190614919565b61231a565b005b34801561069057600080fd5b506106ab60048036038101906106a69190614919565b61245e565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613d6c565b6125a2565b005b3480156106e257600080fd5b506106eb61263c565b6040516106f89190614092565b60405180910390f35b34801561070d57600080fd5b50610716612653565b6040516107239190613e20565b60405180910390f35b610746600480360381019061074191906149a1565b612672565b005b34801561075457600080fd5b5061075d612d8f565b60405161076a9190614a80565b60405180910390f35b34801561077f57600080fd5b50610788612e1d565b60405161079591906146a7565b60405180910390f35b3480156107aa57600080fd5b506107b3612e43565b6040516107c09190613e20565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613d6c565b612e49565b6040516107fd91906148f7565b60405180910390f35b34801561081257600080fd5b5061081b613215565b6040516108289190613e20565b60405180910390f35b34801561083d57600080fd5b5061084661321f565b005b34801561085457600080fd5b5061086f600480360381019061086a9190613d6c565b613406565b005b34801561087d57600080fd5b5061089860048036038101906108939190614667565b613638565b005b3480156108a657600080fd5b506108af613828565b6040516108bc9190613e20565b60405180910390f35b3480156108d157600080fd5b506108da61382e565b6040516108e791906146a7565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097790614b14565b60405180910390fd5b80600f60146101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490614b14565b60405180910390fd5b8060048190555050565b6000806000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925092509250909192565b60075481565b610abe613b91565b600b600a60008481526020019081526020016000205481548110610ae557610ae4614b34565b5b90600052602060002090600b020160405180610160016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482018054610bcf90614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfb90614b92565b8015610c485780601f10610c1d57610100808354040283529160200191610c48565b820191906000526020600020905b815481529060010190602001808311610c2b57829003601f168201915b50505050508152602001600582018054610c6190614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8d90614b92565b8015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a82018054610d1b90614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4790614b92565b8015610d945780601f10610d6957610100808354040283529160200191610d94565b820191906000526020600020905b815481529060010190602001808311610d7757829003601f168201915b5050505050815250509050919050565b6000806005541415610db95760009050610dea565b6000610de3600554610dd560648661385290919063ffffffff16565b61386890919063ffffffff16565b9050809150505b919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614b14565b60405180910390fd5b610e948160085461387e90919063ffffffff16565b60088190555050565b6000600b80549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190614b14565b60405180910390fd5b610f4f8160085461389490919063ffffffff16565b60088190555050565b600081600c600084815260200190815260200160002054149050919050565b60045481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490614b14565b60405180910390fd5b8060068190555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690614c10565b60405180910390fd5b60005b83518110156112195760008482815181106111205761111f614b34565b5b60200260200101519050600084838151811061113f5761113e614b34565b5b60200260200101519050600084848151811061115e5761115d614b34565b5b602002602001015190506000801b600c600083815260200190815260200160002054146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790614c7c565b60405180910390fd5b6111eb60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846138aa565b80600c600083815260200190815260200160002081905550505050808061121190614ccb565b915050611102565b5050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161125c91906146a7565b60206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac9190614d29565b905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016112e991906146a7565b60206040518083038186803b15801561130157600080fd5b505afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113399190614d29565b90506000811161134857600080fd5b61137581611367670de0b6b3a76400008561386890919063ffffffff16565b61385290919063ffffffff16565b925050509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790614b14565b60405180910390fd5b600f60159054906101000a900460ff1615611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790614da2565b60405180910390fd5b6001600f60156101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016114b591906146a7565b60206040518083038186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115059190614d29565b1015611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d90614e0e565b60405180910390fd5b808273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611582929190614e2e565b60206040518083038186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d29190614d29565b1015611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90614ea3565b60405180910390fd5b61161f823330846139e0565b6000600f60156101000a81548160ff0219169083151502179055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c590614b14565b60405180910390fd5b600f60159054906101000a900460ff161561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614da2565b60405180910390fd5b6001600f60156101000a81548160ff0219169083151502179055508034101561177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390614f0f565b60405180910390fd5b6000600f60156101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190614b14565b60405180910390fd5b60075460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161188691906146a7565b60206040518083038186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190614d29565b1015611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90614e0e565b60405180910390fd5b61194460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336007546138aa565b6000600781905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590614b14565b60405180910390fd5b8060048190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90614b14565b60405180910390fd5b600f60159054906101000a900460ff1615611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90614da2565b60405180910390fd5b6001600f60156101000a81548160ff02191690831515021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b3f91906146a7565b60206040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190614d29565b9050600854811015611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90614e0e565b60405180910390fd5b611c0e60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff163360085484611c099190614f2f565b6138aa565b506000600f60156101000a81548160ff021916908315150217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614b14565b60405180910390fd5b82600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600080611df8600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611220565b9050611e3c6064611e2e600454611e20670de0b6b3a76400008661386890919063ffffffff16565b61385290919063ffffffff16565b61386890919063ffffffff16565b91505090565b60055481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600b8054905090506000611ec684611eb8611ea9611e9a60018a613b1990919063ffffffff16565b88613b2f90919063ffffffff16565b85613b4590919063ffffffff16565b613b1990919063ffffffff16565b90506000811215611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0390614faf565b60405180910390fd5b6000611f218583613b4590919063ffffffff16565b90506000811215611f3157600090505b600082905083811115611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614faf565b60405180910390fd5b60008282611f879190614fcf565b67ffffffffffffffff811115611fa057611f9f6140b2565b5b604051908082528060200260200182016040528015611fd957816020015b611fc6613b91565b815260200190600190039081611fbe5790505b50905060005b8383131561230b576000600b611fff60018661387e90919063ffffffff16565b815481106120105761200f614b34565b5b90600052602060002090600b020160405180610160016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820180546120fa90614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461212690614b92565b80156121735780601f1061214857610100808354040283529160200191612173565b820191906000526020600020905b81548152906001019060200180831161215657829003601f168201915b5050505050815260200160058201805461218c90614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546121b890614b92565b80156122055780601f106121da57610100808354040283529160200191612205565b820191906000526020600020905b8154815290600101906020018083116121e857829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201805461224690614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461227290614b92565b80156122bf5780601f10612294576101008083540402835291602001916122bf565b820191906000526020600020905b8154815290600101906020018083116122a257829003601f168201915b5050505050815250509050808383815181106122de576122dd614b34565b5b602002602001018190525081806122f490614ccb565b92505050828061230390615063565b935050611fdf565b81965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190614b14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561241a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612411906150f8565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e590614b14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612555906150f8565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614b14565b60405180910390fd5b8060058190555050565b6000600f60149054906101000a900460ff16905090565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600f60159054906101000a900460ff16156126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b990614da2565b60405180910390fd5b6001600f60156101000a81548160ff02191690831515021790555060001515600f60149054906101000a900460ff16151514612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90615164565b60405180910390fd5b61273b611d84565b34101561277d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277490614f0f565b60405180910390fd5b6006548510156127c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b9906151d0565b60405180910390fd5b8460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161281c91906146a7565b60206040518083038186803b15801561283457600080fd5b505afa158015612848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286c9190614d29565b10156128ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a490614e0e565b60405180910390fd5b8460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401612909929190614e2e565b60206040518083038186803b15801561292157600080fd5b505afa158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129599190614d29565b101561299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190614ea3565b60405180910390fd5b6129c660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff163330886139e0565b60006129d186610da4565b905060006129e8828861387e90919063ffffffff16565b905060003490508260076000828254612a0191906151f0565b925050819055506000600b8054905090506000612a2042600033613b5b565b9050600b6040518061016001604052808381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160038054612aa190614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054612acd90614b92565b8015612b1a5780601f10612aef57610100808354040283529160200191612b1a565b820191906000526020600020905b815481529060010190602001808311612afd57829003601f168201915b505050505081526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200187815260200185815260200142815260200143815260200189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081525090806001815401808255809150506001900390600052602060002090600b02016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004019080519060200190612cb5929190613c1a565b5060a0820151816005019080519060200190612cd2929190613c1a565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a019080519060200190612d1a929190613c1a565b50505081600a60008381526020019081526020016000208190555080600c600083815260200190815260200160002081905550612d628460085461389490919063ffffffff16565b60088190555050505050506000600f60156101000a81548160ff0219169083151502179055505050505050565b60038054612d9c90614b92565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc890614b92565b8015612e155780601f10612dea57610100808354040283529160200191612e15565b820191906000526020600020905b815481529060010190602001808311612df857829003601f168201915b505050505081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60606000600b80549050905060008084905084600b805490501115612e8757612e8085600b8054905061387e90919063ffffffff16565b9150612e90565b600b8054905090505b600082905060008267ffffffffffffffff811115612eb157612eb06140b2565b5b604051908082528060200260200182016040528015612eea57816020015b612ed7613b91565b815260200190600190039081612ecf5790505b50905060005b85831015613207576000600b8481548110612f0e57612f0d614b34565b5b90600052602060002090600b020160405180610160016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482018054612ff890614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461302490614b92565b80156130715780601f1061304657610100808354040283529160200191613071565b820191906000526020600020905b81548152906001019060200180831161305457829003601f168201915b5050505050815260200160058201805461308a90614b92565b80601f01602080910402602001604051908101604052809291908181526020018280546130b690614b92565b80156131035780601f106130d857610100808354040283529160200191613103565b820191906000526020600020905b8154815290600101906020018083116130e657829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201805461314490614b92565b80601f016020809104026020016040519081016040528092919081815260200182805461317090614b92565b80156131bd5780601f10613192576101008083540402835291602001916131bd565b820191906000526020600020905b8154815290600101906020018083116131a057829003601f168201915b5050505050815250509050808383806131d590614ccb565b9450815181106131e8576131e7614b34565b5b60200260200101819052505082806131ff90614ccb565b935050612ef0565b819650505050505050919050565b6000600454905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614b14565b60405180910390fd5b600f60159054906101000a900460ff16156132ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f690614da2565b60405180910390fd5b6001600f60156101000a81548160ff0219169083151502179055506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161336290615277565b60006040518083038185875af1925050503d806000811461339f576040519150601f19603f3d011682016040523d82523d6000602084013e6133a4565b606091505b50509050806133e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133df906152d8565b60405180910390fd5b506000600f60156101000a81548160ff021916908315150217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348d90614b14565b60405180910390fd5b600f60159054906101000a900460ff16156134e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dd90614da2565b60405180910390fd5b6001600f60156101000a81548160ff021916908315150217905550613509612653565b81111561354b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354290615344565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161359390615277565b60006040518083038185875af1925050503d80600081146135d0576040519150601f19603f3d011682016040523d82523d6000602084013e6135d5565b606091505b5050905080613619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613610906152d8565b60405180910390fd5b506000600f60156101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146136c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136bf90614b14565b60405180910390fd5b600f60159054906101000a900460ff1615613718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370f90614da2565b60405180910390fd5b6001600f60156101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161376d91906146a7565b60206040518083038186803b15801561378557600080fd5b505afa158015613799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bd9190614d29565b10156137fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f590614e0e565b60405180910390fd5b6138098233836138aa565b6000600f60156101000a81548160ff0219169083151502179055505050565b60065481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081836138609190615393565b905092915050565b6000818361387691906153c4565b905092915050565b6000818361388c9190614f2f565b905092915050565b600081836138a291906151f0565b905092915050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016138dc92919061541e565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161392a9190615483565b6000604051808303816000865af19150503d8060008114613967576040519150601f19603f3d011682016040523d82523d6000602084013e61396c565b606091505b509150915081801561399a575060008151148061399957508080602001905181019061399891906154af565b5b5b6139d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d090615528565b60405180910390fd5b5050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401613a1493929190615548565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613a629190615483565b6000604051808303816000865af19150503d8060008114613a9f576040519150601f19603f3d011682016040523d82523d6000602084013e613aa4565b606091505b5091509150818015613ad25750600081511480613ad1575080806020019051810190613ad091906154af565b5b5b613b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b08906155f1565b60405180910390fd5b505050505050565b60008183613b279190615611565b905092915050565b60008183613b3d91906156a5565b905092915050565b60008183613b539190614fcf565b905092915050565b6000838284604051602001613b7293929190615825565b6040516020818303038152906040528051906020012090509392505050565b60405180610160016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001606081525090565b828054613c2690614b92565b90600052602060002090601f016020900481019282613c485760008555613c8f565b82601f10613c6157805160ff1916838001178555613c8f565b82800160010185558215613c8f579182015b82811115613c8e578251825591602001919060010190613c73565b5b509050613c9c9190613ca0565b5090565b5b80821115613cb9576000816000905550600101613ca1565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b613ce681613cd1565b8114613cf157600080fd5b50565b600081359050613d0381613cdd565b92915050565b600060208284031215613d1f57613d1e613cc7565b5b6000613d2d84828501613cf4565b91505092915050565b6000819050919050565b613d4981613d36565b8114613d5457600080fd5b50565b600081359050613d6681613d40565b92915050565b600060208284031215613d8257613d81613cc7565b5b6000613d9084828501613d57565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dc482613d99565b9050919050565b613dd481613db9565b82525050565b6000606082019050613def6000830186613dcb565b613dfc6020830185613dcb565b613e096040830184613dcb565b949350505050565b613e1a81613d36565b82525050565b6000602082019050613e356000830184613e11565b92915050565b6000819050919050565b613e4e81613e3b565b8114613e5957600080fd5b50565b600081359050613e6b81613e45565b92915050565b600060208284031215613e8757613e86613cc7565b5b6000613e9584828501613e5c565b91505092915050565b613ea781613e3b565b82525050565b613eb681613db9565b82525050565b613ec581613d36565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f05578082015181840152602081019050613eea565b83811115613f14576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f3682613ecb565b613f408185613ed6565b9350613f50818560208601613ee7565b613f5981613f1a565b840191505092915050565b600061016083016000830151613f7d6000860182613e9e565b506020830151613f906020860182613ead565b506040830151613fa36040860182613ead565b506060830151613fb66060860182613ebc565b5060808301518482036080860152613fce8282613f2b565b91505060a083015184820360a0860152613fe88282613f2b565b91505060c0830151613ffd60c0860182613ebc565b5060e083015161401060e0860182613ebc565b50610100830151614025610100860182613ebc565b5061012083015161403a610120860182613ebc565b506101408301518482036101408601526140548282613f2b565b9150508091505092915050565b6000602082019050818103600083015261407b8184613f64565b905092915050565b61408c81613cd1565b82525050565b60006020820190506140a76000830184614083565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140ea82613f1a565b810181811067ffffffffffffffff82111715614109576141086140b2565b5b80604052505050565b600061411c613cbd565b905061412882826140e1565b919050565b600067ffffffffffffffff821115614148576141476140b2565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561417e5761417d6140b2565b5b61418782613f1a565b9050602081019050919050565b82818337600083830152505050565b60006141b66141b184614163565b614112565b9050828152602081018484840111156141d2576141d161415e565b5b6141dd848285614194565b509392505050565b600082601f8301126141fa576141f96140ad565b5b813561420a8482602086016141a3565b91505092915050565b60006142266142218461412d565b614112565b9050808382526020820190506020840283018581111561424957614248614159565b5b835b8181101561429057803567ffffffffffffffff81111561426e5761426d6140ad565b5b80860161427b89826141e5565b8552602085019450505060208101905061424b565b5050509392505050565b600082601f8301126142af576142ae6140ad565b5b81356142bf848260208601614213565b91505092915050565b600067ffffffffffffffff8211156142e3576142e26140b2565b5b602082029050602081019050919050565b6142fd81613db9565b811461430857600080fd5b50565b60008135905061431a816142f4565b92915050565b600061433361432e846142c8565b614112565b9050808382526020820190506020840283018581111561435657614355614159565b5b835b8181101561437f578061436b888261430b565b845260208401935050602081019050614358565b5050509392505050565b600082601f83011261439e5761439d6140ad565b5b81356143ae848260208601614320565b91505092915050565b600067ffffffffffffffff8211156143d2576143d16140b2565b5b602082029050602081019050919050565b60006143f66143f1846143b7565b614112565b9050808382526020820190506020840283018581111561441957614418614159565b5b835b81811015614442578061442e8882613d57565b84526020840193505060208101905061441b565b5050509392505050565b600082601f830112614461576144606140ad565b5b81356144718482602086016143e3565b91505092915050565b600067ffffffffffffffff821115614495576144946140b2565b5b602082029050602081019050919050565b60006144b96144b48461447a565b614112565b905080838252602082019050602084028301858111156144dc576144db614159565b5b835b8181101561450557806144f18882613e5c565b8452602084019350506020810190506144de565b5050509392505050565b600082601f830112614524576145236140ad565b5b81356145348482602086016144a6565b91505092915050565b6000806000806080858703121561455757614556613cc7565b5b600085013567ffffffffffffffff81111561457557614574613ccc565b5b6145818782880161429a565b945050602085013567ffffffffffffffff8111156145a2576145a1613ccc565b5b6145ae87828801614389565b935050604085013567ffffffffffffffff8111156145cf576145ce613ccc565b5b6145db8782880161444c565b925050606085013567ffffffffffffffff8111156145fc576145fb613ccc565b5b6146088782880161450f565b91505092959194509250565b60008060006060848603121561462d5761462c613cc7565b5b600061463b8682870161430b565b935050602061464c8682870161430b565b925050604061465d8682870161430b565b9150509250925092565b6000806040838503121561467e5761467d613cc7565b5b600061468c8582860161430b565b925050602061469d85828601613d57565b9150509250929050565b60006020820190506146bc6000830184613dcb565b92915050565b6000819050919050565b6146d5816146c2565b81146146e057600080fd5b50565b6000813590506146f2816146cc565b92915050565b6000806040838503121561470f5761470e613cc7565b5b600061471d858286016146e3565b925050602061472e858286016146e3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006101608301600083015161477d6000860182613e9e565b5060208301516147906020860182613ead565b5060408301516147a36040860182613ead565b5060608301516147b66060860182613ebc565b50608083015184820360808601526147ce8282613f2b565b91505060a083015184820360a08601526147e88282613f2b565b91505060c08301516147fd60c0860182613ebc565b5060e083015161481060e0860182613ebc565b50610100830151614825610100860182613ebc565b5061012083015161483a610120860182613ebc565b506101408301518482036101408601526148548282613f2b565b9150508091505092915050565b600061486d8383614764565b905092915050565b6000602082019050919050565b600061488d82614738565b6148978185614743565b9350836020820285016148a985614754565b8060005b858110156148e557848403895281516148c68582614861565b94506148d183614875565b925060208a019950506001810190506148ad565b50829750879550505050505092915050565b600060208201905081810360008301526149118184614882565b905092915050565b60006020828403121561492f5761492e613cc7565b5b600061493d8482850161430b565b91505092915050565b600080fd5b60008083601f840112614961576149606140ad565b5b8235905067ffffffffffffffff81111561497e5761497d614946565b5b60208301915083600182028301111561499a57614999614159565b5b9250929050565b6000806000806000606086880312156149bd576149bc613cc7565b5b60006149cb88828901613d57565b955050602086013567ffffffffffffffff8111156149ec576149eb613ccc565b5b6149f88882890161494b565b9450945050604086013567ffffffffffffffff811115614a1b57614a1a613ccc565b5b614a278882890161494b565b92509250509295509295909350565b600082825260208201905092915050565b6000614a5282613ecb565b614a5c8185614a36565b9350614a6c818560208601613ee7565b614a7581613f1a565b840191505092915050565b60006020820190508181036000830152614a9a8184614a47565b905092915050565b7f4f6e6c7920746865206f776e65722063616e20646f207468697320616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614afe602183614a36565b9150614b0982614aa2565b604082019050919050565b60006020820190508181036000830152614b2d81614af1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614baa57607f821691505b60208210811415614bbe57614bbd614b63565b5b50919050565b7f4f6e6c792070726f6772616d206f72204f776e65720000000000000000000000600082015250565b6000614bfa601583614a36565b9150614c0582614bc4565b602082019050919050565b60006020820190508181036000830152614c2981614bed565b9050919050565b7f416c7265616479207472616e7366657265640000000000000000000000000000600082015250565b6000614c66601283614a36565b9150614c7182614c30565b602082019050919050565b60006020820190508181036000830152614c9581614c59565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd682613d36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d0957614d08614c9c565b5b600182019050919050565b600081519050614d2381613d40565b92915050565b600060208284031215614d3f57614d3e613cc7565b5b6000614d4d84828501614d14565b91505092915050565b7f4e6f2072652d656e7472616e6379000000000000000000000000000000000000600082015250565b6000614d8c600e83614a36565b9150614d9782614d56565b602082019050919050565b60006020820190508181036000830152614dbb81614d7f565b9050919050565b7f494e5355464953414e545f42414c414e43450000000000000000000000000000600082015250565b6000614df8601283614a36565b9150614e0382614dc2565b602082019050919050565b60006020820190508181036000830152614e2781614deb565b9050919050565b6000604082019050614e436000830185613dcb565b614e506020830184613dcb565b9392505050565b7f494e5355464953414e545f414c4c4f57414e4345000000000000000000000000600082015250565b6000614e8d601483614a36565b9150614e9882614e57565b602082019050919050565b60006020820190508181036000830152614ebc81614e80565b9050919050565b7f5041594d454e545f41424f525400000000000000000000000000000000000000600082015250565b6000614ef9600d83614a36565b9150614f0482614ec3565b602082019050919050565b60006020820190508181036000830152614f2881614eec565b9050919050565b6000614f3a82613d36565b9150614f4583613d36565b925082821015614f5857614f57614c9c565b5b828203905092915050565b7f4f7574206f6620626f756e647300000000000000000000000000000000000000600082015250565b6000614f99600d83614a36565b9150614fa482614f63565b602082019050919050565b60006020820190508181036000830152614fc881614f8c565b9050919050565b6000614fda826146c2565b9150614fe5836146c2565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156150205761501f614c9c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561505857615057614c9c565b5b828203905092915050565b600061506e826146c2565b91507f80000000000000000000000000000000000000000000000000000000000000008214156150a1576150a0614c9c565b5b600182039050919050565b7f4e6f207a65726f20616464726573730000000000000000000000000000000000600082015250565b60006150e2600f83614a36565b91506150ed826150ac565b602082019050919050565b60006020820190508181036000830152615111816150d5565b9050919050565b7f4272696467652061637475616c6c792070617573656400000000000000000000600082015250565b600061514e601683614a36565b915061515982615118565b602082019050919050565b6000602082019050818103600083015261517d81615141565b9050919050565b7f494e5355464953414e545f5155414e5449545900000000000000000000000000600082015250565b60006151ba601383614a36565b91506151c582615184565b602082019050919050565b600060208201905081810360008301526151e9816151ad565b9050919050565b60006151fb82613d36565b915061520683613d36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561523b5761523a614c9c565b5b828201905092915050565b600081905092915050565b50565b6000615261600083615246565b915061526c82615251565b600082019050919050565b600061528282615254565b9150819050919050565b7f5472616e73666572206661696c65642100000000000000000000000000000000600082015250565b60006152c2601083614a36565b91506152cd8261528c565b602082019050919050565b600060208201905081810360008301526152f1816152b5565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b600061532e601483614a36565b9150615339826152f8565b602082019050919050565b6000602082019050818103600083015261535d81615321565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061539e82613d36565b91506153a983613d36565b9250826153b9576153b8615364565b5b828204905092915050565b60006153cf82613d36565b91506153da83613d36565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541357615412614c9c565b5b828202905092915050565b60006040820190506154336000830185613dcb565b6154406020830184613e11565b9392505050565b600081519050919050565b600061545d82615447565b6154678185615246565b9350615477818560208601613ee7565b80840191505092915050565b600061548f8284615452565b915081905092915050565b6000815190506154a981613cdd565b92915050565b6000602082840312156154c5576154c4613cc7565b5b60006154d38482850161549a565b91505092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000615512601f83614a36565b915061551d826154dc565b602082019050919050565b6000602082019050818103600083015261554181615505565b9050919050565b600060608201905061555d6000830186613dcb565b61556a6020830185613dcb565b6155776040830184613e11565b949350505050565b7f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160008201527f494c454400000000000000000000000000000000000000000000000000000000602082015250565b60006155db602483614a36565b91506155e68261557f565b604082019050919050565b6000602082019050818103600083015261560a816155ce565b9050919050565b600061561c826146c2565b9150615627836146c2565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561566257615661614c9c565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561569a57615699614c9c565b5b828201905092915050565b60006156b0826146c2565b91506156bb836146c2565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821160008413600084131616156156fa576156f9614c9c565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161561573757615736614c9c565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561577457615773614c9c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156157b1576157b0614c9c565b5b828202905092915050565b6000819050919050565b6157d76157d282613d36565b6157bc565b82525050565b60008160601b9050919050565b60006157f5826157dd565b9050919050565b6000615807826157ea565b9050919050565b61581f61581a82613db9565b6157fc565b82525050565b600061583182866157c6565b602082019150615841828561580e565b60148201915061585182846157c6565b60208201915081905094935050505056fea2646970667358221220759d741a3a7caae01becb151b16616a7151d6ff288cae22a7f106d3736db9f7d64736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cdb37a4fbc2da5b78aa4e41a432792f9533e85cc0000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb1100000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _bridgeChain (string): ETH
Arg [1] : _token (address): 0xCdB37A4fBC2Da5b78aA4E41a432792f9533e85Cc
Arg [2] : _feesInDollar (uint256): 10000000000000000000
Arg [3] : _feesInCDTPercentage (uint256): 0
Arg [4] : _dex_in (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [5] : _dex_out (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [6] : _dex_pool (address): 0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 000000000000000000000000cdb37a4fbc2da5b78aa4e41a432792f9533e85cc
Arg [2] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [5] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [6] : 000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4554480000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Ethereum Bridge Contract (Liquidity represents the liquidity of the others blockchains)

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.