ETH Price: $2,485.48 (-1.47%)

Token

GROption (GRO)
 

Overview

Max Total Supply

237 GRO

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GRO
0x8f182b62dec9f617ace7403c8bcf6419bace7991
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:
GROption

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 8 of 16: GROption.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC721Preset.sol";
import "./Counters.sol";

contract GROption is ERC721Preset {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    uint256 private _userTokenIdCounter = 0;

    IERC20 private grom;
    IERC20 private usdt;

    struct Option {
        uint256 id;
        uint256 price;
        uint256 total;
        uint256 expirationAmount;
        uint256 endDateAt;
    }

    struct OptionUser {
        uint256 id;
        uint256 optionId;
        address wallet;
        uint256 tokenId;
        uint256 price;
        uint256 expirationAmount;
        bool isCreated;
        bool isPaid;
        uint256 endDateAt;
    }

    string private _uri;

    mapping(uint256 => Option) public options;
    mapping(uint256 => uint256) public optionsBuy;
    mapping(uint256 => OptionUser) public optionUsers;
    constructor(string memory _url, IERC20 gromContract, IERC20 usdtContract) ERC721Preset("GROption", "GRO") {
        grom = gromContract;
        usdt = usdtContract;
        _uri = _url;
    }

    function _setURI(string memory newuri) external onlyOwner {
        _uri = newuri;
    }

    function _getURI() internal view virtual returns (string memory) {
        return _uri;
    }

    function addOption(uint256 _id, uint256 _price, uint256 _total, uint256 _expirationAmount, uint256 _endDateAt) external onlyOwner {
        options[_id] = Option(_id, _price, _total, _expirationAmount, _endDateAt);
    }

    function buyByGr(uint256 _id, uint256 _optionId) public {
        require(optionsBuy[_optionId] <= options[_optionId].total, "Can't buy more");

        uint256 _amount = options[_optionId].price;
        uint256 allowance = grom.allowance(msg.sender, address(this));
        require(allowance >= _amount, "Check the token allowance");

        (bool sent) = grom.transferFrom(msg.sender, address(this), _amount);
        require(sent, "Failed to send GROM");
        optionsBuy[_optionId] = optionsBuy[_optionId] + 1;
        addOptionUser(_id, _optionId, msg.sender);
    }

    function addOptionUser(uint256 _id, uint256 _optionId, address wallet) private {
        require(!optionUsers[_id].isCreated, "Option exist");
        uint256 tokenId = _userTokenIdCounter;
        optionUsers[_id] = OptionUser(_id, options[_optionId].id, wallet, tokenId, options[_optionId].price, options[_optionId].expirationAmount, true, false, options[_optionId].endDateAt);
        _userTokenIdCounter++;
    }

    function safeMint(address to) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }

    function multipleMint(uint256 _numOfTokens) external onlyOwner {
        for (uint256 i = 0; i < _numOfTokens; i++) {
            safeMint(msg.sender);
        }
    }

    function transferNFT(
        address to,
        uint256 tokenId
    ) external onlyOwner {
        _transfer(owner(), to, tokenId);
    }

    function revertNFT(
        uint256 tokenId
    ) external onlyOwner {
        address from = ERC721.ownerOf(tokenId);
        _transfer(from, owner(), tokenId);
    }

    function pay(
        uint256 _id
    ) public {
        if (optionUsers[_id].isPaid || block.timestamp <= optionUsers[_id].endDateAt) {
            require(false, "GROption: is paid or too early");
        } else if (!optionUsers[_id].isPaid && block.timestamp >= optionUsers[_id].endDateAt) {
            uint256 amount = usdt.balanceOf(address(this));
            require(amount >= optionUsers[_id].expirationAmount, "GROption: amount sent is not correct");

            address from = ERC721.ownerOf(optionUsers[_id].tokenId);
            require(from == msg.sender, "GROption: is not owner");

            usdt.transfer(from, optionUsers[_id].expirationAmount);
            optionUsers[_id].isPaid = true;
            _transfer(from, owner(), optionUsers[_id].tokenId);
        }
    }

    function timestamp() public view returns (uint256){
        return block.timestamp;
    }

    function withdrawEth() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function withdrawGr() external onlyOwner {
        uint256 balance = grom.balanceOf(address(this));
        require(balance > 0, "GROption: amount sent is not correct");

        grom.transfer(owner(), balance);
    }

    function withdrawUsdt() external onlyOwner {
        uint256 balance = usdt.balanceOf(address(this));
        require(balance > 0, "GROption: amount sent is not correct");

        usdt.transfer(owner(), balance);
    }

    function uri(uint256 _tokenId) public view returns (string memory)
    {
        return string(abi.encodePacked(_getURI(), Strings.toString(_tokenId)));
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 2 of 16: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 16: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 4 of 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 5 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";
import "./Ownable.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, Ownable {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override onlyOwner {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override onlyOwner {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override onlyOwner {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override onlyOwner {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual onlyOwner {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual onlyOwner {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                 }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) 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.
     * - `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 tokenId
    ) internal virtual {}
}

File 6 of 16: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 16: ERC721Preset.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Context.sol";
import "./Counters.sol";
import "./IERC20.sol";
import "./Strings.sol";

/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 *
 * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._
 */
contract ERC721Preset is
Context,
ERC721Enumerable
{

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(
        string memory name,
        string memory symbol
    ) ERC721(name, symbol) {
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 9 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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 10 of 16: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 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 11 of 16: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 12 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 13 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 14 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 15 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

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


File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_url","type":"string"},{"internalType":"contract IERC20","name":"gromContract","type":"address"},{"internalType":"contract IERC20","name":"usdtContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"_setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_expirationAmount","type":"uint256"},{"internalType":"uint256","name":"_endDateAt","type":"uint256"}],"name":"addOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_optionId","type":"uint256"}],"name":"buyByGr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"multipleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionUsers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionId","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"expirationAmount","type":"uint256"},{"internalType":"bool","name":"isCreated","type":"bool"},{"internalType":"bool","name":"isPaid","type":"bool"},{"internalType":"uint256","name":"endDateAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"options","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"expirationAmount","type":"uint256"},{"internalType":"uint256","name":"endDateAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionsBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"revertNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"timestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawGr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawUsdt","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c553480156200001657600080fd5b50604051620059443803806200594483398181016040528101906200003c9190620003a9565b6040518060400160405280600881526020017f47524f7074696f6e0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f47524f00000000000000000000000000000000000000000000000000000000008152508181620000ca620000be620001a460201b60201c565b620001ac60201b60201c565b8160019080519060200190620000e292919062000270565b508060029080519060200190620000fb92919062000270565b505050505081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600f90805190602001906200019a92919062000270565b50505050620005ea565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027e90620004f5565b90600052602060002090601f016020900481019282620002a25760008555620002ee565b82601f10620002bd57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ed578251825591602001919060010190620002d0565b5b509050620002fd919062000301565b5090565b5b808211156200031c57600081600090555060010162000302565b5090565b600062000337620003318462000441565b62000418565b9050828152602081018484840111156200035057600080fd5b6200035d848285620004bf565b509392505050565b6000815190506200037681620005d0565b92915050565b600082601f8301126200038e57600080fd5b8151620003a084826020860162000320565b91505092915050565b600080600060608486031215620003bf57600080fd5b600084015167ffffffffffffffff811115620003da57600080fd5b620003e8868287016200037c565b9350506020620003fb8682870162000365565b92505060406200040e8682870162000365565b9150509250925092565b60006200042462000437565b90506200043282826200052b565b919050565b6000604051905090565b600067ffffffffffffffff8211156200045f576200045e62000590565b5b6200046a82620005bf565b9050602081019050919050565b600062000484826200049f565b9050919050565b6000620004988262000477565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620004df578082015181840152602081019050620004c2565b83811115620004ef576000848401525b50505050565b600060028204905060018216806200050e57607f821691505b6020821081141562000525576200052462000561565b5b50919050565b6200053682620005bf565b810181811067ffffffffffffffff8211171562000558576200055762000590565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620005db816200048b565b8114620005e757600080fd5b50565b61534a80620005fa6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806370a0823111610125578063a0ef91df116100ad578063c290d6911161007c578063c290d691146105f4578063c87b56dd14610610578063e985e9c514610640578063f2fde38b14610670578063f392d4f51461068c57610211565b8063a0ef91df14610594578063a22cb4651461059e578063b80777ea146105ba578063b88d4fde146105d857610211565b80637d7c6408116100f45780637d7c6408146104f05780638da5cb5b1461050c57806392a685aa1461052a57806394ab67fe1461055a57806395d89b411461057657610211565b806370a0823114610462578063715018a61461049257806375895b131461049c5780637956dc00146104b857610211565b80632f745c59116101a8578063459cd2e211610177578063459cd2e2146103d25780634f6ccce7146103dc5780635c21706b1461040c5780636352211e146104285780636865b8e71461045857610211565b80632f745c5914610336578063409e22051461036657806340d097c31461039a57806342842e0e146103b657610211565b80630e89341c116101e45780630e89341c146102b057806318160ddd146102e05780631b1f6c76146102fe57806323b872dd1461031a57610211565b806301ffc9a71461021657806306fdde0314610246578063081812fc14610264578063095ea7b314610294575b600080fd5b610230600480360381019061022b9190613d59565b6106a8565b60405161023d9190614440565b60405180910390f35b61024e6106ba565b60405161025b919061445b565b60405180910390f35b61027e60048036038101906102799190613dec565b61074c565b60405161028b9190614350565b60405180910390f35b6102ae60048036038101906102a99190613cf4565b6107d1565b005b6102ca60048036038101906102c59190613dec565b6108e9565b6040516102d7919061445b565b60405180910390f35b6102e8610923565b6040516102f5919061479d565b60405180910390f35b61031860048036038101906103139190613dec565b610930565b005b610334600480360381019061032f9190613bee565b6109cf565b005b610350600480360381019061034b9190613cf4565b610aab565b60405161035d919061479d565b60405180910390f35b610380600480360381019061037b9190613dec565b610b50565b604051610391959493929190614845565b60405180910390f35b6103b460048036038101906103af9190613b89565b610b86565b005b6103d060048036038101906103cb9190613bee565b610c28565b005b6103da610cc4565b005b6103f660048036038101906103f19190613dec565b610eec565b604051610403919061479d565b60405180910390f35b61042660048036038101906104219190613e3e565b610f83565b005b610442600480360381019061043d9190613dec565b61123c565b60405161044f9190614350565b60405180910390f35b6104606112ee565b005b61047c60048036038101906104779190613b89565b611516565b604051610489919061479d565b60405180910390f35b61049a6115ce565b005b6104b660048036038101906104b19190613dec565b611656565b005b6104d260048036038101906104cd9190613dec565b6116fd565b6040516104e7999897969594939291906147b8565b60405180910390f35b61050a60048036038101906105059190613e7a565b611785565b005b610514611877565b6040516105219190614350565b60405180910390f35b610544600480360381019061053f9190613dec565b6118a0565b604051610551919061479d565b60405180910390f35b610574600480360381019061056f9190613cf4565b6118b8565b005b61057e61194a565b60405161058b919061445b565b60405180910390f35b61059c6119dc565b005b6105b860048036038101906105b39190613cb8565b611aa8565b005b6105c2611b3a565b6040516105cf919061479d565b60405180910390f35b6105f260048036038101906105ed9190613c3d565b611b42565b005b61060e60048036038101906106099190613dec565b611c20565b005b61062a60048036038101906106259190613dec565b611fb9565b604051610637919061445b565b60405180910390f35b61065a60048036038101906106559190613bb2565b612060565b6040516106679190614440565b60405180910390f35b61068a60048036038101906106859190613b89565b6120f4565b005b6106a660048036038101906106a19190613dab565b6121ec565b005b60006106b382612282565b9050919050565b6060600180546106c990614ad3565b80601f01602080910402602001604051908101604052809291908181526020018280546106f590614ad3565b80156107425780601f1061071757610100808354040283529160200191610742565b820191906000526020600020905b81548152906001019060200180831161072557829003601f168201915b5050505050905090565b6000610757826122fc565b610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d9061469d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107dc8261123c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561084d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610844906146fd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086c612368565b73ffffffffffffffffffffffffffffffffffffffff16148061089b575061089a81610895612368565b612060565b5b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d1906145dd565b60405180910390fd5b6108e48383612370565b505050565b60606108f3612429565b6108fc836124bb565b60405160200161090d92919061432c565b6040516020818303038152906040529050919050565b6000600980549050905090565b610938612368565b73ffffffffffffffffffffffffffffffffffffffff16610956611877565b73ffffffffffffffffffffffffffffffffffffffff16146109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a3906146bd565b60405180910390fd5b60006109b78261123c565b90506109cb816109c5611877565b84612668565b5050565b6109d7612368565b73ffffffffffffffffffffffffffffffffffffffff166109f5611877565b73ffffffffffffffffffffffffffffffffffffffff1614610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906146bd565b60405180910390fd5b610a5c610a56612368565b826128cf565b610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a929061475d565b60405180910390fd5b610aa6838383612668565b505050565b6000610ab683611516565b8210610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee9061447d565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60106020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b610b8e612368565b73ffffffffffffffffffffffffffffffffffffffff16610bac611877565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf9906146bd565b60405180910390fd5b6000610c0e600b6129ad565b9050610c1a600b6129bb565b610c2482826129d1565b5050565b610c30612368565b73ffffffffffffffffffffffffffffffffffffffff16610c4e611877565b73ffffffffffffffffffffffffffffffffffffffff1614610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b906146bd565b60405180910390fd5b610cbf83838360405180602001604052806000815250611b42565b505050565b610ccc612368565b73ffffffffffffffffffffffffffffffffffffffff16610cea611877565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d37906146bd565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d9d9190614350565b60206040518083038186803b158015610db557600080fd5b505afa158015610dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ded9190613e15565b905060008111610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061451d565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610e78611877565b836040518363ffffffff1660e01b8152600401610e96929190614417565b602060405180830381600087803b158015610eb057600080fd5b505af1158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190613d30565b5050565b6000610ef6610923565b8210610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061477d565b60405180910390fd5b60098281548110610f71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601060008281526020019081526020016000206002015460116000838152602001908152602001600020541115610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe69061473d565b60405180910390fd5b6000601060008381526020019081526020016000206001015490506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161106992919061436b565b60206040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190613e15565b9050818110156110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f5906145fd565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161115f93929190614394565b602060405180830381600087803b15801561117957600080fd5b505af115801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190613d30565b9050806111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061471d565b60405180910390fd5b600160116000868152602001908152602001600020546112139190614962565b6011600086815260200190815260200160002081905550611235858533612a6b565b5050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061463d565b60405180910390fd5b80915050919050565b6112f6612368565b73ffffffffffffffffffffffffffffffffffffffff16611314611877565b73ffffffffffffffffffffffffffffffffffffffff161461136a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611361906146bd565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113c79190614350565b60206040518083038186803b1580156113df57600080fd5b505afa1580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190613e15565b90506000811161145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114539061451d565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114a2611877565b836040518363ffffffff1660e01b81526004016114c0929190614417565b602060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190613d30565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e9061461d565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115d6612368565b73ffffffffffffffffffffffffffffffffffffffff166115f4611877565b73ffffffffffffffffffffffffffffffffffffffff161461164a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611641906146bd565b60405180910390fd5b6116546000612c82565b565b61165e612368565b73ffffffffffffffffffffffffffffffffffffffff1661167c611877565b73ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c9906146bd565b60405180910390fd5b60005b818110156116f9576116e633610b86565b80806116f190614b36565b9150506116d5565b5050565b60126020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060070154905089565b61178d612368565b73ffffffffffffffffffffffffffffffffffffffff166117ab611877565b73ffffffffffffffffffffffffffffffffffffffff1614611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f8906146bd565b60405180910390fd5b6040518060a00160405280868152602001858152602001848152602001838152602001828152506010600087815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60116020528060005260406000206000915090505481565b6118c0612368565b73ffffffffffffffffffffffffffffffffffffffff166118de611877565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b906146bd565b60405180910390fd5b61194661193f611877565b8383612668565b5050565b60606002805461195990614ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461198590614ad3565b80156119d25780601f106119a7576101008083540402835291602001916119d2565b820191906000526020600020905b8154815290600101906020018083116119b557829003601f168201915b5050505050905090565b6119e4612368565b73ffffffffffffffffffffffffffffffffffffffff16611a02611877565b73ffffffffffffffffffffffffffffffffffffffff1614611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f906146bd565b60405180910390fd5b611a60611877565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611aa5573d6000803e3d6000fd5b50565b611ab0612368565b73ffffffffffffffffffffffffffffffffffffffff16611ace611877565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b906146bd565b60405180910390fd5b611b36611b2f612368565b8383612d46565b5050565b600042905090565b611b4a612368565b73ffffffffffffffffffffffffffffffffffffffff16611b68611877565b73ffffffffffffffffffffffffffffffffffffffff1614611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb5906146bd565b60405180910390fd5b611bcf611bc9612368565b836128cf565b611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c059061475d565b60405180910390fd5b611c1a84848484612eb3565b50505050565b6012600082815260200190815260200160002060060160019054906101000a900460ff1680611c65575060126000828152602001908152602001600020600701544211155b15611cb0576000611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca29061455d565b60405180910390fd5b611fb6565b6012600082815260200190815260200160002060060160019054906101000a900460ff16158015611cf7575060126000828152602001908152602001600020600701544210155b15611fb5576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d599190614350565b60206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da99190613e15565b90506012600083815260200190815260200160002060050154811015611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb9061451d565b60405180910390fd5b6000611e25601260008581526020019081526020016000206003015461123c565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c9061465d565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8260126000878152602001908152602001600020600501546040518363ffffffff1660e01b8152600401611f08929190614417565b602060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190613d30565b5060016012600085815260200190815260200160002060060160016101000a81548160ff021916908315150217905550611fb281611f96611877565b6012600087815260200190815260200160002060030154612668565b50505b5b50565b6060611fc4826122fc565b612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906146dd565b60405180910390fd5b600061200d612f0f565b9050600081511161202d5760405180602001604052806000815250612058565b80612037846124bb565b60405160200161204892919061432c565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120fc612368565b73ffffffffffffffffffffffffffffffffffffffff1661211a611877565b73ffffffffffffffffffffffffffffffffffffffff1614612170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612167906146bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d7906144bd565b60405180910390fd5b6121e981612c82565b50565b6121f4612368565b73ffffffffffffffffffffffffffffffffffffffff16612212611877565b73ffffffffffffffffffffffffffffffffffffffff1614612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f906146bd565b60405180910390fd5b80600f908051906020019061227e929190613983565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f557506122f482612f26565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123e38361123c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600f805461243890614ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461246490614ad3565b80156124b15780601f10612486576101008083540402835291602001916124b1565b820191906000526020600020905b81548152906001019060200180831161249457829003601f168201915b5050505050905090565b60606000821415612503576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612663565b600082905060005b6000821461253557808061251e90614b36565b915050600a8261252e91906149b8565b915061250b565b60008167ffffffffffffffff811115612577577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125a95781602001600182028036833780820191505090505b5090505b6000851461265c576001826125c291906149e9565b9150600a856125d19190614b7f565b60306125dd9190614962565b60f81b818381518110612619577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561265591906149b8565b94506125ad565b8093505050505b919050565b8273ffffffffffffffffffffffffffffffffffffffff166126888261123c565b73ffffffffffffffffffffffffffffffffffffffff16146126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d5906144dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127459061453d565b60405180910390fd5b612759838383613008565b612764600082612370565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b491906149e9565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280b9190614962565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ca838383613018565b505050565b60006128da826122fc565b612919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129109061459d565b60405180910390fd5b60006129248361123c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061296657506129658185612060565b5b806129a457508373ffffffffffffffffffffffffffffffffffffffff1661298c8461074c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6129d9612368565b73ffffffffffffffffffffffffffffffffffffffff166129f7611877565b73ffffffffffffffffffffffffffffffffffffffff1614612a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a44906146bd565b60405180910390fd5b612a6782826040518060200160405280600081525061301d565b5050565b6012600084815260200190815260200160002060060160009054906101000a900460ff1615612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac6906145bd565b60405180910390fd5b6000600c549050604051806101200160405280858152602001601060008681526020019081526020016000206000015481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020016010600086815260200190815260200160002060010154815260200160106000868152602001908152602001600020600301548152602001600115158152602001600015158152602001601060008681526020019081526020016000206004015481525060126000868152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e08201518160060160016101000a81548160ff0219169083151502179055506101008201518160070155905050600c6000815480929190612c7790614b36565b919050555050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac9061457d565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ea69190614440565b60405180910390a3505050565b612ebe848484612668565b612eca848484846130f4565b612f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f009061449d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ff157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061300157506130008261328b565b5b9050919050565b6130138383836132f5565b505050565b505050565b613025612368565b73ffffffffffffffffffffffffffffffffffffffff16613043611877565b73ffffffffffffffffffffffffffffffffffffffff1614613099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613090906146bd565b60405180910390fd5b6130a38383613409565b6130b060008484846130f4565b6130ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e69061449d565b60405180910390fd5b505050565b60006131158473ffffffffffffffffffffffffffffffffffffffff166135e3565b1561327e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261313e612368565b8786866040518563ffffffff1660e01b815260040161316094939291906143cb565b602060405180830381600087803b15801561317a57600080fd5b505af19250505080156131ab57506040513d601f19601f820116820180604052508101906131a89190613d82565b60015b61322e573d80600081146131db576040519150601f19603f3d011682016040523d82523d6000602084013e6131e0565b606091505b50600081511415613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d9061449d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613283565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613300838383613606565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133435761333e8161360b565b613382565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613381576133808382613654565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133c5576133c0816137c1565b613404565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613403576134028282613904565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134709061467d565b60405180910390fd5b613482816122fc565b156134c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b9906144fd565b60405180910390fd5b6134ce60008383613008565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461351e9190614962565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135df60008383613018565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161366184611516565b61366b91906149e9565b9050600060086000848152602001908152602001600020549050818114613750576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506137d591906149e9565b90506000600a600084815260200190815260200160002054905060006009838154811061382b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613873577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806138e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061390f83611516565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461398f90614ad3565b90600052602060002090601f0160209004810192826139b157600085556139f8565b82601f106139ca57805160ff19168380011785556139f8565b828001600101855582156139f8579182015b828111156139f75782518255916020019190600101906139dc565b5b509050613a059190613a09565b5090565b5b80821115613a22576000816000905550600101613a0a565b5090565b6000613a39613a34846148bd565b614898565b905082815260208101848484011115613a5157600080fd5b613a5c848285614a91565b509392505050565b6000613a77613a72846148ee565b614898565b905082815260208101848484011115613a8f57600080fd5b613a9a848285614a91565b509392505050565b600081359050613ab1816152b8565b92915050565b600081359050613ac6816152cf565b92915050565b600081519050613adb816152cf565b92915050565b600081359050613af0816152e6565b92915050565b600081519050613b05816152e6565b92915050565b600082601f830112613b1c57600080fd5b8135613b2c848260208601613a26565b91505092915050565b600082601f830112613b4657600080fd5b8135613b56848260208601613a64565b91505092915050565b600081359050613b6e816152fd565b92915050565b600081519050613b83816152fd565b92915050565b600060208284031215613b9b57600080fd5b6000613ba984828501613aa2565b91505092915050565b60008060408385031215613bc557600080fd5b6000613bd385828601613aa2565b9250506020613be485828601613aa2565b9150509250929050565b600080600060608486031215613c0357600080fd5b6000613c1186828701613aa2565b9350506020613c2286828701613aa2565b9250506040613c3386828701613b5f565b9150509250925092565b60008060008060808587031215613c5357600080fd5b6000613c6187828801613aa2565b9450506020613c7287828801613aa2565b9350506040613c8387828801613b5f565b925050606085013567ffffffffffffffff811115613ca057600080fd5b613cac87828801613b0b565b91505092959194509250565b60008060408385031215613ccb57600080fd5b6000613cd985828601613aa2565b9250506020613cea85828601613ab7565b9150509250929050565b60008060408385031215613d0757600080fd5b6000613d1585828601613aa2565b9250506020613d2685828601613b5f565b9150509250929050565b600060208284031215613d4257600080fd5b6000613d5084828501613acc565b91505092915050565b600060208284031215613d6b57600080fd5b6000613d7984828501613ae1565b91505092915050565b600060208284031215613d9457600080fd5b6000613da284828501613af6565b91505092915050565b600060208284031215613dbd57600080fd5b600082013567ffffffffffffffff811115613dd757600080fd5b613de384828501613b35565b91505092915050565b600060208284031215613dfe57600080fd5b6000613e0c84828501613b5f565b91505092915050565b600060208284031215613e2757600080fd5b6000613e3584828501613b74565b91505092915050565b60008060408385031215613e5157600080fd5b6000613e5f85828601613b5f565b9250506020613e7085828601613b5f565b9150509250929050565b600080600080600060a08688031215613e9257600080fd5b6000613ea088828901613b5f565b9550506020613eb188828901613b5f565b9450506040613ec288828901613b5f565b9350506060613ed388828901613b5f565b9250506080613ee488828901613b5f565b9150509295509295909350565b613efa81614a1d565b82525050565b613f0981614a2f565b82525050565b6000613f1a8261491f565b613f248185614935565b9350613f34818560208601614aa0565b613f3d81614c6c565b840191505092915050565b6000613f538261492a565b613f5d8185614946565b9350613f6d818560208601614aa0565b613f7681614c6c565b840191505092915050565b6000613f8c8261492a565b613f968185614957565b9350613fa6818560208601614aa0565b80840191505092915050565b6000613fbf602b83614946565b9150613fca82614c7d565b604082019050919050565b6000613fe2603283614946565b9150613fed82614ccc565b604082019050919050565b6000614005602683614946565b915061401082614d1b565b604082019050919050565b6000614028602583614946565b915061403382614d6a565b604082019050919050565b600061404b601c83614946565b915061405682614db9565b602082019050919050565b600061406e602483614946565b915061407982614de2565b604082019050919050565b6000614091602483614946565b915061409c82614e31565b604082019050919050565b60006140b4601e83614946565b91506140bf82614e80565b602082019050919050565b60006140d7601983614946565b91506140e282614ea9565b602082019050919050565b60006140fa602c83614946565b915061410582614ed2565b604082019050919050565b600061411d600c83614946565b915061412882614f21565b602082019050919050565b6000614140603883614946565b915061414b82614f4a565b604082019050919050565b6000614163601983614946565b915061416e82614f99565b602082019050919050565b6000614186602a83614946565b915061419182614fc2565b604082019050919050565b60006141a9602983614946565b91506141b482615011565b604082019050919050565b60006141cc601683614946565b91506141d782615060565b602082019050919050565b60006141ef602083614946565b91506141fa82615089565b602082019050919050565b6000614212602c83614946565b915061421d826150b2565b604082019050919050565b6000614235602083614946565b915061424082615101565b602082019050919050565b6000614258602f83614946565b91506142638261512a565b604082019050919050565b600061427b602183614946565b915061428682615179565b604082019050919050565b600061429e601383614946565b91506142a9826151c8565b602082019050919050565b60006142c1600e83614946565b91506142cc826151f1565b602082019050919050565b60006142e4603183614946565b91506142ef8261521a565b604082019050919050565b6000614307602c83614946565b915061431282615269565b604082019050919050565b61432681614a87565b82525050565b60006143388285613f81565b91506143448284613f81565b91508190509392505050565b60006020820190506143656000830184613ef1565b92915050565b60006040820190506143806000830185613ef1565b61438d6020830184613ef1565b9392505050565b60006060820190506143a96000830186613ef1565b6143b66020830185613ef1565b6143c3604083018461431d565b949350505050565b60006080820190506143e06000830187613ef1565b6143ed6020830186613ef1565b6143fa604083018561431d565b818103606083015261440c8184613f0f565b905095945050505050565b600060408201905061442c6000830185613ef1565b614439602083018461431d565b9392505050565b60006020820190506144556000830184613f00565b92915050565b600060208201905081810360008301526144758184613f48565b905092915050565b6000602082019050818103600083015261449681613fb2565b9050919050565b600060208201905081810360008301526144b681613fd5565b9050919050565b600060208201905081810360008301526144d681613ff8565b9050919050565b600060208201905081810360008301526144f68161401b565b9050919050565b600060208201905081810360008301526145168161403e565b9050919050565b6000602082019050818103600083015261453681614061565b9050919050565b6000602082019050818103600083015261455681614084565b9050919050565b60006020820190508181036000830152614576816140a7565b9050919050565b60006020820190508181036000830152614596816140ca565b9050919050565b600060208201905081810360008301526145b6816140ed565b9050919050565b600060208201905081810360008301526145d681614110565b9050919050565b600060208201905081810360008301526145f681614133565b9050919050565b6000602082019050818103600083015261461681614156565b9050919050565b6000602082019050818103600083015261463681614179565b9050919050565b600060208201905081810360008301526146568161419c565b9050919050565b60006020820190508181036000830152614676816141bf565b9050919050565b60006020820190508181036000830152614696816141e2565b9050919050565b600060208201905081810360008301526146b681614205565b9050919050565b600060208201905081810360008301526146d681614228565b9050919050565b600060208201905081810360008301526146f68161424b565b9050919050565b600060208201905081810360008301526147168161426e565b9050919050565b6000602082019050818103600083015261473681614291565b9050919050565b60006020820190508181036000830152614756816142b4565b9050919050565b60006020820190508181036000830152614776816142d7565b9050919050565b60006020820190508181036000830152614796816142fa565b9050919050565b60006020820190506147b2600083018461431d565b92915050565b6000610120820190506147ce600083018c61431d565b6147db602083018b61431d565b6147e8604083018a613ef1565b6147f5606083018961431d565b614802608083018861431d565b61480f60a083018761431d565b61481c60c0830186613f00565b61482960e0830185613f00565b61483761010083018461431d565b9a9950505050505050505050565b600060a08201905061485a600083018861431d565b614867602083018761431d565b614874604083018661431d565b614881606083018561431d565b61488e608083018461431d565b9695505050505050565b60006148a26148b3565b90506148ae8282614b05565b919050565b6000604051905090565b600067ffffffffffffffff8211156148d8576148d7614c3d565b5b6148e182614c6c565b9050602081019050919050565b600067ffffffffffffffff82111561490957614908614c3d565b5b61491282614c6c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061496d82614a87565b915061497883614a87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ad576149ac614bb0565b5b828201905092915050565b60006149c382614a87565b91506149ce83614a87565b9250826149de576149dd614bdf565b5b828204905092915050565b60006149f482614a87565b91506149ff83614a87565b925082821015614a1257614a11614bb0565b5b828203905092915050565b6000614a2882614a67565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614abe578082015181840152602081019050614aa3565b83811115614acd576000848401525b50505050565b60006002820490506001821680614aeb57607f821691505b60208210811415614aff57614afe614c0e565b5b50919050565b614b0e82614c6c565b810181811067ffffffffffffffff82111715614b2d57614b2c614c3d565b5b80604052505050565b6000614b4182614a87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b7457614b73614bb0565b5b600182019050919050565b6000614b8a82614a87565b9150614b9583614a87565b925082614ba557614ba4614bdf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f47524f7074696f6e3a20616d6f756e742073656e74206973206e6f7420636f7260008201527f7265637400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f47524f7074696f6e3a2069732070616964206f7220746f6f206561726c790000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f7074696f6e2065786973740000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f47524f7074696f6e3a206973206e6f74206f776e657200000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e642047524f4d00000000000000000000000000600082015250565b7f43616e277420627579206d6f7265000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6152c181614a1d565b81146152cc57600080fd5b50565b6152d881614a2f565b81146152e357600080fd5b50565b6152ef81614a3b565b81146152fa57600080fd5b50565b61530681614a87565b811461531157600080fd5b5056fea2646970667358221220270e91e1df4016caa411edc0c5d81354c8c2375aba27be673acc7235ddd02f5764736f6c634300080400330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ce593a29905951e8fc579bc092eca72577da575c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f636d732e67722e62697a2f6170692f6f7074696f6e732f00

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806370a0823111610125578063a0ef91df116100ad578063c290d6911161007c578063c290d691146105f4578063c87b56dd14610610578063e985e9c514610640578063f2fde38b14610670578063f392d4f51461068c57610211565b8063a0ef91df14610594578063a22cb4651461059e578063b80777ea146105ba578063b88d4fde146105d857610211565b80637d7c6408116100f45780637d7c6408146104f05780638da5cb5b1461050c57806392a685aa1461052a57806394ab67fe1461055a57806395d89b411461057657610211565b806370a0823114610462578063715018a61461049257806375895b131461049c5780637956dc00146104b857610211565b80632f745c59116101a8578063459cd2e211610177578063459cd2e2146103d25780634f6ccce7146103dc5780635c21706b1461040c5780636352211e146104285780636865b8e71461045857610211565b80632f745c5914610336578063409e22051461036657806340d097c31461039a57806342842e0e146103b657610211565b80630e89341c116101e45780630e89341c146102b057806318160ddd146102e05780631b1f6c76146102fe57806323b872dd1461031a57610211565b806301ffc9a71461021657806306fdde0314610246578063081812fc14610264578063095ea7b314610294575b600080fd5b610230600480360381019061022b9190613d59565b6106a8565b60405161023d9190614440565b60405180910390f35b61024e6106ba565b60405161025b919061445b565b60405180910390f35b61027e60048036038101906102799190613dec565b61074c565b60405161028b9190614350565b60405180910390f35b6102ae60048036038101906102a99190613cf4565b6107d1565b005b6102ca60048036038101906102c59190613dec565b6108e9565b6040516102d7919061445b565b60405180910390f35b6102e8610923565b6040516102f5919061479d565b60405180910390f35b61031860048036038101906103139190613dec565b610930565b005b610334600480360381019061032f9190613bee565b6109cf565b005b610350600480360381019061034b9190613cf4565b610aab565b60405161035d919061479d565b60405180910390f35b610380600480360381019061037b9190613dec565b610b50565b604051610391959493929190614845565b60405180910390f35b6103b460048036038101906103af9190613b89565b610b86565b005b6103d060048036038101906103cb9190613bee565b610c28565b005b6103da610cc4565b005b6103f660048036038101906103f19190613dec565b610eec565b604051610403919061479d565b60405180910390f35b61042660048036038101906104219190613e3e565b610f83565b005b610442600480360381019061043d9190613dec565b61123c565b60405161044f9190614350565b60405180910390f35b6104606112ee565b005b61047c60048036038101906104779190613b89565b611516565b604051610489919061479d565b60405180910390f35b61049a6115ce565b005b6104b660048036038101906104b19190613dec565b611656565b005b6104d260048036038101906104cd9190613dec565b6116fd565b6040516104e7999897969594939291906147b8565b60405180910390f35b61050a60048036038101906105059190613e7a565b611785565b005b610514611877565b6040516105219190614350565b60405180910390f35b610544600480360381019061053f9190613dec565b6118a0565b604051610551919061479d565b60405180910390f35b610574600480360381019061056f9190613cf4565b6118b8565b005b61057e61194a565b60405161058b919061445b565b60405180910390f35b61059c6119dc565b005b6105b860048036038101906105b39190613cb8565b611aa8565b005b6105c2611b3a565b6040516105cf919061479d565b60405180910390f35b6105f260048036038101906105ed9190613c3d565b611b42565b005b61060e60048036038101906106099190613dec565b611c20565b005b61062a60048036038101906106259190613dec565b611fb9565b604051610637919061445b565b60405180910390f35b61065a60048036038101906106559190613bb2565b612060565b6040516106679190614440565b60405180910390f35b61068a60048036038101906106859190613b89565b6120f4565b005b6106a660048036038101906106a19190613dab565b6121ec565b005b60006106b382612282565b9050919050565b6060600180546106c990614ad3565b80601f01602080910402602001604051908101604052809291908181526020018280546106f590614ad3565b80156107425780601f1061071757610100808354040283529160200191610742565b820191906000526020600020905b81548152906001019060200180831161072557829003601f168201915b5050505050905090565b6000610757826122fc565b610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d9061469d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107dc8261123c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561084d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610844906146fd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086c612368565b73ffffffffffffffffffffffffffffffffffffffff16148061089b575061089a81610895612368565b612060565b5b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d1906145dd565b60405180910390fd5b6108e48383612370565b505050565b60606108f3612429565b6108fc836124bb565b60405160200161090d92919061432c565b6040516020818303038152906040529050919050565b6000600980549050905090565b610938612368565b73ffffffffffffffffffffffffffffffffffffffff16610956611877565b73ffffffffffffffffffffffffffffffffffffffff16146109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a3906146bd565b60405180910390fd5b60006109b78261123c565b90506109cb816109c5611877565b84612668565b5050565b6109d7612368565b73ffffffffffffffffffffffffffffffffffffffff166109f5611877565b73ffffffffffffffffffffffffffffffffffffffff1614610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906146bd565b60405180910390fd5b610a5c610a56612368565b826128cf565b610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a929061475d565b60405180910390fd5b610aa6838383612668565b505050565b6000610ab683611516565b8210610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee9061447d565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60106020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b610b8e612368565b73ffffffffffffffffffffffffffffffffffffffff16610bac611877565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf9906146bd565b60405180910390fd5b6000610c0e600b6129ad565b9050610c1a600b6129bb565b610c2482826129d1565b5050565b610c30612368565b73ffffffffffffffffffffffffffffffffffffffff16610c4e611877565b73ffffffffffffffffffffffffffffffffffffffff1614610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b906146bd565b60405180910390fd5b610cbf83838360405180602001604052806000815250611b42565b505050565b610ccc612368565b73ffffffffffffffffffffffffffffffffffffffff16610cea611877565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d37906146bd565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d9d9190614350565b60206040518083038186803b158015610db557600080fd5b505afa158015610dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ded9190613e15565b905060008111610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061451d565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610e78611877565b836040518363ffffffff1660e01b8152600401610e96929190614417565b602060405180830381600087803b158015610eb057600080fd5b505af1158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190613d30565b5050565b6000610ef6610923565b8210610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061477d565b60405180910390fd5b60098281548110610f71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601060008281526020019081526020016000206002015460116000838152602001908152602001600020541115610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe69061473d565b60405180910390fd5b6000601060008381526020019081526020016000206001015490506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161106992919061436b565b60206040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190613e15565b9050818110156110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f5906145fd565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161115f93929190614394565b602060405180830381600087803b15801561117957600080fd5b505af115801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190613d30565b9050806111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061471d565b60405180910390fd5b600160116000868152602001908152602001600020546112139190614962565b6011600086815260200190815260200160002081905550611235858533612a6b565b5050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061463d565b60405180910390fd5b80915050919050565b6112f6612368565b73ffffffffffffffffffffffffffffffffffffffff16611314611877565b73ffffffffffffffffffffffffffffffffffffffff161461136a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611361906146bd565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113c79190614350565b60206040518083038186803b1580156113df57600080fd5b505afa1580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190613e15565b90506000811161145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114539061451d565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114a2611877565b836040518363ffffffff1660e01b81526004016114c0929190614417565b602060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190613d30565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e9061461d565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115d6612368565b73ffffffffffffffffffffffffffffffffffffffff166115f4611877565b73ffffffffffffffffffffffffffffffffffffffff161461164a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611641906146bd565b60405180910390fd5b6116546000612c82565b565b61165e612368565b73ffffffffffffffffffffffffffffffffffffffff1661167c611877565b73ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c9906146bd565b60405180910390fd5b60005b818110156116f9576116e633610b86565b80806116f190614b36565b9150506116d5565b5050565b60126020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060070154905089565b61178d612368565b73ffffffffffffffffffffffffffffffffffffffff166117ab611877565b73ffffffffffffffffffffffffffffffffffffffff1614611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f8906146bd565b60405180910390fd5b6040518060a00160405280868152602001858152602001848152602001838152602001828152506010600087815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60116020528060005260406000206000915090505481565b6118c0612368565b73ffffffffffffffffffffffffffffffffffffffff166118de611877565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b906146bd565b60405180910390fd5b61194661193f611877565b8383612668565b5050565b60606002805461195990614ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461198590614ad3565b80156119d25780601f106119a7576101008083540402835291602001916119d2565b820191906000526020600020905b8154815290600101906020018083116119b557829003601f168201915b5050505050905090565b6119e4612368565b73ffffffffffffffffffffffffffffffffffffffff16611a02611877565b73ffffffffffffffffffffffffffffffffffffffff1614611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f906146bd565b60405180910390fd5b611a60611877565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611aa5573d6000803e3d6000fd5b50565b611ab0612368565b73ffffffffffffffffffffffffffffffffffffffff16611ace611877565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b906146bd565b60405180910390fd5b611b36611b2f612368565b8383612d46565b5050565b600042905090565b611b4a612368565b73ffffffffffffffffffffffffffffffffffffffff16611b68611877565b73ffffffffffffffffffffffffffffffffffffffff1614611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb5906146bd565b60405180910390fd5b611bcf611bc9612368565b836128cf565b611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c059061475d565b60405180910390fd5b611c1a84848484612eb3565b50505050565b6012600082815260200190815260200160002060060160019054906101000a900460ff1680611c65575060126000828152602001908152602001600020600701544211155b15611cb0576000611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca29061455d565b60405180910390fd5b611fb6565b6012600082815260200190815260200160002060060160019054906101000a900460ff16158015611cf7575060126000828152602001908152602001600020600701544210155b15611fb5576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d599190614350565b60206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da99190613e15565b90506012600083815260200190815260200160002060050154811015611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb9061451d565b60405180910390fd5b6000611e25601260008581526020019081526020016000206003015461123c565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c9061465d565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8260126000878152602001908152602001600020600501546040518363ffffffff1660e01b8152600401611f08929190614417565b602060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190613d30565b5060016012600085815260200190815260200160002060060160016101000a81548160ff021916908315150217905550611fb281611f96611877565b6012600087815260200190815260200160002060030154612668565b50505b5b50565b6060611fc4826122fc565b612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906146dd565b60405180910390fd5b600061200d612f0f565b9050600081511161202d5760405180602001604052806000815250612058565b80612037846124bb565b60405160200161204892919061432c565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120fc612368565b73ffffffffffffffffffffffffffffffffffffffff1661211a611877565b73ffffffffffffffffffffffffffffffffffffffff1614612170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612167906146bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d7906144bd565b60405180910390fd5b6121e981612c82565b50565b6121f4612368565b73ffffffffffffffffffffffffffffffffffffffff16612212611877565b73ffffffffffffffffffffffffffffffffffffffff1614612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f906146bd565b60405180910390fd5b80600f908051906020019061227e929190613983565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f557506122f482612f26565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123e38361123c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600f805461243890614ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461246490614ad3565b80156124b15780601f10612486576101008083540402835291602001916124b1565b820191906000526020600020905b81548152906001019060200180831161249457829003601f168201915b5050505050905090565b60606000821415612503576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612663565b600082905060005b6000821461253557808061251e90614b36565b915050600a8261252e91906149b8565b915061250b565b60008167ffffffffffffffff811115612577577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125a95781602001600182028036833780820191505090505b5090505b6000851461265c576001826125c291906149e9565b9150600a856125d19190614b7f565b60306125dd9190614962565b60f81b818381518110612619577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561265591906149b8565b94506125ad565b8093505050505b919050565b8273ffffffffffffffffffffffffffffffffffffffff166126888261123c565b73ffffffffffffffffffffffffffffffffffffffff16146126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d5906144dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127459061453d565b60405180910390fd5b612759838383613008565b612764600082612370565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b491906149e9565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280b9190614962565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ca838383613018565b505050565b60006128da826122fc565b612919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129109061459d565b60405180910390fd5b60006129248361123c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061296657506129658185612060565b5b806129a457508373ffffffffffffffffffffffffffffffffffffffff1661298c8461074c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6129d9612368565b73ffffffffffffffffffffffffffffffffffffffff166129f7611877565b73ffffffffffffffffffffffffffffffffffffffff1614612a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a44906146bd565b60405180910390fd5b612a6782826040518060200160405280600081525061301d565b5050565b6012600084815260200190815260200160002060060160009054906101000a900460ff1615612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac6906145bd565b60405180910390fd5b6000600c549050604051806101200160405280858152602001601060008681526020019081526020016000206000015481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020016010600086815260200190815260200160002060010154815260200160106000868152602001908152602001600020600301548152602001600115158152602001600015158152602001601060008681526020019081526020016000206004015481525060126000868152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e08201518160060160016101000a81548160ff0219169083151502179055506101008201518160070155905050600c6000815480929190612c7790614b36565b919050555050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac9061457d565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ea69190614440565b60405180910390a3505050565b612ebe848484612668565b612eca848484846130f4565b612f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f009061449d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ff157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061300157506130008261328b565b5b9050919050565b6130138383836132f5565b505050565b505050565b613025612368565b73ffffffffffffffffffffffffffffffffffffffff16613043611877565b73ffffffffffffffffffffffffffffffffffffffff1614613099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613090906146bd565b60405180910390fd5b6130a38383613409565b6130b060008484846130f4565b6130ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e69061449d565b60405180910390fd5b505050565b60006131158473ffffffffffffffffffffffffffffffffffffffff166135e3565b1561327e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261313e612368565b8786866040518563ffffffff1660e01b815260040161316094939291906143cb565b602060405180830381600087803b15801561317a57600080fd5b505af19250505080156131ab57506040513d601f19601f820116820180604052508101906131a89190613d82565b60015b61322e573d80600081146131db576040519150601f19603f3d011682016040523d82523d6000602084013e6131e0565b606091505b50600081511415613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d9061449d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613283565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613300838383613606565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133435761333e8161360b565b613382565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613381576133808382613654565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133c5576133c0816137c1565b613404565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613403576134028282613904565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134709061467d565b60405180910390fd5b613482816122fc565b156134c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b9906144fd565b60405180910390fd5b6134ce60008383613008565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461351e9190614962565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135df60008383613018565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161366184611516565b61366b91906149e9565b9050600060086000848152602001908152602001600020549050818114613750576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506137d591906149e9565b90506000600a600084815260200190815260200160002054905060006009838154811061382b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613873577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806138e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061390f83611516565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461398f90614ad3565b90600052602060002090601f0160209004810192826139b157600085556139f8565b82601f106139ca57805160ff19168380011785556139f8565b828001600101855582156139f8579182015b828111156139f75782518255916020019190600101906139dc565b5b509050613a059190613a09565b5090565b5b80821115613a22576000816000905550600101613a0a565b5090565b6000613a39613a34846148bd565b614898565b905082815260208101848484011115613a5157600080fd5b613a5c848285614a91565b509392505050565b6000613a77613a72846148ee565b614898565b905082815260208101848484011115613a8f57600080fd5b613a9a848285614a91565b509392505050565b600081359050613ab1816152b8565b92915050565b600081359050613ac6816152cf565b92915050565b600081519050613adb816152cf565b92915050565b600081359050613af0816152e6565b92915050565b600081519050613b05816152e6565b92915050565b600082601f830112613b1c57600080fd5b8135613b2c848260208601613a26565b91505092915050565b600082601f830112613b4657600080fd5b8135613b56848260208601613a64565b91505092915050565b600081359050613b6e816152fd565b92915050565b600081519050613b83816152fd565b92915050565b600060208284031215613b9b57600080fd5b6000613ba984828501613aa2565b91505092915050565b60008060408385031215613bc557600080fd5b6000613bd385828601613aa2565b9250506020613be485828601613aa2565b9150509250929050565b600080600060608486031215613c0357600080fd5b6000613c1186828701613aa2565b9350506020613c2286828701613aa2565b9250506040613c3386828701613b5f565b9150509250925092565b60008060008060808587031215613c5357600080fd5b6000613c6187828801613aa2565b9450506020613c7287828801613aa2565b9350506040613c8387828801613b5f565b925050606085013567ffffffffffffffff811115613ca057600080fd5b613cac87828801613b0b565b91505092959194509250565b60008060408385031215613ccb57600080fd5b6000613cd985828601613aa2565b9250506020613cea85828601613ab7565b9150509250929050565b60008060408385031215613d0757600080fd5b6000613d1585828601613aa2565b9250506020613d2685828601613b5f565b9150509250929050565b600060208284031215613d4257600080fd5b6000613d5084828501613acc565b91505092915050565b600060208284031215613d6b57600080fd5b6000613d7984828501613ae1565b91505092915050565b600060208284031215613d9457600080fd5b6000613da284828501613af6565b91505092915050565b600060208284031215613dbd57600080fd5b600082013567ffffffffffffffff811115613dd757600080fd5b613de384828501613b35565b91505092915050565b600060208284031215613dfe57600080fd5b6000613e0c84828501613b5f565b91505092915050565b600060208284031215613e2757600080fd5b6000613e3584828501613b74565b91505092915050565b60008060408385031215613e5157600080fd5b6000613e5f85828601613b5f565b9250506020613e7085828601613b5f565b9150509250929050565b600080600080600060a08688031215613e9257600080fd5b6000613ea088828901613b5f565b9550506020613eb188828901613b5f565b9450506040613ec288828901613b5f565b9350506060613ed388828901613b5f565b9250506080613ee488828901613b5f565b9150509295509295909350565b613efa81614a1d565b82525050565b613f0981614a2f565b82525050565b6000613f1a8261491f565b613f248185614935565b9350613f34818560208601614aa0565b613f3d81614c6c565b840191505092915050565b6000613f538261492a565b613f5d8185614946565b9350613f6d818560208601614aa0565b613f7681614c6c565b840191505092915050565b6000613f8c8261492a565b613f968185614957565b9350613fa6818560208601614aa0565b80840191505092915050565b6000613fbf602b83614946565b9150613fca82614c7d565b604082019050919050565b6000613fe2603283614946565b9150613fed82614ccc565b604082019050919050565b6000614005602683614946565b915061401082614d1b565b604082019050919050565b6000614028602583614946565b915061403382614d6a565b604082019050919050565b600061404b601c83614946565b915061405682614db9565b602082019050919050565b600061406e602483614946565b915061407982614de2565b604082019050919050565b6000614091602483614946565b915061409c82614e31565b604082019050919050565b60006140b4601e83614946565b91506140bf82614e80565b602082019050919050565b60006140d7601983614946565b91506140e282614ea9565b602082019050919050565b60006140fa602c83614946565b915061410582614ed2565b604082019050919050565b600061411d600c83614946565b915061412882614f21565b602082019050919050565b6000614140603883614946565b915061414b82614f4a565b604082019050919050565b6000614163601983614946565b915061416e82614f99565b602082019050919050565b6000614186602a83614946565b915061419182614fc2565b604082019050919050565b60006141a9602983614946565b91506141b482615011565b604082019050919050565b60006141cc601683614946565b91506141d782615060565b602082019050919050565b60006141ef602083614946565b91506141fa82615089565b602082019050919050565b6000614212602c83614946565b915061421d826150b2565b604082019050919050565b6000614235602083614946565b915061424082615101565b602082019050919050565b6000614258602f83614946565b91506142638261512a565b604082019050919050565b600061427b602183614946565b915061428682615179565b604082019050919050565b600061429e601383614946565b91506142a9826151c8565b602082019050919050565b60006142c1600e83614946565b91506142cc826151f1565b602082019050919050565b60006142e4603183614946565b91506142ef8261521a565b604082019050919050565b6000614307602c83614946565b915061431282615269565b604082019050919050565b61432681614a87565b82525050565b60006143388285613f81565b91506143448284613f81565b91508190509392505050565b60006020820190506143656000830184613ef1565b92915050565b60006040820190506143806000830185613ef1565b61438d6020830184613ef1565b9392505050565b60006060820190506143a96000830186613ef1565b6143b66020830185613ef1565b6143c3604083018461431d565b949350505050565b60006080820190506143e06000830187613ef1565b6143ed6020830186613ef1565b6143fa604083018561431d565b818103606083015261440c8184613f0f565b905095945050505050565b600060408201905061442c6000830185613ef1565b614439602083018461431d565b9392505050565b60006020820190506144556000830184613f00565b92915050565b600060208201905081810360008301526144758184613f48565b905092915050565b6000602082019050818103600083015261449681613fb2565b9050919050565b600060208201905081810360008301526144b681613fd5565b9050919050565b600060208201905081810360008301526144d681613ff8565b9050919050565b600060208201905081810360008301526144f68161401b565b9050919050565b600060208201905081810360008301526145168161403e565b9050919050565b6000602082019050818103600083015261453681614061565b9050919050565b6000602082019050818103600083015261455681614084565b9050919050565b60006020820190508181036000830152614576816140a7565b9050919050565b60006020820190508181036000830152614596816140ca565b9050919050565b600060208201905081810360008301526145b6816140ed565b9050919050565b600060208201905081810360008301526145d681614110565b9050919050565b600060208201905081810360008301526145f681614133565b9050919050565b6000602082019050818103600083015261461681614156565b9050919050565b6000602082019050818103600083015261463681614179565b9050919050565b600060208201905081810360008301526146568161419c565b9050919050565b60006020820190508181036000830152614676816141bf565b9050919050565b60006020820190508181036000830152614696816141e2565b9050919050565b600060208201905081810360008301526146b681614205565b9050919050565b600060208201905081810360008301526146d681614228565b9050919050565b600060208201905081810360008301526146f68161424b565b9050919050565b600060208201905081810360008301526147168161426e565b9050919050565b6000602082019050818103600083015261473681614291565b9050919050565b60006020820190508181036000830152614756816142b4565b9050919050565b60006020820190508181036000830152614776816142d7565b9050919050565b60006020820190508181036000830152614796816142fa565b9050919050565b60006020820190506147b2600083018461431d565b92915050565b6000610120820190506147ce600083018c61431d565b6147db602083018b61431d565b6147e8604083018a613ef1565b6147f5606083018961431d565b614802608083018861431d565b61480f60a083018761431d565b61481c60c0830186613f00565b61482960e0830185613f00565b61483761010083018461431d565b9a9950505050505050505050565b600060a08201905061485a600083018861431d565b614867602083018761431d565b614874604083018661431d565b614881606083018561431d565b61488e608083018461431d565b9695505050505050565b60006148a26148b3565b90506148ae8282614b05565b919050565b6000604051905090565b600067ffffffffffffffff8211156148d8576148d7614c3d565b5b6148e182614c6c565b9050602081019050919050565b600067ffffffffffffffff82111561490957614908614c3d565b5b61491282614c6c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061496d82614a87565b915061497883614a87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149ad576149ac614bb0565b5b828201905092915050565b60006149c382614a87565b91506149ce83614a87565b9250826149de576149dd614bdf565b5b828204905092915050565b60006149f482614a87565b91506149ff83614a87565b925082821015614a1257614a11614bb0565b5b828203905092915050565b6000614a2882614a67565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614abe578082015181840152602081019050614aa3565b83811115614acd576000848401525b50505050565b60006002820490506001821680614aeb57607f821691505b60208210811415614aff57614afe614c0e565b5b50919050565b614b0e82614c6c565b810181811067ffffffffffffffff82111715614b2d57614b2c614c3d565b5b80604052505050565b6000614b4182614a87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b7457614b73614bb0565b5b600182019050919050565b6000614b8a82614a87565b9150614b9583614a87565b925082614ba557614ba4614bdf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f47524f7074696f6e3a20616d6f756e742073656e74206973206e6f7420636f7260008201527f7265637400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f47524f7074696f6e3a2069732070616964206f7220746f6f206561726c790000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f7074696f6e2065786973740000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f47524f7074696f6e3a206973206e6f74206f776e657200000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e642047524f4d00000000000000000000000000600082015250565b7f43616e277420627579206d6f7265000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6152c181614a1d565b81146152cc57600080fd5b50565b6152d881614a2f565b81146152e357600080fd5b50565b6152ef81614a3b565b81146152fa57600080fd5b50565b61530681614a87565b811461531157600080fd5b5056fea2646970667358221220270e91e1df4016caa411edc0c5d81354c8c2375aba27be673acc7235ddd02f5764736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ce593a29905951e8fc579bc092eca72577da575c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f636d732e67722e62697a2f6170692f6f7074696f6e732f00

-----Decoded View---------------
Arg [0] : _url (string): https://cms.gr.biz/api/options/
Arg [1] : gromContract (address): 0xcE593a29905951E8Fc579bC092ecA72577dA575c
Arg [2] : usdtContract (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000ce593a29905951e8fc579bc092eca72577da575c
Arg [2] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [4] : 68747470733a2f2f636d732e67722e62697a2f6170692f6f7074696f6e732f00


Deployed Bytecode Sourcemap

112:4718:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1690:193:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2444:98:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3956:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3494:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4670:158:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1614:111:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3045:167:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4693:340:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;772:41:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;2545:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5099:189:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4222:217:7;;;:::i;:::-;;1797:230:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1542:575:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2147:235:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4445:219:7;;;:::i;:::-;;1885:205:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:14;;;:::i;:::-;;2727:167:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;870:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;1316:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1029:85:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;819:45:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2900:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2606:102:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4109:107:7;;;:::i;:::-;;4240:163:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4014:89:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5354:330:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3218:790:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2774:329:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4469:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1123:88:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1690:193:6;1813:4;1840:36;1864:11;1840:23;:36::i;:::-;1833:43;;1690:193;;;:::o;2444:98:4:-;2498:13;2530:5;2523:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2444:98;:::o;3956:217::-;4032:7;4059:16;4067:7;4059;:16::i;:::-;4051:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4142:15;:24;4158:7;4142:24;;;;;;;;;;;;;;;;;;;;;4135:31;;3956:217;;;:::o;3494:401::-;3574:13;3590:23;3605:7;3590:14;:23::i;:::-;3574:39;;3637:5;3631:11;;:2;:11;;;;3623:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3728:5;3712:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3737:37;3754:5;3761:12;:10;:12::i;:::-;3737:16;:37::i;:::-;3712:62;3691:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3867:21;3876:2;3880:7;3867:8;:21::i;:::-;3494:401;;;:::o;4670:158:7:-;4722:13;4782:9;:7;:9::i;:::-;4793:26;4810:8;4793:16;:26::i;:::-;4765:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4751:70;;4670:158;;;:::o;1614:111:5:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;3045:167:7:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3124:12:7::1;3139:23;3154:7;3139:14;:23::i;:::-;3124:38;;3172:33;3182:4;3188:7;:5;:7::i;:::-;3197;3172:9;:33::i;:::-;1311:1:14;3045:167:7::0;:::o;4693:340:4:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4892:41:4::1;4911:12;:10;:12::i;:::-;4925:7;4892:18;:41::i;:::-;4884:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4998:28;5008:4;5014:2;5018:7;4998:9;:28::i;:::-;4693:340:::0;;;:::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;772:41:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2545:176::-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2602:15:7::1;2620:25;:15;:23;:25::i;:::-;2602:43;;2655:27;:15;:25;:27::i;:::-;2692:22;2702:2;2706:7;2692:9;:22::i;:::-;1311:1:14;2545:176:7::0;:::o;5099:189:4:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5242:39:4::1;5259:4;5265:2;5269:7;5242:39;;;;;;;;;;;::::0;:16:::1;:39::i;:::-;5099:189:::0;;;:::o;4222:217:7:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4273:15:7::1;4291:4;;;;;;;;;;;:14;;;4314:4;4291:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4273:47;;4348:1;4338:7;:11;4330:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4401:4;;;;;;;;;;;:13;;;4415:7;:5;:7::i;:::-;4424;4401:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1311:1:14;4222:217:7:o:0;1797:230:5:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;;;;;;;;;;;;;;;;;1996:24;;1797:230;;;:::o;1542:575:7:-;1641:7;:18;1649:9;1641:18;;;;;;;;;;;:24;;;1616:10;:21;1627:9;1616:21;;;;;;;;;;;;:49;;1608:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1695:15;1713:7;:18;1721:9;1713:18;;;;;;;;;;;:24;;;1695:42;;1747:17;1767:4;;;;;;;;;;;:14;;;1782:10;1802:4;1767:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1747:61;;1839:7;1826:9;:20;;1818:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1888:9;1901:4;;;;;;;;;;;:17;;;1919:10;1939:4;1946:7;1901:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1887:67;;1972:4;1964:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2058:1;2034:10;:21;2045:9;2034:21;;;;;;;;;;;;:25;;;;:::i;:::-;2010:10;:21;2021:9;2010:21;;;;;;;;;;;:49;;;;2069:41;2083:3;2088:9;2099:10;2069:13;:41::i;:::-;1542:575;;;;;:::o;2147:235:4:-;2219:7;2238:13;2254:7;:16;2262:7;2254:16;;;;;;;;;;;;;;;;;;;;;2238:32;;2305:1;2288:19;;:5;:19;;;;2280:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2370:5;2363:12;;;2147:235;;;:::o;4445:219:7:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4498:15:7::1;4516:4;;;;;;;;;;;:14;;;4539:4;4516:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4498:47;;4573:1;4563:7;:11;4555:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4626:4;;;;;;;;;;;:13;;;4640:7;:5;:7::i;:::-;4649;4626:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1311:1:14;4445:219:7:o:0;1885:205:4:-;1957:7;2001:1;1984:19;;:5;:19;;;;1976:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2067:9;:16;2077:5;2067:16;;;;;;;;;;;;;;;;2060:23;;1885:205;;;:::o;1661:101:14:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2727:167:7:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2805:9:7::1;2800:88;2824:12;2820:1;:16;2800:88;;;2857:20;2866:10;2857:8;:20::i;:::-;2838:3;;;;;:::i;:::-;;;;2800:88;;;;2727:167:::0;:::o;870:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1316:220::-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1471:58:7::1;;;;;;;;1478:3;1471:58;;;;1483:6;1471:58;;;;1491:6;1471:58;;;;1499:17;1471:58;;;;1518:10;1471:58;;::::0;1456:7:::1;:12;1464:3;1456:12;;;;;;;;;;;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1316:220:::0;;;;;:::o;1029:85:14:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;819:45:7:-;;;;;;;;;;;;;;;;;:::o;2900:139::-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3001:31:7::1;3011:7;:5;:7::i;:::-;3020:2;3024:7;3001:9;:31::i;:::-;2900:139:::0;;:::o;2606:102:4:-;2662:13;2694:7;2687:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2606:102;:::o;4109:107:7:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4169:7:7::1;:5;:7::i;:::-;4161:25;;:48;4187:21;4161:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4109:107::o:0;4240:163:4:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4344:52:4::1;4363:12;:10;:12::i;:::-;4377:8;4387;4344:18;:52::i;:::-;4240:163:::0;;:::o;4014:89:7:-;4056:7;4081:15;4074:22;;4014:89;:::o;5354:330:4:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5533:41:4::1;5552:12;:10;:12::i;:::-;5566:7;5533:18;:41::i;:::-;5525:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5638:39;5652:4;5658:2;5662:7;5671:5;5638:13;:39::i;:::-;5354:330:::0;;;;:::o;3218:790:7:-;3279:11;:16;3291:3;3279:16;;;;;;;;;;;:23;;;;;;;;;;;;:72;;;;3325:11;:16;3337:3;3325:16;;;;;;;;;;;:26;;;3306:15;:45;;3279:72;3275:727;;;3375:5;3367:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;3275:727;;;3437:11;:16;3449:3;3437:16;;;;;;;;;;;:23;;;;;;;;;;;;3436:24;:73;;;;;3483:11;:16;3495:3;3483:16;;;;;;;;;;;:26;;;3464:15;:45;;3436:73;3432:570;;;3525:14;3542:4;;;;;;;;;;;:14;;;3565:4;3542:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3525:46;;3603:11;:16;3615:3;3603:16;;;;;;;;;;;:33;;;3593:6;:43;;3585:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;3692:12;3707:40;3722:11;:16;3734:3;3722:16;;;;;;;;;;;:24;;;3707:14;:40::i;:::-;3692:55;;3777:10;3769:18;;:4;:18;;;3761:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3829:4;;;;;;;;;;;:13;;;3843:4;3849:11;:16;3861:3;3849:16;;;;;;;;;;;:33;;;3829:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3923:4;3897:11;:16;3909:3;3897:16;;;;;;;;;;;:23;;;:30;;;;;;;;;;;;;;;;;;3941:50;3951:4;3957:7;:5;:7::i;:::-;3966:11;:16;3978:3;3966:16;;;;;;;;;;;:24;;;3941:9;:50::i;:::-;3432:570;;;3275:727;3218:790;:::o;2774:329:4:-;2847:13;2880:16;2888:7;2880;:16::i;:::-;2872:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2959:21;2983:10;:8;:10::i;:::-;2959:34;;3034:1;3016:7;3010:21;:25;:86;;;;;;;;;;;;;;;;;3062:7;3071:18;:7;:16;:18::i;:::-;3045:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3010:86;3003:93;;;2774:329;;;:::o;4469:162::-;4566:4;4589:18;:25;4608:5;4589:25;;;;;;;;;;;;;;;:35;4615:8;4589:35;;;;;;;;;;;;;;;;;;;;;;;;;4582:42;;4469:162;;;;:::o;1911:198:14:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1123:88:7:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1198:6:7::1;1191:4;:13;;;;;;;;;;;;:::i;:::-;;1123:88:::0;:::o;989:222:5:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;7156:125:4:-;7221:4;7272:1;7244:30;;:7;:16;7252:7;7244:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7237:37;;7156:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11185:171:4:-;11286:2;11259:15;:24;11275:7;11259:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11341:7;11337:2;11303:46;;11312:23;11327:7;11312:14;:23::i;:::-;11303:46;;;;;;;;;;;;11185:171;;:::o;1217:93:7:-;1267:13;1299:4;1292:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1217:93;:::o;328:703:15:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;10469:605:4:-;10623:4;10596:31;;:23;10611:7;10596:14;:23::i;:::-;:31;;;10588:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10701:1;10687:16;;:2;:16;;;;10679:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10755:39;10776:4;10782:2;10786:7;10755:20;:39::i;:::-;10856:29;10873:1;10877:7;10856:8;:29::i;:::-;10915:1;10896:9;:15;10906:4;10896:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10943:1;10926:9;:13;10936:2;10926:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10973:2;10954:7;:16;10962:7;10954:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11010:7;11006:2;10991:27;;11000:4;10991:27;;;;;;;;;;;;11029:38;11049:4;11055:2;11059:7;11029:19;:38::i;:::-;10469:605;;;:::o;7439:344::-;7532:4;7556:16;7564:7;7556;:16::i;:::-;7548:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7631:13;7647:23;7662:7;7647:14;:23::i;:::-;7631:39;;7699:5;7688:16;;:7;:16;;;:52;;;;7708:32;7725:5;7732:7;7708:16;:32::i;:::-;7688:52;:87;;;;7768:7;7744:31;;:20;7756:7;7744:11;:20::i;:::-;:31;;;7688:87;7680:96;;;7439:344;;;;:::o;827:112:2:-;892:7;918;:14;;;911:21;;827:112;;;:::o;945:123::-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;8113:118:4:-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8198:26:4::1;8208:2;8212:7;8198:26;;;;;;;;;;;::::0;:9:::1;:26::i;:::-;8113:118:::0;;:::o;2123:416:7:-;2221:11;:16;2233:3;2221:16;;;;;;;;;;;:26;;;;;;;;;;;;2220:27;2212:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2274:15;2292:19;;2274:37;;2340:161;;;;;;;;2351:3;2340:161;;;;2356:7;:18;2364:9;2356:18;;;;;;;;;;;:21;;;2340:161;;;;2379:6;2340:161;;;;;;2387:7;2340:161;;;;2396:7;:18;2404:9;2396:18;;;;;;;;;;;:24;;;2340:161;;;;2422:7;:18;2430:9;2422:18;;;;;;;;;;;:35;;;2340:161;;;;2459:4;2340:161;;;;;;2465:5;2340:161;;;;;;2472:7;:18;2480:9;2472:18;;;;;;;;;;;:28;;;2340:161;;;2321:11;:16;2333:3;2321:16;;;;;;;;;;;:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:19;;:21;;;;;;;;;:::i;:::-;;;;;;2123:416;;;;:::o;2263:187:14:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2263:187;;:::o;11491:307:4:-;11641:8;11632:17;;:5;:17;;;;11624:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11727:8;11689:18;:25;11708:5;11689:25;;;;;;;;;;;;;;;:35;11715:8;11689:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11772:8;11750:41;;11765:5;11750:41;;;11782:8;11750:41;;;;;;:::i;:::-;;;;;;;;11491:307;;;:::o;6546:::-;6697:28;6707:4;6713:2;6717:7;6697:9;:28::i;:::-;6743:48;6766:4;6772:2;6776:7;6785:5;6743:22;:48::i;:::-;6735:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6546:307;;;;:::o;3345:92::-;3396:13;3421:9;;;;;;;;;;;;;;3345:92;:::o;1538:288::-;1640:4;1686:25;1671:40;;;:11;:40;;;;:100;;;;1738:33;1723:48;;;:11;:48;;;;1671:100;:148;;;;1783:36;1807:11;1783:23;:36::i;:::-;1671:148;1656:163;;1538:288;;;:::o;1414:209:6:-;1571:45;1598:4;1604:2;1608:7;1571:26;:45::i;:::-;1414:209;;;:::o;14180:121:4:-;;;;:::o;8452:321::-;1252:12:14;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8587:18:4::1;8593:2;8597:7;8587:5;:18::i;:::-;8636:54;8667:1;8671:2;8675:7;8684:5;8636:22;:54::i;:::-;8615:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8452:321:::0;;;:::o;12351:779::-;12501:4;12521:15;:2;:13;;;:15::i;:::-;12517:607;;;12572:2;12556:36;;;12593:12;:10;:12::i;:::-;12607:4;12613:7;12622:5;12556:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12552:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12812:1;12795:6;:13;:18;12791:267;;;12837:60;;;;;;;;;;:::i;:::-;;;;;;;;12791:267;13009:6;13003:13;12994:6;12990:2;12986:15;12979:38;12552:520;12688:41;;;12678:51;;;:6;:51;;;;12671:58;;;;;12517:607;13109:4;13102:11;;12351:779;;;;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:5:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;9095:427:4:-;9188:1;9174:16;;:2;:16;;;;9166:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9246:16;9254:7;9246;:16::i;:::-;9245:17;9237:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9306:45;9335:1;9339:2;9343:7;9306:20;:45::i;:::-;9379:1;9362:9;:13;9372:2;9362:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9409:2;9390:7;:16;9398:7;9390:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9452:7;9448:2;9427:33;;9444:1;9427:33;;;;;;;;;;;;9471:44;9499:1;9503:2;9507:7;9471:19;:44::i;:::-;9095:427;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;13686:122:4:-;;;;:::o;3901:161:5:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5149:323;;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4679:970;;;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;;;;;;;;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5937:1061;;;;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3489:217;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1045:5;1076:6;1070:13;1061:22;;1092:30;1116:5;1092:30;:::i;:::-;1051:77;;;;:::o;1134:137::-;1179:5;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;1333:5;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;1492:5;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;1784:5;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;2053:5;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:143::-;2209:5;2240:6;2234:13;2225:22;;2256:33;2283:5;2256:33;:::i;:::-;2215:80;;;;:::o;2301:262::-;2360:6;2409:2;2397:9;2388:7;2384:23;2380:32;2377:2;;;2425:1;2422;2415:12;2377:2;2468:1;2493:53;2538:7;2529:6;2518:9;2514:22;2493:53;:::i;:::-;2483:63;;2439:117;2367:196;;;;:::o;2569:407::-;2637:6;2645;2694:2;2682:9;2673:7;2669:23;2665:32;2662:2;;;2710:1;2707;2700:12;2662:2;2753:1;2778:53;2823:7;2814:6;2803:9;2799:22;2778:53;:::i;:::-;2768:63;;2724:117;2880:2;2906:53;2951:7;2942:6;2931:9;2927:22;2906:53;:::i;:::-;2896:63;;2851:118;2652:324;;;;;:::o;2982:552::-;3059:6;3067;3075;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;3140:1;3137;3130:12;3092:2;3183:1;3208:53;3253:7;3244:6;3233:9;3229:22;3208:53;:::i;:::-;3198:63;;3154:117;3310:2;3336:53;3381:7;3372:6;3361:9;3357:22;3336:53;:::i;:::-;3326:63;;3281:118;3438:2;3464:53;3509:7;3500:6;3489:9;3485:22;3464:53;:::i;:::-;3454:63;;3409:118;3082:452;;;;;:::o;3540:809::-;3635:6;3643;3651;3659;3708:3;3696:9;3687:7;3683:23;3679:33;3676:2;;;3725:1;3722;3715:12;3676:2;3768:1;3793:53;3838:7;3829:6;3818:9;3814:22;3793:53;:::i;:::-;3783:63;;3739:117;3895:2;3921:53;3966:7;3957:6;3946:9;3942:22;3921:53;:::i;:::-;3911:63;;3866:118;4023:2;4049:53;4094:7;4085:6;4074:9;4070:22;4049:53;:::i;:::-;4039:63;;3994:118;4179:2;4168:9;4164:18;4151:32;4210:18;4202:6;4199:30;4196:2;;;4242:1;4239;4232:12;4196:2;4270:62;4324:7;4315:6;4304:9;4300:22;4270:62;:::i;:::-;4260:72;;4122:220;3666:683;;;;;;;:::o;4355:401::-;4420:6;4428;4477:2;4465:9;4456:7;4452:23;4448:32;4445:2;;;4493:1;4490;4483:12;4445:2;4536:1;4561:53;4606:7;4597:6;4586:9;4582:22;4561:53;:::i;:::-;4551:63;;4507:117;4663:2;4689:50;4731:7;4722:6;4711:9;4707:22;4689:50;:::i;:::-;4679:60;;4634:115;4435:321;;;;;:::o;4762:407::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:2;;;4903:1;4900;4893:12;4855:2;4946:1;4971:53;5016:7;5007:6;4996:9;4992:22;4971:53;:::i;:::-;4961:63;;4917:117;5073:2;5099:53;5144:7;5135:6;5124:9;5120:22;5099:53;:::i;:::-;5089:63;;5044:118;4845:324;;;;;:::o;5175:278::-;5242:6;5291:2;5279:9;5270:7;5266:23;5262:32;5259:2;;;5307:1;5304;5297:12;5259:2;5350:1;5375:61;5428:7;5419:6;5408:9;5404:22;5375:61;:::i;:::-;5365:71;;5321:125;5249:204;;;;:::o;5459:260::-;5517:6;5566:2;5554:9;5545:7;5541:23;5537:32;5534:2;;;5582:1;5579;5572:12;5534:2;5625:1;5650:52;5694:7;5685:6;5674:9;5670:22;5650:52;:::i;:::-;5640:62;;5596:116;5524:195;;;;:::o;5725:282::-;5794:6;5843:2;5831:9;5822:7;5818:23;5814:32;5811:2;;;5859:1;5856;5849:12;5811:2;5902:1;5927:63;5982:7;5973:6;5962:9;5958:22;5927:63;:::i;:::-;5917:73;;5873:127;5801:206;;;;:::o;6013:375::-;6082:6;6131:2;6119:9;6110:7;6106:23;6102:32;6099:2;;;6147:1;6144;6137:12;6099:2;6218:1;6207:9;6203:17;6190:31;6248:18;6240:6;6237:30;6234:2;;;6280:1;6277;6270:12;6234:2;6308:63;6363:7;6354:6;6343:9;6339:22;6308:63;:::i;:::-;6298:73;;6161:220;6089:299;;;;:::o;6394:262::-;6453:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:2;;;6518:1;6515;6508:12;6470:2;6561:1;6586:53;6631:7;6622:6;6611:9;6607:22;6586:53;:::i;:::-;6576:63;;6532:117;6460:196;;;;:::o;6662:284::-;6732:6;6781:2;6769:9;6760:7;6756:23;6752:32;6749:2;;;6797:1;6794;6787:12;6749:2;6840:1;6865:64;6921:7;6912:6;6901:9;6897:22;6865:64;:::i;:::-;6855:74;;6811:128;6739:207;;;;:::o;6952:407::-;7020:6;7028;7077:2;7065:9;7056:7;7052:23;7048:32;7045:2;;;7093:1;7090;7083:12;7045:2;7136:1;7161:53;7206:7;7197:6;7186:9;7182:22;7161:53;:::i;:::-;7151:63;;7107:117;7263:2;7289:53;7334:7;7325:6;7314:9;7310:22;7289:53;:::i;:::-;7279:63;;7234:118;7035:324;;;;;:::o;7365:844::-;7460:6;7468;7476;7484;7492;7541:3;7529:9;7520:7;7516:23;7512:33;7509:2;;;7558:1;7555;7548:12;7509:2;7601:1;7626:53;7671:7;7662:6;7651:9;7647:22;7626:53;:::i;:::-;7616:63;;7572:117;7728:2;7754:53;7799:7;7790:6;7779:9;7775:22;7754:53;:::i;:::-;7744:63;;7699:118;7856:2;7882:53;7927:7;7918:6;7907:9;7903:22;7882:53;:::i;:::-;7872:63;;7827:118;7984:2;8010:53;8055:7;8046:6;8035:9;8031:22;8010:53;:::i;:::-;8000:63;;7955:118;8112:3;8139:53;8184:7;8175:6;8164:9;8160:22;8139:53;:::i;:::-;8129:63;;8083:119;7499:710;;;;;;;;:::o;8215:118::-;8302:24;8320:5;8302:24;:::i;:::-;8297:3;8290:37;8280:53;;:::o;8339:109::-;8420:21;8435:5;8420:21;:::i;:::-;8415:3;8408:34;8398:50;;:::o;8454:360::-;8540:3;8568:38;8600:5;8568:38;:::i;:::-;8622:70;8685:6;8680:3;8622:70;:::i;:::-;8615:77;;8701:52;8746:6;8741:3;8734:4;8727:5;8723:16;8701:52;:::i;:::-;8778:29;8800:6;8778:29;:::i;:::-;8773:3;8769:39;8762:46;;8544:270;;;;;:::o;8820:364::-;8908:3;8936:39;8969:5;8936:39;:::i;:::-;8991:71;9055:6;9050:3;8991:71;:::i;:::-;8984:78;;9071:52;9116:6;9111:3;9104:4;9097:5;9093:16;9071:52;:::i;:::-;9148:29;9170:6;9148:29;:::i;:::-;9143:3;9139:39;9132:46;;8912:272;;;;;:::o;9190:377::-;9296:3;9324:39;9357:5;9324:39;:::i;:::-;9379:89;9461:6;9456:3;9379:89;:::i;:::-;9372:96;;9477:52;9522:6;9517:3;9510:4;9503:5;9499:16;9477:52;:::i;:::-;9554:6;9549:3;9545:16;9538:23;;9300:267;;;;;:::o;9573:366::-;9715:3;9736:67;9800:2;9795:3;9736:67;:::i;:::-;9729:74;;9812:93;9901:3;9812:93;:::i;:::-;9930:2;9925:3;9921:12;9914:19;;9719:220;;;:::o;9945:366::-;10087:3;10108:67;10172:2;10167:3;10108:67;:::i;:::-;10101:74;;10184:93;10273:3;10184:93;:::i;:::-;10302:2;10297:3;10293:12;10286:19;;10091:220;;;:::o;10317:366::-;10459:3;10480:67;10544:2;10539:3;10480:67;:::i;:::-;10473:74;;10556:93;10645:3;10556:93;:::i;:::-;10674:2;10669:3;10665:12;10658:19;;10463:220;;;:::o;10689:366::-;10831:3;10852:67;10916:2;10911:3;10852:67;:::i;:::-;10845:74;;10928:93;11017:3;10928:93;:::i;:::-;11046:2;11041:3;11037:12;11030:19;;10835:220;;;:::o;11061:366::-;11203:3;11224:67;11288:2;11283:3;11224:67;:::i;:::-;11217:74;;11300:93;11389:3;11300:93;:::i;:::-;11418:2;11413:3;11409:12;11402:19;;11207:220;;;:::o;11433:366::-;11575:3;11596:67;11660:2;11655:3;11596:67;:::i;:::-;11589:74;;11672:93;11761:3;11672:93;:::i;:::-;11790:2;11785:3;11781:12;11774:19;;11579:220;;;:::o;11805:366::-;11947:3;11968:67;12032:2;12027:3;11968:67;:::i;:::-;11961:74;;12044:93;12133:3;12044:93;:::i;:::-;12162:2;12157:3;12153:12;12146:19;;11951:220;;;:::o;12177:366::-;12319:3;12340:67;12404:2;12399:3;12340:67;:::i;:::-;12333:74;;12416:93;12505:3;12416:93;:::i;:::-;12534:2;12529:3;12525:12;12518:19;;12323:220;;;:::o;12549:366::-;12691:3;12712:67;12776:2;12771:3;12712:67;:::i;:::-;12705:74;;12788:93;12877:3;12788:93;:::i;:::-;12906:2;12901:3;12897:12;12890:19;;12695:220;;;:::o;12921:366::-;13063:3;13084:67;13148:2;13143:3;13084:67;:::i;:::-;13077:74;;13160:93;13249:3;13160:93;:::i;:::-;13278:2;13273:3;13269:12;13262:19;;13067:220;;;:::o;13293:366::-;13435:3;13456:67;13520:2;13515:3;13456:67;:::i;:::-;13449:74;;13532:93;13621:3;13532:93;:::i;:::-;13650:2;13645:3;13641:12;13634:19;;13439:220;;;:::o;13665:366::-;13807:3;13828:67;13892:2;13887:3;13828:67;:::i;:::-;13821:74;;13904:93;13993:3;13904:93;:::i;:::-;14022:2;14017:3;14013:12;14006:19;;13811:220;;;:::o;14037:366::-;14179:3;14200:67;14264:2;14259:3;14200:67;:::i;:::-;14193:74;;14276:93;14365:3;14276:93;:::i;:::-;14394:2;14389:3;14385:12;14378:19;;14183:220;;;:::o;14409:366::-;14551:3;14572:67;14636:2;14631:3;14572:67;:::i;:::-;14565:74;;14648:93;14737:3;14648:93;:::i;:::-;14766:2;14761:3;14757:12;14750:19;;14555:220;;;:::o;14781:366::-;14923:3;14944:67;15008:2;15003:3;14944:67;:::i;:::-;14937:74;;15020:93;15109:3;15020:93;:::i;:::-;15138:2;15133:3;15129:12;15122:19;;14927:220;;;:::o;15153:366::-;15295:3;15316:67;15380:2;15375:3;15316:67;:::i;:::-;15309:74;;15392:93;15481:3;15392:93;:::i;:::-;15510:2;15505:3;15501:12;15494:19;;15299:220;;;:::o;15525:366::-;15667:3;15688:67;15752:2;15747:3;15688:67;:::i;:::-;15681:74;;15764:93;15853:3;15764:93;:::i;:::-;15882:2;15877:3;15873:12;15866:19;;15671:220;;;:::o;15897:366::-;16039:3;16060:67;16124:2;16119:3;16060:67;:::i;:::-;16053:74;;16136:93;16225:3;16136:93;:::i;:::-;16254:2;16249:3;16245:12;16238:19;;16043:220;;;:::o;16269:366::-;16411:3;16432:67;16496:2;16491:3;16432:67;:::i;:::-;16425:74;;16508:93;16597:3;16508:93;:::i;:::-;16626:2;16621:3;16617:12;16610:19;;16415:220;;;:::o;16641:366::-;16783:3;16804:67;16868:2;16863:3;16804:67;:::i;:::-;16797:74;;16880:93;16969:3;16880:93;:::i;:::-;16998:2;16993:3;16989:12;16982:19;;16787:220;;;:::o;17013:366::-;17155:3;17176:67;17240:2;17235:3;17176:67;:::i;:::-;17169:74;;17252:93;17341:3;17252:93;:::i;:::-;17370:2;17365:3;17361:12;17354:19;;17159:220;;;:::o;17385:366::-;17527:3;17548:67;17612:2;17607:3;17548:67;:::i;:::-;17541:74;;17624:93;17713:3;17624:93;:::i;:::-;17742:2;17737:3;17733:12;17726:19;;17531:220;;;:::o;17757:366::-;17899:3;17920:67;17984:2;17979:3;17920:67;:::i;:::-;17913:74;;17996:93;18085:3;17996:93;:::i;:::-;18114:2;18109:3;18105:12;18098:19;;17903:220;;;:::o;18129:366::-;18271:3;18292:67;18356:2;18351:3;18292:67;:::i;:::-;18285:74;;18368:93;18457:3;18368:93;:::i;:::-;18486:2;18481:3;18477:12;18470:19;;18275:220;;;:::o;18501:366::-;18643:3;18664:67;18728:2;18723:3;18664:67;:::i;:::-;18657:74;;18740:93;18829:3;18740:93;:::i;:::-;18858:2;18853:3;18849:12;18842:19;;18647:220;;;:::o;18873:118::-;18960:24;18978:5;18960:24;:::i;:::-;18955:3;18948:37;18938:53;;:::o;18997:435::-;19177:3;19199:95;19290:3;19281:6;19199:95;:::i;:::-;19192:102;;19311:95;19402:3;19393:6;19311:95;:::i;:::-;19304:102;;19423:3;19416:10;;19181:251;;;;;:::o;19438:222::-;19531:4;19569:2;19558:9;19554:18;19546:26;;19582:71;19650:1;19639:9;19635:17;19626:6;19582:71;:::i;:::-;19536:124;;;;:::o;19666:332::-;19787:4;19825:2;19814:9;19810:18;19802:26;;19838:71;19906:1;19895:9;19891:17;19882:6;19838:71;:::i;:::-;19919:72;19987:2;19976:9;19972:18;19963:6;19919:72;:::i;:::-;19792:206;;;;;:::o;20004:442::-;20153:4;20191:2;20180:9;20176:18;20168:26;;20204:71;20272:1;20261:9;20257:17;20248:6;20204:71;:::i;:::-;20285:72;20353:2;20342:9;20338:18;20329:6;20285:72;:::i;:::-;20367;20435:2;20424:9;20420:18;20411:6;20367:72;:::i;:::-;20158:288;;;;;;:::o;20452:640::-;20647:4;20685:3;20674:9;20670:19;20662:27;;20699:71;20767:1;20756:9;20752:17;20743:6;20699:71;:::i;:::-;20780:72;20848:2;20837:9;20833:18;20824:6;20780:72;:::i;:::-;20862;20930:2;20919:9;20915:18;20906:6;20862:72;:::i;:::-;20981:9;20975:4;20971:20;20966:2;20955:9;20951:18;20944:48;21009:76;21080:4;21071:6;21009:76;:::i;:::-;21001:84;;20652:440;;;;;;;:::o;21098:332::-;21219:4;21257:2;21246:9;21242:18;21234:26;;21270:71;21338:1;21327:9;21323:17;21314:6;21270:71;:::i;:::-;21351:72;21419:2;21408:9;21404:18;21395:6;21351:72;:::i;:::-;21224:206;;;;;:::o;21436:210::-;21523:4;21561:2;21550:9;21546:18;21538:26;;21574:65;21636:1;21625:9;21621:17;21612:6;21574:65;:::i;:::-;21528:118;;;;:::o;21652:313::-;21765:4;21803:2;21792:9;21788:18;21780:26;;21852:9;21846:4;21842:20;21838:1;21827:9;21823:17;21816:47;21880:78;21953:4;21944:6;21880:78;:::i;:::-;21872:86;;21770:195;;;;:::o;21971:419::-;22137:4;22175:2;22164:9;22160:18;22152:26;;22224:9;22218:4;22214:20;22210:1;22199:9;22195:17;22188:47;22252:131;22378:4;22252:131;:::i;:::-;22244:139;;22142:248;;;:::o;22396:419::-;22562:4;22600:2;22589:9;22585:18;22577:26;;22649:9;22643:4;22639:20;22635:1;22624:9;22620:17;22613:47;22677:131;22803:4;22677:131;:::i;:::-;22669:139;;22567:248;;;:::o;22821:419::-;22987:4;23025:2;23014:9;23010:18;23002:26;;23074:9;23068:4;23064:20;23060:1;23049:9;23045:17;23038:47;23102:131;23228:4;23102:131;:::i;:::-;23094:139;;22992:248;;;:::o;23246:419::-;23412:4;23450:2;23439:9;23435:18;23427:26;;23499:9;23493:4;23489:20;23485:1;23474:9;23470:17;23463:47;23527:131;23653:4;23527:131;:::i;:::-;23519:139;;23417:248;;;:::o;23671:419::-;23837:4;23875:2;23864:9;23860:18;23852:26;;23924:9;23918:4;23914:20;23910:1;23899:9;23895:17;23888:47;23952:131;24078:4;23952:131;:::i;:::-;23944:139;;23842:248;;;:::o;24096:419::-;24262:4;24300:2;24289:9;24285:18;24277:26;;24349:9;24343:4;24339:20;24335:1;24324:9;24320:17;24313:47;24377:131;24503:4;24377:131;:::i;:::-;24369:139;;24267:248;;;:::o;24521:419::-;24687:4;24725:2;24714:9;24710:18;24702:26;;24774:9;24768:4;24764:20;24760:1;24749:9;24745:17;24738:47;24802:131;24928:4;24802:131;:::i;:::-;24794:139;;24692:248;;;:::o;24946:419::-;25112:4;25150:2;25139:9;25135:18;25127:26;;25199:9;25193:4;25189:20;25185:1;25174:9;25170:17;25163:47;25227:131;25353:4;25227:131;:::i;:::-;25219:139;;25117:248;;;:::o;25371:419::-;25537:4;25575:2;25564:9;25560:18;25552:26;;25624:9;25618:4;25614:20;25610:1;25599:9;25595:17;25588:47;25652:131;25778:4;25652:131;:::i;:::-;25644:139;;25542:248;;;:::o;25796:419::-;25962:4;26000:2;25989:9;25985:18;25977:26;;26049:9;26043:4;26039:20;26035:1;26024:9;26020:17;26013:47;26077:131;26203:4;26077:131;:::i;:::-;26069:139;;25967:248;;;:::o;26221:419::-;26387:4;26425:2;26414:9;26410:18;26402:26;;26474:9;26468:4;26464:20;26460:1;26449:9;26445:17;26438:47;26502:131;26628:4;26502:131;:::i;:::-;26494:139;;26392:248;;;:::o;26646:419::-;26812:4;26850:2;26839:9;26835:18;26827:26;;26899:9;26893:4;26889:20;26885:1;26874:9;26870:17;26863:47;26927:131;27053:4;26927:131;:::i;:::-;26919:139;;26817:248;;;:::o;27071:419::-;27237:4;27275:2;27264:9;27260:18;27252:26;;27324:9;27318:4;27314:20;27310:1;27299:9;27295:17;27288:47;27352:131;27478:4;27352:131;:::i;:::-;27344:139;;27242:248;;;:::o;27496:419::-;27662:4;27700:2;27689:9;27685:18;27677:26;;27749:9;27743:4;27739:20;27735:1;27724:9;27720:17;27713:47;27777:131;27903:4;27777:131;:::i;:::-;27769:139;;27667:248;;;:::o;27921:419::-;28087:4;28125:2;28114:9;28110:18;28102:26;;28174:9;28168:4;28164:20;28160:1;28149:9;28145:17;28138:47;28202:131;28328:4;28202:131;:::i;:::-;28194:139;;28092:248;;;:::o;28346:419::-;28512:4;28550:2;28539:9;28535:18;28527:26;;28599:9;28593:4;28589:20;28585:1;28574:9;28570:17;28563:47;28627:131;28753:4;28627:131;:::i;:::-;28619:139;;28517:248;;;:::o;28771:419::-;28937:4;28975:2;28964:9;28960:18;28952:26;;29024:9;29018:4;29014:20;29010:1;28999:9;28995:17;28988:47;29052:131;29178:4;29052:131;:::i;:::-;29044:139;;28942:248;;;:::o;29196:419::-;29362:4;29400:2;29389:9;29385:18;29377:26;;29449:9;29443:4;29439:20;29435:1;29424:9;29420:17;29413:47;29477:131;29603:4;29477:131;:::i;:::-;29469:139;;29367:248;;;:::o;29621:419::-;29787:4;29825:2;29814:9;29810:18;29802:26;;29874:9;29868:4;29864:20;29860:1;29849:9;29845:17;29838:47;29902:131;30028:4;29902:131;:::i;:::-;29894:139;;29792:248;;;:::o;30046:419::-;30212:4;30250:2;30239:9;30235:18;30227:26;;30299:9;30293:4;30289:20;30285:1;30274:9;30270:17;30263:47;30327:131;30453:4;30327:131;:::i;:::-;30319:139;;30217:248;;;:::o;30471:419::-;30637:4;30675:2;30664:9;30660:18;30652:26;;30724:9;30718:4;30714:20;30710:1;30699:9;30695:17;30688:47;30752:131;30878:4;30752:131;:::i;:::-;30744:139;;30642:248;;;:::o;30896:419::-;31062:4;31100:2;31089:9;31085:18;31077:26;;31149:9;31143:4;31139:20;31135:1;31124:9;31120:17;31113:47;31177:131;31303:4;31177:131;:::i;:::-;31169:139;;31067:248;;;:::o;31321:419::-;31487:4;31525:2;31514:9;31510:18;31502:26;;31574:9;31568:4;31564:20;31560:1;31549:9;31545:17;31538:47;31602:131;31728:4;31602:131;:::i;:::-;31594:139;;31492:248;;;:::o;31746:419::-;31912:4;31950:2;31939:9;31935:18;31927:26;;31999:9;31993:4;31989:20;31985:1;31974:9;31970:17;31963:47;32027:131;32153:4;32027:131;:::i;:::-;32019:139;;31917:248;;;:::o;32171:419::-;32337:4;32375:2;32364:9;32360:18;32352:26;;32424:9;32418:4;32414:20;32410:1;32399:9;32395:17;32388:47;32452:131;32578:4;32452:131;:::i;:::-;32444:139;;32342:248;;;:::o;32596:222::-;32689:4;32727:2;32716:9;32712:18;32704:26;;32740:71;32808:1;32797:9;32793:17;32784:6;32740:71;:::i;:::-;32694:124;;;;:::o;32824:1084::-;33129:4;33167:3;33156:9;33152:19;33144:27;;33181:71;33249:1;33238:9;33234:17;33225:6;33181:71;:::i;:::-;33262:72;33330:2;33319:9;33315:18;33306:6;33262:72;:::i;:::-;33344;33412:2;33401:9;33397:18;33388:6;33344:72;:::i;:::-;33426;33494:2;33483:9;33479:18;33470:6;33426:72;:::i;:::-;33508:73;33576:3;33565:9;33561:19;33552:6;33508:73;:::i;:::-;33591;33659:3;33648:9;33644:19;33635:6;33591:73;:::i;:::-;33674:67;33736:3;33725:9;33721:19;33712:6;33674:67;:::i;:::-;33751;33813:3;33802:9;33798:19;33789:6;33751:67;:::i;:::-;33828:73;33896:3;33885:9;33881:19;33872:6;33828:73;:::i;:::-;33134:774;;;;;;;;;;;;:::o;33914:664::-;34119:4;34157:3;34146:9;34142:19;34134:27;;34171:71;34239:1;34228:9;34224:17;34215:6;34171:71;:::i;:::-;34252:72;34320:2;34309:9;34305:18;34296:6;34252:72;:::i;:::-;34334;34402:2;34391:9;34387:18;34378:6;34334:72;:::i;:::-;34416;34484:2;34473:9;34469:18;34460:6;34416:72;:::i;:::-;34498:73;34566:3;34555:9;34551:19;34542:6;34498:73;:::i;:::-;34124:454;;;;;;;;:::o;34584:129::-;34618:6;34645:20;;:::i;:::-;34635:30;;34674:33;34702:4;34694:6;34674:33;:::i;:::-;34625:88;;;:::o;34719:75::-;34752:6;34785:2;34779:9;34769:19;;34759:35;:::o;34800:307::-;34861:4;34951:18;34943:6;34940:30;34937:2;;;34973:18;;:::i;:::-;34937:2;35011:29;35033:6;35011:29;:::i;:::-;35003:37;;35095:4;35089;35085:15;35077:23;;34866:241;;;:::o;35113:308::-;35175:4;35265:18;35257:6;35254:30;35251:2;;;35287:18;;:::i;:::-;35251:2;35325:29;35347:6;35325:29;:::i;:::-;35317:37;;35409:4;35403;35399:15;35391:23;;35180:241;;;:::o;35427:98::-;35478:6;35512:5;35506:12;35496:22;;35485:40;;;:::o;35531:99::-;35583:6;35617:5;35611:12;35601:22;;35590:40;;;:::o;35636:168::-;35719:11;35753:6;35748:3;35741:19;35793:4;35788:3;35784:14;35769:29;;35731:73;;;;:::o;35810:169::-;35894:11;35928:6;35923:3;35916:19;35968:4;35963:3;35959:14;35944:29;;35906:73;;;;:::o;35985:148::-;36087:11;36124:3;36109:18;;36099:34;;;;:::o;36139:305::-;36179:3;36198:20;36216:1;36198:20;:::i;:::-;36193:25;;36232:20;36250:1;36232:20;:::i;:::-;36227:25;;36386:1;36318:66;36314:74;36311:1;36308:81;36305:2;;;36392:18;;:::i;:::-;36305:2;36436:1;36433;36429:9;36422:16;;36183:261;;;;:::o;36450:185::-;36490:1;36507:20;36525:1;36507:20;:::i;:::-;36502:25;;36541:20;36559:1;36541:20;:::i;:::-;36536:25;;36580:1;36570:2;;36585:18;;:::i;:::-;36570:2;36627:1;36624;36620:9;36615:14;;36492:143;;;;:::o;36641:191::-;36681:4;36701:20;36719:1;36701:20;:::i;:::-;36696:25;;36735:20;36753:1;36735:20;:::i;:::-;36730:25;;36774:1;36771;36768:8;36765:2;;;36779:18;;:::i;:::-;36765:2;36824:1;36821;36817:9;36809:17;;36686:146;;;;:::o;36838:96::-;36875:7;36904:24;36922:5;36904:24;:::i;:::-;36893:35;;36883:51;;;:::o;36940:90::-;36974:7;37017:5;37010:13;37003:21;36992:32;;36982:48;;;:::o;37036:149::-;37072:7;37112:66;37105:5;37101:78;37090:89;;37080:105;;;:::o;37191:126::-;37228:7;37268:42;37261:5;37257:54;37246:65;;37236:81;;;:::o;37323:77::-;37360:7;37389:5;37378:16;;37368:32;;;:::o;37406:154::-;37490:6;37485:3;37480;37467:30;37552:1;37543:6;37538:3;37534:16;37527:27;37457:103;;;:::o;37566:307::-;37634:1;37644:113;37658:6;37655:1;37652:13;37644:113;;;37743:1;37738:3;37734:11;37728:18;37724:1;37719:3;37715:11;37708:39;37680:2;37677:1;37673:10;37668:15;;37644:113;;;37775:6;37772:1;37769:13;37766:2;;;37855:1;37846:6;37841:3;37837:16;37830:27;37766:2;37615:258;;;;:::o;37879:320::-;37923:6;37960:1;37954:4;37950:12;37940:22;;38007:1;38001:4;37997:12;38028:18;38018:2;;38084:4;38076:6;38072:17;38062:27;;38018:2;38146;38138:6;38135:14;38115:18;38112:38;38109:2;;;38165:18;;:::i;:::-;38109:2;37930:269;;;;:::o;38205:281::-;38288:27;38310:4;38288:27;:::i;:::-;38280:6;38276:40;38418:6;38406:10;38403:22;38382:18;38370:10;38367:34;38364:62;38361:2;;;38429:18;;:::i;:::-;38361:2;38469:10;38465:2;38458:22;38248:238;;;:::o;38492:233::-;38531:3;38554:24;38572:5;38554:24;:::i;:::-;38545:33;;38600:66;38593:5;38590:77;38587:2;;;38670:18;;:::i;:::-;38587:2;38717:1;38710:5;38706:13;38699:20;;38535:190;;;:::o;38731:176::-;38763:1;38780:20;38798:1;38780:20;:::i;:::-;38775:25;;38814:20;38832:1;38814:20;:::i;:::-;38809:25;;38853:1;38843:2;;38858:18;;:::i;:::-;38843:2;38899:1;38896;38892:9;38887:14;;38765:142;;;;:::o;38913:180::-;38961:77;38958:1;38951:88;39058:4;39055:1;39048:15;39082:4;39079:1;39072:15;39099:180;39147:77;39144:1;39137:88;39244:4;39241:1;39234:15;39268:4;39265:1;39258:15;39285:180;39333:77;39330:1;39323:88;39430:4;39427:1;39420:15;39454:4;39451:1;39444:15;39471:180;39519:77;39516:1;39509:88;39616:4;39613:1;39606:15;39640:4;39637:1;39630:15;39657:102;39698:6;39749:2;39745:7;39740:2;39733:5;39729:14;39725:28;39715:38;;39705:54;;;:::o;39765:230::-;39905:34;39901:1;39893:6;39889:14;39882:58;39974:13;39969:2;39961:6;39957:15;39950:38;39871:124;:::o;40001:237::-;40141:34;40137:1;40129:6;40125:14;40118:58;40210:20;40205:2;40197:6;40193:15;40186:45;40107:131;:::o;40244:225::-;40384:34;40380:1;40372:6;40368:14;40361:58;40453:8;40448:2;40440:6;40436:15;40429:33;40350:119;:::o;40475:224::-;40615:34;40611:1;40603:6;40599:14;40592:58;40684:7;40679:2;40671:6;40667:15;40660:32;40581:118;:::o;40705:178::-;40845:30;40841:1;40833:6;40829:14;40822:54;40811:72;:::o;40889:223::-;41029:34;41025:1;41017:6;41013:14;41006:58;41098:6;41093:2;41085:6;41081:15;41074:31;40995:117;:::o;41118:223::-;41258:34;41254:1;41246:6;41242:14;41235:58;41327:6;41322:2;41314:6;41310:15;41303:31;41224:117;:::o;41347:180::-;41487:32;41483:1;41475:6;41471:14;41464:56;41453:74;:::o;41533:175::-;41673:27;41669:1;41661:6;41657:14;41650:51;41639:69;:::o;41714:231::-;41854:34;41850:1;41842:6;41838:14;41831:58;41923:14;41918:2;41910:6;41906:15;41899:39;41820:125;:::o;41951:162::-;42091:14;42087:1;42079:6;42075:14;42068:38;42057:56;:::o;42119:243::-;42259:34;42255:1;42247:6;42243:14;42236:58;42328:26;42323:2;42315:6;42311:15;42304:51;42225:137;:::o;42368:175::-;42508:27;42504:1;42496:6;42492:14;42485:51;42474:69;:::o;42549:229::-;42689:34;42685:1;42677:6;42673:14;42666:58;42758:12;42753:2;42745:6;42741:15;42734:37;42655:123;:::o;42784:228::-;42924:34;42920:1;42912:6;42908:14;42901:58;42993:11;42988:2;42980:6;42976:15;42969:36;42890:122;:::o;43018:172::-;43158:24;43154:1;43146:6;43142:14;43135:48;43124:66;:::o;43196:182::-;43336:34;43332:1;43324:6;43320:14;43313:58;43302:76;:::o;43384:231::-;43524:34;43520:1;43512:6;43508:14;43501:58;43593:14;43588:2;43580:6;43576:15;43569:39;43490:125;:::o;43621:182::-;43761:34;43757:1;43749:6;43745:14;43738:58;43727:76;:::o;43809:234::-;43949:34;43945:1;43937:6;43933:14;43926:58;44018:17;44013:2;44005:6;44001:15;43994:42;43915:128;:::o;44049:220::-;44189:34;44185:1;44177:6;44173:14;44166:58;44258:3;44253:2;44245:6;44241:15;44234:28;44155:114;:::o;44275:169::-;44415:21;44411:1;44403:6;44399:14;44392:45;44381:63;:::o;44450:164::-;44590:16;44586:1;44578:6;44574:14;44567:40;44556:58;:::o;44620:236::-;44760:34;44756:1;44748:6;44744:14;44737:58;44829:19;44824:2;44816:6;44812:15;44805:44;44726:130;:::o;44862:231::-;45002:34;44998:1;44990:6;44986:14;44979:58;45071:14;45066:2;45058:6;45054:15;45047:39;44968:125;:::o;45099:122::-;45172:24;45190:5;45172:24;:::i;:::-;45165:5;45162:35;45152:2;;45211:1;45208;45201:12;45152:2;45142:79;:::o;45227:116::-;45297:21;45312:5;45297:21;:::i;:::-;45290:5;45287:32;45277:2;;45333:1;45330;45323:12;45277:2;45267:76;:::o;45349:120::-;45421:23;45438:5;45421:23;:::i;:::-;45414:5;45411:34;45401:2;;45459:1;45456;45449:12;45401:2;45391:78;:::o;45475:122::-;45548:24;45566:5;45548:24;:::i;:::-;45541:5;45538:35;45528:2;;45587:1;45584;45577:12;45528:2;45518:79;:::o

Swarm Source

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