ETH Price: $3,120.20 (-1.20%)
Gas: 10 Gwei

Token

Parsiq Token (PRQ)
 

Overview

Max Total Supply

500,000,000 PRQ

Holders

6,309 (0.00%)

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

OVERVIEW

Parsiq Token contract has migrated to 0x362bc847a3a9637d3af6624eec853618a43ed7d2.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ParsiqToken

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-09-22
*/

// Parsiq Token
pragma solidity 0.5.11;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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


/**
 * @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 {
    /**
     * @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.
     *
     * (.note) This call _does not revert_ if the signature is invalid, or
     * if the signer is otherwise unable to be retrieved. In those scenarios,
     * the zero address is returned.
     *
     * (.warning) `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) {
        // Check the signature length
        if (signature.length != 65) {
            return (address(0));
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // 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 (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): 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);
        }

        if (v != 27 && v != 28) {
            return address(0);
        }

        // If the signature is valid (and not malleable), return the signer address
        return ecrecover(hash, v, r, s);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign)
     * JSON-RPC method.
     *
     * 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 Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a `Transfer` event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destoys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

/**
 * @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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


interface ITokenReceiver {
    function tokensReceived(
        address from,
        address to,
        uint256 amount
    ) external;
}


interface ITokenMigrator {
    function migrate(address from, address to, uint256 amount) external returns (bool);
}

contract TokenRecoverable is Ownable {
    using SafeERC20 for IERC20;

    function recoverTokens(IERC20 token, address to, uint256 amount) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        require(balance >= amount, "Given amount is larger than current balance");
        token.safeTransfer(to, amount);
    }
}

contract Burner is TokenRecoverable, ITokenReceiver {
    address payable public token;

    address public migrator;

    constructor(address payable _token) public TokenRecoverable() {
        token = _token;
    }

    function setMigrator(address _migrator) public onlyOwner {
        migrator = _migrator;
    }

    function tokensReceived(address from, address to, uint256 amount) external {
        require(token != address(0), "Burner is not initialized");
        require(msg.sender == token, "Only Parsiq Token can notify");
        require(ParsiqToken(token).burningEnabled(), "Burning is disabled");
        if (migrator != address(0)) {
            ITokenMigrator(migrator).migrate(from, to, amount);
        }
        ParsiqToken(token).burn(amount);
    }
}


contract ParsiqToken is TokenRecoverable, ERC20 {
    using SafeMath for uint256;
    using ECDSA for bytes32;
    using Address for address;

    uint256 internal constant MAX_UINT256 = ~uint256(0);
    uint256 internal constant TOTAL_TOKENS = 500000000e18; // 500 000 000 tokens
    string public constant name = "Parsiq Token";
    string public constant symbol = "PRQ";
    uint8 public constant decimals = uint8(18);

    mapping(address => bool) public notify;
    mapping(address => Timelock[]) public timelocks;
    mapping(address => Timelock[]) public relativeTimelocks;
    mapping(bytes32 => bool) public hashedTxs;
    mapping(address => bool) public whitelisted;
    uint256 public transfersUnlockTime = MAX_UINT256; // MAX_UINT256 - transfers locked
    address public burnerAddress;
    bool public burningEnabled;
    bool public etherlessTransferEnabled = true;

    struct Timelock {
        uint256 time;
        uint256 amount;
    }

    event TransferPreSigned(
        address indexed from,
        address indexed to,
        address indexed delegate,
        uint256 amount,
        uint256 fee);
    event TransferLocked(address indexed from, address indexed to, uint256 amount, uint256 until);
    event TransferLockedRelative(address indexed from, address indexed to, uint256 amount, uint256 duration);
    event Released(address indexed to, uint256 amount);
    event WhitelistedAdded(address indexed account);
    event WhitelistedRemoved(address indexed account);

    modifier onlyWhenEtherlessTransferEnabled {
        require(etherlessTransferEnabled == true, "Etherless transfer functionality disabled");
        _;
    }
    
    modifier onlyBurner() {
        require(msg.sender == burnerAddress, "Only burnAddress can burn tokens");
        _;
    }

    modifier onlyWhenTransfersUnlocked(address from, address to) {
        require(
            transfersUnlockTime <= now ||
            whitelisted[from] == true ||
            whitelisted[to] == true, "Transfers locked");
        _;
    }

    modifier onlyWhitelisted() {
        require(whitelisted[msg.sender] == true, "Not whitelisted");
        _;
    }

    modifier notTokenAddress(address _address) {
        require(_address != address(this), "Cannot transfer to token contract");
        _;
    }

    modifier notBurnerUntilBurnIsEnabled(address _address) {
        require(burningEnabled == true || _address != burnerAddress, "Cannot transfer to burner address, until burning is not enabled");
        _;
    }

    constructor() public TokenRecoverable() {
        _mint(msg.sender, TOTAL_TOKENS);
        _addWhitelisted(msg.sender);
        burnerAddress = address(new Burner(address(this)));
        notify[burnerAddress] = true; // Manually register Burner, because it cannot call register() while token constructor is not complete
        Burner(burnerAddress).transferOwnership(msg.sender);
    }

    function () external payable {
        _release(msg.sender);
        if (msg.value > 0) {
            msg.sender.transfer(msg.value);
        }
    }

    function register() public {
        notify[msg.sender] = true;
    }

    function unregister() public {
        notify[msg.sender] = false;
    }

    function enableEtherlessTransfer() public onlyOwner {
        etherlessTransferEnabled = true;
    }

    function disableEtherlessTransfer() public onlyOwner {
        etherlessTransferEnabled = false;
    }

    function addWhitelisted(address _address) public onlyOwner {
        _addWhitelisted(_address);
    }

    function removeWhitelisted(address _address) public onlyOwner {
        _removeWhitelisted(_address);
    }

    function renounceWhitelisted() public {
        _removeWhitelisted(msg.sender);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _removeWhitelisted(owner());
        super.transferOwnership(newOwner);
        _addWhitelisted(newOwner);
    }

    function renounceOwnership() public onlyOwner {
        renounceWhitelisted();
        super.renounceOwnership();
    }

    function unlockTransfers(uint256 when) public onlyOwner {
        require(transfersUnlockTime == MAX_UINT256, "Transfers already unlocked");
        require(when >= now, "Transfer unlock must not be in past");
        transfersUnlockTime = when;
    }

    function transfer(address to, uint256 value) public
        onlyWhenTransfersUnlocked(msg.sender, to)
        notTokenAddress(to)
        notBurnerUntilBurnIsEnabled(to)
        returns (bool)
    {
        bool success = super.transfer(to, value);
        if (success) {
            _postTransfer(msg.sender, to, value);
        }
        return success;
    }

    function transferFrom(address from, address to, uint256 value) public
        onlyWhenTransfersUnlocked(from, to)
        notTokenAddress(to)
        notBurnerUntilBurnIsEnabled(to)
        returns (bool)
    {
        bool success = super.transferFrom(from, to, value);
        if (success) {
            _postTransfer(from, to, value);
        }
        return success;
    }

    // We do not limit batch size, it's up to caller to determine maximum batch size/gas limit
    function transferBatch(address[] memory to, uint256[] memory value) public returns (bool) {
        require(to.length == value.length, "Array sizes must be equal");
        uint256 n = to.length;
        for (uint256 i = 0; i < n; i++) {
            transfer(to[i], value[i]);
        }
        return true;
    }

    function transferLocked(address to, uint256 value, uint256 until) public
        onlyWhitelisted
        notTokenAddress(to)
        returns (bool)
    {
        require(to != address(0), "ERC20: transfer to the zero address");
        require(value > 0, "Value must be positive");
        require(until > now, "Until must be future value");
        require(timelocks[to].length.add(relativeTimelocks[to].length) <= 100, "Too many locks on address");

        _transfer(msg.sender, address(this), value);

        timelocks[to].push(Timelock({ time: until, amount: value }));

        emit TransferLocked(msg.sender, to, value, until);
        return true;
    }

    /**
    This function is analogue to transferLocked(), but uses relative time locks to synchornize
    with transfer unlocking time
     */
    function transferLockedRelative(address to, uint256 value, uint256 duration) public
        onlyWhitelisted
        notTokenAddress(to)
        returns (bool)
    {
        require(transfersUnlockTime > now, "Relative locks are disabled. Use transferLocked() instead");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(value > 0, "Value must be positive");
        require(timelocks[to].length.add(relativeTimelocks[to].length) <= 100, "Too many locks on address");

        _transfer(msg.sender, address(this), value);

        relativeTimelocks[to].push(Timelock({ time: duration, amount: value }));

        emit TransferLockedRelative(msg.sender, to, value, duration);
        return true;
    }

    function release() public {
        _release(msg.sender);
    }

    function lockedBalanceOf(address who) public view returns (uint256) {
        return _lockedBalanceOf(timelocks[who])
            .add(_lockedBalanceOf(relativeTimelocks[who]));
    }
    
    function unlockableBalanceOf(address who) public view returns (uint256) {
        uint256 tokens = _unlockableBalanceOf(timelocks[who], 0);
        if (transfersUnlockTime > now) return tokens;

        return tokens.add(_unlockableBalanceOf(relativeTimelocks[who], transfersUnlockTime));
    }

    function totalBalanceOf(address who) public view returns (uint256) {
        return balanceOf(who).add(lockedBalanceOf(who));
    }

    /**
     * @dev Burns a specific amount of tokens.
     * @param value The amount of token to be burned.
     */
    function burn(uint256 value) public onlyBurner {
        _burn(msg.sender, value);
    }

    function enableBurning() public onlyOwner {
        burningEnabled = true;
    }

    /** Etherless Transfer (ERC865 based) */
    /**
     * @notice Submit a presigned transfer
     * @param _signature bytes The signature, issued by the owner.
     * @param _to address The address which you want to transfer to.
     * @param _value uint256 The amount of tokens to be transferred.
     * @param _fee uint256 The amount of tokens paid to msg.sender, by the owner.
     * @param _nonce uint256 Presigned transaction number. Should be unique, per user.
     */
    function transferPreSigned(
        bytes memory _signature,
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce
    )
        public
        onlyWhenEtherlessTransferEnabled
        notTokenAddress(_to)
        notBurnerUntilBurnIsEnabled(_to)
        returns (bool)
    {
        require(_to != address(0), "Transfer to the zero address");

        bytes32 hashedParams = hashForSign(msg.sig, address(this), _to, _value, _fee, _nonce);
        address from = hashedParams.toEthSignedMessageHash().recover(_signature);
        require(from != address(0), "Invalid signature");

        require(
            transfersUnlockTime <= now ||
            whitelisted[from] == true ||
            whitelisted[_to] == true, "Transfers are locked");

        bytes32 hashedTx = keccak256(abi.encodePacked(from, hashedParams));
        require(hashedTxs[hashedTx] == false, "Nonce already used");
        hashedTxs[hashedTx] = true;

        if (msg.sender == _to) {
            _transfer(from, _to, _value.add(_fee));
            _postTransfer(from, _to, _value.add(_fee));
        } else {
            _transfer(from, _to, _value);
            _postTransfer(from, _to, _value);
            _transfer(from, msg.sender, _fee);
            _postTransfer(from, msg.sender, _fee);
        }

        emit TransferPreSigned(from, _to, msg.sender, _value, _fee);
        return true;
    }

    /**
     * @notice Hash (keccak256) of the payload used by transferPreSigned
     * @param _token address The address of the token.
     * @param _to address The address which you want to transfer to.
     * @param _value uint256 The amount of tokens to be transferred.
     * @param _fee uint256 The amount of tokens paid to msg.sender, by the owner.
     * @param _nonce uint256 Presigned transaction number.
     */
    function hashForSign(
        bytes4 _selector,
        address _token,
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce
    )
        public
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(_selector, _token, _to, _value, _fee, _nonce));
    }

    function releasePreSigned(bytes memory _signature, uint256 _fee, uint256 _nonce)
        public
        onlyWhenEtherlessTransferEnabled
        returns (bool)
    {
        bytes32 hashedParams = hashForReleaseSign(msg.sig, address(this), _fee, _nonce);
        address from = hashedParams.toEthSignedMessageHash().recover(_signature);
        require(from != address(0), "Invalid signature");

        bytes32 hashedTx = keccak256(abi.encodePacked(from, hashedParams));
        require(hashedTxs[hashedTx] == false, "Nonce already used");
        hashedTxs[hashedTx] = true;

        uint256 released = _release(from);
        require(released > _fee, "Too small release");
        if (from != msg.sender) { // "from" already have all the tokens, no need to charge
            _transfer(from, msg.sender, _fee);
            _postTransfer(from, msg.sender, _fee);
        }
        return true;
    }

    /**
     * @notice Hash (keccak256) of the payload used by transferPreSigned
     * @param _token address The address of the token.
     * @param _fee uint256 The amount of tokens paid to msg.sender, by the owner.
     * @param _nonce uint256 Presigned transaction number.
     */
    function hashForReleaseSign(
        bytes4 _selector,
        address _token,
        uint256 _fee,
        uint256 _nonce
    )
        public
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(_selector, _token, _fee, _nonce));
    }

    function recoverTokens(IERC20 token, address to, uint256 amount) public onlyOwner {
        require(address(token) != address(this), "Cannot recover Parsiq tokens");
        super.recoverTokens(token, to,  amount);
    }

    function _release(address beneficiary) internal
        notBurnerUntilBurnIsEnabled(beneficiary)
        returns (uint256) {
        uint256 tokens = _releaseLocks(timelocks[beneficiary], 0);
        if (transfersUnlockTime <= now) {
            tokens = tokens.add(_releaseLocks(relativeTimelocks[beneficiary], transfersUnlockTime));
        }

        if (tokens == 0) return 0;
        _transfer(address(this), beneficiary, tokens);
        _postTransfer(address(this), beneficiary, tokens);
        emit Released(beneficiary, tokens);
        return tokens;
    }

    function _releaseLocks(Timelock[] storage locks, uint256 relativeTime) internal returns (uint256) {
        uint256 tokens = 0;
        uint256 lockCount = locks.length;
        uint256 i = lockCount;
        while (i > 0) {
            i--;
            Timelock storage timelock = locks[i]; 
            if (relativeTime.add(timelock.time) > now) continue;
            
            tokens = tokens.add(timelock.amount);
            lockCount--;
            if (i != lockCount) {
                locks[i] = locks[lockCount];
            }
        }
        locks.length = lockCount;
        return tokens;
    }

    function _lockedBalanceOf(Timelock[] storage locks) internal view returns (uint256) {
        uint256 tokens = 0;
        uint256 n = locks.length;
        for (uint256 i = 0; i < n; i++) {
            tokens = tokens.add(locks[i].amount);
        }
        return tokens;
    }

    function _unlockableBalanceOf(Timelock[] storage locks, uint256 relativeTime) internal view returns (uint256) {
        uint256 tokens = 0;
        uint256 n = locks.length;
        for (uint256 i = 0; i < n; i++) {
            Timelock storage timelock = locks[i];
            if (relativeTime.add(timelock.time) <= now) {
                tokens = tokens.add(timelock.amount);
            }
        }
        return tokens;
    }

    function _postTransfer(address from, address to, uint256 value) internal {
        if (!to.isContract()) return;
        if (notify[to] == false) return;

        ITokenReceiver(to).tokensReceived(from, to, value);
    }

    function _addWhitelisted(address _address) internal {
        whitelisted[_address] = true;
        emit WhitelistedAdded(_address);
    }

    function _removeWhitelisted(address _address) internal {
        whitelisted[_address] = false;
        emit WhitelistedRemoved(_address);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"transferPreSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"register","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"name":"transferBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"lockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"etherlessTransferEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"notify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transfersUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"unlockableBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableEtherlessTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"enableBurning","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"transferLockedRelative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashedTxs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"disableEtherlessTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"relativeTimelocks","outputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"until","type":"uint256"}],"name":"transferLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"hashForReleaseSign","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"hashForSign","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unregister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"timelocks","outputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"when","type":"uint256"}],"name":"unlockTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"releasePreSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"TransferPreSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"until","type":"uint256"}],"name":"TransferLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"TransferLockedRelative","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"}]

