ETH Price: $3,242.50 (-4.73%)
 

Overview

Max Total Supply

0 GLS sale

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PresaleControl

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-12-16
*/

// Sources flattened with hardhat v2.22.17 https://hardhat.org

// SPDX-License-Identifier: MIT AND UNLICENSED

// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File @openzeppelin/contracts/security/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}


// File contracts/PresaleControl.sol

// Original license: SPDX_License_Identifier: UNLICENSED
pragma solidity =0.8.19;

contract PresaleControl is Ownable, ReentrancyGuard {
    using ECDSA for bytes32;

    event Buy(int8 round, address indexed from, uint256 value, uint256 token);
    event Transfer(address indexed to, uint256 token);

    address public tokenAddr; // erc20 token address, decimals 1e18
    address public treasuryAddr; // ETH treasure address
    int8 public roundLatest = -1; // round is start at 0
    string public name = 'GLS sale';

    struct RoundOpt {
        uint256 startTime; // round start at
        uint256 endTime; // round end at
        uint256 totalSupply; // total erc20 token supply for this round
        uint256 raiseCap; // total raise cap, 0 means nolimit
        uint256 perUnit; // token amount = perUnit * 1ETH, 0 means we should wait for the round to end
        uint256 minBuy; //  minimun amount per wallet
        uint256 maxBuy; // maximum amount per wallet, 0 means nolimit
        address signerAddress; // signer for whitelist, empty means nolimit

        // vesting period
        uint256 vestingStartTime; // vestingStartTime > tokenReleaseAt
        uint256 vestingEndTime; //
        uint256 initVestedPerc; // 0~100
    }

    struct RoundStat {
        uint256 totalRaised; // eth
        uint256 totalToken; // token
        uint256 totalClaim; // token
    }

    struct Wallet {
        uint256 totalDeposited; // eth
        uint256 totalToken; // token
        uint256 totalClaim; // token
    }

    mapping(int8 => RoundOpt) public roundOpts;
    mapping(int8 => RoundStat) public roundStat;
    mapping(int8 => mapping(address => Wallet)) public wallets;

    constructor(address _tokenAddr, address _treasuryAddr) {
        tokenAddr = _tokenAddr;
        treasuryAddr = _treasuryAddr;
    }

    // ============= State Function  =============
    
    function currentRound() public view returns (int8) {
        int8 _currentRound = -1;
        for (int8 roundNum = 0; roundNum <= roundLatest; roundNum++) {
            RoundOpt storage opt = roundOpts[roundNum];
            if (opt.startTime <= block.timestamp) {
                _currentRound = roundNum;
            }
        } 
        return _currentRound;
    }

    // ============= Exchange Function  =============

    function buy(bytes memory signature) external payable {
        int8 _currentRound = currentRound();

        RoundOpt storage opt = roundOpts[_currentRound];
        RoundStat storage stat = roundStat[_currentRound];
        Wallet storage wallet = wallets[_currentRound][msg.sender];

        _requireValidRoundWallet(_currentRound, wallet, opt, stat, signature);

        // record raise
        stat.totalRaised += msg.value;
        wallet.totalDeposited += msg.value;

        // exchange token (if perUnit == 0, the amount is determined at the end of the round)
        uint256 amount = opt.perUnit * msg.value;

        // transfer to treasure
       (payable(treasuryAddr)).transfer(msg.value);

        emit Buy(_currentRound, msg.sender, msg.value, amount);

        if (amount > 0) {
            wallet.totalToken += amount;
            stat.totalToken += amount;
        }
    }

    // ============= Claim Fuciton ===============

    // User claim
    function totalToken(address addr) external view returns (uint256 deposited, uint256 amount, uint256 claimable, uint256 claimed) {
        int8 _currentRound = currentRound();

        for (int8 roundNum = 0; roundNum <= _currentRound; roundNum++) {
            RoundOpt storage opt = roundOpts[roundNum];
            RoundStat storage stat = roundStat[roundNum];
            Wallet storage wallet = wallets[roundNum][addr];

            amount += _getBoughtToken(wallet, opt, stat);
            claimable += _claimableToken(wallet, opt, stat);
            claimed += wallet.totalClaim;
            deposited += wallet.totalDeposited;
        }

        return (deposited, amount, claimable, claimed);
    }

    function _getBoughtToken(
        Wallet storage wallet,
        RoundOpt storage opt,
        RoundStat storage stat
    ) private view returns (uint256) {
        if (opt.perUnit == 0) {
            if (opt.endTime > block.timestamp) {
                return 0;
            } else {
                return opt.totalSupply / stat.totalRaised * wallet.totalDeposited;
            }
        } else {
            return wallet.totalToken;
        }
    }

    function _claimableToken(
        Wallet storage wallet,
        RoundOpt storage opt,
        RoundStat storage stat
    ) private view returns (uint256) {
        uint256 _totalToken = _getBoughtToken(wallet, opt, stat);

        uint256 vested = getVestedAmount(_totalToken, opt);

        require(vested <= _totalToken, "AssertionFailed: vested <= _totalToken");
        require(vested >= wallet.totalClaim, "AssertionFailed: vested >= wallet.totalClaim");

        return vested - wallet.totalClaim;
    }

    function getVestedAmount(uint256 boughtAmount, RoundOpt storage opt) private view returns (uint256) {
        if (opt.vestingStartTime > block.timestamp) {
            return 0;
        }

        uint256 initVestedAmount = boughtAmount / 100 * opt.initVestedPerc;

        uint256 vestingAmount = boughtAmount - initVestedAmount;

        uint256 vestedAmount = 0;
        if (opt.vestingEndTime < block.timestamp) {
            vestedAmount = vestingAmount;
        } else {
            vestedAmount = vestingAmount / (opt.vestingEndTime - opt.vestingStartTime) * (block.timestamp - opt.vestingStartTime);
        }

        return vestedAmount + initVestedAmount;
    }

    // claimAll claimable token
    function claimAll(address addr) external nonReentrant {
        int8 _currentRound = currentRound();

        for (int8 roundNum = 0; roundNum <= _currentRound; roundNum++) {
            _claim(addr, roundNum);
        }
    }
    
    function _claim(address addr, int8 roundNum) private {
        RoundStat storage stat = roundStat[roundNum];
        Wallet storage wallet = wallets[roundNum][addr];

        uint256 claimable = _claimableToken(wallet, roundOpts[roundNum], stat);
        if (claimable == 0) {
            return;
        }

        wallet.totalClaim += claimable;
        stat.totalClaim += claimable;
    
        IERC20(tokenAddr).transfer(addr, claimable);
        emit Transfer(addr, claimable);
    }

    // =========== Admin Fuction (onlyOwner)============

    // setup round
    function setupRound(
        int8 roundNum,
        RoundOpt calldata opt
    ) external onlyOwner {
        require(roundNum >= 0 && roundNum <= roundLatest + 1, "Presale: invalid roundNum");
        require(
            opt.startTime > 0 && opt.endTime > opt.startTime,
            "Presale: invalid startTime or endTime"
        );
        require(opt.minBuy > 0, "Presale: invalid minBuy");
        require(
            opt.raiseCap >= 0 && opt.totalSupply > 0,
            "Presale: invalid raiseCap or totalSupply"
        );

        if (opt.raiseCap > 0 && opt.totalSupply > 0) {
            require(opt.perUnit > 0, "Presale: invalid perUnit");
        }

        if (roundNum > roundLatest) {
            roundLatest = roundNum;
        }

        roundOpts[roundNum] = opt;
    }

    // withdraw
    function withdraw() external onlyOwner {
        uint256 count = address(this).balance;
        (payable(msg.sender)).transfer(count);
    }

    function withdrawToken(address addr) external onlyOwner {
        uint256 count = IERC20(tokenAddr).balanceOf(address(this));
        IERC20(tokenAddr).transfer(addr, count);
    }

    // internal helper
    function _requireValidRoundWallet(
        int8 _currentRound, 
        Wallet storage wallet,
        RoundOpt storage opt,
        RoundStat storage stat,
        bytes memory signature
    ) internal {
        // check basic
        require(_currentRound >= 0, "Presale Launch is not init");
        require(
            opt.startTime <= block.timestamp && block.timestamp <= opt.endTime,
            "Presale Launch: wrong time for this round"
        );

        require(msg.value >= opt.minBuy, "Presale: less than minBuy");

        // check whitelist
        if (opt.signerAddress != address(0)) {
            bytes32 messageHash = keccak256(abi.encodePacked(msg.sender));
            require(
                opt.signerAddress ==
                    messageHash.toEthSignedMessageHash().recover(signature),
                    "Presale: sender not in whitelist"
            );
        }

        // check round totalRaised
        if (opt.raiseCap > 0) {
            require(
                stat.totalRaised + msg.value <= opt.raiseCap,
                "Presale: more than raise cap!"
            );
        }

        // check user totalDeposited
        if (opt.maxBuy > 0) {
            require(
                wallet.totalDeposited + msg.value <= opt.maxBuy,
                "Presale: totalDeposited more than maxBuy"
            );
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_treasuryAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int8","name":"round","type":"int8"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"token","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roundLatest","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int8","name":"","type":"int8"}],"name":"roundOpts","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"raiseCap","type":"uint256"},{"internalType":"uint256","name":"perUnit","type":"uint256"},{"internalType":"uint256","name":"minBuy","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"address","name":"signerAddress","type":"address"},{"internalType":"uint256","name":"vestingStartTime","type":"uint256"},{"internalType":"uint256","name":"vestingEndTime","type":"uint256"},{"internalType":"uint256","name":"initVestedPerc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int8","name":"","type":"int8"}],"name":"roundStat","outputs":[{"internalType":"uint256","name":"totalRaised","type":"uint256"},{"internalType":"uint256","name":"totalToken","type":"uint256"},{"internalType":"uint256","name":"totalClaim","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int8","name":"roundNum","type":"int8"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"raiseCap","type":"uint256"},{"internalType":"uint256","name":"perUnit","type":"uint256"},{"internalType":"uint256","name":"minBuy","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"address","name":"signerAddress","type":"address"},{"internalType":"uint256","name":"vestingStartTime","type":"uint256"},{"internalType":"uint256","name":"vestingEndTime","type":"uint256"},{"internalType":"uint256","name":"initVestedPerc","type":"uint256"}],"internalType":"struct PresaleControl.RoundOpt","name":"opt","type":"tuple"}],"name":"setupRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"totalToken","outputs":[{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int8","name":"","type":"int8"},{"internalType":"address","name":"","type":"address"}],"name":"wallets","outputs":[{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"totalToken","type":"uint256"},{"internalType":"uint256","name":"totalClaim","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600360146101000a81548160ff021916908360000b60ff1602179055506040518060400160405280600881526020017f474c532073616c6500000000000000000000000000000000000000000000000081525060049081620000889190620004b3565b503480156200009657600080fd5b50604051620037c3380380620037c38339818101604052810190620000bc919062000604565b620000dc620000d06200016d60201b60201c565b6200017560201b60201c565b6001808190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200064b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bb57607f821691505b602082108103620002d157620002d062000273565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fc565b620003478683620002fc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003946200038e62000388846200035f565b62000369565b6200035f565b9050919050565b6000819050919050565b620003b08362000373565b620003c8620003bf826200039b565b84845462000309565b825550505050565b600090565b620003df620003d0565b620003ec818484620003a5565b505050565b5b81811015620004145762000408600082620003d5565b600181019050620003f2565b5050565b601f82111562000463576200042d81620002d7565b6200043884620002ec565b8101602085101562000448578190505b620004606200045785620002ec565b830182620003f1565b50505b505050565b600082821c905092915050565b6000620004886000198460080262000468565b1980831691505092915050565b6000620004a3838362000475565b9150826002028217905092915050565b620004be8262000239565b67ffffffffffffffff811115620004da57620004d962000244565b5b620004e68254620002a2565b620004f382828562000418565b600060209050601f8311600181146200052b576000841562000516578287015190505b62000522858262000495565b86555062000592565b601f1984166200053b86620002d7565b60005b8281101562000565578489015182556001820191506020850194506020810190506200053e565b8683101562000585578489015162000581601f89168262000475565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005cc826200059f565b9050919050565b620005de81620005bf565b8114620005ea57600080fd5b50565b600081519050620005fe81620005d3565b92915050565b600080604083850312156200061e576200061d6200059a565b5b60006200062e85828601620005ed565b92505060206200064185828601620005ed565b9150509250929050565b613168806200065b6000396000f3fe6080604052600436106100fe5760003560e01c806377329f351161009557806391f3839a1161006457806391f3839a146102f5578063b300696614610320578063b40ad0841461035f578063e4cdcbee14610388578063f2fde38b146103cf576100fe565b806377329f351461024d57806389476069146102765780638a19c8bc1461029f5780638da5cb5b146102ca576100fe565b80635cf3b15f116100d15780635cf3b15f1461018c5780635fbe4d1d146101cc57806361ab4dad146101f7578063715018a614610236576100fe565b806306fdde031461010357806330d9a62a1461012e5780633ccfd60b146101595780634559b89214610170575b600080fd5b34801561010f57600080fd5b506101186103f8565b6040516101259190611a92565b60405180910390f35b34801561013a57600080fd5b50610143610486565b6040516101509190611af5565b60405180910390f35b34801561016557600080fd5b5061016e6104ac565b005b61018a60048036038101906101859190611c59565b610503565b005b34801561019857600080fd5b506101b360048036038101906101ae9190611cce565b6106fd565b6040516101c39493929190611d14565b60405180910390f35b3480156101d857600080fd5b506101e1610826565b6040516101ee9190611af5565b60405180910390f35b34801561020357600080fd5b5061021e60048036038101906102199190611d92565b61084c565b60405161022d93929190611dd2565b60405180910390f35b34801561024257600080fd5b5061024b610883565b005b34801561025957600080fd5b50610274600480360381019061026f9190611cce565b610897565b005b34801561028257600080fd5b5061029d60048036038101906102989190611cce565b610929565b005b3480156102ab57600080fd5b506102b4610a76565b6040516102c19190611e18565b60405180910390f35b3480156102d657600080fd5b506102df610b03565b6040516102ec9190611af5565b60405180910390f35b34801561030157600080fd5b5061030a610b2c565b6040516103179190611e18565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190611e33565b610b3f565b60405161035693929190611dd2565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190611e85565b610b69565b005b34801561039457600080fd5b506103af60048036038101906103aa9190611e33565b610dac565b6040516103c69b9a99989796959493929190611ec6565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190611cce565b610e26565b005b6004805461040590611fa0565b80601f016020809104026020016040519081016040528092919081815260200182805461043190611fa0565b801561047e5780601f106104535761010080835404028352916020019161047e565b820191906000526020600020905b81548152906001019060200180831161046157829003601f168201915b505050505081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104b4610ea9565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156104ff573d6000803e3d6000fd5b5050565b600061050d610a76565b90506000600560008360000b60000b815260200190815260200160002090506000600660008460000b60000b815260200190815260200160002090506000600760008560000b60000b815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506105b08482858589610f27565b348260000160008282546105c49190612000565b92505081905550348160000160008282546105df9190612000565b9250508190555060003484600401546105f89190612034565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610662573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f34a4d1753fc90652c377de75726b42a284c7edcd0b5480a00b0ea6703bec29c08634846040516106ad93929190612076565b60405180910390a260008111156106f557808260010160008282546106d29190612000565b92505081905550808360010160008282546106ed9190612000565b925050819055505b505050505050565b600080600080600061070d610a76565b905060005b8160000b8160000b1361081d576000600560008360000b60000b815260200190815260200160002090506000600660008460000b60000b815260200190815260200160002090506000600760008560000b60000b815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506107be81848461120c565b886107c99190612000565b97506107d6818484611267565b876107e19190612000565b96508060020154866107f39190612000565b95508060000154896108059190612000565b98505050508080610815906120ad565b915050610712565b50509193509193565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b61088b610ea9565b610895600061132a565b565b6002600154036108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d390612122565b60405180910390fd5b600260018190555060006108ee610a76565b905060005b8160000b8160000b1361091d5761090a83826113ee565b8080610915906120ad565b9150506108f3565b50506001808190555050565b610931610ea9565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161098e9190611af5565b602060405180830381865afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf919061216e565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610a2e92919061219b565b6020604051808303816000875af1158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7191906121fc565b505050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060005b600360149054906101000a900460000b60000b8160000b13610afb576000600560008360000b60000b8152602001908152602001600020905042816000015411610ae7578192505b508080610af3906120ad565b915050610a9f565b508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460000b81565b60066020528060005260406000206000915090508060000154908060010154908060020154905083565b610b71610ea9565b60008260000b12158015610ba657506001600360149054906101000a900460000b610b9c9190612229565b60000b8260000b13155b610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc906122ce565b60405180910390fd5b60008160000135118015610c00575080600001358160200135115b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612360565b60405180910390fd5b60008160a0013511610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d906123cc565b60405180910390fd5b6000816060013510158015610c9f575060008160400135115b610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd59061245e565b60405180910390fd5b60008160600135118015610cf6575060008160400135115b15610d43576000816080013511610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906124ca565b60405180910390fd5b5b600360149054906101000a900460000b60000b8260000b1315610d7f5781600360146101000a81548160ff021916908360000b60ff1602179055505b80600560008460000b60000b81526020019081526020016000208181610da591906127d9565b9050505050565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600801549080600901549080600a015490508b565b610e2e610ea9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490612859565b60405180910390fd5b610ea68161132a565b50565b610eb16115c9565b73ffffffffffffffffffffffffffffffffffffffff16610ecf610b03565b73ffffffffffffffffffffffffffffffffffffffff1614610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906128c5565b60405180910390fd5b565b60008560000b1215610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590612931565b60405180910390fd5b42836000015411158015610f86575082600101544211155b610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc906129c3565b60405180910390fd5b826005015434101561100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390612a2f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168360070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461113d576000336040516020016110779190612a97565b6040516020818303038152906040528051906020012090506110aa8261109c836115d1565b61160190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff168460070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290612afe565b60405180910390fd5b505b6000836003015411156111a157826003015434836000015461115f9190612000565b11156111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119790612b6a565b60405180910390fd5b5b6000836006015411156112055782600601543485600001546111c39190612000565b1115611204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fb90612bfc565b60405180910390fd5b5b5050505050565b60008083600401540361125857428360010154111561122e5760009050611260565b8360000154826000015484600201546112479190612c4b565b6112519190612034565b9050611260565b836001015490505b9392505050565b60008061127585858561120c565b905060006112838286611628565b9050818111156112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90612cee565b60405180910390fd5b856002015481101561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690612d80565b60405180910390fd5b85600201548161131f9190612da0565b925050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600660008360000b60000b815260200190815260200160002090506000600760008460000b60000b815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061148a82600560008760000b60000b815260200190815260200160002085611267565b90506000810361149c575050506115c5565b808260020160008282546114b09190612000565b92505081905550808360020160008282546114cb9190612000565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b815260040161152f92919061219b565b6020604051808303816000875af115801561154e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157291906121fc565b508473ffffffffffffffffffffffffffffffffffffffff167f69ca02dd4edd7bf0a4abb9ed3b7af3f14778db5d61921c7dc7cd545266326de2826040516115b99190612dd4565b60405180910390a25050505b5050565b600033905090565b6000816040516020016115e49190612e71565b604051602081830303815290604052805190602001209050919050565b600080600061161085856116d9565b9150915061161d8161172a565b819250505092915050565b6000428260080154111561163f57600090506116d3565b600082600a01546064856116539190612c4b565b61165d9190612034565b90506000818561166d9190612da0565b905060004285600901541015611685578190506116c1565b8460080154426116959190612da0565b856008015486600901546116a99190612da0565b836116b49190612c4b565b6116be9190612034565b90505b82816116cd9190612000565b93505050505b92915050565b600080604183510361171a5760008060006020860151925060408601519150606086015160001a905061170e878285856118f6565b94509450505050611723565b60006002915091505b9250929050565b6000600481111561173e5761173d612e97565b5b81600481111561175157611750612e97565b5b03156118f3576001600481111561176b5761176a612e97565b5b81600481111561177e5761177d612e97565b5b036117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590612f12565b60405180910390fd5b600260048111156117d2576117d1612e97565b5b8160048111156117e5576117e4612e97565b5b03611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90612f7e565b60405180910390fd5b6003600481111561183957611838612e97565b5b81600481111561184c5761184b612e97565b5b0361188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613010565b60405180910390fd5b60048081111561189f5761189e612e97565b5b8160048111156118b2576118b1612e97565b5b036118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906130a2565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156119315760006003915091506119f9565b601b8560ff16141580156119495750601c8560ff1614155b1561195b5760006004915091506119f9565b60006001878787876040516000815260200160405260405161198094939291906130ed565b6020604051602081039080840390855afa1580156119a2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f0576000600192509250506119f9565b80600092509250505b94509492505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a3c578082015181840152602081019050611a21565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a6482611a02565b611a6e8185611a0d565b9350611a7e818560208601611a1e565b611a8781611a48565b840191505092915050565b60006020820190508181036000830152611aac8184611a59565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611adf82611ab4565b9050919050565b611aef81611ad4565b82525050565b6000602082019050611b0a6000830184611ae6565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6682611a48565b810181811067ffffffffffffffff82111715611b8557611b84611b2e565b5b80604052505050565b6000611b98611b10565b9050611ba48282611b5d565b919050565b600067ffffffffffffffff821115611bc457611bc3611b2e565b5b611bcd82611a48565b9050602081019050919050565b82818337600083830152505050565b6000611bfc611bf784611ba9565b611b8e565b905082815260208101848484011115611c1857611c17611b29565b5b611c23848285611bda565b509392505050565b600082601f830112611c4057611c3f611b24565b5b8135611c50848260208601611be9565b91505092915050565b600060208284031215611c6f57611c6e611b1a565b5b600082013567ffffffffffffffff811115611c8d57611c8c611b1f565b5b611c9984828501611c2b565b91505092915050565b611cab81611ad4565b8114611cb657600080fd5b50565b600081359050611cc881611ca2565b92915050565b600060208284031215611ce457611ce3611b1a565b5b6000611cf284828501611cb9565b91505092915050565b6000819050919050565b611d0e81611cfb565b82525050565b6000608082019050611d296000830187611d05565b611d366020830186611d05565b611d436040830185611d05565b611d506060830184611d05565b95945050505050565b60008160000b9050919050565b611d6f81611d59565b8114611d7a57600080fd5b50565b600081359050611d8c81611d66565b92915050565b60008060408385031215611da957611da8611b1a565b5b6000611db785828601611d7d565b9250506020611dc885828601611cb9565b9150509250929050565b6000606082019050611de76000830186611d05565b611df46020830185611d05565b611e016040830184611d05565b949350505050565b611e1281611d59565b82525050565b6000602082019050611e2d6000830184611e09565b92915050565b600060208284031215611e4957611e48611b1a565b5b6000611e5784828501611d7d565b91505092915050565b600080fd5b60006101608284031215611e7c57611e7b611e60565b5b81905092915050565b6000806101808385031215611e9d57611e9c611b1a565b5b6000611eab85828601611d7d565b9250506020611ebc85828601611e65565b9150509250929050565b600061016082019050611edc600083018e611d05565b611ee9602083018d611d05565b611ef6604083018c611d05565b611f03606083018b611d05565b611f10608083018a611d05565b611f1d60a0830189611d05565b611f2a60c0830188611d05565b611f3760e0830187611ae6565b611f45610100830186611d05565b611f53610120830185611d05565b611f61610140830184611d05565b9c9b505050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611fb857607f821691505b602082108103611fcb57611fca611f71565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061200b82611cfb565b915061201683611cfb565b925082820190508082111561202e5761202d611fd1565b5b92915050565b600061203f82611cfb565b915061204a83611cfb565b925082820261205881611cfb565b9150828204841483151761206f5761206e611fd1565b5b5092915050565b600060608201905061208b6000830186611e09565b6120986020830185611d05565b6120a56040830184611d05565b949350505050565b60006120b882611d59565b9150607f82036120cb576120ca611fd1565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061210c601f83611a0d565b9150612117826120d6565b602082019050919050565b6000602082019050818103600083015261213b816120ff565b9050919050565b61214b81611cfb565b811461215657600080fd5b50565b60008151905061216881612142565b92915050565b60006020828403121561218457612183611b1a565b5b600061219284828501612159565b91505092915050565b60006040820190506121b06000830185611ae6565b6121bd6020830184611d05565b9392505050565b60008115159050919050565b6121d9816121c4565b81146121e457600080fd5b50565b6000815190506121f6816121d0565b92915050565b60006020828403121561221257612211611b1a565b5b6000612220848285016121e7565b91505092915050565b600061223482611d59565b915061223f83611d59565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f8213171561227c5761227b611fd1565b5b92915050565b7f50726573616c653a20696e76616c696420726f756e644e756d00000000000000600082015250565b60006122b8601983611a0d565b91506122c382612282565b602082019050919050565b600060208201905081810360008301526122e7816122ab565b9050919050565b7f50726573616c653a20696e76616c696420737461727454696d65206f7220656e60008201527f6454696d65000000000000000000000000000000000000000000000000000000602082015250565b600061234a602583611a0d565b9150612355826122ee565b604082019050919050565b600060208201905081810360008301526123798161233d565b9050919050565b7f50726573616c653a20696e76616c6964206d696e427579000000000000000000600082015250565b60006123b6601783611a0d565b91506123c182612380565b602082019050919050565b600060208201905081810360008301526123e5816123a9565b9050919050565b7f50726573616c653a20696e76616c6964207261697365436170206f7220746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000612448602883611a0d565b9150612453826123ec565b604082019050919050565b600060208201905081810360008301526124778161243b565b9050919050565b7f50726573616c653a20696e76616c696420706572556e69740000000000000000600082015250565b60006124b4601883611a0d565b91506124bf8261247e565b602082019050919050565b600060208201905081810360008301526124e3816124a7565b9050919050565b600081356124f781612142565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61253984612500565b9350801983169250808416831791505092915050565b6000819050919050565b600061257461256f61256a84611cfb565b61254f565b611cfb565b9050919050565b6000819050919050565b61258e82612559565b6125a161259a8261257b565b835461250d565b8255505050565b600081356125b581611ca2565b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff6125de84612500565b9350801983169250808416831791505092915050565b600061260f61260a61260584611ab4565b61254f565b611ab4565b9050919050565b6000612621826125f4565b9050919050565b600061263382612616565b9050919050565b6000819050919050565b61264d82612628565b6126606126598261263a565b83546125be565b8255505050565b600081016000830180612679816124ea565b90506126858184612585565b50505060018101602083018061269a816124ea565b90506126a68184612585565b5050506002810160408301806126bb816124ea565b90506126c78184612585565b5050506003810160608301806126dc816124ea565b90506126e88184612585565b5050506004810160808301806126fd816124ea565b90506127098184612585565b5050506005810160a083018061271e816124ea565b905061272a8184612585565b5050506006810160c083018061273f816124ea565b905061274b8184612585565b5050506007810160e0830180612760816125a8565b905061276c8184612644565b50505060088101610100830180612782816124ea565b905061278e8184612585565b505050600981016101208301806127a4816124ea565b90506127b08184612585565b505050600a81016101408301806127c6816124ea565b90506127d28184612585565b5050505050565b6127e38282612667565b5050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612843602683611a0d565b915061284e826127e7565b604082019050919050565b6000602082019050818103600083015261287281612836565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128af602083611a0d565b91506128ba82612879565b602082019050919050565b600060208201905081810360008301526128de816128a2565b9050919050565b7f50726573616c65204c61756e6368206973206e6f7420696e6974000000000000600082015250565b600061291b601a83611a0d565b9150612926826128e5565b602082019050919050565b6000602082019050818103600083015261294a8161290e565b9050919050565b7f50726573616c65204c61756e63683a2077726f6e672074696d6520666f72207460008201527f68697320726f756e640000000000000000000000000000000000000000000000602082015250565b60006129ad602983611a0d565b91506129b882612951565b604082019050919050565b600060208201905081810360008301526129dc816129a0565b9050919050565b7f50726573616c653a206c657373207468616e206d696e42757900000000000000600082015250565b6000612a19601983611a0d565b9150612a24826129e3565b602082019050919050565b60006020820190508181036000830152612a4881612a0c565b9050919050565b60008160601b9050919050565b6000612a6782612a4f565b9050919050565b6000612a7982612a5c565b9050919050565b612a91612a8c82611ad4565b612a6e565b82525050565b6000612aa38284612a80565b60148201915081905092915050565b7f50726573616c653a2073656e646572206e6f7420696e2077686974656c697374600082015250565b6000612ae8602083611a0d565b9150612af382612ab2565b602082019050919050565b60006020820190508181036000830152612b1781612adb565b9050919050565b7f50726573616c653a206d6f7265207468616e2072616973652063617021000000600082015250565b6000612b54601d83611a0d565b9150612b5f82612b1e565b602082019050919050565b60006020820190508181036000830152612b8381612b47565b9050919050565b7f50726573616c653a20746f74616c4465706f7369746564206d6f72652074686160008201527f6e206d6178427579000000000000000000000000000000000000000000000000602082015250565b6000612be6602883611a0d565b9150612bf182612b8a565b604082019050919050565b60006020820190508181036000830152612c1581612bd9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c5682611cfb565b9150612c6183611cfb565b925082612c7157612c70612c1c565b5b828204905092915050565b7f417373657274696f6e4661696c65643a20766573746564203c3d205f746f746160008201527f6c546f6b656e0000000000000000000000000000000000000000000000000000602082015250565b6000612cd8602683611a0d565b9150612ce382612c7c565b604082019050919050565b60006020820190508181036000830152612d0781612ccb565b9050919050565b7f417373657274696f6e4661696c65643a20766573746564203e3d2077616c6c6560008201527f742e746f74616c436c61696d0000000000000000000000000000000000000000602082015250565b6000612d6a602c83611a0d565b9150612d7582612d0e565b604082019050919050565b60006020820190508181036000830152612d9981612d5d565b9050919050565b6000612dab82611cfb565b9150612db683611cfb565b9250828203905081811115612dce57612dcd611fd1565b5b92915050565b6000602082019050612de96000830184611d05565b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612e30601c83612def565b9150612e3b82612dfa565b601c82019050919050565b6000819050919050565b6000819050919050565b612e6b612e6682612e46565b612e50565b82525050565b6000612e7c82612e23565b9150612e888284612e5a565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612efc601883611a0d565b9150612f0782612ec6565b602082019050919050565b60006020820190508181036000830152612f2b81612eef565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612f68601f83611a0d565b9150612f7382612f32565b602082019050919050565b60006020820190508181036000830152612f9781612f5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ffa602283611a0d565b915061300582612f9e565b604082019050919050565b6000602082019050818103600083015261302981612fed565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061308c602283611a0d565b915061309782613030565b604082019050919050565b600060208201905081810360008301526130bb8161307f565b9050919050565b6130cb81612e46565b82525050565b600060ff82169050919050565b6130e7816130d1565b82525050565b600060808201905061310260008301876130c2565b61310f60208301866130de565b61311c60408301856130c2565b61312960608301846130c2565b9594505050505056fea2646970667358221220af5c42b79b68e2ea63b783201545f5ccd478ba6efcf3fb4466b5ed321ca4917864736f6c6343000813003300000000000000000000000068e2e5c9dff32419a108713f83274a4fb5e194ca000000000000000000000000e1c3542a483010404cf1fff150ea6349b7d0a8b0

Deployed Bytecode

0x6080604052600436106100fe5760003560e01c806377329f351161009557806391f3839a1161006457806391f3839a146102f5578063b300696614610320578063b40ad0841461035f578063e4cdcbee14610388578063f2fde38b146103cf576100fe565b806377329f351461024d57806389476069146102765780638a19c8bc1461029f5780638da5cb5b146102ca576100fe565b80635cf3b15f116100d15780635cf3b15f1461018c5780635fbe4d1d146101cc57806361ab4dad146101f7578063715018a614610236576100fe565b806306fdde031461010357806330d9a62a1461012e5780633ccfd60b146101595780634559b89214610170575b600080fd5b34801561010f57600080fd5b506101186103f8565b6040516101259190611a92565b60405180910390f35b34801561013a57600080fd5b50610143610486565b6040516101509190611af5565b60405180910390f35b34801561016557600080fd5b5061016e6104ac565b005b61018a60048036038101906101859190611c59565b610503565b005b34801561019857600080fd5b506101b360048036038101906101ae9190611cce565b6106fd565b6040516101c39493929190611d14565b60405180910390f35b3480156101d857600080fd5b506101e1610826565b6040516101ee9190611af5565b60405180910390f35b34801561020357600080fd5b5061021e60048036038101906102199190611d92565b61084c565b60405161022d93929190611dd2565b60405180910390f35b34801561024257600080fd5b5061024b610883565b005b34801561025957600080fd5b50610274600480360381019061026f9190611cce565b610897565b005b34801561028257600080fd5b5061029d60048036038101906102989190611cce565b610929565b005b3480156102ab57600080fd5b506102b4610a76565b6040516102c19190611e18565b60405180910390f35b3480156102d657600080fd5b506102df610b03565b6040516102ec9190611af5565b60405180910390f35b34801561030157600080fd5b5061030a610b2c565b6040516103179190611e18565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190611e33565b610b3f565b60405161035693929190611dd2565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190611e85565b610b69565b005b34801561039457600080fd5b506103af60048036038101906103aa9190611e33565b610dac565b6040516103c69b9a99989796959493929190611ec6565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190611cce565b610e26565b005b6004805461040590611fa0565b80601f016020809104026020016040519081016040528092919081815260200182805461043190611fa0565b801561047e5780601f106104535761010080835404028352916020019161047e565b820191906000526020600020905b81548152906001019060200180831161046157829003601f168201915b505050505081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104b4610ea9565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156104ff573d6000803e3d6000fd5b5050565b600061050d610a76565b90506000600560008360000b60000b815260200190815260200160002090506000600660008460000b60000b815260200190815260200160002090506000600760008560000b60000b815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506105b08482858589610f27565b348260000160008282546105c49190612000565b92505081905550348160000160008282546105df9190612000565b9250508190555060003484600401546105f89190612034565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610662573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f34a4d1753fc90652c377de75726b42a284c7edcd0b5480a00b0ea6703bec29c08634846040516106ad93929190612076565b60405180910390a260008111156106f557808260010160008282546106d29190612000565b92505081905550808360010160008282546106ed9190612000565b925050819055505b505050505050565b600080600080600061070d610a76565b905060005b8160000b8160000b1361081d576000600560008360000b60000b815260200190815260200160002090506000600660008460000b60000b815260200190815260200160002090506000600760008560000b60000b815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506107be81848461120c565b886107c99190612000565b97506107d6818484611267565b876107e19190612000565b96508060020154866107f39190612000565b95508060000154896108059190612000565b98505050508080610815906120ad565b915050610712565b50509193509193565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b61088b610ea9565b610895600061132a565b565b6002600154036108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d390612122565b60405180910390fd5b600260018190555060006108ee610a76565b905060005b8160000b8160000b1361091d5761090a83826113ee565b8080610915906120ad565b9150506108f3565b50506001808190555050565b610931610ea9565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161098e9190611af5565b602060405180830381865afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf919061216e565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610a2e92919061219b565b6020604051808303816000875af1158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7191906121fc565b505050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060005b600360149054906101000a900460000b60000b8160000b13610afb576000600560008360000b60000b8152602001908152602001600020905042816000015411610ae7578192505b508080610af3906120ad565b915050610a9f565b508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460000b81565b60066020528060005260406000206000915090508060000154908060010154908060020154905083565b610b71610ea9565b60008260000b12158015610ba657506001600360149054906101000a900460000b610b9c9190612229565b60000b8260000b13155b610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc906122ce565b60405180910390fd5b60008160000135118015610c00575080600001358160200135115b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612360565b60405180910390fd5b60008160a0013511610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d906123cc565b60405180910390fd5b6000816060013510158015610c9f575060008160400135115b610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd59061245e565b60405180910390fd5b60008160600135118015610cf6575060008160400135115b15610d43576000816080013511610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906124ca565b60405180910390fd5b5b600360149054906101000a900460000b60000b8260000b1315610d7f5781600360146101000a81548160ff021916908360000b60ff1602179055505b80600560008460000b60000b81526020019081526020016000208181610da591906127d9565b9050505050565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600801549080600901549080600a015490508b565b610e2e610ea9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490612859565b60405180910390fd5b610ea68161132a565b50565b610eb16115c9565b73ffffffffffffffffffffffffffffffffffffffff16610ecf610b03565b73ffffffffffffffffffffffffffffffffffffffff1614610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906128c5565b60405180910390fd5b565b60008560000b1215610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590612931565b60405180910390fd5b42836000015411158015610f86575082600101544211155b610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc906129c3565b60405180910390fd5b826005015434101561100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390612a2f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168360070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461113d576000336040516020016110779190612a97565b6040516020818303038152906040528051906020012090506110aa8261109c836115d1565b61160190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff168460070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290612afe565b60405180910390fd5b505b6000836003015411156111a157826003015434836000015461115f9190612000565b11156111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119790612b6a565b60405180910390fd5b5b6000836006015411156112055782600601543485600001546111c39190612000565b1115611204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fb90612bfc565b60405180910390fd5b5b5050505050565b60008083600401540361125857428360010154111561122e5760009050611260565b8360000154826000015484600201546112479190612c4b565b6112519190612034565b9050611260565b836001015490505b9392505050565b60008061127585858561120c565b905060006112838286611628565b9050818111156112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90612cee565b60405180910390fd5b856002015481101561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690612d80565b60405180910390fd5b85600201548161131f9190612da0565b925050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600660008360000b60000b815260200190815260200160002090506000600760008460000b60000b815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061148a82600560008760000b60000b815260200190815260200160002085611267565b90506000810361149c575050506115c5565b808260020160008282546114b09190612000565b92505081905550808360020160008282546114cb9190612000565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b815260040161152f92919061219b565b6020604051808303816000875af115801561154e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157291906121fc565b508473ffffffffffffffffffffffffffffffffffffffff167f69ca02dd4edd7bf0a4abb9ed3b7af3f14778db5d61921c7dc7cd545266326de2826040516115b99190612dd4565b60405180910390a25050505b5050565b600033905090565b6000816040516020016115e49190612e71565b604051602081830303815290604052805190602001209050919050565b600080600061161085856116d9565b9150915061161d8161172a565b819250505092915050565b6000428260080154111561163f57600090506116d3565b600082600a01546064856116539190612c4b565b61165d9190612034565b90506000818561166d9190612da0565b905060004285600901541015611685578190506116c1565b8460080154426116959190612da0565b856008015486600901546116a99190612da0565b836116b49190612c4b565b6116be9190612034565b90505b82816116cd9190612000565b93505050505b92915050565b600080604183510361171a5760008060006020860151925060408601519150606086015160001a905061170e878285856118f6565b94509450505050611723565b60006002915091505b9250929050565b6000600481111561173e5761173d612e97565b5b81600481111561175157611750612e97565b5b03156118f3576001600481111561176b5761176a612e97565b5b81600481111561177e5761177d612e97565b5b036117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590612f12565b60405180910390fd5b600260048111156117d2576117d1612e97565b5b8160048111156117e5576117e4612e97565b5b03611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90612f7e565b60405180910390fd5b6003600481111561183957611838612e97565b5b81600481111561184c5761184b612e97565b5b0361188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613010565b60405180910390fd5b60048081111561189f5761189e612e97565b5b8160048111156118b2576118b1612e97565b5b036118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906130a2565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156119315760006003915091506119f9565b601b8560ff16141580156119495750601c8560ff1614155b1561195b5760006004915091506119f9565b60006001878787876040516000815260200160405260405161198094939291906130ed565b6020604051602081039080840390855afa1580156119a2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f0576000600192509250506119f9565b80600092509250505b94509492505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a3c578082015181840152602081019050611a21565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a6482611a02565b611a6e8185611a0d565b9350611a7e818560208601611a1e565b611a8781611a48565b840191505092915050565b60006020820190508181036000830152611aac8184611a59565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611adf82611ab4565b9050919050565b611aef81611ad4565b82525050565b6000602082019050611b0a6000830184611ae6565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6682611a48565b810181811067ffffffffffffffff82111715611b8557611b84611b2e565b5b80604052505050565b6000611b98611b10565b9050611ba48282611b5d565b919050565b600067ffffffffffffffff821115611bc457611bc3611b2e565b5b611bcd82611a48565b9050602081019050919050565b82818337600083830152505050565b6000611bfc611bf784611ba9565b611b8e565b905082815260208101848484011115611c1857611c17611b29565b5b611c23848285611bda565b509392505050565b600082601f830112611c4057611c3f611b24565b5b8135611c50848260208601611be9565b91505092915050565b600060208284031215611c6f57611c6e611b1a565b5b600082013567ffffffffffffffff811115611c8d57611c8c611b1f565b5b611c9984828501611c2b565b91505092915050565b611cab81611ad4565b8114611cb657600080fd5b50565b600081359050611cc881611ca2565b92915050565b600060208284031215611ce457611ce3611b1a565b5b6000611cf284828501611cb9565b91505092915050565b6000819050919050565b611d0e81611cfb565b82525050565b6000608082019050611d296000830187611d05565b611d366020830186611d05565b611d436040830185611d05565b611d506060830184611d05565b95945050505050565b60008160000b9050919050565b611d6f81611d59565b8114611d7a57600080fd5b50565b600081359050611d8c81611d66565b92915050565b60008060408385031215611da957611da8611b1a565b5b6000611db785828601611d7d565b9250506020611dc885828601611cb9565b9150509250929050565b6000606082019050611de76000830186611d05565b611df46020830185611d05565b611e016040830184611d05565b949350505050565b611e1281611d59565b82525050565b6000602082019050611e2d6000830184611e09565b92915050565b600060208284031215611e4957611e48611b1a565b5b6000611e5784828501611d7d565b91505092915050565b600080fd5b60006101608284031215611e7c57611e7b611e60565b5b81905092915050565b6000806101808385031215611e9d57611e9c611b1a565b5b6000611eab85828601611d7d565b9250506020611ebc85828601611e65565b9150509250929050565b600061016082019050611edc600083018e611d05565b611ee9602083018d611d05565b611ef6604083018c611d05565b611f03606083018b611d05565b611f10608083018a611d05565b611f1d60a0830189611d05565b611f2a60c0830188611d05565b611f3760e0830187611ae6565b611f45610100830186611d05565b611f53610120830185611d05565b611f61610140830184611d05565b9c9b505050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611fb857607f821691505b602082108103611fcb57611fca611f71565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061200b82611cfb565b915061201683611cfb565b925082820190508082111561202e5761202d611fd1565b5b92915050565b600061203f82611cfb565b915061204a83611cfb565b925082820261205881611cfb565b9150828204841483151761206f5761206e611fd1565b5b5092915050565b600060608201905061208b6000830186611e09565b6120986020830185611d05565b6120a56040830184611d05565b949350505050565b60006120b882611d59565b9150607f82036120cb576120ca611fd1565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061210c601f83611a0d565b9150612117826120d6565b602082019050919050565b6000602082019050818103600083015261213b816120ff565b9050919050565b61214b81611cfb565b811461215657600080fd5b50565b60008151905061216881612142565b92915050565b60006020828403121561218457612183611b1a565b5b600061219284828501612159565b91505092915050565b60006040820190506121b06000830185611ae6565b6121bd6020830184611d05565b9392505050565b60008115159050919050565b6121d9816121c4565b81146121e457600080fd5b50565b6000815190506121f6816121d0565b92915050565b60006020828403121561221257612211611b1a565b5b6000612220848285016121e7565b91505092915050565b600061223482611d59565b915061223f83611d59565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f8213171561227c5761227b611fd1565b5b92915050565b7f50726573616c653a20696e76616c696420726f756e644e756d00000000000000600082015250565b60006122b8601983611a0d565b91506122c382612282565b602082019050919050565b600060208201905081810360008301526122e7816122ab565b9050919050565b7f50726573616c653a20696e76616c696420737461727454696d65206f7220656e60008201527f6454696d65000000000000000000000000000000000000000000000000000000602082015250565b600061234a602583611a0d565b9150612355826122ee565b604082019050919050565b600060208201905081810360008301526123798161233d565b9050919050565b7f50726573616c653a20696e76616c6964206d696e427579000000000000000000600082015250565b60006123b6601783611a0d565b91506123c182612380565b602082019050919050565b600060208201905081810360008301526123e5816123a9565b9050919050565b7f50726573616c653a20696e76616c6964207261697365436170206f7220746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000612448602883611a0d565b9150612453826123ec565b604082019050919050565b600060208201905081810360008301526124778161243b565b9050919050565b7f50726573616c653a20696e76616c696420706572556e69740000000000000000600082015250565b60006124b4601883611a0d565b91506124bf8261247e565b602082019050919050565b600060208201905081810360008301526124e3816124a7565b9050919050565b600081356124f781612142565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61253984612500565b9350801983169250808416831791505092915050565b6000819050919050565b600061257461256f61256a84611cfb565b61254f565b611cfb565b9050919050565b6000819050919050565b61258e82612559565b6125a161259a8261257b565b835461250d565b8255505050565b600081356125b581611ca2565b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff6125de84612500565b9350801983169250808416831791505092915050565b600061260f61260a61260584611ab4565b61254f565b611ab4565b9050919050565b6000612621826125f4565b9050919050565b600061263382612616565b9050919050565b6000819050919050565b61264d82612628565b6126606126598261263a565b83546125be565b8255505050565b600081016000830180612679816124ea565b90506126858184612585565b50505060018101602083018061269a816124ea565b90506126a68184612585565b5050506002810160408301806126bb816124ea565b90506126c78184612585565b5050506003810160608301806126dc816124ea565b90506126e88184612585565b5050506004810160808301806126fd816124ea565b90506127098184612585565b5050506005810160a083018061271e816124ea565b905061272a8184612585565b5050506006810160c083018061273f816124ea565b905061274b8184612585565b5050506007810160e0830180612760816125a8565b905061276c8184612644565b50505060088101610100830180612782816124ea565b905061278e8184612585565b505050600981016101208301806127a4816124ea565b90506127b08184612585565b505050600a81016101408301806127c6816124ea565b90506127d28184612585565b5050505050565b6127e38282612667565b5050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612843602683611a0d565b915061284e826127e7565b604082019050919050565b6000602082019050818103600083015261287281612836565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128af602083611a0d565b91506128ba82612879565b602082019050919050565b600060208201905081810360008301526128de816128a2565b9050919050565b7f50726573616c65204c61756e6368206973206e6f7420696e6974000000000000600082015250565b600061291b601a83611a0d565b9150612926826128e5565b602082019050919050565b6000602082019050818103600083015261294a8161290e565b9050919050565b7f50726573616c65204c61756e63683a2077726f6e672074696d6520666f72207460008201527f68697320726f756e640000000000000000000000000000000000000000000000602082015250565b60006129ad602983611a0d565b91506129b882612951565b604082019050919050565b600060208201905081810360008301526129dc816129a0565b9050919050565b7f50726573616c653a206c657373207468616e206d696e42757900000000000000600082015250565b6000612a19601983611a0d565b9150612a24826129e3565b602082019050919050565b60006020820190508181036000830152612a4881612a0c565b9050919050565b60008160601b9050919050565b6000612a6782612a4f565b9050919050565b6000612a7982612a5c565b9050919050565b612a91612a8c82611ad4565b612a6e565b82525050565b6000612aa38284612a80565b60148201915081905092915050565b7f50726573616c653a2073656e646572206e6f7420696e2077686974656c697374600082015250565b6000612ae8602083611a0d565b9150612af382612ab2565b602082019050919050565b60006020820190508181036000830152612b1781612adb565b9050919050565b7f50726573616c653a206d6f7265207468616e2072616973652063617021000000600082015250565b6000612b54601d83611a0d565b9150612b5f82612b1e565b602082019050919050565b60006020820190508181036000830152612b8381612b47565b9050919050565b7f50726573616c653a20746f74616c4465706f7369746564206d6f72652074686160008201527f6e206d6178427579000000000000000000000000000000000000000000000000602082015250565b6000612be6602883611a0d565b9150612bf182612b8a565b604082019050919050565b60006020820190508181036000830152612c1581612bd9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c5682611cfb565b9150612c6183611cfb565b925082612c7157612c70612c1c565b5b828204905092915050565b7f417373657274696f6e4661696c65643a20766573746564203c3d205f746f746160008201527f6c546f6b656e0000000000000000000000000000000000000000000000000000602082015250565b6000612cd8602683611a0d565b9150612ce382612c7c565b604082019050919050565b60006020820190508181036000830152612d0781612ccb565b9050919050565b7f417373657274696f6e4661696c65643a20766573746564203e3d2077616c6c6560008201527f742e746f74616c436c61696d0000000000000000000000000000000000000000602082015250565b6000612d6a602c83611a0d565b9150612d7582612d0e565b604082019050919050565b60006020820190508181036000830152612d9981612d5d565b9050919050565b6000612dab82611cfb565b9150612db683611cfb565b9250828203905081811115612dce57612dcd611fd1565b5b92915050565b6000602082019050612de96000830184611d05565b92915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612e30601c83612def565b9150612e3b82612dfa565b601c82019050919050565b6000819050919050565b6000819050919050565b612e6b612e6682612e46565b612e50565b82525050565b6000612e7c82612e23565b9150612e888284612e5a565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612efc601883611a0d565b9150612f0782612ec6565b602082019050919050565b60006020820190508181036000830152612f2b81612eef565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612f68601f83611a0d565b9150612f7382612f32565b602082019050919050565b60006020820190508181036000830152612f9781612f5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ffa602283611a0d565b915061300582612f9e565b604082019050919050565b6000602082019050818103600083015261302981612fed565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061308c602283611a0d565b915061309782613030565b604082019050919050565b600060208201905081810360008301526130bb8161307f565b9050919050565b6130cb81612e46565b82525050565b600060ff82169050919050565b6130e7816130d1565b82525050565b600060808201905061310260008301876130c2565b61310f60208301866130de565b61311c60408301856130c2565b61312960608301846130c2565b9594505050505056fea2646970667358221220af5c42b79b68e2ea63b783201545f5ccd478ba6efcf3fb4466b5ed321ca4917864736f6c63430008130033

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

00000000000000000000000068e2e5c9dff32419a108713f83274a4fb5e194ca000000000000000000000000e1c3542a483010404cf1fff150ea6349b7d0a8b0

-----Decoded View---------------
Arg [0] : _tokenAddr (address): 0x68E2e5c9DFF32419A108713f83274a4Fb5e194CA
Arg [1] : _treasuryAddr (address): 0xe1C3542a483010404cF1FFF150EA6349B7d0a8b0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000068e2e5c9dff32419a108713f83274a4fb5e194ca
Arg [1] : 000000000000000000000000e1c3542a483010404cf1fff150ea6349b7d0a8b0


Deployed Bytecode Sourcemap

21281:9204:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21695:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21579:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28712:143;;;;;;;;;;;;;:::i;:::-;;23577:916;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24574:721;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;21510:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22868:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;3002:103;;;;;;;;;;;;;:::i;:::-;;27038:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28863:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23136:376;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2354:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21637:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22818:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;27873:814;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22769:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;3260:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21695:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21579:27::-;;;;;;;;;;;;;:::o;28712:143::-;2240:13;:11;:13::i;:::-;28762::::1;28778:21;28762:37;;28819:10;28810:30;;:37;28841:5;28810:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28751:104;28712:143::o:0;23577:916::-;23642:18;23663:14;:12;:14::i;:::-;23642:35;;23690:20;23713:9;:24;23723:13;23713:24;;;;;;;;;;;;;;;23690:47;;23748:22;23773:9;:24;23783:13;23773:24;;;;;;;;;;;;;;;23748:49;;23808:21;23832:7;:22;23840:13;23832:22;;;;;;;;;;;;;;;:34;23855:10;23832:34;;;;;;;;;;;;;;;23808:58;;23879:69;23904:13;23919:6;23927:3;23932:4;23938:9;23879:24;:69::i;:::-;24006:9;23986:4;:16;;;:29;;;;;;;:::i;:::-;;;;;;;;24051:9;24026:6;:21;;;:34;;;;;;;:::i;:::-;;;;;;;;24168:14;24199:9;24185:3;:11;;;:23;;;;:::i;:::-;24168:40;;24262:12;;;;;;;;;;;24253:32;;:43;24286:9;24253:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24333:10;24314:49;;;24318:13;24345:9;24356:6;24314:49;;;;;;;;:::i;:::-;;;;;;;;24389:1;24380:6;:10;24376:110;;;24428:6;24407;:17;;;:27;;;;;;;:::i;:::-;;;;;;;;24468:6;24449:4;:15;;;:25;;;;;;;:::i;:::-;;;;;;;;24376:110;23631:862;;;;;23577:916;:::o;24574:721::-;24631:17;24650:14;24666:17;24685:15;24713:18;24734:14;:12;:14::i;:::-;24713:35;;24766:13;24761:468;24797:13;24785:25;;:8;:25;;;24761:468;;24839:20;24862:9;:19;24872:8;24862:19;;;;;;;;;;;;;;;24839:42;;24896:22;24921:9;:19;24931:8;24921:19;;;;;;;;;;;;;;;24896:44;;24955:21;24979:7;:17;24987:8;24979:17;;;;;;;;;;;;;;;:23;24997:4;24979:23;;;;;;;;;;;;;;;24955:47;;25029:34;25045:6;25053:3;25058:4;25029:15;:34::i;:::-;25019:44;;;;;:::i;:::-;;;25091:34;25107:6;25115:3;25120:4;25091:15;:34::i;:::-;25078:47;;;;;:::i;:::-;;;25151:6;:17;;;25140:28;;;;;:::i;:::-;;;25196:6;:21;;;25183:34;;;;;:::i;:::-;;;24824:405;;;24812:10;;;;;:::i;:::-;;;;24761:468;;;;25241:46;24574:721;;;;;:::o;21510:24::-;;;;;;;;;;;;;:::o;22868:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3002:103::-;2240:13;:11;:13::i;:::-;3067:30:::1;3094:1;3067:18;:30::i;:::-;3002:103::o:0;27038:232::-;17270:1;17868:7;;:19;17860:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;17270:1;18001:7;:18;;;;27103::::1;27124:14;:12;:14::i;:::-;27103:35;;27156:13;27151:112;27187:13;27175:25;;:8;:25;;;27151:112;;27229:22;27236:4;27242:8;27229:6;:22::i;:::-;27202:10;;;;;:::i;:::-;;;;27151:112;;;;27092:178;17226:1:::0;18180:7;:22;;;;27038:232;:::o;28863:183::-;2240:13;:11;:13::i;:::-;28930::::1;28953:9;;;;;;;;;;;28946:27;;;28982:4;28946:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28930:58;;29006:9;;;;;;;;;;;28999:26;;;29026:4;29032:5;28999:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28919:127;28863:183:::0;:::o;23136:376::-;23181:4;23198:18;23219:2;23198:23;;23237:13;23232:241;23268:11;;;;;;;;;;;23256:23;;:8;:23;;;23232:241;;23308:20;23331:9;:19;23341:8;23331:19;;;;;;;;;;;;;;;23308:42;;23386:15;23369:3;:13;;;:32;23365:97;;23438:8;23422:24;;23365:97;23293:180;23281:10;;;;;:::i;:::-;;;;23232:241;;;;23491:13;23484:20;;;23136:376;:::o;2354:87::-;2400:7;2427:6;;;;;;;;;;;2420:13;;2354:87;:::o;21637:28::-;;;;;;;;;;;;;:::o;22818:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27873:814::-;2240:13;:11;:13::i;:::-;28006:1:::1;27994:8;:13;;;;:44;;;;;28037:1;28023:11;;;;;;;;;;;:15;;;;:::i;:::-;28011:27;;:8;:27;;;;27994:44;27986:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;28117:1;28101:3;:13;;;:17;:48;;;;;28136:3;:13;;;28122:3;:11;;;:27;28101:48;28079:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;28246:1;28233:3;:10;;;:14;28225:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;28324:1;28308:3;:12;;;:17;;:40;;;;;28347:1;28329:3;:15;;;:19;28308:40;28286:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;28448:1;28433:3;:12;;;:16;:39;;;;;28471:1;28453:3;:15;;;:19;28433:39;28429:124;;;28511:1;28497:3;:11;;;:15;28489:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;28429:124;28580:11;;;;;;;;;;;28569:22;;:8;:22;;;28565:77;;;28622:8;28608:11;;:22;;;;;;;;;;;;;;;;;;;;28565:77;28676:3;28654:9;:19;28664:8;28654:19;;;;;;;;;;;;;;;:25;;;;;;:::i;:::-;;;;27873:814:::0;;:::o;22769:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3260:201::-;2240:13;:11;:13::i;:::-;3369:1:::1;3349:22;;:8;:22;;::::0;3341:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3425:28;3444:8;3425:18;:28::i;:::-;3260:201:::0;:::o;2519:132::-;2594:12;:10;:12::i;:::-;2583:23;;:7;:5;:7::i;:::-;:23;;;2575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2519:132::o;29078:1404::-;29347:1;29330:13;:18;;;;29322:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29429:15;29412:3;:13;;;:32;;:66;;;;;29467:3;:11;;;29448:15;:30;;29412:66;29390:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;29581:3;:10;;;29568:9;:23;;29560:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29695:1;29666:31;;:3;:17;;;;;;;;;;;;:31;;;29662:335;;29714:19;29763:10;29746:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;29736:39;;;;;;29714:61;;29858:55;29903:9;29858:36;:11;:34;:36::i;:::-;:44;;:55;;;;:::i;:::-;29816:97;;:3;:17;;;;;;;;;;;;:97;;;29790:195;;;;;;;;;;;;:::i;:::-;;;;;;;;;29699:298;29662:335;30064:1;30049:3;:12;;;:16;30045:184;;;30140:3;:12;;;30127:9;30108:4;:16;;;:28;;;;:::i;:::-;:44;;30082:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;30045:184;30296:1;30283:3;:10;;;:14;30279:196;;;30377:3;:10;;;30364:9;30340:6;:21;;;:33;;;;:::i;:::-;:47;;30314:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30279:196;29078:1404;;;;;:::o;25303:466::-;25453:7;25492:1;25477:3;:11;;;:16;25473:289;;25528:15;25514:3;:11;;;:29;25510:184;;;25571:1;25564:8;;;;25510:184;25657:6;:21;;;25638:4;:16;;;25620:3;:15;;;:34;;;;:::i;:::-;:58;;;;:::i;:::-;25613:65;;;;25473:289;25733:6;:17;;;25726:24;;25303:466;;;;;;:::o;25777:523::-;25927:7;25947:19;25969:34;25985:6;25993:3;25998:4;25969:15;:34::i;:::-;25947:56;;26016:14;26033:33;26049:11;26062:3;26033:15;:33::i;:::-;26016:50;;26097:11;26087:6;:21;;26079:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;26180:6;:17;;;26170:6;:27;;26162:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;26275:6;:17;;;26266:6;:26;;;;:::i;:::-;26259:33;;;;25777:523;;;;;:::o;3621:191::-;3695:16;3714:6;;;;;;;;;;;3695:25;;3740:8;3731:6;;:17;;;;;;;;;;;;;;;;;;3795:8;3764:40;;3785:8;3764:40;;;;;;;;;;;;3684:128;3621:191;:::o;27282:503::-;27346:22;27371:9;:19;27381:8;27371:19;;;;;;;;;;;;;;;27346:44;;27401:21;27425:7;:17;27433:8;27425:17;;;;;;;;;;;;;;;:23;27443:4;27425:23;;;;;;;;;;;;;;;27401:47;;27461:17;27481:50;27497:6;27505:9;:19;27515:8;27505:19;;;;;;;;;;;;;;;27526:4;27481:15;:50::i;:::-;27461:70;;27559:1;27546:9;:14;27542:53;;27577:7;;;;;27542:53;27628:9;27607:6;:17;;;:30;;;;;;;:::i;:::-;;;;;;;;27667:9;27648:4;:15;;;:28;;;;;;;:::i;:::-;;;;;;;;27700:9;;;;;;;;;;;27693:26;;;27720:4;27726:9;27693:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27761:4;27752:25;;;27767:9;27752:25;;;;;;:::i;:::-;;;;;;;;27335:450;;;27282:503;;;:::o;850:98::-;903:7;930:10;923:17;;850:98;:::o;14086:269::-;14155:7;14341:4;14288:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;14278:69;;;;;;14271:76;;14086:269;;;:::o;10284:231::-;10362:7;10383:17;10402:18;10424:27;10435:4;10441:9;10424:10;:27::i;:::-;10382:69;;;;10462:18;10474:5;10462:11;:18::i;:::-;10498:9;10491:16;;;;10284:231;;;;:::o;26308:689::-;26399:7;26446:15;26423:3;:20;;;:38;26419:79;;;26485:1;26478:8;;;;26419:79;26510:24;26558:3;:18;;;26552:3;26537:12;:18;;;;:::i;:::-;:39;;;;:::i;:::-;26510:66;;26589:21;26628:16;26613:12;:31;;;;:::i;:::-;26589:55;;26657:20;26717:15;26696:3;:18;;;:36;26692:247;;;26764:13;26749:28;;26692:247;;;26906:3;:20;;;26888:15;:38;;;;:::i;:::-;26863:3;:20;;;26842:3;:18;;;:41;;;;:::i;:::-;26825:13;:59;;;;:::i;:::-;:102;;;;:::i;:::-;26810:117;;26692:247;26973:16;26958:12;:31;;;;:::i;:::-;26951:38;;;;;26308:689;;;;;:::o;8735:747::-;8816:7;8825:12;8874:2;8854:9;:16;:22;8850:625;;8893:9;8917;8941:7;9198:4;9187:9;9183:20;9177:27;9172:32;;9248:4;9237:9;9233:20;9227:27;9222:32;;9306:4;9295:9;9291:20;9285:27;9282:1;9277:36;9272:41;;9349:25;9360:4;9366:1;9369;9372;9349:10;:25::i;:::-;9342:32;;;;;;;;;8850:625;9423:1;9427:35;9407:56;;;;8735:747;;;;;;:::o;7006:643::-;7084:20;7075:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;7071:571;7121:7;7071:571;7182:29;7173:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;7169:473;;7228:34;;;;;;;;;;:::i;:::-;;;;;;;;7169:473;7293:35;7284:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;7280:362;;7345:41;;;;;;;;;;:::i;:::-;;;;;;;;7280:362;7417:30;7408:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;7404:238;;7464:44;;;;;;;;;;:::i;:::-;;;;;;;;7404:238;7539:30;7530:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;7526:116;;7586:44;;;;;;;;;;:::i;:::-;;;;;;;;7526:116;7006:643;;:::o;11736:1632::-;11867:7;11876:12;12801:66;12796:1;12788:10;;:79;12784:163;;;12900:1;12904:30;12884:51;;;;;;12784:163;12966:2;12961:1;:7;;;;:18;;;;;12977:2;12972:1;:7;;;;12961:18;12957:102;;;13012:1;13016:30;12996:51;;;;;;12957:102;13156:14;13173:24;13183:4;13189:1;13192;13195;13173:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13156:41;;13230:1;13212:20;;:6;:20;;;13208:103;;13265:1;13269:29;13249:50;;;;;;;13208:103;13331:6;13339:20;13323:37;;;;;11736:1632;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:126::-;1386:7;1426:42;1419:5;1415:54;1404:65;;1349:126;;;:::o;1481:96::-;1518:7;1547:24;1565:5;1547:24;:::i;:::-;1536:35;;1481:96;;;:::o;1583:118::-;1670:24;1688:5;1670:24;:::i;:::-;1665:3;1658:37;1583:118;;:::o;1707:222::-;1800:4;1838:2;1827:9;1823:18;1815:26;;1851:71;1919:1;1908:9;1904:17;1895:6;1851:71;:::i;:::-;1707:222;;;;:::o;1935:75::-;1968:6;2001:2;1995:9;1985:19;;1935:75;:::o;2016:117::-;2125:1;2122;2115:12;2139:117;2248:1;2245;2238:12;2262:117;2371:1;2368;2361:12;2385:117;2494:1;2491;2484:12;2508:180;2556:77;2553:1;2546:88;2653:4;2650:1;2643:15;2677:4;2674:1;2667:15;2694:281;2777:27;2799:4;2777:27;:::i;:::-;2769:6;2765:40;2907:6;2895:10;2892:22;2871:18;2859:10;2856:34;2853:62;2850:88;;;2918:18;;:::i;:::-;2850:88;2958:10;2954:2;2947:22;2737:238;2694:281;;:::o;2981:129::-;3015:6;3042:20;;:::i;:::-;3032:30;;3071:33;3099:4;3091:6;3071:33;:::i;:::-;2981:129;;;:::o;3116:307::-;3177:4;3267:18;3259:6;3256:30;3253:56;;;3289:18;;:::i;:::-;3253:56;3327:29;3349:6;3327:29;:::i;:::-;3319:37;;3411:4;3405;3401:15;3393:23;;3116:307;;;:::o;3429:146::-;3526:6;3521:3;3516;3503:30;3567:1;3558:6;3553:3;3549:16;3542:27;3429:146;;;:::o;3581:423::-;3658:5;3683:65;3699:48;3740:6;3699:48;:::i;:::-;3683:65;:::i;:::-;3674:74;;3771:6;3764:5;3757:21;3809:4;3802:5;3798:16;3847:3;3838:6;3833:3;3829:16;3826:25;3823:112;;;3854:79;;:::i;:::-;3823:112;3944:54;3991:6;3986:3;3981;3944:54;:::i;:::-;3664:340;3581:423;;;;;:::o;4023:338::-;4078:5;4127:3;4120:4;4112:6;4108:17;4104:27;4094:122;;4135:79;;:::i;:::-;4094:122;4252:6;4239:20;4277:78;4351:3;4343:6;4336:4;4328:6;4324:17;4277:78;:::i;:::-;4268:87;;4084:277;4023:338;;;;:::o;4367:507::-;4435:6;4484:2;4472:9;4463:7;4459:23;4455:32;4452:119;;;4490:79;;:::i;:::-;4452:119;4638:1;4627:9;4623:17;4610:31;4668:18;4660:6;4657:30;4654:117;;;4690:79;;:::i;:::-;4654:117;4795:62;4849:7;4840:6;4829:9;4825:22;4795:62;:::i;:::-;4785:72;;4581:286;4367:507;;;;:::o;4880:122::-;4953:24;4971:5;4953:24;:::i;:::-;4946:5;4943:35;4933:63;;4992:1;4989;4982:12;4933:63;4880:122;:::o;5008:139::-;5054:5;5092:6;5079:20;5070:29;;5108:33;5135:5;5108:33;:::i;:::-;5008:139;;;;:::o;5153:329::-;5212:6;5261:2;5249:9;5240:7;5236:23;5232:32;5229:119;;;5267:79;;:::i;:::-;5229:119;5387:1;5412:53;5457:7;5448:6;5437:9;5433:22;5412:53;:::i;:::-;5402:63;;5358:117;5153:329;;;;:::o;5488:77::-;5525:7;5554:5;5543:16;;5488:77;;;:::o;5571:118::-;5658:24;5676:5;5658:24;:::i;:::-;5653:3;5646:37;5571:118;;:::o;5695:553::-;5872:4;5910:3;5899:9;5895:19;5887:27;;5924:71;5992:1;5981:9;5977:17;5968:6;5924:71;:::i;:::-;6005:72;6073:2;6062:9;6058:18;6049:6;6005:72;:::i;:::-;6087;6155:2;6144:9;6140:18;6131:6;6087:72;:::i;:::-;6169;6237:2;6226:9;6222:18;6213:6;6169:72;:::i;:::-;5695:553;;;;;;;:::o;6254:89::-;6288:7;6331:5;6328:1;6317:20;6306:31;;6254:89;;;:::o;6349:116::-;6419:21;6434:5;6419:21;:::i;:::-;6412:5;6409:32;6399:60;;6455:1;6452;6445:12;6399:60;6349:116;:::o;6471:133::-;6514:5;6552:6;6539:20;6530:29;;6568:30;6592:5;6568:30;:::i;:::-;6471:133;;;;:::o;6610:468::-;6675:6;6683;6732:2;6720:9;6711:7;6707:23;6703:32;6700:119;;;6738:79;;:::i;:::-;6700:119;6858:1;6883:50;6925:7;6916:6;6905:9;6901:22;6883:50;:::i;:::-;6873:60;;6829:114;6982:2;7008:53;7053:7;7044:6;7033:9;7029:22;7008:53;:::i;:::-;6998:63;;6953:118;6610:468;;;;;:::o;7084:442::-;7233:4;7271:2;7260:9;7256:18;7248:26;;7284:71;7352:1;7341:9;7337:17;7328:6;7284:71;:::i;:::-;7365:72;7433:2;7422:9;7418:18;7409:6;7365:72;:::i;:::-;7447;7515:2;7504:9;7500:18;7491:6;7447:72;:::i;:::-;7084:442;;;;;;:::o;7532:109::-;7613:21;7628:5;7613:21;:::i;:::-;7608:3;7601:34;7532:109;;:::o;7647:210::-;7734:4;7772:2;7761:9;7757:18;7749:26;;7785:65;7847:1;7836:9;7832:17;7823:6;7785:65;:::i;:::-;7647:210;;;;:::o;7863:323::-;7919:6;7968:2;7956:9;7947:7;7943:23;7939:32;7936:119;;;7974:79;;:::i;:::-;7936:119;8094:1;8119:50;8161:7;8152:6;8141:9;8137:22;8119:50;:::i;:::-;8109:60;;8065:114;7863:323;;;;:::o;8192:117::-;8301:1;8298;8291:12;8353:232;8426:5;8467:3;8458:6;8453:3;8449:16;8445:26;8442:113;;;8474:79;;:::i;:::-;8442:113;8573:6;8564:15;;8353:232;;;;:::o;8591:523::-;8683:6;8691;8740:3;8728:9;8719:7;8715:23;8711:33;8708:120;;;8747:79;;:::i;:::-;8708:120;8867:1;8892:50;8934:7;8925:6;8914:9;8910:22;8892:50;:::i;:::-;8882:60;;8838:114;8991:2;9017:80;9089:7;9080:6;9069:9;9065:22;9017:80;:::i;:::-;9007:90;;8962:145;8591:523;;;;;:::o;9120:1332::-;9494:4;9532:3;9521:9;9517:19;9509:27;;9546:71;9614:1;9603:9;9599:17;9590:6;9546:71;:::i;:::-;9627:72;9695:2;9684:9;9680:18;9671:6;9627:72;:::i;:::-;9709;9777:2;9766:9;9762:18;9753:6;9709:72;:::i;:::-;9791;9859:2;9848:9;9844:18;9835:6;9791:72;:::i;:::-;9873:73;9941:3;9930:9;9926:19;9917:6;9873:73;:::i;:::-;9956;10024:3;10013:9;10009:19;10000:6;9956:73;:::i;:::-;10039;10107:3;10096:9;10092:19;10083:6;10039:73;:::i;:::-;10122;10190:3;10179:9;10175:19;10166:6;10122:73;:::i;:::-;10205;10273:3;10262:9;10258:19;10249:6;10205:73;:::i;:::-;10288;10356:3;10345:9;10341:19;10332:6;10288:73;:::i;:::-;10371:74;10440:3;10429:9;10425:19;10415:7;10371:74;:::i;:::-;9120:1332;;;;;;;;;;;;;;:::o;10458:180::-;10506:77;10503:1;10496:88;10603:4;10600:1;10593:15;10627:4;10624:1;10617:15;10644:320;10688:6;10725:1;10719:4;10715:12;10705:22;;10772:1;10766:4;10762:12;10793:18;10783:81;;10849:4;10841:6;10837:17;10827:27;;10783:81;10911:2;10903:6;10900:14;10880:18;10877:38;10874:84;;10930:18;;:::i;:::-;10874:84;10695:269;10644:320;;;:::o;10970:180::-;11018:77;11015:1;11008:88;11115:4;11112:1;11105:15;11139:4;11136:1;11129:15;11156:191;11196:3;11215:20;11233:1;11215:20;:::i;:::-;11210:25;;11249:20;11267:1;11249:20;:::i;:::-;11244:25;;11292:1;11289;11285:9;11278:16;;11313:3;11310:1;11307:10;11304:36;;;11320:18;;:::i;:::-;11304:36;11156:191;;;;:::o;11353:410::-;11393:7;11416:20;11434:1;11416:20;:::i;:::-;11411:25;;11450:20;11468:1;11450:20;:::i;:::-;11445:25;;11505:1;11502;11498:9;11527:30;11545:11;11527:30;:::i;:::-;11516:41;;11706:1;11697:7;11693:15;11690:1;11687:22;11667:1;11660:9;11640:83;11617:139;;11736:18;;:::i;:::-;11617:139;11401:362;11353:410;;;;:::o;11769:430::-;11912:4;11950:2;11939:9;11935:18;11927:26;;11963:65;12025:1;12014:9;12010:17;12001:6;11963:65;:::i;:::-;12038:72;12106:2;12095:9;12091:18;12082:6;12038:72;:::i;:::-;12120;12188:2;12177:9;12173:18;12164:6;12120:72;:::i;:::-;11769:430;;;;;;:::o;12205:165::-;12241:3;12264:21;12279:5;12264:21;:::i;:::-;12255:30;;12307:4;12300:5;12297:15;12294:41;;12315:18;;:::i;:::-;12294:41;12362:1;12355:5;12351:13;12344:20;;12205:165;;;:::o;12376:181::-;12516:33;12512:1;12504:6;12500:14;12493:57;12376:181;:::o;12563:366::-;12705:3;12726:67;12790:2;12785:3;12726:67;:::i;:::-;12719:74;;12802:93;12891:3;12802:93;:::i;:::-;12920:2;12915:3;12911:12;12904:19;;12563:366;;;:::o;12935:419::-;13101:4;13139:2;13128:9;13124:18;13116:26;;13188:9;13182:4;13178:20;13174:1;13163:9;13159:17;13152:47;13216:131;13342:4;13216:131;:::i;:::-;13208:139;;12935:419;;;:::o;13360:122::-;13433:24;13451:5;13433:24;:::i;:::-;13426:5;13423:35;13413:63;;13472:1;13469;13462:12;13413:63;13360:122;:::o;13488:143::-;13545:5;13576:6;13570:13;13561:22;;13592:33;13619:5;13592:33;:::i;:::-;13488:143;;;;:::o;13637:351::-;13707:6;13756:2;13744:9;13735:7;13731:23;13727:32;13724:119;;;13762:79;;:::i;:::-;13724:119;13882:1;13907:64;13963:7;13954:6;13943:9;13939:22;13907:64;:::i;:::-;13897:74;;13853:128;13637:351;;;;:::o;13994:332::-;14115:4;14153:2;14142:9;14138:18;14130:26;;14166:71;14234:1;14223:9;14219:17;14210:6;14166:71;:::i;:::-;14247:72;14315:2;14304:9;14300:18;14291:6;14247:72;:::i;:::-;13994:332;;;;;:::o;14332:90::-;14366:7;14409:5;14402:13;14395:21;14384:32;;14332:90;;;:::o;14428:116::-;14498:21;14513:5;14498:21;:::i;:::-;14491:5;14488:32;14478:60;;14534:1;14531;14524:12;14478:60;14428:116;:::o;14550:137::-;14604:5;14635:6;14629:13;14620:22;;14651:30;14675:5;14651:30;:::i;:::-;14550:137;;;;:::o;14693:345::-;14760:6;14809:2;14797:9;14788:7;14784:23;14780:32;14777:119;;;14815:79;;:::i;:::-;14777:119;14935:1;14960:61;15013:7;15004:6;14993:9;14989:22;14960:61;:::i;:::-;14950:71;;14906:125;14693:345;;;;:::o;15044:302::-;15081:3;15100:17;15115:1;15100:17;:::i;:::-;15095:22;;15131:17;15146:1;15131:17;:::i;:::-;15126:22;;15171:1;15168;15164:9;15157:16;;15239:66;15234:3;15230:76;15211:4;15206:3;15202:14;15186:130;15183:156;;;15319:18;;:::i;:::-;15183:156;15044:302;;;;:::o;15352:175::-;15492:27;15488:1;15480:6;15476:14;15469:51;15352:175;:::o;15533:366::-;15675:3;15696:67;15760:2;15755:3;15696:67;:::i;:::-;15689:74;;15772:93;15861:3;15772:93;:::i;:::-;15890:2;15885:3;15881:12;15874:19;;15533:366;;;:::o;15905:419::-;16071:4;16109:2;16098:9;16094:18;16086:26;;16158:9;16152:4;16148:20;16144:1;16133:9;16129:17;16122:47;16186:131;16312:4;16186:131;:::i;:::-;16178:139;;15905:419;;;:::o;16330:224::-;16470:34;16466:1;16458:6;16454:14;16447:58;16539:7;16534:2;16526:6;16522:15;16515:32;16330:224;:::o;16560:366::-;16702:3;16723:67;16787:2;16782:3;16723:67;:::i;:::-;16716:74;;16799:93;16888:3;16799:93;:::i;:::-;16917:2;16912:3;16908:12;16901:19;;16560:366;;;:::o;16932:419::-;17098:4;17136:2;17125:9;17121:18;17113:26;;17185:9;17179:4;17175:20;17171:1;17160:9;17156:17;17149:47;17213:131;17339:4;17213:131;:::i;:::-;17205:139;;16932:419;;;:::o;17357:173::-;17497:25;17493:1;17485:6;17481:14;17474:49;17357:173;:::o;17536:366::-;17678:3;17699:67;17763:2;17758:3;17699:67;:::i;:::-;17692:74;;17775:93;17864:3;17775:93;:::i;:::-;17893:2;17888:3;17884:12;17877:19;;17536:366;;;:::o;17908:419::-;18074:4;18112:2;18101:9;18097:18;18089:26;;18161:9;18155:4;18151:20;18147:1;18136:9;18132:17;18125:47;18189:131;18315:4;18189:131;:::i;:::-;18181:139;;17908:419;;;:::o;18333:227::-;18473:34;18469:1;18461:6;18457:14;18450:58;18542:10;18537:2;18529:6;18525:15;18518:35;18333:227;:::o;18566:366::-;18708:3;18729:67;18793:2;18788:3;18729:67;:::i;:::-;18722:74;;18805:93;18894:3;18805:93;:::i;:::-;18923:2;18918:3;18914:12;18907:19;;18566:366;;;:::o;18938:419::-;19104:4;19142:2;19131:9;19127:18;19119:26;;19191:9;19185:4;19181:20;19177:1;19166:9;19162:17;19155:47;19219:131;19345:4;19219:131;:::i;:::-;19211:139;;18938:419;;;:::o;19363:174::-;19503:26;19499:1;19491:6;19487:14;19480:50;19363:174;:::o;19543:366::-;19685:3;19706:67;19770:2;19765:3;19706:67;:::i;:::-;19699:74;;19782:93;19871:3;19782:93;:::i;:::-;19900:2;19895:3;19891:12;19884:19;;19543:366;;;:::o;19915:419::-;20081:4;20119:2;20108:9;20104:18;20096:26;;20168:9;20162:4;20158:20;20154:1;20143:9;20139:17;20132:47;20196:131;20322:4;20196:131;:::i;:::-;20188:139;;19915:419;;;:::o;20526:186::-;20571:11;20620:3;20607:17;20633:33;20660:5;20633:33;:::i;:::-;20700:5;20676:29;;20583:129;20526:186;;;:::o;20718:92::-;20750:8;20797:5;20794:1;20790:13;20769:34;;20718:92;;;:::o;20816:290::-;20874:6;20903:66;20990:22;21003:8;20990:22;:::i;:::-;20978:34;;21045:4;21041:9;21034:5;21030:21;21021:30;;21094:4;21084:8;21080:19;21073:5;21070:30;21060:40;;20881:225;20816:290;;;;:::o;21112:60::-;21140:3;21161:5;21154:12;;21112:60;;;:::o;21178:142::-;21228:9;21261:53;21279:34;21288:24;21306:5;21288:24;:::i;:::-;21279:34;:::i;:::-;21261:53;:::i;:::-;21248:66;;21178:142;;;:::o;21326:75::-;21369:3;21390:5;21383:12;;21326:75;;;:::o;21407:262::-;21517:39;21548:7;21517:39;:::i;:::-;21578:84;21620:41;21644:16;21620:41;:::i;:::-;21613:4;21607:11;21578:84;:::i;:::-;21572:4;21565:98;21483:186;21407:262;;:::o;21675:186::-;21720:11;21769:3;21756:17;21782:33;21809:5;21782:33;:::i;:::-;21849:5;21825:29;;21732:129;21675:186;;;:::o;21867:266::-;21925:6;21954:42;22017:22;22030:8;22017:22;:::i;:::-;22005:34;;22072:4;22068:9;22061:5;22057:21;22048:30;;22121:4;22111:8;22107:19;22100:5;22097:30;22087:40;;21932:201;21867:266;;;;:::o;22139:142::-;22189:9;22222:53;22240:34;22249:24;22267:5;22249:24;:::i;:::-;22240:34;:::i;:::-;22222:53;:::i;:::-;22209:66;;22139:142;;;:::o;22287:126::-;22337:9;22370:37;22401:5;22370:37;:::i;:::-;22357:50;;22287:126;;;:::o;22419:::-;22469:9;22502:37;22533:5;22502:37;:::i;:::-;22489:50;;22419:126;;;:::o;22551:75::-;22594:3;22615:5;22608:12;;22551:75;;;:::o;22632:262::-;22742:39;22773:7;22742:39;:::i;:::-;22803:84;22845:41;22869:16;22845:41;:::i;:::-;22838:4;22832:11;22803:84;:::i;:::-;22797:4;22790:98;22708:186;22632:262;;:::o;22900:3855::-;23076:1;23070:4;23066:12;23122:1;23115:5;23111:13;23172:12;23215:42;23243:13;23215:42;:::i;:::-;23198:59;;23271:78;23335:13;23323:10;23271:78;:::i;:::-;23033:327;;;23413:1;23407:4;23403:12;23459:2;23452:5;23448:14;23510:12;23553:42;23581:13;23553:42;:::i;:::-;23536:59;;23609:78;23673:13;23661:10;23609:78;:::i;:::-;23370:328;;;23751:1;23745:4;23741:12;23797:2;23790:5;23786:14;23848:12;23891:42;23919:13;23891:42;:::i;:::-;23874:59;;23947:78;24011:13;23999:10;23947:78;:::i;:::-;23708:328;;;24089:1;24083:4;24079:12;24135:2;24128:5;24124:14;24186:12;24229:42;24257:13;24229:42;:::i;:::-;24212:59;;24285:78;24349:13;24337:10;24285:78;:::i;:::-;24046:328;;;24427:1;24421:4;24417:12;24473:3;24466:5;24462:15;24525:12;24568:42;24596:13;24568:42;:::i;:::-;24551:59;;24624:78;24688:13;24676:10;24624:78;:::i;:::-;24384:329;;;24766:1;24760:4;24756:12;24812:3;24805:5;24801:15;24864:12;24907:42;24935:13;24907:42;:::i;:::-;24890:59;;24963:78;25027:13;25015:10;24963:78;:::i;:::-;24723:329;;;25105:1;25099:4;25095:12;25151:3;25144:5;25140:15;25203:12;25246:42;25274:13;25246:42;:::i;:::-;25229:59;;25302:78;25366:13;25354:10;25302:78;:::i;:::-;25062:329;;;25444:1;25438:4;25434:12;25490:3;25483:5;25479:15;25542:12;25585:42;25613:13;25585:42;:::i;:::-;25568:59;;25641:78;25705:13;25693:10;25641:78;:::i;:::-;25401:329;;;25783:1;25777:4;25773:12;25829:3;25822:5;25818:15;25881:12;25924:42;25952:13;25924:42;:::i;:::-;25907:59;;25980:78;26044:13;26032:10;25980:78;:::i;:::-;25740:329;;;26122:1;26116:4;26112:12;26168:3;26161:5;26157:15;26220:12;26263:42;26291:13;26263:42;:::i;:::-;26246:59;;26319:78;26383:13;26371:10;26319:78;:::i;:::-;26079:329;;;26461:2;26455:4;26451:13;26508:3;26501:5;26497:15;26560:12;26603:42;26631:13;26603:42;:::i;:::-;26586:59;;26659:78;26723:13;26711:10;26659:78;:::i;:::-;26418:330;;;22900:3855;;:::o;26761:256::-;26897:114;27003:7;26997:4;26897:114;:::i;:::-;26761:256;;:::o;27023:225::-;27163:34;27159:1;27151:6;27147:14;27140:58;27232:8;27227:2;27219:6;27215:15;27208:33;27023:225;:::o;27254:366::-;27396:3;27417:67;27481:2;27476:3;27417:67;:::i;:::-;27410:74;;27493:93;27582:3;27493:93;:::i;:::-;27611:2;27606:3;27602:12;27595:19;;27254:366;;;:::o;27626:419::-;27792:4;27830:2;27819:9;27815:18;27807:26;;27879:9;27873:4;27869:20;27865:1;27854:9;27850:17;27843:47;27907:131;28033:4;27907:131;:::i;:::-;27899:139;;27626:419;;;:::o;28051:182::-;28191:34;28187:1;28179:6;28175:14;28168:58;28051:182;:::o;28239:366::-;28381:3;28402:67;28466:2;28461:3;28402:67;:::i;:::-;28395:74;;28478:93;28567:3;28478:93;:::i;:::-;28596:2;28591:3;28587:12;28580:19;;28239:366;;;:::o;28611:419::-;28777:4;28815:2;28804:9;28800:18;28792:26;;28864:9;28858:4;28854:20;28850:1;28839:9;28835:17;28828:47;28892:131;29018:4;28892:131;:::i;:::-;28884:139;;28611:419;;;:::o;29036:176::-;29176:28;29172:1;29164:6;29160:14;29153:52;29036:176;:::o;29218:366::-;29360:3;29381:67;29445:2;29440:3;29381:67;:::i;:::-;29374:74;;29457:93;29546:3;29457:93;:::i;:::-;29575:2;29570:3;29566:12;29559:19;;29218:366;;;:::o;29590:419::-;29756:4;29794:2;29783:9;29779:18;29771:26;;29843:9;29837:4;29833:20;29829:1;29818:9;29814:17;29807:47;29871:131;29997:4;29871:131;:::i;:::-;29863:139;;29590:419;;;:::o;30015:228::-;30155:34;30151:1;30143:6;30139:14;30132:58;30224:11;30219:2;30211:6;30207:15;30200:36;30015:228;:::o;30249:366::-;30391:3;30412:67;30476:2;30471:3;30412:67;:::i;:::-;30405:74;;30488:93;30577:3;30488:93;:::i;:::-;30606:2;30601:3;30597:12;30590:19;;30249:366;;;:::o;30621:419::-;30787:4;30825:2;30814:9;30810:18;30802:26;;30874:9;30868:4;30864:20;30860:1;30849:9;30845:17;30838:47;30902:131;31028:4;30902:131;:::i;:::-;30894:139;;30621:419;;;:::o;31046:175::-;31186:27;31182:1;31174:6;31170:14;31163:51;31046:175;:::o;31227:366::-;31369:3;31390:67;31454:2;31449:3;31390:67;:::i;:::-;31383:74;;31466:93;31555:3;31466:93;:::i;:::-;31584:2;31579:3;31575:12;31568:19;;31227:366;;;:::o;31599:419::-;31765:4;31803:2;31792:9;31788:18;31780:26;;31852:9;31846:4;31842:20;31838:1;31827:9;31823:17;31816:47;31880:131;32006:4;31880:131;:::i;:::-;31872:139;;31599:419;;;:::o;32024:94::-;32057:8;32105:5;32101:2;32097:14;32076:35;;32024:94;;;:::o;32124:::-;32163:7;32192:20;32206:5;32192:20;:::i;:::-;32181:31;;32124:94;;;:::o;32224:100::-;32263:7;32292:26;32312:5;32292:26;:::i;:::-;32281:37;;32224:100;;;:::o;32330:157::-;32435:45;32455:24;32473:5;32455:24;:::i;:::-;32435:45;:::i;:::-;32430:3;32423:58;32330:157;;:::o;32493:256::-;32605:3;32620:75;32691:3;32682:6;32620:75;:::i;:::-;32720:2;32715:3;32711:12;32704:19;;32740:3;32733:10;;32493:256;;;;:::o;32755:182::-;32895:34;32891:1;32883:6;32879:14;32872:58;32755:182;:::o;32943:366::-;33085:3;33106:67;33170:2;33165:3;33106:67;:::i;:::-;33099:74;;33182:93;33271:3;33182:93;:::i;:::-;33300:2;33295:3;33291:12;33284:19;;32943:366;;;:::o;33315:419::-;33481:4;33519:2;33508:9;33504:18;33496:26;;33568:9;33562:4;33558:20;33554:1;33543:9;33539:17;33532:47;33596:131;33722:4;33596:131;:::i;:::-;33588:139;;33315:419;;;:::o;33740:179::-;33880:31;33876:1;33868:6;33864:14;33857:55;33740:179;:::o;33925:366::-;34067:3;34088:67;34152:2;34147:3;34088:67;:::i;:::-;34081:74;;34164:93;34253:3;34164:93;:::i;:::-;34282:2;34277:3;34273:12;34266:19;;33925:366;;;:::o;34297:419::-;34463:4;34501:2;34490:9;34486:18;34478:26;;34550:9;34544:4;34540:20;34536:1;34525:9;34521:17;34514:47;34578:131;34704:4;34578:131;:::i;:::-;34570:139;;34297:419;;;:::o;34722:227::-;34862:34;34858:1;34850:6;34846:14;34839:58;34931:10;34926:2;34918:6;34914:15;34907:35;34722:227;:::o;34955:366::-;35097:3;35118:67;35182:2;35177:3;35118:67;:::i;:::-;35111:74;;35194:93;35283:3;35194:93;:::i;:::-;35312:2;35307:3;35303:12;35296:19;;34955:366;;;:::o;35327:419::-;35493:4;35531:2;35520:9;35516:18;35508:26;;35580:9;35574:4;35570:20;35566:1;35555:9;35551:17;35544:47;35608:131;35734:4;35608:131;:::i;:::-;35600:139;;35327:419;;;:::o;35752:180::-;35800:77;35797:1;35790:88;35897:4;35894:1;35887:15;35921:4;35918:1;35911:15;35938:185;35978:1;35995:20;36013:1;35995:20;:::i;:::-;35990:25;;36029:20;36047:1;36029:20;:::i;:::-;36024:25;;36068:1;36058:35;;36073:18;;:::i;:::-;36058:35;36115:1;36112;36108:9;36103:14;;35938:185;;;;:::o;36129:225::-;36269:34;36265:1;36257:6;36253:14;36246:58;36338:8;36333:2;36325:6;36321:15;36314:33;36129:225;:::o;36360:366::-;36502:3;36523:67;36587:2;36582:3;36523:67;:::i;:::-;36516:74;;36599:93;36688:3;36599:93;:::i;:::-;36717:2;36712:3;36708:12;36701:19;;36360:366;;;:::o;36732:419::-;36898:4;36936:2;36925:9;36921:18;36913:26;;36985:9;36979:4;36975:20;36971:1;36960:9;36956:17;36949:47;37013:131;37139:4;37013:131;:::i;:::-;37005:139;;36732:419;;;:::o;37157:231::-;37297:34;37293:1;37285:6;37281:14;37274:58;37366:14;37361:2;37353:6;37349:15;37342:39;37157:231;:::o;37394:366::-;37536:3;37557:67;37621:2;37616:3;37557:67;:::i;:::-;37550:74;;37633:93;37722:3;37633:93;:::i;:::-;37751:2;37746:3;37742:12;37735:19;;37394:366;;;:::o;37766:419::-;37932:4;37970:2;37959:9;37955:18;37947:26;;38019:9;38013:4;38009:20;38005:1;37994:9;37990:17;37983:47;38047:131;38173:4;38047:131;:::i;:::-;38039:139;;37766:419;;;:::o;38191:194::-;38231:4;38251:20;38269:1;38251:20;:::i;:::-;38246:25;;38285:20;38303:1;38285:20;:::i;:::-;38280:25;;38329:1;38326;38322:9;38314:17;;38353:1;38347:4;38344:11;38341:37;;;38358:18;;:::i;:::-;38341:37;38191:194;;;;:::o;38391:222::-;38484:4;38522:2;38511:9;38507:18;38499:26;;38535:71;38603:1;38592:9;38588:17;38579:6;38535:71;:::i;:::-;38391:222;;;;:::o;38619:148::-;38721:11;38758:3;38743:18;;38619:148;;;;:::o;38773:214::-;38913:66;38909:1;38901:6;38897:14;38890:90;38773:214;:::o;38993:402::-;39153:3;39174:85;39256:2;39251:3;39174:85;:::i;:::-;39167:92;;39268:93;39357:3;39268:93;:::i;:::-;39386:2;39381:3;39377:12;39370:19;;38993:402;;;:::o;39401:77::-;39438:7;39467:5;39456:16;;39401:77;;;:::o;39484:79::-;39523:7;39552:5;39541:16;;39484:79;;;:::o;39569:157::-;39674:45;39694:24;39712:5;39694:24;:::i;:::-;39674:45;:::i;:::-;39669:3;39662:58;39569:157;;:::o;39732:522::-;39945:3;39967:148;40111:3;39967:148;:::i;:::-;39960:155;;40125:75;40196:3;40187:6;40125:75;:::i;:::-;40225:2;40220:3;40216:12;40209:19;;40245:3;40238:10;;39732:522;;;;:::o;40260:180::-;40308:77;40305:1;40298:88;40405:4;40402:1;40395:15;40429:4;40426:1;40419:15;40446:174;40586:26;40582:1;40574:6;40570:14;40563:50;40446:174;:::o;40626:366::-;40768:3;40789:67;40853:2;40848:3;40789:67;:::i;:::-;40782:74;;40865:93;40954:3;40865:93;:::i;:::-;40983:2;40978:3;40974:12;40967:19;;40626:366;;;:::o;40998:419::-;41164:4;41202:2;41191:9;41187:18;41179:26;;41251:9;41245:4;41241:20;41237:1;41226:9;41222:17;41215:47;41279:131;41405:4;41279:131;:::i;:::-;41271:139;;40998:419;;;:::o;41423:181::-;41563:33;41559:1;41551:6;41547:14;41540:57;41423:181;:::o;41610:366::-;41752:3;41773:67;41837:2;41832:3;41773:67;:::i;:::-;41766:74;;41849:93;41938:3;41849:93;:::i;:::-;41967:2;41962:3;41958:12;41951:19;;41610:366;;;:::o;41982:419::-;42148:4;42186:2;42175:9;42171:18;42163:26;;42235:9;42229:4;42225:20;42221:1;42210:9;42206:17;42199:47;42263:131;42389:4;42263:131;:::i;:::-;42255:139;;41982:419;;;:::o;42407:221::-;42547:34;42543:1;42535:6;42531:14;42524:58;42616:4;42611:2;42603:6;42599:15;42592:29;42407:221;:::o;42634:366::-;42776:3;42797:67;42861:2;42856:3;42797:67;:::i;:::-;42790:74;;42873:93;42962:3;42873:93;:::i;:::-;42991:2;42986:3;42982:12;42975:19;;42634:366;;;:::o;43006:419::-;43172:4;43210:2;43199:9;43195:18;43187:26;;43259:9;43253:4;43249:20;43245:1;43234:9;43230:17;43223:47;43287:131;43413:4;43287:131;:::i;:::-;43279:139;;43006:419;;;:::o;43431:221::-;43571:34;43567:1;43559:6;43555:14;43548:58;43640:4;43635:2;43627:6;43623:15;43616:29;43431:221;:::o;43658:366::-;43800:3;43821:67;43885:2;43880:3;43821:67;:::i;:::-;43814:74;;43897:93;43986:3;43897:93;:::i;:::-;44015:2;44010:3;44006:12;43999:19;;43658:366;;;:::o;44030:419::-;44196:4;44234:2;44223:9;44219:18;44211:26;;44283:9;44277:4;44273:20;44269:1;44258:9;44254:17;44247:47;44311:131;44437:4;44311:131;:::i;:::-;44303:139;;44030:419;;;:::o;44455:118::-;44542:24;44560:5;44542:24;:::i;:::-;44537:3;44530:37;44455:118;;:::o;44579:86::-;44614:7;44654:4;44647:5;44643:16;44632:27;;44579:86;;;:::o;44671:112::-;44754:22;44770:5;44754:22;:::i;:::-;44749:3;44742:35;44671:112;;:::o;44789:545::-;44962:4;45000:3;44989:9;44985:19;44977:27;;45014:71;45082:1;45071:9;45067:17;45058:6;45014:71;:::i;:::-;45095:68;45159:2;45148:9;45144:18;45135:6;45095:68;:::i;:::-;45173:72;45241:2;45230:9;45226:18;45217:6;45173:72;:::i;:::-;45255;45323:2;45312:9;45308:18;45299:6;45255:72;:::i;:::-;44789:545;;;;;;;:::o

Swarm Source

ipfs://af5c42b79b68e2ea63b783201545f5ccd478ba6efcf3fb4466b5ed321ca49178
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.