ETH Price: $3,097.57 (+0.94%)
Gas: 7 Gwei

Contract

0x7162629f540a9e19eCBeEa163eB8e48eC898Ad20
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw183689622023-10-17 8:40:59267 days ago1697532059IN
0x7162629f...eC898Ad20
0 ETH0.000210256.17841213
Pay Eth Order182353722023-09-28 16:18:11286 days ago1695917891IN
0x7162629f...eC898Ad20
0.03188386 ETH0.0011755225.89088075
Pay Eth Order182129962023-09-25 13:07:47289 days ago1695647267IN
0x7162629f...eC898Ad20
0.08544958 ETH0.0005405311.90533345
Confirm Transact...181626412023-09-18 11:50:35296 days ago1695037835IN
0x7162629f...eC898Ad20
0 ETH0.000917117.98946402
Submit Transacti...181626362023-09-18 11:49:35296 days ago1695037775IN
0x7162629f...eC898Ad20
0 ETH0.001531848.87644091
Confirm Transact...181626342023-09-18 11:48:59296 days ago1695037739IN
0x7162629f...eC898Ad20
0 ETH0.001160657.991812
Submit Transacti...181626292023-09-18 11:47:59296 days ago1695037679IN
0x7162629f...eC898Ad20
0 ETH0.001404768.37972033
Pay Token Order180920272023-09-08 13:34:47306 days ago1694180087IN
0x7162629f...eC898Ad20
0 ETH0.001199813.05379197
Pay Eth Order180838492023-09-07 10:06:59307 days ago1694081219IN
0x7162629f...eC898Ad20
0.00987929 ETH0.0006780714.93462564
Pay Eth Order180390382023-09-01 3:31:47313 days ago1693539107IN
0x7162629f...eC898Ad20
0.06589218 ETH0.0005227111.51269736
Pay Eth Order179976722023-08-26 8:32:35319 days ago1693038755IN
0x7162629f...eC898Ad20
0.01962937 ETH0.0004968410.94293909
Pay Eth Order179707832023-08-22 14:15:11323 days ago1692713711IN
0x7162629f...eC898Ad20
0.03951524 ETH0.00587276129.34752147
Pay Eth Order179355502023-08-17 15:52:11328 days ago1692287531IN
0x7162629f...eC898Ad20
0.01565477 ETH0.0033419573.60652491
Pay Eth Order179352502023-08-17 14:51:23328 days ago1692283883IN
0x7162629f...eC898Ad20
0.00614245 ETH0.0014653932.27535874
Pay Eth Order179295212023-08-16 19:37:59328 days ago1692214679IN
0x7162629f...eC898Ad20
0.03000427 ETH0.0016489936.31911474
Pay Eth Order178726972023-08-08 20:51:23336 days ago1691527883IN
0x7162629f...eC898Ad20
0.01471179 ETH0.001228327.05333282
Pay Eth Order178372532023-08-03 21:49:47341 days ago1691099387IN
0x7162629f...eC898Ad20
0.00594321 ETH0.0009378620.65642531
Pay Eth Order178365862023-08-03 19:34:59341 days ago1691091299IN
0x7162629f...eC898Ad20
0.00297034 ETH0.0015008433.05598646
Pay Eth Order178245772023-08-02 3:18:11343 days ago1690946291IN
0x7162629f...eC898Ad20
0.01766416 ETH0.0007271916.01635902
Pay Eth Order178147952023-07-31 18:30:59345 days ago1690828259IN
0x7162629f...eC898Ad20
0.02313483 ETH0.0013674630.11842201
Pay Eth Order178134162023-07-31 13:53:35345 days ago1690811615IN
0x7162629f...eC898Ad20
0.05322789 ETH0.0011553525.44669183
Pay Eth Order177990042023-07-29 13:30:35347 days ago1690637435IN
0x7162629f...eC898Ad20
0.0264892 ETH0.0012018626.47102476
Pay Eth Order177858982023-07-27 17:29:23349 days ago1690478963IN
0x7162629f...eC898Ad20
0.02501967 ETH0.0026088157.45918133
Pay Eth Order177845552023-07-27 12:59:47349 days ago1690462787IN
0x7162629f...eC898Ad20
0.00589255 ETH0.0009189920.24610315
Pay Eth Order177448972023-07-21 23:49:23354 days ago1689983363IN
0x7162629f...eC898Ad20
0.01765703 ETH0.0009863421.72422373
View all transactions

Latest 11 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
183689622023-10-17 8:40:59267 days ago1697532059
0x7162629f...eC898Ad20
1.98101458 ETH
135050262021-10-28 9:52:56986 days ago1635414776
0x7162629f...eC898Ad20
1.28238398 ETH
131726692021-09-06 14:21:151038 days ago1630938075
0x7162629f...eC898Ad20
118.13931542 ETH
131083212021-08-27 15:52:131048 days ago1630079533
0x7162629f...eC898Ad20
152.28767265 ETH
129411122021-08-01 18:02:421074 days ago1627840962
0x7162629f...eC898Ad20
65.61857487 ETH
128944222021-07-25 8:42:151081 days ago1627202535
0x7162629f...eC898Ad20
84.69430749 ETH
127225142021-06-28 12:26:531108 days ago1624883213
0x7162629f...eC898Ad20
4.7923075 ETH
125410652021-05-31 8:27:021136 days ago1622449622
0x7162629f...eC898Ad20
0.90528768 ETH
124720212021-05-20 15:12:281147 days ago1621523548
0x7162629f...eC898Ad20
5.63411423 ETH
123179592021-04-26 19:47:071170 days ago1619466427
0x7162629f...eC898Ad20
0.08654372 ETH
123170092021-04-26 16:17:471171 days ago1619453867
0x7162629f...eC898Ad20
0.00301745 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultiSigEthPayments

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-26
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

/**
    Note: The ERC-165 identifier for this interface is 0x4e2312e0.
*/
interface IERC1155TokenReceiver {
    /**
        @notice Handle the receipt of a single ERC1155 token type.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated.
        This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61) if it accepts the transfer.
        This function MUST revert if it rejects the transfer.
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _id        The ID of the token being transferred
        @param _value     The amount of tokens being transferred
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    */
    function onERC1155Received(
        address _operator,
        address _from,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external returns (bytes4);

    /**
        @notice Handle the receipt of multiple ERC1155 token types.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated.
        This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81) if it accepts the transfer(s).
        This function MUST revert if it rejects the transfer(s).
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the batch transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _ids       An array containing ids of each token being transferred (order and length must match _values array)
        @param _values    An array containing amounts of each token being transferred (order and length must match _ids array)
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    */
    function onERC1155BatchReceived(
        address _operator,
        address _from,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external returns (bytes4);
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/// @author Stefan George - <[email protected]> - adjusted by the Calystral Team
/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
interface IMultiSigEthAdmin is IERC1155TokenReceiver, IERC165 {
    /*==============================
    =           EVENTS             =
    ==============================*/
    event Confirmation(address indexed sender, uint256 indexed transactionId);
    event Revocation(address indexed sender, uint256 indexed transactionId);
    event Submission(uint256 indexed transactionId);
    event Execution(uint256 indexed transactionId);
    event ExecutionFailure(uint256 indexed transactionId);
    event Deposit(address indexed sender, uint256 value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint256 required);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /// @dev Fallback function allows to deposit ether.
    receive() external payable;

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return transactionId transactionId Returns transaction ID.
    function submitTransaction(
        address destination,
        uint256 value,
        bytes memory data
    ) external returns (uint256 transactionId);

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner) external;

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner) external;

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param newOwner Address of new owner.
    function replaceOwner(address owner, address newOwner) external;

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint256 _required) external;

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint256 transactionId) external;

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint256 transactionId) external;

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint256 transactionId) external;

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return isConfirmed Confirmation status.
    function isConfirmed(uint256 transactionId) external view returns (bool);

    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return count Number of confirmations.
    function getConfirmationCount(uint256 transactionId)
        external
        view
        returns (uint256 count);

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return count Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        external
        view
        returns (uint256 count);

    /// @dev Returns list of owners.
    /// @return owners List of owner addresses.
    function getOwners() external view returns (address[] memory);

    /// @dev Returns the amount of required confirmations.
    /// @return required Amount of required confirmations.
    function getRequired() external view returns (uint256);

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return _confirmations Returns array of owner addresses.
    function getConfirmations(uint256 transactionId)
        external
        view
        returns (address[] memory _confirmations);

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return _transactionIds Returns array of transaction IDs.
    function getTransactionIds(
        uint256 from,
        uint256 to,
        bool pending,
        bool executed
    ) external view returns (uint256[] memory _transactionIds);
}

/// @title Multisignature Payments wallet for Ethereum
/// @author The Calystral Team
interface IMultiSigEthPayments is IMultiSigEthAdmin {
    /*==============================
    =            EVENTS            =
    ==============================*/
    /**
        @dev MUST emit when a token allowance changes.
        The `tokenAddress` argument MUST be the token address.
        The `allowed` argument MUST be the allowance.
    */
    event OnTokenUpdate(address indexed tokenAddress, bool allowed);
    /**
        @dev MUST emit when the withdraw address changes.
        The `withdrawAddress` argument MUST be the withdraw address.
    */
    event OnWithdrawAddressUpdate(address withdrawAddress);
    /**
        @dev MUST emit when an is payed with ETH.
        The `orderId` argument MUST be the orderId.
        The `amount` argument MUST be the amount payed in WEI.
    */
    event OnPayedEthOrder(uint256 indexed orderId, uint256 amount);
    /**
        @dev MUST emit when an is payed with a token.
        The `orderId` argument MUST be the orderId.
        The `tokenAddress` argument MUST be the token's contract address.
        The `amount` argument MUST be the amount payed in full DECIMALS of the token.
    */
    event OnPayedTokenOrder(
        uint256 indexed orderId,
        address indexed tokenAddress,
        uint256 amount
    );
    /**
        @dev MUST emit when ETH is withdrawn through withdraw function.
        The `receiver` argument MUST be the receiving address.
        The `amount` argument MUST be the amount payed in WEI.
    */
    event OnEthWithdraw(address indexed receiver, uint256 amount);
    /**
        @dev MUST emit when a token is withdrawn through withdrawToken function.
        The `receiver` argument MUST be the receiving address.
        The `tokenAddress` argument MUST be the token's contract address.
        The `amount` argument MUST be the amount payed in full DECIMALS of the token.
    */
    event OnTokenWithdraw(
        address indexed receiver,
        address indexed tokenAddress,
        uint256 amount
    );

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Used to pay an open order with ETH.
        @dev Payable function used to pay a created order in ETH. 
        @param orderId The orderId
    */
    function payEthOrder(uint256 orderId) external payable;

    /**
        @notice Used to pay an open order with an allowed ERC20 token.
        @dev Used to pay a created order with an allowed ERC20 token.
        @param orderId      The orderId
        @param tokenAddress The smart contract address of the ERC20 token
        @param amount       The amount of tokens payed
    */
    function payTokenOrder(
        uint256 orderId,
        address tokenAddress,
        uint256 amount
    ) external;

    /**
        @notice Adds or removes a specific ERC20 token for payments.
        @dev Adds or removes the address of an ERC20 contract for valid payment options.
        @param tokenAddress The smart contract address of the ERC20 token
        @param allowed      True or False as the allowence
    */
    function updateAllowedToken(address tokenAddress, bool allowed) external;

    /**
        @notice Withdraws ETH to the specified withdraw address.
        @dev Withdraws ETH to the specified `_withdrawAddress`.
    */
    function withdraw() external;

    /**
        @notice Withdraws a token to the specified withdraw address.
        @dev Withdraws a token to the specified `_withdrawAddress`.
        @param tokenAddress The smart contract address of the ERC20 token
    */
    function withdrawToken(address tokenAddress) external;

    /**
        @notice Updated the withdraw address.
        @dev Updates `_withdrawAddress`.
        @param withdrawAddress The withdraw address
    */
    function updateWithdrawAddress(address payable withdrawAddress) external;

    /**
        @notice Used to check if a specific token is allowed providing the token's contract address.
        @dev Used to check if a specific token is allowed providing the token's contract address.
        @param tokenAddress The smart contract address of the ERC20 token
        @return             Returns True or False
    */
    function isTokenAllowed(address tokenAddress) external view returns (bool);

    /**
        @notice Used to check if a specific order is payed already by orderId.
        @dev Used to check if a specific order is payed already by orderId.
        @param orderId  The orderId
        @return         Returns True or False
    */
    function isOrderIdExecuted(uint256 orderId) external view returns (bool);

    /**
        @notice Gets the withdraw address.
        @dev Gets the `_withdrawAddress`.
        @return Returns the withdraw address
    */
    function getWithdrawAddress() external view returns (address);
}