6080604052600019600955600a805460ff60a81b191675010000000000000000000000000000000000000000001790553480156200003c57600080fd5b50600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3620000a7336b019d971e4fe8401e740000006001600160e01b03620001ac16565b620000bb336001600160e01b03620002cb16565b30604051620000ca9062000393565b6001600160a01b03909116815260405190819003602001906000f080158015620000f8573d6000803e3d6000fd5b50600a80546001600160a01b0319166001600160a01b039283161780825582166000908152600460208190526040808320805460ff19166001179055925483517ff2fde38b00000000000000000000000000000000000000000000000000000000815233928101929092529251929093169263f2fde38b926024808301939282900301818387803b1580156200018d57600080fd5b505af1158015620001a2573d6000803e3d6000fd5b50505050620003a1565b6001600160a01b0382166200022257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200023e816003546200031760201b620028491790919060201c565b6003556001600160a01b038216600090815260016020908152604090912054620002739183906200284962000317821b17901c565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f9190a250565b6000828201838110156200038c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610bea8062003b4483390190565b61379380620003b16000396000f3fe6080604052600436106102fd5760003560e01c80637581a8e61161018f578063a457c2d7116100e1578063e6293e231161008a578063f2fde38b11610064578063f2fde38b14610ccd578063f862b7eb14610d00578063f972761314610d2a576102fd565b8063e6293e2314610c6a578063e79a198f14610c7f578063ea612ae814610c94576102fd565b8063d6cd9473116100bb578063d6cd947314610be7578063d936547e14610bfc578063dd62ed3e14610c2f576102fd565b8063a457c2d714610b16578063a9059cbb14610b4f578063cbb98c3f14610b88576102fd565b80638da5cb5b1161014357806392a950b61161011d57806392a950b614610a73578063935ad74f14610ab257806395d89b4114610b01576102fd565b80638da5cb5b146109db5780638f19808814610a0c5780638f32d59b14610a5e576102fd565b806384a27dec1161017457806384a27dec1461098757806386d1a69f146109b15780638c680798146109c6576102fd565b80637581a8e614610933578063794a921c14610948576102fd565b806342966c68116102535780635fb9cf20116101fc578063715018a6116101d6578063715018a6146108d6578063740499ab146108eb57806374686fd21461091e576102fd565b80635fb9cf201461085b57806368fc8e221461088e57806370a08231146108a3576102fd565b8063593557361161022d57806359355736146107d057806359c42cc4146108035780635f3e849f14610818576102fd565b806342966c681461075e5780634b0ee02a146107885780634d754715146107bb576102fd565b80631aa3a008116102b5578063313ce5671161028f578063313ce567146105c657806339509351146105f15780633b3e672f1461062a576102fd565b80631aa3a0081461053b57806323b872dd14610550578063291d954914610593576102fd565b806310154bad116102e657806310154bad146104145780631296830d1461044757806318160ddd14610514576102fd565b806306fdde031461033d578063095ea7b3146103c7575b61030633610de2565b50341561033b5760405133903480156108fc02916000818181858888f19350505050158015610339573d6000803e3d6000fd5b505b005b34801561034957600080fd5b50610352610f22565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d357600080fd5b50610400600480360360408110156103ea57600080fd5b506001600160a01b038135169060200135610f5b565b604080519115158252519081900360200190f35b34801561042057600080fd5b5061033b6004803603602081101561043757600080fd5b50356001600160a01b0316610f72565b34801561045357600080fd5b50610400600480360360a081101561046a57600080fd5b81019060208101813564010000000081111561048557600080fd5b82018360208201111561049757600080fd5b803590602001918460018302840111640100000000831117156104b957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335169350505060208101359060408101359060600135610fc5565b34801561052057600080fd5b50610529611401565b60408051918252519081900360200190f35b34801561054757600080fd5b5061033b611408565b34801561055c57600080fd5b506104006004803603606081101561057357600080fd5b506001600160a01b03813581169160208101359091169060400135611424565b34801561059f57600080fd5b5061033b600480360360208110156105b657600080fd5b50356001600160a01b03166115ac565b3480156105d257600080fd5b506105db6115fc565b6040805160ff9092168252519081900360200190f35b3480156105fd57600080fd5b506104006004803603604081101561061457600080fd5b506001600160a01b038135169060200135611601565b34801561063657600080fd5b506104006004803603604081101561064d57600080fd5b81019060208101813564010000000081111561066857600080fd5b82018360208201111561067a57600080fd5b8035906020019184602083028401116401000000008311171561069c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106ec57600080fd5b8201836020820111156106fe57600080fd5b8035906020019184602083028401116401000000008311171561072057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611642945050505050565b34801561076a57600080fd5b5061033b6004803603602081101561078157600080fd5b50356116eb565b34801561079457600080fd5b50610529600480360360208110156107ab57600080fd5b50356001600160a01b0316611754565b3480156107c757600080fd5b5061040061177f565b3480156107dc57600080fd5b50610529600480360360208110156107f357600080fd5b50356001600160a01b031661178f565b34801561080f57600080fd5b506104006117d5565b34801561082457600080fd5b5061033b6004803603606081101561083b57600080fd5b506001600160a01b038135811691602081013590911690604001356117e5565b34801561086757600080fd5b506104006004803603602081101561087e57600080fd5b50356001600160a01b031661189a565b34801561089a57600080fd5b506105296118af565b3480156108af57600080fd5b50610529600480360360208110156108c657600080fd5b50356001600160a01b03166118b5565b3480156108e257600080fd5b5061033b6118d0565b3480156108f757600080fd5b506105296004803603602081101561090e57600080fd5b50356001600160a01b0316611929565b34801561092a57600080fd5b5061033b61198f565b34801561093f57600080fd5b5061033b6119eb565b34801561095457600080fd5b506104006004803603606081101561096b57600080fd5b506001600160a01b038135169060208101359060400135611a62565b34801561099357600080fd5b50610400600480360360208110156109aa57600080fd5b5035611d15565b3480156109bd57600080fd5b5061033b611d2a565b3480156109d257600080fd5b5061033b611d33565b3480156109e757600080fd5b506109f0611d89565b604080516001600160a01b039092168252519081900360200190f35b348015610a1857600080fd5b50610a4560048036036040811015610a2f57600080fd5b506001600160a01b038135169060200135611d98565b6040805192835260208301919091528051918290030190f35b348015610a6a57600080fd5b50610400611dd1565b348015610a7f57600080fd5b5061040060048036036060811015610a9657600080fd5b506001600160a01b038135169060208101359060400135611de2565b348015610abe57600080fd5b5061052960048036036080811015610ad557600080fd5b506001600160e01b0319813516906001600160a01b0360208201351690604081013590606001356120a9565b348015610b0d57600080fd5b50610352612107565b348015610b2257600080fd5b5061040060048036036040811015610b3957600080fd5b506001600160a01b038135169060200135612140565b348015610b5b57600080fd5b5061040060048036036040811015610b7257600080fd5b506001600160a01b03813516906020013561217c565b348015610b9457600080fd5b50610529600480360360c0811015610bab57600080fd5b506001600160e01b0319813516906001600160a01b03602082013581169160408101359091169060608101359060808101359060a00135612302565b348015610bf357600080fd5b5061033b612371565b348015610c0857600080fd5b5061040060048036036020811015610c1f57600080fd5b50356001600160a01b031661237a565b348015610c3b57600080fd5b5061052960048036036040811015610c5257600080fd5b506001600160a01b038135811691602001351661238f565b348015610c7657600080fd5b506109f06123ba565b348015610c8b57600080fd5b5061033b6123c9565b348015610ca057600080fd5b50610a4560048036036040811015610cb757600080fd5b506001600160a01b0381351690602001356123e2565b348015610cd957600080fd5b5061033b60048036036020811015610cf057600080fd5b50356001600160a01b03166123fb565b348015610d0c57600080fd5b5061033b60048036036020811015610d2357600080fd5b503561245b565b348015610d3657600080fd5b5061040060048036036060811015610d4d57600080fd5b810190602081018135640100000000811115610d6857600080fd5b820183602082011115610d7a57600080fd5b80359060200191846001830284011164010000000083111715610d9c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013561253e565b600081600a60149054906101000a900460ff161515600115151480610e155750600a546001600160a01b03828116911614155b610e505760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260408120610e729082612768565b90504260095411610eb5576001600160a01b0384166000908152600660205260409020600954610eb291610ea591612768565b829063ffffffff61284916565b90505b80610ec4576000925050610f1c565b610ecf3085836128a3565b610eda3085836129e7565b6040805182815290516001600160a01b038616917fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e919081900360200190a291505b50919050565b6040518060400160405280600c81526020017f50617273697120546f6b656e000000000000000000000000000000000000000081525081565b6000610f68338484612ab4565b5060015b92915050565b610f7a611dd1565b610fb9576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b610fc281612ba0565b50565b600a54600090600160a81b900460ff1615156001146110155760405162461bcd60e51b81526004018080602001828103825260298152602001806136176029913960400191505060405180910390fd5b846001600160a01b03811630141561105e5760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b600a548690600160a01b900460ff1615156001148061108b5750600a546001600160a01b03828116911614155b6110c65760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b6001600160a01b038716611121576040805162461bcd60e51b815260206004820152601c60248201527f5472616e7366657220746f20746865207a65726f206164647265737300000000604482015290519081900360640190fd5b600061113d6000356001600160e01b031916308a8a8a8a612302565b9050600061115a8a61114e84612bec565b9063ffffffff612c3d16565b90506001600160a01b0381166111b7576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b426009541115806111e557506001600160a01b03811660009081526008602052604090205460ff1615156001145b8061120d57506001600160a01b03891660009081526008602052604090205460ff1615156001145b61125e576040805162461bcd60e51b815260206004820152601460248201527f5472616e736665727320617265206c6f636b6564000000000000000000000000604482015290519081900360640190fd5b604080516bffffffffffffffffffffffff19606084901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260079092529190205460ff1615611304576040805162461bcd60e51b815260206004820152601260248201527f4e6f6e636520616c726561647920757365640000000000000000000000000000604482015290519081900360640190fd5b6000818152600760205260409020805460ff19166001179055336001600160a01b038b16141561136757611348828b6113438c8c63ffffffff61284916565b6128a3565b611362828b61135d8c8c63ffffffff61284916565b6129e7565b611393565b611372828b8b6128a3565b61137d828b8b6129e7565b61138882338a6128a3565b61139382338a6129e7565b336001600160a01b03168a6001600160a01b0316836001600160a01b03167fec5a73fd1f178be20c1bca1b406cbf4b5c20d833b66e582fc122fb4baa0fc2a48c8c604051808381526020018281526020019250505060405180910390a45060019a9950505050505050505050565b6003545b90565b336000908152600460205260409020805460ff19166001179055565b600083834260095411158061145657506001600160a01b03821660009081526008602052604090205460ff1615156001145b8061147e57506001600160a01b03811660009081526008602052604090205460ff1615156001145b6114cf576040805162461bcd60e51b815260206004820152601060248201527f5472616e7366657273206c6f636b656400000000000000000000000000000000604482015290519081900360640190fd5b846001600160a01b0381163014156115185760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b600a548690600160a01b900460ff161515600114806115455750600a546001600160a01b03828116911614155b6115805760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b600061158d898989612d2b565b905080156115a0576115a08989896129e7565b98975050505050505050565b6115b4611dd1565b6115f3576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b610fc281612d7d565b601281565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610f6891859061163d908663ffffffff61284916565b612ab4565b6000815183511461169a576040805162461bcd60e51b815260206004820152601960248201527f41727261792073697a6573206d75737420626520657175616c00000000000000604482015290519081900360640190fd5b825160005b818110156116e0576116d78582815181106116b657fe5b60200260200101518583815181106116ca57fe5b602002602001015161217c565b5060010161169f565b506001949350505050565b600a546001600160a01b0316331461174a576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206275726e416464726573732063616e206275726e20746f6b656e73604482015290519081900360640190fd5b610fc23382612dc6565b60006117776117628361178f565b61176b846118b5565b9063ffffffff61284916565b90505b919050565b600a54600160a01b900460ff1681565b6001600160a01b0381166000908152600660205260408120611777906117b490612ea1565b6001600160a01b038416600090815260056020526040902061176b90612ea1565b600a54600160a81b900460ff1681565b6117ed611dd1565b61182c576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b6001600160a01b03831630141561188a576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74207265636f7665722050617273697120746f6b656e7300000000604482015290519081900360640190fd5b611895838383612ef5565b505050565b60046020526000908152604090205460ff1681565b60095481565b6001600160a01b031660009081526001602052604090205490565b6118d8611dd1565b611917576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b61191f612371565b61192761302c565b565b6001600160a01b0381166000908152600560205260408120819061194d90826130ca565b905042600954111561196057905061177a565b6001600160a01b038316600090815260066020526040902060095461198891610ea5916130ca565b9392505050565b611997611dd1565b6119d6576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600a805460ff60a81b1916600160a81b179055565b6119f3611dd1565b611a32576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055565b3360009081526008602052604081205460ff161515600114611acb576040805162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015290519081900360640190fd5b836001600160a01b038116301415611b145760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b4260095411611b545760405162461bcd60e51b81526004018080602001828103825260398152602001806135be6039913960400191505060405180910390fd5b6001600160a01b038516611b995760405162461bcd60e51b81526004018080602001828103825260238152602001806135306023913960400191505060405180910390fd5b60008411611bee576040805162461bcd60e51b815260206004820152601660248201527f56616c7565206d75737420626520706f73697469766500000000000000000000604482015290519081900360640190fd5b6001600160a01b038516600090815260066020908152604080832054600590925290912054606491611c26919063ffffffff61284916565b1115611c79576040805162461bcd60e51b815260206004820152601960248201527f546f6f206d616e79206c6f636b73206f6e206164647265737300000000000000604482015290519081900360640190fd5b611c843330866128a3565b6001600160a01b0385166000818152600660209081526040808320815180830183528881528084018a81528254600181810185559387529585902091516002909602909101948555519301929092558151878152908101869052815133927ffc99ec08db15cb3bcfb24a09ff771dec89a23b9a4dbce684a68e1c84d836501c928290030190a3506001949350505050565b60076020526000908152604090205460ff1681565b610fc233610de2565b611d3b611dd1565b611d7a576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600a805460ff60a81b19169055565b6000546001600160a01b031690565b60066020528160005260406000208181548110611db157fe5b600091825260209091206002909102018054600190910154909250905082565b6000546001600160a01b0316331490565b3360009081526008602052604081205460ff161515600114611e4b576040805162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015290519081900360640190fd5b836001600160a01b038116301415611e945760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b6001600160a01b038516611ed95760405162461bcd60e51b81526004018080602001828103825260238152602001806135306023913960400191505060405180910390fd5b60008411611f2e576040805162461bcd60e51b815260206004820152601660248201527f56616c7565206d75737420626520706f73697469766500000000000000000000604482015290519081900360640190fd5b428311611f82576040805162461bcd60e51b815260206004820152601a60248201527f556e74696c206d757374206265206675747572652076616c7565000000000000604482015290519081900360640190fd5b6001600160a01b038516600090815260066020908152604080832054600590925290912054606491611fba919063ffffffff61284916565b111561200d576040805162461bcd60e51b815260206004820152601960248201527f546f6f206d616e79206c6f636b73206f6e206164647265737300000000000000604482015290519081900360640190fd5b6120183330866128a3565b6001600160a01b0385166000818152600560209081526040808320815180830183528881528084018a81528254600181810185559387529585902091516002909602909101948555519301929092558151878152908101869052815133927f34c966766e471b87b7ce8d0d0358378cf20008a30bbb36246a3413c8a286834e928290030190a3506001949350505050565b604080516001600160e01b03199590951660208087019190915260609490941b6bffffffffffffffffffffffff1916602486015260388501929092526058808501919091528151808503909101815260789093019052815191012090565b6040518060400160405280600381526020017f505251000000000000000000000000000000000000000000000000000000000081525081565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610f6891859061163d908663ffffffff61314216565b60003383426009541115806121ae57506001600160a01b03821660009081526008602052604090205460ff1615156001145b806121d657506001600160a01b03811660009081526008602052604090205460ff1615156001145b612227576040805162461bcd60e51b815260206004820152601060248201527f5472616e7366657273206c6f636b656400000000000000000000000000000000604482015290519081900360640190fd5b846001600160a01b0381163014156122705760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b600a548690600160a01b900460ff1615156001148061229d5750600a546001600160a01b03828116911614155b6122d85760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b60006122e4888861319f565b905080156122f7576122f73389896129e7565b979650505050505050565b604080516001600160e01b0319979097166020808901919091526bffffffffffffffffffffffff19606097881b811660248a01529590961b9094166038870152604c860192909252606c850152608c808501919091528151808503909101815260ac9093019052815191012090565b61192733612d7d565b60086020526000908152604090205460ff1681565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600a546001600160a01b031681565b336000908152600460205260409020805460ff19169055565b60056020528160005260406000208181548110611db157fe5b612403611dd1565b612442576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b61245261244d611d89565b612d7d565b610fb9816131ac565b612463611dd1565b6124a2576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600954600019146124fa576040805162461bcd60e51b815260206004820152601a60248201527f5472616e736665727320616c726561647920756e6c6f636b6564000000000000604482015290519081900360640190fd5b428110156125395760405162461bcd60e51b81526004018080602001828103825260238152602001806135536023913960400191505060405180910390fd5b600955565b600a54600090600160a81b900460ff16151560011461258e5760405162461bcd60e51b81526004018080602001828103825260298152602001806136176029913960400191505060405180910390fd5b60006125a86000356001600160e01b0319163086866120a9565b905060006125b98661114e84612bec565b90506001600160a01b038116612616576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b604080516bffffffffffffffffffffffff19606084901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260079092529190205460ff16156126bc576040805162461bcd60e51b815260206004820152601260248201527f4e6f6e636520616c726561647920757365640000000000000000000000000000604482015290519081900360640190fd5b6000818152600760205260408120805460ff191660011790556126de83610de2565b9050868111612734576040805162461bcd60e51b815260206004820152601160248201527f546f6f20736d616c6c2072656c65617365000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038316331461275a5761274f8333896128a3565b61275a8333896129e7565b506001979650505050505050565b81546000908190805b801561283357808060019003915050600086828154811061278e57fe5b90600052602060002090600202019050426127b682600001548861284990919063ffffffff16565b11156127c25750612771565b60018101546127d890859063ffffffff61284916565b93506000199092019181831461282d578683815481106127f457fe5b906000526020600020906002020187838154811061280e57fe5b6000918252602090912082546002909202019081556001918201549101555b50612771565b8161283e87826134e7565b509195945050505050565b600082820183811015611988576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166128e85760405162461bcd60e51b81526004018080602001828103825260258152602001806136616025913960400191505060405180910390fd5b6001600160a01b03821661292d5760405162461bcd60e51b81526004018080602001828103825260238152602001806135306023913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054612956908263ffffffff61314216565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461298b908263ffffffff61284916565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6129f9826001600160a01b03166131fc565b612a0257611895565b6001600160a01b03821660009081526004602052604090205460ff16612a2757611895565b604080517f29e9a3b90000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528416602482018190526044820184905291516329e9a3b99160648082019260009290919082900301818387803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b50505050505050565b6001600160a01b038316612af95760405162461bcd60e51b81526004018080602001828103825260248152602001806136a76024913960400191505060405180910390fd5b6001600160a01b038216612b3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061359c6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f9190a250565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114612c5057506000610f6c565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612c965760009350505050610f6c565b8060ff16601b14158015612cae57508060ff16601c14155b15612cbf5760009350505050610f6c565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015612d16573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000612d388484846128a3565b6001600160a01b038416600090815260026020908152604080832033808552925290912054612d7391869161163d908663ffffffff61314216565b5060019392505050565b6001600160a01b038116600081815260086020526040808220805460ff19169055517f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b69190a250565b6001600160a01b038216612e0b5760405162461bcd60e51b81526004018080602001828103825260218152602001806136406021913960400191505060405180910390fd5b600354612e1e908263ffffffff61314216565b6003556001600160a01b038216600090815260016020526040902054612e4a908263ffffffff61314216565b6001600160a01b0383166000818152600160209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b80546000908190815b81811015612eec57612ee2858281548110612ec157fe5b9060005260206000209060020201600101548461284990919063ffffffff16565b9250600101612eaa565b50909392505050565b612efd611dd1565b612f3c576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015612f9f57600080fd5b505afa158015612fb3573d6000803e3d6000fd5b505050506040513d6020811015612fc957600080fd5b505190508181101561300c5760405162461bcd60e51b815260040180806020018281038252602b815260200180613734602b913960400191505060405180910390fd5b6130266001600160a01b038516848463ffffffff61320216565b50505050565b613034611dd1565b613073576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b81546000908190815b818110156131385760008682815481106130e957fe5b906000526020600020906002020190504261311182600001548861284990919063ffffffff16565b1161312f57600181015461312c90859063ffffffff61284916565b93505b506001016130d3565b5090949350505050565b600082821115613199576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000610f683384846128a3565b6131b4611dd1565b6131f3576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b610fc281613282565b3b151590565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261189590849061332f565b6001600160a01b0381166132c75760405162461bcd60e51b81526004018080602001828103825260268152602001806135766026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b613341826001600160a01b03166131fc565b613392576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106133d05780518252601f1990920191602091820191016133b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613432576040519150601f19603f3d011682016040523d82523d6000602084013e613437565b606091505b50915091508161348e576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613026578080602001905160208110156134aa57600080fd5b50516130265760405162461bcd60e51b815260040180806020018281038252602a81526020018061370a602a913960400191505060405180910390fd5b81548183558181111561189557600083815260209020611895916114059160029182028101918502015b8082111561352b5760008082556001820155600201613511565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735472616e7366657220756e6c6f636b206d757374206e6f7420626520696e20706173744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737352656c6174697665206c6f636b73206172652064697361626c65642e20557365207472616e736665724c6f636b6564282920696e73746561644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245746865726c657373207472616e736665722066756e6374696f6e616c6974792064697361626c656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737343616e6e6f74207472616e7366657220746f20746f6b656e20636f6e747261637445524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e6e6f74207472616e7366657220746f206275726e657220616464726573732c20756e74696c206275726e696e67206973206e6f7420656e61626c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564476976656e20616d6f756e74206973206c6172676572207468616e2063757272656e742062616c616e6365a265627a7a723158204850bd1a31aa43206b6b736c9621d61fd68a7148ef6f125792205d8032b65b4d64736f6c634300050b0032608060405234801561001057600080fd5b50604051610bea380380610bea8339818101604052602081101561003357600080fd5b5051600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055610b3d806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80637cd07e47116100765780638f32d59b1161005b5780638f32d59b14610170578063f2fde38b1461018c578063fc0c546a146101b2576100a3565b80637cd07e47146101445780638da5cb5b14610168576100a3565b806323cf3118146100a857806329e9a3b9146100d05780635f3e849f14610106578063715018a61461013c575b600080fd5b6100ce600480360360208110156100be57600080fd5b50356001600160a01b03166101ba565b005b6100ce600480360360608110156100e657600080fd5b506001600160a01b03813581169160208101359091169060400135610242565b6100ce6004803603606081101561011c57600080fd5b506001600160a01b03813581169160208101359091169060400135610501565b6100ce61064a565b61014c6106fa565b604080516001600160a01b039092168252519081900360200190f35b61014c610709565b610178610718565b604080519115158252519081900360200190f35b6100ce600480360360208110156101a257600080fd5b50356001600160a01b0316610729565b61014c61078e565b6101c2610718565b610213576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001546001600160a01b031661029f576040805162461bcd60e51b815260206004820152601960248201527f4275726e6572206973206e6f7420696e697469616c697a656400000000000000604482015290519081900360640190fd5b6001546001600160a01b031633146102fe576040805162461bcd60e51b815260206004820152601c60248201527f4f6e6c792050617273697120546f6b656e2063616e206e6f7469667900000000604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316634d7547156040518163ffffffff1660e01b815260040160206040518083038186803b15801561034c57600080fd5b505afa158015610360573d6000803e3d6000fd5b505050506040513d602081101561037657600080fd5b50516103c9576040805162461bcd60e51b815260206004820152601360248201527f4275726e696e672069732064697361626c656400000000000000000000000000604482015290519081900360640190fd5b6002546001600160a01b03161561047e57600254604080517ff16565ee0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529151919092169163f16565ee9160648083019260209291908290030181600087803b15801561045157600080fd5b505af1158015610465573d6000803e3d6000fd5b505050506040513d602081101561047b57600080fd5b50505b600154604080517f42966c680000000000000000000000000000000000000000000000000000000081526004810184905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b50505050505050565b610509610718565b61055a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b1580156105bd57600080fd5b505afa1580156105d1573d6000803e3d6000fd5b505050506040513d60208110156105e757600080fd5b505190508181101561062a5760405162461bcd60e51b815260040180806020018281038252602b815260200180610ade602b913960400191505060405180910390fd5b6106446001600160a01b038516848463ffffffff61079d16565b50505050565b610652610718565b6106a3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6002546001600160a01b031681565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b610731610718565b610782576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61078b81610822565b50565b6001546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261081d9084906108cf565b505050565b6001600160a01b0381166108675760405162461bcd60e51b8152600401808060200182810382526026815260200180610a8e6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6108e1826001600160a01b0316610a87565b610932576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106109705780518252601f199092019160209182019101610951565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146109d2576040519150601f19603f3d011682016040523d82523d6000602084013e6109d7565b606091505b509150915081610a2e576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561064457808060200190516020811015610a4a57600080fd5b50516106445760405162461bcd60e51b815260040180806020018281038252602a815260200180610ab4602a913960400191505060405180910390fd5b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564476976656e20616d6f756e74206973206c6172676572207468616e2063757272656e742062616c616e6365a265627a7a72315820a6b1b798ff29936702e0b1193f0812e740a2b289e1b6bd2474dec9e252007b1464736f6c634300050b0032

