ETH Price: $3,914.16 (+0.80%)

Token

Digital Asset Rights Token (DAR)
 

Overview

Max Total Supply

30,000,000,000 DAR

Holders

896

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$6,181,200.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
kurotama.eth
Balance
3,268 DAR

Value
$0.67 ( ~0.000171173296879699 Eth) [0.0000%]
0xed1e28a76690bfa83ca01505ac1d4ed4ab23272c
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:
PowerfulERC20

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-23
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-28
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity 0.8.9;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity 0.8.9;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity 0.8.9;

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity 0.8.9;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + 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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol



pragma solidity 0.8.9;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Capped.sol



pragma solidity 0.8.9;


/**
 * @dev Extension of {ERC20} that adds a cap to the supply of tokens.
 */
abstract contract ERC20Capped is ERC20 {
    uint256 private immutable _cap;

    /**
     * @dev Sets the value of the `cap`. This value is immutable, it can only be
     * set once during construction.
     */
    constructor(uint256 cap_) {
        require(cap_ > 0, "ERC20Capped: cap is 0");
        _cap = cap_;
    }

    /**
     * @dev Returns the cap on the token's total supply.
     */
    function cap() public view virtual returns (uint256) {
        return _cap;
    }

    /**
     * @dev See {ERC20-_mint}.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded");
        super._mint(account, amount);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity 0.8.9;

/**
 * @dev Collection of functions related to the address type
 */
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;
        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");

        (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");

        (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");

        (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.4._
     */
    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.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity 0.8.9;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity 0.8.9;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: erc-payable-token/contracts/token/ERC1363/IERC1363.sol



pragma solidity 0.8.9;



/**
 * @title IERC1363 Interface
 * @dev Interface for a Payable Token contract as defined in
 *  https://eips.ethereum.org/EIPS/eip-1363
 */
interface IERC1363 is IERC20, IERC165 {
    /**
     * @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver
     * @param recipient address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @return true unless throwing
     */
    function transferAndCall(address recipient, uint256 amount) external returns (bool);

    /**
     * @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver
     * @param recipient address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @param data bytes Additional data with no specified format, sent in call to `recipient`
     * @return true unless throwing
     */
    function transferAndCall(
        address recipient,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);

    /**
     * @notice Transfer tokens from one address to another and then call `onTransferReceived` on receiver
     * @param sender address The address which you want to send tokens from
     * @param recipient address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @return true unless throwing
     */
    function transferFromAndCall(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @notice Transfer tokens from one address to another and then call `onTransferReceived` on receiver
     * @param sender address The address which you want to send tokens from
     * @param recipient address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @param data bytes Additional data with no specified format, sent in call to `recipient`
     * @return true unless throwing
     */
    function transferFromAndCall(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender
     * and then call `onApprovalReceived` on spender.
     * 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
     * @param spender address The address which will spend the funds
     * @param amount uint256 The amount of tokens to be spent
     */
    function approveAndCall(address spender, uint256 amount) external returns (bool);

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender
     * and then call `onApprovalReceived` on spender.
     * 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
     * @param spender address The address which will spend the funds
     * @param amount uint256 The amount of tokens to be spent
     * @param data bytes Additional data with no specified format, sent in call to `spender`
     */
    function approveAndCall(
        address spender,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}

// File: erc-payable-token/contracts/token/ERC1363/IERC1363Receiver.sol



pragma solidity 0.8.9;

/**
 * @title IERC1363Receiver Interface
 * @dev Interface for any contract that wants to support transferAndCall or transferFromAndCall
 *  from ERC1363 token contracts as defined in
 *  https://eips.ethereum.org/EIPS/eip-1363
 */
interface IERC1363Receiver {
    /**
     * @notice Handle the receipt of ERC1363 tokens
     * @dev Any ERC1363 smart contract calls this function on the recipient
     * after a `transfer` or a `transferFrom`. This function MAY throw to revert and reject the
     * transfer. Return of other than the magic value MUST result in the
     * transaction being reverted.
     * Note: the token contract address is always the message sender.
     * @param operator address The address which called `transferAndCall` or `transferFromAndCall` function
     * @param sender address The address which are token transferred from
     * @param amount uint256 The amount of tokens transferred
     * @param data bytes Additional data with no specified format
     * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` unless throwing
     */
    function onTransferReceived(
        address operator,
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4);
}

// File: erc-payable-token/contracts/token/ERC1363/IERC1363Spender.sol



pragma solidity 0.8.9;

/**
 * @title IERC1363Spender Interface
 * @dev Interface for any contract that wants to support approveAndCall
 *  from ERC1363 token contracts as defined in
 *  https://eips.ethereum.org/EIPS/eip-1363
 */
interface IERC1363Spender {
    /**
     * @notice Handle the approval of ERC1363 tokens
     * @dev Any ERC1363 smart contract calls this function on the recipient
     * after an `approve`. This function MAY throw to revert and reject the
     * approval. Return of other than the magic value MUST result in the
     * transaction being reverted.
     * Note: the token contract address is always the message sender.
     * @param sender address The address which called `approveAndCall` function
     * @param amount uint256 The amount of tokens to be spent
     * @param data bytes Additional data with no specified format
     * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` unless throwing
     */
    function onApprovalReceived(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4);
}

// File: erc-payable-token/contracts/token/ERC1363/ERC1363.sol



pragma solidity 0.8.9;







/**
 * @title ERC1363
 * @dev Implementation of an ERC1363 interface
 */
abstract contract ERC1363 is ERC20, IERC1363, ERC165 {
    using Address for address;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1363).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Transfer tokens to a specified address and then execute a callback on recipient.
     * @param recipient The address to transfer to.
     * @param amount The amount to be transferred.
     * @return A boolean that indicates if the operation was successful.
     */
    function transferAndCall(address recipient, uint256 amount) public virtual override returns (bool) {
        return transferAndCall(recipient, amount, "");
    }

    /**
     * @dev Transfer tokens to a specified address and then execute a callback on recipient.
     * @param recipient The address to transfer to
     * @param amount The amount to be transferred
     * @param data Additional data with no specified format
     * @return A boolean that indicates if the operation was successful.
     */
    function transferAndCall(
        address recipient,
        uint256 amount,
        bytes memory data
    ) public virtual override returns (bool) {
        transfer(recipient, amount);
        require(_checkAndCallTransfer(_msgSender(), recipient, amount, data), "ERC1363: _checkAndCallTransfer reverts");
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another and then execute a callback on recipient.
     * @param sender The address which you want to send tokens from
     * @param recipient The address which you want to transfer to
     * @param amount The amount of tokens to be transferred
     * @return A boolean that indicates if the operation was successful.
     */
    function transferFromAndCall(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        return transferFromAndCall(sender, recipient, amount, "");
    }

    /**
     * @dev Transfer tokens from one address to another and then execute a callback on recipient.
     * @param sender The address which you want to send tokens from
     * @param recipient The address which you want to transfer to
     * @param amount The amount of tokens to be transferred
     * @param data Additional data with no specified format
     * @return A boolean that indicates if the operation was successful.
     */
    function transferFromAndCall(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data
    ) public virtual override returns (bool) {
        transferFrom(sender, recipient, amount);
        require(_checkAndCallTransfer(sender, recipient, amount, data), "ERC1363: _checkAndCallTransfer reverts");
        return true;
    }

    /**
     * @dev Approve spender to transfer tokens and then execute a callback on recipient.
     * @param spender The address allowed to transfer to
     * @param amount The amount allowed to be transferred
     * @return A boolean that indicates if the operation was successful.
     */
    function approveAndCall(address spender, uint256 amount) public virtual override returns (bool) {
        return approveAndCall(spender, amount, "");
    }

    /**
     * @dev Approve spender to transfer tokens and then execute a callback on recipient.
     * @param spender The address allowed to transfer to.
     * @param amount The amount allowed to be transferred.
     * @param data Additional data with no specified format.
     * @return A boolean that indicates if the operation was successful.
     */
    function approveAndCall(
        address spender,
        uint256 amount,
        bytes memory data
    ) public virtual override returns (bool) {
        approve(spender, amount);
        require(_checkAndCallApprove(spender, amount, data), "ERC1363: _checkAndCallApprove reverts");
        return true;
    }

    /**
     * @dev Internal function to invoke `onTransferReceived` on a target address
     *  The call is not executed if the target address is not a contract
     * @param sender address Representing the previous owner of the given token value
     * @param recipient address Target address that will receive the tokens
     * @param amount uint256 The amount mount of tokens to be transferred
     * @param data bytes Optional data to send along with the call
     * @return whether the call correctly returned the expected magic value
     */
    function _checkAndCallTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data
    ) internal virtual returns (bool) {
        if (!recipient.isContract()) {
            return false;
        }
        bytes4 retval = IERC1363Receiver(recipient).onTransferReceived(_msgSender(), sender, amount, data);
        return (retval == IERC1363Receiver(recipient).onTransferReceived.selector);
    }

    /**
     * @dev Internal function to invoke `onApprovalReceived` on a target address
     *  The call is not executed if the target address is not a contract
     * @param spender address The address which will spend the funds
     * @param amount uint256 The amount of tokens to be spent
     * @param data bytes Optional data to send along with the call
     * @return whether the call correctly returned the expected magic value
     */
    function _checkAndCallApprove(
        address spender,
        uint256 amount,
        bytes memory data
    ) internal virtual returns (bool) {
        if (!spender.isContract()) {
            return false;
        }
        bytes4 retval = IERC1363Spender(spender).onApprovalReceived(_msgSender(), amount, data);
        return (retval == IERC1363Spender(spender).onApprovalReceived.selector);
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity 0.8.9;


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

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

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

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: eth-token-recover/contracts/TokenRecover.sol



pragma solidity 0.8.9;



/**
 * @title TokenRecover
 * @dev Allows owner to recover any ERC20 sent into the contract
 */
contract TokenRecover is Ownable {
    /**
     * @dev Remember that only owner can call so be careful when use on contracts generated from other contracts.
     * @param tokenAddress The token contract address
     * @param tokenAmount Number of tokens to be sent
     */
    function recoverERC20(address tokenAddress, uint256 tokenAmount) public virtual onlyOwner {
       require(IERC20(tokenAddress).transfer(owner(), tokenAmount), "TokenRecover: Tranfer failed"); 
    }
}

// File: contracts/token/ERC20/behaviours/ERC20Decimals.sol



pragma solidity 0.8.9;


/**
 * @title ERC20Decimals
 * @dev Implementation of the ERC20Decimals. Extension of {ERC20} that adds decimals storage slot.
 */
abstract contract ERC20Decimals is ERC20 {
    uint8 private immutable _decimals;

    /**
     * @dev Sets the value of the `decimals`. This value is immutable, it can only be
     * set once during construction.
     */
    constructor(uint8 decimals_) {
        _decimals = decimals_;
    }

    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }
}

// File: contracts/token/ERC20/behaviours/ERC20Mintable.sol



pragma solidity 0.8.9;


/**
 * @title ERC20Mintable
 * @dev Implementation of the ERC20Mintable. Extension of {ERC20} that adds a minting behaviour.
 */
abstract contract ERC20Mintable is ERC20 {
    // indicates if minting is finished
    bool private _mintingFinished = false;

    /**
     * @dev Emitted during finish minting
     */
    event MintFinished();

    /**
     * @dev Tokens can be minted only before minting finished.
     */
    modifier canMint() {
        require(!_mintingFinished, "ERC20Mintable: minting is finished");
        _;
    }

    /**
     * @return if minting is finished or not.
     */
    function mintingFinished() external view returns (bool) {
        return _mintingFinished;
    }

    /**
     * @dev Function to mint tokens.
     *
     * WARNING: it allows everyone to mint new tokens. Access controls MUST be defined in derived contracts.
     *
     * @param account The address that will receive the minted tokens
     * @param amount The amount of tokens to mint
     */
    function mint(address account, uint256 amount) external canMint {
        _mint(account, amount);
    }

    /**
     * @dev Function to stop minting new tokens.
     *
     * WARNING: it allows everyone to finish minting. Access controls MUST be defined in derived contracts.
     */
    function finishMinting() external canMint {
        _finishMinting();
    }

    /**
     * @dev Function to stop minting new tokens.
     */
    function _finishMinting() internal virtual {
        _mintingFinished = true;

        emit MintFinished();
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol



pragma solidity 0.8.9;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity 0.8.9;

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

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

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

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

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

// File: @openzeppelin/contracts/access/AccessControl.sol



pragma solidity 0.8.9;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/access/Roles.sol



pragma solidity 0.8.9;


contract Roles is AccessControl {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER");
    bytes32 public constant BURNER_ROLE = keccak256("BURNER");

    constructor() {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(BURNER_ROLE, _msgSender());
    }

    modifier onlyMinter() {
        require(hasRole(MINTER_ROLE, _msgSender()), "Roles: caller does not have the MINTER role");
        _;
    }
    modifier onlyBurner() {
        require(hasRole(BURNER_ROLE, _msgSender()), "Roles: caller does not have the BURNER role");
        _;
    }
}



// File: Newly Added


pragma solidity 0.8.9;

/**
 * @title PreviousERC20ContractReferer
 * @dev Refer to the previous token contract
 */
contract PreviousERC20ContractReferer is Ownable {
    address private _previousContractAddress;
    bytes32 private _previousTokenBurnedAt;

    function setPreviousContractAddress(address previousTokenAddress) external onlyOwner {
        _previousContractAddress = previousTokenAddress;
    }

    function previousContractAddress() public view returns (address) {
        return _previousContractAddress;
    }

    function tokenBurnedAt() public view returns (bytes32) {
        return _previousTokenBurnedAt;
    }

    function setTokenBurnedAt(bytes32 txHash) external onlyOwner {
        _previousTokenBurnedAt = txHash;
    }

}





// File: contracts/token/ERC20/PowerfulERC20.sol



pragma solidity 0.8.9;









/**
 * @title PowerfulERC20
 * @dev Implementation of the PowerfulERC20
 */
contract PowerfulERC20 is
    ERC20Decimals,
    ERC20Capped,
    ERC20Mintable,
    ERC20Burnable,
    ERC1363,
    TokenRecover,
    Roles,
    PreviousERC20ContractReferer
{
    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        uint256 cap_,
        uint256 initialBalance_
    )
        payable
        ERC20(name_, symbol_)
        ERC20Decimals(decimals_)
        ERC20Capped(cap_)
    {
        // Immutable variables cannot be read during contract creation time
        // https://github.com/ethereum/solidity/issues/10463
        require(initialBalance_ <= cap_, "ERC20Capped: cap exceeded");
        ERC20._mint(_msgSender(), initialBalance_);
    }

    function decimals() public view virtual override(ERC20, ERC20Decimals) returns (uint8) {
        return super.decimals();
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC1363) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function burn(uint256 amount) public override onlyBurner {
        super.burn(amount);
    }

    function burnFrom(address account, uint256 amount) public override onlyBurner {
        super.burnFrom(account, amount);
    }

    /**
     * @dev Function to mint tokens.
     *
     * NOTE: restricting access to addresses with MINTER role. See {ERC20Mintable-mint}.
     *
     * @param account The address that will receive the minted tokens
     * @param amount The amount of tokens to mint
     */
    function _mint(address account, uint256 amount) internal override(ERC20, ERC20Capped) onlyMinter {
        super._mint(account, amount);
    }

    /**
     * @dev Function to stop minting new tokens.
     *
     * NOTE: restricting access to owner only. See {ERC20Mintable-finishMinting}.
     */
    function _finishMinting() internal override onlyOwner {
        super._finishMinting();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"cap_","type":"uint256"},{"internalType":"uint256","name":"initialBalance_","type":"uint256"}],"stateMutability":"payable","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":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","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":[],"name":"finishMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"previousTokenAddress","type":"address"}],"name":"setPreviousContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"setTokenBurnedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBurnedAt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferFromAndCall","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":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000600560006101000a81548160ff02191690831515021790555060405162004cee38038062004cee8339818101604052810190620000449190620008a1565b81838686816003908051906020019062000060929190620005db565b50806004908051906020019062000079929190620005db565b5050508060ff1660808160ff16815250505060008111620000d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c890620009c8565b60405180910390fd5b8060a0818152505050620000fa620000ee6200021760201b60201c565b6200021f60201b60201c565b6200011e6000801b620001126200021760201b60201c565b620002e560201b60201c565b6200015f7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9620001536200021760201b60201c565b620002e560201b60201c565b620001a07f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8620001946200021760201b60201c565b620002e560201b60201c565b81811115620001e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001dd9062000a3a565b60405180910390fd5b6200020c620001fa6200021760201b60201c565b82620002fb60201b620016801760201c565b505050505062000bed565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f782826200047460201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200036e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003659062000aac565b60405180910390fd5b62000382600083836200056660201b60201c565b806002600082825462000396919062000afd565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003ed919062000afd565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000454919062000b6b565b60405180910390a362000470600083836200056b60201b60201c565b5050565b6200048682826200057060201b60201c565b620005625760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005076200021760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620005e99062000bb7565b90600052602060002090601f0160209004810192826200060d576000855562000659565b82601f106200062857805160ff191683800117855562000659565b8280016001018555821562000659579182015b82811115620006585782518255916020019190600101906200063b565b5b5090506200066891906200066c565b5090565b5b80821115620006875760008160009055506001016200066d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006f482620006a9565b810181811067ffffffffffffffff82111715620007165762000715620006ba565b5b80604052505050565b60006200072b6200068b565b9050620007398282620006e9565b919050565b600067ffffffffffffffff8211156200075c576200075b620006ba565b5b6200076782620006a9565b9050602081019050919050565b60005b838110156200079457808201518184015260208101905062000777565b83811115620007a4576000848401525b50505050565b6000620007c1620007bb846200073e565b6200071f565b905082815260208101848484011115620007e057620007df620006a4565b5b620007ed84828562000774565b509392505050565b600082601f8301126200080d576200080c6200069f565b5b81516200081f848260208601620007aa565b91505092915050565b600060ff82169050919050565b620008408162000828565b81146200084c57600080fd5b50565b600081519050620008608162000835565b92915050565b6000819050919050565b6200087b8162000866565b81146200088757600080fd5b50565b6000815190506200089b8162000870565b92915050565b600080600080600060a08688031215620008c057620008bf62000695565b5b600086015167ffffffffffffffff811115620008e157620008e06200069a565b5b620008ef88828901620007f5565b955050602086015167ffffffffffffffff8111156200091357620009126200069a565b5b6200092188828901620007f5565b945050604062000934888289016200084f565b935050606062000947888289016200088a565b92505060806200095a888289016200088a565b9150509295509295909350565b600082825260208201905092915050565b7f45524332304361707065643a2063617020697320300000000000000000000000600082015250565b6000620009b060158362000967565b9150620009bd8262000978565b602082019050919050565b60006020820190508181036000830152620009e381620009a1565b9050919050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b600062000a2260198362000967565b915062000a2f82620009ea565b602082019050919050565b6000602082019050818103600083015262000a558162000a13565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000a94601f8362000967565b915062000aa18262000a5c565b602082019050919050565b6000602082019050818103600083015262000ac78162000a85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b0a8262000866565b915062000b178362000866565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b4f5762000b4e62000ace565b5b828201905092915050565b62000b658162000866565b82525050565b600060208201905062000b82600083018462000b5a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd057607f821691505b6020821081141562000be75762000be662000b88565b5b50919050565b60805160a0516140db62000c136000396000610a8e01526000611e3001526140db6000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806370a082311161013b578063a457c2d7116100b8578063d53913931161007c578063d53913931461072b578063d547741f14610749578063d8fbe99414610765578063dd62ed3e14610795578063f2fde38b146107c557610248565b8063a457c2d71461064f578063a9059cbb1461067f578063bc3931f5146106af578063c1d34b89146106cb578063cae9ca51146106fb57610248565b80638da5cb5b116100ff5780638da5cb5b146105a757806391d14854146105c557806393fffddc146105f557806395d89b4114610613578063a217fddf1461063157610248565b806370a082311461052b578063715018a61461055b57806379cc6790146105655780637d64bcb4146105815780638980f11f1461058b57610248565b80632f2ff15d116101c9578063395093511161018d57806339509351146104775780634000aea0146104a757806340c10f19146104d757806342966c68146104f357806354a03c921461050f57610248565b80632f2ff15d146103d3578063313ce567146103ef5780633177029f1461040d578063355274ea1461043d57806336568abe1461045b57610248565b806318160ddd1161021057806318160ddd146103195780631dc5cc7c1461033757806323b872dd14610355578063248a9ca314610385578063282c51f3146103b557610248565b806301ffc9a71461024d57806305d2035b1461027d57806306fdde031461029b578063095ea7b3146102b95780631296ee62146102e9575b600080fd5b610267600480360381019061026291906129fb565b6107e1565b6040516102749190612a43565b60405180910390f35b6102856107f3565b6040516102929190612a43565b60405180910390f35b6102a361080a565b6040516102b09190612af7565b60405180910390f35b6102d360048036038101906102ce9190612bad565b61089c565b6040516102e09190612a43565b60405180910390f35b61030360048036038101906102fe9190612bad565b6108ba565b6040516103109190612a43565b60405180910390f35b6103216108de565b60405161032e9190612bfc565b60405180910390f35b61033f6108e8565b60405161034c9190612c30565b60405180910390f35b61036f600480360381019061036a9190612c4b565b6108f2565b60405161037c9190612a43565b60405180910390f35b61039f600480360381019061039a9190612cca565b6109ea565b6040516103ac9190612c30565b60405180910390f35b6103bd610a0a565b6040516103ca9190612c30565b60405180910390f35b6103ed60048036038101906103e89190612cf7565b610a2e565b005b6103f7610a57565b6040516104049190612d53565b60405180910390f35b61042760048036038101906104229190612bad565b610a66565b6040516104349190612a43565b60405180910390f35b610445610a8a565b6040516104529190612bfc565b60405180910390f35b61047560048036038101906104709190612cf7565b610ab2565b005b610491600480360381019061048c9190612bad565b610b35565b60405161049e9190612a43565b60405180910390f35b6104c160048036038101906104bc9190612ea3565b610be1565b6040516104ce9190612a43565b60405180910390f35b6104f160048036038101906104ec9190612bad565b610c4b565b005b61050d60048036038101906105089190612f12565b610ca9565b005b61052960048036038101906105249190612f3f565b610d25565b005b61054560048036038101906105409190612f3f565b610de5565b6040516105529190612bfc565b60405180910390f35b610563610e2d565b005b61057f600480360381019061057a9190612bad565b610eb5565b005b610589610f33565b005b6105a560048036038101906105a09190612bad565b610f8d565b005b6105af6110e0565b6040516105bc9190612f7b565b60405180910390f35b6105df60048036038101906105da9190612cf7565b61110a565b6040516105ec9190612a43565b60405180910390f35b6105fd611175565b60405161060a9190612f7b565b60405180910390f35b61061b61119f565b6040516106289190612af7565b60405180910390f35b610639611231565b6040516106469190612c30565b60405180910390f35b61066960048036038101906106649190612bad565b611238565b6040516106769190612a43565b60405180910390f35b61069960048036038101906106949190612bad565b611323565b6040516106a69190612a43565b60405180910390f35b6106c960048036038101906106c49190612cca565b611341565b005b6106e560048036038101906106e09190612f96565b6113c7565b6040516106f29190612a43565b60405180910390f35b61071560048036038101906107109190612ea3565b61142c565b6040516107229190612a43565b60405180910390f35b61073361148e565b6040516107409190612c30565b60405180910390f35b610763600480360381019061075e9190612cf7565b6114b2565b005b61077f600480360381019061077a9190612c4b565b6114db565b60405161078c9190612a43565b60405180910390f35b6107af60048036038101906107aa9190613019565b611501565b6040516107bc9190612bfc565b60405180910390f35b6107df60048036038101906107da9190612f3f565b611588565b005b60006107ec826117e0565b9050919050565b6000600560009054906101000a900460ff16905090565b60606003805461081990613088565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613088565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b60006108b06108a961185a565b8484611862565b6001905092915050565b60006108d6838360405180602001604052806000815250610be1565b905092915050565b6000600254905090565b6000600854905090565b60006108ff848484611a2d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061094a61185a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c19061312c565b60405180910390fd5b6109de856109d661185a565b858403611862565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b610a37826109ea565b610a4881610a4361185a565b611cae565b610a528383611d4b565b505050565b6000610a61611e2c565b905090565b6000610a8283836040518060200160405280600081525061142c565b905092915050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b610aba61185a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e906131be565b60405180910390fd5b610b318282611e54565b5050565b6000610bd7610b4261185a565b848460016000610b5061185a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bd2919061320d565b611862565b6001905092915050565b6000610bed8484611323565b50610c01610bf961185a565b858585611f36565b610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c37906132d5565b60405180910390fd5b600190509392505050565b600560009054906101000a900460ff1615610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290613367565b60405180910390fd5b610ca58282612054565b5050565b610cda7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8610cd561185a565b61110a565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d10906133f9565b60405180910390fd5b610d22816120d2565b50565b610d2d61185a565b73ffffffffffffffffffffffffffffffffffffffff16610d4b6110e0565b73ffffffffffffffffffffffffffffffffffffffff1614610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890613465565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e3561185a565b73ffffffffffffffffffffffffffffffffffffffff16610e536110e0565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090613465565b60405180910390fd5b610eb360006120e6565b565b610ee67f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8610ee161185a565b61110a565b610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906133f9565b60405180910390fd5b610f2f82826121ac565b5050565b600560009054906101000a900460ff1615610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90613367565b60405180910390fd5b610f8b612227565b565b610f9561185a565b73ffffffffffffffffffffffffffffffffffffffff16610fb36110e0565b73ffffffffffffffffffffffffffffffffffffffff1614611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090613465565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61102d6110e0565b836040518363ffffffff1660e01b815260040161104b929190613485565b602060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109d91906134da565b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390613553565b60405180910390fd5b5050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111ae90613088565b80601f01602080910402602001604051908101604052809291908181526020018280546111da90613088565b80156112275780601f106111fc57610100808354040283529160200191611227565b820191906000526020600020905b81548152906001019060200180831161120a57829003601f168201915b5050505050905090565b6000801b81565b6000806001600061124761185a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb906135e5565b60405180910390fd5b61131861130f61185a565b85858403611862565b600191505092915050565b600061133761133061185a565b8484611a2d565b6001905092915050565b61134961185a565b73ffffffffffffffffffffffffffffffffffffffff166113676110e0565b73ffffffffffffffffffffffffffffffffffffffff16146113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490613465565b60405180910390fd5b8060088190555050565b60006113d48585856108f2565b506113e185858585611f36565b611420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611417906132d5565b60405180910390fd5b60019050949350505050565b6000611438848461089c565b506114448484846122ad565b611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613677565b60405180910390fd5b600190509392505050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b6114bb826109ea565b6114cc816114c761185a565b611cae565b6114d68383611e54565b505050565b60006114f8848484604051806020016040528060008152506113c7565b90509392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61159061185a565b73ffffffffffffffffffffffffffffffffffffffff166115ae6110e0565b73ffffffffffffffffffffffffffffffffffffffff1614611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90613465565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90613709565b60405180910390fd5b61167d816120e6565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790613775565b60405180910390fd5b6116fc600083836123c8565b806002600082825461170e919061320d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611763919061320d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117c89190612bfc565b60405180910390a36117dc600083836123cd565b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118535750611852826123d2565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990613807565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613899565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a209190612bfc565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a949061392b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b04906139bd565b60405180910390fd5b611b188383836123c8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590613a4f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c31919061320d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c959190612bfc565b60405180910390a3611ca88484846123cd565b50505050565b611cb8828261110a565b611d4757611cdd8173ffffffffffffffffffffffffffffffffffffffff16601461244c565b611ceb8360001c602061244c565b604051602001611cfc929190613b43565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e9190612af7565b60405180910390fd5b5050565b611d55828261110a565b611e285760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611dcd61185a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b611e5e828261110a565b15611f325760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ed761185a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611f578473ffffffffffffffffffffffffffffffffffffffff16612688565b611f64576000905061204c565b60008473ffffffffffffffffffffffffffffffffffffffff166388a7ca5c611f8a61185a565b8887876040518563ffffffff1660e01b8152600401611fac9493929190613bd2565b602060405180830381600087803b158015611fc657600080fd5b505af1158015611fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffe9190613c33565b90506388a7ca5c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6120857ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc961208061185a565b61110a565b6120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb90613cd2565b60405180910390fd5b6120ce828261269b565b5050565b6120e36120dd61185a565b82612705565b50565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006121bf836121ba61185a565b611501565b905081811015612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90613d64565b60405180910390fd5b6122188361221061185a565b848403611862565b6122228383612705565b505050565b61222f61185a565b73ffffffffffffffffffffffffffffffffffffffff1661224d6110e0565b73ffffffffffffffffffffffffffffffffffffffff16146122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90613465565b60405180910390fd5b6122ab6128dc565b565b60006122ce8473ffffffffffffffffffffffffffffffffffffffff16612688565b6122db57600090506123c1565b60008473ffffffffffffffffffffffffffffffffffffffff16637b04a2d061230161185a565b86866040518463ffffffff1660e01b815260040161232193929190613d84565b602060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123739190613c33565b9050637b04a2d060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b9392505050565b505050565b505050565b60007fb0202a11000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612445575061244482612925565b5b9050919050565b60606000600283600261245f9190613dc2565b612469919061320d565b67ffffffffffffffff81111561248257612481612d78565b5b6040519080825280601f01601f1916602001820160405280156124b45781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124ec576124eb613e1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125505761254f613e1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026125909190613dc2565b61259a919061320d565b90505b600181111561263a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125dc576125db613e1c565b5b1a60f81b8282815181106125f3576125f2613e1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061263390613e4b565b905061259d565b506000841461267e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267590613ec1565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b6126a3610a8a565b816126ac6108de565b6126b6919061320d565b11156126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90613f2d565b60405180910390fd5b6127018282611680565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90613fbf565b60405180910390fd5b612781826000836123c8565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614051565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461285e9190614071565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128c39190612bfc565b60405180910390a36128d7836000846123cd565b505050565b6001600560006101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129d8816129a3565b81146129e357600080fd5b50565b6000813590506129f5816129cf565b92915050565b600060208284031215612a1157612a10612999565b5b6000612a1f848285016129e6565b91505092915050565b60008115159050919050565b612a3d81612a28565b82525050565b6000602082019050612a586000830184612a34565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a98578082015181840152602081019050612a7d565b83811115612aa7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ac982612a5e565b612ad38185612a69565b9350612ae3818560208601612a7a565b612aec81612aad565b840191505092915050565b60006020820190508181036000830152612b118184612abe565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b4482612b19565b9050919050565b612b5481612b39565b8114612b5f57600080fd5b50565b600081359050612b7181612b4b565b92915050565b6000819050919050565b612b8a81612b77565b8114612b9557600080fd5b50565b600081359050612ba781612b81565b92915050565b60008060408385031215612bc457612bc3612999565b5b6000612bd285828601612b62565b9250506020612be385828601612b98565b9150509250929050565b612bf681612b77565b82525050565b6000602082019050612c116000830184612bed565b92915050565b6000819050919050565b612c2a81612c17565b82525050565b6000602082019050612c456000830184612c21565b92915050565b600080600060608486031215612c6457612c63612999565b5b6000612c7286828701612b62565b9350506020612c8386828701612b62565b9250506040612c9486828701612b98565b9150509250925092565b612ca781612c17565b8114612cb257600080fd5b50565b600081359050612cc481612c9e565b92915050565b600060208284031215612ce057612cdf612999565b5b6000612cee84828501612cb5565b91505092915050565b60008060408385031215612d0e57612d0d612999565b5b6000612d1c85828601612cb5565b9250506020612d2d85828601612b62565b9150509250929050565b600060ff82169050919050565b612d4d81612d37565b82525050565b6000602082019050612d686000830184612d44565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612db082612aad565b810181811067ffffffffffffffff82111715612dcf57612dce612d78565b5b80604052505050565b6000612de261298f565b9050612dee8282612da7565b919050565b600067ffffffffffffffff821115612e0e57612e0d612d78565b5b612e1782612aad565b9050602081019050919050565b82818337600083830152505050565b6000612e46612e4184612df3565b612dd8565b905082815260208101848484011115612e6257612e61612d73565b5b612e6d848285612e24565b509392505050565b600082601f830112612e8a57612e89612d6e565b5b8135612e9a848260208601612e33565b91505092915050565b600080600060608486031215612ebc57612ebb612999565b5b6000612eca86828701612b62565b9350506020612edb86828701612b98565b925050604084013567ffffffffffffffff811115612efc57612efb61299e565b5b612f0886828701612e75565b9150509250925092565b600060208284031215612f2857612f27612999565b5b6000612f3684828501612b98565b91505092915050565b600060208284031215612f5557612f54612999565b5b6000612f6384828501612b62565b91505092915050565b612f7581612b39565b82525050565b6000602082019050612f906000830184612f6c565b92915050565b60008060008060808587031215612fb057612faf612999565b5b6000612fbe87828801612b62565b9450506020612fcf87828801612b62565b9350506040612fe087828801612b98565b925050606085013567ffffffffffffffff8111156130015761300061299e565b5b61300d87828801612e75565b91505092959194509250565b600080604083850312156130305761302f612999565b5b600061303e85828601612b62565b925050602061304f85828601612b62565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130a057607f821691505b602082108114156130b4576130b3613059565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613116602883612a69565b9150613121826130ba565b604082019050919050565b6000602082019050818103600083015261314581613109565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006131a8602f83612a69565b91506131b38261314c565b604082019050919050565b600060208201905081810360008301526131d78161319b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061321882612b77565b915061322383612b77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613258576132576131de565b5b828201905092915050565b7f455243313336333a205f636865636b416e6443616c6c5472616e73666572207260008201527f6576657274730000000000000000000000000000000000000000000000000000602082015250565b60006132bf602683612a69565b91506132ca82613263565b604082019050919050565b600060208201905081810360008301526132ee816132b2565b9050919050565b7f45524332304d696e7461626c653a206d696e74696e672069732066696e69736860008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613351602283612a69565b915061335c826132f5565b604082019050919050565b6000602082019050818103600083015261338081613344565b9050919050565b7f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060008201527f4255524e455220726f6c65000000000000000000000000000000000000000000602082015250565b60006133e3602b83612a69565b91506133ee82613387565b604082019050919050565b60006020820190508181036000830152613412816133d6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061344f602083612a69565b915061345a82613419565b602082019050919050565b6000602082019050818103600083015261347e81613442565b9050919050565b600060408201905061349a6000830185612f6c565b6134a76020830184612bed565b9392505050565b6134b781612a28565b81146134c257600080fd5b50565b6000815190506134d4816134ae565b92915050565b6000602082840312156134f0576134ef612999565b5b60006134fe848285016134c5565b91505092915050565b7f546f6b656e5265636f7665723a205472616e666572206661696c656400000000600082015250565b600061353d601c83612a69565b915061354882613507565b602082019050919050565b6000602082019050818103600083015261356c81613530565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006135cf602583612a69565b91506135da82613573565b604082019050919050565b600060208201905081810360008301526135fe816135c2565b9050919050565b7f455243313336333a205f636865636b416e6443616c6c417070726f766520726560008201527f7665727473000000000000000000000000000000000000000000000000000000602082015250565b6000613661602583612a69565b915061366c82613605565b604082019050919050565b6000602082019050818103600083015261369081613654565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136f3602683612a69565b91506136fe82613697565b604082019050919050565b60006020820190508181036000830152613722816136e6565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061375f601f83612a69565b915061376a82613729565b602082019050919050565b6000602082019050818103600083015261378e81613752565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137f1602483612a69565b91506137fc82613795565b604082019050919050565b60006020820190508181036000830152613820816137e4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613883602283612a69565b915061388e82613827565b604082019050919050565b600060208201905081810360008301526138b281613876565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613915602583612a69565b9150613920826138b9565b604082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006139a7602383612a69565b91506139b28261394b565b604082019050919050565b600060208201905081810360008301526139d68161399a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613a39602683612a69565b9150613a44826139dd565b604082019050919050565b60006020820190508181036000830152613a6881613a2c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613ab0601783613a6f565b9150613abb82613a7a565b601782019050919050565b6000613ad182612a5e565b613adb8185613a6f565b9350613aeb818560208601612a7a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613b2d601183613a6f565b9150613b3882613af7565b601182019050919050565b6000613b4e82613aa3565b9150613b5a8285613ac6565b9150613b6582613b20565b9150613b718284613ac6565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613ba482613b7d565b613bae8185613b88565b9350613bbe818560208601612a7a565b613bc781612aad565b840191505092915050565b6000608082019050613be76000830187612f6c565b613bf46020830186612f6c565b613c016040830185612bed565b8181036060830152613c138184613b99565b905095945050505050565b600081519050613c2d816129cf565b92915050565b600060208284031215613c4957613c48612999565b5b6000613c5784828501613c1e565b91505092915050565b7f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060008201527f4d494e54455220726f6c65000000000000000000000000000000000000000000602082015250565b6000613cbc602b83612a69565b9150613cc782613c60565b604082019050919050565b60006020820190508181036000830152613ceb81613caf565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000613d4e602483612a69565b9150613d5982613cf2565b604082019050919050565b60006020820190508181036000830152613d7d81613d41565b9050919050565b6000606082019050613d996000830186612f6c565b613da66020830185612bed565b8181036040830152613db88184613b99565b9050949350505050565b6000613dcd82612b77565b9150613dd883612b77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1157613e106131de565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613e5682612b77565b91506000821415613e6a57613e696131de565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613eab602083612a69565b9150613eb682613e75565b602082019050919050565b60006020820190508181036000830152613eda81613e9e565b9050919050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b6000613f17601983612a69565b9150613f2282613ee1565b602082019050919050565b60006020820190508181036000830152613f4681613f0a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fa9602183612a69565b9150613fb482613f4d565b604082019050919050565b60006020820190508181036000830152613fd881613f9c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061403b602283612a69565b915061404682613fdf565b604082019050919050565b6000602082019050818103600083015261406a8161402e565b9050919050565b600061407c82612b77565b915061408783612b77565b92508282101561409a576140996131de565b5b82820390509291505056fea2646970667358221220efe0d1b5eeeafc07f500ddce7f73293ae2e1de9fa8ac7e29fca932458f6d41f364736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000183bdac6ae9bc1c8cc0000000000000000000000000000000000000000000000060ef6b1aba6f072330000000000000000000000000000000000000000000000000000000000000000000001a4469676974616c2041737365742052696768747320546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000034441520000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c806370a082311161013b578063a457c2d7116100b8578063d53913931161007c578063d53913931461072b578063d547741f14610749578063d8fbe99414610765578063dd62ed3e14610795578063f2fde38b146107c557610248565b8063a457c2d71461064f578063a9059cbb1461067f578063bc3931f5146106af578063c1d34b89146106cb578063cae9ca51146106fb57610248565b80638da5cb5b116100ff5780638da5cb5b146105a757806391d14854146105c557806393fffddc146105f557806395d89b4114610613578063a217fddf1461063157610248565b806370a082311461052b578063715018a61461055b57806379cc6790146105655780637d64bcb4146105815780638980f11f1461058b57610248565b80632f2ff15d116101c9578063395093511161018d57806339509351146104775780634000aea0146104a757806340c10f19146104d757806342966c68146104f357806354a03c921461050f57610248565b80632f2ff15d146103d3578063313ce567146103ef5780633177029f1461040d578063355274ea1461043d57806336568abe1461045b57610248565b806318160ddd1161021057806318160ddd146103195780631dc5cc7c1461033757806323b872dd14610355578063248a9ca314610385578063282c51f3146103b557610248565b806301ffc9a71461024d57806305d2035b1461027d57806306fdde031461029b578063095ea7b3146102b95780631296ee62146102e9575b600080fd5b610267600480360381019061026291906129fb565b6107e1565b6040516102749190612a43565b60405180910390f35b6102856107f3565b6040516102929190612a43565b60405180910390f35b6102a361080a565b6040516102b09190612af7565b60405180910390f35b6102d360048036038101906102ce9190612bad565b61089c565b6040516102e09190612a43565b60405180910390f35b61030360048036038101906102fe9190612bad565b6108ba565b6040516103109190612a43565b60405180910390f35b6103216108de565b60405161032e9190612bfc565b60405180910390f35b61033f6108e8565b60405161034c9190612c30565b60405180910390f35b61036f600480360381019061036a9190612c4b565b6108f2565b60405161037c9190612a43565b60405180910390f35b61039f600480360381019061039a9190612cca565b6109ea565b6040516103ac9190612c30565b60405180910390f35b6103bd610a0a565b6040516103ca9190612c30565b60405180910390f35b6103ed60048036038101906103e89190612cf7565b610a2e565b005b6103f7610a57565b6040516104049190612d53565b60405180910390f35b61042760048036038101906104229190612bad565b610a66565b6040516104349190612a43565b60405180910390f35b610445610a8a565b6040516104529190612bfc565b60405180910390f35b61047560048036038101906104709190612cf7565b610ab2565b005b610491600480360381019061048c9190612bad565b610b35565b60405161049e9190612a43565b60405180910390f35b6104c160048036038101906104bc9190612ea3565b610be1565b6040516104ce9190612a43565b60405180910390f35b6104f160048036038101906104ec9190612bad565b610c4b565b005b61050d60048036038101906105089190612f12565b610ca9565b005b61052960048036038101906105249190612f3f565b610d25565b005b61054560048036038101906105409190612f3f565b610de5565b6040516105529190612bfc565b60405180910390f35b610563610e2d565b005b61057f600480360381019061057a9190612bad565b610eb5565b005b610589610f33565b005b6105a560048036038101906105a09190612bad565b610f8d565b005b6105af6110e0565b6040516105bc9190612f7b565b60405180910390f35b6105df60048036038101906105da9190612cf7565b61110a565b6040516105ec9190612a43565b60405180910390f35b6105fd611175565b60405161060a9190612f7b565b60405180910390f35b61061b61119f565b6040516106289190612af7565b60405180910390f35b610639611231565b6040516106469190612c30565b60405180910390f35b61066960048036038101906106649190612bad565b611238565b6040516106769190612a43565b60405180910390f35b61069960048036038101906106949190612bad565b611323565b6040516106a69190612a43565b60405180910390f35b6106c960048036038101906106c49190612cca565b611341565b005b6106e560048036038101906106e09190612f96565b6113c7565b6040516106f29190612a43565b60405180910390f35b61071560048036038101906107109190612ea3565b61142c565b6040516107229190612a43565b60405180910390f35b61073361148e565b6040516107409190612c30565b60405180910390f35b610763600480360381019061075e9190612cf7565b6114b2565b005b61077f600480360381019061077a9190612c4b565b6114db565b60405161078c9190612a43565b60405180910390f35b6107af60048036038101906107aa9190613019565b611501565b6040516107bc9190612bfc565b60405180910390f35b6107df60048036038101906107da9190612f3f565b611588565b005b60006107ec826117e0565b9050919050565b6000600560009054906101000a900460ff16905090565b60606003805461081990613088565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613088565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b60006108b06108a961185a565b8484611862565b6001905092915050565b60006108d6838360405180602001604052806000815250610be1565b905092915050565b6000600254905090565b6000600854905090565b60006108ff848484611a2d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061094a61185a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c19061312c565b60405180910390fd5b6109de856109d661185a565b858403611862565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b610a37826109ea565b610a4881610a4361185a565b611cae565b610a528383611d4b565b505050565b6000610a61611e2c565b905090565b6000610a8283836040518060200160405280600081525061142c565b905092915050565b60007f000000000000000000000000000000000000000183bdac6ae9bc1c8cc0000000905090565b610aba61185a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e906131be565b60405180910390fd5b610b318282611e54565b5050565b6000610bd7610b4261185a565b848460016000610b5061185a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bd2919061320d565b611862565b6001905092915050565b6000610bed8484611323565b50610c01610bf961185a565b858585611f36565b610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c37906132d5565b60405180910390fd5b600190509392505050565b600560009054906101000a900460ff1615610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290613367565b60405180910390fd5b610ca58282612054565b5050565b610cda7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8610cd561185a565b61110a565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d10906133f9565b60405180910390fd5b610d22816120d2565b50565b610d2d61185a565b73ffffffffffffffffffffffffffffffffffffffff16610d4b6110e0565b73ffffffffffffffffffffffffffffffffffffffff1614610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890613465565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e3561185a565b73ffffffffffffffffffffffffffffffffffffffff16610e536110e0565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090613465565b60405180910390fd5b610eb360006120e6565b565b610ee67f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8610ee161185a565b61110a565b610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906133f9565b60405180910390fd5b610f2f82826121ac565b5050565b600560009054906101000a900460ff1615610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90613367565b60405180910390fd5b610f8b612227565b565b610f9561185a565b73ffffffffffffffffffffffffffffffffffffffff16610fb36110e0565b73ffffffffffffffffffffffffffffffffffffffff1614611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090613465565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61102d6110e0565b836040518363ffffffff1660e01b815260040161104b929190613485565b602060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109d91906134da565b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390613553565b60405180910390fd5b5050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111ae90613088565b80601f01602080910402602001604051908101604052809291908181526020018280546111da90613088565b80156112275780601f106111fc57610100808354040283529160200191611227565b820191906000526020600020905b81548152906001019060200180831161120a57829003601f168201915b5050505050905090565b6000801b81565b6000806001600061124761185a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb906135e5565b60405180910390fd5b61131861130f61185a565b85858403611862565b600191505092915050565b600061133761133061185a565b8484611a2d565b6001905092915050565b61134961185a565b73ffffffffffffffffffffffffffffffffffffffff166113676110e0565b73ffffffffffffffffffffffffffffffffffffffff16146113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490613465565b60405180910390fd5b8060088190555050565b60006113d48585856108f2565b506113e185858585611f36565b611420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611417906132d5565b60405180910390fd5b60019050949350505050565b6000611438848461089c565b506114448484846122ad565b611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613677565b60405180910390fd5b600190509392505050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b6114bb826109ea565b6114cc816114c761185a565b611cae565b6114d68383611e54565b505050565b60006114f8848484604051806020016040528060008152506113c7565b90509392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61159061185a565b73ffffffffffffffffffffffffffffffffffffffff166115ae6110e0565b73ffffffffffffffffffffffffffffffffffffffff1614611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90613465565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90613709565b60405180910390fd5b61167d816120e6565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790613775565b60405180910390fd5b6116fc600083836123c8565b806002600082825461170e919061320d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611763919061320d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117c89190612bfc565b60405180910390a36117dc600083836123cd565b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118535750611852826123d2565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990613807565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613899565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a209190612bfc565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a949061392b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b04906139bd565b60405180910390fd5b611b188383836123c8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590613a4f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c31919061320d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c959190612bfc565b60405180910390a3611ca88484846123cd565b50505050565b611cb8828261110a565b611d4757611cdd8173ffffffffffffffffffffffffffffffffffffffff16601461244c565b611ceb8360001c602061244c565b604051602001611cfc929190613b43565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e9190612af7565b60405180910390fd5b5050565b611d55828261110a565b611e285760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611dcd61185a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f0000000000000000000000000000000000000000000000000000000000000012905090565b611e5e828261110a565b15611f325760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ed761185a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611f578473ffffffffffffffffffffffffffffffffffffffff16612688565b611f64576000905061204c565b60008473ffffffffffffffffffffffffffffffffffffffff166388a7ca5c611f8a61185a565b8887876040518563ffffffff1660e01b8152600401611fac9493929190613bd2565b602060405180830381600087803b158015611fc657600080fd5b505af1158015611fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffe9190613c33565b90506388a7ca5c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6120857ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc961208061185a565b61110a565b6120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb90613cd2565b60405180910390fd5b6120ce828261269b565b5050565b6120e36120dd61185a565b82612705565b50565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006121bf836121ba61185a565b611501565b905081811015612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90613d64565b60405180910390fd5b6122188361221061185a565b848403611862565b6122228383612705565b505050565b61222f61185a565b73ffffffffffffffffffffffffffffffffffffffff1661224d6110e0565b73ffffffffffffffffffffffffffffffffffffffff16146122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90613465565b60405180910390fd5b6122ab6128dc565b565b60006122ce8473ffffffffffffffffffffffffffffffffffffffff16612688565b6122db57600090506123c1565b60008473ffffffffffffffffffffffffffffffffffffffff16637b04a2d061230161185a565b86866040518463ffffffff1660e01b815260040161232193929190613d84565b602060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123739190613c33565b9050637b04a2d060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b9392505050565b505050565b505050565b60007fb0202a11000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612445575061244482612925565b5b9050919050565b60606000600283600261245f9190613dc2565b612469919061320d565b67ffffffffffffffff81111561248257612481612d78565b5b6040519080825280601f01601f1916602001820160405280156124b45781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124ec576124eb613e1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125505761254f613e1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026125909190613dc2565b61259a919061320d565b90505b600181111561263a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125dc576125db613e1c565b5b1a60f81b8282815181106125f3576125f2613e1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061263390613e4b565b905061259d565b506000841461267e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267590613ec1565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b6126a3610a8a565b816126ac6108de565b6126b6919061320d565b11156126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90613f2d565b60405180910390fd5b6127018282611680565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90613fbf565b60405180910390fd5b612781826000836123c8565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614051565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461285e9190614071565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128c39190612bfc565b60405180910390a36128d7836000846123cd565b505050565b6001600560006101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129d8816129a3565b81146129e357600080fd5b50565b6000813590506129f5816129cf565b92915050565b600060208284031215612a1157612a10612999565b5b6000612a1f848285016129e6565b91505092915050565b60008115159050919050565b612a3d81612a28565b82525050565b6000602082019050612a586000830184612a34565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a98578082015181840152602081019050612a7d565b83811115612aa7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ac982612a5e565b612ad38185612a69565b9350612ae3818560208601612a7a565b612aec81612aad565b840191505092915050565b60006020820190508181036000830152612b118184612abe565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b4482612b19565b9050919050565b612b5481612b39565b8114612b5f57600080fd5b50565b600081359050612b7181612b4b565b92915050565b6000819050919050565b612b8a81612b77565b8114612b9557600080fd5b50565b600081359050612ba781612b81565b92915050565b60008060408385031215612bc457612bc3612999565b5b6000612bd285828601612b62565b9250506020612be385828601612b98565b9150509250929050565b612bf681612b77565b82525050565b6000602082019050612c116000830184612bed565b92915050565b6000819050919050565b612c2a81612c17565b82525050565b6000602082019050612c456000830184612c21565b92915050565b600080600060608486031215612c6457612c63612999565b5b6000612c7286828701612b62565b9350506020612c8386828701612b62565b9250506040612c9486828701612b98565b9150509250925092565b612ca781612c17565b8114612cb257600080fd5b50565b600081359050612cc481612c9e565b92915050565b600060208284031215612ce057612cdf612999565b5b6000612cee84828501612cb5565b91505092915050565b60008060408385031215612d0e57612d0d612999565b5b6000612d1c85828601612cb5565b9250506020612d2d85828601612b62565b9150509250929050565b600060ff82169050919050565b612d4d81612d37565b82525050565b6000602082019050612d686000830184612d44565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612db082612aad565b810181811067ffffffffffffffff82111715612dcf57612dce612d78565b5b80604052505050565b6000612de261298f565b9050612dee8282612da7565b919050565b600067ffffffffffffffff821115612e0e57612e0d612d78565b5b612e1782612aad565b9050602081019050919050565b82818337600083830152505050565b6000612e46612e4184612df3565b612dd8565b905082815260208101848484011115612e6257612e61612d73565b5b612e6d848285612e24565b509392505050565b600082601f830112612e8a57612e89612d6e565b5b8135612e9a848260208601612e33565b91505092915050565b600080600060608486031215612ebc57612ebb612999565b5b6000612eca86828701612b62565b9350506020612edb86828701612b98565b925050604084013567ffffffffffffffff811115612efc57612efb61299e565b5b612f0886828701612e75565b9150509250925092565b600060208284031215612f2857612f27612999565b5b6000612f3684828501612b98565b91505092915050565b600060208284031215612f5557612f54612999565b5b6000612f6384828501612b62565b91505092915050565b612f7581612b39565b82525050565b6000602082019050612f906000830184612f6c565b92915050565b60008060008060808587031215612fb057612faf612999565b5b6000612fbe87828801612b62565b9450506020612fcf87828801612b62565b9350506040612fe087828801612b98565b925050606085013567ffffffffffffffff8111156130015761300061299e565b5b61300d87828801612e75565b91505092959194509250565b600080604083850312156130305761302f612999565b5b600061303e85828601612b62565b925050602061304f85828601612b62565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130a057607f821691505b602082108114156130b4576130b3613059565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613116602883612a69565b9150613121826130ba565b604082019050919050565b6000602082019050818103600083015261314581613109565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006131a8602f83612a69565b91506131b38261314c565b604082019050919050565b600060208201905081810360008301526131d78161319b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061321882612b77565b915061322383612b77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613258576132576131de565b5b828201905092915050565b7f455243313336333a205f636865636b416e6443616c6c5472616e73666572207260008201527f6576657274730000000000000000000000000000000000000000000000000000602082015250565b60006132bf602683612a69565b91506132ca82613263565b604082019050919050565b600060208201905081810360008301526132ee816132b2565b9050919050565b7f45524332304d696e7461626c653a206d696e74696e672069732066696e69736860008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613351602283612a69565b915061335c826132f5565b604082019050919050565b6000602082019050818103600083015261338081613344565b9050919050565b7f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060008201527f4255524e455220726f6c65000000000000000000000000000000000000000000602082015250565b60006133e3602b83612a69565b91506133ee82613387565b604082019050919050565b60006020820190508181036000830152613412816133d6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061344f602083612a69565b915061345a82613419565b602082019050919050565b6000602082019050818103600083015261347e81613442565b9050919050565b600060408201905061349a6000830185612f6c565b6134a76020830184612bed565b9392505050565b6134b781612a28565b81146134c257600080fd5b50565b6000815190506134d4816134ae565b92915050565b6000602082840312156134f0576134ef612999565b5b60006134fe848285016134c5565b91505092915050565b7f546f6b656e5265636f7665723a205472616e666572206661696c656400000000600082015250565b600061353d601c83612a69565b915061354882613507565b602082019050919050565b6000602082019050818103600083015261356c81613530565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006135cf602583612a69565b91506135da82613573565b604082019050919050565b600060208201905081810360008301526135fe816135c2565b9050919050565b7f455243313336333a205f636865636b416e6443616c6c417070726f766520726560008201527f7665727473000000000000000000000000000000000000000000000000000000602082015250565b6000613661602583612a69565b915061366c82613605565b604082019050919050565b6000602082019050818103600083015261369081613654565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136f3602683612a69565b91506136fe82613697565b604082019050919050565b60006020820190508181036000830152613722816136e6565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061375f601f83612a69565b915061376a82613729565b602082019050919050565b6000602082019050818103600083015261378e81613752565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137f1602483612a69565b91506137fc82613795565b604082019050919050565b60006020820190508181036000830152613820816137e4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613883602283612a69565b915061388e82613827565b604082019050919050565b600060208201905081810360008301526138b281613876565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613915602583612a69565b9150613920826138b9565b604082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006139a7602383612a69565b91506139b28261394b565b604082019050919050565b600060208201905081810360008301526139d68161399a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613a39602683612a69565b9150613a44826139dd565b604082019050919050565b60006020820190508181036000830152613a6881613a2c565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613ab0601783613a6f565b9150613abb82613a7a565b601782019050919050565b6000613ad182612a5e565b613adb8185613a6f565b9350613aeb818560208601612a7a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613b2d601183613a6f565b9150613b3882613af7565b601182019050919050565b6000613b4e82613aa3565b9150613b5a8285613ac6565b9150613b6582613b20565b9150613b718284613ac6565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613ba482613b7d565b613bae8185613b88565b9350613bbe818560208601612a7a565b613bc781612aad565b840191505092915050565b6000608082019050613be76000830187612f6c565b613bf46020830186612f6c565b613c016040830185612bed565b8181036060830152613c138184613b99565b905095945050505050565b600081519050613c2d816129cf565b92915050565b600060208284031215613c4957613c48612999565b5b6000613c5784828501613c1e565b91505092915050565b7f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060008201527f4d494e54455220726f6c65000000000000000000000000000000000000000000602082015250565b6000613cbc602b83612a69565b9150613cc782613c60565b604082019050919050565b60006020820190508181036000830152613ceb81613caf565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000613d4e602483612a69565b9150613d5982613cf2565b604082019050919050565b60006020820190508181036000830152613d7d81613d41565b9050919050565b6000606082019050613d996000830186612f6c565b613da66020830185612bed565b8181036040830152613db88184613b99565b9050949350505050565b6000613dcd82612b77565b9150613dd883612b77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1157613e106131de565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613e5682612b77565b91506000821415613e6a57613e696131de565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613eab602083612a69565b9150613eb682613e75565b602082019050919050565b60006020820190508181036000830152613eda81613e9e565b9050919050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b6000613f17601983612a69565b9150613f2282613ee1565b602082019050919050565b60006020820190508181036000830152613f4681613f0a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fa9602183612a69565b9150613fb482613f4d565b604082019050919050565b60006020820190508181036000830152613fd881613f9c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061403b602283612a69565b915061404682613fdf565b604082019050919050565b6000602082019050818103600083015261406a8161402e565b9050919050565b600061407c82612b77565b915061408783612b77565b92508282101561409a576140996131de565b5b82820390509291505056fea2646970667358221220efe0d1b5eeeafc07f500ddce7f73293ae2e1de9fa8ac7e29fca932458f6d41f364736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000183bdac6ae9bc1c8cc0000000000000000000000000000000000000000000000060ef6b1aba6f072330000000000000000000000000000000000000000000000000000000000000000000001a4469676974616c2041737365742052696768747320546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000034441520000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Digital Asset Rights Token
Arg [1] : symbol_ (string): DAR
Arg [2] : decimals_ (uint8): 18
Arg [3] : cap_ (uint256): 120000000000000000000000000000
Arg [4] : initialBalance_ (uint256): 30000000000000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 000000000000000000000000000000000000000183bdac6ae9bc1c8cc0000000
Arg [4] : 000000000000000000000000000000000000000060ef6b1aba6f072330000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [6] : 4469676974616c2041737365742052696768747320546f6b656e000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4441520000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

60858:2002:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61744:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45969:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6508:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8675:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36265:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7628:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60441:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9326:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55926:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59311:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56311:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61607:129;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38894:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18348:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57359:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10227:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36786:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46379:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61929:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60159:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7799:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43289:94;;;:::i;:::-;;62031:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46677:77;;;:::i;:::-;;44392:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42638:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54811:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60318:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6727:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53902:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10945:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8139:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60552:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38210:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39422:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59247:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56703:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37524:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8377:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43538:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61744:177;61853:4;61877:36;61901:11;61877:23;:36::i;:::-;61870:43;;61744:177;;;:::o;45969:98::-;46019:4;46043:16;;;;;;;;;;;46036:23;;45969:98;:::o;6508:100::-;6562:13;6595:5;6588:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6508:100;:::o;8675:169::-;8758:4;8775:39;8784:12;:10;:12::i;:::-;8798:7;8807:6;8775:8;:39::i;:::-;8832:4;8825:11;;8675:169;;;;:::o;36265:163::-;36358:4;36382:38;36398:9;36409:6;36382:38;;;;;;;;;;;;:15;:38::i;:::-;36375:45;;36265:163;;;;:::o;7628:108::-;7689:7;7716:12;;7709:19;;7628:108;:::o;60441:103::-;60487:7;60514:22;;60507:29;;60441:103;:::o;9326:492::-;9466:4;9483:36;9493:6;9501:9;9512:6;9483:9;:36::i;:::-;9532:24;9559:11;:19;9571:6;9559:19;;;;;;;;;;;;;;;:33;9579:12;:10;:12::i;:::-;9559:33;;;;;;;;;;;;;;;;9532:60;;9631:6;9611:16;:26;;9603:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9718:57;9727:6;9735:12;:10;:12::i;:::-;9768:6;9749:16;:25;9718:8;:57::i;:::-;9806:4;9799:11;;;9326:492;;;;;:::o;55926:123::-;55992:7;56019:6;:12;56026:4;56019:12;;;;;;;;;;;:22;;;56012:29;;55926:123;;;:::o;59311:57::-;59349:19;59311:57;:::o;56311:147::-;56394:18;56407:4;56394:12;:18::i;:::-;54393:30;54404:4;54410:12;:10;:12::i;:::-;54393:10;:30::i;:::-;56425:25:::1;56436:4;56442:7;56425:10;:25::i;:::-;56311:147:::0;;;:::o;61607:129::-;61687:5;61712:16;:14;:16::i;:::-;61705:23;;61607:129;:::o;38894:157::-;38984:4;39008:35;39023:7;39032:6;39008:35;;;;;;;;;;;;:14;:35::i;:::-;39001:42;;38894:157;;;;:::o;18348:83::-;18392:7;18419:4;18412:11;;18348:83;:::o;57359:218::-;57466:12;:10;:12::i;:::-;57455:23;;:7;:23;;;57447:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57543:26;57555:4;57561:7;57543:11;:26::i;:::-;57359:218;;:::o;10227:215::-;10315:4;10332:80;10341:12;:10;:12::i;:::-;10355:7;10401:10;10364:11;:25;10376:12;:10;:12::i;:::-;10364:25;;;;;;;;;;;;;;;:34;10390:7;10364:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10332:8;:80::i;:::-;10430:4;10423:11;;10227:215;;;;:::o;36786:342::-;36932:4;36949:27;36958:9;36969:6;36949:8;:27::i;:::-;;36995:60;37017:12;:10;:12::i;:::-;37031:9;37042:6;37050:4;36995:21;:60::i;:::-;36987:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37116:4;37109:11;;36786:342;;;;;:::o;46379:105::-;45821:16;;;;;;;;;;;45820:17;45812:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46454:22:::1;46460:7;46469:6;46454:5;:22::i;:::-;46379:105:::0;;:::o;61929:94::-;59748:34;59349:19;59769:12;:10;:12::i;:::-;59748:7;:34::i;:::-;59740:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;61997:18:::1;62008:6;61997:10;:18::i;:::-;61929:94:::0;:::o;60159:151::-;42869:12;:10;:12::i;:::-;42858:23;;:7;:5;:7::i;:::-;:23;;;42850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60282:20:::1;60255:24;;:47;;;;;;;;;;;;;;;;;;60159:151:::0;:::o;7799:127::-;7873:7;7900:9;:18;7910:7;7900:18;;;;;;;;;;;;;;;;7893:25;;7799:127;;;:::o;43289:94::-;42869:12;:10;:12::i;:::-;42858:23;;:7;:5;:7::i;:::-;:23;;;42850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43354:21:::1;43372:1;43354:9;:21::i;:::-;43289:94::o:0;62031:128::-;59748:34;59349:19;59769:12;:10;:12::i;:::-;59748:7;:34::i;:::-;59740:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;62120:31:::1;62135:7;62144:6;62120:14;:31::i;:::-;62031:128:::0;;:::o;46677:77::-;45821:16;;;;;;;;;;;45820:17;45812:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46730:16:::1;:14;:16::i;:::-;46677:77::o:0;44392:201::-;42869:12;:10;:12::i;:::-;42858:23;;:7;:5;:7::i;:::-;:23;;;42850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44507:12:::1;44500:29;;;44530:7;:5;:7::i;:::-;44539:11;44500:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44492:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;44392:201:::0;;:::o;42638:87::-;42684:7;42711:6;;;;;;;;;;;42704:13;;42638:87;:::o;54811:139::-;54889:4;54913:6;:12;54920:4;54913:12;;;;;;;;;;;:20;;:29;54934:7;54913:29;;;;;;;;;;;;;;;;;;;;;;;;;54906:36;;54811:139;;;;:::o;60318:115::-;60374:7;60401:24;;;;;;;;;;;60394:31;;60318:115;:::o;6727:104::-;6783:13;6816:7;6809:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6727:104;:::o;53902:49::-;53947:4;53902:49;;;:::o;10945:413::-;11038:4;11055:24;11082:11;:25;11094:12;:10;:12::i;:::-;11082:25;;;;;;;;;;;;;;;:34;11108:7;11082:34;;;;;;;;;;;;;;;;11055:61;;11155:15;11135:16;:35;;11127:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11248:67;11257:12;:10;:12::i;:::-;11271:7;11299:15;11280:16;:34;11248:8;:67::i;:::-;11346:4;11339:11;;;10945:413;;;;:::o;8139:175::-;8225:4;8242:42;8252:12;:10;:12::i;:::-;8266:9;8277:6;8242:9;:42::i;:::-;8302:4;8295:11;;8139:175;;;;:::o;60552:111::-;42869:12;:10;:12::i;:::-;42858:23;;:7;:5;:7::i;:::-;:23;;;42850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60649:6:::1;60624:22;:31;;;;60552:111:::0;:::o;38210:377::-;38385:4;38402:39;38415:6;38423:9;38434:6;38402:12;:39::i;:::-;;38460:54;38482:6;38490:9;38501:6;38509:4;38460:21;:54::i;:::-;38452:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;38575:4;38568:11;;38210:377;;;;;;:::o;39422:318::-;39565:4;39582:24;39590:7;39599:6;39582:7;:24::i;:::-;;39625:43;39646:7;39655:6;39663:4;39625:20;:43::i;:::-;39617:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;39728:4;39721:11;;39422:318;;;;;:::o;59247:57::-;59285:19;59247:57;:::o;56703:149::-;56787:18;56800:4;56787:12;:18::i;:::-;54393:30;54404:4;54410:12;:10;:12::i;:::-;54393:10;:30::i;:::-;56818:26:::1;56830:4;56836:7;56818:11;:26::i;:::-;56703:149:::0;;;:::o;37524:229::-;37671:4;37695:50;37715:6;37723:9;37734:6;37695:50;;;;;;;;;;;;:19;:50::i;:::-;37688:57;;37524:229;;;;;:::o;8377:151::-;8466:7;8493:11;:18;8505:5;8493:18;;;;;;;;;;;;;;;:27;8512:7;8493:27;;;;;;;;;;;;;;;;8486:34;;8377:151;;;;:::o;43538:192::-;42869:12;:10;:12::i;:::-;42858:23;;:7;:5;:7::i;:::-;:23;;;42850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43647:1:::1;43627:22;;:8;:22;;;;43619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43703:19;43713:8;43703:9;:19::i;:::-;43538:192:::0;:::o;12868:399::-;12971:1;12952:21;;:7;:21;;;;12944:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13022:49;13051:1;13055:7;13064:6;13022:20;:49::i;:::-;13100:6;13084:12;;:22;;;;;;;:::i;:::-;;;;;;;;13139:6;13117:9;:18;13127:7;13117:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;13182:7;13161:37;;13178:1;13161:37;;;13191:6;13161:37;;;;;;:::i;:::-;;;;;;;;13211:48;13239:1;13243:7;13252:6;13211:19;:48::i;:::-;12868:399;;:::o;54515:204::-;54600:4;54639:32;54624:47;;;:11;:47;;;;:87;;;;54675:36;54699:11;54675:23;:36::i;:::-;54624:87;54617:94;;54515:204;;;:::o;4222:98::-;4275:7;4302:10;4295:17;;4222:98;:::o;14629:380::-;14782:1;14765:19;;:5;:19;;;;14757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14863:1;14844:21;;:7;:21;;;;14836:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14947:6;14917:11;:18;14929:5;14917:18;;;;;;;;;;;;;;;:27;14936:7;14917:27;;;;;;;;;;;;;;;:36;;;;14985:7;14969:32;;14978:5;14969:32;;;14994:6;14969:32;;;;;;:::i;:::-;;;;;;;;14629:380;;;:::o;11848:733::-;12006:1;11988:20;;:6;:20;;;;11980:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12090:1;12069:23;;:9;:23;;;;12061:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12145:47;12166:6;12174:9;12185:6;12145:20;:47::i;:::-;12205:21;12229:9;:17;12239:6;12229:17;;;;;;;;;;;;;;;;12205:41;;12282:6;12265:13;:23;;12257:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12403:6;12387:13;:22;12367:9;:17;12377:6;12367:17;;;;;;;;;;;;;;;:42;;;;12455:6;12431:9;:20;12441:9;12431:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12496:9;12479:35;;12488:6;12479:35;;;12507:6;12479:35;;;;;;:::i;:::-;;;;;;;;12527:46;12547:6;12555:9;12566:6;12527:19;:46::i;:::-;11969:612;11848:733;;;:::o;55240:497::-;55321:22;55329:4;55335:7;55321;:22::i;:::-;55316:414;;55509:41;55537:7;55509:41;;55547:2;55509:19;:41::i;:::-;55623:38;55651:4;55643:13;;55658:2;55623:19;:38::i;:::-;55414:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55360:358;;;;;;;;;;;:::i;:::-;;;;;;;;55316:414;55240:497;;:::o;58663:229::-;58738:22;58746:4;58752:7;58738;:22::i;:::-;58733:152;;58809:4;58777:6;:12;58784:4;58777:12;;;;;;;;;;;:20;;:29;58798:7;58777:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;58860:12;:10;:12::i;:::-;58833:40;;58851:7;58833:40;;58845:4;58833:40;;;;;;;;;;58733:152;58663:229;;:::o;45140:100::-;45198:5;45223:9;45216:16;;45140:100;:::o;58900:230::-;58975:22;58983:4;58989:7;58975;:22::i;:::-;58971:152;;;59046:5;59014:6;:12;59021:4;59014:12;;;;;;;;;;;:20;;:29;59035:7;59014:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;59098:12;:10;:12::i;:::-;59071:40;;59089:7;59071:40;;59083:4;59071:40;;;;;;;;;;58971:152;58900:230;;:::o;40306:456::-;40476:4;40498:22;:9;:20;;;:22::i;:::-;40493:68;;40544:5;40537:12;;;;40493:68;40571:13;40604:9;40587:46;;;40634:12;:10;:12::i;:::-;40648:6;40656;40664:4;40587:82;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40571:98;;40698:55;;;40688:65;;;:6;:65;;;;40680:74;;;40306:456;;;;;;;:::o;62451:144::-;59599:34;59285:19;59620:12;:10;:12::i;:::-;59599:7;:34::i;:::-;59591:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;62559:28:::1;62571:7;62580:6;62559:11;:28::i;:::-;62451:144:::0;;:::o;16959:91::-;17015:27;17021:12;:10;:12::i;:::-;17035:6;17015:5;:27::i;:::-;16959:91;:::o;43738:173::-;43794:16;43813:6;;;;;;;;;;;43794:25;;43839:8;43830:6;;:17;;;;;;;;;;;;;;;;;;43894:8;43863:40;;43884:8;43863:40;;;;;;;;;;;;43783:128;43738:173;:::o;17369:368::-;17446:24;17473:32;17483:7;17492:12;:10;:12::i;:::-;17473:9;:32::i;:::-;17446:59;;17544:6;17524:16;:26;;17516:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;17627:58;17636:7;17645:12;:10;:12::i;:::-;17678:6;17659:16;:25;17627:8;:58::i;:::-;17707:22;17713:7;17722:6;17707:5;:22::i;:::-;17435:302;17369:368;;:::o;62762:95::-;42869:12;:10;:12::i;:::-;42858:23;;:7;:5;:7::i;:::-;:23;;;42850:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62827:22:::1;:20;:22::i;:::-;62762:95::o:0;41222:412::-;41364:4;41386:20;:7;:18;;;:20::i;:::-;41381:66;;41430:5;41423:12;;;;41381:66;41457:13;41489:7;41473:43;;;41517:12;:10;:12::i;:::-;41531:6;41539:4;41473:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41457:87;;41573:52;;;41563:62;;;:6;:62;;;;41555:71;;;41222:412;;;;;;:::o;15609:125::-;;;;:::o;16338:124::-;;;;:::o;35751:215::-;35853:4;35892:26;35877:41;;;:11;:41;;;;:81;;;;35922:36;35946:11;35922:23;:36::i;:::-;35877:81;35870:88;;35751:215;;;:::o;51543:451::-;51618:13;51644:19;51689:1;51680:6;51676:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;51666:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51644:47;;51702:15;:6;51709:1;51702:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;51728;:6;51735:1;51728:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;51759:9;51784:1;51775:6;51771:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;51759:26;;51754:135;51791:1;51787;:5;51754:135;;;51826:12;51847:3;51839:5;:11;51826:25;;;;;;;:::i;:::-;;;;;51814:6;51821:1;51814:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;51876:1;51866:11;;;;;51794:3;;;;:::i;:::-;;;51754:135;;;;51916:1;51907:5;:10;51899:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51979:6;51965:21;;;51543:451;;;;:::o;19468:387::-;19528:4;19736:12;19803:7;19791:20;19783:28;;19846:1;19839:4;:8;19832:15;;;19468:387;;;:::o;18489:207::-;18614:5;:3;:5::i;:::-;18604:6;18582:19;:17;:19::i;:::-;:28;;;;:::i;:::-;:37;;18574:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;18660:28;18672:7;18681:6;18660:11;:28::i;:::-;18489:207;;:::o;13600:591::-;13703:1;13684:21;;:7;:21;;;;13676:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13756:49;13777:7;13794:1;13798:6;13756:20;:49::i;:::-;13818:22;13843:9;:18;13853:7;13843:18;;;;;;;;;;;;;;;;13818:43;;13898:6;13880:14;:24;;13872:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14017:6;14000:14;:23;13979:9;:18;13989:7;13979:18;;;;;;;;;;;;;;;:44;;;;14061:6;14045:12;;:22;;;;;;;:::i;:::-;;;;;;;;14111:1;14085:37;;14094:7;14085:37;;;14115:6;14085:37;;;;;;:::i;:::-;;;;;;;;14135:48;14155:7;14172:1;14176:6;14135:19;:48::i;:::-;13665:526;13600:591;;:::o;46830:117::-;46903:4;46884:16;;:23;;;;;;;;;;;;;;;;;;46925:14;;;;;;;;;;46830:117::o;28444:157::-;28529:4;28568:25;28553:40;;;:11;:40;;;;28546:47;;28444:157;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:118::-;4338:24;4356:5;4338:24;:::i;:::-;4333:3;4326:37;4251:118;;:::o;4375:222::-;4468:4;4506:2;4495:9;4491:18;4483:26;;4519:71;4587:1;4576:9;4572:17;4563:6;4519:71;:::i;:::-;4375:222;;;;:::o;4603:77::-;4640:7;4669:5;4658:16;;4603:77;;;:::o;4686:118::-;4773:24;4791:5;4773:24;:::i;:::-;4768:3;4761:37;4686:118;;:::o;4810:222::-;4903:4;4941:2;4930:9;4926:18;4918:26;;4954:71;5022:1;5011:9;5007:17;4998:6;4954:71;:::i;:::-;4810:222;;;;:::o;5038:619::-;5115:6;5123;5131;5180:2;5168:9;5159:7;5155:23;5151:32;5148:119;;;5186:79;;:::i;:::-;5148:119;5306:1;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5277:117;5433:2;5459:53;5504:7;5495:6;5484:9;5480:22;5459:53;:::i;:::-;5449:63;;5404:118;5561:2;5587:53;5632:7;5623:6;5612:9;5608:22;5587:53;:::i;:::-;5577:63;;5532:118;5038:619;;;;;:::o;5663:122::-;5736:24;5754:5;5736:24;:::i;:::-;5729:5;5726:35;5716:63;;5775:1;5772;5765:12;5716:63;5663:122;:::o;5791:139::-;5837:5;5875:6;5862:20;5853:29;;5891:33;5918:5;5891:33;:::i;:::-;5791:139;;;;:::o;5936:329::-;5995:6;6044:2;6032:9;6023:7;6019:23;6015:32;6012:119;;;6050:79;;:::i;:::-;6012:119;6170:1;6195:53;6240:7;6231:6;6220:9;6216:22;6195:53;:::i;:::-;6185:63;;6141:117;5936:329;;;;:::o;6271:474::-;6339:6;6347;6396:2;6384:9;6375:7;6371:23;6367:32;6364:119;;;6402:79;;:::i;:::-;6364:119;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6649:2;6675:53;6720:7;6711:6;6700:9;6696:22;6675:53;:::i;:::-;6665:63;;6620:118;6271:474;;;;;:::o;6751:86::-;6786:7;6826:4;6819:5;6815:16;6804:27;;6751:86;;;:::o;6843:112::-;6926:22;6942:5;6926:22;:::i;:::-;6921:3;6914:35;6843:112;;:::o;6961:214::-;7050:4;7088:2;7077:9;7073:18;7065:26;;7101:67;7165:1;7154:9;7150:17;7141:6;7101:67;:::i;:::-;6961:214;;;;:::o;7181:117::-;7290:1;7287;7280:12;7304:117;7413:1;7410;7403:12;7427:180;7475:77;7472:1;7465:88;7572:4;7569:1;7562:15;7596:4;7593:1;7586:15;7613:281;7696:27;7718:4;7696:27;:::i;:::-;7688:6;7684:40;7826:6;7814:10;7811:22;7790:18;7778:10;7775:34;7772:62;7769:88;;;7837:18;;:::i;:::-;7769:88;7877:10;7873:2;7866:22;7656:238;7613:281;;:::o;7900:129::-;7934:6;7961:20;;:::i;:::-;7951:30;;7990:33;8018:4;8010:6;7990:33;:::i;:::-;7900:129;;;:::o;8035:307::-;8096:4;8186:18;8178:6;8175:30;8172:56;;;8208:18;;:::i;:::-;8172:56;8246:29;8268:6;8246:29;:::i;:::-;8238:37;;8330:4;8324;8320:15;8312:23;;8035:307;;;:::o;8348:154::-;8432:6;8427:3;8422;8409:30;8494:1;8485:6;8480:3;8476:16;8469:27;8348:154;;;:::o;8508:410::-;8585:5;8610:65;8626:48;8667:6;8626:48;:::i;:::-;8610:65;:::i;:::-;8601:74;;8698:6;8691:5;8684:21;8736:4;8729:5;8725:16;8774:3;8765:6;8760:3;8756:16;8753:25;8750:112;;;8781:79;;:::i;:::-;8750:112;8871:41;8905:6;8900:3;8895;8871:41;:::i;:::-;8591:327;8508:410;;;;;:::o;8937:338::-;8992:5;9041:3;9034:4;9026:6;9022:17;9018:27;9008:122;;9049:79;;:::i;:::-;9008:122;9166:6;9153:20;9191:78;9265:3;9257:6;9250:4;9242:6;9238:17;9191:78;:::i;:::-;9182:87;;8998:277;8937:338;;;;:::o;9281:797::-;9367:6;9375;9383;9432:2;9420:9;9411:7;9407:23;9403:32;9400:119;;;9438:79;;:::i;:::-;9400:119;9558:1;9583:53;9628:7;9619:6;9608:9;9604:22;9583:53;:::i;:::-;9573:63;;9529:117;9685:2;9711:53;9756:7;9747:6;9736:9;9732:22;9711:53;:::i;:::-;9701:63;;9656:118;9841:2;9830:9;9826:18;9813:32;9872:18;9864:6;9861:30;9858:117;;;9894:79;;:::i;:::-;9858:117;9999:62;10053:7;10044:6;10033:9;10029:22;9999:62;:::i;:::-;9989:72;;9784:287;9281:797;;;;;:::o;10084:329::-;10143:6;10192:2;10180:9;10171:7;10167:23;10163:32;10160:119;;;10198:79;;:::i;:::-;10160:119;10318:1;10343:53;10388:7;10379:6;10368:9;10364:22;10343:53;:::i;:::-;10333:63;;10289:117;10084:329;;;;:::o;10419:::-;10478:6;10527:2;10515:9;10506:7;10502:23;10498:32;10495:119;;;10533:79;;:::i;:::-;10495:119;10653:1;10678:53;10723:7;10714:6;10703:9;10699:22;10678:53;:::i;:::-;10668:63;;10624:117;10419:329;;;;:::o;10754:118::-;10841:24;10859:5;10841:24;:::i;:::-;10836:3;10829:37;10754:118;;:::o;10878:222::-;10971:4;11009:2;10998:9;10994:18;10986:26;;11022:71;11090:1;11079:9;11075:17;11066:6;11022:71;:::i;:::-;10878:222;;;;:::o;11106:943::-;11201:6;11209;11217;11225;11274:3;11262:9;11253:7;11249:23;11245:33;11242:120;;;11281:79;;:::i;:::-;11242:120;11401:1;11426:53;11471:7;11462:6;11451:9;11447:22;11426:53;:::i;:::-;11416:63;;11372:117;11528:2;11554:53;11599:7;11590:6;11579:9;11575:22;11554:53;:::i;:::-;11544:63;;11499:118;11656:2;11682:53;11727:7;11718:6;11707:9;11703:22;11682:53;:::i;:::-;11672:63;;11627:118;11812:2;11801:9;11797:18;11784:32;11843:18;11835:6;11832:30;11829:117;;;11865:79;;:::i;:::-;11829:117;11970:62;12024:7;12015:6;12004:9;12000:22;11970:62;:::i;:::-;11960:72;;11755:287;11106:943;;;;;;;:::o;12055:474::-;12123:6;12131;12180:2;12168:9;12159:7;12155:23;12151:32;12148:119;;;12186:79;;:::i;:::-;12148:119;12306:1;12331:53;12376:7;12367:6;12356:9;12352:22;12331:53;:::i;:::-;12321:63;;12277:117;12433:2;12459:53;12504:7;12495:6;12484:9;12480:22;12459:53;:::i;:::-;12449:63;;12404:118;12055:474;;;;;:::o;12535:180::-;12583:77;12580:1;12573:88;12680:4;12677:1;12670:15;12704:4;12701:1;12694:15;12721:320;12765:6;12802:1;12796:4;12792:12;12782:22;;12849:1;12843:4;12839:12;12870:18;12860:81;;12926:4;12918:6;12914:17;12904:27;;12860:81;12988:2;12980:6;12977:14;12957:18;12954:38;12951:84;;;13007:18;;:::i;:::-;12951:84;12772:269;12721:320;;;:::o;13047:227::-;13187:34;13183:1;13175:6;13171:14;13164:58;13256:10;13251:2;13243:6;13239:15;13232:35;13047:227;:::o;13280:366::-;13422:3;13443:67;13507:2;13502:3;13443:67;:::i;:::-;13436:74;;13519:93;13608:3;13519:93;:::i;:::-;13637:2;13632:3;13628:12;13621:19;;13280:366;;;:::o;13652:419::-;13818:4;13856:2;13845:9;13841:18;13833:26;;13905:9;13899:4;13895:20;13891:1;13880:9;13876:17;13869:47;13933:131;14059:4;13933:131;:::i;:::-;13925:139;;13652:419;;;:::o;14077:234::-;14217:34;14213:1;14205:6;14201:14;14194:58;14286:17;14281:2;14273:6;14269:15;14262:42;14077:234;:::o;14317:366::-;14459:3;14480:67;14544:2;14539:3;14480:67;:::i;:::-;14473:74;;14556:93;14645:3;14556:93;:::i;:::-;14674:2;14669:3;14665:12;14658:19;;14317:366;;;:::o;14689:419::-;14855:4;14893:2;14882:9;14878:18;14870:26;;14942:9;14936:4;14932:20;14928:1;14917:9;14913:17;14906:47;14970:131;15096:4;14970:131;:::i;:::-;14962:139;;14689:419;;;:::o;15114:180::-;15162:77;15159:1;15152:88;15259:4;15256:1;15249:15;15283:4;15280:1;15273:15;15300:305;15340:3;15359:20;15377:1;15359:20;:::i;:::-;15354:25;;15393:20;15411:1;15393:20;:::i;:::-;15388:25;;15547:1;15479:66;15475:74;15472:1;15469:81;15466:107;;;15553:18;;:::i;:::-;15466:107;15597:1;15594;15590:9;15583:16;;15300:305;;;;:::o;15611:225::-;15751:34;15747:1;15739:6;15735:14;15728:58;15820:8;15815:2;15807:6;15803:15;15796:33;15611:225;:::o;15842:366::-;15984:3;16005:67;16069:2;16064:3;16005:67;:::i;:::-;15998:74;;16081:93;16170:3;16081:93;:::i;:::-;16199:2;16194:3;16190:12;16183:19;;15842:366;;;:::o;16214:419::-;16380:4;16418:2;16407:9;16403:18;16395:26;;16467:9;16461:4;16457:20;16453:1;16442:9;16438:17;16431:47;16495:131;16621:4;16495:131;:::i;:::-;16487:139;;16214:419;;;:::o;16639:221::-;16779:34;16775:1;16767:6;16763:14;16756:58;16848:4;16843:2;16835:6;16831:15;16824:29;16639:221;:::o;16866:366::-;17008:3;17029:67;17093:2;17088:3;17029:67;:::i;:::-;17022:74;;17105:93;17194:3;17105:93;:::i;:::-;17223:2;17218:3;17214:12;17207:19;;16866:366;;;:::o;17238:419::-;17404:4;17442:2;17431:9;17427:18;17419:26;;17491:9;17485:4;17481:20;17477:1;17466:9;17462:17;17455:47;17519:131;17645:4;17519:131;:::i;:::-;17511:139;;17238:419;;;:::o;17663:230::-;17803:34;17799:1;17791:6;17787:14;17780:58;17872:13;17867:2;17859:6;17855:15;17848:38;17663:230;:::o;17899:366::-;18041:3;18062:67;18126:2;18121:3;18062:67;:::i;:::-;18055:74;;18138:93;18227:3;18138:93;:::i;:::-;18256:2;18251:3;18247:12;18240:19;;17899:366;;;:::o;18271:419::-;18437:4;18475:2;18464:9;18460:18;18452:26;;18524:9;18518:4;18514:20;18510:1;18499:9;18495:17;18488:47;18552:131;18678:4;18552:131;:::i;:::-;18544:139;;18271:419;;;:::o;18696:182::-;18836:34;18832:1;18824:6;18820:14;18813:58;18696:182;:::o;18884:366::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;18884:366;;;:::o;19256:419::-;19422:4;19460:2;19449:9;19445:18;19437:26;;19509:9;19503:4;19499:20;19495:1;19484:9;19480:17;19473:47;19537:131;19663:4;19537:131;:::i;:::-;19529:139;;19256:419;;;:::o;19681:332::-;19802:4;19840:2;19829:9;19825:18;19817:26;;19853:71;19921:1;19910:9;19906:17;19897:6;19853:71;:::i;:::-;19934:72;20002:2;19991:9;19987:18;19978:6;19934:72;:::i;:::-;19681:332;;;;;:::o;20019:116::-;20089:21;20104:5;20089:21;:::i;:::-;20082:5;20079:32;20069:60;;20125:1;20122;20115:12;20069:60;20019:116;:::o;20141:137::-;20195:5;20226:6;20220:13;20211:22;;20242:30;20266:5;20242:30;:::i;:::-;20141:137;;;;:::o;20284:345::-;20351:6;20400:2;20388:9;20379:7;20375:23;20371:32;20368:119;;;20406:79;;:::i;:::-;20368:119;20526:1;20551:61;20604:7;20595:6;20584:9;20580:22;20551:61;:::i;:::-;20541:71;;20497:125;20284:345;;;;:::o;20635:178::-;20775:30;20771:1;20763:6;20759:14;20752:54;20635:178;:::o;20819:366::-;20961:3;20982:67;21046:2;21041:3;20982:67;:::i;:::-;20975:74;;21058:93;21147:3;21058:93;:::i;:::-;21176:2;21171:3;21167:12;21160:19;;20819:366;;;:::o;21191:419::-;21357:4;21395:2;21384:9;21380:18;21372:26;;21444:9;21438:4;21434:20;21430:1;21419:9;21415:17;21408:47;21472:131;21598:4;21472:131;:::i;:::-;21464:139;;21191:419;;;:::o;21616:224::-;21756:34;21752:1;21744:6;21740:14;21733:58;21825:7;21820:2;21812:6;21808:15;21801:32;21616:224;:::o;21846:366::-;21988:3;22009:67;22073:2;22068:3;22009:67;:::i;:::-;22002:74;;22085:93;22174:3;22085:93;:::i;:::-;22203:2;22198:3;22194:12;22187:19;;21846:366;;;:::o;22218:419::-;22384:4;22422:2;22411:9;22407:18;22399:26;;22471:9;22465:4;22461:20;22457:1;22446:9;22442:17;22435:47;22499:131;22625:4;22499:131;:::i;:::-;22491:139;;22218:419;;;:::o;22643:224::-;22783:34;22779:1;22771:6;22767:14;22760:58;22852:7;22847:2;22839:6;22835:15;22828:32;22643:224;:::o;22873:366::-;23015:3;23036:67;23100:2;23095:3;23036:67;:::i;:::-;23029:74;;23112:93;23201:3;23112:93;:::i;:::-;23230:2;23225:3;23221:12;23214:19;;22873:366;;;:::o;23245:419::-;23411:4;23449:2;23438:9;23434:18;23426:26;;23498:9;23492:4;23488:20;23484:1;23473:9;23469:17;23462:47;23526:131;23652:4;23526:131;:::i;:::-;23518:139;;23245:419;;;:::o;23670:225::-;23810:34;23806:1;23798:6;23794:14;23787:58;23879:8;23874:2;23866:6;23862:15;23855:33;23670:225;:::o;23901:366::-;24043:3;24064:67;24128:2;24123:3;24064:67;:::i;:::-;24057:74;;24140:93;24229:3;24140:93;:::i;:::-;24258:2;24253:3;24249:12;24242:19;;23901:366;;;:::o;24273:419::-;24439:4;24477:2;24466:9;24462:18;24454:26;;24526:9;24520:4;24516:20;24512:1;24501:9;24497:17;24490:47;24554:131;24680:4;24554:131;:::i;:::-;24546:139;;24273:419;;;:::o;24698:181::-;24838:33;24834:1;24826:6;24822:14;24815:57;24698:181;:::o;24885:366::-;25027:3;25048:67;25112:2;25107:3;25048:67;:::i;:::-;25041:74;;25124:93;25213:3;25124:93;:::i;:::-;25242:2;25237:3;25233:12;25226:19;;24885:366;;;:::o;25257:419::-;25423:4;25461:2;25450:9;25446:18;25438:26;;25510:9;25504:4;25500:20;25496:1;25485:9;25481:17;25474:47;25538:131;25664:4;25538:131;:::i;:::-;25530:139;;25257:419;;;:::o;25682:223::-;25822:34;25818:1;25810:6;25806:14;25799:58;25891:6;25886:2;25878:6;25874:15;25867:31;25682:223;:::o;25911:366::-;26053:3;26074:67;26138:2;26133:3;26074:67;:::i;:::-;26067:74;;26150:93;26239:3;26150:93;:::i;:::-;26268:2;26263:3;26259:12;26252:19;;25911:366;;;:::o;26283:419::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26536:9;26530:4;26526:20;26522:1;26511:9;26507:17;26500:47;26564:131;26690:4;26564:131;:::i;:::-;26556:139;;26283:419;;;:::o;26708:221::-;26848:34;26844:1;26836:6;26832:14;26825:58;26917:4;26912:2;26904:6;26900:15;26893:29;26708:221;:::o;26935:366::-;27077:3;27098:67;27162:2;27157:3;27098:67;:::i;:::-;27091:74;;27174:93;27263:3;27174:93;:::i;:::-;27292:2;27287:3;27283:12;27276:19;;26935:366;;;:::o;27307:419::-;27473:4;27511:2;27500:9;27496:18;27488:26;;27560:9;27554:4;27550:20;27546:1;27535:9;27531:17;27524:47;27588:131;27714:4;27588:131;:::i;:::-;27580:139;;27307:419;;;:::o;27732:224::-;27872:34;27868:1;27860:6;27856:14;27849:58;27941:7;27936:2;27928:6;27924:15;27917:32;27732:224;:::o;27962:366::-;28104:3;28125:67;28189:2;28184:3;28125:67;:::i;:::-;28118:74;;28201:93;28290:3;28201:93;:::i;:::-;28319:2;28314:3;28310:12;28303:19;;27962:366;;;:::o;28334:419::-;28500:4;28538:2;28527:9;28523:18;28515:26;;28587:9;28581:4;28577:20;28573:1;28562:9;28558:17;28551:47;28615:131;28741:4;28615:131;:::i;:::-;28607:139;;28334:419;;;:::o;28759:222::-;28899:34;28895:1;28887:6;28883:14;28876:58;28968:5;28963:2;28955:6;28951:15;28944:30;28759:222;:::o;28987:366::-;29129:3;29150:67;29214:2;29209:3;29150:67;:::i;:::-;29143:74;;29226:93;29315:3;29226:93;:::i;:::-;29344:2;29339:3;29335:12;29328:19;;28987:366;;;:::o;29359:419::-;29525:4;29563:2;29552:9;29548:18;29540:26;;29612:9;29606:4;29602:20;29598:1;29587:9;29583:17;29576:47;29640:131;29766:4;29640:131;:::i;:::-;29632:139;;29359:419;;;:::o;29784:225::-;29924:34;29920:1;29912:6;29908:14;29901:58;29993:8;29988:2;29980:6;29976:15;29969:33;29784:225;:::o;30015:366::-;30157:3;30178:67;30242:2;30237:3;30178:67;:::i;:::-;30171:74;;30254:93;30343:3;30254:93;:::i;:::-;30372:2;30367:3;30363:12;30356:19;;30015:366;;;:::o;30387:419::-;30553:4;30591:2;30580:9;30576:18;30568:26;;30640:9;30634:4;30630:20;30626:1;30615:9;30611:17;30604:47;30668:131;30794:4;30668:131;:::i;:::-;30660:139;;30387:419;;;:::o;30812:148::-;30914:11;30951:3;30936:18;;30812:148;;;;:::o;30966:173::-;31106:25;31102:1;31094:6;31090:14;31083:49;30966:173;:::o;31145:402::-;31305:3;31326:85;31408:2;31403:3;31326:85;:::i;:::-;31319:92;;31420:93;31509:3;31420:93;:::i;:::-;31538:2;31533:3;31529:12;31522:19;;31145:402;;;:::o;31553:377::-;31659:3;31687:39;31720:5;31687:39;:::i;:::-;31742:89;31824:6;31819:3;31742:89;:::i;:::-;31735:96;;31840:52;31885:6;31880:3;31873:4;31866:5;31862:16;31840:52;:::i;:::-;31917:6;31912:3;31908:16;31901:23;;31663:267;31553:377;;;;:::o;31936:167::-;32076:19;32072:1;32064:6;32060:14;32053:43;31936:167;:::o;32109:402::-;32269:3;32290:85;32372:2;32367:3;32290:85;:::i;:::-;32283:92;;32384:93;32473:3;32384:93;:::i;:::-;32502:2;32497:3;32493:12;32486:19;;32109:402;;;:::o;32517:967::-;32899:3;32921:148;33065:3;32921:148;:::i;:::-;32914:155;;33086:95;33177:3;33168:6;33086:95;:::i;:::-;33079:102;;33198:148;33342:3;33198:148;:::i;:::-;33191:155;;33363:95;33454:3;33445:6;33363:95;:::i;:::-;33356:102;;33475:3;33468:10;;32517:967;;;;;:::o;33490:98::-;33541:6;33575:5;33569:12;33559:22;;33490:98;;;:::o;33594:168::-;33677:11;33711:6;33706:3;33699:19;33751:4;33746:3;33742:14;33727:29;;33594:168;;;;:::o;33768:360::-;33854:3;33882:38;33914:5;33882:38;:::i;:::-;33936:70;33999:6;33994:3;33936:70;:::i;:::-;33929:77;;34015:52;34060:6;34055:3;34048:4;34041:5;34037:16;34015:52;:::i;:::-;34092:29;34114:6;34092:29;:::i;:::-;34087:3;34083:39;34076:46;;33858:270;33768:360;;;;:::o;34134:640::-;34329:4;34367:3;34356:9;34352:19;34344:27;;34381:71;34449:1;34438:9;34434:17;34425:6;34381:71;:::i;:::-;34462:72;34530:2;34519:9;34515:18;34506:6;34462:72;:::i;:::-;34544;34612:2;34601:9;34597:18;34588:6;34544:72;:::i;:::-;34663:9;34657:4;34653:20;34648:2;34637:9;34633:18;34626:48;34691:76;34762:4;34753:6;34691:76;:::i;:::-;34683:84;;34134:640;;;;;;;:::o;34780:141::-;34836:5;34867:6;34861:13;34852:22;;34883:32;34909:5;34883:32;:::i;:::-;34780:141;;;;:::o;34927:349::-;34996:6;35045:2;35033:9;35024:7;35020:23;35016:32;35013:119;;;35051:79;;:::i;:::-;35013:119;35171:1;35196:63;35251:7;35242:6;35231:9;35227:22;35196:63;:::i;:::-;35186:73;;35142:127;34927:349;;;;:::o;35282:230::-;35422:34;35418:1;35410:6;35406:14;35399:58;35491:13;35486:2;35478:6;35474:15;35467:38;35282:230;:::o;35518:366::-;35660:3;35681:67;35745:2;35740:3;35681:67;:::i;:::-;35674:74;;35757:93;35846:3;35757:93;:::i;:::-;35875:2;35870:3;35866:12;35859:19;;35518:366;;;:::o;35890:419::-;36056:4;36094:2;36083:9;36079:18;36071:26;;36143:9;36137:4;36133:20;36129:1;36118:9;36114:17;36107:47;36171:131;36297:4;36171:131;:::i;:::-;36163:139;;35890:419;;;:::o;36315:223::-;36455:34;36451:1;36443:6;36439:14;36432:58;36524:6;36519:2;36511:6;36507:15;36500:31;36315:223;:::o;36544:366::-;36686:3;36707:67;36771:2;36766:3;36707:67;:::i;:::-;36700:74;;36783:93;36872:3;36783:93;:::i;:::-;36901:2;36896:3;36892:12;36885:19;;36544:366;;;:::o;36916:419::-;37082:4;37120:2;37109:9;37105:18;37097:26;;37169:9;37163:4;37159:20;37155:1;37144:9;37140:17;37133:47;37197:131;37323:4;37197:131;:::i;:::-;37189:139;;36916:419;;;:::o;37341:529::-;37508:4;37546:2;37535:9;37531:18;37523:26;;37559:71;37627:1;37616:9;37612:17;37603:6;37559:71;:::i;:::-;37640:72;37708:2;37697:9;37693:18;37684:6;37640:72;:::i;:::-;37759:9;37753:4;37749:20;37744:2;37733:9;37729:18;37722:48;37787:76;37858:4;37849:6;37787:76;:::i;:::-;37779:84;;37341:529;;;;;;:::o;37876:348::-;37916:7;37939:20;37957:1;37939:20;:::i;:::-;37934:25;;37973:20;37991:1;37973:20;:::i;:::-;37968:25;;38161:1;38093:66;38089:74;38086:1;38083:81;38078:1;38071:9;38064:17;38060:105;38057:131;;;38168:18;;:::i;:::-;38057:131;38216:1;38213;38209:9;38198:20;;37876:348;;;;:::o;38230:180::-;38278:77;38275:1;38268:88;38375:4;38372:1;38365:15;38399:4;38396:1;38389:15;38416:171;38455:3;38478:24;38496:5;38478:24;:::i;:::-;38469:33;;38524:4;38517:5;38514:15;38511:41;;;38532:18;;:::i;:::-;38511:41;38579:1;38572:5;38568:13;38561:20;;38416:171;;;:::o;38593:182::-;38733:34;38729:1;38721:6;38717:14;38710:58;38593:182;:::o;38781:366::-;38923:3;38944:67;39008:2;39003:3;38944:67;:::i;:::-;38937:74;;39020:93;39109:3;39020:93;:::i;:::-;39138:2;39133:3;39129:12;39122:19;;38781:366;;;:::o;39153:419::-;39319:4;39357:2;39346:9;39342:18;39334:26;;39406:9;39400:4;39396:20;39392:1;39381:9;39377:17;39370:47;39434:131;39560:4;39434:131;:::i;:::-;39426:139;;39153:419;;;:::o;39578:175::-;39718:27;39714:1;39706:6;39702:14;39695:51;39578:175;:::o;39759:366::-;39901:3;39922:67;39986:2;39981:3;39922:67;:::i;:::-;39915:74;;39998:93;40087:3;39998:93;:::i;:::-;40116:2;40111:3;40107:12;40100:19;;39759:366;;;:::o;40131:419::-;40297:4;40335:2;40324:9;40320:18;40312:26;;40384:9;40378:4;40374:20;40370:1;40359:9;40355:17;40348:47;40412:131;40538:4;40412:131;:::i;:::-;40404:139;;40131:419;;;:::o;40556:220::-;40696:34;40692:1;40684:6;40680:14;40673:58;40765:3;40760:2;40752:6;40748:15;40741:28;40556:220;:::o;40782:366::-;40924:3;40945:67;41009:2;41004:3;40945:67;:::i;:::-;40938:74;;41021:93;41110:3;41021:93;:::i;:::-;41139:2;41134:3;41130:12;41123:19;;40782:366;;;:::o;41154:419::-;41320:4;41358:2;41347:9;41343:18;41335:26;;41407:9;41401:4;41397:20;41393:1;41382:9;41378:17;41371:47;41435:131;41561:4;41435:131;:::i;:::-;41427:139;;41154:419;;;:::o;41579:221::-;41719:34;41715:1;41707:6;41703:14;41696:58;41788:4;41783:2;41775:6;41771:15;41764:29;41579:221;:::o;41806:366::-;41948:3;41969:67;42033:2;42028:3;41969:67;:::i;:::-;41962:74;;42045:93;42134:3;42045:93;:::i;:::-;42163:2;42158:3;42154:12;42147:19;;41806:366;;;:::o;42178:419::-;42344:4;42382:2;42371:9;42367:18;42359:26;;42431:9;42425:4;42421:20;42417:1;42406:9;42402:17;42395:47;42459:131;42585:4;42459:131;:::i;:::-;42451:139;;42178:419;;;:::o;42603:191::-;42643:4;42663:20;42681:1;42663:20;:::i;:::-;42658:25;;42697:20;42715:1;42697:20;:::i;:::-;42692:25;;42736:1;42733;42730:8;42727:34;;;42741:18;;:::i;:::-;42727:34;42786:1;42783;42779:9;42771:17;;42603:191;;;;:::o

Swarm Source

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