/**
    Note: Simple contract to use as base for const vals
*/
contract CommonConstants {
    bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/// @author Stefan George - <[email protected]> - adjusted by the Calystral Team
/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
contract MultiSigEthAdmin is IMultiSigEthAdmin, ERC165, CommonConstants {
    /*==============================
    =          CONSTANTS           =
    ==============================*/
    uint256 public constant MAX_OWNER_COUNT = 50;

    /*==============================
    =            STORAGE           =
    ==============================*/
    mapping(uint256 => Transaction) public transactions;
    mapping(uint256 => mapping(address => bool)) public confirmations;
    mapping(address => bool) public isOwner;
    address[] public owners;
    uint256 public required;
    uint256 public transactionCount;

    struct Transaction {
        address destination;
        uint256 value;
        bytes data;
        bool executed;
    }

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isAuthorizedWallet() {
        require(
            msg.sender == address(this),
            "Can only be executed by the wallet contract itself."
        );
        _;
    }

    modifier isAuthorizedOwner(address owner) {
        require(isOwner[owner], "This address is not an owner.");
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        require(!isOwner[owner], "This address is an owner.");
        _;
    }

    modifier transactionExists(uint256 transactionId) {
        require(
            transactions[transactionId].destination != address(0x0),
            "The transaction destination does not exist."
        );
        _;
    }

    modifier confirmed(uint256 transactionId, address owner) {
        require(
            confirmations[transactionId][owner],
            "The owner did not confirm this transactionId yet."
        );
        _;
    }

    modifier notConfirmed(uint256 transactionId, address owner) {
        require(
            !confirmations[transactionId][owner],
            "This owner did confirm this transactionId already."
        );
        _;
    }

    modifier notExecuted(uint256 transactionId) {
        require(
            !transactions[transactionId].executed,
            "This transactionId is executed already."
        );
        _;
    }

    modifier notNull(address _address) {
        require(_address != address(0x0), "The zero-address is not allowed.");
        _;
    }

    modifier validRequirement(uint256 ownerCount, uint256 _required) {
        require(
            ownerCount <= MAX_OWNER_COUNT &&
                _required <= ownerCount &&
                _required != 0 &&
                ownerCount != 0,
            "This change in requirement is not allowed."
        );
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    constructor(address[] memory _owners, uint256 _required)
        validRequirement(_owners.length, _required)
    {
        for (uint256 i = 0; i < _owners.length; i++) {
            require(
                !isOwner[_owners[i]] && _owners[i] != address(0x0),
                "An owner address is included multiple times or as the zero-address."
            );
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;

        _registerInterface(type(IERC1155TokenReceiver).interfaceId); // 0x4e2312e0
        _registerInterface(type(IMultiSigEthAdmin).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/
    receive() external payable override {
        if (msg.value > 0) {
            emit Deposit(msg.sender, msg.value);
        }
    }

    function submitTransaction(
        address destination,
        uint256 value,
        bytes memory data
    ) public override returns (uint256 transactionId) {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function addOwner(address owner)
        public
        override
        isAuthorizedWallet()
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        emit OwnerAddition(owner);
    }

    function removeOwner(address owner)
        public
        override
        isAuthorizedWallet()
        isAuthorizedOwner(owner)
    {
        isOwner[owner] = false;
        for (uint256 i = 0; i < owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.pop(); //owners.length -= 1;
        if (required > owners.length) changeRequirement(owners.length);
        emit OwnerRemoval(owner);
    }

    function replaceOwner(address owner, address newOwner)
        public
        override
        isAuthorizedWallet()
        isAuthorizedOwner(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint256 i = 0; i < owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        emit OwnerRemoval(owner);
        emit OwnerAddition(newOwner);
    }

    function changeRequirement(uint256 _required)
        public
        override
        isAuthorizedWallet()
        validRequirement(owners.length, _required)
    {
        required = _required;
        emit RequirementChange(_required);
    }

    function confirmTransaction(uint256 transactionId)
        public
        override
        isAuthorizedOwner(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        emit Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    function revokeConfirmation(uint256 transactionId)
        public
        override
        isAuthorizedOwner(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        emit Revocation(msg.sender, transactionId);
    }

    function executeTransaction(uint256 transactionId)
        public
        override
        isAuthorizedOwner(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction storage txn = transactions[transactionId];
            txn.executed = true;
            if (
                external_call(
                    txn.destination,
                    txn.value,
                    txn.data.length,
                    txn.data
                )
            ) {
                emit Execution(transactionId);
            } else {
                emit ExecutionFailure(transactionId);
                txn.executed = false;
            }
        }
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function isConfirmed(uint256 transactionId)
        public
        view
        override
        returns (bool)
    {
        uint256 count = 0;
        for (uint256 i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) count += 1;
            if (count == required) return true;
        }
        return false;
    }

    function getConfirmationCount(uint256 transactionId)
        public
        view
        override
        returns (uint256 count)
    {
        for (uint256 i = 0; i < owners.length; i++)
            if (confirmations[transactionId][owners[i]]) count += 1;
    }

    function getTransactionCount(bool pending, bool executed)
        public
        view
        override
        returns (uint256 count)
    {
        for (uint256 i = 0; i < transactionCount; i++)
            if (
                (pending && !transactions[i].executed) ||
                (executed && transactions[i].executed)
            ) count += 1;
    }

    function getOwners() public view override returns (address[] memory) {
        return owners;
    }

    function getRequired() public view override returns (uint256) {
        return required;
    }

    function getConfirmations(uint256 transactionId)
        public
        view
        override
        returns (address[] memory _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint256 count = 0;
        uint256 i;
        for (i = 0; i < owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i];
    }

    function getTransactionIds(
        uint256 from,
        uint256 to,
        bool pending,
        bool executed
    ) public view override returns (uint256[] memory _transactionIds) {
        uint256[] memory transactionIdsTemp = new uint256[](transactionCount);
        uint256 count = 0;
        uint256 i;
        for (i = 0; i < transactionCount; i++)
            if (
                (pending && !transactions[i].executed) ||
                (executed && transactions[i].executed)
            ) {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint256[](to - from);
        for (i = from; i < to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external pure override returns (bytes4) {
        return ERC1155_ACCEPTED;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external pure override returns (bytes4) {
        return ERC1155_BATCH_ACCEPTED;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    // call has been separated into its own function in order to take advantage
    // of the Solidity's code generator to produce a loop that copies tx.data into memory.
    function external_call(
        address destination,
        uint256 value,
        uint256 dataLength,
        bytes memory data
    ) internal returns (bool) {
        bool result;
        assembly {
            let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention)
            let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
            result := call(
                sub(gas(), 34710), // 34710 is the value that solidity is currently emitting
                // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
                // callNewAccountGas (25000, in case the destination address does not exist and needs creating)
                destination,
                value,
                d,
                dataLength, // Size of the input (in bytes) - this is what fixes the padding problem
                x,
                0 // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return transactionId Returns transaction ID.
    function addTransaction(
        address destination,
        uint256 value,
        bytes memory data
    ) internal notNull(destination) returns (uint256 transactionId) {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        emit Submission(transactionId);
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/// @title Multisignature Payments wallet for Ethereum
/// @author The Calystral Team
contract MultiSigEthPayments is IMultiSigEthPayments, MultiSigEthAdmin {
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev token address => allowance
    mapping(address => bool) private _tokenAddressIsAllowed;
    /// @dev orderId => execution
    mapping(uint256 => bool) private _orderIdIsExecuted;
    /// @dev The address where any withdraw value is send to
    address payable private _withdrawAddress;

    /*==============================
    =          MODIFIERS           =
    ==============================*/

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param allowedTokens List of allowed tokens.
    /// @param _required Number of required confirmations.
    /// @param withdrawAddress The withdraw address.
    constructor(
        address[] memory _owners,
        address[] memory allowedTokens,
        uint256 _required,
        address payable withdrawAddress
    ) MultiSigEthAdmin(_owners, _required) {
        require(
            withdrawAddress != address(0),
            "A withdraw address is required"
        );

        for (uint256 index = 0; index < allowedTokens.length; index++) {
            _updateAllowedToken(allowedTokens[index], true);
        }

        _updateWithdrawAddress(withdrawAddress);

        _registerInterface(type(IMultiSigEthPayments).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/
    function payEthOrder(uint256 orderId) external payable override {
        require(
            !_orderIdIsExecuted[orderId],
            "This order is executed already."
        );
        _orderIdIsExecuted[orderId] = true;
        OnPayedEthOrder(orderId, msg.value);
    }

    function payTokenOrder(
        uint256 orderId,
        address tokenAddress,
        uint256 amount
    ) external override {
        require(
            _tokenAddressIsAllowed[tokenAddress],
            "This token is not allowed."
        );
        require(
            !_orderIdIsExecuted[orderId],
            "This order is executed already."
        );
        IERC20 tokenContract = IERC20(tokenAddress);

        bool success =
            tokenContract.transferFrom(msg.sender, address(this), amount);
        require(success, "Paying the order with tokens failed.");

        _orderIdIsExecuted[orderId] = true;
        OnPayedTokenOrder(orderId, tokenAddress, amount);
    }

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function updateAllowedToken(address tokenAddress, bool allowed)
        public
        override
        isAuthorizedWallet()
    {
        _updateAllowedToken(tokenAddress, allowed);
    }

    function updateWithdrawAddress(address payable withdrawAddress)
        public
        override
        isAuthorizedWallet()
    {
        _updateWithdrawAddress(withdrawAddress);
    }

    function withdraw() external override isAuthorizedOwner(msg.sender) {
        uint256 amount = address(this).balance;
        _withdrawAddress.transfer(amount);

        emit OnEthWithdraw(_withdrawAddress, amount);
    }

    function withdrawToken(address tokenAddress)
        external
        override
        isAuthorizedOwner(msg.sender)
    {
        IERC20 erc20Contract = IERC20(tokenAddress);
        uint256 amount = erc20Contract.balanceOf(address(this));
        erc20Contract.transfer(_withdrawAddress, amount);

        emit OnTokenWithdraw(_withdrawAddress, tokenAddress, amount);
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function isTokenAllowed(address tokenAddress)
        public
        view
        override
        returns (bool)
    {
        return _tokenAddressIsAllowed[tokenAddress];
    }

    function isOrderIdExecuted(uint256 orderId)
        public
        view
        override
        returns (bool)
    {
        return _orderIdIsExecuted[orderId];
    }

    function getWithdrawAddress() public view override returns (address) {
        return _withdrawAddress;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    function _updateWithdrawAddress(address payable withdrawAddress) private {
        _withdrawAddress = withdrawAddress;
        OnWithdrawAddressUpdate(withdrawAddress);
    }

    function _updateAllowedToken(address tokenAddress, bool allowed) private {
        _tokenAddressIsAllowed[tokenAddress] = allowed;
        OnTokenUpdate(tokenAddress, allowed);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"address[]","name":"allowedTokens","type":"address[]"},{"internalType":"uint256","name":"_required","type":"uint256"},{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Execution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnEthWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnPayedEthOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnPayedTokenOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"OnTokenUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnTokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"}],"name":"OnWithdrawAddressUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"required","type":"uint256"}],"name":"RequirementChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Revocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Submission","type":"event"},{"inputs":[],"name":"MAX_OWNER_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"addOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_required","type":"uint256"}],"name":"changeRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"confirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"executeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmationCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmations","outputs":[{"internalType":"address[]","name":"_confirmations","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionIds","outputs":[{"internalType":"uint256[]","name":"_transactionIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"isOrderIdExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"isTokenAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"payEthOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payTokenOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"replaceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"required","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"updateAllowedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"updateWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620034fb380380620034fb833981016040819052620000349162000601565b8382620000486301ffc9a760e01b6200038b565b815181603282111580156200005d5750818111155b80156200006957508015155b80156200007557508115155b620000da5760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f6044820152693a1030b63637bbb2b21760b11b60648201526084015b60405180910390fd5b60005b84518110156200026a57600360008683815181106200010c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161580156200017c575060006001600160a01b03168582815181106200016857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b620001fc5760405162461bcd60e51b815260206004820152604360248201527f416e206f776e6572206164647265737320697320696e636c75646564206d756c60448201527f7469706c652074696d6573206f7220617320746865207a65726f2d616464726560648201526239b99760e91b608482015260a401620000d1565b6001600360008784815181106200022357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620002618162000686565b915050620000dd565b50835162000280906004906020870190620004bf565b50600583905562000298630271189760e51b6200038b565b620002aa633fbd7d3b60e21b6200038b565b505050506001600160a01b038116620003065760405162461bcd60e51b815260206004820152601e60248201527f41207769746864726177206164647265737320697320726571756972656400006044820152606401620000d1565b60005b835181101562000363576200034e8482815181106200033857634e487b7160e01b600052603260045260246000fd5b602002602001015160016200040c60201b60201c565b806200035a8162000686565b91505062000309565b506200036f816200046b565b62000381636feab71f60e01b6200038b565b50505050620006dd565b6001600160e01b03198082161415620003e75760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401620000d1565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915591519182527f13362eeee30560397ac30f32fd5beb0392582868bc10dc6cfca1b73e2d832d9d910160405180910390a25050565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527fc0525b5837156cf0d3bcf4e2735ef832bcf6c0a36ab8f8bc445aeb9b341582d49060200160405180910390a150565b82805482825590600052602060002090810192821562000517579160200282015b828111156200051757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620004e0565b506200052592915062000529565b5090565b5b808211156200052557600081556001016200052a565b80516200054d81620006c4565b919050565b600082601f83011262000563578081fd5b815160206001600160401b0380831115620005825762000582620006ae565b818302604051601f19603f83011681018181108482111715620005a957620005a9620006ae565b60405284815283810192508684018288018501891015620005c8578687fd5b8692505b85831015620005f557620005e08162000540565b845292840192600192909201918401620005cc565b50979650505050505050565b6000806000806080858703121562000617578384fd5b84516001600160401b03808211156200062e578586fd5b6200063c8883890162000552565b9550602087015191508082111562000652578485fd5b50620006618782880162000552565b9350506040850151915060608501516200067b81620006c4565b939692955090935050565b6000600019821415620006a757634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114620006da57600080fd5b50565b612e0e80620006ed6000396000f3fe60806040526004361061021d5760003560e01c80639ace38c21161011d578063c01a8c84116100b0578063e20056e61161007f578063ee22610b11610064578063ee22610b146106eb578063f23a6e611461070b578063f9eaee0d1461075157610260565b8063e20056e6146106ad578063e8e7f800146106cd57610260565b8063c01a8c8414610642578063c642747414610662578063d74f8edd14610682578063dc8452cd1461069757610260565b8063b5dc40c3116100ec578063b5dc40c314610573578063b77bf60014610593578063ba51a6df146105a9578063bc197c81146105c957610260565b80639ace38c2146104d4578063a0e67e2b14610504578063a3f4b57314610526578063a8abe69a1461054657610260565b80633ccfd60b116101b05780637065cb481161017f578063784547a711610164578063784547a71461047457806389476069146104945780638b51d13f146104b457610260565b80637065cb4814610434578063715489b41461045457610260565b80633ccfd60b146103cc57806342013897146103e157806354741525146104015780636f00383a1461042157610260565b806320ea8d86116101ec57806320ea8d86146103115780632f54bf6e146103315780633411c81c1461036157806334ce2b1a1461039c57610260565b806301ffc9a714610265578063025e7c271461029a5780631398a5f6146102d2578063173825d9146102f157610260565b3661026057341561025e5760405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25b005b600080fd5b34801561027157600080fd5b50610285610280366004612af6565b61078a565b60405190151581526020015b60405180910390f35b3480156102a657600080fd5b506102ba6102b5366004612b36565b6107c5565b6040516001600160a01b039091168152602001610291565b3480156102de57600080fd5b506005545b604051908152602001610291565b3480156102fd57600080fd5b5061025e61030c36600461283f565b6107ef565b34801561031d57600080fd5b5061025e61032c366004612b36565b610a92565b34801561033d57600080fd5b5061028561034c36600461283f565b60036020526000908152604090205460ff1681565b34801561036d57600080fd5b5061028561037c366004612b66565b600260209081526000928352604080842090915290825290205460ff1681565b3480156103a857600080fd5b506102856103b7366004612b36565b60009081526008602052604090205460ff1690565b3480156103d857600080fd5b5061025e610c47565b3480156103ed57600080fd5b5061025e6103fc366004612b8a565b610d28565b34801561040d57600080fd5b506102e361041c366004612ad9565b610f6e565b61025e61042f366004612b36565b610feb565b34801561044057600080fd5b5061025e61044f36600461283f565b6110a2565b34801561046057600080fd5b5061025e61046f3660046129c8565b611316565b34801561048057600080fd5b5061028561048f366004612b36565b61138f565b3480156104a057600080fd5b5061025e6104af36600461283f565b61143d565b3480156104c057600080fd5b506102e36104cf366004612b36565b61161d565b3480156104e057600080fd5b506104f46104ef366004612b36565b6116b1565b6040516102919493929190612c0a565b34801561051057600080fd5b50610519611772565b6040516102919190612c85565b34801561053257600080fd5b5061025e61054136600461283f565b6117d4565b34801561055257600080fd5b50610566610561366004612bc1565b61184b565b6040516102919190612cd2565b34801561057f57600080fd5b5061051961058e366004612b36565b611a29565b34801561059f57600080fd5b506102e360065481565b3480156105b557600080fd5b5061025e6105c4366004612b36565b611c63565b3480156105d557600080fd5b506106116105e4366004612893565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610291565b34801561064e57600080fd5b5061025e61065d366004612b36565b611da8565b34801561066e57600080fd5b506102e361067d3660046129f5565b611f82565b34801561068e57600080fd5b506102e3603281565b3480156106a357600080fd5b506102e360055481565b3480156106b957600080fd5b5061025e6106c836600461285b565b611fa1565b3480156106d957600080fd5b506009546001600160a01b03166102ba565b3480156106f757600080fd5b5061025e610706366004612b36565b612235565b34801561071757600080fd5b5061061161072636600461294e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561075d57600080fd5b5061028561076c36600461283f565b6001600160a01b031660009081526007602052604090205460ff1690565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b600481815481106107d557600080fd5b6000918252602090912001546001600160a01b0316905081565b33301461085f5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b60648201526084015b60405180910390fd5b6001600160a01b038116600090815260036020526040902054819060ff166108c95760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b6001600160a01b0382166000908152600360205260408120805460ff191690555b6004546108f990600190612d22565b8110156109f357826001600160a01b03166004828154811061092b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156109e1576004805461095690600190612d22565b8154811061097457634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600480546001600160a01b0390921691839081106109ae57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506109f3565b806109eb81612d6e565b9150506108ea565b506004805480610a1357634e487b7160e01b600052603160045260246000fd5b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190556004546005541115610a5a57600454610a5a90611c63565b6040516001600160a01b038316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526003602052604090205460ff16610af15760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60008281526002602090815260408083203380855292529091205483919060ff16610b845760405162461bcd60e51b815260206004820152603160248201527f546865206f776e657220646964206e6f7420636f6e6669726d2074686973207460448201527f72616e73616374696f6e4964207965742e0000000000000000000000000000006064820152608401610856565b600084815260016020526040902060030154849060ff1615610bf85760405162461bcd60e51b815260206004820152602760248201527f54686973207472616e73616374696f6e49642069732065786563757465642061604482015266363932b0b23c9760c91b6064820152608401610856565b6000858152600260209081526040808320338085529252808320805460ff191690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b3360008181526003602052604090205460ff16610ca65760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60095460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610ce0573d6000803e3d6000fd5b506009546040518281526001600160a01b03909116907f467c3e0e755faea08e1553e4da10e9591378c4783d6d35f274e621b47ffddfe1906020015b60405180910390a25050565b6001600160a01b03821660009081526007602052604090205460ff16610d905760405162461bcd60e51b815260206004820152601a60248201527f5468697320746f6b656e206973206e6f7420616c6c6f7765642e0000000000006044820152606401610856565b60008381526008602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601f60248201527f54686973206f7264657220697320657865637574656420616c72656164792e006044820152606401610856565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905282906000906001600160a01b038316906323b872dd90606401602060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190612abd565b905080610f075760405162461bcd60e51b8152602060048201526024808201527f506179696e6720746865206f72646572207769746820746f6b656e732066616960448201527f6c65642e000000000000000000000000000000000000000000000000000000006064820152608401610856565b60008581526008602052604090819020805460ff19166001179055516001600160a01b0385169086907fdf6c11ebc9c2bda4f52003405af401b8283c6f4abfbd5db3233f74c5b8bb57f690610f5f9087815260200190565b60405180910390a35050505050565b6000805b600654811015610fe457838015610f9b575060008181526001602052604090206003015460ff16155b80610fbf5750828015610fbf575060008181526001602052604090206003015460ff165b15610fd257610fcf600183612d0a565b91505b80610fdc81612d6e565b915050610f72565b5092915050565b60008181526008602052604090205460ff161561104a5760405162461bcd60e51b815260206004820152601f60248201527f54686973206f7264657220697320657865637574656420616c72656164792e006044820152606401610856565b60008181526008602052604090819020805460ff191660011790555181907f2e21ab849a62bf3265688f4b25fa50644c694811607bb44cdb6fcad98a7c9562906110979034815260200190565b60405180910390a250565b33301461110d5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b6001600160a01b038116600090815260036020526040902054819060ff16156111785760405162461bcd60e51b815260206004820152601960248201527f54686973206164647265737320697320616e206f776e65722e000000000000006044820152606401610856565b816001600160a01b0381166111cf5760405162461bcd60e51b815260206004820181905260248201527f546865207a65726f2d61646472657373206973206e6f7420616c6c6f7765642e6044820152606401610856565b6004546111dd906001612d0a565b600554603282111580156111f15750818111155b80156111fc57508015155b801561120757508115155b6112795760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f60448201527f7420616c6c6f7765642e000000000000000000000000000000000000000000006064820152608401610856565b6001600160a01b038516600081815260036020526040808220805460ff1916600190811790915560048054918201815583527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805473ffffffffffffffffffffffffffffffffffffffff191684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b3330146113815760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b61138b82826124fa565b5050565b600080805b60045481101561143357600084815260026020526040812060048054919291849081106113d157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561140c57611409600183612d0a565b91505b600554821415611421576001925050506107c0565b8061142b81612d6e565b915050611394565b5060009392505050565b3360008181526003602052604090205460ff1661149c5760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282906000906001600160a01b038316906370a082319060240160206040518083038186803b1580156114f957600080fd5b505afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115319190612b4e565b6009546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561159a57600080fd5b505af11580156115ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d29190612abd565b506009546040518281526001600160a01b038681169216907fead62a0895e2f4028883bce189e7f527dd9fc82732d0a40bb6c5a6e1b97c1cb59060200160405180910390a350505050565b6000805b6004548110156116ab576000838152600260205260408120600480549192918490811061165e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561169957611696600183612d0a565b91505b806116a381612d6e565b915050611621565b50919050565b60016020819052600091825260409091208054918101546002820180546001600160a01b03909416939192916116e690612d39565b80601f016020809104026020016040519081016040528092919081815260200182805461171290612d39565b801561175f5780601f106117345761010080835404028352916020019161175f565b820191906000526020600020905b81548152906001019060200180831161174257829003601f168201915b5050506003909301549192505060ff1684565b606060048054806020026020016040519081016040528092919081815260200182805480156117ca57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117ac575b5050505050905090565b33301461183f5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b61184881612552565b50565b6060600060065467ffffffffffffffff81111561187857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156118a1578160200160208202803683370190505b5090506000805b600654811015611946578580156118d1575060008181526001602052604090206003015460ff16155b806118f557508480156118f5575060008181526001602052604090206003015460ff165b15611934578083838151811061191b57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611931600183612d0a565b91505b8061193e81612d6e565b9150506118a8565b6119508888612d22565b67ffffffffffffffff81111561197657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561199f578160200160208202803683370190505b5093508790505b86811015611a1e578281815181106119ce57634e487b7160e01b600052603260045260246000fd5b60200260200101518489836119e39190612d22565b81518110611a0157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611a1681612d6e565b9150506119a6565b505050949350505050565b60045460609060009067ffffffffffffffff811115611a5857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a81578160200160208202803683370190505b5090506000805b600454811015611b895760008581526002602052604081206004805491929184908110611ac557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615611b775760048181548110611b1357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611b5157634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611b74600183612d0a565b91505b80611b8181612d6e565b915050611a88565b8167ffffffffffffffff811115611bb057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611bd9578160200160208202803683370190505b509350600090505b81811015611c5b57828181518110611c0957634e487b7160e01b600052603260045260246000fd5b6020026020010151848281518110611c3157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280611c5381612d6e565b915050611be1565b505050919050565b333014611cce5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b6004548160328211801590611ce35750818111155b8015611cee57508015155b8015611cf957508115155b611d6b5760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f60448201527f7420616c6c6f7765642e000000000000000000000000000000000000000000006064820152608401610856565b60058390556040518381527fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9060200160405180910390a1505050565b3360008181526003602052604090205460ff16611e075760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60008281526001602052604090205482906001600160a01b0316611e935760405162461bcd60e51b815260206004820152602b60248201527f546865207472616e73616374696f6e2064657374696e6174696f6e20646f657360448201527f206e6f742065786973742e0000000000000000000000000000000000000000006064820152608401610856565b60008381526002602090815260408083203380855292529091205484919060ff1615611f275760405162461bcd60e51b815260206004820152603260248201527f54686973206f776e65722064696420636f6e6669726d2074686973207472616e60448201527f73616374696f6e496420616c72656164792e00000000000000000000000000006064820152608401610856565b6000858152600260209081526040808320338085529252808320805460ff191660011790555187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a3611f7b85612235565b5050505050565b6000611f8f8484846125b3565b9050611f9a81611da8565b9392505050565b33301461200c5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b6001600160a01b038216600090815260036020526040902054829060ff166120765760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b6001600160a01b038216600090815260036020526040902054829060ff16156120e15760405162461bcd60e51b815260206004820152601960248201527f54686973206164647265737320697320616e206f776e65722e000000000000006044820152606401610856565b60005b60045481101561219b57846001600160a01b03166004828154811061211957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141561218957836004828154811061215657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061219b565b8061219381612d6e565b9150506120e4565b506001600160a01b03808516600081815260036020526040808220805460ff1990811690915593871682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a26040516001600160a01b038416907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a250505050565b3360008181526003602052604090205460ff166122945760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60008281526002602090815260408083203380855292529091205483919060ff166123275760405162461bcd60e51b815260206004820152603160248201527f546865206f776e657220646964206e6f7420636f6e6669726d2074686973207460448201527f72616e73616374696f6e4964207965742e0000000000000000000000000000006064820152608401610856565b600084815260016020526040902060030154849060ff161561239b5760405162461bcd60e51b815260206004820152602760248201527f54686973207472616e73616374696f6e49642069732065786563757465642061604482015266363932b0b23c9760c91b6064820152608401610856565b6123a48561138f565b15611f7b57600085815260016020819052604090912060038101805460ff1916831790558054918101546002820180549293612485936001600160a01b039091169291906123f190612d39565b905084600201805461240290612d39565b80601f016020809104026020016040519081016040528092919081815260200182805461242e90612d39565b801561247b5780601f106124505761010080835404028352916020019161247b565b820191906000526020600020905b81548152906001019060200180831161245e57829003601f168201915b50505050506126fa565b156124ba5760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26124f2565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038101805460ff191690555b505050505050565b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915591519182527f13362eeee30560397ac30f32fd5beb0392582868bc10dc6cfca1b73e2d832d9d9101610d1c565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fc0525b5837156cf0d3bcf4e2735ef832bcf6c0a36ab8f8bc445aeb9b341582d49060200160405180910390a150565b6000836001600160a01b03811661260c5760405162461bcd60e51b815260206004820181905260248201527f546865207a65726f2d61646472657373206973206e6f7420616c6c6f7765642e6044820152606401610856565b600654604080516080810182526001600160a01b038881168252602080830189815283850189815260006060860181905287815260018085529690208551815473ffffffffffffffffffffffffffffffffffffffff19169516949094178455905194830194909455925180519496509193909261269092600285019291019061271d565b50606091909101516003909101805460ff191691151591909117905560068054600191906000906126c2908490612d0a565b909155505060405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b6000806040516020840160008287838a8c6187965a03f198975050505050505050565b82805461272990612d39565b90600052602060002090601f01602090048101928261274b5760008555612791565b82601f1061276457805160ff1916838001178555612791565b82800160010185558215612791579182015b82811115612791578251825591602001919060010190612776565b5061279d9291506127a1565b5090565b5b8082111561279d57600081556001016127a2565b60008083601f8401126127c7578081fd5b50813567ffffffffffffffff8111156127de578182fd5b60208301915083602080830285010111156127f857600080fd5b9250929050565b60008083601f840112612810578182fd5b50813567ffffffffffffffff811115612827578182fd5b6020830191508360208285010111156127f857600080fd5b600060208284031215612850578081fd5b8135611f9a81612db5565b6000806040838503121561286d578081fd5b823561287881612db5565b9150602083013561288881612db5565b809150509250929050565b60008060008060008060008060a0898b0312156128ae578384fd5b88356128b981612db5565b975060208901356128c981612db5565b9650604089013567ffffffffffffffff808211156128e5578586fd5b6128f18c838d016127b6565b909850965060608b0135915080821115612909578586fd5b6129158c838d016127b6565b909650945060808b013591508082111561292d578384fd5b5061293a8b828c016127ff565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612966578182fd5b863561297181612db5565b9550602087013561298181612db5565b94506040870135935060608701359250608087013567ffffffffffffffff8111156129aa578283fd5b6129b689828a016127ff565b979a9699509497509295939492505050565b600080604083850312156129da578182fd5b82356129e581612db5565b9150602083013561288881612dca565b600080600060608486031215612a09578283fd5b8335612a1481612db5565b925060208401359150604084013567ffffffffffffffff80821115612a37578283fd5b818601915086601f830112612a4a578283fd5b813581811115612a5c57612a5c612d9f565b604051601f8201601f19908116603f01168101908382118183101715612a8457612a84612d9f565b81604052828152896020848701011115612a9c578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600060208284031215612ace578081fd5b8151611f9a81612dca565b60008060408385031215612aeb578182fd5b82356129e581612dca565b600060208284031215612b07578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611f9a578182fd5b600060208284031215612b47578081fd5b5035919050565b600060208284031215612b5f578081fd5b5051919050565b60008060408385031215612b78578182fd5b82359150602083013561288881612db5565b600080600060608486031215612b9e578081fd5b833592506020840135612bb081612db5565b929592945050506040919091013590565b60008060008060808587031215612bd6578182fd5b84359350602085013592506040850135612bef81612dca565b91506060850135612bff81612dca565b939692955090935050565b60006001600160a01b038616825260208581840152608060408401528451806080850152825b81811015612c4c5786810183015185820160a001528201612c30565b81811115612c5d578360a083870101525b50601f01601f1916830160a0019150612c7c9050606083018415159052565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612cc65783516001600160a01b031683529284019291840191600101612ca1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612cc657835183529284019291840191600101612cee565b60008219821115612d1d57612d1d612d89565b500190565b600082821015612d3457612d34612d89565b500390565b600281046001821680612d4d57607f821691505b602082108114156116ab57634e487b7160e01b600052602260045260246000fd5b6000600019821415612d8257612d82612d89565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461184857600080fd5b801515811461184857600080fdfea2646970667358221220fd7c8b006c388fb4a90263e17ef8bcbda249ae6234462bb13152d4070459242e64736f6c634300080200330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001c6c6c588bfe20ae940c86663bf4bc3f9b837d22000000000000000000000000000000000000000000000000000000000000000300000000000000000000000022de936854e40350d01f47724fd047d4de0f26a100000000000000000000000099723a4a9d9b3c3cecba16e2e3ed924abd1d55f6000000000000000000000000b224cb543fa10cf2983c557c029cd874c1ace0cc0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0

Deployed Bytecode

0x60806040526004361061021d5760003560e01c80639ace38c21161011d578063c01a8c84116100b0578063e20056e61161007f578063ee22610b11610064578063ee22610b146106eb578063f23a6e611461070b578063f9eaee0d1461075157610260565b8063e20056e6146106ad578063e8e7f800146106cd57610260565b8063c01a8c8414610642578063c642747414610662578063d74f8edd14610682578063dc8452cd1461069757610260565b8063b5dc40c3116100ec578063b5dc40c314610573578063b77bf60014610593578063ba51a6df146105a9578063bc197c81146105c957610260565b80639ace38c2146104d4578063a0e67e2b14610504578063a3f4b57314610526578063a8abe69a1461054657610260565b80633ccfd60b116101b05780637065cb481161017f578063784547a711610164578063784547a71461047457806389476069146104945780638b51d13f146104b457610260565b80637065cb4814610434578063715489b41461045457610260565b80633ccfd60b146103cc57806342013897146103e157806354741525146104015780636f00383a1461042157610260565b806320ea8d86116101ec57806320ea8d86146103115780632f54bf6e146103315780633411c81c1461036157806334ce2b1a1461039c57610260565b806301ffc9a714610265578063025e7c271461029a5780631398a5f6146102d2578063173825d9146102f157610260565b3661026057341561025e5760405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25b005b600080fd5b34801561027157600080fd5b50610285610280366004612af6565b61078a565b60405190151581526020015b60405180910390f35b3480156102a657600080fd5b506102ba6102b5366004612b36565b6107c5565b6040516001600160a01b039091168152602001610291565b3480156102de57600080fd5b506005545b604051908152602001610291565b3480156102fd57600080fd5b5061025e61030c36600461283f565b6107ef565b34801561031d57600080fd5b5061025e61032c366004612b36565b610a92565b34801561033d57600080fd5b5061028561034c36600461283f565b60036020526000908152604090205460ff1681565b34801561036d57600080fd5b5061028561037c366004612b66565b600260209081526000928352604080842090915290825290205460ff1681565b3480156103a857600080fd5b506102856103b7366004612b36565b60009081526008602052604090205460ff1690565b3480156103d857600080fd5b5061025e610c47565b3480156103ed57600080fd5b5061025e6103fc366004612b8a565b610d28565b34801561040d57600080fd5b506102e361041c366004612ad9565b610f6e565b61025e61042f366004612b36565b610feb565b34801561044057600080fd5b5061025e61044f36600461283f565b6110a2565b34801561046057600080fd5b5061025e61046f3660046129c8565b611316565b34801561048057600080fd5b5061028561048f366004612b36565b61138f565b3480156104a057600080fd5b5061025e6104af36600461283f565b61143d565b3480156104c057600080fd5b506102e36104cf366004612b36565b61161d565b3480156104e057600080fd5b506104f46104ef366004612b36565b6116b1565b6040516102919493929190612c0a565b34801561051057600080fd5b50610519611772565b6040516102919190612c85565b34801561053257600080fd5b5061025e61054136600461283f565b6117d4565b34801561055257600080fd5b50610566610561366004612bc1565b61184b565b6040516102919190612cd2565b34801561057f57600080fd5b5061051961058e366004612b36565b611a29565b34801561059f57600080fd5b506102e360065481565b3480156105b557600080fd5b5061025e6105c4366004612b36565b611c63565b3480156105d557600080fd5b506106116105e4366004612893565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610291565b34801561064e57600080fd5b5061025e61065d366004612b36565b611da8565b34801561066e57600080fd5b506102e361067d3660046129f5565b611f82565b34801561068e57600080fd5b506102e3603281565b3480156106a357600080fd5b506102e360055481565b3480156106b957600080fd5b5061025e6106c836600461285b565b611fa1565b3480156106d957600080fd5b506009546001600160a01b03166102ba565b3480156106f757600080fd5b5061025e610706366004612b36565b612235565b34801561071757600080fd5b5061061161072636600461294e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561075d57600080fd5b5061028561076c36600461283f565b6001600160a01b031660009081526007602052604090205460ff1690565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b600481815481106107d557600080fd5b6000918252602090912001546001600160a01b0316905081565b33301461085f5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b60648201526084015b60405180910390fd5b6001600160a01b038116600090815260036020526040902054819060ff166108c95760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b6001600160a01b0382166000908152600360205260408120805460ff191690555b6004546108f990600190612d22565b8110156109f357826001600160a01b03166004828154811061092b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156109e1576004805461095690600190612d22565b8154811061097457634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600480546001600160a01b0390921691839081106109ae57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506109f3565b806109eb81612d6e565b9150506108ea565b506004805480610a1357634e487b7160e01b600052603160045260246000fd5b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190556004546005541115610a5a57600454610a5a90611c63565b6040516001600160a01b038316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526003602052604090205460ff16610af15760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60008281526002602090815260408083203380855292529091205483919060ff16610b845760405162461bcd60e51b815260206004820152603160248201527f546865206f776e657220646964206e6f7420636f6e6669726d2074686973207460448201527f72616e73616374696f6e4964207965742e0000000000000000000000000000006064820152608401610856565b600084815260016020526040902060030154849060ff1615610bf85760405162461bcd60e51b815260206004820152602760248201527f54686973207472616e73616374696f6e49642069732065786563757465642061604482015266363932b0b23c9760c91b6064820152608401610856565b6000858152600260209081526040808320338085529252808320805460ff191690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b3360008181526003602052604090205460ff16610ca65760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60095460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610ce0573d6000803e3d6000fd5b506009546040518281526001600160a01b03909116907f467c3e0e755faea08e1553e4da10e9591378c4783d6d35f274e621b47ffddfe1906020015b60405180910390a25050565b6001600160a01b03821660009081526007602052604090205460ff16610d905760405162461bcd60e51b815260206004820152601a60248201527f5468697320746f6b656e206973206e6f7420616c6c6f7765642e0000000000006044820152606401610856565b60008381526008602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601f60248201527f54686973206f7264657220697320657865637574656420616c72656164792e006044820152606401610856565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905282906000906001600160a01b038316906323b872dd90606401602060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190612abd565b905080610f075760405162461bcd60e51b8152602060048201526024808201527f506179696e6720746865206f72646572207769746820746f6b656e732066616960448201527f6c65642e000000000000000000000000000000000000000000000000000000006064820152608401610856565b60008581526008602052604090819020805460ff19166001179055516001600160a01b0385169086907fdf6c11ebc9c2bda4f52003405af401b8283c6f4abfbd5db3233f74c5b8bb57f690610f5f9087815260200190565b60405180910390a35050505050565b6000805b600654811015610fe457838015610f9b575060008181526001602052604090206003015460ff16155b80610fbf5750828015610fbf575060008181526001602052604090206003015460ff165b15610fd257610fcf600183612d0a565b91505b80610fdc81612d6e565b915050610f72565b5092915050565b60008181526008602052604090205460ff161561104a5760405162461bcd60e51b815260206004820152601f60248201527f54686973206f7264657220697320657865637574656420616c72656164792e006044820152606401610856565b60008181526008602052604090819020805460ff191660011790555181907f2e21ab849a62bf3265688f4b25fa50644c694811607bb44cdb6fcad98a7c9562906110979034815260200190565b60405180910390a250565b33301461110d5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b6001600160a01b038116600090815260036020526040902054819060ff16156111785760405162461bcd60e51b815260206004820152601960248201527f54686973206164647265737320697320616e206f776e65722e000000000000006044820152606401610856565b816001600160a01b0381166111cf5760405162461bcd60e51b815260206004820181905260248201527f546865207a65726f2d61646472657373206973206e6f7420616c6c6f7765642e6044820152606401610856565b6004546111dd906001612d0a565b600554603282111580156111f15750818111155b80156111fc57508015155b801561120757508115155b6112795760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f60448201527f7420616c6c6f7765642e000000000000000000000000000000000000000000006064820152608401610856565b6001600160a01b038516600081815260036020526040808220805460ff1916600190811790915560048054918201815583527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805473ffffffffffffffffffffffffffffffffffffffff191684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b3330146113815760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b61138b82826124fa565b5050565b600080805b60045481101561143357600084815260026020526040812060048054919291849081106113d157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561140c57611409600183612d0a565b91505b600554821415611421576001925050506107c0565b8061142b81612d6e565b915050611394565b5060009392505050565b3360008181526003602052604090205460ff1661149c5760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282906000906001600160a01b038316906370a082319060240160206040518083038186803b1580156114f957600080fd5b505afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115319190612b4e565b6009546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561159a57600080fd5b505af11580156115ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d29190612abd565b506009546040518281526001600160a01b038681169216907fead62a0895e2f4028883bce189e7f527dd9fc82732d0a40bb6c5a6e1b97c1cb59060200160405180910390a350505050565b6000805b6004548110156116ab576000838152600260205260408120600480549192918490811061165e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561169957611696600183612d0a565b91505b806116a381612d6e565b915050611621565b50919050565b60016020819052600091825260409091208054918101546002820180546001600160a01b03909416939192916116e690612d39565b80601f016020809104026020016040519081016040528092919081815260200182805461171290612d39565b801561175f5780601f106117345761010080835404028352916020019161175f565b820191906000526020600020905b81548152906001019060200180831161174257829003601f168201915b5050506003909301549192505060ff1684565b606060048054806020026020016040519081016040528092919081815260200182805480156117ca57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117ac575b5050505050905090565b33301461183f5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b61184881612552565b50565b6060600060065467ffffffffffffffff81111561187857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156118a1578160200160208202803683370190505b5090506000805b600654811015611946578580156118d1575060008181526001602052604090206003015460ff16155b806118f557508480156118f5575060008181526001602052604090206003015460ff165b15611934578083838151811061191b57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611931600183612d0a565b91505b8061193e81612d6e565b9150506118a8565b6119508888612d22565b67ffffffffffffffff81111561197657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561199f578160200160208202803683370190505b5093508790505b86811015611a1e578281815181106119ce57634e487b7160e01b600052603260045260246000fd5b60200260200101518489836119e39190612d22565b81518110611a0157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611a1681612d6e565b9150506119a6565b505050949350505050565b60045460609060009067ffffffffffffffff811115611a5857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a81578160200160208202803683370190505b5090506000805b600454811015611b895760008581526002602052604081206004805491929184908110611ac557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615611b775760048181548110611b1357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611b5157634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611b74600183612d0a565b91505b80611b8181612d6e565b915050611a88565b8167ffffffffffffffff811115611bb057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611bd9578160200160208202803683370190505b509350600090505b81811015611c5b57828181518110611c0957634e487b7160e01b600052603260045260246000fd5b6020026020010151848281518110611c3157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280611c5381612d6e565b915050611be1565b505050919050565b333014611cce5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b6004548160328211801590611ce35750818111155b8015611cee57508015155b8015611cf957508115155b611d6b5760405162461bcd60e51b815260206004820152602a60248201527f54686973206368616e676520696e20726571756972656d656e74206973206e6f60448201527f7420616c6c6f7765642e000000000000000000000000000000000000000000006064820152608401610856565b60058390556040518381527fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9060200160405180910390a1505050565b3360008181526003602052604090205460ff16611e075760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60008281526001602052604090205482906001600160a01b0316611e935760405162461bcd60e51b815260206004820152602b60248201527f546865207472616e73616374696f6e2064657374696e6174696f6e20646f657360448201527f206e6f742065786973742e0000000000000000000000000000000000000000006064820152608401610856565b60008381526002602090815260408083203380855292529091205484919060ff1615611f275760405162461bcd60e51b815260206004820152603260248201527f54686973206f776e65722064696420636f6e6669726d2074686973207472616e60448201527f73616374696f6e496420616c72656164792e00000000000000000000000000006064820152608401610856565b6000858152600260209081526040808320338085529252808320805460ff191660011790555187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a3611f7b85612235565b5050505050565b6000611f8f8484846125b3565b9050611f9a81611da8565b9392505050565b33301461200c5760405162461bcd60e51b815260206004820152603360248201527f43616e206f6e6c79206265206578656375746564206279207468652077616c6c60448201527232ba1031b7b73a3930b1ba1034ba39b2b6331760691b6064820152608401610856565b6001600160a01b038216600090815260036020526040902054829060ff166120765760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b6001600160a01b038216600090815260036020526040902054829060ff16156120e15760405162461bcd60e51b815260206004820152601960248201527f54686973206164647265737320697320616e206f776e65722e000000000000006044820152606401610856565b60005b60045481101561219b57846001600160a01b03166004828154811061211957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141561218957836004828154811061215657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061219b565b8061219381612d6e565b9150506120e4565b506001600160a01b03808516600081815260036020526040808220805460ff1990811690915593871682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a26040516001600160a01b038416907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a250505050565b3360008181526003602052604090205460ff166122945760405162461bcd60e51b815260206004820152601d60248201527f546869732061646472657373206973206e6f7420616e206f776e65722e0000006044820152606401610856565b60008281526002602090815260408083203380855292529091205483919060ff166123275760405162461bcd60e51b815260206004820152603160248201527f546865206f776e657220646964206e6f7420636f6e6669726d2074686973207460448201527f72616e73616374696f6e4964207965742e0000000000000000000000000000006064820152608401610856565b600084815260016020526040902060030154849060ff161561239b5760405162461bcd60e51b815260206004820152602760248201527f54686973207472616e73616374696f6e49642069732065786563757465642061604482015266363932b0b23c9760c91b6064820152608401610856565b6123a48561138f565b15611f7b57600085815260016020819052604090912060038101805460ff1916831790558054918101546002820180549293612485936001600160a01b039091169291906123f190612d39565b905084600201805461240290612d39565b80601f016020809104026020016040519081016040528092919081815260200182805461242e90612d39565b801561247b5780601f106124505761010080835404028352916020019161247b565b820191906000526020600020905b81548152906001019060200180831161245e57829003601f168201915b50505050506126fa565b156124ba5760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26124f2565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038101805460ff191690555b505050505050565b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915591519182527f13362eeee30560397ac30f32fd5beb0392582868bc10dc6cfca1b73e2d832d9d9101610d1c565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fc0525b5837156cf0d3bcf4e2735ef832bcf6c0a36ab8f8bc445aeb9b341582d49060200160405180910390a150565b6000836001600160a01b03811661260c5760405162461bcd60e51b815260206004820181905260248201527f546865207a65726f2d61646472657373206973206e6f7420616c6c6f7765642e6044820152606401610856565b600654604080516080810182526001600160a01b038881168252602080830189815283850189815260006060860181905287815260018085529690208551815473ffffffffffffffffffffffffffffffffffffffff19169516949094178455905194830194909455925180519496509193909261269092600285019291019061271d565b50606091909101516003909101805460ff191691151591909117905560068054600191906000906126c2908490612d0a565b909155505060405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b6000806040516020840160008287838a8c6187965a03f198975050505050505050565b82805461272990612d39565b90600052602060002090601f01602090048101928261274b5760008555612791565b82601f1061276457805160ff1916838001178555612791565b82800160010185558215612791579182015b82811115612791578251825591602001919060010190612776565b5061279d9291506127a1565b5090565b5b8082111561279d57600081556001016127a2565b60008083601f8401126127c7578081fd5b50813567ffffffffffffffff8111156127de578182fd5b60208301915083602080830285010111156127f857600080fd5b9250929050565b60008083601f840112612810578182fd5b50813567ffffffffffffffff811115612827578182fd5b6020830191508360208285010111156127f857600080fd5b600060208284031215612850578081fd5b8135611f9a81612db5565b6000806040838503121561286d578081fd5b823561287881612db5565b9150602083013561288881612db5565b809150509250929050565b60008060008060008060008060a0898b0312156128ae578384fd5b88356128b981612db5565b975060208901356128c981612db5565b9650604089013567ffffffffffffffff808211156128e5578586fd5b6128f18c838d016127b6565b909850965060608b0135915080821115612909578586fd5b6129158c838d016127b6565b909650945060808b013591508082111561292d578384fd5b5061293a8b828c016127ff565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612966578182fd5b863561297181612db5565b9550602087013561298181612db5565b94506040870135935060608701359250608087013567ffffffffffffffff8111156129aa578283fd5b6129b689828a016127ff565b979a9699509497509295939492505050565b600080604083850312156129da578182fd5b82356129e581612db5565b9150602083013561288881612dca565b600080600060608486031215612a09578283fd5b8335612a1481612db5565b925060208401359150604084013567ffffffffffffffff80821115612a37578283fd5b818601915086601f830112612a4a578283fd5b813581811115612a5c57612a5c612d9f565b604051601f8201601f19908116603f01168101908382118183101715612a8457612a84612d9f565b81604052828152896020848701011115612a9c578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600060208284031215612ace578081fd5b8151611f9a81612dca565b60008060408385031215612aeb578182fd5b82356129e581612dca565b600060208284031215612b07578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611f9a578182fd5b600060208284031215612b47578081fd5b5035919050565b600060208284031215612b5f578081fd5b5051919050565b60008060408385031215612b78578182fd5b82359150602083013561288881612db5565b600080600060608486031215612b9e578081fd5b833592506020840135612bb081612db5565b929592945050506040919091013590565b60008060008060808587031215612bd6578182fd5b84359350602085013592506040850135612bef81612dca565b91506060850135612bff81612dca565b939692955090935050565b60006001600160a01b038616825260208581840152608060408401528451806080850152825b81811015612c4c5786810183015185820160a001528201612c30565b81811115612c5d578360a083870101525b50601f01601f1916830160a0019150612c7c9050606083018415159052565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612cc65783516001600160a01b031683529284019291840191600101612ca1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612cc657835183529284019291840191600101612cee565b60008219821115612d1d57612d1d612d89565b500190565b600082821015612d3457612d34612d89565b500390565b600281046001821680612d4d57607f821691505b602082108114156116ab57634e487b7160e01b600052602260045260246000fd5b6000600019821415612d8257612d82612d89565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461184857600080fd5b801515811461184857600080fdfea2646970667358221220fd7c8b006c388fb4a90263e17ef8bcbda249ae6234462bb13152d4070459242e64736f6c63430008020033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001c6c6c588bfe20ae940c86663bf4bc3f9b837d22000000000000000000000000000000000000000000000000000000000000000300000000000000000000000022de936854e40350d01f47724fd047d4de0f26a100000000000000000000000099723a4a9d9b3c3cecba16e2e3ed924abd1d55f6000000000000000000000000b224cb543fa10cf2983c557c029cd874c1ace0cc0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0

-----Decoded View---------------
Arg [0] : _owners (address[]): 0x22de936854E40350d01f47724FD047D4DE0F26A1,0x99723A4A9D9B3C3cecbA16e2e3Ed924aBD1D55F6,0xB224cb543FA10cF2983c557C029CD874C1AcE0cc
Arg [1] : allowedTokens (address[]): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x6B175474E89094C44Da98b954EedeAC495271d0F,0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0
Arg [2] : _required (uint256): 2
Arg [3] : withdrawAddress (address): 0x1C6C6c588Bfe20ae940C86663BF4Bc3F9B837d22

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000001c6c6c588bfe20ae940c86663bf4bc3f9b837d22
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 00000000000000000000000022de936854e40350d01f47724fd047d4de0f26a1
Arg [6] : 00000000000000000000000099723a4a9d9b3c3cecba16e2e3ed924abd1d55f6
Arg [7] : 000000000000000000000000b224cb543fa10cf2983c557c029cd874c1ace0cc
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [10] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [11] : 0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0


Deployed Bytecode Sourcemap

32135:5124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20130:9;:13;20126:81;;20165:30;;20185:9;16944:25:1;;20173:10:0;;20165:30;;16932:2:1;16917:18;20165:30:0;;;;;;;20126:81;32135:5124;;;;;15268:183;;;;;;;;;;-1:-1:-1;15268:183:0;;;;;:::i;:::-;;:::i;:::-;;;11837:14:1;;11830:22;11812:41;;11800:2;11785:18;15268:183:0;;;;;;;;16797:23;;;;;;;;;;-1:-1:-1;16797:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8448:55:1;;;8430:74;;8418:2;8403:18;16797:23:0;8385:125:1;25036:96:0;;;;;;;;;;-1:-1:-1;25116:8:0;;25036:96;;;16944:25:1;;;16932:2;16917:18;25036:96:0;16899:76:1;20955:524:0;;;;;;;;;;-1:-1:-1;20955:524:0;;;;;:::i;:::-;;:::i;22661:331::-;;;;;;;;;;-1:-1:-1;22661:331:0;;;;;:::i;:::-;;:::i;16751:39::-;;;;;;;;;;-1:-1:-1;16751:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16679:65;;;;;;;;;;-1:-1:-1;16679:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;36471:174;;;;;;;;;;-1:-1:-1;36471:174:0;;;;;:::i;:::-;36581:4;36610:27;;;:18;:27;;;;;;;;;36471:174;35537:226;;;;;;;;;;;;;:::i;34304:710::-;;;;;;;;;;-1:-1:-1;34304:710:0;;;;;:::i;:::-;;:::i;24551:368::-;;;;;;;;;;-1:-1:-1;24551:368:0;;;;;:::i;:::-;;:::i;34013:283::-;;;;;;:::i;:::-;;:::i;20627:320::-;;;;;;;;;;-1:-1:-1;20627:320:0;;;;;:::i;:::-;;:::i;35136:194::-;;;;;;;;;;-1:-1:-1;35136:194:0;;;;;:::i;:::-;;:::i;23900:365::-;;;;;;;;;;-1:-1:-1;23900:365:0;;;;;:::i;:::-;;:::i;35771:385::-;;;;;;;;;;-1:-1:-1;35771:385:0;;;;;:::i;:::-;;:::i;24273:270::-;;;;;;;;;;-1:-1:-1;24273:270:0;;;;;:::i;:::-;;:::i;16621:51::-;;;;;;;;;;-1:-1:-1;16621:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;24927:101::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35338:191::-;;;;;;;;;;-1:-1:-1;35338:191:0;;;;;:::i;:::-;;:::i;25764:769::-;;;;;;;;;;-1:-1:-1;25764:769:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25140:616::-;;;;;;;;;;-1:-1:-1;25140:616:0;;;;;:::i;:::-;;:::i;16857:31::-;;;;;;;;;;;;;;;;22010:250;;;;;;;;;;-1:-1:-1;22010:250:0;;;;;:::i;:::-;;:::i;26762:246::-;;;;;;;;;;-1:-1:-1;26762:246:0;;;;;:::i;:::-;26978:22;26762:246;;;;;;;;;;;;;;12038:66:1;12026:79;;;12008:98;;11996:2;11981:18;26762:246:0;11963:149:1;22268:385:0;;;;;;;;;;-1:-1:-1;22268:385:0;;;;;:::i;:::-;;:::i;20222:283::-;;;;;;;;;;-1:-1:-1;20222:283:0;;;;;:::i;:::-;;:::i;16454:44::-;;;;;;;;;;;;16496:2;16454:44;;16827:23;;;;;;;;;;;;;;;;21487:515;;;;;;;;;;-1:-1:-1;21487:515:0;;;;;:::i;:::-;;:::i;36653:111::-;;;;;;;;;;-1:-1:-1;36740:16:0;;-1:-1:-1;;;;;36740:16:0;36653:111;;23000:778;;;;;;;;;;-1:-1:-1;23000:778:0;;;;;:::i;:::-;;:::i;26541:213::-;;;;;;;;;;-1:-1:-1;26541:213:0;;;;;:::i;:::-;26730:16;26541:213;;;;;;;;;36278:185;;;;;;;;;;-1:-1:-1;36278:185:0;;;;;:::i;:::-;-1:-1:-1;;;;;36419:36:0;36390:4;36419:36;;;:22;:36;;;;;;;;;36278:185;15268:183;15410:33;;;15381:4;15410:33;;;;;;;;;;;;;15268:183;;;;:::o;16797:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16797:23:0;;-1:-1:-1;16797:23:0;:::o;20955:524::-;17208:10;17230:4;17208:27;17186:128;;;;-1:-1:-1;;;17186:128:0;;13861:2:1;17186:128:0;;;13843:21:1;13900:2;13880:18;;;13873:30;13939:34;13919:18;;;13912:62;-1:-1:-1;;;13990:18:1;;;13983:49;14049:19;;17186:128:0;;;;;;;;;-1:-1:-1;;;;;17403:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;21082:5;;17403:14:::1;;17395:56;;;::::0;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0::1;::::0;::::1;13485:21:1::0;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0::1;13475:179:1::0;17395:56:0::1;-1:-1:-1::0;;;;;21105:14:0;::::2;21122:5;21105:14:::0;;;:7:::2;:14;::::0;;;;:22;;-1:-1:-1;;21105:22:0::2;::::0;;21138:181:::2;21162:6;:13:::0;:17:::2;::::0;21178:1:::2;::::0;21162:17:::2;:::i;:::-;21158:1;:21;21138:181;;;21216:5;-1:-1:-1::0;;;;;21203:18:0::2;:6;21210:1;21203:9;;;;;;-1:-1:-1::0;;;21203:9:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;21203:9:0::2;:18;21199:120;;;21254:6;21261:13:::0;;:17:::2;::::0;21277:1:::2;::::0;21261:17:::2;:::i;:::-;21254:25;;;;;;-1:-1:-1::0;;;21254:25:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;21242:6:::2;:9:::0;;-1:-1:-1;;;;;21254:25:0;;::::2;::::0;21249:1;;21242:9;::::2;;;-1:-1:-1::0;;;21242:9:0::2;;;;;;;;;;;;;;;;;:37;;;;;-1:-1:-1::0;;;;;21242:37:0::2;;;;;-1:-1:-1::0;;;;;21242:37:0::2;;;;;;21298:5;;21199:120;21181:3:::0;::::2;::::0;::::2;:::i;:::-;;;;21138:181;;;;21329:6;:12;;;;;-1:-1:-1::0;;;21329:12:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;;-1:-1:-1;;21329:12:0;;;;;-1:-1:-1;;21329:12:0::2;::::0;;;;;21389:6:::2;:13:::0;21378:8:::2;::::0;:24:::2;21374:62;;;21422:6;:13:::0;21404:32:::2;::::0;:17:::2;:32::i;:::-;21452:19;::::0;-1:-1:-1;;;;;21452:19:0;::::2;::::0;::::2;::::0;;;::::2;17325:1:::1;20955:524:::0;:::o;22661:331::-;22773:10;17403:14;;;;:7;:14;;;;;;;;17395:56;;;;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0;13475:179:1;17395:56:0;17940:28:::1;::::0;;;:13:::1;:28;::::0;;;;;;;22819:10:::1;17940:35:::0;;;;;;;;;22804:13;;22819:10;17940:35:::1;;17918:134;;;::::0;-1:-1:-1;;;17918:134:0;;16582:2:1;17918:134:0::1;::::0;::::1;16564:21:1::0;16621:2;16601:18;;;16594:30;16660:34;16640:18;;;16633:62;16731:19;16711:18;;;16704:47;16768:19;;17918:134:0::1;16554:239:1::0;17918:134:0::1;18393:27:::2;::::0;;;:12:::2;:27;::::0;;;;:36:::2;;::::0;22852:13;;18393:36:::2;;18392:37;18370:126;;;::::0;-1:-1:-1;;;18370:126:0;;16174:2:1;18370:126:0::2;::::0;::::2;16156:21:1::0;16213:2;16193:18;;;16186:30;16252:34;16232:18;;;16225:62;-1:-1:-1;;;16303:18:1;;;16296:37;16350:19;;18370:126:0::2;16146:229:1::0;18370:126:0::2;22926:5:::3;22883:28:::0;;;:13:::3;:28;::::0;;;;;;;22912:10:::3;22883:40:::0;;;;;;;;:48;;-1:-1:-1;;22883:48:0::3;::::0;;22947:37;22897:13;;22947:37:::3;::::0;::::3;18063:1:::2;17462::::1;;22661:331:::0;;:::o;35537:226::-;35593:10;17403:14;;;;:7;:14;;;;;;;;17395:56;;;;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0;13475:179:1;17395:56:0;35665:16:::1;::::0;:33:::1;::::0;35633:21:::1;::::0;-1:-1:-1;;;;;35665:16:0::1;::::0;:33;::::1;;;::::0;35633:21;;35616:14:::1;35665:33:::0;35616:14;35665:33;35633:21;35665:16;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;35730:16:0::1;::::0;35716:39:::1;::::0;16944:25:1;;;-1:-1:-1;;;;;35730:16:0;;::::1;::::0;35716:39:::1;::::0;16932:2:1;16917:18;35716:39:0::1;;;;;;;;17462:1;35537:226:::0;:::o;34304:710::-;-1:-1:-1;;;;;34467:36:0;;;;;;:22;:36;;;;;;;;34445:112;;;;-1:-1:-1;;;34445:112:0;;14281:2:1;34445:112:0;;;14263:21:1;14320:2;14300:18;;;14293:30;14359:28;14339:18;;;14332:56;14405:18;;34445:112:0;14253:176:1;34445:112:0;34591:27;;;;:18;:27;;;;;;;;34590:28;34568:109;;;;-1:-1:-1;;;34568:109:0;;15041:2:1;34568:109:0;;;15023:21:1;15080:2;15060:18;;;15053:30;15119:33;15099:18;;;15092:61;15170:18;;34568:109:0;15013:181:1;34568:109:0;34772:61;;;;;34799:10;34772:61;;;9327:34:1;34819:4:0;9377:18:1;;;9370:43;9429:18;;;9422:34;;;34718:12:0;;34688:20;;-1:-1:-1;;;;;34772:26:0;;;;;9239:18:1;;34772:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34744:89;;34852:7;34844:56;;;;-1:-1:-1;;;34844:56:0;;14636:2:1;34844:56:0;;;14618:21:1;14675:2;14655:18;;;14648:30;14714:34;14694:18;;;14687:62;14785:6;14765:18;;;14758:34;14809:19;;34844:56:0;14608:226:1;34844:56:0;34913:27;;;;:18;:27;;;;;;;:34;;-1:-1:-1;;34913:34:0;34943:4;34913:34;;;34958:48;-1:-1:-1;;;;;34958:48:0;;;34932:7;;34958:48;;;;34999:6;16944:25:1;;16932:2;16917:18;;16899:76;34958:48:0;;;;;;;;34304:710;;;;;:::o;24551:368::-;24675:13;;24706:205;24730:16;;24726:1;:20;24706:205;;;24789:7;:36;;;;-1:-1:-1;24801:15:0;;;;:12;:15;;;;;:24;;;;;24800:25;24789:36;24788:97;;;;24848:8;:36;;;;-1:-1:-1;24860:15:0;;;;:12;:15;;;;;:24;;;;;24848:36;24766:145;;;24901:10;24910:1;24901:10;;:::i;:::-;;;24766:145;24748:3;;;;:::i;:::-;;;;24706:205;;;;24551:368;;;;:::o;34013:283::-;34111:27;;;;:18;:27;;;;;;;;34110:28;34088:109;;;;-1:-1:-1;;;34088:109:0;;15041:2:1;34088:109:0;;;15023:21:1;15080:2;15060:18;;;15053:30;15119:33;15099:18;;;15092:61;15170:18;;34088:109:0;15013:181:1;34088:109:0;34208:27;;;;:18;:27;;;;;;;:34;;-1:-1:-1;;34208:34:0;34238:4;34208:34;;;34253:35;34227:7;;34253:35;;;;34278:9;16944:25:1;;16932:2;16917:18;;16899:76;34253:35:0;;;;;;;;34013:283;:::o;20627:320::-;17208:10;17230:4;17208:27;17186:128;;;;-1:-1:-1;;;17186:128:0;;13861:2:1;17186:128:0;;;13843:21:1;13900:2;13880:18;;;13873:30;13939:34;13919:18;;;13912:62;-1:-1:-1;;;13990:18:1;;;13983:49;14049:19;;17186:128:0;13833:241:1;17186:128:0;-1:-1:-1;;;;;17541:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;20751:5;;17541:14:::1;;17540:15;17532:53;;;::::0;-1:-1:-1;;;17532:53:0;;15820:2:1;17532:53:0::1;::::0;::::1;15802:21:1::0;15859:2;15839:18;;;15832:30;15898:27;15878:18;;;15871:55;15943:18;;17532:53:0::1;15792:175:1::0;17532:53:0::1;20775:5:::0;-1:-1:-1;;;;;18578:24:0;::::2;18570:69;;;::::0;-1:-1:-1;;;18570:69:0;;12319:2:1;18570:69:0::2;::::0;::::2;12301:21:1::0;;;12338:18;;;12331:30;12397:34;12377:18;;;12370:62;12449:18;;18570:69:0::2;12291:182:1::0;18570:69:0::2;20808:6:::3;:13:::0;:17:::3;::::0;20824:1:::3;20808:17;:::i;:::-;20827:8;;16496:2;18765:10;:29;;:73;;;;;18828:10;18815:9;:23;;18765:73;:108;;;;-1:-1:-1::0;18859:14:0;;::::3;18765:108;:144;;;;-1:-1:-1::0;18894:15:0;;::::3;18765:144;18743:236;;;::::0;-1:-1:-1;;;18743:236:0;;13092:2:1;18743:236:0::3;::::0;::::3;13074:21:1::0;13131:2;13111:18;;;13104:30;13170:34;13150:18;;;13143:62;13241:12;13221:18;;;13214:40;13271:19;;18743:236:0::3;13064:232:1::0;18743:236:0::3;-1:-1:-1::0;;;;;20853:14:0;::::4;;::::0;;;:7:::4;:14;::::0;;;;;:21;;-1:-1:-1;;20853:21:0::4;20870:4;20853:21:::0;;::::4;::::0;;;20885:6:::4;:18:::0;;;;::::4;::::0;;;;;::::4;::::0;;-1:-1:-1;;20885:18:0::4;::::0;::::4;::::0;;20919:20;::::4;::::0;20853:14;20919:20:::4;18650:1:::3;;17596::::2;17325::::1;20627:320:::0;:::o;35136:194::-;17208:10;17230:4;17208:27;17186:128;;;;-1:-1:-1;;;17186:128:0;;13861:2:1;17186:128:0;;;13843:21:1;13900:2;13880:18;;;13873:30;13939:34;13919:18;;;13912:62;-1:-1:-1;;;13990:18:1;;;13983:49;14049:19;;17186:128:0;13833:241:1;17186:128:0;35280:42:::1;35300:12;35314:7;35280:19;:42::i;:::-;35136:194:::0;;:::o;23900:365::-;24010:4;;;24060:175;24084:6;:13;24080:17;;24060:175;;;24123:28;;;;:13;:28;;;;;24152:6;:9;;24123:28;;;24159:1;;24152:9;;;;-1:-1:-1;;;24152:9:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24152:9:0;24123:39;;;;;;;;;;;;;;;24119:55;;;24164:10;24173:1;24164:10;;:::i;:::-;;;24119:55;24202:8;;24193:5;:17;24189:34;;;24219:4;24212:11;;;;;;24189:34;24099:3;;;;:::i;:::-;;;;24060:175;;;-1:-1:-1;24252:5:0;;23900:365;-1:-1:-1;;;23900:365:0:o;35771:385::-;35879:10;17403:14;;;;:7;:14;;;;;;;;17395:56;;;;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0;13475:179:1;17395:56:0;35978:38:::1;::::0;;;;36010:4:::1;35978:38;::::0;::::1;8430:74:1::0;35937:12:0;;35907:20:::1;::::0;-1:-1:-1;;;;;35978:23:0;::::1;::::0;::::1;::::0;8403:18:1;;35978:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36050:16;::::0;36027:48:::1;::::0;;;;-1:-1:-1;;;;;36050:16:0;;::::1;36027:48;::::0;::::1;8936:74:1::0;9026:18;;;9019:34;;;35961:55:0;;-1:-1:-1;36027:22:0;::::1;::::0;::::1;::::0;8909:18:1;;36027:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;36109:16:0::1;::::0;36093:55:::1;::::0;16944:25:1;;;-1:-1:-1;;;;;36093:55:0;;::::1;::::0;36109:16:::1;::::0;36093:55:::1;::::0;16932:2:1;16917:18;36093:55:0::1;;;;;;;17462:1;;35771:385:::0;;:::o;24273:270::-;24392:13;;24423:112;24447:6;:13;24443:17;;24423:112;;;24484:28;;;;:13;:28;;;;;24513:6;:9;;24484:28;;;24520:1;;24513:9;;;;-1:-1:-1;;;24513:9:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24513:9:0;24484:39;;;;;;;;;;;;;;;24480:55;;;24525:10;24534:1;24525:10;;:::i;:::-;;;24480:55;24462:3;;;;:::i;:::-;;;;24423:112;;;;24273:270;;;:::o;16621:51::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16621:51:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16621:51:0;;;;;;;-1:-1:-1;;16621:51:0;;;:::o;24927:101::-;24978:16;25014:6;25007:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25007:13:0;;;;;;;;;;;;;;;;;;;;;;;24927:101;:::o;35338:191::-;17208:10;17230:4;17208:27;17186:128;;;;-1:-1:-1;;;17186:128:0;;13861:2:1;17186:128:0;;;13843:21:1;13900:2;13880:18;;;13873:30;13939:34;13919:18;;;13912:62;-1:-1:-1;;;13990:18:1;;;13983:49;14049:19;;17186:128:0;13833:241:1;17186:128:0;35482:39:::1;35505:15;35482:22;:39::i;:::-;35338:191:::0;:::o;25764:769::-;25919:32;25964:35;26016:16;;26002:31;;;;;;-1:-1:-1;;;26002:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26002:31:0;;25964:69;;26044:13;26072:9;26092:280;26108:16;;26104:1;:20;26092:280;;;26167:7;:36;;;;-1:-1:-1;26179:15:0;;;;:12;:15;;;;;:24;;;;;26178:25;26167:36;26166:97;;;;26226:8;:36;;;;-1:-1:-1;26238:15:0;;;;:12;:15;;;;;:24;;;;;26226:36;26144:228;;;26326:1;26298:18;26317:5;26298:25;;;;;;-1:-1:-1;;;26298:25:0;;;;;;;;;;;;;;;;;;:29;26346:10;26355:1;26346:10;;:::i;:::-;;;26144:228;26126:3;;;;:::i;:::-;;;;26092:280;;;26414:9;26419:4;26414:2;:9;:::i;:::-;26400:24;;;;;;-1:-1:-1;;;26400:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26400:24:0;;26382:42;;26444:4;26440:8;;26435:90;26454:2;26450:1;:6;26435:90;;;26504:18;26523:1;26504:21;;;;;;-1:-1:-1;;;26504:21:0;;;;;;;;;;;;;;;26476:15;26496:4;26492:1;:8;;;;:::i;:::-;26476:25;;;;;;-1:-1:-1;;;26476:25:0;;;;;;;;;;;;;;;;;;:49;26458:3;;;;:::i;:::-;;;;26435:90;;;25764:769;;;;;;;;;:::o;25140:616::-;25355:6;:13;25255:31;;25304:34;;25341:28;;;;;;-1:-1:-1;;;25341:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25341:28:0;;25304:65;;25380:13;25408:9;25428:194;25444:6;:13;25440:17;;25428:194;;;25481:28;;;;:13;:28;;;;;25510:6;:9;;25481:28;;;25517:1;;25510:9;;;;-1:-1:-1;;;25510:9:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25510:9:0;25481:39;;;;;;;;;;;;;;;25477:145;;;25568:6;25575:1;25568:9;;;;;;-1:-1:-1;;;25568:9:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25568:9:0;25541:17;25559:5;25541:24;;;;;;-1:-1:-1;;;25541:24:0;;;;;;;;;-1:-1:-1;;;;;25541:36:0;;;:24;;;;;;;;;;;:36;25596:10;25605:1;25596:10;;:::i;:::-;;;25477:145;25459:3;;;;:::i;:::-;;;;25428:194;;;25663:5;25649:20;;;;;;-1:-1:-1;;;25649:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25649:20:0;;25632:37;;25689:1;25685:5;;25680:68;25696:5;25692:1;:9;25680:68;;;25728:17;25746:1;25728:20;;;;;;-1:-1:-1;;;25728:20:0;;;;;;;;;;;;;;;25708:14;25723:1;25708:17;;;;;;-1:-1:-1;;;25708:17:0;;;;;;;;;-1:-1:-1;;;;;25708:40:0;;;:17;;;;;;;;;;;:40;25703:3;;;;:::i;:::-;;;;25680:68;;;25140:616;;;;;;:::o;22010:250::-;17208:10;17230:4;17208:27;17186:128;;;;-1:-1:-1;;;17186:128:0;;13861:2:1;17186:128:0;;;13843:21:1;13900:2;13880:18;;;13873:30;13939:34;13919:18;;;13912:62;-1:-1:-1;;;13990:18:1;;;13983:49;14049:19;;17186:128:0;13833:241:1;17186:128:0;22146:6:::1;:13:::0;22161:9;16496:2:::1;18765:29:::0;::::1;::::0;::::1;::::0;:73:::1;;;18828:10;18815:9;:23;;18765:73;:108;;;;-1:-1:-1::0;18859:14:0;;::::1;18765:108;:144;;;;-1:-1:-1::0;18894:15:0;;::::1;18765:144;18743:236;;;::::0;-1:-1:-1;;;18743:236:0;;13092:2:1;18743:236:0::1;::::0;::::1;13074:21:1::0;13131:2;13111:18;;;13104:30;13170:34;13150:18;;;13143:62;13241:12;13221:18;;;13214:40;13271:19;;18743:236:0::1;13064:232:1::0;18743:236:0::1;22188:8:::2;:20:::0;;;22224:28:::2;::::0;16944:25:1;;;22224:28:0::2;::::0;16932:2:1;16917:18;22224:28:0::2;;;;;;;17325:1:::1;;22010:250:::0;:::o;22268:385::-;22380:10;17403:14;;;;:7;:14;;;;;;;;17395:56;;;;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0;13475:179:1;17395:56:0;17747:3:::1;17696:27:::0;;;:12:::1;:27;::::0;;;;:39;22419:13;;-1:-1:-1;;;;;17696:39:0::1;17674:148;;;::::0;-1:-1:-1;;;17674:148:0;;12680:2:1;17674:148:0::1;::::0;::::1;12662:21:1::0;12719:2;12699:18;;;12692:30;12758:34;12738:18;;;12731:62;12829:13;12809:18;;;12802:41;12860:19;;17674:148:0::1;12652:233:1::0;17674:148:0::1;18174:28:::2;::::0;;;:13:::2;:28;::::0;;;;;;;22471:10:::2;18174:35:::0;;;;;;;;;22456:13;;22471:10;18174:35:::2;;18173:36;18151:136;;;::::0;-1:-1:-1;;;18151:136:0;;15401:2:1;18151:136:0::2;::::0;::::2;15383:21:1::0;15440:2;15420:18;;;15413:30;15479:34;15459:18;;;15452:62;15550:20;15530:18;;;15523:48;15588:19;;18151:136:0::2;15373:240:1::0;18151:136:0::2;22499:28:::3;::::0;;;:13:::3;:28;::::0;;;;;;;22528:10:::3;22499:40:::0;;;;;;;;:47;;-1:-1:-1;;22499:47:0::3;22542:4;22499:47;::::0;;22562:39;22513:13;;22562:39:::3;::::0;::::3;22612:33;22631:13;22612:18;:33::i;:::-;17833:1:::2;;17462::::1;22268:385:::0;;:::o;20222:283::-;20363:21;20413:40;20428:11;20441:5;20448:4;20413:14;:40::i;:::-;20397:56;;20464:33;20483:13;20464:18;:33::i;:::-;20222:283;;;;;:::o;21487:515::-;17208:10;17230:4;17208:27;17186:128;;;;-1:-1:-1;;;17186:128:0;;13861:2:1;17186:128:0;;;13843:21:1;13900:2;13880:18;;;13873:30;13939:34;13919:18;;;13912:62;-1:-1:-1;;;13990:18:1;;;13983:49;14049:19;;17186:128:0;13833:241:1;17186:128:0;-1:-1:-1;;;;;17403:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;21633:5;;17403:14:::1;;17395:56;;;::::0;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0::1;::::0;::::1;13485:21:1::0;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0::1;13475:179:1::0;17395:56:0::1;-1:-1:-1::0;;;;;17541:14:0;::::2;;::::0;;;:7:::2;:14;::::0;;;;;21667:8;;17541:14:::2;;17540:15;17532:53;;;::::0;-1:-1:-1;;;17532:53:0;;15820:2:1;17532:53:0::2;::::0;::::2;15802:21:1::0;15859:2;15839:18;;;15832:30;15898:27;15878:18;;;15871:55;15943:18;;17532:53:0::2;15792:175:1::0;17532:53:0::2;21698:9:::3;21693:160;21717:6;:13:::0;21713:17;::::3;21693:160;;;21767:5;-1:-1:-1::0;;;;;21754:18:0::3;:6;21761:1;21754:9;;;;;;-1:-1:-1::0;;;21754:9:0::3;;;;;;;;;;::::0;;;::::3;::::0;;;::::3;::::0;-1:-1:-1;;;;;21754:9:0::3;:18;21750:103;;;21805:8;21793:6;21800:1;21793:9;;;;;;-1:-1:-1::0;;;21793:9:0::3;;;;;;;;;;;;;;;;;:20;;;;;-1:-1:-1::0;;;;;21793:20:0::3;;;;;-1:-1:-1::0;;;;;21793:20:0::3;;;;;;21832:5;;21750:103;21732:3:::0;::::3;::::0;::::3;:::i;:::-;;;;21693:160;;;-1:-1:-1::0;;;;;;21863:14:0;;::::3;21880:5;21863:14:::0;;;:7:::3;:14;::::0;;;;;:22;;-1:-1:-1;;21863:22:0;;::::3;::::0;;;21896:17;;::::3;::::0;;;;;:24;;;;::::3;21863:22:::0;21896:24:::3;::::0;;;21936:19;;21863:14;;21936:19:::3;::::0;::::3;21971:23;::::0;-1:-1:-1;;;;;21971:23:0;::::3;::::0;::::3;::::0;;;::::3;17462:1:::2;17325::::1;21487:515:::0;;:::o;23000:778::-;23112:10;17403:14;;;;:7;:14;;;;;;;;17395:56;;;;-1:-1:-1;;;17395:56:0;;13503:2:1;17395:56:0;;;13485:21:1;13542:2;13522:18;;;13515:30;13581:31;13561:18;;;13554:59;13630:18;;17395:56:0;13475:179:1;17395:56:0;17940:28:::1;::::0;;;:13:::1;:28;::::0;;;;;;;23158:10:::1;17940:35:::0;;;;;;;;;23143:13;;23158:10;17940:35:::1;;17918:134;;;::::0;-1:-1:-1;;;17918:134:0;;16582:2:1;17918:134:0::1;::::0;::::1;16564:21:1::0;16621:2;16601:18;;;16594:30;16660:34;16640:18;;;16633:62;16731:19;16711:18;;;16704:47;16768:19;;17918:134:0::1;16554:239:1::0;17918:134:0::1;18393:27:::2;::::0;;;:12:::2;:27;::::0;;;;:36:::2;;::::0;23191:13;;18393:36:::2;;18392:37;18370:126;;;::::0;-1:-1:-1;;;18370:126:0;;16174:2:1;18370:126:0::2;::::0;::::2;16156:21:1::0;16213:2;16193:18;;;16186:30;16252:34;16232:18;;;16225:62;-1:-1:-1;;;16303:18:1;;;16296:37;16350:19;;18370:126:0::2;16146:229:1::0;18370:126:0::2;23226:26:::3;23238:13;23226:11;:26::i;:::-;23222:549;;;23269:23;23295:27:::0;;;:12:::3;:27;::::0;;;;;;;23337:12:::3;::::0;::::3;:19:::0;;-1:-1:-1;;23337:19:0::3;::::0;::::3;::::0;;23429:15;;23467:9;;::::3;::::0;23499:8:::3;::::0;::::3;:15:::0;;23295:27;;23393:171:::3;::::0;-1:-1:-1;;;;;23429:15:0;;::::3;::::0;23467:9;23499:8;:15:::3;::::0;::::3;:::i;:::-;;;23537:3;:8;;23393:171;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:171::i;:::-;23371:389;;;23604:24;::::0;23614:13;;23604:24:::3;::::0;;;::::3;23371:389;;;23674:31;::::0;23691:13;;23674:31:::3;::::0;;;::::3;23724:12;::::0;::::3;:20:::0;;-1:-1:-1;;23724:20:0::3;::::0;;23371:389:::3;23222:549;18063:1:::2;17462::::1;;23000:778:::0;;:::o;37071:185::-;-1:-1:-1;;;;;37155:36:0;;;;;;:22;:36;;;;;;;;;:46;;-1:-1:-1;;37155:46:0;;;;;;;;;;37212:36;;11812:41:1;;;37212:36:0;;11785:18:1;37212:36:0;11767:92:1;36886:177:0;36970:16;:34;;-1:-1:-1;;36970:34:0;-1:-1:-1;;;;;36970:34:0;;;;;;;;37015:40;;8430:74:1;;;37015:40:0;;8418:2:1;8403:18;37015:40:0;;;;;;;36886:177;:::o;28729:485::-;28881:21;28859:11;-1:-1:-1;;;;;18578:24:0;;18570:69;;;;-1:-1:-1;;;18570:69:0;;12319:2:1;18570:69:0;;;12301:21:1;;;12338:18;;;12331:30;12397:34;12377:18;;;12370:62;12449:18;;18570:69:0;12291:182:1;18570:69:0;28931:16:::1;::::0;28988:145:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;28988:145:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;28988:145:0;;;;;;28958:27;;;28988:145;28958:27;;;;;;:175;;;;-1:-1:-1;;28958:175:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;28931:16;;-1:-1:-1;28988:145:0;;28958:27;;:175:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;28958:175:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;28958:175:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29144:16:::1;:21:::0;;-1:-1:-1;;29144:16:0;-1:-1:-1;;29144:21:0::1;::::0;-1:-1:-1;;29144:21:0::1;:::i;:::-;::::0;;;-1:-1:-1;;29181:25:0::1;::::0;29192:13;;29181:25:::1;::::0;;;::::1;28729:485:::0;;;;;;:::o;27303:1113::-;27462:4;27479:11;27540:4;27534:11;27672:2;27666:4;27662:13;28302:1;28282;28180:10;28160:1;28136:5;28106:11;27798:5;27791;27787:17;27764:610;27754:620;27303:1113;-1:-1:-1;;;;;;;;27303:1113:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:394:1;;;141:3;134:4;126:6;122:17;118:27;108:2;;164:6;156;149:22;108:2;-1:-1:-1;192:20:1;;235:18;224:30;;221:2;;;274:8;264;257:26;221:2;318:4;310:6;306:17;294:29;;381:3;374:4;366;358:6;354:17;346:6;342:30;338:41;335:50;332:2;;;398:1;395;388:12;332:2;98:310;;;;;:::o;413:375::-;;;528:3;521:4;513:6;509:17;505:27;495:2;;553:8;543;536:26;495:2;-1:-1:-1;583:20:1;;626:18;615:30;;612:2;;;665:8;655;648:26;612:2;709:4;701:6;697:17;685:29;;761:3;754:4;745:6;737;733:19;729:30;726:39;723:2;;;778:1;775;768:12;793:257;;905:2;893:9;884:7;880:23;876:32;873:2;;;926:6;918;911:22;873:2;970:9;957:23;989:31;1014:5;989:31;:::i;1325:398::-;;;1454:2;1442:9;1433:7;1429:23;1425:32;1422:2;;;1475:6;1467;1460:22;1422:2;1519:9;1506:23;1538:31;1563:5;1538:31;:::i;:::-;1588:5;-1:-1:-1;1645:2:1;1630:18;;1617:32;1658:33;1617:32;1658:33;:::i;:::-;1710:7;1700:17;;;1412:311;;;;;:::o;1728:1378::-;;;;;;;;;1997:3;1985:9;1976:7;1972:23;1968:33;1965:2;;;2019:6;2011;2004:22;1965:2;2063:9;2050:23;2082:31;2107:5;2082:31;:::i;:::-;2132:5;-1:-1:-1;2189:2:1;2174:18;;2161:32;2202:33;2161:32;2202:33;:::i;:::-;2254:7;-1:-1:-1;2312:2:1;2297:18;;2284:32;2335:18;2365:14;;;2362:2;;;2397:6;2389;2382:22;2362:2;2441:70;2503:7;2494:6;2483:9;2479:22;2441:70;:::i;:::-;2530:8;;-1:-1:-1;2415:96:1;-1:-1:-1;2618:2:1;2603:18;;2590:32;;-1:-1:-1;2634:16:1;;;2631:2;;;2668:6;2660;2653:22;2631:2;2712:72;2776:7;2765:8;2754:9;2750:24;2712:72;:::i;:::-;2803:8;;-1:-1:-1;2686:98:1;-1:-1:-1;2891:3:1;2876:19;;2863:33;;-1:-1:-1;2908:16:1;;;2905:2;;;2942:6;2934;2927:22;2905:2;;2986:60;3038:7;3027:8;3016:9;3012:24;2986:60;:::i;:::-;1955:1151;;;;-1:-1:-1;1955:1151:1;;-1:-1:-1;1955:1151:1;;;;;;3065:8;-1:-1:-1;;;1955:1151:1:o;3111:843::-;;;;;;;3310:3;3298:9;3289:7;3285:23;3281:33;3278:2;;;3332:6;3324;3317:22;3278:2;3376:9;3363:23;3395:31;3420:5;3395:31;:::i;:::-;3445:5;-1:-1:-1;3502:2:1;3487:18;;3474:32;3515:33;3474:32;3515:33;:::i;:::-;3567:7;-1:-1:-1;3621:2:1;3606:18;;3593:32;;-1:-1:-1;3672:2:1;3657:18;;3644:32;;-1:-1:-1;3727:3:1;3712:19;;3699:33;3755:18;3744:30;;3741:2;;;3792:6;3784;3777:22;3741:2;3836:58;3886:7;3877:6;3866:9;3862:22;3836:58;:::i;:::-;3268:686;;;;-1:-1:-1;3268:686:1;;-1:-1:-1;3268:686:1;;3913:8;;3268:686;-1:-1:-1;;;3268:686:1:o;3959:392::-;;;4085:2;4073:9;4064:7;4060:23;4056:32;4053:2;;;4106:6;4098;4091:22;4053:2;4150:9;4137:23;4169:31;4194:5;4169:31;:::i;:::-;4219:5;-1:-1:-1;4276:2:1;4261:18;;4248:32;4289:30;4248:32;4289:30;:::i;4356:1169::-;;;;4511:2;4499:9;4490:7;4486:23;4482:32;4479:2;;;4532:6;4524;4517:22;4479:2;4576:9;4563:23;4595:31;4620:5;4595:31;:::i;:::-;4645:5;-1:-1:-1;4697:2:1;4682:18;;4669:32;;-1:-1:-1;4752:2:1;4737:18;;4724:32;4775:18;4805:14;;;4802:2;;;4837:6;4829;4822:22;4802:2;4880:6;4869:9;4865:22;4855:32;;4925:7;4918:4;4914:2;4910:13;4906:27;4896:2;;4952:6;4944;4937:22;4896:2;4993;4980:16;5015:2;5011;5008:10;5005:2;;;5021:18;;:::i;:::-;5096:2;5090:9;5064:2;5150:13;;-1:-1:-1;;5146:22:1;;;5170:2;5142:31;5138:40;5126:53;;;5194:18;;;5214:22;;;5191:46;5188:2;;;5240:18;;:::i;:::-;5280:10;5276:2;5269:22;5315:2;5307:6;5300:18;5355:7;5350:2;5345;5341;5337:11;5333:20;5330:33;5327:2;;;5381:6;5373;5366:22;5327:2;5442;5437;5433;5429:11;5424:2;5416:6;5412:15;5399:46;5487:6;5482:2;5477;5469:6;5465:15;5461:24;5454:40;5513:6;5503:16;;;;;;;4469:1056;;;;;:::o;5530:255::-;;5650:2;5638:9;5629:7;5625:23;5621:32;5618:2;;;5671:6;5663;5656:22;5618:2;5708:9;5702:16;5727:28;5749:5;5727:28;:::i;5790:386::-;;;5913:2;5901:9;5892:7;5888:23;5884:32;5881:2;;;5934:6;5926;5919:22;5881:2;5978:9;5965:23;5997:28;6019:5;5997:28;:::i;6181:352::-;;6292:2;6280:9;6271:7;6267:23;6263:32;6260:2;;;6313:6;6305;6298:22;6260:2;6357:9;6344:23;6407:66;6400:5;6396:78;6389:5;6386:89;6376:2;;6494:6;6486;6479:22;6538:190;;6650:2;6638:9;6629:7;6625:23;6621:32;6618:2;;;6671:6;6663;6656:22;6618:2;-1:-1:-1;6699:23:1;;6608:120;-1:-1:-1;6608:120:1:o;6733:194::-;;6856:2;6844:9;6835:7;6831:23;6827:32;6824:2;;;6877:6;6869;6862:22;6824:2;-1:-1:-1;6905:16:1;;6814:113;-1:-1:-1;6814:113:1:o;6932:325::-;;;7061:2;7049:9;7040:7;7036:23;7032:32;7029:2;;;7082:6;7074;7067:22;7029:2;7123:9;7110:23;7100:33;;7183:2;7172:9;7168:18;7155:32;7196:31;7221:5;7196:31;:::i;7262:393::-;;;;7408:2;7396:9;7387:7;7383:23;7379:32;7376:2;;;7429:6;7421;7414:22;7376:2;7470:9;7457:23;7447:33;;7530:2;7519:9;7515:18;7502:32;7543:31;7568:5;7543:31;:::i;:::-;7366:289;;7593:5;;-1:-1:-1;;;7645:2:1;7630:18;;;;7617:32;;7366:289::o;7660:523::-;;;;;7817:3;7805:9;7796:7;7792:23;7788:33;7785:2;;;7839:6;7831;7824:22;7785:2;7880:9;7867:23;7857:33;;7937:2;7926:9;7922:18;7909:32;7899:42;;7991:2;7980:9;7976:18;7963:32;8004:28;8026:5;8004:28;:::i;:::-;8051:5;-1:-1:-1;8108:2:1;8093:18;;8080:32;8121:30;8080:32;8121:30;:::i;:::-;7775:408;;;;-1:-1:-1;7775:408:1;;-1:-1:-1;;7775:408:1:o;9467:871::-;;-1:-1:-1;;;;;9696:6:1;9692:55;9681:9;9674:74;9767:2;9805:6;9800:2;9789:9;9785:18;9778:34;9848:3;9843:2;9832:9;9828:18;9821:31;9881:6;9875:13;9925:6;9919:3;9908:9;9904:19;9897:35;9950:4;9963:141;9977:6;9974:1;9971:13;9963:141;;;10073:14;;;10069:23;;10063:30;10038:17;;;10057:3;10034:27;10027:67;9992:10;;9963:141;;;10122:6;10119:1;10116:13;10113:2;;;10193:4;10187:3;10178:6;10167:9;10163:22;10159:32;10152:46;10113:2;-1:-1:-1;10269:2:1;10248:15;-1:-1:-1;;10244:29:1;10229:45;;10276:3;10225:55;;-1:-1:-1;10289:43:1;;-1:-1:-1;10328:2:1;10313:18;;10305:6;8258:13;8251:21;8239:34;;8229:50;10289:43;9664:674;;;;;;;:::o;10343:684::-;10514:2;10566:21;;;10636:13;;10539:18;;;10658:22;;;10343:684;;10514:2;10737:15;;;;10711:2;10696:18;;;10343:684;10783:218;10797:6;10794:1;10791:13;10783:218;;;10862:13;;-1:-1:-1;;;;;10858:62:1;10846:75;;10976:15;;;;10941:12;;;;10819:1;10812:9;10783:218;;;-1:-1:-1;11018:3:1;;10494:533;-1:-1:-1;;;;;;10494:533:1:o;11032:635::-;11203:2;11255:21;;;11325:13;;11228:18;;;11347:22;;;11032:635;;11203:2;11426:15;;;;11400:2;11385:18;;;11032:635;11472:169;11486:6;11483:1;11480:13;11472:169;;;11547:13;;11535:26;;11616:15;;;;11581:12;;;;11508:1;11501:9;11472:169;;16980:128;;17051:1;17047:6;17044:1;17041:13;17038:2;;;17057:18;;:::i;:::-;-1:-1:-1;17093:9:1;;17028:80::o;17113:125::-;;17181:1;17178;17175:8;17172:2;;;17186:18;;:::i;:::-;-1:-1:-1;17223:9:1;;17162:76::o;17243:437::-;17328:1;17318:12;;17375:1;17365:12;;;17386:2;;17440:4;17432:6;17428:17;17418:27;;17386:2;17493;17485:6;17482:14;17462:18;17459:38;17456:2;;;-1:-1:-1;;;17527:1:1;17520:88;17631:4;17628:1;17621:15;17659:4;17656:1;17649:15;17685:135;;-1:-1:-1;;17745:17:1;;17742:2;;;17765:18;;:::i;:::-;-1:-1:-1;17812:1:1;17801:13;;17732:88::o;17825:184::-;-1:-1:-1;;;17874:1:1;17867:88;17974:4;17971:1;17964:15;17998:4;17995:1;17988:15;18014:184;-1:-1:-1;;;18063:1:1;18056:88;18163:4;18160:1;18153:15;18187:4;18184:1;18177:15;18203:154;-1:-1:-1;;;;;18282:5:1;18278:54;18271:5;18268:65;18258:2;;18347:1;18344;18337:12;18362:118;18448:5;18441:13;18434:21;18427:5;18424:32;18414:2;;18470:1;18467;18460:12

Swarm Source

ipfs://fd7c8b006c388fb4a90263e17ef8bcbda249ae6234462bb13152d4070459242e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

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.