Deployed Bytecode

0x6080604052600436106102fd5760003560e01c80637581a8e61161018f578063a457c2d7116100e1578063e6293e231161008a578063f2fde38b11610064578063f2fde38b14610ccd578063f862b7eb14610d00578063f972761314610d2a576102fd565b8063e6293e2314610c6a578063e79a198f14610c7f578063ea612ae814610c94576102fd565b8063d6cd9473116100bb578063d6cd947314610be7578063d936547e14610bfc578063dd62ed3e14610c2f576102fd565b8063a457c2d714610b16578063a9059cbb14610b4f578063cbb98c3f14610b88576102fd565b80638da5cb5b1161014357806392a950b61161011d57806392a950b614610a73578063935ad74f14610ab257806395d89b4114610b01576102fd565b80638da5cb5b146109db5780638f19808814610a0c5780638f32d59b14610a5e576102fd565b806384a27dec1161017457806384a27dec1461098757806386d1a69f146109b15780638c680798146109c6576102fd565b80637581a8e614610933578063794a921c14610948576102fd565b806342966c68116102535780635fb9cf20116101fc578063715018a6116101d6578063715018a6146108d6578063740499ab146108eb57806374686fd21461091e576102fd565b80635fb9cf201461085b57806368fc8e221461088e57806370a08231146108a3576102fd565b8063593557361161022d57806359355736146107d057806359c42cc4146108035780635f3e849f14610818576102fd565b806342966c681461075e5780634b0ee02a146107885780634d754715146107bb576102fd565b80631aa3a008116102b5578063313ce5671161028f578063313ce567146105c657806339509351146105f15780633b3e672f1461062a576102fd565b80631aa3a0081461053b57806323b872dd14610550578063291d954914610593576102fd565b806310154bad116102e657806310154bad146104145780631296830d1461044757806318160ddd14610514576102fd565b806306fdde031461033d578063095ea7b3146103c7575b61030633610de2565b50341561033b5760405133903480156108fc02916000818181858888f19350505050158015610339573d6000803e3d6000fd5b505b005b34801561034957600080fd5b50610352610f22565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d357600080fd5b50610400600480360360408110156103ea57600080fd5b506001600160a01b038135169060200135610f5b565b604080519115158252519081900360200190f35b34801561042057600080fd5b5061033b6004803603602081101561043757600080fd5b50356001600160a01b0316610f72565b34801561045357600080fd5b50610400600480360360a081101561046a57600080fd5b81019060208101813564010000000081111561048557600080fd5b82018360208201111561049757600080fd5b803590602001918460018302840111640100000000831117156104b957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335169350505060208101359060408101359060600135610fc5565b34801561052057600080fd5b50610529611401565b60408051918252519081900360200190f35b34801561054757600080fd5b5061033b611408565b34801561055c57600080fd5b506104006004803603606081101561057357600080fd5b506001600160a01b03813581169160208101359091169060400135611424565b34801561059f57600080fd5b5061033b600480360360208110156105b657600080fd5b50356001600160a01b03166115ac565b3480156105d257600080fd5b506105db6115fc565b6040805160ff9092168252519081900360200190f35b3480156105fd57600080fd5b506104006004803603604081101561061457600080fd5b506001600160a01b038135169060200135611601565b34801561063657600080fd5b506104006004803603604081101561064d57600080fd5b81019060208101813564010000000081111561066857600080fd5b82018360208201111561067a57600080fd5b8035906020019184602083028401116401000000008311171561069c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106ec57600080fd5b8201836020820111156106fe57600080fd5b8035906020019184602083028401116401000000008311171561072057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611642945050505050565b34801561076a57600080fd5b5061033b6004803603602081101561078157600080fd5b50356116eb565b34801561079457600080fd5b50610529600480360360208110156107ab57600080fd5b50356001600160a01b0316611754565b3480156107c757600080fd5b5061040061177f565b3480156107dc57600080fd5b50610529600480360360208110156107f357600080fd5b50356001600160a01b031661178f565b34801561080f57600080fd5b506104006117d5565b34801561082457600080fd5b5061033b6004803603606081101561083b57600080fd5b506001600160a01b038135811691602081013590911690604001356117e5565b34801561086757600080fd5b506104006004803603602081101561087e57600080fd5b50356001600160a01b031661189a565b34801561089a57600080fd5b506105296118af565b3480156108af57600080fd5b50610529600480360360208110156108c657600080fd5b50356001600160a01b03166118b5565b3480156108e257600080fd5b5061033b6118d0565b3480156108f757600080fd5b506105296004803603602081101561090e57600080fd5b50356001600160a01b0316611929565b34801561092a57600080fd5b5061033b61198f565b34801561093f57600080fd5b5061033b6119eb565b34801561095457600080fd5b506104006004803603606081101561096b57600080fd5b506001600160a01b038135169060208101359060400135611a62565b34801561099357600080fd5b50610400600480360360208110156109aa57600080fd5b5035611d15565b3480156109bd57600080fd5b5061033b611d2a565b3480156109d257600080fd5b5061033b611d33565b3480156109e757600080fd5b506109f0611d89565b604080516001600160a01b039092168252519081900360200190f35b348015610a1857600080fd5b50610a4560048036036040811015610a2f57600080fd5b506001600160a01b038135169060200135611d98565b6040805192835260208301919091528051918290030190f35b348015610a6a57600080fd5b50610400611dd1565b348015610a7f57600080fd5b5061040060048036036060811015610a9657600080fd5b506001600160a01b038135169060208101359060400135611de2565b348015610abe57600080fd5b5061052960048036036080811015610ad557600080fd5b506001600160e01b0319813516906001600160a01b0360208201351690604081013590606001356120a9565b348015610b0d57600080fd5b50610352612107565b348015610b2257600080fd5b5061040060048036036040811015610b3957600080fd5b506001600160a01b038135169060200135612140565b348015610b5b57600080fd5b5061040060048036036040811015610b7257600080fd5b506001600160a01b03813516906020013561217c565b348015610b9457600080fd5b50610529600480360360c0811015610bab57600080fd5b506001600160e01b0319813516906001600160a01b03602082013581169160408101359091169060608101359060808101359060a00135612302565b348015610bf357600080fd5b5061033b612371565b348015610c0857600080fd5b5061040060048036036020811015610c1f57600080fd5b50356001600160a01b031661237a565b348015610c3b57600080fd5b5061052960048036036040811015610c5257600080fd5b506001600160a01b038135811691602001351661238f565b348015610c7657600080fd5b506109f06123ba565b348015610c8b57600080fd5b5061033b6123c9565b348015610ca057600080fd5b50610a4560048036036040811015610cb757600080fd5b506001600160a01b0381351690602001356123e2565b348015610cd957600080fd5b5061033b60048036036020811015610cf057600080fd5b50356001600160a01b03166123fb565b348015610d0c57600080fd5b5061033b60048036036020811015610d2357600080fd5b503561245b565b348015610d3657600080fd5b5061040060048036036060811015610d4d57600080fd5b810190602081018135640100000000811115610d6857600080fd5b820183602082011115610d7a57600080fd5b80359060200191846001830284011164010000000083111715610d9c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013561253e565b600081600a60149054906101000a900460ff161515600115151480610e155750600a546001600160a01b03828116911614155b610e505760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260408120610e729082612768565b90504260095411610eb5576001600160a01b0384166000908152600660205260409020600954610eb291610ea591612768565b829063ffffffff61284916565b90505b80610ec4576000925050610f1c565b610ecf3085836128a3565b610eda3085836129e7565b6040805182815290516001600160a01b038616917fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e919081900360200190a291505b50919050565b6040518060400160405280600c81526020017f50617273697120546f6b656e000000000000000000000000000000000000000081525081565b6000610f68338484612ab4565b5060015b92915050565b610f7a611dd1565b610fb9576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b610fc281612ba0565b50565b600a54600090600160a81b900460ff1615156001146110155760405162461bcd60e51b81526004018080602001828103825260298152602001806136176029913960400191505060405180910390fd5b846001600160a01b03811630141561105e5760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b600a548690600160a01b900460ff1615156001148061108b5750600a546001600160a01b03828116911614155b6110c65760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b6001600160a01b038716611121576040805162461bcd60e51b815260206004820152601c60248201527f5472616e7366657220746f20746865207a65726f206164647265737300000000604482015290519081900360640190fd5b600061113d6000356001600160e01b031916308a8a8a8a612302565b9050600061115a8a61114e84612bec565b9063ffffffff612c3d16565b90506001600160a01b0381166111b7576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b426009541115806111e557506001600160a01b03811660009081526008602052604090205460ff1615156001145b8061120d57506001600160a01b03891660009081526008602052604090205460ff1615156001145b61125e576040805162461bcd60e51b815260206004820152601460248201527f5472616e736665727320617265206c6f636b6564000000000000000000000000604482015290519081900360640190fd5b604080516bffffffffffffffffffffffff19606084901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260079092529190205460ff1615611304576040805162461bcd60e51b815260206004820152601260248201527f4e6f6e636520616c726561647920757365640000000000000000000000000000604482015290519081900360640190fd5b6000818152600760205260409020805460ff19166001179055336001600160a01b038b16141561136757611348828b6113438c8c63ffffffff61284916565b6128a3565b611362828b61135d8c8c63ffffffff61284916565b6129e7565b611393565b611372828b8b6128a3565b61137d828b8b6129e7565b61138882338a6128a3565b61139382338a6129e7565b336001600160a01b03168a6001600160a01b0316836001600160a01b03167fec5a73fd1f178be20c1bca1b406cbf4b5c20d833b66e582fc122fb4baa0fc2a48c8c604051808381526020018281526020019250505060405180910390a45060019a9950505050505050505050565b6003545b90565b336000908152600460205260409020805460ff19166001179055565b600083834260095411158061145657506001600160a01b03821660009081526008602052604090205460ff1615156001145b8061147e57506001600160a01b03811660009081526008602052604090205460ff1615156001145b6114cf576040805162461bcd60e51b815260206004820152601060248201527f5472616e7366657273206c6f636b656400000000000000000000000000000000604482015290519081900360640190fd5b846001600160a01b0381163014156115185760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b600a548690600160a01b900460ff161515600114806115455750600a546001600160a01b03828116911614155b6115805760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b600061158d898989612d2b565b905080156115a0576115a08989896129e7565b98975050505050505050565b6115b4611dd1565b6115f3576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b610fc281612d7d565b601281565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610f6891859061163d908663ffffffff61284916565b612ab4565b6000815183511461169a576040805162461bcd60e51b815260206004820152601960248201527f41727261792073697a6573206d75737420626520657175616c00000000000000604482015290519081900360640190fd5b825160005b818110156116e0576116d78582815181106116b657fe5b60200260200101518583815181106116ca57fe5b602002602001015161217c565b5060010161169f565b506001949350505050565b600a546001600160a01b0316331461174a576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206275726e416464726573732063616e206275726e20746f6b656e73604482015290519081900360640190fd5b610fc23382612dc6565b60006117776117628361178f565b61176b846118b5565b9063ffffffff61284916565b90505b919050565b600a54600160a01b900460ff1681565b6001600160a01b0381166000908152600660205260408120611777906117b490612ea1565b6001600160a01b038416600090815260056020526040902061176b90612ea1565b600a54600160a81b900460ff1681565b6117ed611dd1565b61182c576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b6001600160a01b03831630141561188a576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74207265636f7665722050617273697120746f6b656e7300000000604482015290519081900360640190fd5b611895838383612ef5565b505050565b60046020526000908152604090205460ff1681565b60095481565b6001600160a01b031660009081526001602052604090205490565b6118d8611dd1565b611917576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b61191f612371565b61192761302c565b565b6001600160a01b0381166000908152600560205260408120819061194d90826130ca565b905042600954111561196057905061177a565b6001600160a01b038316600090815260066020526040902060095461198891610ea5916130ca565b9392505050565b611997611dd1565b6119d6576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600a805460ff60a81b1916600160a81b179055565b6119f3611dd1565b611a32576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055565b3360009081526008602052604081205460ff161515600114611acb576040805162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015290519081900360640190fd5b836001600160a01b038116301415611b145760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b4260095411611b545760405162461bcd60e51b81526004018080602001828103825260398152602001806135be6039913960400191505060405180910390fd5b6001600160a01b038516611b995760405162461bcd60e51b81526004018080602001828103825260238152602001806135306023913960400191505060405180910390fd5b60008411611bee576040805162461bcd60e51b815260206004820152601660248201527f56616c7565206d75737420626520706f73697469766500000000000000000000604482015290519081900360640190fd5b6001600160a01b038516600090815260066020908152604080832054600590925290912054606491611c26919063ffffffff61284916565b1115611c79576040805162461bcd60e51b815260206004820152601960248201527f546f6f206d616e79206c6f636b73206f6e206164647265737300000000000000604482015290519081900360640190fd5b611c843330866128a3565b6001600160a01b0385166000818152600660209081526040808320815180830183528881528084018a81528254600181810185559387529585902091516002909602909101948555519301929092558151878152908101869052815133927ffc99ec08db15cb3bcfb24a09ff771dec89a23b9a4dbce684a68e1c84d836501c928290030190a3506001949350505050565b60076020526000908152604090205460ff1681565b610fc233610de2565b611d3b611dd1565b611d7a576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600a805460ff60a81b19169055565b6000546001600160a01b031690565b60066020528160005260406000208181548110611db157fe5b600091825260209091206002909102018054600190910154909250905082565b6000546001600160a01b0316331490565b3360009081526008602052604081205460ff161515600114611e4b576040805162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015290519081900360640190fd5b836001600160a01b038116301415611e945760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b6001600160a01b038516611ed95760405162461bcd60e51b81526004018080602001828103825260238152602001806135306023913960400191505060405180910390fd5b60008411611f2e576040805162461bcd60e51b815260206004820152601660248201527f56616c7565206d75737420626520706f73697469766500000000000000000000604482015290519081900360640190fd5b428311611f82576040805162461bcd60e51b815260206004820152601a60248201527f556e74696c206d757374206265206675747572652076616c7565000000000000604482015290519081900360640190fd5b6001600160a01b038516600090815260066020908152604080832054600590925290912054606491611fba919063ffffffff61284916565b111561200d576040805162461bcd60e51b815260206004820152601960248201527f546f6f206d616e79206c6f636b73206f6e206164647265737300000000000000604482015290519081900360640190fd5b6120183330866128a3565b6001600160a01b0385166000818152600560209081526040808320815180830183528881528084018a81528254600181810185559387529585902091516002909602909101948555519301929092558151878152908101869052815133927f34c966766e471b87b7ce8d0d0358378cf20008a30bbb36246a3413c8a286834e928290030190a3506001949350505050565b604080516001600160e01b03199590951660208087019190915260609490941b6bffffffffffffffffffffffff1916602486015260388501929092526058808501919091528151808503909101815260789093019052815191012090565b6040518060400160405280600381526020017f505251000000000000000000000000000000000000000000000000000000000081525081565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610f6891859061163d908663ffffffff61314216565b60003383426009541115806121ae57506001600160a01b03821660009081526008602052604090205460ff1615156001145b806121d657506001600160a01b03811660009081526008602052604090205460ff1615156001145b612227576040805162461bcd60e51b815260206004820152601060248201527f5472616e7366657273206c6f636b656400000000000000000000000000000000604482015290519081900360640190fd5b846001600160a01b0381163014156122705760405162461bcd60e51b81526004018080602001828103825260218152602001806136866021913960400191505060405180910390fd5b600a548690600160a01b900460ff1615156001148061229d5750600a546001600160a01b03828116911614155b6122d85760405162461bcd60e51b815260040180806020018281038252603f8152602001806136cb603f913960400191505060405180910390fd5b60006122e4888861319f565b905080156122f7576122f73389896129e7565b979650505050505050565b604080516001600160e01b0319979097166020808901919091526bffffffffffffffffffffffff19606097881b811660248a01529590961b9094166038870152604c860192909252606c850152608c808501919091528151808503909101815260ac9093019052815191012090565b61192733612d7d565b60086020526000908152604090205460ff1681565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600a546001600160a01b031681565b336000908152600460205260409020805460ff19169055565b60056020528160005260406000208181548110611db157fe5b612403611dd1565b612442576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b61245261244d611d89565b612d7d565b610fb9816131ac565b612463611dd1565b6124a2576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600954600019146124fa576040805162461bcd60e51b815260206004820152601a60248201527f5472616e736665727320616c726561647920756e6c6f636b6564000000000000604482015290519081900360640190fd5b428110156125395760405162461bcd60e51b81526004018080602001828103825260238152602001806135536023913960400191505060405180910390fd5b600955565b600a54600090600160a81b900460ff16151560011461258e5760405162461bcd60e51b81526004018080602001828103825260298152602001806136176029913960400191505060405180910390fd5b60006125a86000356001600160e01b0319163086866120a9565b905060006125b98661114e84612bec565b90506001600160a01b038116612616576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b604080516bffffffffffffffffffffffff19606084901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260079092529190205460ff16156126bc576040805162461bcd60e51b815260206004820152601260248201527f4e6f6e636520616c726561647920757365640000000000000000000000000000604482015290519081900360640190fd5b6000818152600760205260408120805460ff191660011790556126de83610de2565b9050868111612734576040805162461bcd60e51b815260206004820152601160248201527f546f6f20736d616c6c2072656c65617365000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038316331461275a5761274f8333896128a3565b61275a8333896129e7565b506001979650505050505050565b81546000908190805b801561283357808060019003915050600086828154811061278e57fe5b90600052602060002090600202019050426127b682600001548861284990919063ffffffff16565b11156127c25750612771565b60018101546127d890859063ffffffff61284916565b93506000199092019181831461282d578683815481106127f457fe5b906000526020600020906002020187838154811061280e57fe5b6000918252602090912082546002909202019081556001918201549101555b50612771565b8161283e87826134e7565b509195945050505050565b600082820183811015611988576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166128e85760405162461bcd60e51b81526004018080602001828103825260258152602001806136616025913960400191505060405180910390fd5b6001600160a01b03821661292d5760405162461bcd60e51b81526004018080602001828103825260238152602001806135306023913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054612956908263ffffffff61314216565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461298b908263ffffffff61284916565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6129f9826001600160a01b03166131fc565b612a0257611895565b6001600160a01b03821660009081526004602052604090205460ff16612a2757611895565b604080517f29e9a3b90000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528416602482018190526044820184905291516329e9a3b99160648082019260009290919082900301818387803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b50505050505050565b6001600160a01b038316612af95760405162461bcd60e51b81526004018080602001828103825260248152602001806136a76024913960400191505060405180910390fd5b6001600160a01b038216612b3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061359c6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f9190a250565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114612c5057506000610f6c565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612c965760009350505050610f6c565b8060ff16601b14158015612cae57508060ff16601c14155b15612cbf5760009350505050610f6c565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015612d16573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000612d388484846128a3565b6001600160a01b038416600090815260026020908152604080832033808552925290912054612d7391869161163d908663ffffffff61314216565b5060019392505050565b6001600160a01b038116600081815260086020526040808220805460ff19169055517f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b69190a250565b6001600160a01b038216612e0b5760405162461bcd60e51b81526004018080602001828103825260218152602001806136406021913960400191505060405180910390fd5b600354612e1e908263ffffffff61314216565b6003556001600160a01b038216600090815260016020526040902054612e4a908263ffffffff61314216565b6001600160a01b0383166000818152600160209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b80546000908190815b81811015612eec57612ee2858281548110612ec157fe5b9060005260206000209060020201600101548461284990919063ffffffff16565b9250600101612eaa565b50909392505050565b612efd611dd1565b612f3c576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015612f9f57600080fd5b505afa158015612fb3573d6000803e3d6000fd5b505050506040513d6020811015612fc957600080fd5b505190508181101561300c5760405162461bcd60e51b815260040180806020018281038252602b815260200180613734602b913960400191505060405180910390fd5b6130266001600160a01b038516848463ffffffff61320216565b50505050565b613034611dd1565b613073576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b81546000908190815b818110156131385760008682815481106130e957fe5b906000526020600020906002020190504261311182600001548861284990919063ffffffff16565b1161312f57600181015461312c90859063ffffffff61284916565b93505b506001016130d3565b5090949350505050565b600082821115613199576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000610f683384846128a3565b6131b4611dd1565b6131f3576040805162461bcd60e51b815260206004820181905260248201526000805160206135f7833981519152604482015290519081900360640190fd5b610fc281613282565b3b151590565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261189590849061332f565b6001600160a01b0381166132c75760405162461bcd60e51b81526004018080602001828103825260268152602001806135766026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b613341826001600160a01b03166131fc565b613392576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106133d05780518252601f1990920191602091820191016133b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613432576040519150601f19603f3d011682016040523d82523d6000602084013e613437565b606091505b50915091508161348e576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613026578080602001905160208110156134aa57600080fd5b50516130265760405162461bcd60e51b815260040180806020018281038252602a81526020018061370a602a913960400191505060405180910390fd5b81548183558181111561189557600083815260209020611895916114059160029182028101918502015b8082111561352b5760008082556001820155600201613511565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735472616e7366657220756e6c6f636b206d757374206e6f7420626520696e20706173744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737352656c6174697665206c6f636b73206172652064697361626c65642e20557365207472616e736665724c6f636b6564282920696e73746561644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245746865726c657373207472616e736665722066756e6374696f6e616c6974792064697361626c656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737343616e6e6f74207472616e7366657220746f20746f6b656e20636f6e747261637445524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e6e6f74207472616e7366657220746f206275726e657220616464726573732c20756e74696c206275726e696e67206973206e6f7420656e61626c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564476976656e20616d6f756e74206973206c6172676572207468616e2063757272656e742062616c616e6365a265627a7a723158204850bd1a31aa43206b6b736c9621d61fd68a7148ef6f125792205d8032b65b4d64736f6c634300050b0032

