ETH Price: $2,290.27 (-5.42%)

Token

BlueWhale (BLW)
 

Overview

Max Total Supply

41,340,000 BLW

Holders

11,291

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
0.01003215 BLW

Value
$0.00
0xbf56d4e6fbd57aa0f5b4610afacfe36592d68760
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BlueWhale

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-12
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
/**
 * @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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        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-contracts/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) {
        return div(a, b, "SafeMath: division by zero");
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on 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 Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

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

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

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

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

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

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

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));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    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, "SafeERC20: decreased allowance below zero");
        _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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "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");
        }
    }
}
contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @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(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        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 virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC20Decimals {
    function decimals() external view returns(uint256);
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override 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 virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        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 `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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 virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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 virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        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 virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _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 virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

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

    /**
     * @dev Destroys `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 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This 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 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}



contract BlueWhale is ERC20, Ownable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;
    uint256 constant private BASE = 1e8;

    uint256 constant private DAY1 = 1 days;
    struct UserInfo {
        uint256 amount;
        uint256 pending; 
        uint256 rewardDebt; 
        
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken; 
        uint256 allocPoint;
        uint256 totalamount; 
        uint256 lastRewardBlock; 
        uint256 accBLWPerShare; 
    }

    struct AccountNodeInfo {
        uint256 initAmount;
        uint256 lockedAmount; 
        uint256 lastUnlockTs; 
        uint256 rewardPending;
        uint256 rewardDebt;
    }

    struct NodeInfo {
        uint256 allocPoint;
        uint256 totalamount; 
        uint256 lastRewardBlock; 
        uint256 accBLWPerShare; 
    }

    struct Fund {
        uint256 initFund;
        uint256 Locked;
        uint256 lastReleaseTs;
    }

    bool public init;
    PoolInfo[] public poolInfo;
    NodeInfo public nodeinfo;
    uint256 poolstart = 1606060800;
    uint256 public totalAllocPoint = 0;
    uint256 public teamRewardPerDay;
    uint256 public lastTeamReleaseTs;
    mapping(address => uint256) public Locked; 
    uint256 public nodeRequireAmount; 
    uint256 public nodeStartReleaseTs; 
    uint256 public nodeReleaseDays;
    mapping(uint256 => mapping(address => UserInfo)) public userInfo; 
    mapping(address => AccountNodeInfo) public accountNodeInfo; 
    mapping(address => bool) public accountNodestatus;
    uint256 public startBlock; 
    uint256 public BLWPerBlock; 
    mapping(address => Fund) public funds; 
    address public fundToken; 
    address public TeamHolder;
    uint256 private fundStartTs;
    uint256 private fundFinishTs;
    uint256 private fundStartReleaseTs; 
    uint256 private maxFund;
    uint256 private maxFundPerAccount;
    uint256 public currentLockedFund; 
    uint256 private fundReleaseDays; 
    uint256 private fundPrice;
    // uint256  private ts1023 = 1602518400;
    // uint256  private ts1025 = 1603382400  ;
    event LockFund(address user, uint256 amount);
    event UnlockFund(address user, uint256 amount);
    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event NodeSet(uint256 oldallocPoint, uint256 newallocPoint);
    event Set(uint256 pid, uint256 allocPoint, bool withUpdate);
    event Lock(address user, uint256 amount);
    event unLock(address user, uint256 amount);
    event UnlockNodeBalance(address user, uint256 amount);
    event BatchUpdatePools();
    event ReclaimStakingReward(address user, uint256 amount);

    function getpool() view public returns(PoolInfo[] memory){
        return poolInfo;
    }
    //池子pid有效性检查
    modifier validatePool(uint256 _pid) {
        require(_pid < poolInfo.length, 'not good pid');
        _;
    }
    constructor(address _fundToken, address teamHolder, uint256 teamReleaseTime, uint256 _nodeLockTime, uint256 _BLWPerBlock, uint256 _startBlock) ERC20("BlueWhale", "BLW") public {
        BLWPerBlock = _BLWPerBlock;
        TeamHolder = teamHolder;
        startBlock = _startBlock;
        _mint(address(this), 41340000 * BASE); //total supply 41340000
        _transferlock(teamHolder,4134000* BASE); //10%
        _setupDecimals(8);
        _setupFundParams(_fundToken); 
        _setupTeamParams(4134000* BASE, teamReleaseTime);
        _setupNodeParams(_nodeLockTime);

    }
    
    function _setupTeamParams(uint256 lockAmount, uint256 startTime) internal {
        teamRewardPerDay = lockAmount / 365 / 4;
        lastTeamReleaseTs = startTime;
    }
    
    function _setupFundParams(address _fundToken) internal {
        maxFund = 2000000 * BASE;
        maxFundPerAccount = 500 * BASE;
        IERC20Decimals erc20 = IERC20Decimals(_fundToken);
        fundToken = _fundToken;
        fundPrice = 17000 * 1e4 * (10 ** (erc20.decimals())) / BASE; // 1e8 based
        fundStartTs = 1602518400;
        fundFinishTs = 1603468800;
        fundStartReleaseTs = 1605801600;
        fundReleaseDays = 90;
    }

    function _setupNodeParams(uint256 _nodeLockTime) internal {
        nodeinfo.lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        nodeRequireAmount = 5000 * BASE; 
        nodeStartReleaseTs = _nodeLockTime + 90 days; //node release time
        nodeReleaseDays = 90; //node release cycle
    }

    function setNodeInfo(uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            batchUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(nodeinfo.allocPoint).add(_allocPoint);
        emit NodeSet(nodeinfo.allocPoint, _allocPoint);
        nodeinfo.allocPoint = _allocPoint;

    }

    function updateFundParams(uint256 _fundStartAt, uint256 _fundFinishAt, uint256 _fundStartReleaseTs,
        uint256 _maxFund, uint256 _maxFundPerAccount, uint256 _fundPrice, uint32 _fundReleaseDays) public onlyOwner {
        fundStartTs = _fundStartAt;
        fundFinishTs = _fundFinishAt;
        fundStartReleaseTs = _fundStartReleaseTs;
        maxFund = _maxFund;
        maxFundPerAccount = _maxFundPerAccount;
        fundPrice = _fundPrice;
        fundReleaseDays = _fundReleaseDays;
    }
    function getFundParams() public view returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        return (fundStartTs, fundFinishTs, fundStartReleaseTs, maxFund,
            maxFundPerAccount, currentLockedFund, fundReleaseDays, fundPrice, poolstart);
    }
    function _teamTransfer(address sender, address recipient, uint256 amount) internal {
        uint256 _amount = balanceOf(sender).sub(Locked[sender]);
        require(_amount >= amount);
        if (accountNodestatus[recipient]) { 
            updateNodeReward(); 
            accountNodeInfo[recipient].rewardPending = accountNodeInfo[recipient].rewardPending.add(accountNodeInfo[recipient].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18).sub(accountNodeInfo[recipient].rewardDebt));              
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            nodeinfo.totalamount = nodeinfo.totalamount.add(amount);
            accountNodeInfo[recipient].initAmount = accountNodeInfo[recipient].initAmount.add(amount);
            accountNodeInfo[recipient].rewardDebt = accountNodeInfo[recipient].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
        }else{ 
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
        }
    }
    function _fromNodeTransfer(address sender, address recipient, uint256 amount) internal {
        updateNodeReward();
        uint256 _amount = balanceOf(sender).sub(accountNodeInfo[sender].lockedAmount); 
        require(_amount >= amount);
        if (accountNodestatus[recipient]){
            accountNodeInfo[sender].rewardPending = accountNodeInfo[sender].rewardPending.add(accountNodeInfo[sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18).sub(accountNodeInfo[sender].rewardDebt));
            accountNodeInfo[recipient].rewardPending = accountNodeInfo[recipient].rewardPending.add(accountNodeInfo[recipient].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18).sub(accountNodeInfo[recipient].rewardDebt));              
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            accountNodeInfo[recipient].initAmount = accountNodeInfo[recipient].initAmount.add(amount);
            accountNodeInfo[recipient].rewardDebt = accountNodeInfo[recipient].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
            accountNodeInfo[sender].initAmount = accountNodeInfo[sender].initAmount.sub(amount);
            accountNodeInfo[sender].rewardDebt = accountNodeInfo[sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
            if (accountNodeInfo[sender].initAmount < 5000 * BASE) {
                accountNodestatus[sender] = false;
                nodeinfo.totalamount = nodeinfo.totalamount.sub(accountNodeInfo[sender].initAmount);
                accountNodeInfo[sender].initAmount = 0;
                accountNodeInfo[sender].rewardDebt = accountNodeInfo[sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
            }
        }else{
            accountNodeInfo[sender].rewardPending = accountNodeInfo[sender].rewardPending.add(accountNodeInfo[sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18).sub(accountNodeInfo[sender].rewardDebt));
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            nodeinfo.totalamount = nodeinfo.totalamount.sub(amount);
            accountNodeInfo[sender].initAmount = accountNodeInfo[sender].initAmount.sub(amount);
            accountNodeInfo[sender].rewardDebt = accountNodeInfo[sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
            if (accountNodeInfo[sender].initAmount < 5000 * BASE) {
                accountNodestatus[sender] = false;
                nodeinfo.totalamount = nodeinfo.totalamount.sub(accountNodeInfo[sender].initAmount);
                accountNodeInfo[sender].initAmount = 0;
                accountNodeInfo[sender].rewardDebt = accountNodeInfo[sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
            }
        }
    }
    function _toNodeTransfer(address sender, address recipient, uint256 amount) internal {
            updateNodeReward();
            accountNodeInfo[recipient].rewardPending = accountNodeInfo[recipient].rewardPending.add(accountNodeInfo[recipient].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18).sub(accountNodeInfo[recipient].rewardDebt));             
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            nodeinfo.totalamount = nodeinfo.totalamount.add(amount);
            accountNodeInfo[recipient].initAmount = accountNodeInfo[recipient].initAmount.add(amount);
            accountNodeInfo[recipient].rewardDebt = accountNodeInfo[recipient].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual override{
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        if (sender == TeamHolder) { 
            _teamTransfer(sender, recipient, amount);
            emit Transfer(sender, recipient, amount);
            return; 
        }
        if (accountNodestatus[sender]) {
            _fromNodeTransfer(sender, recipient, amount);
            emit Transfer(sender, recipient, amount);
            return;

        }
        if (accountNodestatus[recipient]) { 
            _toNodeTransfer(sender, recipient, amount);
            emit Transfer(sender, recipient, amount);
            return;
        }
     
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);

        emit Transfer(sender, recipient, amount);
        
    }

    function _transferlock(address _TeamHolder, uint256 amount) internal {
        _transfer(address(this), _TeamHolder, amount); // 
        Locked[_TeamHolder] = amount;
        emit Lock(_TeamHolder, amount);
    }

    function unlockTeam() public onlyOwner {
        _unlockTeam();
    }

    function _unlockTeam() internal {
        uint256 _amount = getAvailableTeamReward();
        Locked[TeamHolder] = Locked[TeamHolder].sub(_amount);
        lastTeamReleaseTs = block.timestamp;
        emit unLock(TeamHolder, _amount);
    }

    function getAvailableTeamReward() public view returns (uint256)  {
        if(block.timestamp <= lastTeamReleaseTs) {
            return 0;
        }

        uint256 _days = (block.timestamp - lastTeamReleaseTs) / 1 days;
        if(_days > 0) {
            uint256 _releaseByDay = _days * teamRewardPerDay;
            return Locked[TeamHolder] > _releaseByDay ? _releaseByDay : Locked[TeamHolder];
        }
        return 0;
    }

    //add node
    function addNodeAdmin(address account) public {
        require(msg.sender == TeamHolder, "Team only");
        require(account != address(this));
        require(account != TeamHolder);
        require(!accountNodestatus[account]);
        require(accountNodeInfo[account].lockedAmount == 0, "There are unreleased tokens");
        safeBLWTransfer(account, nodeRequireAmount);
        accountNodestatus[account] = true;
        accountNodeInfo[account].initAmount = balanceOf(account);
        accountNodeInfo[account].lockedAmount = nodeRequireAmount;
        accountNodeInfo[account].lastUnlockTs = block.timestamp > nodeStartReleaseTs ? block.timestamp : nodeStartReleaseTs;
        accountNodeInfo[account].rewardPending = 0;
        accountNodeInfo[account].rewardDebt = accountNodeInfo[account].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
        nodeinfo.totalamount = nodeinfo.totalamount.add(balanceOf(account));

    }

    function unlockNodeAmount() public {
        require(block.timestamp >= nodeStartReleaseTs, "");
        uint256 _amount = getAvailableNodeAmount(msg.sender);
        require(_amount > 0, "no available fund");
        accountNodeInfo[msg.sender].lockedAmount = accountNodeInfo[msg.sender].lockedAmount.sub(_amount);
        accountNodeInfo[msg.sender].lastUnlockTs = block.timestamp;

        emit UnlockNodeBalance(msg.sender, _amount);
    }

    function getAvailableNodeAmount(address account) public view returns (uint256) {
        if(accountNodeInfo[account].lockedAmount == 0) {
            return 0;
        }

        if(block.timestamp <= nodeStartReleaseTs || block.timestamp <= accountNodeInfo[account].lastUnlockTs) {
            return 0;
        }

        uint256 _last_ts = nodeStartReleaseTs > accountNodeInfo[account].lastUnlockTs ? nodeStartReleaseTs : accountNodeInfo[account].lastUnlockTs;
        uint256 _days = (block.timestamp - _last_ts) / DAY1;

        if(_days > 0) {
            uint256 _releaseByDay = nodeRequireAmount.mul(_days).div(nodeReleaseDays);
            return accountNodeInfo[account].lockedAmount > _releaseByDay ? _releaseByDay : accountNodeInfo[account].lockedAmount;
        }
        return 0;
    }

    //update node reward
    function updateNodeReward() internal {
        if (block.number <= nodeinfo.lastRewardBlock) {
            return;
        }
        if (nodeinfo.totalamount == 0) {
            nodeinfo.lastRewardBlock = block.number;
            return;
        }

        uint256 multiplier = getMultiplier(nodeinfo.lastRewardBlock, block.number);
        uint256 BLWReward = multiplier
            .mul(BLWPerBlock)
            .mul(nodeinfo.allocPoint)
            .div(totalAllocPoint);
        
        
        nodeinfo.accBLWPerShare = nodeinfo.accBLWPerShare.add(BLWReward.mul(1e18).div(nodeinfo.totalamount));

        nodeinfo.lastRewardBlock = block.number;  
    }
    // query node reward
    function getNodeReward() public view returns(uint256) {
        uint256 accBLWPerShare = nodeinfo.accBLWPerShare;
        uint256 lpSupply = nodeinfo.totalamount;
        if (block.number > nodeinfo.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = getMultiplier(
                nodeinfo.lastRewardBlock,
                block.number
            );
            uint256 BLWReward = multiplier
                .mul(BLWPerBlock)
                .mul(nodeinfo.allocPoint)
                .div(totalAllocPoint);
            accBLWPerShare = accBLWPerShare.add(
                BLWReward.mul(1e18).div(lpSupply)
            );
        }

        uint256 Pending = accountNodeInfo[msg.sender].rewardPending.add(accountNodeInfo[msg.sender].initAmount.mul(accBLWPerShare).div(1e18).sub(accountNodeInfo[msg.sender].rewardDebt));
        return Pending;
    }

    //withdraw node reward
    function takeNodeReward() public {
        updateNodeReward();
        uint256 Pending = accountNodeInfo[msg.sender].rewardPending.add(accountNodeInfo[msg.sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18).sub(accountNodeInfo[msg.sender].rewardDebt));
        require(Pending > 0, "no reward");
        accountNodeInfo[msg.sender].rewardPending = 0;
        accountNodeInfo[msg.sender].rewardDebt = accountNodeInfo[msg.sender].initAmount.mul(nodeinfo.accBLWPerShare).div(1e18);
        safeBLWTransfer(msg.sender, Pending);
    }


    function checkRepeatedPool(IERC20 _lpToken) internal view {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            if (poolInfo[pid].lpToken == _lpToken) {
                revert();
            }
        }
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }
    //add pool
    function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
        checkRepeatedPool(_lpToken);

        if (_withUpdate) {
            batchUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(
            PoolInfo({
                lpToken: _lpToken,
                allocPoint: _allocPoint,
                totalamount: 0,
                lastRewardBlock: lastRewardBlock,
                accBLWPerShare: 0
            })
        );
    }


    function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner validatePool(_pid) {
        if (_withUpdate) {
            batchUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
        emit Set(_pid, _allocPoint, _withUpdate);
    }



    function batchUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
        emit BatchUpdatePools();
    }
    function getMultiplier(uint256 _from, uint256 _to) internal pure returns (uint256) {
        return _to.sub(_from);
    
    }
    function pendingBLW(uint256 _pid, address _user)external view validatePool(_pid) returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accBLWPerShare = pool.accBLWPerShare;
        uint256 lpSupply = pool.totalamount;
        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = getMultiplier(
                pool.lastRewardBlock,
                block.number
            );
            uint256 BLWReward = multiplier
                .mul(BLWPerBlock)
                .mul(pool.allocPoint)
                .div(totalAllocPoint);
            accBLWPerShare = accBLWPerShare.add(
                BLWReward.mul(1e18).div(lpSupply)
            );
        }
        return user.pending.add(user.amount.mul(accBLWPerShare).div(1e18)).sub(user.rewardDebt);
    }

    function updatePool(uint256 _pid) public validatePool(_pid) {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }
        uint256 lpSupply = pool.totalamount;
        if (lpSupply == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }
        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 BLWReward = multiplier
            .mul(BLWPerBlock)
            .mul(pool.allocPoint)
            .div(totalAllocPoint);

        pool.accBLWPerShare = pool.accBLWPerShare.add(
            BLWReward.mul(1e18).div(lpSupply)
        );
      
        pool.lastRewardBlock = block.number;

    }
    //deposit
    function deposit(uint256 _pid, uint256 _amount) public validatePool(_pid) payable {
        if (_pid == 0 || _pid == 1) {
            require(block.timestamp >= poolstart, "pool no start");
        }
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accBLWPerShare).div(1e18).sub(user.rewardDebt);
            user.pending = user.pending.add(pending);
        }
        if (address(pool.lpToken) == address(0)) {
            _amount = msg.value;
        } else {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
        }
        pool.totalamount = pool.totalamount.add(_amount);
        user.amount = user.amount.add(_amount);
        user.rewardDebt = user.amount.mul(pool.accBLWPerShare).div(1e18);
        emit Deposit(msg.sender, _pid, _amount);
    }

    function withdraw(uint256 _pid, uint256 _amount) public validatePool(_pid){
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        if (funds[msg.sender].Locked > 0 && _pid == 2){
            _unlockFund();
            require(user.amount.sub(funds[msg.sender].Locked) >= _amount);
        }
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        pool.totalamount = pool.totalamount.sub(_amount);
        uint256 pending = user.amount.mul(pool.accBLWPerShare).div(1e18).sub(user.rewardDebt);
        user.pending = user.pending.add(pending);
        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(pool.accBLWPerShare).div(1e18);
        if (address(pool.lpToken) == address(0)) {
            msg.sender.transfer(_amount);
        } else {
            pool.lpToken.safeTransfer(msg.sender, _amount);
        }
        emit Withdraw(msg.sender, _pid, _amount);
    }

    function reclaimStakingReward(uint256 _pid) public validatePool(_pid) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        uint256 pending = user.pending.add(user.amount.mul(pool.accBLWPerShare).div(1e18).sub(user.rewardDebt));
        if (pending > 0) {
            safeBLWTransfer(msg.sender, pending);
        }
        user.pending = 0;
        user.rewardDebt = user.amount.mul(pool.accBLWPerShare).div(1e18);
        emit ReclaimStakingReward(msg.sender, pending);
    }

    function safeBLWTransfer(address _to, uint256 _amount) internal {
        PoolInfo storage pool = poolInfo[2];
        uint256 BLWBal = balanceOf(address(this)).sub(pool.totalamount);
        if (_amount > BLWBal) {
            _transfer(address(this),_to, BLWBal);
        } else {
            _transfer(address(this), _to, _amount);
        }
    }

    function lockFund(uint256 amount) public {
        require(block.timestamp >= fundStartTs, "wait");
        require(block.timestamp <= fundFinishTs, "it is over");
        currentLockedFund = currentLockedFund.add(amount);
        require(currentLockedFund <= maxFund, "fund end");

        uint256 _fundTokenAmount = getRequireFundToken(amount);
        require(_fundTokenAmount > 0, "amount error");

        uint256 _newAmount = funds[msg.sender].initFund.add(amount);
        require(_newAmount <= maxFundPerAccount, "reach max limit");

        funds[msg.sender].initFund = funds[msg.sender].initFund.add(amount);
        funds[msg.sender].Locked = funds[msg.sender].Locked.add(amount);
        funds[msg.sender].lastReleaseTs = block.timestamp > fundStartReleaseTs ? block.timestamp : fundStartReleaseTs;

        IERC20 erc20 = IERC20(fundToken); 
        erc20.safeTransferFrom(msg.sender, address(this), _fundTokenAmount);
        erc20.safeTransfer(TeamHolder, _fundTokenAmount);
        PoolInfo storage pool = poolInfo[2];
        UserInfo storage user = userInfo[2][msg.sender];
        updatePool(2);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accBLWPerShare).div(1e18).sub(user.rewardDebt);
            safeBLWTransfer(msg.sender, pending);
        }
        pool.totalamount = pool.totalamount.add(amount);
        user.amount = user.amount.add(amount);
        user.rewardDebt = user.amount.mul(pool.accBLWPerShare).div(1e18);
        emit Deposit(msg.sender, 2, amount);
        emit LockFund(msg.sender, amount);
    }

    function getRequireFundToken(uint256 amount) public view returns (uint256) {
        return amount.mul(fundPrice).div(BASE);
    }

    function unlockFund() public {
        uint256 _amount = getAvailableFund(msg.sender);
        withdraw(2,_amount);
    }

    function _unlockFund() internal {
        require(block.timestamp >= fundStartReleaseTs, "wait start");
        uint256 _amount = getAvailableFund(msg.sender);
        require(_amount > 0);
        currentLockedFund = currentLockedFund.sub(_amount); 
        funds[msg.sender].Locked = funds[msg.sender].Locked.sub(_amount);
        funds[msg.sender].lastReleaseTs = block.timestamp; 
    }

    function getAvailableFund(address account) public view returns (uint256) {
        if(funds[account].initFund == 0) {
            return 0;
        }
        if(block.timestamp <= fundStartReleaseTs || block.timestamp < funds[account].lastReleaseTs) {
            return 0;
        }

        uint256 _days = (block.timestamp - funds[account].lastReleaseTs) / DAY1;

        if(_days > 0) {
            uint256 _releaseByDay = funds[account].initFund.mul(_days).div(fundReleaseDays);
            return funds[account].Locked > _releaseByDay ? _releaseByDay : funds[account].Locked;
        }
        return 0;
    }

    receive() external payable {

    }

    function setinit() public onlyOwner {
        init = true;
    }

    //import historical data
    function batchlockFund(address[] memory _to, uint256[] memory _value) onlyOwner public {
        require(!init);
        require(_to.length > 0);
        require(_to.length == _value.length);
        uint256 sum = 0;
        address account;
        uint256 amount;  
        for(uint256 i = 0; i < _to.length; i++){
            amount = _value[i];
            account = _to[i];
            sum = sum.add(amount);    
            funds[account].initFund = amount;
            funds[account].Locked = amount;
            funds[account].lastReleaseTs = fundStartReleaseTs;        
            UserInfo storage user = userInfo[2][account];
            user.amount = user.amount.add(amount);
            emit Deposit(account, 2, amount);
            emit LockFund(account, amount);
        }
        currentLockedFund = currentLockedFund.add(sum);
        require(currentLockedFund <= maxFund, "fund end");
        PoolInfo storage pool = poolInfo[2];
        pool.totalamount = pool.totalamount.add(sum);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_fundToken","type":"address"},{"internalType":"address","name":"teamHolder","type":"address"},{"internalType":"uint256","name":"teamReleaseTime","type":"uint256"},{"internalType":"uint256","name":"_nodeLockTime","type":"uint256"},{"internalType":"uint256","name":"_BLWPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"BatchUpdatePools","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LockFund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldallocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newallocPoint","type":"uint256"}],"name":"NodeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReclaimStakingReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"Set","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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnlockFund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnlockNodeBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unLock","type":"event"},{"inputs":[],"name":"BLWPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Locked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountNodeInfo","outputs":[{"internalType":"uint256","name":"initAmount","type":"uint256"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"lastUnlockTs","type":"uint256"},{"internalType":"uint256","name":"rewardPending","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountNodestatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addNodeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"name":"batchlockFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentLockedFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fundToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"funds","outputs":[{"internalType":"uint256","name":"initFund","type":"uint256"},{"internalType":"uint256","name":"Locked","type":"uint256"},{"internalType":"uint256","name":"lastReleaseTs","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAvailableFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAvailableNodeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableTeamReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundParams","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getRequireFundToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getpool","outputs":[{"components":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalamount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accBLWPerShare","type":"uint256"}],"internalType":"struct BlueWhale.PoolInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"init","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTeamReleaseTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeReleaseDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeRequireAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeStartReleaseTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeinfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalamount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accBLWPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingBLW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalamount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accBLWPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"reclaimStakingReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setNodeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeNodeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamRewardPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockNodeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fundStartAt","type":"uint256"},{"internalType":"uint256","name":"_fundFinishAt","type":"uint256"},{"internalType":"uint256","name":"_fundStartReleaseTs","type":"uint256"},{"internalType":"uint256","name":"_maxFund","type":"uint256"},{"internalType":"uint256","name":"_maxFundPerAccount","type":"uint256"},{"internalType":"uint256","name":"_fundPrice","type":"uint256"},{"internalType":"uint32","name":"_fundReleaseDays","type":"uint32"}],"name":"updateFundParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052635fba8b00600b556000600c553480156200001e57600080fd5b5060405162005d2f38038062005d2f833981016040819052620000419162001506565b60405180604001604052806009815260200168426c75655768616c6560b81b81525060405180604001604052806003815260200162424c5760e81b8152508160039080519060200190620000979291906200146a565b508051620000ad9060049060208401906200146a565b50506005805460ff19166012179055506000620000c9620001ab565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506017829055601a80546001600160a01b0319166001600160a01b03871617905560168190556200015730660eafd9e1806000620001af565b6200016a85660177fc302670006200028a565b620001766008620002f2565b620001818662000308565b62000194660177fc3026700085620003eb565b6200019f83620003fc565b50505050505062001749565b3390565b6001600160a01b038216620001e15760405162461bcd60e51b8152600401620001d890620016f0565b60405180910390fd5b620001ef600083836200042c565b6200020b816002546200043160201b620028281790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200023e9183906200282862000431821b17901c565b6001600160a01b03831660008181526020819052604080822093909355915190919060008051602062005d0f833981519152906200027e90859062001727565b60405180910390a35050565b6200029730838362000462565b6001600160a01b0382166000908152600f602052604090819020829055517f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d42790620002e6908490849062001581565b60405180910390a15050565b6005805460ff191660ff92909216919091179055565b65b5e620f48000601e55640ba43b7400601f55601980546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905183926305f5e10092909163313ce56791600480820192602092909190829003018186803b1580156200037a57600080fd5b505afa1580156200038f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b5919062001568565b600a0a630a21fe800281620003c657fe5b046022555050635f847d80601b55635f92fe00601c55635fb69680601d55605a602155565b600461016d830404600d55600e5550565b60165443116200040f5760165462000411565b435b60095564746a5288006010556276a70001601155605a601255565b505050565b600082820183811015620004595760405162461bcd60e51b8152600401620001d89062001633565b90505b92915050565b6001600160a01b0383166200048b5760405162461bcd60e51b8152600401620001d890620016ab565b6001600160a01b038216620004b45760405162461bcd60e51b8152600401620001d890620015f0565b601a546001600160a01b03848116911614156200051a57620004d883838362000651565b816001600160a01b0316836001600160a01b031660008051602062005d0f833981519152836040516200050c919062001727565b60405180910390a36200042c565b6001600160a01b03831660009081526015602052604090205460ff16156200054957620004d883838362000991565b6001600160a01b03821660009081526015602052604090205460ff16156200057857620004d88383836200100e565b620005c38160405180606001604052806026815260200162005ce9602691396001600160a01b038616600090815260208181526040909120549291906200284d62001224821b17901c565b6001600160a01b038085166000908152602081815260408083209490945591851681529190912054620006019183906200282862000431821b17901c565b6001600160a01b03808416600081815260208190526040908190209390935591519085169060008051602062005d0f833981519152906200064490859062001727565b60405180910390a3505050565b6001600160a01b0383166000908152600f60205260408120546200068e906200067a8662001253565b6200126e60201b620028791790919060201c565b9050818110156200069e57600080fd5b6001600160a01b03831660009081526015602052604090205460ff1615620008e857620006ca620012b8565b6001600160a01b03831660009081526014602090815260409091206004810154600a549154620007619362000731936200067a92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b620013c960201b620028f51790919060201c565b6001600160a01b03851660009081526014602090815260409091206003015491906200282862000431821b17901c565b60146000856001600160a01b03166001600160a01b0316815260200190815260200160002060030181905550620007d88260405180606001604052806026815260200162005ce9602691396001600160a01b038716600090815260208181526040909120549291906200284d62001224821b17901c565b6001600160a01b038086166000908152602081815260408083209490945591861681529190912054620008169184906200282862000431821b17901c565b6001600160a01b038416600090815260208181526040909120919091556008546200084c9184906200282862000431821b17901c565b6008556001600160a01b038316600090815260146020908152604090912054620008819184906200282862000431821b17901c565b6001600160a01b0384166000908152601460209081526040909120829055600a54620008c692670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b0384166000908152601460205260409020600401556200098b565b620009338260405180606001604052806026815260200162005ce9602691396001600160a01b038716600090815260208181526040909120549291906200284d62001224821b17901c565b6001600160a01b038086166000908152602081815260408083209490945591861681529190912054620009719184906200282862000431821b17901c565b6001600160a01b0384166000908152602081905260409020555b50505050565b6200099b620012b8565b6001600160a01b038316600090815260146020526040812060010154620009c7906200067a8662001253565b905081811015620009d757600080fd5b6001600160a01b03831660009081526015602052604090205460ff161562000d7a576001600160a01b03841660009081526014602090815260409091206004810154600a54915462000a7c9362000a4c936200067a92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b03861660009081526014602090815260409091206003015491906200282862000431821b17901c565b6001600160a01b038086166000908152601460209081526040808320600301949094559186168152919091206004810154600a54915462000ae09362000731936200067a92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b60146000856001600160a01b03166001600160a01b031681526020019081526020016000206003018190555062000b578260405180606001604052806026815260200162005ce9602691396001600160a01b038716600090815260208181526040909120549291906200284d62001224821b17901c565b6001600160a01b03808616600090815260208181526040808320949094559186168152919091205462000b959184906200282862000431821b17901c565b6001600160a01b03841660009081526020818152604080832093909355601481529190205462000bd09184906200282862000431821b17901c565b6001600160a01b0384166000908152601460209081526040909120829055600a5462000c1592670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b038085166000908152601460209081526040808320600401949094559187168152919091205462000c58918490620028796200126e821b17901c565b6001600160a01b0385166000908152601460209081526040909120829055600a5462000c9d92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b038516600090815260146020526040902060048101919091555464746a528800111562000d74576001600160a01b0384166000908152601560209081526040808320805460ff19169055601482529091205460085462000d1092909190620028796200126e821b17901c565b6008556001600160a01b03841660009081526014602090815260408220829055600a5462000d5792670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b0385166000908152601460205260409020600401555b6200098b565b6001600160a01b03841660009081526014602090815260409091206004810154600a54915462000dcd9362000a4c936200067a92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b60146000866001600160a01b03166001600160a01b031681526020019081526020016000206003018190555062000e448260405180606001604052806026815260200162005ce9602691396001600160a01b038716600090815260208181526040909120549291906200284d62001224821b17901c565b6001600160a01b03808616600090815260208181526040808320949094559186168152919091205462000e829184906200282862000431821b17901c565b6001600160a01b0384166000908152602081815260409091209190915560085462000eb8918490620028796200126e821b17901c565b6008556001600160a01b03841660009081526014602090815260409091205462000eed918490620028796200126e821b17901c565b6001600160a01b0385166000908152601460209081526040909120829055600a5462000f3292670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b038516600090815260146020526040902060048101919091555464746a52880011156200098b576001600160a01b0384166000908152601560209081526040808320805460ff19169055601482529091205460085462000fa592909190620028796200126e821b17901c565b6008556001600160a01b03841660009081526014602090815260408220829055600a5462000fec92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b03851660009081526014602052604090206004015550505050565b62001018620012b8565b6001600160a01b03821660009081526014602090815260409091206004810154600a5491546200109b936200106b936200067a92670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b03841660009081526014602090815260409091206003015491906200282862000431821b17901c565b60146000846001600160a01b03166001600160a01b0316815260200190815260200160002060030181905550620011128160405180606001604052806026815260200162005ce9602691396001600160a01b038616600090815260208181526040909120549291906200284d62001224821b17901c565b6001600160a01b038085166000908152602081815260408083209490945591851681529190912054620011509183906200282862000431821b17901c565b6001600160a01b03831660009081526020818152604090912091909155600854620011869183906200282862000431821b17901c565b6008556001600160a01b038216600090815260146020908152604090912054620011bb9183906200282862000431821b17901c565b6001600160a01b0383166000908152601460209081526040909120829055600a546200120092670de0b6b3a7640000926200071d9290620028bb62001389821b17901c565b6001600160a01b039092166000908152601460205260409020600401919091555050565b600081848411156200124b5760405162461bcd60e51b8152600401620001d891906200159a565b505050900390565b6001600160a01b031660009081526020819052604090205490565b60006200045983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200122460201b60201c565b6009544311620012c85762001387565b600854620012da574360095562001387565b600954600090620012ec904362001413565b9050600062001331600c546200071d6007600001546200131d601754876200138960201b620028bb1790919060201c565b6200138960201b620028bb1790919060201c565b90506200137d620013636007600101546200071d670de0b6b3a7640000856200138960201b620028bb1790919060201c565b6007600301546200043160201b620028281790919060201c565b600a555050436009555b565b6000826200139a575060006200045c565b82820282848281620013a857fe5b0414620004595760405162461bcd60e51b8152600401620001d8906200166a565b60006200045983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200142f60201b60201c565b60006200045983836200126e60201b620028791790919060201c565b60008183620014535760405162461bcd60e51b8152600401620001d891906200159a565b5060008385816200146057fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620014ad57805160ff1916838001178555620014dd565b82800160010185558215620014dd579182015b82811115620014dd578251825591602001919060010190620014c0565b50620014eb929150620014ef565b5090565b5b80821115620014eb5760008155600101620014f0565b60008060008060008060c087890312156200151f578182fd5b86516200152c8162001730565b60208801519096506200153f8162001730565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b6000602082840312156200157a578081fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6000602080835283518082850152825b81811015620015c857858101830151858201604001528201620015aa565b81811115620015da5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6001600160a01b03811681146200174657600080fd5b50565b61459080620017596000396000f3fe6080604052600436106103905760003560e01c8063715018a6116101dc578063a9059cbb11610102578063e1bd8c03116100a0578063f0ab53b91161006f578063f0ab53b9146109ea578063f2fde38b146109ff578063f5705cd114610a1f578063fcc0364514610a3f57610397565b8063e1bd8c031461098d578063e1c7392a146109a2578063e2ae93fb146109b7578063e2bbb158146109d757610397565b8063cd9ab4a4116100dc578063cd9ab4a414610916578063d379091014610938578063db4e73721461094d578063dd62ed3e1461096d57610397565b8063a9059cbb146108cc578063ab0528a4146108ec578063bd7b9f2a1461090157610397565b80638bc659931161017a5780639656811a116101495780639656811a14610857578063a1cd494414610877578063a1f841d714610897578063a457c2d7146108ac57610397565b80638bc65993146107de5780638da5cb5b146107fe57806393f1a40b1461081357806395d89b411461084257610397565b8063759c6b6c116101b6578063759c6b6c1461075e5780637bfa953a146107735780638277491a146107885780638bc5cb7c146107ad57610397565b8063715018a61461071457806371a6fc361461072957806372040fe81461073e57610397565b8063441a3e70116102c157806351eb05a61161025f57806364482f791161022e57806364482f791461069f57806368cf75fc146106bf5780636bdef009146106d457806370a08231146106f457610397565b806351eb05a6146106405780635c0610ba14610660578063625f075e1461067557806363f1fbe01461068a57610397565b80634c0843741161029b5780634c084374146105d45780634c3cbeac146105f65780635096e81a1461061657806350adcdb71461062b57610397565b8063441a3e701461057f57806344427e301461059f57806348cd4cb1146105bf57610397565b80631eaaa0451161032e578063313ce56711610308578063313ce567146104fd578063395093511461051f5780633ba2a67e1461053f5780634126a6641461055f57610397565b80631eaaa0451461049157806323b872dd146104b35780632ba4eb21146104d357610397565b80630c6bf3bc1161036a5780630c6bf3bc146104165780631526fe271461043657806317caf6f11461046757806318160ddd1461047c57610397565b806306fdde031461039c578063081e3eda146103c7578063095ea7b3146103e957610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610a54565b6040516103be9190613e7d565b60405180910390f35b3480156103d357600080fd5b506103dc610aeb565b6040516103be9190614381565b3480156103f557600080fd5b50610409610404366004613b00565b610af1565b6040516103be9190613e44565b34801561042257600080fd5b506103dc610431366004613c0a565b610b0f565b34801561044257600080fd5b50610456610451366004613c0a565b610b3c565b6040516103be959493929190613e4f565b34801561047357600080fd5b506103dc610b84565b34801561048857600080fd5b506103dc610b8a565b34801561049d57600080fd5b506104b16104ac366004613c6a565b610b90565b005b3480156104bf57600080fd5b506104096104ce366004613ac0565b610d2c565b3480156104df57600080fd5b506104e8610db4565b6040516103be99989796959493929190614404565b34801561050957600080fd5b50610512610dda565b6040516103be9190614443565b34801561052b57600080fd5b5061040961053a366004613b00565b610de3565b34801561054b57600080fd5b506104b161055a366004613c0a565b610e31565b34801561056b57600080fd5b5061040961057a366004613a6c565b61112f565b34801561058b57600080fd5b506104b161059a366004613cab565b611144565b3480156105ab57600080fd5b506103dc6105ba366004613a6c565b61134d565b3480156105cb57600080fd5b506103dc61135f565b3480156105e057600080fd5b506105e9611365565b6040516103be9190613d7c565b34801561060257600080fd5b506104b1610611366004613c46565b611374565b34801561062257600080fd5b506103dc61141b565b34801561063757600080fd5b506105e96114a4565b34801561064c57600080fd5b506104b161065b366004613c0a565b6114b3565b34801561066c57600080fd5b506104b1611597565b34801561068157600080fd5b506103dc611660565b34801561069657600080fd5b506104b1611666565b3480156106ab57600080fd5b506104b16106ba366004613ccc565b611738565b3480156106cb57600080fd5b506104b1611844565b3480156106e057600080fd5b506104b16106ef366004613cf9565b611890565b34801561070057600080fd5b506103dc61070f366004613a6c565b6118f0565b34801561072057600080fd5b506104b161190b565b34801561073557600080fd5b506103dc611995565b34801561074a57600080fd5b506104b1610759366004613c0a565b61199b565b34801561076a57600080fd5b506103dc611aba565b34801561077f57600080fd5b506103dc611ac0565b34801561079457600080fd5b5061079d611ac6565b6040516103be94939291906143c6565b3480156107b957600080fd5b506107cd6107c8366004613a6c565b611ad5565b6040516103be9594939291906143e1565b3480156107ea57600080fd5b506103dc6107f9366004613a6c565b611b04565b34801561080a57600080fd5b506105e9611c42565b34801561081f57600080fd5b5061083361082e366004613c22565b611c56565b6040516103be939291906143b0565b34801561084e57600080fd5b506103b1611c82565b34801561086357600080fd5b506104b1610872366004613b2b565b611ce3565b34801561088357600080fd5b506103dc610892366004613a6c565b611f05565b3480156108a357600080fd5b506104b1612014565b3480156108b857600080fd5b506104096108c7366004613b00565b61202c565b3480156108d857600080fd5b506104096108e7366004613b00565b612094565b3480156108f857600080fd5b506103dc6120a8565b34801561090d57600080fd5b506103dc6120ae565b34801561092257600080fd5b5061092b61216c565b6040516103be9190613dcd565b34801561094457600080fd5b506104b1612200565b34801561095957600080fd5b506104b1610968366004613a6c565b612244565b34801561097957600080fd5b506103dc610988366004613a88565b6123e5565b34801561099957600080fd5b506103dc612410565b3480156109ae57600080fd5b50610409612416565b3480156109c357600080fd5b506108336109d2366004613a6c565b612426565b6104b16109e5366004613cab565b612447565b3480156109f657600080fd5b506103dc6125e5565b348015610a0b57600080fd5b506104b1610a1a366004613a6c565b6125eb565b348015610a2b57600080fd5b506103dc610a3a366004613c22565b6126b2565b348015610a4b57600080fd5b506104b16127d9565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b505050505090505b90565b60065490565b6000610b05610afe612937565b848461293b565b5060015b92915050565b6000610b346305f5e100610b2e602254856128bb90919063ffffffff16565b906128f5565b90505b919050565b60068181548110610b4957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b600c5481565b60025490565b610b98612937565b60055461010090046001600160a01b03908116911614610bd35760405162461bcd60e51b8152600401610bca90614193565b60405180910390fd5b610bdc826129ef565b8015610bea57610bea611844565b60006016544311610bfd57601654610bff565b435b600c54909150610c0f9085612828565b600c556040805160a0810182526001600160a01b039485168152602081019586526000918101828152606082019384526080820183815260068054600181018255945291517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600590940293840180546001600160a01b031916919097161790955594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4082015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41840155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d428301555090517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4390910155565b6000610d39848484612a46565b610da984610d45612937565b610da48560405180606001604052806028815260200161450e602891396001600160a01b038a16600090815260016020526040812090610d83612937565b6001600160a01b03168152602081019190915260400160002054919061284d565b61293b565b5060015b9392505050565b601b54601c54601d54601e54601f54602054602154602254600b54909192939495969798565b60055460ff1690565b6000610b05610df0612937565b84610da48560016000610e01612937565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612828565b601b54421015610e535760405162461bcd60e51b8152600401610bca90614175565b601c54421115610e755760405162461bcd60e51b8152600401610bca90614332565b602054610e829082612828565b6020819055601e541015610ea85760405162461bcd60e51b8152600401610bca90613ef3565b6000610eb382610b0f565b905060008111610ed55760405162461bcd60e51b8152600401610bca906140eb565b33600090815260186020526040812054610eef9084612828565b9050601f54811115610f135760405162461bcd60e51b8152600401610bca906140c2565b33600090815260186020526040902054610f2d9084612828565b33600090815260186020526040902090815560010154610f4d9084612828565b33600090815260186020526040902060010155601d544211610f7157601d54610f73565b425b336000818152601860205260409020600201919091556019546001600160a01b031690610fa39082903086612c19565b601a54610fbd906001600160a01b03838116911685612c77565b60006006600281548110610fcd57fe5b600091825260208083203384527f0b9d2c0c271bb30544eb78c59bdaebdae2728e5f65814c07768a0abe90ed192390915260409092206005909102909101915061101760026114b3565b805415611063576000611055826002015461104f670de0b6b3a7640000610b2e876004015487600001546128bb90919063ffffffff16565b90612879565b90506110613382612c96565b505b60028201546110729087612828565b600283015580546110839087612828565b80825560048301546110a391670de0b6b3a764000091610b2e91906128bb565b81600201819055506002336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15886040516110e69190614381565b60405180910390a37f65bf54ba565d510173656a5b290cde255d14fd6c84a51b68b332f7c248d954a0338760405161111f929190613d90565b60405180910390a1505050505050565b60156020526000908152604090205460ff1681565b600654829081106111675760405162461bcd60e51b8152600401610bca90613ff8565b60006006848154811061117657fe5b60009182526020808320878452601382526040808520338652835280852060189093529093206001015460059092029092019250158015906111b85750846002145b156111f1576111c5612cee565b33600090815260186020526040902060010154815485916111e69190612879565b10156111f157600080fd5b80548411156112125760405162461bcd60e51b8152600401610bca90614299565b61121b856114b3565b600282015461122a9085612879565b82600201819055506000611263826002015461104f670de0b6b3a7640000610b2e876004015487600001546128bb90919063ffffffff16565b60018301549091506112759082612828565b600183015581546112869086612879565b80835560048401546112a691670de0b6b3a764000091610b2e91906128bb565b600283015582546001600160a01b03166112ed57604051339086156108fc029087906000818181858888f193505050501580156112e7573d6000803e3d6000fd5b50611303565b8254611303906001600160a01b03163387612c77565b85336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688760405161133d9190614381565b60405180910390a3505050505050565b600f6020526000908152604090205481565b60165481565b601a546001600160a01b031681565b61137c612937565b60055461010090046001600160a01b039081169116146113ae5760405162461bcd60e51b8152600401610bca90614193565b80156113bc576113bc611844565b600754600c546113d79184916113d191612879565b90612828565b600c556007546040517f11bc6bbe0ffe19f80cf95656cab7bf7beedd1afa2c3837b4c632ecfe97ec84929161140d91859061438a565b60405180910390a150600755565b6000600e54421161142e57506000610ae8565b600062015180600e5442038161144057fe5b049050801561149c57600d54601a546001600160a01b03166000908152600f602052604090205490820290811061149157601a546001600160a01b03166000908152600f6020526040902054611493565b805b92505050610ae8565b600091505090565b6019546001600160a01b031681565b600654819081106114d65760405162461bcd60e51b8152600401610bca90613ff8565b6000600683815481106114e557fe5b90600052602060002090600502019050806003015443116115065750611593565b60028101548061151d575043600390910155611593565b600061152d836003015443612d7a565b9050600061155a600c54610b2e8660010154611554601754876128bb90919063ffffffff16565b906128bb565b905061158061157584610b2e84670de0b6b3a76400006128bb565b600486015490612828565b6004850155505043600390920191909155505b5050565b6011544210156115b95760405162461bcd60e51b8152600401610bca9061420d565b60006115c433611b04565b9050600081116115e65760405162461bcd60e51b8152600401610bca90614356565b336000908152601460205260409020600101546116039082612879565b336000818152601460205260409081902060018101939093554260029093019290925590517f7589c9c982ef4072df7989933bdc82431bb584fe9225a99a7c178b519beee71691611655918490613d90565b60405180910390a150565b60205481565b61166e612d86565b3360009081526014602052604081206004810154600a5491546116c0926116a7929161104f91670de0b6b3a764000091610b2e916128bb565b3360009081526014602052604090206003015490612828565b9050600081116116e25760405162461bcd60e51b8152600401610bca90614111565b3360009081526014602052604081206003810191909155600a54905461171591670de0b6b3a764000091610b2e916128bb565b336000818152601460205260409020600401919091556117359082612c96565b50565b611740612937565b60055461010090046001600160a01b039081169116146117725760405162461bcd60e51b8152600401610bca90614193565b600654839081106117955760405162461bcd60e51b8152600401610bca90613ff8565b81156117a3576117a3611844565b6117da836113d1600687815481106117b757fe5b906000526020600020906005020160010154600c5461287990919063ffffffff16565b600c8190555082600685815481106117ee57fe5b9060005260206000209060050201600101819055507fc66cec52f6fc7c7c09b5f02578bd330a548d6b039f8ba5b5703204565bdb335b84848460405161183693929190614398565b60405180910390a150505050565b60065460005b818110156118635761185b816114b3565b60010161184a565b506040517fcb4425900f1290387f6d2291c34d7dd7551976cee3b4fd9d5585b8252b62449c90600090a150565b611898612937565b60055461010090046001600160a01b039081169116146118ca5760405162461bcd60e51b8152600401610bca90614193565b601b96909655601c94909455601d92909255601e55601f5560225563ffffffff16602155565b6001600160a01b031660009081526020819052604090205490565b611913612937565b60055461010090046001600160a01b039081169116146119455760405162461bcd60e51b8152600401610bca90614193565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600d5481565b600654819081106119be5760405162461bcd60e51b8152600401610bca90613ff8565b6000600683815481106119cd57fe5b600091825260208083208684526013825260408085203386529092529220600590910290910191506119fe846114b3565b6000611a3d611a32836002015461104f670de0b6b3a7640000610b2e886004015488600001546128bb90919063ffffffff16565b600184015490612828565b90508015611a4f57611a4f3382612c96565b6000600183015560048301548254611a7491670de0b6b3a764000091610b2e916128bb565b60028301556040517fc4f631358fe7d4f3f0301cdcc3914b651ae9eb9aace72a4930737f6cde8c704190611aab9033908490613d90565b60405180910390a15050505050565b60115481565b600e5481565b600754600854600954600a5484565b601460205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b6001600160a01b038116600090815260146020526040812060010154611b2c57506000610b37565b60115442111580611b5857506001600160a01b0382166000908152601460205260409020600201544211155b15611b6557506000610b37565b6001600160a01b03821660009081526014602052604081206002015460115411611baa576001600160a01b038316600090815260146020526040902060020154611bae565b6011545b905060006201518082420381611bc057fe5b0490508015611c38576000611be6601254610b2e846010546128bb90919063ffffffff16565b6001600160a01b0386166000908152601460205260409020600101549091508110611c2c576001600160a01b038516600090815260146020526040902060010154611c2e565b805b9350505050610b37565b5060009392505050565b60055461010090046001600160a01b031690565b601360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae05780601f10610ab557610100808354040283529160200191610ae0565b611ceb612937565b60055461010090046001600160a01b03908116911614611d1d5760405162461bcd60e51b8152600401610bca90614193565b600554600160a81b900460ff1615611d3457600080fd5b6000825111611d4257600080fd5b8051825114611d5057600080fd5b6000808060005b8551811015611e8d57848181518110611d6c57fe5b60200260200101519150858181518110611d8257fe5b60200260200101519250611d9f828561282890919063ffffffff16565b6001600160a01b038416600090815260186020908152604080832086815560018101879055601d546002909101557f0b9d2c0c271bb30544eb78c59bdaebdae2728e5f65814c07768a0abe90ed19239091529020805491955090611e039084612828565b81556040516002906001600160a01b038616907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590611e43908790614381565b60405180910390a37f65bf54ba565d510173656a5b290cde255d14fd6c84a51b68b332f7c248d954a08484604051611e7c929190613d90565b60405180910390a150600101611d57565b50602054611e9b9084612828565b6020819055601e541015611ec15760405162461bcd60e51b8152600401610bca90613ef3565b60006006600281548110611ed157fe5b90600052602060002090600502019050611ef884826002015461282890919063ffffffff16565b6002909101555050505050565b6001600160a01b038116600090815260186020526040812054611f2a57506000610b37565b601d5442111580611f5557506001600160a01b03821660009081526018602052604090206002015442105b15611f6257506000610b37565b6001600160a01b03821660009081526018602052604081206002015462015180904203049050801561200b576021546001600160a01b0384166000908152601860205260408120549091611fba91610b2e90856128bb565b6001600160a01b0385166000908152601860205260409020600101549091508110612000576001600160a01b038416600090815260186020526040902060010154612002565b805b92505050610b37565b50600092915050565b600061201f33611f05565b9050611735600282611144565b6000610b05612039612937565b84610da4856040518060600160405280602581526020016145366025913960016000612063612937565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061284d565b6000610b056120a1612937565b8484612a46565b60105481565b600a546008546009546000929190431180156120c957508015155b1561212e5760006120df60076002015443612d7a565b90506000612107600c54610b2e600760000154611554601754876128bb90919063ffffffff16565b905061212961212284610b2e84670de0b6b3a76400006128bb565b8590612828565b935050505b33600090815260146020526040812060048101549054612164916116a79161104f90670de0b6b3a764000090610b2e90896128bb565b935050505090565b60606006805480602002602001604051908101604052809291908181526020016000905b828210156121f75760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101612190565b50505050905090565b612208612937565b60055461010090046001600160a01b0390811691161461223a5760405162461bcd60e51b8152600401610bca90614193565b612242612e11565b565b601a546001600160a01b0316331461226e5760405162461bcd60e51b8152600401610bca906142c5565b6001600160a01b03811630141561228457600080fd5b601a546001600160a01b038281169116141561229f57600080fd5b6001600160a01b03811660009081526015602052604090205460ff16156122c557600080fd5b6001600160a01b038116600090815260146020526040902060010154156122fe5760405162461bcd60e51b8152600401610bca9061408b565b61230a81601054612c96565b6001600160a01b0381166000908152601560205260409020805460ff19166001179055612336816118f0565b6001600160a01b0382166000908152601460205260409020908155601054600190910155601154421161236b5760115461236d565b425b6001600160a01b038216600090815260146020526040812060028101929092556003820155600a5490546123ae91670de0b6b3a764000091610b2e916128bb565b6001600160a01b0382166000908152601460205260409020600401556123df6123d6826118f0565b60085490612828565b60085550565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60175481565b600554600160a81b900460ff1681565b60186020526000908152604090208054600182015460029092015490919083565b6006548290811061246a5760405162461bcd60e51b8152600401610bca90613ff8565b8215806124775750826001145b1561249e57600b5442101561249e5760405162461bcd60e51b8152600401610bca9061401e565b6000600684815481106124ad57fe5b600091825260208083208784526013825260408085203386529092529220600590910290910191506124de856114b3565b80541561252f576000612516826002015461104f670de0b6b3a7640000610b2e876004015487600001546128bb90919063ffffffff16565b60018301549091506125289082612828565b6001830155505b81546001600160a01b03166125465734935061255d565b815461255d906001600160a01b0316333087612c19565b600282015461256c9085612828565b6002830155805461257d9085612828565b808255600483015461259d91670de0b6b3a764000091610b2e91906128bb565b6002820155604051859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15906125d6908890614381565b60405180910390a35050505050565b60125481565b6125f3612937565b60055461010090046001600160a01b039081169116146126255760405162461bcd60e51b8152600401610bca90614193565b6001600160a01b03811661264b5760405162461bcd60e51b8152600401610bca90613f15565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600654600090839081106126d85760405162461bcd60e51b8152600401610bca90613ff8565b6000600685815481106126e757fe5b600091825260208083208884526013825260408085206001600160a01b038a168652909252922060046005909202909201908101546002820154600383015492945090914311801561273857508015155b1561279457600061274d856003015443612d7a565b90506000612774600c54610b2e8860010154611554601754876128bb90919063ffffffff16565b905061278f61212284610b2e84670de0b6b3a76400006128bb565b935050505b6127cd836002015461104f6127c2670de0b6b3a7640000610b2e8789600001546128bb90919063ffffffff16565b600187015490612828565b98975050505050505050565b6127e1612937565b60055461010090046001600160a01b039081169116146128135760405162461bcd60e51b8152600401610bca90614193565b6005805460ff60a81b1916600160a81b179055565b600082820183811015610dad5760405162461bcd60e51b8152600401610bca90613f9d565b600081848411156128715760405162461bcd60e51b8152600401610bca9190613e7d565b505050900390565b6000610dad83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061284d565b6000826128ca57506000610b09565b828202828482816128d757fe5b0414610dad5760405162461bcd60e51b8152600401610bca90614134565b6000610dad83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e9d565b3390565b6001600160a01b0383166129615760405162461bcd60e51b8152600401610bca9061421e565b6001600160a01b0382166129875760405162461bcd60e51b8152600401610bca90613f5b565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906129e2908590614381565b60405180910390a3505050565b60065460005b81811015612a4157826001600160a01b031660068281548110612a1457fe5b60009182526020909120600590910201546001600160a01b03161415612a3957600080fd5b6001016129f5565b505050565b6001600160a01b038316612a6c5760405162461bcd60e51b8152600401610bca906141c8565b6001600160a01b038216612a925760405162461bcd60e51b8152600401610bca90613eb0565b601a546001600160a01b0384811691161415612b0357612ab3838383612ed4565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612af69190614381565b60405180910390a3612a41565b6001600160a01b03831660009081526015602052604090205460ff1615612b2f57612ab383838361315c565b6001600160a01b03821660009081526015602052604090205460ff1615612b5b57612ab38383836136ae565b612b98816040518060600160405280602681526020016144e8602691396001600160a01b038616600090815260208190526040902054919061284d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612bc79082612828565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129e2908590614381565b612c71846323b872dd60e01b858585604051602401612c3a93929190613da9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613858565b50505050565b612a418363a9059cbb60e01b8484604051602401612c3a929190613d90565b60006006600281548110612ca657fe5b906000526020600020906005020190506000612cc9826002015461104f306118f0565b905080831115612ce357612cde308583612a46565b612c71565b612c71308585612a46565b601d54421015612d105760405162461bcd60e51b8152600401610bca90613fd4565b6000612d1b33611f05565b905060008111612d2a57600080fd5b602054612d379082612879565b602090815533600090815260189091526040902060010154612d599082612879565b33600090815260186020526040902060018101919091554260029091015550565b6000610dad8284612879565b6009544311612d9457612242565b600854612da45743600955612242565b6000612db560076002015443612d7a565b90506000612ddd600c54610b2e600760000154611554601754876128bb90919063ffffffff16565b600854909150612e0690612dfd90610b2e84670de0b6b3a76400006128bb565b600a5490612828565b600a55505043600955565b6000612e1b61141b565b601a546001600160a01b03166000908152600f6020526040902054909150612e439082612879565b601a80546001600160a01b039081166000908152600f6020526040908190209390935542600e55905491517f16a59ed0f9d85ea4fc1f43fa1b03a14bc74f07182fa6e33383fc46c4f2eea40e926116559216908490613d90565b60008183612ebe5760405162461bcd60e51b8152600401610bca9190613e7d565b506000838581612eca57fe5b0495945050505050565b6001600160a01b0383166000908152600f6020526040812054612efa9061104f866118f0565b905081811015612f0957600080fd5b6001600160a01b03831660009081526015602052604090205460ff16156130d157612f32612d86565b6001600160a01b03831660009081526014602052604090206004810154600a549154612f9692612f74929161104f91670de0b6b3a764000091610b2e916128bb565b6001600160a01b03851660009081526014602052604090206003015490612828565b60146000856001600160a01b03166001600160a01b0316815260200190815260200160002060030181905550612fff826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461302e9083612828565b6001600160a01b0384166000908152602081905260409020556008546130549083612828565b6008556001600160a01b03831660009081526014602052604090205461307a9083612828565b6001600160a01b0384166000908152601460205260409020819055600a546130b091670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038416600090815260146020526040902060040155612c71565b61310e826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461313d9083612828565b6001600160a01b03841660009081526020819052604090205550505050565b613164612d86565b6001600160a01b03831660009081526014602052604081206001015461318d9061104f866118f0565b90508181101561319c57600080fd5b6001600160a01b03831660009081526015602052604090205460ff1615613493576001600160a01b03841660009081526014602052604090206004810154600a549154613221926131ff929161104f91670de0b6b3a764000091610b2e916128bb565b6001600160a01b03861660009081526014602052604090206003015490612828565b6001600160a01b03808616600090815260146020526040808220600301939093559085168152206004810154600a54915461327292612f74929161104f91670de0b6b3a764000091610b2e916128bb565b60146000856001600160a01b03166001600160a01b03168152602001908152602001600020600301819055506132db826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461330a9083612828565b6001600160a01b038416600090815260208181526040808320939093556014905220546133379083612828565b6001600160a01b0384166000908152601460205260409020819055600a5461336d91670de0b6b3a764000091610b2e91906128bb565b6001600160a01b03808516600090815260146020526040808220600401939093559086168152205461339f9083612879565b6001600160a01b0385166000908152601460205260409020819055600a546133d591670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038516600090815260146020526040902060048101919091555464746a5288001115612cde576001600160a01b0384166000908152601560209081526040808320805460ff19169055601490915290205460085461343991612879565b6008556001600160a01b0384166000908152601460205260408120819055600a5461347291670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038516600090815260146020526040902060040155612c71565b6001600160a01b03841660009081526014602052604090206004810154600a5491546134d5926131ff929161104f91670de0b6b3a764000091610b2e916128bb565b60146000866001600160a01b03166001600160a01b031681526020019081526020016000206003018190555061353e826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461356d9083612828565b6001600160a01b0384166000908152602081905260409020556008546135939083612879565b6008556001600160a01b0384166000908152601460205260409020546135b99083612879565b6001600160a01b0385166000908152601460205260409020819055600a546135ef91670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038516600090815260146020526040902060048101919091555464746a5288001115612c71576001600160a01b0384166000908152601560209081526040808320805460ff19169055601490915290205460085461365391612879565b6008556001600160a01b0384166000908152601460205260408120819055600a5461368c91670de0b6b3a764000091610b2e91906128bb565b6001600160a01b03851660009081526014602052604090206004015550505050565b6136b6612d86565b6001600160a01b03821660009081526014602052604090206004810154600a54915461371a926136f8929161104f91670de0b6b3a764000091610b2e916128bb565b6001600160a01b03841660009081526014602052604090206003015490612828565b60146000846001600160a01b03166001600160a01b0316815260200190815260200160002060030181905550613783816040518060600160405280602681526020016144e8602691396001600160a01b038616600090815260208190526040902054919061284d565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546137b29082612828565b6001600160a01b0383166000908152602081905260409020556008546137d89082612828565b6008556001600160a01b0382166000908152601460205260409020546137fe9082612828565b6001600160a01b0383166000908152601460205260409020819055600a5461383491670de0b6b3a764000091610b2e91906128bb565b6001600160a01b039092166000908152601460205260409020600401919091555050565b60606138ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138e79092919063ffffffff16565b805190915015612a4157808060200190518101906138cb9190613bee565b612a415760405162461bcd60e51b8152600401610bca906142e8565b60606138f684846000856138fe565b949350505050565b6060824710156139205760405162461bcd60e51b8152600401610bca90614045565b613929856139bf565b6139455760405162461bcd60e51b8152600401610bca90614262565b60006060866001600160a01b031685876040516139629190613d60565b60006040518083038185875af1925050503d806000811461399f576040519150601f19603f3d011682016040523d82523d6000602084013e6139a4565b606091505b50915091506139b48282866139c5565b979650505050505050565b3b151590565b606083156139d4575081610dad565b8251156139e45782518084602001fd5b8160405162461bcd60e51b8152600401610bca9190613e7d565b600082601f830112613a0e578081fd5b8135613a21613a1c82614478565b614451565b818152915060208083019084810181840286018201871015613a4257600080fd5b60005b84811015613a6157813584529282019290820190600101613a45565b505050505092915050565b600060208284031215613a7d578081fd5b8135610dad816144c4565b60008060408385031215613a9a578081fd5b8235613aa5816144c4565b91506020830135613ab5816144c4565b809150509250929050565b600080600060608486031215613ad4578081fd5b8335613adf816144c4565b92506020840135613aef816144c4565b929592945050506040919091013590565b60008060408385031215613b12578182fd5b8235613b1d816144c4565b946020939093013593505050565b60008060408385031215613b3d578182fd5b823567ffffffffffffffff80821115613b54578384fd5b818501915085601f830112613b67578384fd5b8135613b75613a1c82614478565b80828252602080830192508086018a828387028901011115613b95578889fd5b8896505b84871015613bc0578035613bac816144c4565b845260019690960195928101928101613b99565b509096508701359350505080821115613bd7578283fd5b50613be4858286016139fe565b9150509250929050565b600060208284031215613bff578081fd5b8151610dad816144d9565b600060208284031215613c1b578081fd5b5035919050565b60008060408385031215613c34578182fd5b823591506020830135613ab5816144c4565b60008060408385031215613c58578182fd5b823591506020830135613ab5816144d9565b600080600060608486031215613c7e578283fd5b833592506020840135613c90816144c4565b91506040840135613ca0816144d9565b809150509250925092565b60008060408385031215613cbd578182fd5b50508035926020909101359150565b600080600060608486031215613ce0578283fd5b83359250602084013591506040840135613ca0816144d9565b600080600080600080600060e0888a031215613d13578283fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013563ffffffff81168114613d50578182fd5b8091505092959891949750929550565b60008251613d72818460208701614498565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015613e3757815180516001600160a01b0316855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101613dea565b5091979650505050505050565b901515815260200190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6000602082528251806020840152613e9c816040850160208701614498565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260089082015267199d5b9908195b9960c21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600a90820152691dd85a5d081cdd185c9d60b21b604082015260600190565b6020808252600c908201526b1b9bdd0819dbdbd9081c1a5960a21b604082015260600190565b6020808252600d908201526c1c1bdbdb081b9bc81cdd185c9d609a1b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601b908201527f54686572652061726520756e72656c656173656420746f6b656e730000000000604082015260600190565b6020808252600f908201526e1c995858da081b585e081b1a5b5a5d608a1b604082015260600190565b6020808252600c908201526b30b6b7bab73a1032b93937b960a11b604082015260600190565b6020808252600990820152681b9bc81c995dd85c9960ba1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600490820152631dd85a5d60e21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260009082015260400190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601290820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604082015260600190565b6020808252600990820152685465616d206f6e6c7960b81b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a908201526934ba1034b99037bb32b960b11b604082015260600190565b6020808252601190820152701b9bc8185d985a5b18589b1948199d5b99607a1b604082015260600190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561447057600080fd5b604052919050565b600067ffffffffffffffff82111561448e578081fd5b5060209081020190565b60005b838110156144b357818101518382015260200161449b565b83811115612c715750506000910152565b6001600160a01b038116811461173557600080fd5b801515811461173557600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1783b1de76aaa5eea985d170a68ffd4452b466d20d29387a1acdc4fbf94db4064736f6c634300060c003345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000003258f4a509e680bf95db88472f453bf8214e23db000000000000000000000000000000000000000000000000000000005f4f5f10000000000000000000000000000000000000000000000000000000005faead800000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000ab91b8

Deployed Bytecode

0x6080604052600436106103905760003560e01c8063715018a6116101dc578063a9059cbb11610102578063e1bd8c03116100a0578063f0ab53b91161006f578063f0ab53b9146109ea578063f2fde38b146109ff578063f5705cd114610a1f578063fcc0364514610a3f57610397565b8063e1bd8c031461098d578063e1c7392a146109a2578063e2ae93fb146109b7578063e2bbb158146109d757610397565b8063cd9ab4a4116100dc578063cd9ab4a414610916578063d379091014610938578063db4e73721461094d578063dd62ed3e1461096d57610397565b8063a9059cbb146108cc578063ab0528a4146108ec578063bd7b9f2a1461090157610397565b80638bc659931161017a5780639656811a116101495780639656811a14610857578063a1cd494414610877578063a1f841d714610897578063a457c2d7146108ac57610397565b80638bc65993146107de5780638da5cb5b146107fe57806393f1a40b1461081357806395d89b411461084257610397565b8063759c6b6c116101b6578063759c6b6c1461075e5780637bfa953a146107735780638277491a146107885780638bc5cb7c146107ad57610397565b8063715018a61461071457806371a6fc361461072957806372040fe81461073e57610397565b8063441a3e70116102c157806351eb05a61161025f57806364482f791161022e57806364482f791461069f57806368cf75fc146106bf5780636bdef009146106d457806370a08231146106f457610397565b806351eb05a6146106405780635c0610ba14610660578063625f075e1461067557806363f1fbe01461068a57610397565b80634c0843741161029b5780634c084374146105d45780634c3cbeac146105f65780635096e81a1461061657806350adcdb71461062b57610397565b8063441a3e701461057f57806344427e301461059f57806348cd4cb1146105bf57610397565b80631eaaa0451161032e578063313ce56711610308578063313ce567146104fd578063395093511461051f5780633ba2a67e1461053f5780634126a6641461055f57610397565b80631eaaa0451461049157806323b872dd146104b35780632ba4eb21146104d357610397565b80630c6bf3bc1161036a5780630c6bf3bc146104165780631526fe271461043657806317caf6f11461046757806318160ddd1461047c57610397565b806306fdde031461039c578063081e3eda146103c7578063095ea7b3146103e957610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610a54565b6040516103be9190613e7d565b60405180910390f35b3480156103d357600080fd5b506103dc610aeb565b6040516103be9190614381565b3480156103f557600080fd5b50610409610404366004613b00565b610af1565b6040516103be9190613e44565b34801561042257600080fd5b506103dc610431366004613c0a565b610b0f565b34801561044257600080fd5b50610456610451366004613c0a565b610b3c565b6040516103be959493929190613e4f565b34801561047357600080fd5b506103dc610b84565b34801561048857600080fd5b506103dc610b8a565b34801561049d57600080fd5b506104b16104ac366004613c6a565b610b90565b005b3480156104bf57600080fd5b506104096104ce366004613ac0565b610d2c565b3480156104df57600080fd5b506104e8610db4565b6040516103be99989796959493929190614404565b34801561050957600080fd5b50610512610dda565b6040516103be9190614443565b34801561052b57600080fd5b5061040961053a366004613b00565b610de3565b34801561054b57600080fd5b506104b161055a366004613c0a565b610e31565b34801561056b57600080fd5b5061040961057a366004613a6c565b61112f565b34801561058b57600080fd5b506104b161059a366004613cab565b611144565b3480156105ab57600080fd5b506103dc6105ba366004613a6c565b61134d565b3480156105cb57600080fd5b506103dc61135f565b3480156105e057600080fd5b506105e9611365565b6040516103be9190613d7c565b34801561060257600080fd5b506104b1610611366004613c46565b611374565b34801561062257600080fd5b506103dc61141b565b34801561063757600080fd5b506105e96114a4565b34801561064c57600080fd5b506104b161065b366004613c0a565b6114b3565b34801561066c57600080fd5b506104b1611597565b34801561068157600080fd5b506103dc611660565b34801561069657600080fd5b506104b1611666565b3480156106ab57600080fd5b506104b16106ba366004613ccc565b611738565b3480156106cb57600080fd5b506104b1611844565b3480156106e057600080fd5b506104b16106ef366004613cf9565b611890565b34801561070057600080fd5b506103dc61070f366004613a6c565b6118f0565b34801561072057600080fd5b506104b161190b565b34801561073557600080fd5b506103dc611995565b34801561074a57600080fd5b506104b1610759366004613c0a565b61199b565b34801561076a57600080fd5b506103dc611aba565b34801561077f57600080fd5b506103dc611ac0565b34801561079457600080fd5b5061079d611ac6565b6040516103be94939291906143c6565b3480156107b957600080fd5b506107cd6107c8366004613a6c565b611ad5565b6040516103be9594939291906143e1565b3480156107ea57600080fd5b506103dc6107f9366004613a6c565b611b04565b34801561080a57600080fd5b506105e9611c42565b34801561081f57600080fd5b5061083361082e366004613c22565b611c56565b6040516103be939291906143b0565b34801561084e57600080fd5b506103b1611c82565b34801561086357600080fd5b506104b1610872366004613b2b565b611ce3565b34801561088357600080fd5b506103dc610892366004613a6c565b611f05565b3480156108a357600080fd5b506104b1612014565b3480156108b857600080fd5b506104096108c7366004613b00565b61202c565b3480156108d857600080fd5b506104096108e7366004613b00565b612094565b3480156108f857600080fd5b506103dc6120a8565b34801561090d57600080fd5b506103dc6120ae565b34801561092257600080fd5b5061092b61216c565b6040516103be9190613dcd565b34801561094457600080fd5b506104b1612200565b34801561095957600080fd5b506104b1610968366004613a6c565b612244565b34801561097957600080fd5b506103dc610988366004613a88565b6123e5565b34801561099957600080fd5b506103dc612410565b3480156109ae57600080fd5b50610409612416565b3480156109c357600080fd5b506108336109d2366004613a6c565b612426565b6104b16109e5366004613cab565b612447565b3480156109f657600080fd5b506103dc6125e5565b348015610a0b57600080fd5b506104b1610a1a366004613a6c565b6125eb565b348015610a2b57600080fd5b506103dc610a3a366004613c22565b6126b2565b348015610a4b57600080fd5b506104b16127d9565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b505050505090505b90565b60065490565b6000610b05610afe612937565b848461293b565b5060015b92915050565b6000610b346305f5e100610b2e602254856128bb90919063ffffffff16565b906128f5565b90505b919050565b60068181548110610b4957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b600c5481565b60025490565b610b98612937565b60055461010090046001600160a01b03908116911614610bd35760405162461bcd60e51b8152600401610bca90614193565b60405180910390fd5b610bdc826129ef565b8015610bea57610bea611844565b60006016544311610bfd57601654610bff565b435b600c54909150610c0f9085612828565b600c556040805160a0810182526001600160a01b039485168152602081019586526000918101828152606082019384526080820183815260068054600181018255945291517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600590940293840180546001600160a01b031916919097161790955594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4082015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41840155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d428301555090517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4390910155565b6000610d39848484612a46565b610da984610d45612937565b610da48560405180606001604052806028815260200161450e602891396001600160a01b038a16600090815260016020526040812090610d83612937565b6001600160a01b03168152602081019190915260400160002054919061284d565b61293b565b5060015b9392505050565b601b54601c54601d54601e54601f54602054602154602254600b54909192939495969798565b60055460ff1690565b6000610b05610df0612937565b84610da48560016000610e01612937565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612828565b601b54421015610e535760405162461bcd60e51b8152600401610bca90614175565b601c54421115610e755760405162461bcd60e51b8152600401610bca90614332565b602054610e829082612828565b6020819055601e541015610ea85760405162461bcd60e51b8152600401610bca90613ef3565b6000610eb382610b0f565b905060008111610ed55760405162461bcd60e51b8152600401610bca906140eb565b33600090815260186020526040812054610eef9084612828565b9050601f54811115610f135760405162461bcd60e51b8152600401610bca906140c2565b33600090815260186020526040902054610f2d9084612828565b33600090815260186020526040902090815560010154610f4d9084612828565b33600090815260186020526040902060010155601d544211610f7157601d54610f73565b425b336000818152601860205260409020600201919091556019546001600160a01b031690610fa39082903086612c19565b601a54610fbd906001600160a01b03838116911685612c77565b60006006600281548110610fcd57fe5b600091825260208083203384527f0b9d2c0c271bb30544eb78c59bdaebdae2728e5f65814c07768a0abe90ed192390915260409092206005909102909101915061101760026114b3565b805415611063576000611055826002015461104f670de0b6b3a7640000610b2e876004015487600001546128bb90919063ffffffff16565b90612879565b90506110613382612c96565b505b60028201546110729087612828565b600283015580546110839087612828565b80825560048301546110a391670de0b6b3a764000091610b2e91906128bb565b81600201819055506002336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15886040516110e69190614381565b60405180910390a37f65bf54ba565d510173656a5b290cde255d14fd6c84a51b68b332f7c248d954a0338760405161111f929190613d90565b60405180910390a1505050505050565b60156020526000908152604090205460ff1681565b600654829081106111675760405162461bcd60e51b8152600401610bca90613ff8565b60006006848154811061117657fe5b60009182526020808320878452601382526040808520338652835280852060189093529093206001015460059092029092019250158015906111b85750846002145b156111f1576111c5612cee565b33600090815260186020526040902060010154815485916111e69190612879565b10156111f157600080fd5b80548411156112125760405162461bcd60e51b8152600401610bca90614299565b61121b856114b3565b600282015461122a9085612879565b82600201819055506000611263826002015461104f670de0b6b3a7640000610b2e876004015487600001546128bb90919063ffffffff16565b60018301549091506112759082612828565b600183015581546112869086612879565b80835560048401546112a691670de0b6b3a764000091610b2e91906128bb565b600283015582546001600160a01b03166112ed57604051339086156108fc029087906000818181858888f193505050501580156112e7573d6000803e3d6000fd5b50611303565b8254611303906001600160a01b03163387612c77565b85336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688760405161133d9190614381565b60405180910390a3505050505050565b600f6020526000908152604090205481565b60165481565b601a546001600160a01b031681565b61137c612937565b60055461010090046001600160a01b039081169116146113ae5760405162461bcd60e51b8152600401610bca90614193565b80156113bc576113bc611844565b600754600c546113d79184916113d191612879565b90612828565b600c556007546040517f11bc6bbe0ffe19f80cf95656cab7bf7beedd1afa2c3837b4c632ecfe97ec84929161140d91859061438a565b60405180910390a150600755565b6000600e54421161142e57506000610ae8565b600062015180600e5442038161144057fe5b049050801561149c57600d54601a546001600160a01b03166000908152600f602052604090205490820290811061149157601a546001600160a01b03166000908152600f6020526040902054611493565b805b92505050610ae8565b600091505090565b6019546001600160a01b031681565b600654819081106114d65760405162461bcd60e51b8152600401610bca90613ff8565b6000600683815481106114e557fe5b90600052602060002090600502019050806003015443116115065750611593565b60028101548061151d575043600390910155611593565b600061152d836003015443612d7a565b9050600061155a600c54610b2e8660010154611554601754876128bb90919063ffffffff16565b906128bb565b905061158061157584610b2e84670de0b6b3a76400006128bb565b600486015490612828565b6004850155505043600390920191909155505b5050565b6011544210156115b95760405162461bcd60e51b8152600401610bca9061420d565b60006115c433611b04565b9050600081116115e65760405162461bcd60e51b8152600401610bca90614356565b336000908152601460205260409020600101546116039082612879565b336000818152601460205260409081902060018101939093554260029093019290925590517f7589c9c982ef4072df7989933bdc82431bb584fe9225a99a7c178b519beee71691611655918490613d90565b60405180910390a150565b60205481565b61166e612d86565b3360009081526014602052604081206004810154600a5491546116c0926116a7929161104f91670de0b6b3a764000091610b2e916128bb565b3360009081526014602052604090206003015490612828565b9050600081116116e25760405162461bcd60e51b8152600401610bca90614111565b3360009081526014602052604081206003810191909155600a54905461171591670de0b6b3a764000091610b2e916128bb565b336000818152601460205260409020600401919091556117359082612c96565b50565b611740612937565b60055461010090046001600160a01b039081169116146117725760405162461bcd60e51b8152600401610bca90614193565b600654839081106117955760405162461bcd60e51b8152600401610bca90613ff8565b81156117a3576117a3611844565b6117da836113d1600687815481106117b757fe5b906000526020600020906005020160010154600c5461287990919063ffffffff16565b600c8190555082600685815481106117ee57fe5b9060005260206000209060050201600101819055507fc66cec52f6fc7c7c09b5f02578bd330a548d6b039f8ba5b5703204565bdb335b84848460405161183693929190614398565b60405180910390a150505050565b60065460005b818110156118635761185b816114b3565b60010161184a565b506040517fcb4425900f1290387f6d2291c34d7dd7551976cee3b4fd9d5585b8252b62449c90600090a150565b611898612937565b60055461010090046001600160a01b039081169116146118ca5760405162461bcd60e51b8152600401610bca90614193565b601b96909655601c94909455601d92909255601e55601f5560225563ffffffff16602155565b6001600160a01b031660009081526020819052604090205490565b611913612937565b60055461010090046001600160a01b039081169116146119455760405162461bcd60e51b8152600401610bca90614193565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600d5481565b600654819081106119be5760405162461bcd60e51b8152600401610bca90613ff8565b6000600683815481106119cd57fe5b600091825260208083208684526013825260408085203386529092529220600590910290910191506119fe846114b3565b6000611a3d611a32836002015461104f670de0b6b3a7640000610b2e886004015488600001546128bb90919063ffffffff16565b600184015490612828565b90508015611a4f57611a4f3382612c96565b6000600183015560048301548254611a7491670de0b6b3a764000091610b2e916128bb565b60028301556040517fc4f631358fe7d4f3f0301cdcc3914b651ae9eb9aace72a4930737f6cde8c704190611aab9033908490613d90565b60405180910390a15050505050565b60115481565b600e5481565b600754600854600954600a5484565b601460205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b6001600160a01b038116600090815260146020526040812060010154611b2c57506000610b37565b60115442111580611b5857506001600160a01b0382166000908152601460205260409020600201544211155b15611b6557506000610b37565b6001600160a01b03821660009081526014602052604081206002015460115411611baa576001600160a01b038316600090815260146020526040902060020154611bae565b6011545b905060006201518082420381611bc057fe5b0490508015611c38576000611be6601254610b2e846010546128bb90919063ffffffff16565b6001600160a01b0386166000908152601460205260409020600101549091508110611c2c576001600160a01b038516600090815260146020526040902060010154611c2e565b805b9350505050610b37565b5060009392505050565b60055461010090046001600160a01b031690565b601360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae05780601f10610ab557610100808354040283529160200191610ae0565b611ceb612937565b60055461010090046001600160a01b03908116911614611d1d5760405162461bcd60e51b8152600401610bca90614193565b600554600160a81b900460ff1615611d3457600080fd5b6000825111611d4257600080fd5b8051825114611d5057600080fd5b6000808060005b8551811015611e8d57848181518110611d6c57fe5b60200260200101519150858181518110611d8257fe5b60200260200101519250611d9f828561282890919063ffffffff16565b6001600160a01b038416600090815260186020908152604080832086815560018101879055601d546002909101557f0b9d2c0c271bb30544eb78c59bdaebdae2728e5f65814c07768a0abe90ed19239091529020805491955090611e039084612828565b81556040516002906001600160a01b038616907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590611e43908790614381565b60405180910390a37f65bf54ba565d510173656a5b290cde255d14fd6c84a51b68b332f7c248d954a08484604051611e7c929190613d90565b60405180910390a150600101611d57565b50602054611e9b9084612828565b6020819055601e541015611ec15760405162461bcd60e51b8152600401610bca90613ef3565b60006006600281548110611ed157fe5b90600052602060002090600502019050611ef884826002015461282890919063ffffffff16565b6002909101555050505050565b6001600160a01b038116600090815260186020526040812054611f2a57506000610b37565b601d5442111580611f5557506001600160a01b03821660009081526018602052604090206002015442105b15611f6257506000610b37565b6001600160a01b03821660009081526018602052604081206002015462015180904203049050801561200b576021546001600160a01b0384166000908152601860205260408120549091611fba91610b2e90856128bb565b6001600160a01b0385166000908152601860205260409020600101549091508110612000576001600160a01b038416600090815260186020526040902060010154612002565b805b92505050610b37565b50600092915050565b600061201f33611f05565b9050611735600282611144565b6000610b05612039612937565b84610da4856040518060600160405280602581526020016145366025913960016000612063612937565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061284d565b6000610b056120a1612937565b8484612a46565b60105481565b600a546008546009546000929190431180156120c957508015155b1561212e5760006120df60076002015443612d7a565b90506000612107600c54610b2e600760000154611554601754876128bb90919063ffffffff16565b905061212961212284610b2e84670de0b6b3a76400006128bb565b8590612828565b935050505b33600090815260146020526040812060048101549054612164916116a79161104f90670de0b6b3a764000090610b2e90896128bb565b935050505090565b60606006805480602002602001604051908101604052809291908181526020016000905b828210156121f75760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101612190565b50505050905090565b612208612937565b60055461010090046001600160a01b0390811691161461223a5760405162461bcd60e51b8152600401610bca90614193565b612242612e11565b565b601a546001600160a01b0316331461226e5760405162461bcd60e51b8152600401610bca906142c5565b6001600160a01b03811630141561228457600080fd5b601a546001600160a01b038281169116141561229f57600080fd5b6001600160a01b03811660009081526015602052604090205460ff16156122c557600080fd5b6001600160a01b038116600090815260146020526040902060010154156122fe5760405162461bcd60e51b8152600401610bca9061408b565b61230a81601054612c96565b6001600160a01b0381166000908152601560205260409020805460ff19166001179055612336816118f0565b6001600160a01b0382166000908152601460205260409020908155601054600190910155601154421161236b5760115461236d565b425b6001600160a01b038216600090815260146020526040812060028101929092556003820155600a5490546123ae91670de0b6b3a764000091610b2e916128bb565b6001600160a01b0382166000908152601460205260409020600401556123df6123d6826118f0565b60085490612828565b60085550565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60175481565b600554600160a81b900460ff1681565b60186020526000908152604090208054600182015460029092015490919083565b6006548290811061246a5760405162461bcd60e51b8152600401610bca90613ff8565b8215806124775750826001145b1561249e57600b5442101561249e5760405162461bcd60e51b8152600401610bca9061401e565b6000600684815481106124ad57fe5b600091825260208083208784526013825260408085203386529092529220600590910290910191506124de856114b3565b80541561252f576000612516826002015461104f670de0b6b3a7640000610b2e876004015487600001546128bb90919063ffffffff16565b60018301549091506125289082612828565b6001830155505b81546001600160a01b03166125465734935061255d565b815461255d906001600160a01b0316333087612c19565b600282015461256c9085612828565b6002830155805461257d9085612828565b808255600483015461259d91670de0b6b3a764000091610b2e91906128bb565b6002820155604051859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15906125d6908890614381565b60405180910390a35050505050565b60125481565b6125f3612937565b60055461010090046001600160a01b039081169116146126255760405162461bcd60e51b8152600401610bca90614193565b6001600160a01b03811661264b5760405162461bcd60e51b8152600401610bca90613f15565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600654600090839081106126d85760405162461bcd60e51b8152600401610bca90613ff8565b6000600685815481106126e757fe5b600091825260208083208884526013825260408085206001600160a01b038a168652909252922060046005909202909201908101546002820154600383015492945090914311801561273857508015155b1561279457600061274d856003015443612d7a565b90506000612774600c54610b2e8860010154611554601754876128bb90919063ffffffff16565b905061278f61212284610b2e84670de0b6b3a76400006128bb565b935050505b6127cd836002015461104f6127c2670de0b6b3a7640000610b2e8789600001546128bb90919063ffffffff16565b600187015490612828565b98975050505050505050565b6127e1612937565b60055461010090046001600160a01b039081169116146128135760405162461bcd60e51b8152600401610bca90614193565b6005805460ff60a81b1916600160a81b179055565b600082820183811015610dad5760405162461bcd60e51b8152600401610bca90613f9d565b600081848411156128715760405162461bcd60e51b8152600401610bca9190613e7d565b505050900390565b6000610dad83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061284d565b6000826128ca57506000610b09565b828202828482816128d757fe5b0414610dad5760405162461bcd60e51b8152600401610bca90614134565b6000610dad83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e9d565b3390565b6001600160a01b0383166129615760405162461bcd60e51b8152600401610bca9061421e565b6001600160a01b0382166129875760405162461bcd60e51b8152600401610bca90613f5b565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906129e2908590614381565b60405180910390a3505050565b60065460005b81811015612a4157826001600160a01b031660068281548110612a1457fe5b60009182526020909120600590910201546001600160a01b03161415612a3957600080fd5b6001016129f5565b505050565b6001600160a01b038316612a6c5760405162461bcd60e51b8152600401610bca906141c8565b6001600160a01b038216612a925760405162461bcd60e51b8152600401610bca90613eb0565b601a546001600160a01b0384811691161415612b0357612ab3838383612ed4565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612af69190614381565b60405180910390a3612a41565b6001600160a01b03831660009081526015602052604090205460ff1615612b2f57612ab383838361315c565b6001600160a01b03821660009081526015602052604090205460ff1615612b5b57612ab38383836136ae565b612b98816040518060600160405280602681526020016144e8602691396001600160a01b038616600090815260208190526040902054919061284d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612bc79082612828565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129e2908590614381565b612c71846323b872dd60e01b858585604051602401612c3a93929190613da9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613858565b50505050565b612a418363a9059cbb60e01b8484604051602401612c3a929190613d90565b60006006600281548110612ca657fe5b906000526020600020906005020190506000612cc9826002015461104f306118f0565b905080831115612ce357612cde308583612a46565b612c71565b612c71308585612a46565b601d54421015612d105760405162461bcd60e51b8152600401610bca90613fd4565b6000612d1b33611f05565b905060008111612d2a57600080fd5b602054612d379082612879565b602090815533600090815260189091526040902060010154612d599082612879565b33600090815260186020526040902060018101919091554260029091015550565b6000610dad8284612879565b6009544311612d9457612242565b600854612da45743600955612242565b6000612db560076002015443612d7a565b90506000612ddd600c54610b2e600760000154611554601754876128bb90919063ffffffff16565b600854909150612e0690612dfd90610b2e84670de0b6b3a76400006128bb565b600a5490612828565b600a55505043600955565b6000612e1b61141b565b601a546001600160a01b03166000908152600f6020526040902054909150612e439082612879565b601a80546001600160a01b039081166000908152600f6020526040908190209390935542600e55905491517f16a59ed0f9d85ea4fc1f43fa1b03a14bc74f07182fa6e33383fc46c4f2eea40e926116559216908490613d90565b60008183612ebe5760405162461bcd60e51b8152600401610bca9190613e7d565b506000838581612eca57fe5b0495945050505050565b6001600160a01b0383166000908152600f6020526040812054612efa9061104f866118f0565b905081811015612f0957600080fd5b6001600160a01b03831660009081526015602052604090205460ff16156130d157612f32612d86565b6001600160a01b03831660009081526014602052604090206004810154600a549154612f9692612f74929161104f91670de0b6b3a764000091610b2e916128bb565b6001600160a01b03851660009081526014602052604090206003015490612828565b60146000856001600160a01b03166001600160a01b0316815260200190815260200160002060030181905550612fff826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461302e9083612828565b6001600160a01b0384166000908152602081905260409020556008546130549083612828565b6008556001600160a01b03831660009081526014602052604090205461307a9083612828565b6001600160a01b0384166000908152601460205260409020819055600a546130b091670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038416600090815260146020526040902060040155612c71565b61310e826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461313d9083612828565b6001600160a01b03841660009081526020819052604090205550505050565b613164612d86565b6001600160a01b03831660009081526014602052604081206001015461318d9061104f866118f0565b90508181101561319c57600080fd5b6001600160a01b03831660009081526015602052604090205460ff1615613493576001600160a01b03841660009081526014602052604090206004810154600a549154613221926131ff929161104f91670de0b6b3a764000091610b2e916128bb565b6001600160a01b03861660009081526014602052604090206003015490612828565b6001600160a01b03808616600090815260146020526040808220600301939093559085168152206004810154600a54915461327292612f74929161104f91670de0b6b3a764000091610b2e916128bb565b60146000856001600160a01b03166001600160a01b03168152602001908152602001600020600301819055506132db826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461330a9083612828565b6001600160a01b038416600090815260208181526040808320939093556014905220546133379083612828565b6001600160a01b0384166000908152601460205260409020819055600a5461336d91670de0b6b3a764000091610b2e91906128bb565b6001600160a01b03808516600090815260146020526040808220600401939093559086168152205461339f9083612879565b6001600160a01b0385166000908152601460205260409020819055600a546133d591670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038516600090815260146020526040902060048101919091555464746a5288001115612cde576001600160a01b0384166000908152601560209081526040808320805460ff19169055601490915290205460085461343991612879565b6008556001600160a01b0384166000908152601460205260408120819055600a5461347291670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038516600090815260146020526040902060040155612c71565b6001600160a01b03841660009081526014602052604090206004810154600a5491546134d5926131ff929161104f91670de0b6b3a764000091610b2e916128bb565b60146000866001600160a01b03166001600160a01b031681526020019081526020016000206003018190555061353e826040518060600160405280602681526020016144e8602691396001600160a01b038716600090815260208190526040902054919061284d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461356d9083612828565b6001600160a01b0384166000908152602081905260409020556008546135939083612879565b6008556001600160a01b0384166000908152601460205260409020546135b99083612879565b6001600160a01b0385166000908152601460205260409020819055600a546135ef91670de0b6b3a764000091610b2e91906128bb565b6001600160a01b038516600090815260146020526040902060048101919091555464746a5288001115612c71576001600160a01b0384166000908152601560209081526040808320805460ff19169055601490915290205460085461365391612879565b6008556001600160a01b0384166000908152601460205260408120819055600a5461368c91670de0b6b3a764000091610b2e91906128bb565b6001600160a01b03851660009081526014602052604090206004015550505050565b6136b6612d86565b6001600160a01b03821660009081526014602052604090206004810154600a54915461371a926136f8929161104f91670de0b6b3a764000091610b2e916128bb565b6001600160a01b03841660009081526014602052604090206003015490612828565b60146000846001600160a01b03166001600160a01b0316815260200190815260200160002060030181905550613783816040518060600160405280602681526020016144e8602691396001600160a01b038616600090815260208190526040902054919061284d565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546137b29082612828565b6001600160a01b0383166000908152602081905260409020556008546137d89082612828565b6008556001600160a01b0382166000908152601460205260409020546137fe9082612828565b6001600160a01b0383166000908152601460205260409020819055600a5461383491670de0b6b3a764000091610b2e91906128bb565b6001600160a01b039092166000908152601460205260409020600401919091555050565b60606138ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138e79092919063ffffffff16565b805190915015612a4157808060200190518101906138cb9190613bee565b612a415760405162461bcd60e51b8152600401610bca906142e8565b60606138f684846000856138fe565b949350505050565b6060824710156139205760405162461bcd60e51b8152600401610bca90614045565b613929856139bf565b6139455760405162461bcd60e51b8152600401610bca90614262565b60006060866001600160a01b031685876040516139629190613d60565b60006040518083038185875af1925050503d806000811461399f576040519150601f19603f3d011682016040523d82523d6000602084013e6139a4565b606091505b50915091506139b48282866139c5565b979650505050505050565b3b151590565b606083156139d4575081610dad565b8251156139e45782518084602001fd5b8160405162461bcd60e51b8152600401610bca9190613e7d565b600082601f830112613a0e578081fd5b8135613a21613a1c82614478565b614451565b818152915060208083019084810181840286018201871015613a4257600080fd5b60005b84811015613a6157813584529282019290820190600101613a45565b505050505092915050565b600060208284031215613a7d578081fd5b8135610dad816144c4565b60008060408385031215613a9a578081fd5b8235613aa5816144c4565b91506020830135613ab5816144c4565b809150509250929050565b600080600060608486031215613ad4578081fd5b8335613adf816144c4565b92506020840135613aef816144c4565b929592945050506040919091013590565b60008060408385031215613b12578182fd5b8235613b1d816144c4565b946020939093013593505050565b60008060408385031215613b3d578182fd5b823567ffffffffffffffff80821115613b54578384fd5b818501915085601f830112613b67578384fd5b8135613b75613a1c82614478565b80828252602080830192508086018a828387028901011115613b95578889fd5b8896505b84871015613bc0578035613bac816144c4565b845260019690960195928101928101613b99565b509096508701359350505080821115613bd7578283fd5b50613be4858286016139fe565b9150509250929050565b600060208284031215613bff578081fd5b8151610dad816144d9565b600060208284031215613c1b578081fd5b5035919050565b60008060408385031215613c34578182fd5b823591506020830135613ab5816144c4565b60008060408385031215613c58578182fd5b823591506020830135613ab5816144d9565b600080600060608486031215613c7e578283fd5b833592506020840135613c90816144c4565b91506040840135613ca0816144d9565b809150509250925092565b60008060408385031215613cbd578182fd5b50508035926020909101359150565b600080600060608486031215613ce0578283fd5b83359250602084013591506040840135613ca0816144d9565b600080600080600080600060e0888a031215613d13578283fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013563ffffffff81168114613d50578182fd5b8091505092959891949750929550565b60008251613d72818460208701614498565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015613e3757815180516001600160a01b0316855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101613dea565b5091979650505050505050565b901515815260200190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6000602082528251806020840152613e9c816040850160208701614498565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260089082015267199d5b9908195b9960c21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600a90820152691dd85a5d081cdd185c9d60b21b604082015260600190565b6020808252600c908201526b1b9bdd0819dbdbd9081c1a5960a21b604082015260600190565b6020808252600d908201526c1c1bdbdb081b9bc81cdd185c9d609a1b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601b908201527f54686572652061726520756e72656c656173656420746f6b656e730000000000604082015260600190565b6020808252600f908201526e1c995858da081b585e081b1a5b5a5d608a1b604082015260600190565b6020808252600c908201526b30b6b7bab73a1032b93937b960a11b604082015260600190565b6020808252600990820152681b9bc81c995dd85c9960ba1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600490820152631dd85a5d60e21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260009082015260400190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601290820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604082015260600190565b6020808252600990820152685465616d206f6e6c7960b81b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a908201526934ba1034b99037bb32b960b11b604082015260600190565b6020808252601190820152701b9bc8185d985a5b18589b1948199d5b99607a1b604082015260600190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561447057600080fd5b604052919050565b600067ffffffffffffffff82111561448e578081fd5b5060209081020190565b60005b838110156144b357818101518382015260200161449b565b83811115612c715750506000910152565b6001600160a01b038116811461173557600080fd5b801515811461173557600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1783b1de76aaa5eea985d170a68ffd4452b466d20d29387a1acdc4fbf94db4064736f6c634300060c0033

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

000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000003258f4a509e680bf95db88472f453bf8214e23db000000000000000000000000000000000000000000000000000000005f4f5f10000000000000000000000000000000000000000000000000000000005faead800000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000ab91b8

-----Decoded View---------------
Arg [0] : _fundToken (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [1] : teamHolder (address): 0x3258f4a509E680Bf95dB88472F453BF8214e23Db
Arg [2] : teamReleaseTime (uint256): 1599037200
Arg [3] : _nodeLockTime (uint256): 1605283200
Arg [4] : _BLWPerBlock (uint256): 100000000
Arg [5] : _startBlock (uint256): 11243960

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [1] : 0000000000000000000000003258f4a509e680bf95db88472f453bf8214e23db
Arg [2] : 000000000000000000000000000000000000000000000000000000005f4f5f10
Arg [3] : 000000000000000000000000000000000000000000000000000000005faead80
Arg [4] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [5] : 0000000000000000000000000000000000000000000000000000000000ab91b8


Deployed Bytecode Sourcemap

30939:27916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22110:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48586:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24216:169::-;;;;;;;;;;-1:-1:-1;24216:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56356:132::-;;;;;;;;;;-1:-1:-1;56356:132:0;;;;;:::i;:::-;;:::i;31965:26::-;;;;;;;;;;-1:-1:-1;31965:26:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;32066:34::-;;;;;;;;;;;;;:::i;23185:100::-;;;;;;;;;;;;;:::i;48703:630::-;;;;;;;;;;-1:-1:-1;48703:630:0;;;;;:::i;:::-;;:::i;:::-;;24867:321;;;;;;;;;;-1:-1:-1;24867:321:0;;;;;:::i;:::-;;:::i;36458:298::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;23037:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25597:218::-;;;;;;;;;;-1:-1:-1;25597:218:0;;;;;:::i;:::-;;:::i;54741:1607::-;;;;;;;;;;-1:-1:-1;54741:1607:0;;;;;:::i;:::-;;:::i;32489:49::-;;;;;;;;;;-1:-1:-1;32489:49:0;;;;;:::i;:::-;;:::i;52760:1021::-;;;;;;;;;;-1:-1:-1;52760:1021:0;;;;;:::i;:::-;;:::i;32184:41::-;;;;;;;;;;-1:-1:-1;32184:41:0;;;;;:::i;:::-;;:::i;32545:25::-;;;;;;;;;;;;;:::i;32689:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35590:346::-;;;;;;;;;;-1:-1:-1;35590:346:0;;;;;:::i;:::-;;:::i;43382:445::-;;;;;;;;;;;;;:::i;32657:24::-;;;;;;;;;;;;;:::i;50994:756::-;;;;;;;;;;-1:-1:-1;50994:756:0;;;;;:::i;:::-;;:::i;44810:451::-;;;;;;;;;;;;;:::i;32902:32::-;;;;;;;;;;;;;:::i;47755:543::-;;;;;;;;;;;;;:::i;49343:375::-;;;;;;;;;;-1:-1:-1;49343:375:0;;;;;:::i;:::-;;:::i;49730:215::-;;;;;;;;;;;;;:::i;35944:508::-;;;;;;;;;;-1:-1:-1;35944:508:0;;;;;:::i;:::-;;:::i;23348:119::-;;;;;;;;;;-1:-1:-1;23348:119:0;;;;;:::i;:::-;;:::i;20589:148::-;;;;;;;;;;;;;:::i;32107:31::-;;;;;;;;;;;;;:::i;53789:578::-;;;;;;;;;;-1:-1:-1;53789:578:0;;;;;:::i;:::-;;:::i;32273:33::-;;;;;;;;;;;;;:::i;32145:32::-;;;;;;;;;;;;;:::i;31998:24::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;32423:58::-;;;;;;;;;;-1:-1:-1;32423:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;45269:817::-;;;;;;;;;;-1:-1:-1;45269:817:0;;;;;:::i;:::-;;:::i;19947:79::-;;;;;;;;;;;;;:::i;32351:64::-;;;;;;;;;;-1:-1:-1;32351:64:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;22312:87::-;;;;;;;;;;;;;:::i;57820:1030::-;;;;;;;;;;-1:-1:-1;57820:1030:0;;;;;:::i;:::-;;:::i;57033:630::-;;;;;;;;;;-1:-1:-1;57033:630:0;;;;;:::i;:::-;;:::i;56496:124::-;;;;;;;;;;;;;:::i;26318:269::-;;;;;;;;;;-1:-1:-1;26318:269:0;;;;;:::i;:::-;;:::i;23680:175::-;;;;;;;;;;-1:-1:-1;23680:175:0;;;;;:::i;:::-;;:::i;32233:32::-;;;;;;;;;;;;;:::i;46832:887::-;;;;;;;;;;;;;:::i;33754:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43050:71::-;;;;;;;;;;;;;:::i;43851:951::-;;;;;;;;;;-1:-1:-1;43851:951:0;;;;;:::i;:::-;;:::i;23918:151::-;;;;;;;;;;-1:-1:-1;23918:151:0;;;;;:::i;:::-;;:::i;32578:26::-;;;;;;;;;;;;;:::i;31942:16::-;;;;;;;;;;;;;:::i;32612:37::-;;;;;;;;;;-1:-1:-1;32612:37:0;;;;;:::i;:::-;;:::i;51771:981::-;;;;;;:::i;:::-;;:::i;32314:30::-;;;;;;;;;;;;;:::i;20892:244::-;;;;;;;;;;-1:-1:-1;20892:244:0;;;;;:::i;:::-;;:::i;50086:900::-;;;;;;;;;;-1:-1:-1;50086:900:0;;;;;:::i;:::-;;:::i;57716:66::-;;;;;;;;;;;;;:::i;22110:83::-;22180:5;22173:12;;;;;;;;-1:-1:-1;;22173:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22147:13;;22173:12;;22180:5;;22173:12;;22180:5;22173:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22110:83;;:::o;48586:95::-;48658:8;:15;48586:95;:::o;24216:169::-;24299:4;24316:39;24325:12;:10;:12::i;:::-;24339:7;24348:6;24316:8;:39::i;:::-;-1:-1:-1;24373:4:0;24216:169;;;;;:::o;56356:132::-;56422:7;56449:31;31081:3;56449:21;56460:9;;56449:6;:10;;:21;;;;:::i;:::-;:25;;:31::i;:::-;56442:38;;56356:132;;;;:::o;31965:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31965:26:0;;;;-1:-1:-1;31965:26:0;;;;;:::o;32066:34::-;;;;:::o;23185:100::-;23265:12;;23185:100;:::o;48703:630::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;;;;;;;;;48800:27:::1;48818:8;48800:17;:27::i;:::-;48844:11;48840:62;;;48872:18;:16;:18::i;:::-;48912:23;48953:10;;48938:12;:25;:53;;48981:10;;48938:53;;;48966:12;48938:53;49020:15;::::0;48912:79;;-1:-1:-1;49020:32:0::1;::::0;49040:11;49020:19:::1;:32::i;:::-;49002:15;:50:::0;49091:223:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;49091:223:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;49091:223:0;;;;;;;;;;;;;;;;;;49063:8:::1;:262:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;49063:262:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49063:262:0;;;;;;;48703:630::o;24867:321::-;24973:4;24990:36;25000:6;25008:9;25019:6;24990:9;:36::i;:::-;25037:121;25046:6;25054:12;:10;:12::i;:::-;25068:89;25106:6;25068:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25068:19:0;;;;;;:11;:19;;;;;;25088:12;:10;:12::i;:::-;-1:-1:-1;;;;;25068:33:0;;;;;;;;;;;;-1:-1:-1;25068:33:0;;;:89;:37;:89::i;:::-;25037:8;:121::i;:::-;-1:-1:-1;25176:4:0;24867:321;;;;;;:::o;36458:298::-;36603:11;;36616:12;;36630:18;;36650:7;;36672:17;;36691;;36710:15;;36727:9;;36738;;36458:298;;;;;;;;;:::o;23037:83::-;23103:9;;;;23037:83;:::o;25597:218::-;25685:4;25702:83;25711:12;:10;:12::i;:::-;25725:7;25734:50;25773:10;25734:11;:25;25746:12;:10;:12::i;:::-;-1:-1:-1;;;;;25734:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;25734:25:0;;;:34;;;;;;;;;;;:38;:50::i;54741:1607::-;54820:11;;54801:15;:30;;54793:47;;;;-1:-1:-1;;;54793:47:0;;;;;;;:::i;:::-;54878:12;;54859:15;:31;;54851:54;;;;-1:-1:-1;;;54851:54:0;;;;;;;:::i;:::-;54936:17;;:29;;54958:6;54936:21;:29::i;:::-;54916:17;:49;;;55005:7;;-1:-1:-1;54984:28:0;54976:49;;;;-1:-1:-1;;;54976:49:0;;;;;;;:::i;:::-;55038:24;55065:27;55085:6;55065:19;:27::i;:::-;55038:54;;55130:1;55111:16;:20;55103:45;;;;-1:-1:-1;;;55103:45:0;;;;;;;:::i;:::-;55188:10;55161:18;55182:17;;;:5;:17;;;;;:26;:38;;55213:6;55182:30;:38::i;:::-;55161:59;;55253:17;;55239:10;:31;;55231:59;;;;-1:-1:-1;;;55231:59:0;;;;;;;:::i;:::-;55338:10;55332:17;;;;:5;:17;;;;;:26;:38;;55363:6;55332:30;:38::i;:::-;55309:10;55303:17;;;;:5;:17;;;;;:67;;;55408:24;;;:36;;55437:6;55408:28;:36::i;:::-;55387:10;55381:17;;;;:5;:17;;;;;:24;;:63;55507:18;;55489:15;:36;:75;;55546:18;;55489:75;;;55528:15;55489:75;55461:10;55455:17;;;;:5;:17;;;;;:31;;:109;;;;55599:9;;-1:-1:-1;;;;;55599:9:0;;55621:67;;55599:9;;55664:4;55671:16;55621:22;:67::i;:::-;55718:10;;55699:48;;-1:-1:-1;;;;;55699:18:0;;;;55718:10;55730:16;55699:18;:48::i;:::-;55758:21;55782:8;55791:1;55782:11;;;;;;;;;;;;;;;;55840:10;55828:23;;:11;:23;;;:11;:23;;;55782:11;;;;;;;;-1:-1:-1;55862:13:0;55837:1;55862:10;:13::i;:::-;55890:11;;:15;55886:184;;55922:15;55940:67;55991:4;:15;;;55940:46;55981:4;55940:36;55956:4;:19;;;55940:4;:11;;;:15;;:36;;;;:::i;:46::-;:50;;:67::i;:::-;55922:85;;56022:36;56038:10;56050:7;56022:15;:36::i;:::-;55886:184;;56099:16;;;;:28;;56120:6;56099:20;:28::i;:::-;56080:16;;;:47;56152:11;;:23;;56168:6;56152:15;:23::i;:::-;56138:37;;;56220:19;;;;56204:46;;56245:4;;56204:36;;56138:37;56204:15;:36::i;:46::-;56186:4;:15;;:64;;;;56286:1;56274:10;-1:-1:-1;;;;;56266:30:0;;56289:6;56266:30;;;;;;:::i;:::-;;;;;;;;56312:28;56321:10;56333:6;56312:28;;;;;;;:::i;:::-;;;;;;;;54741:1607;;;;;;:::o;32489:49::-;;;;;;;;;;;;;;;:::o;52760:1021::-;33945:8;:15;52829:4;;33938:22;;33930:47;;;;-1:-1:-1;;;33930:47:0;;;;;;;:::i;:::-;52845:21:::1;52869:8;52878:4;52869:14;;;;;;;;;::::0;;;::::1;::::0;;;52918;;;:8:::1;:14:::0;;;;;;52933:10:::1;52918:26:::0;;;;;;;52959:5:::1;:17:::0;;;;;;:24:::1;;::::0;52869:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;52959:28:0;;;;:41:::1;;;52991:4;52999:1;52991:9;52959:41;52955:162;;;53016:13;:11;:13::i;:::-;53074:10;53068:17;::::0;;;:5:::1;:17;::::0;;;;:24:::1;;::::0;53052:11;;53097:7;;53052:41:::1;::::0;:11;:15:::1;:41::i;:::-;:52;;53044:61;;;::::0;::::1;;53135:11:::0;;:22;-1:-1:-1;53135:22:0::1;53127:53;;;;-1:-1:-1::0;;;53127:53:0::1;;;;;;;:::i;:::-;53191:16;53202:4;53191:10;:16::i;:::-;53237;::::0;::::1;::::0;:29:::1;::::0;53258:7;53237:20:::1;:29::i;:::-;53218:4;:16;;:48;;;;53277:15;53295:67;53346:4;:15;;;53295:46;53336:4;53295:36;53311:4;:19;;;53295:4;:11;;;:15;;:36;;;;:::i;:67::-;53388:12;::::0;::::1;::::0;53277:85;;-1:-1:-1;53388:25:0::1;::::0;53277:85;53388:16:::1;:25::i;:::-;53373:12;::::0;::::1;:40:::0;53438:11;;:24:::1;::::0;53454:7;53438:15:::1;:24::i;:::-;53424:38:::0;;;53507:19:::1;::::0;::::1;::::0;53491:46:::1;::::0;53532:4:::1;::::0;53491:36:::1;::::0;53424:38;53491:15:::1;:36::i;:46::-;53473:15;::::0;::::1;:64:::0;53560:12;;-1:-1:-1;;;;;53560:12:0::1;53548:175;;53604:28;::::0;:10:::1;::::0;:28;::::1;;;::::0;53624:7;;53604:28:::1;::::0;;;53624:7;53604:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53548:175;;;53665:12:::0;;:46:::1;::::0;-1:-1:-1;;;;;53665:12:0::1;53691:10;53703:7:::0;53665:25:::1;:46::i;:::-;53759:4;53747:10;-1:-1:-1::0;;;;;53738:35:0::1;;53765:7;53738:35;;;;;;:::i;:::-;;;;;;;;33988:1;;;52760:1021:::0;;;:::o;32184:41::-;;;;;;;;;;;;;:::o;32545:25::-;;;;:::o;32689:::-;;;-1:-1:-1;;;;;32689:25:0;;:::o;35590:346::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;35682:11:::1;35678:62;;;35710:18;:16;:18::i;:::-;35788:8;:19:::0;35768:15:::1;::::0;:57:::1;::::0;35813:11;;35768:40:::1;::::0;:19:::1;:40::i;:::-;:44:::0;::::1;:57::i;:::-;35750:15;:75:::0;35849:8:::1;:19:::0;35841:41:::1;::::0;::::1;::::0;::::1;::::0;35870:11;;35841:41:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;35893:8:0::1;:33:::0;35590:346::o;43382:445::-;43437:7;43480:17;;43461:15;:36;43458:76;;-1:-1:-1;43521:1:0;43514:8;;43458:76;43546:13;43602:6;43581:17;;43563:15;:35;43562:46;;;;;;;-1:-1:-1;43622:9:0;;43619:182;;43680:16;;43725:10;;-1:-1:-1;;;;;43725:10:0;43648:21;43718:18;;;:6;:18;;;;;;43672:24;;;;43718:34;-1:-1:-1;43718:71:0;;43778:10;;-1:-1:-1;;;;;43778:10:0;43771:18;;;;:6;:18;;;;;;43718:71;;;43755:13;43718:71;43711:78;;;;;;43619:182;43818:1;43811:8;;;43382:445;:::o;32657:24::-;;;-1:-1:-1;;;;;32657:24:0;;:::o;50994:756::-;33945:8;:15;51048:4;;33938:22;;33930:47;;;;-1:-1:-1;;;33930:47:0;;;;;;;:::i;:::-;51065:21:::1;51089:8;51098:4;51089:14;;;;;;;;;;;;;;;;;;51065:38;;51134:4;:20;;;51118:12;:36;51114:75;;51171:7;;;51114:75;51218:16;::::0;::::1;::::0;51249:13;51245:102:::1;;-1:-1:-1::0;51302:12:0::1;51279:20;::::0;;::::1;:35:::0;51329:7:::1;;51245:102;51357:18;51378:49;51392:4;:20;;;51414:12;51378:13;:49::i;:::-;51357:70;;51438:17;51458:111;51553:15;;51458:76;51518:4;:15;;;51458:41;51487:11;;51458:10;:28;;:41;;;;:::i;:::-;:59:::0;::::1;:76::i;:111::-;51438:131:::0;-1:-1:-1;51604:82:0::1;51642:33;51666:8:::0;51642:19:::1;51438:131:::0;51656:4:::1;51642:13;:19::i;:33::-;51604:19;::::0;::::1;::::0;;:23:::1;:82::i;:::-;51582:19;::::0;::::1;:104:::0;-1:-1:-1;;51728:12:0::1;51705:20;::::0;;::::1;:35:::0;;;;-1:-1:-1;33988:1:0::1;50994:756:::0;;:::o;44810:451::-;44883:18;;44864:15;:37;;44856:50;;;;-1:-1:-1;;;44856:50:0;;;;;;;:::i;:::-;44917:15;44935:34;44958:10;44935:22;:34::i;:::-;44917:52;;44998:1;44988:7;:11;44980:41;;;;-1:-1:-1;;;44980:41:0;;;;;;;:::i;:::-;45091:10;45075:27;;;;:15;:27;;;;;:40;;;:53;;45120:7;45075:44;:53::i;:::-;45048:10;45032:27;;;;:15;:27;;;;;;;:40;;;:96;;;;45182:15;45139:40;;;;:58;;;;45215:38;;;;;;45245:7;;45215:38;:::i;:::-;;;;;;;;44810:451;:::o;32902:32::-;;;;:::o;47755:543::-;47799:18;:16;:18::i;:::-;47990:10;47828:15;47974:27;;;:15;:27;;;;;:38;;;;47935:23;;47892:38;;47846:168;;47892:121;;47974:38;47892:77;;47964:4;;47892:67;;:42;:67::i;:121::-;47862:10;47846:27;;;;:15;:27;;;;;:41;;;;:45;:168::i;:::-;47828:186;;48043:1;48033:7;:11;48025:33;;;;-1:-1:-1;;;48025:33:0;;;;;;;:::i;:::-;48085:10;48113:1;48069:27;;;:15;:27;;;;;:41;;;:45;;;;48209:23;;48166:38;;:77;;48238:4;;48166:67;;:42;:67::i;:77::-;48141:10;48125:27;;;;:15;:27;;;;;:38;;:118;;;;48254:36;;48282:7;48254:15;:36::i;:::-;47755:543;:::o;49343:375::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;33945:8:::1;:15:::0;49439:4;;33938:22;::::1;33930:47;;;;-1:-1:-1::0;;;33930:47:0::1;;;;;;;:::i;:::-;49460:11:::2;49456:62;;;49488:18;:16;:18::i;:::-;49546:63;49597:11;49546:46;49566:8;49575:4;49566:14;;;;;;;;;;;;;;;;;;:25;;;49546:15;;:19;;:46;;;;:::i;:63::-;49528:15;:81;;;;49648:11;49620:8;49629:4;49620:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;49675:35;49679:4;49685:11;49698;49675:35;;;;;;;;:::i;:::-;;;;;;;;20229:1:::1;49343:375:::0;;;:::o;49730:215::-;49793:8;:15;49776:14;49819:85;49847:6;49841:3;:12;49819:85;;;49877:15;49888:3;49877:10;:15::i;:::-;49855:5;;49819:85;;;-1:-1:-1;49919:18:0;;;;;;;49730:215;:::o;35944:508::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;36172:11:::1;:26:::0;;;;36209:12:::1;:28:::0;;;;36248:18:::1;:40:::0;;;;36299:7:::1;:18:::0;36328:17:::1;:38:::0;36377:9:::1;:22:::0;36410:34:::1;;:15;:34:::0;35944:508::o;23348:119::-;-1:-1:-1;;;;;23441:18:0;23414:7;23441:18;;;;;;;;;;;;23348:119::o;20589:148::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;20680:6:::1;::::0;20659:40:::1;::::0;20696:1:::1;::::0;20680:6:::1;::::0;::::1;-1:-1:-1::0;;;;;20680:6:0::1;::::0;20659:40:::1;::::0;20696:1;;20659:40:::1;20710:6;:19:::0;;-1:-1:-1;;;;;;20710:19:0::1;::::0;;20589:148::o;32107:31::-;;;;:::o;53789:578::-;33945:8;:15;53853:4;;33938:22;;33930:47;;;;-1:-1:-1;;;33930:47:0;;;;;;;:::i;:::-;53870:21:::1;53894:8;53903:4;53894:14;;;;;;;;;::::0;;;::::1;::::0;;;53943;;;:8:::1;:14:::0;;;;;;53958:10:::1;53943:26:::0;;;;;;;53894:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;53980:16:0::1;53952:4:::0;53980:10:::1;:16::i;:::-;54007:15;54025:85;54042:67;54093:4;:15;;;54042:46;54083:4;54042:36;54058:4;:19;;;54042:4;:11;;;:15;;:36;;;;:::i;:67::-;54025:12;::::0;::::1;::::0;;:16:::1;:85::i;:::-;54007:103:::0;-1:-1:-1;54125:11:0;;54121:80:::1;;54153:36;54169:10;54181:7;54153:15;:36::i;:::-;54226:1;54211:12;::::0;::::1;:16:::0;54272:19:::1;::::0;::::1;::::0;54256:11;;:46:::1;::::0;54297:4:::1;::::0;54256:36:::1;::::0;:15:::1;:36::i;:46::-;54238:15;::::0;::::1;:64:::0;54318:41:::1;::::0;::::1;::::0;::::1;::::0;54339:10:::1;::::0;54351:7;;54318:41:::1;:::i;:::-;;;;;;;;33988:1;;;53789:578:::0;;:::o;32273:33::-;;;;:::o;32145:32::-;;;;:::o;31998:24::-;;;;;;;;;;:::o;32423:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45269:817::-;-1:-1:-1;;;;;45362:24:0;;45339:7;45362:24;;;:15;:24;;;;;:37;;;45359:82;;-1:-1:-1;45428:1:0;45421:8;;45359:82;45475:18;;45456:15;:37;;:97;;;-1:-1:-1;;;;;;45516:24:0;;;;;;:15;:24;;;;;:37;;;45497:15;:56;;45456:97;45453:137;;;-1:-1:-1;45577:1:0;45570:8;;45453:137;-1:-1:-1;;;;;45642:24:0;;45602:16;45642:24;;;:15;:24;;;;;:37;;;45621:18;;:58;:119;;-1:-1:-1;;;;;45703:24:0;;;;;;:15;:24;;;;;:37;;;45621:119;;;45682:18;;45621:119;45602:138;;45751:13;31125:6;45786:8;45768:15;:26;45767:35;;;;;;;-1:-1:-1;45818:9:0;;45815:245;;45844:21;45868:49;45901:15;;45868:28;45890:5;45868:17;;:21;;:28;;;;:::i;:49::-;-1:-1:-1;;;;;45939:24:0;;;;;;:15;:24;;;;;:37;;;45844:73;;-1:-1:-1;45939:53:0;-1:-1:-1;45939:109:0;;-1:-1:-1;;;;;46011:24:0;;;;;;:15;:24;;;;;:37;;;45939:109;;;45995:13;45939:109;45932:116;;;;;;;45815:245;-1:-1:-1;46077:1:0;;45269:817;-1:-1:-1;;;45269:817:0:o;19947:79::-;20012:6;;;;;-1:-1:-1;;;;;20012:6:0;;19947:79::o;32351:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22312:87::-;22384:7;22377:14;;;;;;;;-1:-1:-1;;22377:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22351:13;;22377:14;;22384:7;;22377:14;;22384:7;22377:14;;;;;;;;;;;;;;;;;;;;;;;;57820:1030;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;57927:4:::1;::::0;-1:-1:-1;;;57927:4:0;::::1;;;57926:5;57918:14;;;::::0;::::1;;57964:1;57951:3;:10;:14;57943:23;;;::::0;::::1;;57999:6;:13;57985:3;:10;:27;57977:36;;;::::0;::::1;;58024:11;58050:15:::0;58076:14;58107:9:::1;58103:522;58126:3;:10;58122:1;:14;58103:522;;;58166:6;58173:1;58166:9;;;;;;;;;;;;;;58157:18;;58200:3;58204:1;58200:6;;;;;;;;;;;;;;58190:16;;58227:15;58235:6;58227:3;:7;;:15;;;;:::i;:::-;-1:-1:-1::0;;;;;58261:14:0;::::1;;::::0;;;:5:::1;:14;::::0;;;;;;;:32;;;58308:21:::1;::::0;::::1;:30:::0;;;58384:18:::1;::::0;58353:28:::1;::::0;;::::1;:49:::0;58449:11;:20;;;;;58498:11;;58221:21;;-1:-1:-1;58449:20:0;58498:23:::1;::::0;58261:32;58498:15:::1;:23::i;:::-;58484:37:::0;;58541:27:::1;::::0;58558:1:::1;::::0;-1:-1:-1;;;;;58541:27:0;::::1;::::0;::::1;::::0;::::1;::::0;58561:6;;58541:27:::1;:::i;:::-;;;;;;;;58588:25;58597:7;58606:6;58588:25;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;58138:3:0::1;;58103:522;;;-1:-1:-1::0;58655:17:0::1;::::0;:26:::1;::::0;58677:3;58655:21:::1;:26::i;:::-;58635:17;:46:::0;;;58721:7:::1;::::0;-1:-1:-1;58700:28:0::1;58692:49;;;;-1:-1:-1::0;;;58692:49:0::1;;;;;;;:::i;:::-;58752:21;58776:8;58785:1;58776:11;;;;;;;;;;;;;;;;;;58752:35;;58817:25;58838:3;58817:4;:16;;;:20;;:25;;;;:::i;:::-;58798:16;::::0;;::::1;:44:::0;-1:-1:-1;;;;;57820:1030:0:o;57033:630::-;-1:-1:-1;;;;;57120:14:0;;57097:7;57120:14;;;:5;:14;;;;;:23;57117:68;;-1:-1:-1;57172:1:0;57165:8;;57117:68;57217:18;;57198:15;:37;;:87;;;-1:-1:-1;;;;;;57257:14:0;;;;;;:5;:14;;;;;:28;;;57239:15;:46;57198:87;57195:127;;;-1:-1:-1;57309:1:0;57302:8;;57195:127;-1:-1:-1;;;;;57369:14:0;;57334:13;57369:14;;;:5;:14;;;;;:28;;;31125:6;;57351:15;:46;57350:55;;-1:-1:-1;57421:9:0;;57418:219;;57510:15;;-1:-1:-1;;;;;57471:14:0;;57447:21;57471:14;;;:5;:14;;;;;:23;57447:21;;57471:55;;:34;;57499:5;57471:27;:34::i;:55::-;-1:-1:-1;;;;;57548:14:0;;;;;;:5;:14;;;;;:21;;;57447:79;;-1:-1:-1;57548:37:0;-1:-1:-1;57548:77:0;;-1:-1:-1;;;;;57604:14:0;;;;;;:5;:14;;;;;:21;;;57548:77;;;57588:13;57548:77;57541:84;;;;;;57418:219;-1:-1:-1;57654:1:0;;57033:630;-1:-1:-1;;57033:630:0:o;56496:124::-;56536:15;56554:28;56571:10;56554:16;:28::i;:::-;56536:46;;56593:19;56602:1;56604:7;56593:8;:19::i;26318:269::-;26411:4;26428:129;26437:12;:10;:12::i;:::-;26451:7;26460:96;26499:15;26460:96;;;;;;;;;;;;;;;;;:11;:25;26472:12;:10;:12::i;:::-;-1:-1:-1;;;;;26460:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;26460:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;23680:175::-;23766:4;23783:42;23793:12;:10;:12::i;:::-;23807:9;23818:6;23783:9;:42::i;32233:32::-;;;;:::o;46832:887::-;46922:23;;46975:20;;47025:24;;46877:7;;46922:23;46975:20;47010:12;:39;:56;;;;-1:-1:-1;47053:13:0;;;47010:56;47006:491;;;47083:18;47104:102;47136:8;:24;;;47179:12;47104:13;:102::i;:::-;47083:123;;47221:17;47241:127;47352:15;;47241:88;47309:8;:19;;;47241:45;47274:11;;47241:10;:32;;:45;;;;:::i;:127::-;47221:147;-1:-1:-1;47400:85:0;47437:33;47461:8;47437:19;47221:147;47451:4;47437:13;:19::i;:33::-;47400:14;;:18;:85::i;:::-;47383:102;;47006:491;;;47662:10;47509:15;47646:27;;;:15;:27;;;;;:38;;;;47573;;47527:159;;47573:112;;:68;;47636:4;;47573:58;;47616:14;47573:42;:58::i;47527:159::-;47509:177;-1:-1:-1;;;;46832:887:0;:::o;33754:91::-;33793:17;33829:8;33822:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33822:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33754:91;:::o;43050:71::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;43100:13:::1;:11;:13::i;:::-;43050:71::o:0;43851:951::-;43930:10;;-1:-1:-1;;;;;43930:10:0;43916;:24;43908:46;;;;-1:-1:-1;;;43908:46:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43973:24:0;;43992:4;43973:24;;43965:33;;;;;;44028:10;;-1:-1:-1;;;;;44017:21:0;;;44028:10;;44017:21;;44009:30;;;;;;-1:-1:-1;;;;;44059:26:0;;;;;;:17;:26;;;;;;;;44058:27;44050:36;;;;;;-1:-1:-1;;;;;44105:24:0;;;;;;:15;:24;;;;;:37;;;:42;44097:82;;;;-1:-1:-1;;;44097:82:0;;;;;;;:::i;:::-;44190:43;44206:7;44215:17;;44190:15;:43::i;:::-;-1:-1:-1;;;;;44244:26:0;;;;;;:17;:26;;;;;:33;;-1:-1:-1;;44244:33:0;44273:4;44244:33;;;44326:18;44262:7;44326:9;:18::i;:::-;-1:-1:-1;;;;;44288:24:0;;;;;;:15;:24;;;;;:56;;;44395:17;;44355:37;;;;:57;44481:18;;44463:15;:36;:75;;44520:18;;44463:75;;;44502:15;44463:75;-1:-1:-1;;;;;44423:24:0;;;;;;:15;:24;;;;;:37;;;:115;;;;44549:38;;;:42;44680:23;;44640:35;;:74;;44709:4;;44640:64;;:39;:64::i;:74::-;-1:-1:-1;;;;;44602:24:0;;;;;;:15;:24;;;;;:35;;:112;44748:44;44773:18;44618:7;44773:9;:18::i;:::-;44748:20;;;:24;:44::i;:::-;44725:20;:67;-1:-1:-1;43851:951:0:o;23918:151::-;-1:-1:-1;;;;;24034:18:0;;;24007:7;24034:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23918:151::o;32578:26::-;;;;:::o;31942:16::-;;;-1:-1:-1;;;31942:16:0;;;;;:::o;32612:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51771:981::-;33945:8;:15;51839:4;;33938:22;;33930:47;;;;-1:-1:-1;;;33930:47:0;;;;;;;:::i;:::-;51868:9;;;:22:::1;;;51881:4;51889:1;51881:9;51868:22;51864:109;;;51934:9;;51915:15;:28;;51907:54;;;;-1:-1:-1::0;;;51907:54:0::1;;;;;;;:::i;:::-;51983:21;52007:8;52016:4;52007:14;;;;;;;;;::::0;;;::::1;::::0;;;52056;;;:8:::1;:14:::0;;;;;;52071:10:::1;52056:26:::0;;;;;;;52007:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;52093:16:0::1;52065:4:::0;52093:10:::1;:16::i;:::-;52124:11:::0;;:15;52120:188:::1;;52156:15;52174:67;52225:4;:15;;;52174:46;52215:4;52174:36;52190:4;:19;;;52174:4;:11;;;:15;;:36;;;;:::i;:67::-;52271:12;::::0;::::1;::::0;52156:85;;-1:-1:-1;52271:25:0::1;::::0;52156:85;52271:16:::1;:25::i;:::-;52256:12;::::0;::::1;:40:::0;-1:-1:-1;52120:188:0::1;52330:12:::0;;-1:-1:-1;;;;;52330:12:0::1;52318:194;;52384:9;52374:19;;52318:194;;;52426:12:::0;;:74:::1;::::0;-1:-1:-1;;;;;52426:12:0::1;52464:10;52485:4;52492:7:::0;52426:29:::1;:74::i;:::-;52541:16;::::0;::::1;::::0;:29:::1;::::0;52562:7;52541:20:::1;:29::i;:::-;52522:16;::::0;::::1;:48:::0;52595:11;;:24:::1;::::0;52611:7;52595:15:::1;:24::i;:::-;52581:38:::0;;;52664:19:::1;::::0;::::1;::::0;52648:46:::1;::::0;52689:4:::1;::::0;52648:36:::1;::::0;52581:38;52648:15:::1;:36::i;:46::-;52630:15;::::0;::::1;:64:::0;52710:34:::1;::::0;52730:4;;52718:10:::1;::::0;52710:34:::1;::::0;::::1;::::0;52736:7;;52710:34:::1;:::i;:::-;;;;;;;;33988:1;;51771:981:::0;;;:::o;32314:30::-;;;;:::o;20892:244::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20981:22:0;::::1;20973:73;;;;-1:-1:-1::0;;;20973:73:0::1;;;;;;;:::i;:::-;21083:6;::::0;21062:38:::1;::::0;-1:-1:-1;;;;;21062:38:0;;::::1;::::0;21083:6:::1;::::0;::::1;;::::0;21062:38:::1;::::0;;;::::1;21111:6;:17:::0;;-1:-1:-1;;;;;21111:17:0;;::::1;;;-1:-1:-1::0;;;;;;21111:17:0;;::::1;::::0;;;::::1;::::0;;20892:244::o;50086:900::-;33945:8;:15;50176:7;;50161:4;;33938:22;;33930:47;;;;-1:-1:-1;;;33930:47:0;;;;;;;:::i;:::-;50196:21:::1;50220:8;50229:4;50220:14;;;;;;;;;::::0;;;::::1;::::0;;;50269;;;:8:::1;:14:::0;;;;;;-1:-1:-1;;;;;50269:21:0;::::1;::::0;;;;;;;50326:19:::1;50220:14;::::0;;::::1;::::0;;::::1;50326:19:::0;;::::1;::::0;50375:16:::1;::::0;::::1;::::0;50421:20:::1;::::0;::::1;::::0;50220:14;;-1:-1:-1;50326:19:0;;50406:12:::1;:35;:52:::0;::::1;;;-1:-1:-1::0;50445:13:0;;::::1;50406:52;50402:479;;;50475:18;50496:98;50528:4;:20;;;50567:12;50496:13;:98::i;:::-;50475:119;;50609:17;50629:123;50736:15;;50629:84;50697:4;:15;;;50629:45;50662:11;;50629:10;:32;;:45;;;;:::i;:123::-;50609:143:::0;-1:-1:-1;50784:85:0::1;50821:33;50845:8:::0;50821:19:::1;50609:143:::0;50835:4:::1;50821:13;:19::i;50784:85::-;50767:102;;50402:479;;;50898:80;50962:4;:15;;;50898:59;50915:41;50951:4;50915:31;50931:14;50915:4;:11;;;:15;;:31;;;;:::i;:41::-;50898:12;::::0;::::1;::::0;;:16:::1;:59::i;:80::-;50891:87:::0;50086:900;-1:-1:-1;;;;;;;;50086:900:0:o;57716:66::-;20169:12;:10;:12::i;:::-;20159:6;;;;;-1:-1:-1;;;;;20159:6:0;;;:22;;;20151:67;;;;-1:-1:-1;;;20151:67:0;;;;;;;:::i;:::-;57763:4:::1;:11:::0;;-1:-1:-1;;;;57763:11:0::1;-1:-1:-1::0;;;57763:11:0::1;::::0;;57716:66::o;939:181::-;997:7;1029:5;;;1053:6;;;;1045:46;;;;-1:-1:-1;;;1045:46:0;;;;;;;:::i;1842:192::-;1928:7;1964:12;1956:6;;;;1948:29;;;;-1:-1:-1;;;1948:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;2000:5:0;;;1842:192::o;1403:136::-;1461:7;1488:43;1492:1;1495;1488:43;;;;;;;;;;;;;;;;;:3;:43::i;2293:471::-;2351:7;2596:6;2592:47;;-1:-1:-1;2626:1:0;2619:8;;2592:47;2663:5;;;2667:1;2663;:5;:1;2687:5;;;;;:10;2679:56;;;;-1:-1:-1;;;2679:56:0;;;;;;;:::i;3240:132::-;3298:7;3325:39;3329:1;3332;3325:39;;;;;;;;;;;;;;;;;:3;:39::i;5421:106::-;5509:10;5421:106;:::o;29465:346::-;-1:-1:-1;;;;;29567:19:0;;29559:68;;;;-1:-1:-1;;;29559:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29646:21:0;;29638:68;;;;-1:-1:-1;;;29638:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29719:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;29771:32;;;;;29749:6;;29771:32;:::i;:::-;;;;;;;;29465:346;;;:::o;48308:270::-;48394:8;:15;48377:14;48420:151;48448:6;48442:3;:12;48420:151;;;48507:8;-1:-1:-1;;;;;48482:33:0;:8;48491:3;48482:13;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;48482:21:0;:33;48478:82;;;48536:8;;;48478:82;48456:5;;48420:151;;;;48308:270;;:::o;41752:1065::-;-1:-1:-1;;;;;41866:20:0;;41858:70;;;;-1:-1:-1;;;41858:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41947:23:0;;41939:71;;;;-1:-1:-1;;;41939:71:0;;;;;;;:::i;:::-;42035:10;;-1:-1:-1;;;;;42025:20:0;;;42035:10;;42025:20;42021:171;;;42063:40;42077:6;42085:9;42096:6;42063:13;:40::i;:::-;42140:9;-1:-1:-1;;;;;42123:35:0;42132:6;-1:-1:-1;;;;;42123:35:0;;42151:6;42123:35;;;;;;:::i;:::-;;;;;;;;42173:7;;42021:171;-1:-1:-1;;;;;42206:25:0;;;;;;:17;:25;;;;;;;;42202:180;;;42248:44;42266:6;42274:9;42285:6;42248:17;:44::i;42202:180::-;-1:-1:-1;;;;;42396:28:0;;;;;;:17;:28;;;;;;;;42392:180;;;42442:42;42458:6;42466:9;42477:6;42442:15;:42::i;42392:180::-;42609:71;42631:6;42609:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42609:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;42589:17:0;;;:9;:17;;;;;;;;;;;:91;;;;42714:20;;;;;;;:32;;42739:6;42714:24;:32::i;:::-;-1:-1:-1;;;;;42691:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;42764:35;;;;;;;;;;42792:6;;42764:35;:::i;16560:205::-;16661:96;16681:5;16711:27;;;16740:4;16746:2;16750:5;16688:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16688:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;16688:68:0;-1:-1:-1;;;;;;16688:68:0;;;;;;;;;;16661:19;:96::i;:::-;16560:205;;;;:::o;16375:177::-;16458:86;16478:5;16508:23;;;16533:2;16537:5;16485:58;;;;;;;;;:::i;54375:358::-;54450:21;54474:8;54483:1;54474:11;;;;;;;;;;;;;;;;;;54450:35;;54496:14;54513:46;54542:4;:16;;;54513:24;54531:4;54513:9;:24::i;:46::-;54496:63;;54584:6;54574:7;:16;54570:156;;;54607:36;54625:4;54631:3;54636:6;54607:9;:36::i;:::-;54570:156;;;54676:38;54694:4;54701:3;54706:7;54676:9;:38::i;56628:397::-;56698:18;;56679:15;:37;;56671:60;;;;-1:-1:-1;;;56671:60:0;;;;;;;:::i;:::-;56742:15;56760:28;56777:10;56760:16;:28::i;:::-;56742:46;;56817:1;56807:7;:11;56799:20;;;;;;56850:17;;:30;;56872:7;56850:21;:30::i;:::-;56830:17;:50;;;56925:10;56919:17;;;;:5;:17;;;;;;:24;;;:37;;56948:7;56919:28;:37::i;:::-;56898:10;56892:17;;;;:5;:17;;;;;:24;;;:64;;;;57001:15;56967:31;;;;:49;-1:-1:-1;56628:397:0:o;49951:129::-;50025:7;50052:14;:3;50060:5;50052:7;:14::i;46120:680::-;46188:24;;46172:12;:40;46168:79;;46229:7;;46168:79;46261:20;;46257:118;;46330:12;46303:24;:39;46357:7;;46257:118;46387:18;46408:53;46422:8;:24;;;46448:12;46408:13;:53::i;:::-;46387:74;;46472:17;46492:115;46591:15;;46492:80;46552:8;:19;;;46492:41;46521:11;;46492:10;:28;;:41;;;;:::i;:115::-;46716:20;;46472:135;;-1:-1:-1;46664:74:0;;46692:45;;:19;46472:135;46706:4;46692:13;:19::i;:45::-;46664:23;;;:27;:74::i;:::-;46638:23;:100;-1:-1:-1;;46778:12:0;46751:24;:39;46120:680::o;43129:245::-;43172:15;43190:24;:22;:24::i;:::-;43253:10;;-1:-1:-1;;;;;43253:10:0;43246:18;;;;:6;:18;;;;;;43172:42;;-1:-1:-1;43246:31:0;;43172:42;43246:22;:31::i;:::-;43232:10;;;-1:-1:-1;;;;;43232:10:0;;;43225:18;;;;:6;:18;;;;;;;:52;;;;43308:15;43288:17;:35;43346:10;;43339:27;;;;;;43346:10;;43358:7;;43339:27;:::i;3868:278::-;3954:7;3989:12;3982:5;3974:28;;;;-1:-1:-1;;;3974:28:0;;;;;;;;:::i;:::-;;4013:9;4029:1;4025;:5;;;;;;;3868:278;-1:-1:-1;;;;;3868:278:0:o;36762:1196::-;-1:-1:-1;;;;;36896:14:0;;36856:15;36896:14;;;:6;:14;;;;;;36874:37;;:17;36903:6;36874:9;:17::i;:37::-;36856:55;;36941:6;36930:7;:17;;36922:26;;;;;;-1:-1:-1;;;;;36963:28:0;;;;;;:17;:28;;;;;;;;36959:992;;;37009:18;:16;:18::i;:::-;-1:-1:-1;;;;;37212:26:0;;;;;;:15;:26;;;;;:37;;;;37173:23;;37131:37;;37086:165;;37131:119;;37212:37;37131:76;;37202:4;;37131:66;;:41;:66::i;:119::-;-1:-1:-1;;;;;37086:26:0;;;;;;:15;:26;;;;;:40;;;;:44;:165::i;:::-;37043:15;:26;37059:9;-1:-1:-1;;;;;37043:26:0;-1:-1:-1;;;;;37043:26:0;;;;;;;;;;;;:40;;:208;;;;37300:71;37322:6;37300:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37300:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;37280:17:0;;;:9;:17;;;;;;;;;;;:91;;;;37409:20;;;;;;;:32;;37434:6;37409:24;:32::i;:::-;-1:-1:-1;;;;;37386:20:0;;:9;:20;;;;;;;;;;:55;37479:20;;:32;;37504:6;37479:24;:32::i;:::-;37456:20;:55;-1:-1:-1;;;;;37566:26:0;;;;;;:15;:26;;;;;:37;:49;;37608:6;37566:41;:49::i;:::-;-1:-1:-1;;;;;37526:26:0;;;;;;:15;:26;;;;;:89;;;37712:23;;37670:76;;37741:4;;37670:66;;37526:89;37670:41;:66::i;:76::-;-1:-1:-1;;;;;37630:26:0;;;;;;:15;:26;;;;;:37;;:116;36959:992;;;37798:71;37820:6;37798:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37798:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;37778:17:0;;;:9;:17;;;;;;;;;;;:91;;;;37907:20;;;;;;;:32;;37932:6;37907:24;:32::i;:::-;-1:-1:-1;;;;;37884:20:0;;:9;:20;;;;;;;;;;:55;36762:1196;;;;:::o;37964:2931::-;38062:18;:16;:18::i;:::-;-1:-1:-1;;;;;38131:23:0;;38091:15;38131:23;;;:15;:23;;;;;:36;;;38109:59;;:17;38147:6;38109:9;:17::i;:59::-;38091:77;;38199:6;38188:7;:17;;38180:26;;;;;;-1:-1:-1;;;;;38221:28:0;;;;;;:17;:28;;;;;;;;38217:2671;;;-1:-1:-1;;;;;38425:23:0;;;;;;:15;:23;;;;;:34;;;;38386:23;;38347:34;;38305:156;;38347:113;;38425:34;38347:73;;38415:4;;38347:63;;:38;:63::i;:113::-;-1:-1:-1;;;;;38305:23:0;;;;;;:15;:23;;;;;:37;;;;:41;:156::i;:::-;-1:-1:-1;;;;;38265:23:0;;;;;;;:15;:23;;;;;;:37;;:196;;;;38645:26;;;;;;:37;;;;38606:23;;38564:37;;38519:165;;38564:119;;38645:37;38564:76;;38635:4;;38564:66;;:41;:66::i;38519:165::-;38476:15;:26;38492:9;-1:-1:-1;;;;;38476:26:0;-1:-1:-1;;;;;38476:26:0;;;;;;;;;;;;:40;;:208;;;;38733:71;38755:6;38733:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38733:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;38713:17:0;;;:9;:17;;;;;;;;;;;:91;;;;38842:20;;;;;;;:32;;38867:6;38842:24;:32::i;:::-;-1:-1:-1;;;;;38819:20:0;;:9;:20;;;;;;;;;;;:55;;;;38929:15;:26;;;:37;:49;;38971:6;38929:41;:49::i;:::-;-1:-1:-1;;;;;38889:26:0;;;;;;:15;:26;;;;;:89;;;39075:23;;39033:76;;39104:4;;39033:66;;38889:89;39033:41;:66::i;:76::-;-1:-1:-1;;;;;38993:26:0;;;;;;;:15;:26;;;;;;:37;;:116;;;;39161:23;;;;;;:34;:46;;39200:6;39161:38;:46::i;:::-;-1:-1:-1;;;;;39124:23:0;;;;;;:15;:23;;;;;:83;;;39298:23;;39259:73;;39327:4;;39259:63;;39124:83;39259:38;:63::i;:73::-;-1:-1:-1;;;;;39222:23:0;;;;;;:15;:23;;;;;:34;;;:110;;;;39351:34;39388:11;-1:-1:-1;39347:410:0;;;-1:-1:-1;;;;;39420:25:0;;39448:5;39420:25;;;:17;:25;;;;;;;;:33;;-1:-1:-1;;39420:33:0;;;39520:15;:23;;;;;:34;39495:20;;:60;;:24;:60::i;:::-;39472:20;:83;-1:-1:-1;;;;;39574:23:0;;39611:1;39574:23;;;:15;:23;;;;;:38;;;39707:23;;39668:73;;39736:4;;39668:63;;39611:1;39668:38;:63::i;:73::-;-1:-1:-1;;;;;39631:23:0;;;;;;:15;:23;;;;;:34;;:110;38217:2671;;;-1:-1:-1;;;;;39947:23:0;;;;;;:15;:23;;;;;:34;;;;39908:23;;39869:34;;39827:156;;39869:113;;39947:34;39869:73;;39937:4;;39869:63;;:38;:63::i;39827:156::-;39787:15;:23;39803:6;-1:-1:-1;;;;;39787:23:0;-1:-1:-1;;;;;39787:23:0;;;;;;;;;;;;:37;;:196;;;;40018:71;40040:6;40018:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40018:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;39998:17:0;;;:9;:17;;;;;;;;;;;:91;;;;40127:20;;;;;;;:32;;40152:6;40127:24;:32::i;:::-;-1:-1:-1;;;;;40104:20:0;;:9;:20;;;;;;;;;;:55;40197:20;;:32;;40222:6;40197:24;:32::i;:::-;40174:20;:55;-1:-1:-1;;;;;40281:23:0;;;;;;:15;:23;;;;;:34;:46;;40320:6;40281:38;:46::i;:::-;-1:-1:-1;;;;;40244:23:0;;;;;;:15;:23;;;;;:83;;;40418:23;;40379:73;;40447:4;;40379:63;;40244:83;40379:38;:63::i;:73::-;-1:-1:-1;;;;;40342:23:0;;;;;;:15;:23;;;;;:34;;;:110;;;;40471:34;40508:11;-1:-1:-1;40467:410:0;;;-1:-1:-1;;;;;40540:25:0;;40568:5;40540:25;;;:17;:25;;;;;;;;:33;;-1:-1:-1;;40540:33:0;;;40640:15;:23;;;;;:34;40615:20;;:60;;:24;:60::i;:::-;40592:20;:83;-1:-1:-1;;;;;40694:23:0;;40731:1;40694:23;;;:15;:23;;;;;:38;;;40827:23;;40788:73;;40856:4;;40788:63;;40731:1;40788:38;:63::i;:73::-;-1:-1:-1;;;;;40751:23:0;;;;;;:15;:23;;;;;:34;;:110;37964:2931;;;;:::o;40901:843::-;41001:18;:16;:18::i;:::-;-1:-1:-1;;;;;41203:26:0;;;;;;:15;:26;;;;;:37;;;;41164:23;;41122:37;;41077:165;;41122:119;;41203:37;41122:76;;41193:4;;41122:66;;:41;:66::i;:119::-;-1:-1:-1;;;;;41077:26:0;;;;;;:15;:26;;;;;:40;;;;:44;:165::i;:::-;41034:15;:26;41050:9;-1:-1:-1;;;;;41034:26:0;-1:-1:-1;;;;;41034:26:0;;;;;;;;;;;;:40;;:208;;;;41290:71;41312:6;41290:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41290:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;41270:17:0;;;:9;:17;;;;;;;;;;;:91;;;;41399:20;;;;;;;:32;;41424:6;41399:24;:32::i;:::-;-1:-1:-1;;;;;41376:20:0;;:9;:20;;;;;;;;;;:55;41469:20;;:32;;41494:6;41469:24;:32::i;:::-;41446:20;:55;-1:-1:-1;;;;;41556:26:0;;;;;;:15;:26;;;;;:37;:49;;41598:6;41556:41;:49::i;:::-;-1:-1:-1;;;;;41516:26:0;;;;;;:15;:26;;;;;:89;;;41702:23;;41660:76;;41731:4;;41660:66;;41516:89;41660:41;:66::i;:76::-;-1:-1:-1;;;;;41620:26:0;;;;;;;:15;:26;;;;;:37;;:116;;;;-1:-1:-1;;40901:843:0:o;18680:761::-;19104:23;19130:69;19158:4;19130:69;;;;;;;;;;;;;;;;;19138:5;-1:-1:-1;;;;;19130:27:0;;;:69;;;;;:::i;:::-;19214:17;;19104:95;;-1:-1:-1;19214:21:0;19210:224;;19356:10;19345:30;;;;;;;;;;;;:::i;:::-;19337:85;;;;-1:-1:-1;;;19337:85:0;;;;;;;:::i;9303:195::-;9406:12;9438:52;9460:6;9468:4;9474:1;9477:12;9438:21;:52::i;:::-;9431:59;9303:195;-1:-1:-1;;;;9303:195:0:o;10355:530::-;10482:12;10540:5;10515:21;:30;;10507:81;;;;-1:-1:-1;;;10507:81:0;;;;;;;:::i;:::-;10607:18;10618:6;10607:10;:18::i;:::-;10599:60;;;;-1:-1:-1;;;10599:60:0;;;;;;;:::i;:::-;10733:12;10747:23;10774:6;-1:-1:-1;;;;;10774:11:0;10794:5;10802:4;10774:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10732:75;;;;10825:52;10843:7;10852:10;10864:12;10825:17;:52::i;:::-;10818:59;10355:530;-1:-1:-1;;;;;;;10355:530:0:o;6385:422::-;6752:20;6791:8;;;6385:422::o;12895:742::-;13010:12;13039:7;13035:595;;;-1:-1:-1;13070:10:0;13063:17;;13035:595;13184:17;;:21;13180:439;;13447:10;13441:17;13508:15;13495:10;13491:2;13487:19;13480:44;13395:148;13590:12;13583:20;;-1:-1:-1;;;13583:20:0;;;;;;;;:::i;893:707:-1:-;;1010:3;1003:4;995:6;991:17;987:27;977:2;;-1:-1;;1018:12;977:2;1065:6;1052:20;1087:80;1102:64;1159:6;1102:64;:::i;:::-;1087:80;:::i;:::-;1195:21;;;1078:89;-1:-1;1239:4;1252:14;;;;1227:17;;;1341;;;1332:27;;;;1329:36;-1:-1;1326:2;;;1378:1;;1368:12;1326:2;1403:1;1388:206;1413:6;1410:1;1407:13;1388:206;;;2106:20;;1481:50;;1545:14;;;;1573;;;;1435:1;1428:9;1388:206;;;1392:14;;;;;970:630;;;;:::o;2311:241::-;;2415:2;2403:9;2394:7;2390:23;2386:32;2383:2;;;-1:-1;;2421:12;2383:2;85:6;72:20;97:33;124:5;97:33;:::i;2559:366::-;;;2680:2;2668:9;2659:7;2655:23;2651:32;2648:2;;;-1:-1;;2686:12;2648:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2738:63;-1:-1;2838:2;2877:22;;72:20;97:33;72:20;97:33;:::i;:::-;2846:63;;;;2642:283;;;;;:::o;2932:491::-;;;;3070:2;3058:9;3049:7;3045:23;3041:32;3038:2;;;-1:-1;;3076:12;3038:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3128:63;-1:-1;3228:2;3267:22;;72:20;97:33;72:20;97:33;:::i;:::-;3032:391;;3236:63;;-1:-1;;;3336:2;3375:22;;;;2106:20;;3032:391::o;3430:366::-;;;3551:2;3539:9;3530:7;3526:23;3522:32;3519:2;;;-1:-1;;3557:12;3519:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3609:63;3709:2;3748:22;;;;2106:20;;-1:-1;;;3513:283::o;3803:638::-;;;3974:2;3962:9;3953:7;3949:23;3945:32;3942:2;;;-1:-1;;3980:12;3942:2;4038:17;4025:31;4076:18;;4068:6;4065:30;4062:2;;;-1:-1;;4098:12;4062:2;4189:6;4178:9;4174:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;4118:88;;-1:-1;4256:18;;4243:32;;-1:-1;;;4284:30;;;4281:2;;;-1:-1;;4317:12;4281:2;;4347:78;4417:7;4408:6;4397:9;4393:22;4347:78;:::i;:::-;4337:88;;;3936:505;;;;;:::o;4448:257::-;;4560:2;4548:9;4539:7;4535:23;4531:32;4528:2;;;-1:-1;;4566:12;4528:2;1820:6;1814:13;1832:30;1856:5;1832:30;:::i;4712:241::-;;4816:2;4804:9;4795:7;4791:23;4787:32;4784:2;;;-1:-1;;4822:12;4784:2;-1:-1;2106:20;;4778:175;-1:-1;4778:175::o;4960:366::-;;;5081:2;5069:9;5060:7;5056:23;5052:32;5049:2;;;-1:-1;;5087:12;5049:2;5170:22;2106:20;5139:63;;5239:2;5282:9;5278:22;72:20;97:33;124:5;97:33;:::i;5333:360::-;;;5451:2;5439:9;5430:7;5426:23;5422:32;5419:2;;;-1:-1;;5457:12;5419:2;2119:6;2106:20;5509:63;;5609:2;5649:9;5645:22;1672:20;1697:30;1721:5;1697:30;:::i;5700:513::-;;;;5849:2;5837:9;5828:7;5824:23;5820:32;5817:2;;;-1:-1;;5855:12;5817:2;5938:22;2106:20;5907:63;;6007:2;6064:9;6060:22;1955:20;1980:47;2021:5;1980:47;:::i;:::-;6015:77;-1:-1;6129:2;6165:22;;1672:20;1697:30;1672:20;1697:30;:::i;:::-;6137:60;;;;5811:402;;;;;:::o;6220:366::-;;;6341:2;6329:9;6320:7;6316:23;6312:32;6309:2;;;-1:-1;;6347:12;6309:2;-1:-1;;2106:20;;;6499:2;6538:22;;;2106:20;;-1:-1;6303:283::o;6593:485::-;;;;6728:2;6716:9;6707:7;6703:23;6699:32;6696:2;;;-1:-1;;6734:12;6696:2;2119:6;2106:20;6786:63;;6886:2;6929:9;6925:22;2106:20;6894:63;;6994:2;7034:9;7030:22;1672:20;1697:30;1721:5;1697:30;:::i;7085:993::-;;;;;;;;7290:3;7278:9;7269:7;7265:23;7261:33;7258:2;;;-1:-1;;7297:12;7258:2;2119:6;2106:20;7349:63;;7449:2;7492:9;7488:22;2106:20;7457:63;;7557:2;7600:9;7596:22;2106:20;7565:63;;7665:2;7708:9;7704:22;2106:20;7673:63;;7773:3;7817:9;7813:22;2106:20;7782:63;;7882:3;7926:9;7922:22;2106:20;7891:63;;7991:3;8034:9;8030:22;2242:20;41414:10;43174:5;41403:22;43150:5;43147:34;43137:2;;-1:-1;;43185:12;43137:2;8000:62;;;;7252:826;;;;;;;;;;:::o;20670:271::-;;9884:5;39856:12;9995:52;10040:6;10035:3;10028:4;10021:5;10017:16;9995:52;:::i;:::-;10059:16;;;;;20804:137;-1:-1;;20804:137::o;20948:222::-;-1:-1;;;;;41197:54;;;;8591:37;;21075:2;21060:18;;21046:124::o;21177:349::-;-1:-1;;;;;41197:54;;;;8450:58;;21512:2;21497:18;;20387:37;21340:2;21325:18;;21311:215::o;21533:444::-;-1:-1;;;;;41197:54;;;8591:37;;41197:54;;;;21880:2;21865:18;;8591:37;21963:2;21948:18;;20387:37;;;;21716:2;21701:18;;21687:290::o;22324:474::-;22553:2;22567:47;;;39856:12;;22538:18;;;40440:19;;;22324:474;;22553:2;40480:14;;;;;;39684;;;22324:474;9245:338;9270:6;9267:1;9264:13;9245:338;;;9331:13;;19542:23;;-1:-1;;;;;41197:54;10162:64;;19722:16;;;19716:23;19793:14;;;20387:37;19883:16;;;19877:23;19954:14;;;20387:37;20059:4;20048:16;;;20042:23;20119:14;;;20387:37;20223:4;20212:16;;;20206:23;20283:14;;;20387:37;41208:42;8343:14;;;;40269;;;;4076:18;9285:9;9245:338;;;-1:-1;22620:168;;22524:274;-1:-1;;;;;;;22524:274::o;22805:210::-;40997:13;;40990:21;9678:34;;22926:2;22911:18;;22897:118::o;23022:696::-;-1:-1;;;;;41197:54;;;;10162:64;;23454:2;23439:18;;20387:37;;;;23537:2;23522:18;;20387:37;;;;23620:2;23605:18;;20387:37;23703:3;23688:19;;20387:37;23275:3;23260:19;;23246:472::o;23725:310::-;;23872:2;23893:17;23886:47;10544:5;39856:12;40452:6;23872:2;23861:9;23857:18;40440:19;10638:52;10683:6;40480:14;23861:9;40480:14;23872:2;10664:5;10660:16;10638:52;:::i;:::-;42550:7;42534:14;-1:-1;;42530:28;10702:39;;;;40480:14;10702:39;;23843:192;-1:-1;;23843:192::o;24042:416::-;24242:2;24256:47;;;10978:2;24227:18;;;40440:19;11014:34;40480:14;;;10994:55;-1:-1;;;11069:12;;;11062:27;11108:12;;;24213:245::o;24465:416::-;24665:2;24679:47;;;11359:1;24650:18;;;40440:19;-1:-1;;;40480:14;;;11374:31;11424:12;;;24636:245::o;24888:416::-;25088:2;25102:47;;;11675:2;25073:18;;;40440:19;11711:34;40480:14;;;11691:55;-1:-1;;;11766:12;;;11759:30;11808:12;;;25059:245::o;25311:416::-;25511:2;25525:47;;;12059:2;25496:18;;;40440:19;12095:34;40480:14;;;12075:55;-1:-1;;;12150:12;;;12143:26;12188:12;;;25482:245::o;25734:416::-;25934:2;25948:47;;;12439:2;25919:18;;;40440:19;12475:29;40480:14;;;12455:50;12524:12;;;25905:245::o;26157:416::-;26357:2;26371:47;;;12775:2;26342:18;;;40440:19;-1:-1;;;40480:14;;;12791:33;12843:12;;;26328:245::o;26580:416::-;26780:2;26794:47;;;13094:2;26765:18;;;40440:19;-1:-1;;;40480:14;;;13110:35;13164:12;;;26751:245::o;27003:416::-;27203:2;27217:47;;;13415:2;27188:18;;;40440:19;-1:-1;;;40480:14;;;13431:36;13486:12;;;27174:245::o;27426:416::-;27626:2;27640:47;;;13737:2;27611:18;;;40440:19;13773:34;40480:14;;;13753:55;-1:-1;;;13828:12;;;13821:30;13870:12;;;27597:245::o;27849:416::-;28049:2;28063:47;;;14121:2;28034:18;;;40440:19;14157:29;40480:14;;;14137:50;14206:12;;;28020:245::o;28272:416::-;28472:2;28486:47;;;14457:2;28457:18;;;40440:19;-1:-1;;;40480:14;;;14473:38;14530:12;;;28443:245::o;28695:416::-;28895:2;28909:47;;;14781:2;28880:18;;;40440:19;-1:-1;;;40480:14;;;14797:35;14851:12;;;28866:245::o;29118:416::-;29318:2;29332:47;;;15102:1;29303:18;;;40440:19;-1:-1;;;40480:14;;;15117:32;15168:12;;;29289:245::o;29541:416::-;29741:2;29755:47;;;15419:2;29726:18;;;40440:19;15455:34;40480:14;;;15435:55;-1:-1;;;15510:12;;;15503:25;15547:12;;;29712:245::o;29964:416::-;30164:2;30178:47;;;15798:1;30149:18;;;40440:19;-1:-1;;;40480:14;;;15813:27;15859:12;;;30135:245::o;30387:416::-;30587:2;30601:47;;;30572:18;;;40440:19;16146:34;40480:14;;;16126:55;16200:12;;;30558:245::o;30810:416::-;31010:2;31024:47;;;16451:2;30995:18;;;40440:19;16487:34;40480:14;;;16467:55;-1:-1;;;16542:12;;;16535:29;16583:12;;;30981:245::o;31233:416::-;31433:2;31447:47;;;31233:416;31418:18;;;40440:19;40480:14;;;31404:245::o;31656:416::-;31856:2;31870:47;;;17105:2;31841:18;;;40440:19;17141:34;40480:14;;;17121:55;-1:-1;;;17196:12;;;17189:28;17236:12;;;31827:245::o;32079:416::-;32279:2;32293:47;;;17487:2;32264:18;;;40440:19;17523:31;40480:14;;;17503:52;17574:12;;;32250:245::o;32502:416::-;32702:2;32716:47;;;17825:2;32687:18;;;40440:19;-1:-1;;;40480:14;;;17841:41;17901:12;;;32673:245::o;32925:416::-;33125:2;33139:47;;;18152:1;33110:18;;;40440:19;-1:-1;;;40480:14;;;18167:32;18218:12;;;33096:245::o;33348:416::-;33548:2;33562:47;;;18469:2;33533:18;;;40440:19;18505:34;40480:14;;;18485:55;-1:-1;;;18560:12;;;18553:34;18606:12;;;33519:245::o;33771:416::-;33971:2;33985:47;;;18857:2;33956:18;;;40440:19;-1:-1;;;40480:14;;;18873:33;18925:12;;;33942:245::o;34194:416::-;34394:2;34408:47;;;19176:2;34379:18;;;40440:19;-1:-1;;;40480:14;;;19192:40;19251:12;;;34365:245::o;34617:222::-;20387:37;;;34744:2;34729:18;;34715:124::o;34846:333::-;20387:37;;;35165:2;35150:18;;20387:37;35001:2;34986:18;;34972:207::o;35186:432::-;20387:37;;;35527:2;35512:18;;20387:37;;;;40997:13;40990:21;35604:2;35589:18;;9678:34;35363:2;35348:18;;35334:284::o;35625:444::-;20387:37;;;35972:2;35957:18;;20387:37;;;;36055:2;36040:18;;20387:37;35808:2;35793:18;;35779:290::o;36076:556::-;20387:37;;;36452:2;36437:18;;20387:37;;;;36535:2;36520:18;;20387:37;36618:2;36603:18;;20387:37;36287:3;36272:19;;36258:374::o;36639:668::-;20387:37;;;37043:2;37028:18;;20387:37;;;;37126:2;37111:18;;20387:37;;;;37209:2;37194:18;;20387:37;37292:3;37277:19;;20387:37;36878:3;36863:19;;36849:458::o;37314:1116::-;20387:37;;;37830:2;37815:18;;20387:37;;;;37913:2;37898:18;;20387:37;;;;37996:2;37981:18;;20387:37;;;;38079:3;38064:19;;20387:37;;;;38163:3;38148:19;;20387:37;38247:3;38232:19;;20387:37;38331:3;38316:19;;20387:37;38415:3;38400:19;;20387:37;37665:3;37650:19;;37636:794::o;38437:214::-;41508:4;41497:16;;;;20623:35;;38560:2;38545:18;;38531:120::o;38658:256::-;38720:2;38714:9;38746:17;;;38821:18;38806:34;;38842:22;;;38803:62;38800:2;;;38878:1;;38868:12;38800:2;38720;38887:22;38698:216;;-1:-1;38698:216::o;38921:304::-;;39080:18;39072:6;39069:30;39066:2;;;-1:-1;;39102:12;39066:2;-1:-1;39147:4;39135:17;;;39200:15;;39003:222::o;42190:268::-;42255:1;42262:101;42276:6;42273:1;42270:13;42262:101;;;42343:11;;;42337:18;42324:11;;;42317:39;42298:2;42291:10;42262:101;;;42378:6;42375:1;42372:13;42369:2;;;-1:-1;;42255:1;42425:16;;42418:27;42239:219::o;42571:117::-;-1:-1;;;;;41197:54;;42630:35;;42620:2;;42679:1;;42669:12;42695:111;42776:5;40997:13;40990:21;42754:5;42751:32;42741:2;;42797:1;;42787:12

Swarm Source

ipfs://f1783b1de76aaa5eea985d170a68ffd4452b466d20d29387a1acdc4fbf94db40
Loading...
Loading
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.