Deployed Bytecode Sourcemap

26544:15239:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29578:20;29587:10;29578:8;:20::i;:::-;-1:-1:-1;29613:9:0;:13;29609:76;;29643:30;;:10;;29663:9;29643:30;;;;;;;;;29663:9;29643:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29643:30:0;29609:76;26544:15239;26836:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26836:44:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26836:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13555:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13555:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13555:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30083:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30083:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30083:103:0;-1:-1:-1;;;;;30083:103:0;;:::i;35308:1453::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35308:1453:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;35308:1453:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;35308:1453:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35308:1453:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;35308:1453:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35308:1453:0;;-1:-1:-1;;;;;;;35308:1453:0;;;;-1:-1:-1;;;35308:1453:0;;;;;;;;;;;;;;:::i;12578:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12578:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;29700:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29700:71:0;;;:::i;31375:388::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31375:388:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31375:388:0;;;;;;;;;;;;;;;;;:::i;30194:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30194:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30194:109:0;-1:-1:-1;;;;;30194:109:0;;:::i;26931:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26931:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14839:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14839:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14839:206:0;;;;;;;;:::i;31867:320::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31867:320:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31867:320:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31867:320:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31867:320:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31867:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31867:320:0;;;;;;;;-1:-1:-1;31867:320:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;31867:320:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31867:320:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31867:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31867:320:0;;-1:-1:-1;31867:320:0;;-1:-1:-1;;;;;31867:320:0:i;34633:90::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34633:90:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34633:90:0;;:::i;34371:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34371:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34371:133:0;-1:-1:-1;;;;;34371:133:0;;:::i;27365:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27365:26:0;;;:::i;33866:186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33866:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33866:186:0;-1:-1:-1;;;;;33866:186:0;;:::i;27398:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27398:43:0;;;:::i;39055:223::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39055:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39055:223:0;;;;;;;;;;;;;;;;;:::i;26982:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26982:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26982:38:0;-1:-1:-1;;;;;26982:38:0;;:::i;27241:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27241:48:0;;;:::i;12732:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12732:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12732:110:0;-1:-1:-1;;;;;12732:110:0;;:::i;30602:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30602:122:0;;;:::i;34064:299::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34064:299:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34064:299:0;-1:-1:-1;;;;;34064:299:0;;:::i;29861:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29861:102:0;;;:::i;34731:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34731:82:0;;;:::i;33029:756::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33029:756:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33029:756:0;;;;;;;;;;;;;:::i;27143:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27143:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27143:41:0;;:::i;33793:65::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33793:65:0;;;:::i;29971:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29971:104:0;;;:::i;23552:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23552:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;23552:79:0;;;;;;;;;;;;;;27081:55;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27081:55:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27081:55:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23918:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23918:92:0;;;:::i;32195:678::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32195:678:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32195:678:0;;;;;;;;;;;;;:::i;38764:283::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38764:283:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;;38764:283:0;;;;-1:-1:-1;;;;;38764:283:0;;;;;;;;;;;;;;;:::i;26887:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26887:37:0;;;:::i;15548:216::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15548:216:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15548:216:0;;;;;;;;:::i;30995:372::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30995:372:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30995:372:0;;;;;;;;:::i;37200:336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37200:336:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;;37200:336:0;;;;-1:-1:-1;;;;;37200:336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30311:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30311:87:0;;;:::i;27191:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27191:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27191:43:0;-1:-1:-1;;;;;27191:43:0;;:::i;13274:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13274:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13274:134:0;;;;;;;;;;:::i;27330:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27330:28:0;;;:::i;29779:74::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29779:74:0;;;:::i;27027:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27027:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27027:47:0;;;;;;;;:::i;30406:188::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30406:188:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30406:188:0;-1:-1:-1;;;;;30406:188:0;;:::i;30732:255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30732:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30732:255:0;;:::i;37544:921::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37544:921:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37544:921:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37544:921:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37544:921:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;37544:921:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37544:921:0;;-1:-1:-1;;37544:921:0;;;-1:-1:-1;;;37544:921:0;;;;:::i;39286:580::-;39402:7;39371:11;28990:14;;;;;;;;;;;:22;;29008:4;28990:22;;;:51;;;-1:-1:-1;29028:13:0;;-1:-1:-1;;;;;29016:25:0;;;29028:13;;29016:25;;28990:51;28982:127;;;;-1:-1:-1;;;28982:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39453:22:0;;39422:14;39453:22;;;:9;:22;;;;;39439:40;;39422:14;39439:13;:40::i;:::-;39422:57;;39517:3;39494:19;;:26;39490:146;;-1:-1:-1;;;;;39571:30:0;;;;;;:17;:30;;;;;39603:19;;39546:78;;39557:66;;:13;:66::i;:::-;39546:6;;:78;:10;:78;:::i;:::-;39537:87;;39490:146;39652:11;39648:25;;39672:1;39665:8;;;;;39648:25;39684:45;39702:4;39709:11;39722:6;39684:9;:45::i;:::-;39740:49;39762:4;39769:11;39782:6;39740:13;:49::i;:::-;39805:29;;;;;;;;-1:-1:-1;;;;;39805:29:0;;;;;;;;;;;;;39852:6;-1:-1:-1;29120:1:0;39286:580;;;;:::o;26836:44::-;;;;;;;;;;;;;;;;;;;:::o;13555:148::-;13620:4;13637:36;13646:10;13658:7;13667:5;13637:8;:36::i;:::-;-1:-1:-1;13691:4:0;13555:148;;;;;:::o;30083:103::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;30153:25;30169:8;30153:15;:25::i;:::-;30083:103;:::o;35308:1453::-;28144:24;;35619:4;;-1:-1:-1;;;28144:24:0;;;;:32;;28172:4;28144:32;28136:86;;;;-1:-1:-1;;;28136:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35554:3;-1:-1:-1;;;;;28825:25:0;;28845:4;28825:25;;28817:71;;;;-1:-1:-1;;;28817:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28990:14;;35596:3;;-1:-1:-1;;;28990:14:0;;;;:22;;29008:4;28990:22;;:51;;-1:-1:-1;29028:13:0;;-1:-1:-1;;;;;29016:25:0;;;29028:13;;29016:25;;28990:51;28982:127;;;;-1:-1:-1;;;28982:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35649:17:0;;35641:58;;;;;-1:-1:-1;;;35641:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35712:20;35735:62;35747:7;;-1:-1:-1;;;;;;35747:7:0;35764:4;35771:3;35776:6;35784:4;35790:6;35735:11;:62::i;:::-;35712:85;;35808:12;35823:57;35869:10;35823:37;:12;:35;:37::i;:::-;:45;:57;:45;:57;:::i;:::-;35808:72;-1:-1:-1;;;;;;35899:18:0;;35891:48;;;;;-1:-1:-1;;;35891:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35997:3;35974:19;;:26;;:68;;;-1:-1:-1;;;;;;36017:17:0;;;;;;:11;:17;;;;;;;;:25;;:17;:25;35974:68;:109;;;-1:-1:-1;;;;;;36059:16:0;;;;;;:11;:16;;;;;;;;:24;;:16;:24;35974:109;35952:156;;;;;-1:-1:-1;;;35952:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36150:36;;;-1:-1:-1;;36150:36:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;36150:36:0;;;;;;36140:47;;;;;;;;;36121:16;36206:19;;;:9;:19;;;;;;;;;:28;36198:59;;;;;-1:-1:-1;;;36198:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36268:19;;;;:9;:19;;;;;:26;;-1:-1:-1;;36268:26:0;36290:4;36268:26;;;36311:10;-1:-1:-1;;;;;36311:17:0;;;36307:353;;;36345:38;36355:4;36361:3;36366:16;:6;36377:4;36366:16;:10;:16;:::i;:::-;36345:9;:38::i;:::-;36398:42;36412:4;36418:3;36423:16;:6;36434:4;36423:16;:10;:16;:::i;:::-;36398:13;:42::i;:::-;36307:353;;;36473:28;36483:4;36489:3;36494:6;36473:9;:28::i;:::-;36516:32;36530:4;36536:3;36541:6;36516:13;:32::i;:::-;36563:33;36573:4;36579:10;36591:4;36563:9;:33::i;:::-;36611:37;36625:4;36631:10;36643:4;36611:13;:37::i;:::-;36706:10;-1:-1:-1;;;;;36677:54:0;36701:3;-1:-1:-1;;;;;36677:54:0;36695:4;-1:-1:-1;;;;;36677:54:0;;36718:6;36726:4;36677:54;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36749:4:0;;35308:1453;-1:-1:-1;;;;;;;;;;35308:1453:0:o;12578:91::-;12649:12;;12578:91;;:::o;29700:71::-;29745:10;29738:18;;;;:6;:18;;;;;:25;;-1:-1:-1;;29738:25:0;29759:4;29738:25;;;29700:71::o;31375:388::-;31578:4;31480;31486:2;28504:3;28481:19;;:26;;:68;;;-1:-1:-1;;;;;;28524:17:0;;;;;;:11;:17;;;;;;;;:25;;:17;:25;28481:68;:108;;;-1:-1:-1;;;;;;28566:15:0;;;;;;:11;:15;;;;;;;;:23;;:15;:23;28481:108;28459:151;;;;;-1:-1:-1;;;28459:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31515:2;-1:-1:-1;;;;;28825:25:0;;28845:4;28825:25;;28817:71;;;;-1:-1:-1;;;28817:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28990:14;;31556:2;;-1:-1:-1;;;28990:14:0;;;;:22;;29008:4;28990:22;;:51;;-1:-1:-1;29028:13:0;;-1:-1:-1;;;;;29016:25:0;;;29028:13;;29016:25;;28990:51;28982:127;;;;-1:-1:-1;;;28982:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31600:12;31615:35;31634:4;31640:2;31644:5;31615:18;:35::i;:::-;31600:50;;31665:7;31661:70;;;31689:30;31703:4;31709:2;31713:5;31689:13;:30::i;:::-;31748:7;31375:388;-1:-1:-1;;;;;;;;31375:388:0:o;30194:109::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;30267:28;30286:8;30267:18;:28::i;26931:42::-;26970:2;26931:42;:::o;14839:206::-;14945:10;14919:4;14966:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;14966:32:0;;;;;;;;;;14919:4;;14936:79;;14957:7;;14966:48;;15003:10;14966:48;:36;:48;:::i;:::-;14936:8;:79::i;31867:320::-;31951:4;31989:5;:12;31976:2;:9;:25;31968:63;;;;;-1:-1:-1;;;31968:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32054:9;;32042;32074:84;32098:1;32094;:5;32074:84;;;32121:25;32130:2;32133:1;32130:5;;;;;;;;;;;;;;32137;32143:1;32137:8;;;;;;;;;;;;;;32121;:25::i;:::-;-1:-1:-1;32101:3:0;;32074:84;;;-1:-1:-1;32175:4:0;;31867:320;-1:-1:-1;;;;31867:320:0:o;34633:90::-;28309:13;;-1:-1:-1;;;;;28309:13:0;28295:10;:27;28287:72;;;;;-1:-1:-1;;;28287:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34691:24;34697:10;34709:5;34691;:24::i;34371:133::-;34429:7;34456:40;34475:20;34491:3;34475:15;:20::i;:::-;34456:14;34466:3;34456:9;:14::i;:::-;:18;:40;:18;:40;:::i;:::-;34449:47;;34371:133;;;;:::o;27365:26::-;;;-1:-1:-1;;;27365:26:0;;;;;:::o;33866:186::-;-1:-1:-1;;;;;34020:22:0;;33925:7;34020:22;;;:17;:22;;;;;33952:92;;34003:40;;:16;:40::i;:::-;-1:-1:-1;;;;;33969:14:0;;;;;;:9;:14;;;;;33952:32;;:16;:32::i;27398:43::-;;;-1:-1:-1;;;27398:43:0;;;;;:::o;39055:223::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39156:31:0;;39182:4;39156:31;;39148:72;;;;;-1:-1:-1;;;39148:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39231:39;39251:5;39258:2;39263:6;39231:19;:39::i;:::-;39055:223;;;:::o;26982:38::-;;;;;;;;;;;;;;;:::o;27241:48::-;;;;:::o;12732:110::-;-1:-1:-1;;;;;12816:18:0;12789:7;12816:18;;;:9;:18;;;;;;;12732:110::o;30602:122::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;30659:21;:19;:21::i;:::-;30691:25;:23;:25::i;:::-;30602:122::o;34064:299::-;-1:-1:-1;;;;;34185:14:0;;34127:7;34185:14;;;:9;:14;;;;;34127:7;;34164:39;;34127:7;34164:20;:39::i;:::-;34147:56;;34240:3;34218:19;;:25;34214:44;;;34252:6;-1:-1:-1;34245:13:0;;34214:44;-1:-1:-1;;;;;34310:22:0;;;;;;:17;:22;;;;;34334:19;;34278:77;;34289:65;;:20;:65::i;34278:77::-;34271:84;34064:299;-1:-1:-1;;;34064:299:0:o;29861:102::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;29924:24;:31;;-1:-1:-1;;;;29924:31:0;-1:-1:-1;;;29924:31:0;;;29861:102::o;34731:82::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;34784:14;:21;;;;-1:-1:-1;;;34784:21:0;;;34731:82::o;33029:756::-;28696:10;33185:4;28684:23;;;:11;:23;;;;;;;;:31;;:23;:31;28676:59;;;;;-1:-1:-1;;;28676:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33163:2;-1:-1:-1;;;;;28825:25:0;;28845:4;28825:25;;28817:71;;;;-1:-1:-1;;;28817:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33237:3;33215:19;;:25;33207:95;;;;-1:-1:-1;;;33207:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33321:16:0;;33313:64;;;;-1:-1:-1;;;33313:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33404:1;33396:5;:9;33388:44;;;;;-1:-1:-1;;;33388:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33476:21:0;;;;;;:17;:21;;;;;;;;:28;33451:9;:13;;;;;;:20;33509:3;;33451:54;;:20;:54;:24;:54;:::i;:::-;:61;;33443:99;;;;;-1:-1:-1;;;33443:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33555:43;33565:10;33585:4;33592:5;33555:9;:43::i;:::-;-1:-1:-1;;;;;33611:21:0;;;;;;:17;:21;;;;;;;;33638:43;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;33611:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;33700:55;;;;;;;;;;;;;33723:10;;33700:55;;;;;;;;-1:-1:-1;33773:4:0;;33029:756;-1:-1:-1;;;;33029:756:0:o;27143:41::-;;;;;;;;;;;;;;;:::o;33793:65::-;33830:20;33839:10;33830:8;:20::i;29971:104::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;30035:24;:32;;-1:-1:-1;;;;30035:32:0;;;29971:104::o;23552:79::-;23590:7;23617:6;-1:-1:-1;;;;;23617:6:0;23552:79;:::o;27081:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27081:55:0;-1:-1:-1;27081:55:0;:::o;23918:92::-;23958:4;23996:6;-1:-1:-1;;;;;23996:6:0;23982:10;:20;;23918:92::o;32195:678::-;28696:10;32340:4;28684:23;;;:11;:23;;;;;;;;:31;;:23;:31;28676:59;;;;;-1:-1:-1;;;28676:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32318:2;-1:-1:-1;;;;;28825:25:0;;28845:4;28825:25;;28817:71;;;;-1:-1:-1;;;28817:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32370:16:0;;32362:64;;;;-1:-1:-1;;;32362:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32453:1;32445:5;:9;32437:44;;;;;-1:-1:-1;;;32437:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32508:3;32500:5;:11;32492:50;;;;;-1:-1:-1;;;32492:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32586:21:0;;;;;;:17;:21;;;;;;;;:28;32561:9;:13;;;;;;:20;32619:3;;32561:54;;:20;:54;:24;:54;:::i;:::-;:61;;32553:99;;;;;-1:-1:-1;;;32553:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32665:43;32675:10;32695:4;32702:5;32665:9;:43::i;:::-;-1:-1:-1;;;;;32721:13:0;;;;;;:9;:13;;;;;;;;32740:40;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;32721:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;32799:44;;;;;;;;;;;;;32814:10;;32799:44;;;;;;;;-1:-1:-1;32861:4:0;;32195:678;-1:-1:-1;;;;32195:678:0:o;38764:283::-;38989:49;;;-1:-1:-1;;;;;;38989:49:0;;;;;;;;;;;;;;;;;-1:-1:-1;;38989:49:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;38989::0;;;;;;38979:60;;;;;;38764:283::o;26887:37::-;;;;;;;;;;;;;;;;;;;:::o;15548:216::-;15659:10;15633:4;15680:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;15680:32:0;;;;;;;;;;15633:4;;15650:84;;15671:7;;15680:53;;15717:15;15680:53;:36;:53;:::i;30995:372::-;31186:4;31082:10;31094:2;28504:3;28481:19;;:26;;:68;;;-1:-1:-1;;;;;;28524:17:0;;;;;;:11;:17;;;;;;;;:25;;:17;:25;28481:68;:108;;;-1:-1:-1;;;;;;28566:15:0;;;;;;:11;:15;;;;;;;;:23;;:15;:23;28481:108;28459:151;;;;;-1:-1:-1;;;28459:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31123:2;-1:-1:-1;;;;;28825:25:0;;28845:4;28825:25;;28817:71;;;;-1:-1:-1;;;28817:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28990:14;;31164:2;;-1:-1:-1;;;28990:14:0;;;;:22;;29008:4;28990:22;;:51;;-1:-1:-1;29028:13:0;;-1:-1:-1;;;;;29016:25:0;;;29028:13;;29016:25;;28990:51;28982:127;;;;-1:-1:-1;;;28982:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31208:12;31223:25;31238:2;31242:5;31223:14;:25::i;:::-;31208:40;;31263:7;31259:76;;;31287:36;31301:10;31313:2;31317:5;31287:13;:36::i;:::-;31352:7;30995:372;-1:-1:-1;;;;;;;30995:372:0:o;37200:336::-;37465:62;;;-1:-1:-1;;;;;;37465:62:0;;;;;;;;;;;;-1:-1:-1;;37465:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;37465:62:0;;;;;;37455:73;;;;;;37200:336::o;30311:87::-;30360:30;30379:10;30360:18;:30::i;27191:43::-;;;;;;;;;;;;;;;:::o;13274:134::-;-1:-1:-1;;;;;13373:18:0;;;13346:7;13373:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13274:134::o;27330:28::-;;;-1:-1:-1;;;;;27330:28:0;;:::o;29779:74::-;29826:10;29840:5;29819:18;;;:6;:18;;;;;:26;;-1:-1:-1;;29819:26:0;;;29779:74::o;27027:47::-;;;;;;;;;;;;;;;;;;30406:188;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;30479:27;30498:7;:5;:7::i;:::-;30479:18;:27::i;:::-;30517:33;30541:8;30517:23;:33::i;30732:255::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;30807:19;;-1:-1:-1;;30807:34:0;30799:73;;;;;-1:-1:-1;;;30799:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30899:3;30891:4;:11;;30883:59;;;;-1:-1:-1;;;30883:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30953:19;:26;30732:255::o;37544:921::-;28144:24;;37701:4;;-1:-1:-1;;;28144:24:0;;;;:32;;28172:4;28144:32;28136:86;;;;-1:-1:-1;;;28136:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37723:20;37746:56;37765:7;;-1:-1:-1;;;;;;37765:7:0;37782:4;37789;37795:6;37746:18;:56::i;:::-;37723:79;;37813:12;37828:57;37874:10;37828:37;:12;:35;:37::i;:57::-;37813:72;-1:-1:-1;;;;;;37904:18:0;;37896:48;;;;;-1:-1:-1;;;37896:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37986:36;;;-1:-1:-1;;37986:36:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;37986:36:0;;;;;;37976:47;;;;;;;;;37957:16;38042:19;;;:9;:19;;;;;;;;;:28;38034:59;;;;;-1:-1:-1;;;38034:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38104:19;;;;:9;:19;;;;;:26;;-1:-1:-1;;38104:26:0;38126:4;38104:26;;;38162:14;38171:4;38162:8;:14::i;:::-;38143:33;;38206:4;38195:8;:15;38187:45;;;;;-1:-1:-1;;;38187:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38247:18:0;;38255:10;38247:18;38243:193;;38339:33;38349:4;38355:10;38367:4;38339:9;:33::i;:::-;38387:37;38401:4;38407:10;38419:4;38387:13;:37::i;:::-;-1:-1:-1;38453:4:0;;37544:921;-1:-1:-1;;;;;;;37544:921:0:o;39874:628::-;40032:12;;39963:7;;;;40032:12;40087:349;40094:5;;40087:349;;40116:3;;;;;;;;40134:25;40162:5;40168:1;40162:8;;;;;;;;;;;;;;;;;;40134:36;;40224:3;40190:31;40207:8;:13;;;40190:12;:16;;:31;;;;:::i;:::-;:37;40186:51;;;40229:8;;;40186:51;40286:15;;;;40275:27;;:6;;:27;:10;:27;:::i;:::-;40266:36;-1:-1:-1;;;40317:11:0;;;;40347:14;;;40343:82;;40393:5;40399:9;40393:16;;;;;;;;;;;;;;;;;;40382:5;40388:1;40382:8;;;;;;;;;;;;;;;;:27;;:8;;;;;:27;;;;;;;;;;;40343:82;40087:349;;;;40461:9;40446:24;:5;40461:9;40446:24;:::i;:::-;-1:-1:-1;40488:6:0;;39874:628;-1:-1:-1;;;;;39874:628:0:o;876:181::-;934:7;966:5;;;990:6;;;;982:46;;;;;-1:-1:-1;;;982:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16254:429;-1:-1:-1;;;;;16352:20:0;;16344:70;;;;-1:-1:-1;;;16344:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16433:23:0;;16425:71;;;;-1:-1:-1;;;16425:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16529:17:0;;;;;;:9;:17;;;;;;:29;;16551:6;16529:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;16509:17:0;;;;;;;:9;:17;;;;;;:49;;;;16592:20;;;;;;;:32;;16617:6;16592:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;16569:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;16640:35;;;;;;;16569:20;;16640:35;;;;;;;;;;;;;16254:429;;;:::o;41251:225::-;41340:15;:2;-1:-1:-1;;;;;41340:13:0;;:15::i;:::-;41335:29;;41357:7;;41335:29;-1:-1:-1;;;;;41378:10:0;;;;;;:6;:10;;;;;;;;41374:32;;41399:7;;41374:32;41418:50;;;;;;-1:-1:-1;;;;;41418:50:0;;;;;;;:33;;:50;;;;;;;;;;;;;;:33;;:50;;;;;-1:-1:-1;;41418:50:0;;;;;;;;-1:-1:-1;41418:33:0;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;41418:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41418:50:0;;;;41251:225;;;:::o;18350:335::-;-1:-1:-1;;;;;18443:19:0;;18435:68;;;;-1:-1:-1;;;18435:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18522:21:0;;18514:68;;;;-1:-1:-1;;;18514:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18595:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;18646:31;;;;;;;;;;;;;;;;;18350:335;;;:::o;41484:141::-;-1:-1:-1;;;;;41547:21:0;;;;;;:11;:21;;;;;;:28;;-1:-1:-1;;41547:28:0;41571:4;41547:28;;;41591:26;;;41547:21;41591:26;41484:141;:::o;7091:269::-;7293:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7293:58:0;;;;;;;7283:69;;;;;;7091:269::o;4885:1930::-;4963:7;5026:9;:16;5046:2;5026:22;5022:74;;-1:-1:-1;5081:1:0;5065:19;;5022:74;5457:4;5442:20;;5436:27;5503:4;5488:20;;5482:27;5557:4;5542:20;;5536:27;5165:9;5528:36;6487:66;6474:79;;6470:129;;;6585:1;6570:17;;;;;;;6470:129;6615:1;:7;;6620:2;6615:7;;:18;;;;;6626:1;:7;;6631:2;6626:7;;6615:18;6611:68;;;6665:1;6650:17;;;;;;;6611:68;6783:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6783:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;6783:24:0;;-1:-1:-1;;6783:24:0;;;4885:1930;-1:-1:-1;;;;;;;4885:1930:0:o;14174:256::-;14263:4;14280:36;14290:6;14298:9;14309:6;14280:9;:36::i;:::-;-1:-1:-1;;;;;14356:19:0;;;;;;:11;:19;;;;;;;;14344:10;14356:31;;;;;;;;;14327:73;;14336:6;;14356:43;;14392:6;14356:43;:35;:43;:::i;14327:73::-;-1:-1:-1;14418:4:0;14174:256;;;;;:::o;41633:147::-;-1:-1:-1;;;;;41699:21:0;;41723:5;41699:21;;;:11;:21;;;;;;:29;;-1:-1:-1;;41699:29:0;;;41744:28;;;41723:5;41744:28;41633:147;:::o;17604:306::-;-1:-1:-1;;;;;17679:21:0;;17671:67;;;;-1:-1:-1;;;17671:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17766:12;;:23;;17783:5;17766:23;:16;:23;:::i;:::-;17751:12;:38;-1:-1:-1;;;;;17821:18:0;;;;;;:9;:18;;;;;;:29;;17844:5;17821:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;17800:18:0;;;;;;:9;:18;;;;;;;;:50;;;;17866:36;;;;;;;17800:18;;17866:36;;;;;;;;;;;17604:306;;:::o;40510:285::-;40646:12;;40585:7;;;;;40669:95;40693:1;40689;:5;40669:95;;;40725:27;40736:5;40742:1;40736:8;;;;;;;;;;;;;;;;;;:15;;;40725:6;:10;;:27;;;;:::i;:::-;40716:36;-1:-1:-1;40696:3:0;;40669:95;;;-1:-1:-1;40781:6:0;;40510:285;-1:-1:-1;;;40510:285:0:o;25462:274::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;25573:30;;;;;;25597:4;25573:30;;;;;;25555:15;;-1:-1:-1;;;;;25573:15:0;;;;;:30;;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;25573:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25573:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25573:30:0;;-1:-1:-1;25622:17:0;;;;25614:73;;;;-1:-1:-1;;;25614:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25698:30;-1:-1:-1;;;;;25698:18:0;;25717:2;25721:6;25698:30;:18;:30;:::i;:::-;23821:1;25462:274;;;:::o;24363:140::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;24462:1;24446:6;;24425:40;;-1:-1:-1;;;;;24446:6:0;;;;24425:40;;24462:1;;24425:40;24493:1;24476:19;;-1:-1:-1;;24476:19:0;;;24363:140::o;40803:440::-;40965:12;;40904:7;;;;;40988:224;41012:1;41008;:5;40988:224;;;41035:25;41063:5;41069:1;41063:8;;;;;;;;;;;;;;;;;;41035:36;;41125:3;41090:31;41107:8;:13;;;41090:12;:16;;:31;;;;:::i;:::-;:38;41086:115;;41169:15;;;;41158:27;;:6;;:27;:10;:27;:::i;:::-;41149:36;;41086:115;-1:-1:-1;41015:3:0;;40988:224;;;-1:-1:-1;41229:6:0;;40803:440;-1:-1:-1;;;;40803:440:0:o;1332:184::-;1390:7;1423:1;1418;:6;;1410:49;;;;;-1:-1:-1;;;1410:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1482:5:0;;;1332:184::o;13055:156::-;13124:4;13141:40;13151:10;13163:9;13174:6;13141:9;:40::i;24658:109::-;23764:9;:7;:9::i;:::-;23756:54;;;;;-1:-1:-1;;;23756:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23756:54:0;;;;;;;;;;;;;;;24731:28;24750:8;24731:18;:28::i;7898:422::-;8265:20;8304:8;;;7898:422::o;19623:176::-;19732:58;;;-1:-1:-1;;;;;19732:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19732:58:0;;;;;;;;25:18:-1;;61:17;;19732:58:0;182:15:-1;19755:23:0;179:29:-1;160:49;;19706:85:0;;19725:5;;19706:18;:85::i;24873:229::-;-1:-1:-1;;;;;24947:22:0;;24939:73;;;;-1:-1:-1;;;24939:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25049:6;;;25028:38;;-1:-1:-1;;;;;25028:38:0;;;;25049:6;;;25028:38;;;25077:6;:17;;-1:-1:-1;;25077:17:0;-1:-1:-1;;;;;25077:17:0;;;;;;;;;;24873:229::o;21617:1114::-;22221:27;22229:5;-1:-1:-1;;;;;22221:25:0;;:27::i;:::-;22213:71;;;;;-1:-1:-1;;;22213:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22358:12;22372:23;22407:5;-1:-1:-1;;;;;22399:19:0;22419:4;22399:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;22399:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;22357:67:0;;;;22443:7;22435:52;;;;;-1:-1:-1;;;22435:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22504:17;;:21;22500:224;;22646:10;22635:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22635:30:0;22627:85;;;;-1:-1:-1;;;22627:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26544:15239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://a6b1b798ff29936702e0b1193f0812e740a2b289e1b6bd2474dec9e252007b14
Loading...
Loading
[ Download: CSV Export  ]
[ 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.