ETH Price: $3,409.65 (-0.18%)
Gas: 7 Gwei

Token

Army Loot (ARMY)
 

Overview

Max Total Supply

135 ARMY

Holders

88

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
rix.eth
Balance
1 ARMY
0x69e22fbb1e95c26c39fe445bd60ca219c91ef7ff
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:
Army

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-08-31
*/

// SPDX-License-Identifier: MIT

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

/**
 * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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




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









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

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

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

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

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

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

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

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





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}







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





/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

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

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

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

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

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

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









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


/**
 * @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 {
    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 overriden 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        //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 {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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 {
        _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 {
        _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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).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 {}
}







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

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


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


contract Army is ERC721Enumerable, ReentrancyGuard, Ownable {

    ERC721 loot = ERC721(0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7);

    uint256 public price = 20000000000000000; //0.02 ETH

    
    // mirror a dice roll
    function random(string memory input) internal pure returns (uint256) {
        return (uint256(keccak256(abi.encodePacked(input))) % 7) + 1;
    }
    
    function getSwordsmen(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Swordsmen", 10000);
    }
    
    function getHorses(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Horses", 100);
    }
    
    function getElephants(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Elephants", 10);
    }
    
    function getDragons(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Dragons", 1);
    }

    function getArchers(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Archers", 1000);
    }
    
    function getWizards(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Wizards", 1);
    }
    
    
    function pluck(uint256 tokenId, string memory keyPrefix, uint multiplier) internal pure returns (string memory) {
        uint256 roll1 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "1")));
        uint256 min = roll1;
        uint256 roll2 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "2")));
        min = min > roll2 ? roll2 : min;
        uint256 roll3 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "3")));
        min = min > roll3 ? roll3 : min;
        uint256 roll4 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "4")));
        min = min > roll4 ? roll4 : min;
        
        // get 3 highest dice rolls
        uint256 stat = (roll1 + roll2 + roll3 + roll4 - min) * multiplier;
        
        string memory output = string(abi.encodePacked(keyPrefix, ": ", toString(stat)));

        return output;
    }

    function tokenURI(uint256 tokenId) override public pure returns (string memory) {
        string[13] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';

        parts[1] = getSwordsmen(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getArchers(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getHorses(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getElephants(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getDragons(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getWizards(tokenId);

        parts[12] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Sheet #', toString(tokenId), '", "description": "Army is randomized table top RPG style stats generated and stored on chain. Feel free to use Army in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claim(uint256 tokenId) public payable nonReentrant {
        require(price <= msg.value, "Ether value sent is not correct");
        require(tokenId > 8000 && tokenId < 11976, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    
    function claimForLoot(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8001, "Token ID invalid");
        require(loot.ownerOf(tokenId) == msg.sender, "Not Loot owner");
        _safeMint(_msgSender(), tokenId);
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 11975 && tokenId < 12001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }    
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Army Loot", "ARMY") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"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":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimForLoot","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getArchers","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDragons","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getElephants","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHorses","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSwordsmen","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWizards","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[{"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":"pure","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273ff9c1b15b16263c61d017ee9f65c50e4ae0113d7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066470de4df820000600d553480156200007157600080fd5b506040518060400160405280600981526020017f41726d79204c6f6f7400000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f41524d59000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f69291906200020e565b5080600190805190602001906200010f9291906200020e565b5050506001600a819055506200013a6200012e6200014060201b60201c565b6200014860201b60201c565b62000323565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021c90620002be565b90600052602060002090601f0160209004810192826200024057600085556200028c565b82601f106200025b57805160ff19168380011785556200028c565b828001600101855582156200028c579182015b828111156200028b5782518255916020019190600101906200026e565b5b5090506200029b91906200029f565b5090565b5b80821115620002ba576000816000905550600101620002a0565b5090565b60006002820490506001821680620002d757607f821691505b60208210811415620002ee57620002ed620002f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61519f80620003336000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f757806395d89b4111610095578063b88d4fde11610064578063b88d4fde146106c5578063c87b56dd146106ee578063e985e9c51461072b578063f2fde38b14610768576101cd565b806395d89b4114610609578063a035b1fe14610634578063a22cb4651461065f578063ad873e3214610688576101cd565b8063715018a6116100d1578063715018a61461054d578063832d0b0f146105645780638da5cb5b146105a15780638ee42b14146105cc576101cd565b80636352211e146104965780636a1b956a146104d357806370a0823114610510576101cd565b8063379607f51161016f578063434f48c41161013e578063434f48c4146103ca57806347d8636a146103f35780634f6ccce71461041c57806353493d9c14610459576101cd565b8063379607f514610331578063386a69a91461034d5780633ccfd60b1461038a57806342842e0e146103a1576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613887565b610791565b6040516102069190614086565b60405180910390f35b34801561021b57600080fd5b5061022461080b565b60405161023191906140a1565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906138d9565b61089d565b60405161026e919061401f565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061384b565b610922565b005b3480156102ac57600080fd5b506102b5610a3a565b6040516102c29190614363565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613745565b610a47565b005b34801561030057600080fd5b5061031b6004803603810190610316919061384b565b610aa7565b6040516103289190614363565b60405180910390f35b61034b600480360381019061034691906138d9565b610b4c565b005b34801561035957600080fd5b50610374600480360381019061036f91906138d9565b610c4c565b60405161038191906140a1565b60405180910390f35b34801561039657600080fd5b5061039f610c96565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190613745565b610d62565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906138d9565b610d82565b005b3480156103ff57600080fd5b5061041a600480360381019061041591906138d9565b610eb9565b005b34801561042857600080fd5b50610443600480360381019061043e91906138d9565b61108b565b6040516104509190614363565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b91906138d9565b611122565b60405161048d91906140a1565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906138d9565b61116c565b6040516104ca919061401f565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906138d9565b61121e565b60405161050791906140a1565b60405180910390f35b34801561051c57600080fd5b50610537600480360381019061053291906136b7565b611268565b6040516105449190614363565b60405180910390f35b34801561055957600080fd5b50610562611320565b005b34801561057057600080fd5b5061058b600480360381019061058691906138d9565b6113a8565b60405161059891906140a1565b60405180910390f35b3480156105ad57600080fd5b506105b66113f2565b6040516105c3919061401f565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee91906138d9565b61141c565b60405161060091906140a1565b60405180910390f35b34801561061557600080fd5b5061061e611467565b60405161062b91906140a1565b60405180910390f35b34801561064057600080fd5b506106496114f9565b6040516106569190614363565b60405180910390f35b34801561066b57600080fd5b506106866004803603810190610681919061380f565b6114ff565b005b34801561069457600080fd5b506106af60048036038101906106aa91906138d9565b611680565b6040516106bc91906140a1565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190613794565b6116cb565b005b3480156106fa57600080fd5b50610715600480360381019061071091906138d9565b61172d565b60405161072291906140a1565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613709565b611f83565b60405161075f9190614086565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a91906136b7565b612017565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080457506108038261210f565b5b9050919050565b60606000805461081a906145e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610846906145e2565b80156108935780601f1061086857610100808354040283529160200191610893565b820191906000526020600020905b81548152906001019060200180831161087657829003601f168201915b5050505050905090565b60006108a8826121f1565b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90614263565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092d8261116c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561099e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610995906142e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109bd61225d565b73ffffffffffffffffffffffffffffffffffffffff1614806109ec57506109eb816109e661225d565b611f83565b5b610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a22906141e3565b60405180910390fd5b610a358383612265565b505050565b6000600880549050905090565b610a58610a5261225d565b8261231e565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90614303565b60405180910390fd5b610aa28383836123fc565b505050565b6000610ab283611268565b8210610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea906140c3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8990614343565b60405180910390fd5b6002600a8190555034600d541115610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd6906141a3565b60405180910390fd5b611f4081118015610bf15750612ec881105b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906142a3565b60405180910390fd5b610c41610c3b61225d565b82612658565b6001600a8190555050565b6060610c8f826040518060400160405280600781526020017f447261676f6e73000000000000000000000000000000000000000000000000008152506001612676565b9050919050565b610c9e61225d565b73ffffffffffffffffffffffffffffffffffffffff16610cbc6113f2565b73ffffffffffffffffffffffffffffffffffffffff1614610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614283565b60405180910390fd5b610d1a6113f2565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d5f573d6000803e3d6000fd5b50565b610d7d838383604051806020016040528060008152506116cb565b505050565b6002600a541415610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90614343565b60405180910390fd5b6002600a81905550610dd861225d565b73ffffffffffffffffffffffffffffffffffffffff16610df66113f2565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390614283565b60405180910390fd5b612ec781118015610e5e5750612ee181105b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e94906142a3565b60405180910390fd5b610eae610ea86113f2565b82612658565b6001600a8190555050565b6002600a541415610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690614343565b60405180910390fd5b6002600a81905550600081118015610f185750611f4181105b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906142a3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610fc99190614363565b60206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101991906136e0565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690614143565b60405180910390fd5b61108061107a61225d565b82612658565b6001600a8190555050565b6000611095610a3a565b82106110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614323565b60405180910390fd5b60088281548110611110577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060611165826040518060400160405280600781526020017f57697a61726473000000000000000000000000000000000000000000000000008152506001612676565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90614223565b60405180910390fd5b80915050919050565b6060611261826040518060400160405280600981526020017f456c657068616e74730000000000000000000000000000000000000000000000815250600a612676565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d090614203565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61132861225d565b73ffffffffffffffffffffffffffffffffffffffff166113466113f2565b73ffffffffffffffffffffffffffffffffffffffff161461139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390614283565b60405180910390fd5b6113a66000612803565b565b60606113eb826040518060400160405280600681526020017f486f7273657300000000000000000000000000000000000000000000000000008152506064612676565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611460826040518060400160405280600981526020017f53776f7264736d656e0000000000000000000000000000000000000000000000815250612710612676565b9050919050565b606060018054611476906145e2565b80601f01602080910402602001604051908101604052809291908181526020018280546114a2906145e2565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b5050505050905090565b600d5481565b61150761225d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614183565b60405180910390fd5b806005600061158261225d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661162f61225d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116749190614086565b60405180910390a35050565b60606116c4826040518060400160405280600781526020017f41726368657273000000000000000000000000000000000000000000000000008152506103e8612676565b9050919050565b6116dc6116d661225d565b8361231e565b61171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290614303565b60405180910390fd5b611727848484846128c9565b50505050565b60606117376135a9565b60405180610120016040528060fd815260200161500560fd9139816000600d811061178b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061179c8361141c565b816001600d81106117d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161514260289139816002600d8110611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061184283611680565b816003600d811061187c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614f6360289139816004600d81106118d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506118e8836113a8565b816005600d8110611922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614fb460289139816006600d811061197d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061198e8361121e565b816007600d81106119c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614fdc60299139816008600d8110611a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a3483610c4c565b816009600d8110611a6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614f8b6029913981600a600d8110611ac9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611ada83611122565b81600b600d8110611b14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d8110611b8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600d8110611bd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600d8110611c0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600d8110611c4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600d8110611c8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600d8110611ccc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600d8110611d0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600d8110611d4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600d8110611d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600d8110611dc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611de599989796959493929190613e4e565b604051602081830303815290604052905080826009600d8110611e31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a600d8110611e70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b600d8110611eaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c600d8110611eee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611f07959493929190613e03565b60405160208183030381529060405290506000611f54611f2686612925565b611f2f84612ad2565b604051602001611f40929190613fb8565b604051602081830303815290604052612ad2565b905080604051602001611f679190613ffd565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61201f61225d565b73ffffffffffffffffffffffffffffffffffffffff1661203d6113f2565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90614283565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90614103565b60405180910390fd5b61210c81612803565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121ea57506121e982612c90565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122d88361116c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612329826121f1565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f906141c3565b60405180910390fd5b60006123738361116c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca8461089d565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f357506123f28185611f83565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241c8261116c565b73ffffffffffffffffffffffffffffffffffffffff1614612472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612469906142c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990614163565b60405180910390fd5b6124ed838383612cfa565b6124f8600082612265565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254891906144f8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259f9190614417565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612672828260405180602001604052806000815250612e0e565b5050565b606060006126ac8461268787612925565b604051602001612698929190613f5a565b604051602081830303815290604052612e69565b9050600081905060006126e7866126c289612925565b6040516020016126d3929190613f2b565b604051602081830303815290604052612e69565b90508082116126f657816126f8565b805b9150600061272e876127098a612925565b60405160200161271a929190613efc565b604051602081830303815290604052612e69565b905080831161273d578261273f565b805b92506000612775886127508b612925565b604051602001612761929190613ecd565b604051602081830303815290604052612e69565b90508084116127845783612786565b805b9350600087858385878a61279a9190614417565b6127a49190614417565b6127ae9190614417565b6127b891906144f8565b6127c2919061449e565b90506000896127d083612925565b6040516020016127e1929190613f89565b6040516020818303038152906040529050809750505050505050509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128d48484846123fc565b6128e084848484612eb4565b61291f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612916906140e3565b60405180910390fd5b50505050565b6060600082141561296d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612acd565b600082905060005b6000821461299f57808061298890614645565b915050600a82612998919061446d565b9150612975565b60008167ffffffffffffffff8111156129e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a135781602001600182028036833780820191505090505b5090505b60008514612ac657600182612a2c91906144f8565b9150600a85612a3b919061468e565b6030612a479190614417565b60f81b818381518110612a83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612abf919061446d565b9450612a17565b8093505050505b919050565b60606000825190506000811415612afb5760405180602001604052806000815250915050612c8b565b60006003600283612b0c9190614417565b612b16919061446d565b6004612b22919061449e565b90506000602082612b339190614417565b67ffffffffffffffff811115612b72577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ba45781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615102604091399050600181016020830160005b86811015612c485760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612bcf565b506003860660018114612c625760028114612c7257612c7d565b613d3d60f01b6002830352612c7d565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d0583838361304b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d4857612d4381613050565b612d87565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d8657612d858382613099565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dca57612dc581613206565b612e09565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e0857612e078282613349565b5b5b505050565b612e1883836133c8565b612e256000848484612eb4565b612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b906140e3565b60405180910390fd5b505050565b60006001600783604051602001612e809190613dec565b6040516020818303038152906040528051906020012060001c612ea3919061468e565b612ead9190614417565b9050919050565b6000612ed58473ffffffffffffffffffffffffffffffffffffffff16613596565b1561303e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612efe61225d565b8786866040518563ffffffff1660e01b8152600401612f20949392919061403a565b602060405180830381600087803b158015612f3a57600080fd5b505af1925050508015612f6b57506040513d601f19601f82011682018060405250810190612f6891906138b0565b60015b612fee573d8060008114612f9b576040519150601f19603f3d011682016040523d82523d6000602084013e612fa0565b606091505b50600081511415612fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdd906140e3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613043565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130a684611268565b6130b091906144f8565b9050600060076000848152602001908152602001600020549050818114613195576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061321a91906144f8565b9050600060096000848152602001908152602001600020549050600060088381548110613270577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106132b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061332d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061335483611268565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342f90614243565b60405180910390fd5b613441816121f1565b15613481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347890614123565b60405180910390fd5b61348d60008383612cfa565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134dd9190614417565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b60608152602001906001900390816135b95790505090565b60006135e46135df846143a3565b61437e565b9050828152602081018484840111156135fc57600080fd5b6136078482856145a0565b509392505050565b60008135905061361e81614f06565b92915050565b60008151905061363381614f06565b92915050565b60008135905061364881614f1d565b92915050565b60008135905061365d81614f34565b92915050565b60008151905061367281614f34565b92915050565b600082601f83011261368957600080fd5b81356136998482602086016135d1565b91505092915050565b6000813590506136b181614f4b565b92915050565b6000602082840312156136c957600080fd5b60006136d78482850161360f565b91505092915050565b6000602082840312156136f257600080fd5b600061370084828501613624565b91505092915050565b6000806040838503121561371c57600080fd5b600061372a8582860161360f565b925050602061373b8582860161360f565b9150509250929050565b60008060006060848603121561375a57600080fd5b60006137688682870161360f565b93505060206137798682870161360f565b925050604061378a868287016136a2565b9150509250925092565b600080600080608085870312156137aa57600080fd5b60006137b88782880161360f565b94505060206137c98782880161360f565b93505060406137da878288016136a2565b925050606085013567ffffffffffffffff8111156137f757600080fd5b61380387828801613678565b91505092959194509250565b6000806040838503121561382257600080fd5b60006138308582860161360f565b925050602061384185828601613639565b9150509250929050565b6000806040838503121561385e57600080fd5b600061386c8582860161360f565b925050602061387d858286016136a2565b9150509250929050565b60006020828403121561389957600080fd5b60006138a78482850161364e565b91505092915050565b6000602082840312156138c257600080fd5b60006138d084828501613663565b91505092915050565b6000602082840312156138eb57600080fd5b60006138f9848285016136a2565b91505092915050565b61390b8161452c565b82525050565b61391a8161453e565b82525050565b600061392b826143d4565b61393581856143ea565b93506139458185602086016145af565b61394e8161477b565b840191505092915050565b6000613964826143df565b61396e81856143fb565b935061397e8185602086016145af565b6139878161477b565b840191505092915050565b600061399d826143df565b6139a7818561440c565b93506139b78185602086016145af565b80840191505092915050565b60006139d060b08361440c565b91506139db8261478c565b60b082019050919050565b60006139f360018361440c565b91506139fe82614873565b600182019050919050565b6000613a16602b836143fb565b9150613a218261489c565b604082019050919050565b6000613a396032836143fb565b9150613a44826148eb565b604082019050919050565b6000613a5c6026836143fb565b9150613a678261493a565b604082019050919050565b6000613a7f601c836143fb565b9150613a8a82614989565b602082019050919050565b6000613aa260018361440c565b9150613aad826149b2565b600182019050919050565b6000613ac5600e836143fb565b9150613ad0826149db565b602082019050919050565b6000613ae86024836143fb565b9150613af382614a04565b604082019050919050565b6000613b0b6019836143fb565b9150613b1682614a53565b602082019050919050565b6000613b2e601f836143fb565b9150613b3982614a7c565b602082019050919050565b6000613b5160118361440c565b9150613b5c82614aa5565b601182019050919050565b6000613b74602c836143fb565b9150613b7f82614ace565b604082019050919050565b6000613b976038836143fb565b9150613ba282614b1d565b604082019050919050565b6000613bba602a836143fb565b9150613bc582614b6c565b604082019050919050565b6000613bdd6029836143fb565b9150613be882614bbb565b604082019050919050565b6000613c0060028361440c565b9150613c0b82614c0a565b600282019050919050565b6000613c236020836143fb565b9150613c2e82614c33565b602082019050919050565b6000613c46602c836143fb565b9150613c5182614c5c565b604082019050919050565b6000613c696020836143fb565b9150613c7482614cab565b602082019050919050565b6000613c8c6010836143fb565b9150613c9782614cd4565b602082019050919050565b6000613caf6029836143fb565b9150613cba82614cfd565b604082019050919050565b6000613cd260018361440c565b9150613cdd82614d4c565b600182019050919050565b6000613cf56021836143fb565b9150613d0082614d75565b604082019050919050565b6000613d18601d8361440c565b9150613d2382614dc4565b601d82019050919050565b6000613d3b6031836143fb565b9150613d4682614ded565b604082019050919050565b6000613d5e60018361440c565b9150613d6982614e3c565b600182019050919050565b6000613d81602c836143fb565b9150613d8c82614e65565b604082019050919050565b6000613da460028361440c565b9150613daf82614eb4565b600282019050919050565b6000613dc7601f836143fb565b9150613dd282614edd565b602082019050919050565b613de681614596565b82525050565b6000613df88284613992565b915081905092915050565b6000613e0f8288613992565b9150613e1b8287613992565b9150613e278286613992565b9150613e338285613992565b9150613e3f8284613992565b91508190509695505050505050565b6000613e5a828c613992565b9150613e66828b613992565b9150613e72828a613992565b9150613e7e8289613992565b9150613e8a8288613992565b9150613e968287613992565b9150613ea28286613992565b9150613eae8285613992565b9150613eba8284613992565b91508190509a9950505050505050505050565b6000613ed98285613992565b9150613ee58284613992565b9150613ef0826139e6565b91508190509392505050565b6000613f088285613992565b9150613f148284613992565b9150613f1f82613a95565b91508190509392505050565b6000613f378285613992565b9150613f438284613992565b9150613f4e82613cc5565b91508190509392505050565b6000613f668285613992565b9150613f728284613992565b9150613f7d82613d51565b91508190509392505050565b6000613f958285613992565b9150613fa082613d97565b9150613fac8284613992565b91508190509392505050565b6000613fc382613b44565b9150613fcf8285613992565b9150613fda826139c3565b9150613fe68284613992565b9150613ff182613bf3565b91508190509392505050565b600061400882613d0b565b91506140148284613992565b915081905092915050565b60006020820190506140346000830184613902565b92915050565b600060808201905061404f6000830187613902565b61405c6020830186613902565b6140696040830185613ddd565b818103606083015261407b8184613920565b905095945050505050565b600060208201905061409b6000830184613911565b92915050565b600060208201905081810360008301526140bb8184613959565b905092915050565b600060208201905081810360008301526140dc81613a09565b9050919050565b600060208201905081810360008301526140fc81613a2c565b9050919050565b6000602082019050818103600083015261411c81613a4f565b9050919050565b6000602082019050818103600083015261413c81613a72565b9050919050565b6000602082019050818103600083015261415c81613ab8565b9050919050565b6000602082019050818103600083015261417c81613adb565b9050919050565b6000602082019050818103600083015261419c81613afe565b9050919050565b600060208201905081810360008301526141bc81613b21565b9050919050565b600060208201905081810360008301526141dc81613b67565b9050919050565b600060208201905081810360008301526141fc81613b8a565b9050919050565b6000602082019050818103600083015261421c81613bad565b9050919050565b6000602082019050818103600083015261423c81613bd0565b9050919050565b6000602082019050818103600083015261425c81613c16565b9050919050565b6000602082019050818103600083015261427c81613c39565b9050919050565b6000602082019050818103600083015261429c81613c5c565b9050919050565b600060208201905081810360008301526142bc81613c7f565b9050919050565b600060208201905081810360008301526142dc81613ca2565b9050919050565b600060208201905081810360008301526142fc81613ce8565b9050919050565b6000602082019050818103600083015261431c81613d2e565b9050919050565b6000602082019050818103600083015261433c81613d74565b9050919050565b6000602082019050818103600083015261435c81613dba565b9050919050565b60006020820190506143786000830184613ddd565b92915050565b6000614388614399565b90506143948282614614565b919050565b6000604051905090565b600067ffffffffffffffff8211156143be576143bd61474c565b5b6143c78261477b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061442282614596565b915061442d83614596565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614462576144616146bf565b5b828201905092915050565b600061447882614596565b915061448383614596565b925082614493576144926146ee565b5b828204905092915050565b60006144a982614596565b91506144b483614596565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144ed576144ec6146bf565b5b828202905092915050565b600061450382614596565b915061450e83614596565b925082821015614521576145206146bf565b5b828203905092915050565b600061453782614576565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156145cd5780820151818401526020810190506145b2565b838111156145dc576000848401525b50505050565b600060028204905060018216806145fa57607f821691505b6020821081141561460e5761460d61471d565b5b50919050565b61461d8261477b565b810181811067ffffffffffffffff8211171561463c5761463b61474c565b5b80604052505050565b600061465082614596565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614683576146826146bf565b5b600182019050919050565b600061469982614596565b91506146a483614596565b9250826146b4576146b36146ee565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f222c20226465736372697074696f6e223a202241726d792069732072616e646f60008201527f6d697a6564207461626c6520746f7020525047207374796c652073746174732060208201527f67656e65726174656420616e642073746f726564206f6e20636861696e2e204660408201527f65656c206672656520746f207573652041726d7920696e20616e79207761792060608201527f796f752077616e742e222c2022696d616765223a2022646174613a696d61676560808201527f2f7376672b786d6c3b6261736536342c0000000000000000000000000000000060a082015250565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f0f8161452c565b8114614f1a57600080fd5b50565b614f268161453e565b8114614f3157600080fd5b50565b614f3d8161454a565b8114614f4857600080fd5b50565b614f5481614596565b8114614f5f57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220be4ce0f6d5a6f27c076364b2228614d83f506177089bf01cb4e80b9c26080b9c64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636352211e116100f757806395d89b4111610095578063b88d4fde11610064578063b88d4fde146106c5578063c87b56dd146106ee578063e985e9c51461072b578063f2fde38b14610768576101cd565b806395d89b4114610609578063a035b1fe14610634578063a22cb4651461065f578063ad873e3214610688576101cd565b8063715018a6116100d1578063715018a61461054d578063832d0b0f146105645780638da5cb5b146105a15780638ee42b14146105cc576101cd565b80636352211e146104965780636a1b956a146104d357806370a0823114610510576101cd565b8063379607f51161016f578063434f48c41161013e578063434f48c4146103ca57806347d8636a146103f35780634f6ccce71461041c57806353493d9c14610459576101cd565b8063379607f514610331578063386a69a91461034d5780633ccfd60b1461038a57806342842e0e146103a1576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613887565b610791565b6040516102069190614086565b60405180910390f35b34801561021b57600080fd5b5061022461080b565b60405161023191906140a1565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906138d9565b61089d565b60405161026e919061401f565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061384b565b610922565b005b3480156102ac57600080fd5b506102b5610a3a565b6040516102c29190614363565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190613745565b610a47565b005b34801561030057600080fd5b5061031b6004803603810190610316919061384b565b610aa7565b6040516103289190614363565b60405180910390f35b61034b600480360381019061034691906138d9565b610b4c565b005b34801561035957600080fd5b50610374600480360381019061036f91906138d9565b610c4c565b60405161038191906140a1565b60405180910390f35b34801561039657600080fd5b5061039f610c96565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190613745565b610d62565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906138d9565b610d82565b005b3480156103ff57600080fd5b5061041a600480360381019061041591906138d9565b610eb9565b005b34801561042857600080fd5b50610443600480360381019061043e91906138d9565b61108b565b6040516104509190614363565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b91906138d9565b611122565b60405161048d91906140a1565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906138d9565b61116c565b6040516104ca919061401f565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906138d9565b61121e565b60405161050791906140a1565b60405180910390f35b34801561051c57600080fd5b50610537600480360381019061053291906136b7565b611268565b6040516105449190614363565b60405180910390f35b34801561055957600080fd5b50610562611320565b005b34801561057057600080fd5b5061058b600480360381019061058691906138d9565b6113a8565b60405161059891906140a1565b60405180910390f35b3480156105ad57600080fd5b506105b66113f2565b6040516105c3919061401f565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee91906138d9565b61141c565b60405161060091906140a1565b60405180910390f35b34801561061557600080fd5b5061061e611467565b60405161062b91906140a1565b60405180910390f35b34801561064057600080fd5b506106496114f9565b6040516106569190614363565b60405180910390f35b34801561066b57600080fd5b506106866004803603810190610681919061380f565b6114ff565b005b34801561069457600080fd5b506106af60048036038101906106aa91906138d9565b611680565b6040516106bc91906140a1565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190613794565b6116cb565b005b3480156106fa57600080fd5b50610715600480360381019061071091906138d9565b61172d565b60405161072291906140a1565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613709565b611f83565b60405161075f9190614086565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a91906136b7565b612017565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080457506108038261210f565b5b9050919050565b60606000805461081a906145e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610846906145e2565b80156108935780601f1061086857610100808354040283529160200191610893565b820191906000526020600020905b81548152906001019060200180831161087657829003601f168201915b5050505050905090565b60006108a8826121f1565b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90614263565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092d8261116c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561099e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610995906142e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109bd61225d565b73ffffffffffffffffffffffffffffffffffffffff1614806109ec57506109eb816109e661225d565b611f83565b5b610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a22906141e3565b60405180910390fd5b610a358383612265565b505050565b6000600880549050905090565b610a58610a5261225d565b8261231e565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90614303565b60405180910390fd5b610aa28383836123fc565b505050565b6000610ab283611268565b8210610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea906140c3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8990614343565b60405180910390fd5b6002600a8190555034600d541115610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd6906141a3565b60405180910390fd5b611f4081118015610bf15750612ec881105b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906142a3565b60405180910390fd5b610c41610c3b61225d565b82612658565b6001600a8190555050565b6060610c8f826040518060400160405280600781526020017f447261676f6e73000000000000000000000000000000000000000000000000008152506001612676565b9050919050565b610c9e61225d565b73ffffffffffffffffffffffffffffffffffffffff16610cbc6113f2565b73ffffffffffffffffffffffffffffffffffffffff1614610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614283565b60405180910390fd5b610d1a6113f2565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d5f573d6000803e3d6000fd5b50565b610d7d838383604051806020016040528060008152506116cb565b505050565b6002600a541415610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90614343565b60405180910390fd5b6002600a81905550610dd861225d565b73ffffffffffffffffffffffffffffffffffffffff16610df66113f2565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390614283565b60405180910390fd5b612ec781118015610e5e5750612ee181105b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e94906142a3565b60405180910390fd5b610eae610ea86113f2565b82612658565b6001600a8190555050565b6002600a541415610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690614343565b60405180910390fd5b6002600a81905550600081118015610f185750611f4181105b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906142a3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610fc99190614363565b60206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101991906136e0565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690614143565b60405180910390fd5b61108061107a61225d565b82612658565b6001600a8190555050565b6000611095610a3a565b82106110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614323565b60405180910390fd5b60088281548110611110577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060611165826040518060400160405280600781526020017f57697a61726473000000000000000000000000000000000000000000000000008152506001612676565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90614223565b60405180910390fd5b80915050919050565b6060611261826040518060400160405280600981526020017f456c657068616e74730000000000000000000000000000000000000000000000815250600a612676565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d090614203565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61132861225d565b73ffffffffffffffffffffffffffffffffffffffff166113466113f2565b73ffffffffffffffffffffffffffffffffffffffff161461139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390614283565b60405180910390fd5b6113a66000612803565b565b60606113eb826040518060400160405280600681526020017f486f7273657300000000000000000000000000000000000000000000000000008152506064612676565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611460826040518060400160405280600981526020017f53776f7264736d656e0000000000000000000000000000000000000000000000815250612710612676565b9050919050565b606060018054611476906145e2565b80601f01602080910402602001604051908101604052809291908181526020018280546114a2906145e2565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b5050505050905090565b600d5481565b61150761225d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614183565b60405180910390fd5b806005600061158261225d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661162f61225d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116749190614086565b60405180910390a35050565b60606116c4826040518060400160405280600781526020017f41726368657273000000000000000000000000000000000000000000000000008152506103e8612676565b9050919050565b6116dc6116d661225d565b8361231e565b61171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290614303565b60405180910390fd5b611727848484846128c9565b50505050565b60606117376135a9565b60405180610120016040528060fd815260200161500560fd9139816000600d811061178b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061179c8361141c565b816001600d81106117d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161514260289139816002600d8110611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061184283611680565b816003600d811061187c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614f6360289139816004600d81106118d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506118e8836113a8565b816005600d8110611922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614fb460289139816006600d811061197d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061198e8361121e565b816007600d81106119c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614fdc60299139816008600d8110611a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a3483610c4c565b816009600d8110611a6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614f8b6029913981600a600d8110611ac9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611ada83611122565b81600b600d8110611b14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d8110611b8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600d8110611bd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600d8110611c0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600d8110611c4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600d8110611c8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600d8110611ccc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600d8110611d0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600d8110611d4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600d8110611d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600d8110611dc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611de599989796959493929190613e4e565b604051602081830303815290604052905080826009600d8110611e31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a600d8110611e70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b600d8110611eaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c600d8110611eee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611f07959493929190613e03565b60405160208183030381529060405290506000611f54611f2686612925565b611f2f84612ad2565b604051602001611f40929190613fb8565b604051602081830303815290604052612ad2565b905080604051602001611f679190613ffd565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61201f61225d565b73ffffffffffffffffffffffffffffffffffffffff1661203d6113f2565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90614283565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90614103565b60405180910390fd5b61210c81612803565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121ea57506121e982612c90565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122d88361116c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612329826121f1565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f906141c3565b60405180910390fd5b60006123738361116c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca8461089d565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f357506123f28185611f83565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241c8261116c565b73ffffffffffffffffffffffffffffffffffffffff1614612472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612469906142c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990614163565b60405180910390fd5b6124ed838383612cfa565b6124f8600082612265565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254891906144f8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259f9190614417565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612672828260405180602001604052806000815250612e0e565b5050565b606060006126ac8461268787612925565b604051602001612698929190613f5a565b604051602081830303815290604052612e69565b9050600081905060006126e7866126c289612925565b6040516020016126d3929190613f2b565b604051602081830303815290604052612e69565b90508082116126f657816126f8565b805b9150600061272e876127098a612925565b60405160200161271a929190613efc565b604051602081830303815290604052612e69565b905080831161273d578261273f565b805b92506000612775886127508b612925565b604051602001612761929190613ecd565b604051602081830303815290604052612e69565b90508084116127845783612786565b805b9350600087858385878a61279a9190614417565b6127a49190614417565b6127ae9190614417565b6127b891906144f8565b6127c2919061449e565b90506000896127d083612925565b6040516020016127e1929190613f89565b6040516020818303038152906040529050809750505050505050509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128d48484846123fc565b6128e084848484612eb4565b61291f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612916906140e3565b60405180910390fd5b50505050565b6060600082141561296d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612acd565b600082905060005b6000821461299f57808061298890614645565b915050600a82612998919061446d565b9150612975565b60008167ffffffffffffffff8111156129e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a135781602001600182028036833780820191505090505b5090505b60008514612ac657600182612a2c91906144f8565b9150600a85612a3b919061468e565b6030612a479190614417565b60f81b818381518110612a83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612abf919061446d565b9450612a17565b8093505050505b919050565b60606000825190506000811415612afb5760405180602001604052806000815250915050612c8b565b60006003600283612b0c9190614417565b612b16919061446d565b6004612b22919061449e565b90506000602082612b339190614417565b67ffffffffffffffff811115612b72577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ba45781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615102604091399050600181016020830160005b86811015612c485760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612bcf565b506003860660018114612c625760028114612c7257612c7d565b613d3d60f01b6002830352612c7d565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d0583838361304b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d4857612d4381613050565b612d87565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d8657612d858382613099565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dca57612dc581613206565b612e09565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e0857612e078282613349565b5b5b505050565b612e1883836133c8565b612e256000848484612eb4565b612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b906140e3565b60405180910390fd5b505050565b60006001600783604051602001612e809190613dec565b6040516020818303038152906040528051906020012060001c612ea3919061468e565b612ead9190614417565b9050919050565b6000612ed58473ffffffffffffffffffffffffffffffffffffffff16613596565b1561303e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612efe61225d565b8786866040518563ffffffff1660e01b8152600401612f20949392919061403a565b602060405180830381600087803b158015612f3a57600080fd5b505af1925050508015612f6b57506040513d601f19601f82011682018060405250810190612f6891906138b0565b60015b612fee573d8060008114612f9b576040519150601f19603f3d011682016040523d82523d6000602084013e612fa0565b606091505b50600081511415612fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdd906140e3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613043565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130a684611268565b6130b091906144f8565b9050600060076000848152602001908152602001600020549050818114613195576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061321a91906144f8565b9050600060096000848152602001908152602001600020549050600060088381548110613270577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106132b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061332d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061335483611268565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342f90614243565b60405180910390fd5b613441816121f1565b15613481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347890614123565b60405180910390fd5b61348d60008383612cfa565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134dd9190614417565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b60608152602001906001900390816135b95790505090565b60006135e46135df846143a3565b61437e565b9050828152602081018484840111156135fc57600080fd5b6136078482856145a0565b509392505050565b60008135905061361e81614f06565b92915050565b60008151905061363381614f06565b92915050565b60008135905061364881614f1d565b92915050565b60008135905061365d81614f34565b92915050565b60008151905061367281614f34565b92915050565b600082601f83011261368957600080fd5b81356136998482602086016135d1565b91505092915050565b6000813590506136b181614f4b565b92915050565b6000602082840312156136c957600080fd5b60006136d78482850161360f565b91505092915050565b6000602082840312156136f257600080fd5b600061370084828501613624565b91505092915050565b6000806040838503121561371c57600080fd5b600061372a8582860161360f565b925050602061373b8582860161360f565b9150509250929050565b60008060006060848603121561375a57600080fd5b60006137688682870161360f565b93505060206137798682870161360f565b925050604061378a868287016136a2565b9150509250925092565b600080600080608085870312156137aa57600080fd5b60006137b88782880161360f565b94505060206137c98782880161360f565b93505060406137da878288016136a2565b925050606085013567ffffffffffffffff8111156137f757600080fd5b61380387828801613678565b91505092959194509250565b6000806040838503121561382257600080fd5b60006138308582860161360f565b925050602061384185828601613639565b9150509250929050565b6000806040838503121561385e57600080fd5b600061386c8582860161360f565b925050602061387d858286016136a2565b9150509250929050565b60006020828403121561389957600080fd5b60006138a78482850161364e565b91505092915050565b6000602082840312156138c257600080fd5b60006138d084828501613663565b91505092915050565b6000602082840312156138eb57600080fd5b60006138f9848285016136a2565b91505092915050565b61390b8161452c565b82525050565b61391a8161453e565b82525050565b600061392b826143d4565b61393581856143ea565b93506139458185602086016145af565b61394e8161477b565b840191505092915050565b6000613964826143df565b61396e81856143fb565b935061397e8185602086016145af565b6139878161477b565b840191505092915050565b600061399d826143df565b6139a7818561440c565b93506139b78185602086016145af565b80840191505092915050565b60006139d060b08361440c565b91506139db8261478c565b60b082019050919050565b60006139f360018361440c565b91506139fe82614873565b600182019050919050565b6000613a16602b836143fb565b9150613a218261489c565b604082019050919050565b6000613a396032836143fb565b9150613a44826148eb565b604082019050919050565b6000613a5c6026836143fb565b9150613a678261493a565b604082019050919050565b6000613a7f601c836143fb565b9150613a8a82614989565b602082019050919050565b6000613aa260018361440c565b9150613aad826149b2565b600182019050919050565b6000613ac5600e836143fb565b9150613ad0826149db565b602082019050919050565b6000613ae86024836143fb565b9150613af382614a04565b604082019050919050565b6000613b0b6019836143fb565b9150613b1682614a53565b602082019050919050565b6000613b2e601f836143fb565b9150613b3982614a7c565b602082019050919050565b6000613b5160118361440c565b9150613b5c82614aa5565b601182019050919050565b6000613b74602c836143fb565b9150613b7f82614ace565b604082019050919050565b6000613b976038836143fb565b9150613ba282614b1d565b604082019050919050565b6000613bba602a836143fb565b9150613bc582614b6c565b604082019050919050565b6000613bdd6029836143fb565b9150613be882614bbb565b604082019050919050565b6000613c0060028361440c565b9150613c0b82614c0a565b600282019050919050565b6000613c236020836143fb565b9150613c2e82614c33565b602082019050919050565b6000613c46602c836143fb565b9150613c5182614c5c565b604082019050919050565b6000613c696020836143fb565b9150613c7482614cab565b602082019050919050565b6000613c8c6010836143fb565b9150613c9782614cd4565b602082019050919050565b6000613caf6029836143fb565b9150613cba82614cfd565b604082019050919050565b6000613cd260018361440c565b9150613cdd82614d4c565b600182019050919050565b6000613cf56021836143fb565b9150613d0082614d75565b604082019050919050565b6000613d18601d8361440c565b9150613d2382614dc4565b601d82019050919050565b6000613d3b6031836143fb565b9150613d4682614ded565b604082019050919050565b6000613d5e60018361440c565b9150613d6982614e3c565b600182019050919050565b6000613d81602c836143fb565b9150613d8c82614e65565b604082019050919050565b6000613da460028361440c565b9150613daf82614eb4565b600282019050919050565b6000613dc7601f836143fb565b9150613dd282614edd565b602082019050919050565b613de681614596565b82525050565b6000613df88284613992565b915081905092915050565b6000613e0f8288613992565b9150613e1b8287613992565b9150613e278286613992565b9150613e338285613992565b9150613e3f8284613992565b91508190509695505050505050565b6000613e5a828c613992565b9150613e66828b613992565b9150613e72828a613992565b9150613e7e8289613992565b9150613e8a8288613992565b9150613e968287613992565b9150613ea28286613992565b9150613eae8285613992565b9150613eba8284613992565b91508190509a9950505050505050505050565b6000613ed98285613992565b9150613ee58284613992565b9150613ef0826139e6565b91508190509392505050565b6000613f088285613992565b9150613f148284613992565b9150613f1f82613a95565b91508190509392505050565b6000613f378285613992565b9150613f438284613992565b9150613f4e82613cc5565b91508190509392505050565b6000613f668285613992565b9150613f728284613992565b9150613f7d82613d51565b91508190509392505050565b6000613f958285613992565b9150613fa082613d97565b9150613fac8284613992565b91508190509392505050565b6000613fc382613b44565b9150613fcf8285613992565b9150613fda826139c3565b9150613fe68284613992565b9150613ff182613bf3565b91508190509392505050565b600061400882613d0b565b91506140148284613992565b915081905092915050565b60006020820190506140346000830184613902565b92915050565b600060808201905061404f6000830187613902565b61405c6020830186613902565b6140696040830185613ddd565b818103606083015261407b8184613920565b905095945050505050565b600060208201905061409b6000830184613911565b92915050565b600060208201905081810360008301526140bb8184613959565b905092915050565b600060208201905081810360008301526140dc81613a09565b9050919050565b600060208201905081810360008301526140fc81613a2c565b9050919050565b6000602082019050818103600083015261411c81613a4f565b9050919050565b6000602082019050818103600083015261413c81613a72565b9050919050565b6000602082019050818103600083015261415c81613ab8565b9050919050565b6000602082019050818103600083015261417c81613adb565b9050919050565b6000602082019050818103600083015261419c81613afe565b9050919050565b600060208201905081810360008301526141bc81613b21565b9050919050565b600060208201905081810360008301526141dc81613b67565b9050919050565b600060208201905081810360008301526141fc81613b8a565b9050919050565b6000602082019050818103600083015261421c81613bad565b9050919050565b6000602082019050818103600083015261423c81613bd0565b9050919050565b6000602082019050818103600083015261425c81613c16565b9050919050565b6000602082019050818103600083015261427c81613c39565b9050919050565b6000602082019050818103600083015261429c81613c5c565b9050919050565b600060208201905081810360008301526142bc81613c7f565b9050919050565b600060208201905081810360008301526142dc81613ca2565b9050919050565b600060208201905081810360008301526142fc81613ce8565b9050919050565b6000602082019050818103600083015261431c81613d2e565b9050919050565b6000602082019050818103600083015261433c81613d74565b9050919050565b6000602082019050818103600083015261435c81613dba565b9050919050565b60006020820190506143786000830184613ddd565b92915050565b6000614388614399565b90506143948282614614565b919050565b6000604051905090565b600067ffffffffffffffff8211156143be576143bd61474c565b5b6143c78261477b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061442282614596565b915061442d83614596565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614462576144616146bf565b5b828201905092915050565b600061447882614596565b915061448383614596565b925082614493576144926146ee565b5b828204905092915050565b60006144a982614596565b91506144b483614596565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144ed576144ec6146bf565b5b828202905092915050565b600061450382614596565b915061450e83614596565b925082821015614521576145206146bf565b5b828203905092915050565b600061453782614576565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156145cd5780820151818401526020810190506145b2565b838111156145dc576000848401525b50505050565b600060028204905060018216806145fa57607f821691505b6020821081141561460e5761460d61471d565b5b50919050565b61461d8261477b565b810181811067ffffffffffffffff8211171561463c5761463b61474c565b5b80604052505050565b600061465082614596565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614683576146826146bf565b5b600182019050919050565b600061469982614596565b91506146a483614596565b9250826146b4576146b36146ee565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f222c20226465736372697074696f6e223a202241726d792069732072616e646f60008201527f6d697a6564207461626c6520746f7020525047207374796c652073746174732060208201527f67656e65726174656420616e642073746f726564206f6e20636861696e2e204660408201527f65656c206672656520746f207573652041726d7920696e20616e79207761792060608201527f796f752077616e742e222c2022696d616765223a2022646174613a696d61676560808201527f2f7376672b786d6c3b6261736536342c0000000000000000000000000000000060a082015250565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f0f8161452c565b8114614f1a57600080fd5b50565b614f268161453e565b8114614f3157600080fd5b50565b614f3d8161454a565b8114614f4857600080fd5b50565b614f5481614596565b8114614f5f57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220be4ce0f6d5a6f27c076364b2228614d83f506177089bf01cb4e80b9c26080b9c64736f6c63430008040033

Deployed Bytecode Sourcemap

44561:5533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38411:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25525:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27084:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26607:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39051:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27974:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38719:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48458:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45386:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49190:104;;;;;;;;;;;;;:::i;:::-;;28384:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48991:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48727:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39241:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45663:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25219:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45242:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24949:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9917:94;;;;;;;;;;;;;:::i;:::-;;45103:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9266:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44956:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25694:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44703:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27377:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45521:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28640:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46718:1732;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10166:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38411:224;38513:4;38552:35;38537:50;;;:11;:50;;;;:90;;;;38591:36;38615:11;38591:23;:36::i;:::-;38537:90;38530:97;;38411:224;;;:::o;25525:100::-;25579:13;25612:5;25605:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25525:100;:::o;27084:221::-;27160:7;27188:16;27196:7;27188;:16::i;:::-;27180:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27273:15;:24;27289:7;27273:24;;;;;;;;;;;;;;;;;;;;;27266:31;;27084:221;;;:::o;26607:411::-;26688:13;26704:23;26719:7;26704:14;:23::i;:::-;26688:39;;26752:5;26746:11;;:2;:11;;;;26738:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26846:5;26830:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26855:37;26872:5;26879:12;:10;:12::i;:::-;26855:16;:37::i;:::-;26830:62;26808:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26989:21;26998:2;27002:7;26989:8;:21::i;:::-;26607:411;;;:::o;39051:113::-;39112:7;39139:10;:17;;;;39132:24;;39051:113;:::o;27974:339::-;28169:41;28188:12;:10;:12::i;:::-;28202:7;28169:18;:41::i;:::-;28161:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28277:28;28287:4;28293:2;28297:7;28277:9;:28::i;:::-;27974:339;;;:::o;38719:256::-;38816:7;38852:23;38869:5;38852:16;:23::i;:::-;38844:5;:31;38836:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38941:12;:19;38954:5;38941:19;;;;;;;;;;;;;;;:26;38961:5;38941:26;;;;;;;;;;;;38934:33;;38719:256;;;;:::o;48458:257::-;12205:1;12801:7;;:19;;12793:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12205:1;12934:7;:18;;;;48546:9:::1;48537:5;;:18;;48529:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48620:4;48610:7;:14;:33;;;;;48638:5;48628:7;:15;48610:33;48602:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48675:32;48685:12;:10;:12::i;:::-;48699:7;48675:9;:32::i;:::-;12161:1:::0;13113:7;:22;;;;48458:257;:::o;45386:127::-;45444:13;45477:28;45483:7;45477:28;;;;;;;;;;;;;;;;;45503:1;45477:5;:28::i;:::-;45470:35;;45386:127;;;:::o;49190:104::-;9497:12;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49246:7:::1;:5;:7::i;:::-;49238:25;;:48;49264:21;49238:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49190:104::o:0;28384:185::-;28522:39;28539:4;28545:2;28549:7;28522:39;;;;;;;;;;;;:16;:39::i;:::-;28384:185;;;:::o;48991:187::-;12205:1;12801:7;;:19;;12793:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12205:1;12934:7;:18;;;;9497:12:::1;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49087:5:::2;49077:7;:15;:34;;;;;49106:5;49096:7;:15;49077:34;49069:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49143:27;49153:7;:5;:7::i;:::-;49162;49143:9;:27::i;:::-;12161:1:::0;13113:7;:22;;;;48991:187;:::o;48727:252::-;12205:1;12801:7;;:19;;12793:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12205:1;12934:7;:18;;;;48815:1:::1;48805:7;:11;:29;;;;;48830:4;48820:7;:14;48805:29;48797:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48899:10;48874:35;;:4;;;;;;;;;;;:12;;;48887:7;48874:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;48866:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48939:32;48949:12;:10;:12::i;:::-;48963:7;48939:9;:32::i;:::-;12161:1:::0;13113:7;:22;;;;48727:252;:::o;39241:233::-;39316:7;39352:30;:28;:30::i;:::-;39344:5;:38;39336:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39449:10;39460:5;39449:17;;;;;;;;;;;;;;;;;;;;;;;;39442:24;;39241:233;;;:::o;45663:127::-;45721:13;45754:28;45760:7;45754:28;;;;;;;;;;;;;;;;;45780:1;45754:5;:28::i;:::-;45747:35;;45663:127;;;:::o;25219:239::-;25291:7;25311:13;25327:7;:16;25335:7;25327:16;;;;;;;;;;;;;;;;;;;;;25311:32;;25379:1;25362:19;;:5;:19;;;;25354:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25445:5;25438:12;;;25219:239;;;:::o;45242:132::-;45302:13;45335:31;45341:7;45335:31;;;;;;;;;;;;;;;;;45363:2;45335:5;:31::i;:::-;45328:38;;45242:132;;;:::o;24949:208::-;25021:7;25066:1;25049:19;;:5;:19;;;;25041:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25133:9;:16;25143:5;25133:16;;;;;;;;;;;;;;;;25126:23;;24949:208;;;:::o;9917:94::-;9497:12;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9982:21:::1;10000:1;9982:9;:21::i;:::-;9917:94::o:0;45103:127::-;45160:13;45193:29;45199:7;45193:29;;;;;;;;;;;;;;;;;45218:3;45193:5;:29::i;:::-;45186:36;;45103:127;;;:::o;9266:87::-;9312:7;9339:6;;;;;;;;;;;9332:13;;9266:87;:::o;44956:135::-;45016:13;45049:34;45055:7;45049:34;;;;;;;;;;;;;;;;;45077:5;45049;:34::i;:::-;45042:41;;44956:135;;;:::o;25694:104::-;25750:13;25783:7;25776:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25694:104;:::o;44703:40::-;;;;:::o;27377:295::-;27492:12;:10;:12::i;:::-;27480:24;;:8;:24;;;;27472:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27592:8;27547:18;:32;27566:12;:10;:12::i;:::-;27547:32;;;;;;;;;;;;;;;:42;27580:8;27547:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27645:8;27616:48;;27631:12;:10;:12::i;:::-;27616:48;;;27655:8;27616:48;;;;;;:::i;:::-;;;;;;;;27377:295;;:::o;45521:130::-;45579:13;45612:31;45618:7;45612:31;;;;;;;;;;;;;;;;;45638:4;45612:5;:31::i;:::-;45605:38;;45521:130;;;:::o;28640:328::-;28815:41;28834:12;:10;:12::i;:::-;28848:7;28815:18;:41::i;:::-;28807:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28921:39;28935:4;28941:2;28945:7;28954:5;28921:13;:39::i;:::-;28640:328;;;;:::o;46718:1732::-;46783:13;46809:23;;:::i;:::-;46843:266;;;;;;;;;;;;;;;;;:5;46849:1;46843:8;;;;;;;;;;;;;;;;;;:266;;;;47133:21;47146:7;47133:12;:21::i;:::-;47122:5;47128:1;47122:8;;;;;;;;;;;;;;;;;;:32;;;;47167:53;;;;;;;;;;;;;;;;;:5;47173:1;47167:8;;;;;;;;;;;;;;;;;;:53;;;;47244:19;47255:7;47244:10;:19::i;:::-;47233:5;47239:1;47233:8;;;;;;;;;;;;;;;;;;:30;;;;47276:53;;;;;;;;;;;;;;;;;:5;47282:1;47276:8;;;;;;;;;;;;;;;;;;:53;;;;47353:18;47363:7;47353:9;:18::i;:::-;47342:5;47348:1;47342:8;;;;;;;;;;;;;;;;;;:29;;;;47384:53;;;;;;;;;;;;;;;;;:5;47390:1;47384:8;;;;;;;;;;;;;;;;;;:53;;;;47461:21;47474:7;47461:12;:21::i;:::-;47450:5;47456:1;47450:8;;;;;;;;;;;;;;;;;;:32;;;;47495:54;;;;;;;;;;;;;;;;;:5;47501:1;47495:8;;;;;;;;;;;;;;;;;;:54;;;;47573:19;47584:7;47573:10;:19::i;:::-;47562:5;47568:1;47562:8;;;;;;;;;;;;;;;;;;:30;;;;47605:55;;;;;;;;;;;;;;;;;:5;47611:2;47605:9;;;;;;;;;;;;;;;;;;:55;;;;47685:19;47696:7;47685:10;:19::i;:::-;47673:5;47679:2;47673:9;;;;;;;;;;;;;;;;;;:31;;;;47717:27;;;;;;;;;;;;;;;;;:5;47723:2;47717:9;;;;;;;;;;;;;;;;;;:27;;;;47757:20;47804:5;47810:1;47804:8;;;;;;;;;;;;;;;;;;;47814:5;47820:1;47814:8;;;;;;;;;;;;;;;;;;;47824:5;47830:1;47824:8;;;;;;;;;;;;;;;;;;;47834:5;47840:1;47834:8;;;;;;;;;;;;;;;;;;;47844:5;47850:1;47844:8;;;;;;;;;;;;;;;;;;;47854:5;47860:1;47854:8;;;;;;;;;;;;;;;;;;;47864:5;47870:1;47864:8;;;;;;;;;;;;;;;;;;;47874:5;47880:1;47874:8;;;;;;;;;;;;;;;;;;;47884:5;47890:1;47884:8;;;;;;;;;;;;;;;;;;;47787:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47757:137;;47938:6;47946:5;47952:1;47946:8;;;;;;;;;;;;;;;;;;;47956:5;47962:2;47956:9;;;;;;;;;;;;;;;;;;;47967:5;47973:2;47967:9;;;;;;;;;;;;;;;;;;;47978:5;47984:2;47978:9;;;;;;;;;;;;;;;;;;;47921:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47905:84;;48010:18;48031:302;48096:17;48105:7;48096:8;:17::i;:::-;48295:28;48315:6;48295:13;:28::i;:::-;48058:272;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48031:13;:302::i;:::-;48010:323;;48410:4;48360:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;48344:72;;48436:6;48429:13;;;;;46718:1732;;;:::o;27743:164::-;27840:4;27864:18;:25;27883:5;27864:25;;;;;;;;;;;;;;;:35;27890:8;27864:35;;;;;;;;;;;;;;;;;;;;;;;;;27857:42;;27743:164;;;;:::o;10166:192::-;9497:12;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10275:1:::1;10255:22;;:8;:22;;;;10247:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10331:19;10341:8;10331:9;:19::i;:::-;10166:192:::0;:::o;24580:305::-;24682:4;24734:25;24719:40;;;:11;:40;;;;:105;;;;24791:33;24776:48;;;:11;:48;;;;24719:105;:158;;;;24841:36;24865:11;24841:23;:36::i;:::-;24719:158;24699:178;;24580:305;;;:::o;30478:127::-;30543:4;30595:1;30567:30;;:7;:16;30575:7;30567:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30560:37;;30478:127;;;:::o;8126:98::-;8179:7;8206:10;8199:17;;8126:98;:::o;34460:174::-;34562:2;34535:15;:24;34551:7;34535:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34618:7;34614:2;34580:46;;34589:23;34604:7;34589:14;:23::i;:::-;34580:46;;;;;;;;;;;;34460:174;;:::o;30772:348::-;30865:4;30890:16;30898:7;30890;:16::i;:::-;30882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30966:13;30982:23;30997:7;30982:14;:23::i;:::-;30966:39;;31035:5;31024:16;;:7;:16;;;:51;;;;31068:7;31044:31;;:20;31056:7;31044:11;:20::i;:::-;:31;;;31024:51;:87;;;;31079:32;31096:5;31103:7;31079:16;:32::i;:::-;31024:87;31016:96;;;30772:348;;;;:::o;33764:578::-;33923:4;33896:31;;:23;33911:7;33896:14;:23::i;:::-;:31;;;33888:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34006:1;33992:16;;:2;:16;;;;33984:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34062:39;34083:4;34089:2;34093:7;34062:20;:39::i;:::-;34166:29;34183:1;34187:7;34166:8;:29::i;:::-;34227:1;34208:9;:15;34218:4;34208:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34256:1;34239:9;:13;34249:2;34239:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34287:2;34268:7;:16;34276:7;34268:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34326:7;34322:2;34307:27;;34316:4;34307:27;;;;;;;;;;;;33764:578;;;:::o;31462:110::-;31538:26;31548:2;31552:7;31538:26;;;;;;;;;;;;:9;:26::i;:::-;31462:110;;:::o;45808:902::-;45905:13;45931;45947:67;45978:9;45989:17;45998:7;45989:8;:17::i;:::-;45961:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45947:6;:67::i;:::-;45931:83;;46025:11;46039:5;46025:19;;46055:13;46071:67;46102:9;46113:17;46122:7;46113:8;:17::i;:::-;46085:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46071:6;:67::i;:::-;46055:83;;46161:5;46155:3;:11;:25;;46177:3;46155:25;;;46169:5;46155:25;46149:31;;46191:13;46207:67;46238:9;46249:17;46258:7;46249:8;:17::i;:::-;46221:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46207:6;:67::i;:::-;46191:83;;46297:5;46291:3;:11;:25;;46313:3;46291:25;;;46305:5;46291:25;46285:31;;46327:13;46343:67;46374:9;46385:17;46394:7;46385:8;:17::i;:::-;46357:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46343:6;:67::i;:::-;46327:83;;46433:5;46427:3;:11;:25;;46449:3;46427:25;;;46441:5;46427:25;46421:31;;46510:12;46565:10;46558:3;46550:5;46542;46534;46526;:13;;;;:::i;:::-;:21;;;;:::i;:::-;:29;;;;:::i;:::-;:35;;;;:::i;:::-;46525:50;;;;:::i;:::-;46510:65;;46596:20;46643:9;46660:14;46669:4;46660:8;:14::i;:::-;46626:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46596:80;;46696:6;46689:13;;;;;;;;;45808:902;;;;;:::o;10366:173::-;10422:16;10441:6;;;;;;;;;;;10422:25;;10467:8;10458:6;;:17;;;;;;;;;;;;;;;;;;10522:8;10491:40;;10512:8;10491:40;;;;;;;;;;;;10366:173;;:::o;29850:315::-;30007:28;30017:4;30023:2;30027:7;30007:9;:28::i;:::-;30054:48;30077:4;30083:2;30087:7;30096:5;30054:22;:48::i;:::-;30046:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29850:315;;;;:::o;49310:715::-;49366:13;49588:1;49579:5;:10;49575:53;;;49606:10;;;;;;;;;;;;;;;;;;;;;49575:53;49638:12;49653:5;49638:20;;49669:14;49694:78;49709:1;49701:4;:9;49694:78;;49727:8;;;;;:::i;:::-;;;;49758:2;49750:10;;;;;:::i;:::-;;;49694:78;;;49782:19;49814:6;49804:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49782:39;;49832:154;49848:1;49839:5;:10;49832:154;;49876:1;49866:11;;;;;:::i;:::-;;;49943:2;49935:5;:10;;;;:::i;:::-;49922:2;:24;;;;:::i;:::-;49909:39;;49892:6;49899;49892:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;49972:2;49963:11;;;;;:::i;:::-;;;49832:154;;;50010:6;49996:21;;;;;49310:715;;;;:::o;50445:1607::-;50503:13;50529:11;50543:4;:11;50529:25;;50576:1;50569:3;:8;50565:23;;;50579:9;;;;;;;;;;;;;;;;;50565:23;50640:18;50678:1;50673;50667:3;:7;;;;:::i;:::-;50666:13;;;;:::i;:::-;50661:1;:19;;;;:::i;:::-;50640:40;;50738:19;50783:2;50770:10;:15;;;;:::i;:::-;50760:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50738:48;;50799:18;50820:5;;;;;;;;;;;;;;;;;50799:26;;50889:1;50882:5;50878:13;50934:2;50926:6;50922:15;50985:1;50953:777;51008:3;51005:1;51002:10;50953:777;;;51063:1;51060;51056:9;51051:14;;51121:8;51116:1;51110:4;51106:12;51100:19;51096:34;51201:4;51193:5;51189:2;51185:14;51181:25;51171:8;51167:40;51161:47;51240:3;51237:1;51233:11;51226:18;;51331:4;51322;51314:5;51310:2;51306:14;51302:25;51292:8;51288:40;51282:47;51278:58;51273:3;51269:68;51262:75;;51369:3;51366:1;51362:11;51355:18;;51459:4;51450;51442:5;51439:1;51435:13;51431:24;51421:8;51417:39;51411:46;51407:57;51402:3;51398:67;51391:74;;51497:3;51494:1;51490:11;51483:18;;51579:4;51570;51563:5;51559:16;51549:8;51545:31;51539:38;51535:49;51530:3;51526:59;51519:66;;51619:3;51614;51610:13;51603:20;;51661:3;51650:9;51643:22;51713:1;51702:9;51698:17;51685:30;;51032:698;;50953:777;;;50957:44;51762:1;51757:3;51753:11;51783:1;51778:84;;;;51881:1;51876:82;;;;51746:212;;51778:84;51839:6;51834:3;51830:16;51826:1;51815:9;51811:17;51804:43;51778:84;;51876:82;51937:4;51932:3;51928:14;51924:1;51913:9;51909:17;51902:41;51746:212;;51989:10;51981:6;51974:26;50847:1164;;52037:6;52023:21;;;;;;50445:1607;;;;:::o;23187:157::-;23272:4;23311:25;23296:40;;;:11;:40;;;;23289:47;;23187:157;;;:::o;40087:589::-;40231:45;40258:4;40264:2;40268:7;40231:26;:45::i;:::-;40309:1;40293:18;;:4;:18;;;40289:187;;;40328:40;40360:7;40328:31;:40::i;:::-;40289:187;;;40398:2;40390:10;;:4;:10;;;40386:90;;40417:47;40450:4;40456:7;40417:32;:47::i;:::-;40386:90;40289:187;40504:1;40490:16;;:2;:16;;;40486:183;;;40523:45;40560:7;40523:36;:45::i;:::-;40486:183;;;40596:4;40590:10;;:2;:10;;;40586:83;;40617:40;40645:2;40649:7;40617:27;:40::i;:::-;40586:83;40486:183;40087:589;;;:::o;31799:321::-;31929:18;31935:2;31939:7;31929:5;:18::i;:::-;31980:54;32011:1;32015:2;32019:7;32028:5;31980:22;:54::i;:::-;31958:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31799:321;;;:::o;44796:148::-;44856:7;44935:1;44930;44919:5;44902:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;44892:34;;;;;;44884:43;;:47;;;;:::i;:::-;44883:53;;;;:::i;:::-;44876:60;;44796:148;;;:::o;35199:803::-;35354:4;35375:15;:2;:13;;;:15::i;:::-;35371:624;;;35427:2;35411:36;;;35448:12;:10;:12::i;:::-;35462:4;35468:7;35477:5;35411:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35407:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35674:1;35657:6;:13;:18;35653:272;;;35700:60;;;;;;;;;;:::i;:::-;;;;;;;;35653:272;35875:6;35869:13;35860:6;35856:2;35852:15;35845:38;35407:533;35544:45;;;35534:55;;;:6;:55;;;;35527:62;;;;;35371:624;35979:4;35972:11;;35199:803;;;;;;;:::o;36574:126::-;;;;:::o;41399:164::-;41503:10;:17;;;;41476:15;:24;41492:7;41476:24;;;;;;;;;;;:44;;;;41531:10;41547:7;41531:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41399:164;:::o;42190:988::-;42456:22;42506:1;42481:22;42498:4;42481:16;:22::i;:::-;:26;;;;:::i;:::-;42456:51;;42518:18;42539:17;:26;42557:7;42539:26;;;;;;;;;;;;42518:47;;42686:14;42672:10;:28;42668:328;;42717:19;42739:12;:18;42752:4;42739:18;;;;;;;;;;;;;;;:34;42758:14;42739:34;;;;;;;;;;;;42717:56;;42823:11;42790:12;:18;42803:4;42790:18;;;;;;;;;;;;;;;:30;42809:10;42790:30;;;;;;;;;;;:44;;;;42940:10;42907:17;:30;42925:11;42907:30;;;;;;;;;;;:43;;;;42668:328;;43092:17;:26;43110:7;43092:26;;;;;;;;;;;43085:33;;;43136:12;:18;43149:4;43136:18;;;;;;;;;;;;;;;:34;43155:14;43136:34;;;;;;;;;;;43129:41;;;42190:988;;;;:::o;43473:1079::-;43726:22;43771:1;43751:10;:17;;;;:21;;;;:::i;:::-;43726:46;;43783:18;43804:15;:24;43820:7;43804:24;;;;;;;;;;;;43783:45;;44155:19;44177:10;44188:14;44177:26;;;;;;;;;;;;;;;;;;;;;;;;44155:48;;44241:11;44216:10;44227;44216:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44352:10;44321:15;:28;44337:11;44321:28;;;;;;;;;;;:41;;;;44493:15;:24;44509:7;44493:24;;;;;;;;;;;44486:31;;;44528:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43473:1079;;;;:::o;40977:221::-;41062:14;41079:20;41096:2;41079:16;:20::i;:::-;41062:37;;41137:7;41110:12;:16;41123:2;41110:16;;;;;;;;;;;;;;;:24;41127:6;41110:24;;;;;;;;;;;:34;;;;41184:6;41155:17;:26;41173:7;41155:26;;;;;;;;;;;:35;;;;40977:221;;;:::o;32456:382::-;32550:1;32536:16;;:2;:16;;;;32528:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32609:16;32617:7;32609;:16::i;:::-;32608:17;32600:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32671:45;32700:1;32704:2;32708:7;32671:20;:45::i;:::-;32746:1;32729:9;:13;32739:2;32729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32777:2;32758:7;:16;32766:7;32758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32822:7;32818:2;32797:33;;32814:1;32797:33;;;;;;;;;;;;32456:382;;:::o;15359:387::-;15419:4;15627:12;15694:7;15682:20;15674:28;;15737:1;15730:4;:8;15723:15;;;15359:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;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:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:143::-;558:5;589:6;583:13;574:22;;605:33;632:5;605:33;:::i;:::-;564:80;;;;:::o;650:133::-;693:5;731:6;718:20;709:29;;747:30;771:5;747:30;:::i;:::-;699:84;;;;:::o;789:137::-;834:5;872:6;859:20;850:29;;888:32;914:5;888:32;:::i;:::-;840:86;;;;:::o;932:141::-;988:5;1019:6;1013:13;1004:22;;1035:32;1061:5;1035:32;:::i;:::-;994:79;;;;:::o;1092:271::-;1147:5;1196:3;1189:4;1181:6;1177:17;1173:27;1163:2;;1214:1;1211;1204:12;1163:2;1254:6;1241:20;1279:78;1353:3;1345:6;1338:4;1330:6;1326:17;1279:78;:::i;:::-;1270:87;;1153:210;;;;;:::o;1369:139::-;1415:5;1453:6;1440:20;1431:29;;1469:33;1496:5;1469:33;:::i;:::-;1421:87;;;;:::o;1514:262::-;1573:6;1622:2;1610:9;1601:7;1597:23;1593:32;1590:2;;;1638:1;1635;1628:12;1590:2;1681:1;1706:53;1751:7;1742:6;1731:9;1727:22;1706:53;:::i;:::-;1696:63;;1652:117;1580:196;;;;:::o;1782:284::-;1852:6;1901:2;1889:9;1880:7;1876:23;1872:32;1869:2;;;1917:1;1914;1907:12;1869:2;1960:1;1985:64;2041:7;2032:6;2021:9;2017:22;1985:64;:::i;:::-;1975:74;;1931:128;1859:207;;;;:::o;2072:407::-;2140:6;2148;2197:2;2185:9;2176:7;2172:23;2168:32;2165:2;;;2213:1;2210;2203:12;2165:2;2256:1;2281:53;2326:7;2317:6;2306:9;2302:22;2281:53;:::i;:::-;2271:63;;2227:117;2383:2;2409:53;2454:7;2445:6;2434:9;2430:22;2409:53;:::i;:::-;2399:63;;2354:118;2155:324;;;;;:::o;2485:552::-;2562:6;2570;2578;2627:2;2615:9;2606:7;2602:23;2598:32;2595:2;;;2643:1;2640;2633:12;2595:2;2686:1;2711:53;2756:7;2747:6;2736:9;2732:22;2711:53;:::i;:::-;2701:63;;2657:117;2813:2;2839:53;2884:7;2875:6;2864:9;2860:22;2839:53;:::i;:::-;2829:63;;2784:118;2941:2;2967:53;3012:7;3003:6;2992:9;2988:22;2967:53;:::i;:::-;2957:63;;2912:118;2585:452;;;;;:::o;3043:809::-;3138:6;3146;3154;3162;3211:3;3199:9;3190:7;3186:23;3182:33;3179:2;;;3228:1;3225;3218:12;3179:2;3271:1;3296:53;3341:7;3332:6;3321:9;3317:22;3296:53;:::i;:::-;3286:63;;3242:117;3398:2;3424:53;3469:7;3460:6;3449:9;3445:22;3424:53;:::i;:::-;3414:63;;3369:118;3526:2;3552:53;3597:7;3588:6;3577:9;3573:22;3552:53;:::i;:::-;3542:63;;3497:118;3682:2;3671:9;3667:18;3654:32;3713:18;3705:6;3702:30;3699:2;;;3745:1;3742;3735:12;3699:2;3773:62;3827:7;3818:6;3807:9;3803:22;3773:62;:::i;:::-;3763:72;;3625:220;3169:683;;;;;;;:::o;3858:401::-;3923:6;3931;3980:2;3968:9;3959:7;3955:23;3951:32;3948:2;;;3996:1;3993;3986:12;3948:2;4039:1;4064:53;4109:7;4100:6;4089:9;4085:22;4064:53;:::i;:::-;4054:63;;4010:117;4166:2;4192:50;4234:7;4225:6;4214:9;4210:22;4192:50;:::i;:::-;4182:60;;4137:115;3938:321;;;;;:::o;4265:407::-;4333:6;4341;4390:2;4378:9;4369:7;4365:23;4361:32;4358:2;;;4406:1;4403;4396:12;4358:2;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4348:324;;;;;:::o;4678:260::-;4736:6;4785:2;4773:9;4764:7;4760:23;4756:32;4753:2;;;4801:1;4798;4791:12;4753:2;4844:1;4869:52;4913:7;4904:6;4893:9;4889:22;4869:52;:::i;:::-;4859:62;;4815:116;4743:195;;;;:::o;4944:282::-;5013:6;5062:2;5050:9;5041:7;5037:23;5033:32;5030:2;;;5078:1;5075;5068:12;5030:2;5121:1;5146:63;5201:7;5192:6;5181:9;5177:22;5146:63;:::i;:::-;5136:73;;5092:127;5020:206;;;;:::o;5232:262::-;5291:6;5340:2;5328:9;5319:7;5315:23;5311:32;5308:2;;;5356:1;5353;5346:12;5308:2;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5298:196;;;;:::o;5500:118::-;5587:24;5605:5;5587:24;:::i;:::-;5582:3;5575:37;5565:53;;:::o;5624:109::-;5705:21;5720:5;5705:21;:::i;:::-;5700:3;5693:34;5683:50;;:::o;5739:360::-;5825:3;5853:38;5885:5;5853:38;:::i;:::-;5907:70;5970:6;5965:3;5907:70;:::i;:::-;5900:77;;5986:52;6031:6;6026:3;6019:4;6012:5;6008:16;5986:52;:::i;:::-;6063:29;6085:6;6063:29;:::i;:::-;6058:3;6054:39;6047:46;;5829:270;;;;;:::o;6105:364::-;6193:3;6221:39;6254:5;6221:39;:::i;:::-;6276:71;6340:6;6335:3;6276:71;:::i;:::-;6269:78;;6356:52;6401:6;6396:3;6389:4;6382:5;6378:16;6356:52;:::i;:::-;6433:29;6455:6;6433:29;:::i;:::-;6428:3;6424:39;6417:46;;6197:272;;;;;:::o;6475:377::-;6581:3;6609:39;6642:5;6609:39;:::i;:::-;6664:89;6746:6;6741:3;6664:89;:::i;:::-;6657:96;;6762:52;6807:6;6802:3;6795:4;6788:5;6784:16;6762:52;:::i;:::-;6839:6;6834:3;6830:16;6823:23;;6585:267;;;;;:::o;6858:404::-;7018:3;7039:86;7121:3;7116;7039:86;:::i;:::-;7032:93;;7134;7223:3;7134:93;:::i;:::-;7252:3;7247;7243:13;7236:20;;7022:240;;;:::o;7268:400::-;7428:3;7449:84;7531:1;7526:3;7449:84;:::i;:::-;7442:91;;7542:93;7631:3;7542:93;:::i;:::-;7660:1;7655:3;7651:11;7644:18;;7432:236;;;:::o;7674:366::-;7816:3;7837:67;7901:2;7896:3;7837:67;:::i;:::-;7830:74;;7913:93;8002:3;7913:93;:::i;:::-;8031:2;8026:3;8022:12;8015:19;;7820:220;;;:::o;8046:366::-;8188:3;8209:67;8273:2;8268:3;8209:67;:::i;:::-;8202:74;;8285:93;8374:3;8285:93;:::i;:::-;8403:2;8398:3;8394:12;8387:19;;8192:220;;;:::o;8418:366::-;8560:3;8581:67;8645:2;8640:3;8581:67;:::i;:::-;8574:74;;8657:93;8746:3;8657:93;:::i;:::-;8775:2;8770:3;8766:12;8759:19;;8564:220;;;:::o;8790:366::-;8932:3;8953:67;9017:2;9012:3;8953:67;:::i;:::-;8946:74;;9029:93;9118:3;9029:93;:::i;:::-;9147:2;9142:3;9138:12;9131:19;;8936:220;;;:::o;9162:400::-;9322:3;9343:84;9425:1;9420:3;9343:84;:::i;:::-;9336:91;;9436:93;9525:3;9436:93;:::i;:::-;9554:1;9549:3;9545:11;9538:18;;9326:236;;;:::o;9568:366::-;9710:3;9731:67;9795:2;9790:3;9731:67;:::i;:::-;9724:74;;9807:93;9896:3;9807:93;:::i;:::-;9925:2;9920:3;9916:12;9909:19;;9714:220;;;:::o;9940:366::-;10082:3;10103:67;10167:2;10162:3;10103:67;:::i;:::-;10096:74;;10179:93;10268:3;10179:93;:::i;:::-;10297:2;10292:3;10288:12;10281:19;;10086:220;;;:::o;10312:366::-;10454:3;10475:67;10539:2;10534:3;10475:67;:::i;:::-;10468:74;;10551:93;10640:3;10551:93;:::i;:::-;10669:2;10664:3;10660:12;10653:19;;10458:220;;;:::o;10684:366::-;10826:3;10847:67;10911:2;10906:3;10847:67;:::i;:::-;10840:74;;10923:93;11012:3;10923:93;:::i;:::-;11041:2;11036:3;11032:12;11025:19;;10830:220;;;:::o;11056:402::-;11216:3;11237:85;11319:2;11314:3;11237:85;:::i;:::-;11230:92;;11331:93;11420:3;11331:93;:::i;:::-;11449:2;11444:3;11440:12;11433:19;;11220:238;;;:::o;11464:366::-;11606:3;11627:67;11691:2;11686:3;11627:67;:::i;:::-;11620:74;;11703:93;11792:3;11703:93;:::i;:::-;11821:2;11816:3;11812:12;11805:19;;11610:220;;;:::o;11836:366::-;11978:3;11999:67;12063:2;12058:3;11999:67;:::i;:::-;11992:74;;12075:93;12164:3;12075:93;:::i;:::-;12193:2;12188:3;12184:12;12177:19;;11982:220;;;:::o;12208:366::-;12350:3;12371:67;12435:2;12430:3;12371:67;:::i;:::-;12364:74;;12447:93;12536:3;12447:93;:::i;:::-;12565:2;12560:3;12556:12;12549:19;;12354:220;;;:::o;12580:366::-;12722:3;12743:67;12807:2;12802:3;12743:67;:::i;:::-;12736:74;;12819:93;12908:3;12819:93;:::i;:::-;12937:2;12932:3;12928:12;12921:19;;12726:220;;;:::o;12952:400::-;13112:3;13133:84;13215:1;13210:3;13133:84;:::i;:::-;13126:91;;13226:93;13315:3;13226:93;:::i;:::-;13344:1;13339:3;13335:11;13328:18;;13116:236;;;:::o;13358:366::-;13500:3;13521:67;13585:2;13580:3;13521:67;:::i;:::-;13514:74;;13597:93;13686:3;13597:93;:::i;:::-;13715:2;13710:3;13706:12;13699:19;;13504:220;;;:::o;13730:366::-;13872:3;13893:67;13957:2;13952:3;13893:67;:::i;:::-;13886:74;;13969:93;14058:3;13969:93;:::i;:::-;14087:2;14082:3;14078:12;14071:19;;13876:220;;;:::o;14102:366::-;14244:3;14265:67;14329:2;14324:3;14265:67;:::i;:::-;14258:74;;14341:93;14430:3;14341:93;:::i;:::-;14459:2;14454:3;14450:12;14443:19;;14248:220;;;:::o;14474:366::-;14616:3;14637:67;14701:2;14696:3;14637:67;:::i;:::-;14630:74;;14713:93;14802:3;14713:93;:::i;:::-;14831:2;14826:3;14822:12;14815:19;;14620:220;;;:::o;14846:366::-;14988:3;15009:67;15073:2;15068:3;15009:67;:::i;:::-;15002:74;;15085:93;15174:3;15085:93;:::i;:::-;15203:2;15198:3;15194:12;15187:19;;14992:220;;;:::o;15218:400::-;15378:3;15399:84;15481:1;15476:3;15399:84;:::i;:::-;15392:91;;15492:93;15581:3;15492:93;:::i;:::-;15610:1;15605:3;15601:11;15594:18;;15382:236;;;:::o;15624:366::-;15766:3;15787:67;15851:2;15846:3;15787:67;:::i;:::-;15780:74;;15863:93;15952:3;15863:93;:::i;:::-;15981:2;15976:3;15972:12;15965:19;;15770:220;;;:::o;15996:402::-;16156:3;16177:85;16259:2;16254:3;16177:85;:::i;:::-;16170:92;;16271:93;16360:3;16271:93;:::i;:::-;16389:2;16384:3;16380:12;16373:19;;16160:238;;;:::o;16404:366::-;16546:3;16567:67;16631:2;16626:3;16567:67;:::i;:::-;16560:74;;16643:93;16732:3;16643:93;:::i;:::-;16761:2;16756:3;16752:12;16745:19;;16550:220;;;:::o;16776:400::-;16936:3;16957:84;17039:1;17034:3;16957:84;:::i;:::-;16950:91;;17050:93;17139:3;17050:93;:::i;:::-;17168:1;17163:3;17159:11;17152:18;;16940:236;;;:::o;17182:366::-;17324:3;17345:67;17409:2;17404:3;17345:67;:::i;:::-;17338:74;;17421:93;17510:3;17421:93;:::i;:::-;17539:2;17534:3;17530:12;17523:19;;17328:220;;;:::o;17554:400::-;17714:3;17735:84;17817:1;17812:3;17735:84;:::i;:::-;17728:91;;17828:93;17917:3;17828:93;:::i;:::-;17946:1;17941:3;17937:11;17930:18;;17718:236;;;:::o;17960:366::-;18102:3;18123:67;18187:2;18182:3;18123:67;:::i;:::-;18116:74;;18199:93;18288:3;18199:93;:::i;:::-;18317:2;18312:3;18308:12;18301:19;;18106:220;;;:::o;18332:118::-;18419:24;18437:5;18419:24;:::i;:::-;18414:3;18407:37;18397:53;;:::o;18456:275::-;18588:3;18610:95;18701:3;18692:6;18610:95;:::i;:::-;18603:102;;18722:3;18715:10;;18592:139;;;;:::o;18737:915::-;19061:3;19083:95;19174:3;19165:6;19083:95;:::i;:::-;19076:102;;19195:95;19286:3;19277:6;19195:95;:::i;:::-;19188:102;;19307:95;19398:3;19389:6;19307:95;:::i;:::-;19300:102;;19419:95;19510:3;19501:6;19419:95;:::i;:::-;19412:102;;19531:95;19622:3;19613:6;19531:95;:::i;:::-;19524:102;;19643:3;19636:10;;19065:587;;;;;;;;:::o;19658:1555::-;20174:3;20196:95;20287:3;20278:6;20196:95;:::i;:::-;20189:102;;20308:95;20399:3;20390:6;20308:95;:::i;:::-;20301:102;;20420:95;20511:3;20502:6;20420:95;:::i;:::-;20413:102;;20532:95;20623:3;20614:6;20532:95;:::i;:::-;20525:102;;20644:95;20735:3;20726:6;20644:95;:::i;:::-;20637:102;;20756:95;20847:3;20838:6;20756:95;:::i;:::-;20749:102;;20868:95;20959:3;20950:6;20868:95;:::i;:::-;20861:102;;20980:95;21071:3;21062:6;20980:95;:::i;:::-;20973:102;;21092:95;21183:3;21174:6;21092:95;:::i;:::-;21085:102;;21204:3;21197:10;;20178:1035;;;;;;;;;;;;:::o;21219:701::-;21500:3;21522:95;21613:3;21604:6;21522:95;:::i;:::-;21515:102;;21634:95;21725:3;21716:6;21634:95;:::i;:::-;21627:102;;21746:148;21890:3;21746:148;:::i;:::-;21739:155;;21911:3;21904:10;;21504:416;;;;;:::o;21926:701::-;22207:3;22229:95;22320:3;22311:6;22229:95;:::i;:::-;22222:102;;22341:95;22432:3;22423:6;22341:95;:::i;:::-;22334:102;;22453:148;22597:3;22453:148;:::i;:::-;22446:155;;22618:3;22611:10;;22211:416;;;;;:::o;22633:701::-;22914:3;22936:95;23027:3;23018:6;22936:95;:::i;:::-;22929:102;;23048:95;23139:3;23130:6;23048:95;:::i;:::-;23041:102;;23160:148;23304:3;23160:148;:::i;:::-;23153:155;;23325:3;23318:10;;22918:416;;;;;:::o;23340:701::-;23621:3;23643:95;23734:3;23725:6;23643:95;:::i;:::-;23636:102;;23755:95;23846:3;23837:6;23755:95;:::i;:::-;23748:102;;23867:148;24011:3;23867:148;:::i;:::-;23860:155;;24032:3;24025:10;;23625:416;;;;;:::o;24047:701::-;24328:3;24350:95;24441:3;24432:6;24350:95;:::i;:::-;24343:102;;24462:148;24606:3;24462:148;:::i;:::-;24455:155;;24627:95;24718:3;24709:6;24627:95;:::i;:::-;24620:102;;24739:3;24732:10;;24332:416;;;;;:::o;24754:1233::-;25237:3;25259:148;25403:3;25259:148;:::i;:::-;25252:155;;25424:95;25515:3;25506:6;25424:95;:::i;:::-;25417:102;;25536:148;25680:3;25536:148;:::i;:::-;25529:155;;25701:95;25792:3;25783:6;25701:95;:::i;:::-;25694:102;;25813:148;25957:3;25813:148;:::i;:::-;25806:155;;25978:3;25971:10;;25241:746;;;;;:::o;25993:541::-;26226:3;26248:148;26392:3;26248:148;:::i;:::-;26241:155;;26413:95;26504:3;26495:6;26413:95;:::i;:::-;26406:102;;26525:3;26518:10;;26230:304;;;;:::o;26540:222::-;26633:4;26671:2;26660:9;26656:18;26648:26;;26684:71;26752:1;26741:9;26737:17;26728:6;26684:71;:::i;:::-;26638:124;;;;:::o;26768:640::-;26963:4;27001:3;26990:9;26986:19;26978:27;;27015:71;27083:1;27072:9;27068:17;27059:6;27015:71;:::i;:::-;27096:72;27164:2;27153:9;27149:18;27140:6;27096:72;:::i;:::-;27178;27246:2;27235:9;27231:18;27222:6;27178:72;:::i;:::-;27297:9;27291:4;27287:20;27282:2;27271:9;27267:18;27260:48;27325:76;27396:4;27387:6;27325:76;:::i;:::-;27317:84;;26968:440;;;;;;;:::o;27414:210::-;27501:4;27539:2;27528:9;27524:18;27516:26;;27552:65;27614:1;27603:9;27599:17;27590:6;27552:65;:::i;:::-;27506:118;;;;:::o;27630:313::-;27743:4;27781:2;27770:9;27766:18;27758:26;;27830:9;27824:4;27820:20;27816:1;27805:9;27801:17;27794:47;27858:78;27931:4;27922:6;27858:78;:::i;:::-;27850:86;;27748:195;;;;:::o;27949:419::-;28115:4;28153:2;28142:9;28138:18;28130:26;;28202:9;28196:4;28192:20;28188:1;28177:9;28173:17;28166:47;28230:131;28356:4;28230:131;:::i;:::-;28222:139;;28120:248;;;:::o;28374:419::-;28540:4;28578:2;28567:9;28563:18;28555:26;;28627:9;28621:4;28617:20;28613:1;28602:9;28598:17;28591:47;28655:131;28781:4;28655:131;:::i;:::-;28647:139;;28545:248;;;:::o;28799:419::-;28965:4;29003:2;28992:9;28988:18;28980:26;;29052:9;29046:4;29042:20;29038:1;29027:9;29023:17;29016:47;29080:131;29206:4;29080:131;:::i;:::-;29072:139;;28970:248;;;:::o;29224:419::-;29390:4;29428:2;29417:9;29413:18;29405:26;;29477:9;29471:4;29467:20;29463:1;29452:9;29448:17;29441:47;29505:131;29631:4;29505:131;:::i;:::-;29497:139;;29395:248;;;:::o;29649:419::-;29815:4;29853:2;29842:9;29838:18;29830:26;;29902:9;29896:4;29892:20;29888:1;29877:9;29873:17;29866:47;29930:131;30056:4;29930:131;:::i;:::-;29922:139;;29820:248;;;:::o;30074:419::-;30240:4;30278:2;30267:9;30263:18;30255:26;;30327:9;30321:4;30317:20;30313:1;30302:9;30298:17;30291:47;30355:131;30481:4;30355:131;:::i;:::-;30347:139;;30245:248;;;:::o;30499:419::-;30665:4;30703:2;30692:9;30688:18;30680:26;;30752:9;30746:4;30742:20;30738:1;30727:9;30723:17;30716:47;30780:131;30906:4;30780:131;:::i;:::-;30772:139;;30670:248;;;:::o;30924:419::-;31090:4;31128:2;31117:9;31113:18;31105:26;;31177:9;31171:4;31167:20;31163:1;31152:9;31148:17;31141:47;31205:131;31331:4;31205:131;:::i;:::-;31197:139;;31095:248;;;:::o;31349:419::-;31515:4;31553:2;31542:9;31538:18;31530:26;;31602:9;31596:4;31592:20;31588:1;31577:9;31573:17;31566:47;31630:131;31756:4;31630:131;:::i;:::-;31622:139;;31520:248;;;:::o;31774:419::-;31940:4;31978:2;31967:9;31963:18;31955:26;;32027:9;32021:4;32017:20;32013:1;32002:9;31998:17;31991:47;32055:131;32181:4;32055:131;:::i;:::-;32047:139;;31945:248;;;:::o;32199:419::-;32365:4;32403:2;32392:9;32388:18;32380:26;;32452:9;32446:4;32442:20;32438:1;32427:9;32423:17;32416:47;32480:131;32606:4;32480:131;:::i;:::-;32472:139;;32370:248;;;:::o;32624:419::-;32790:4;32828:2;32817:9;32813:18;32805:26;;32877:9;32871:4;32867:20;32863:1;32852:9;32848:17;32841:47;32905:131;33031:4;32905:131;:::i;:::-;32897:139;;32795:248;;;:::o;33049:419::-;33215:4;33253:2;33242:9;33238:18;33230:26;;33302:9;33296:4;33292:20;33288:1;33277:9;33273:17;33266:47;33330:131;33456:4;33330:131;:::i;:::-;33322:139;;33220:248;;;:::o;33474:419::-;33640:4;33678:2;33667:9;33663:18;33655:26;;33727:9;33721:4;33717:20;33713:1;33702:9;33698:17;33691:47;33755:131;33881:4;33755:131;:::i;:::-;33747:139;;33645:248;;;:::o;33899:419::-;34065:4;34103:2;34092:9;34088:18;34080:26;;34152:9;34146:4;34142:20;34138:1;34127:9;34123:17;34116:47;34180:131;34306:4;34180:131;:::i;:::-;34172:139;;34070:248;;;:::o;34324:419::-;34490:4;34528:2;34517:9;34513:18;34505:26;;34577:9;34571:4;34567:20;34563:1;34552:9;34548:17;34541:47;34605:131;34731:4;34605:131;:::i;:::-;34597:139;;34495:248;;;:::o;34749:419::-;34915:4;34953:2;34942:9;34938:18;34930:26;;35002:9;34996:4;34992:20;34988:1;34977:9;34973:17;34966:47;35030:131;35156:4;35030:131;:::i;:::-;35022:139;;34920:248;;;:::o;35174:419::-;35340:4;35378:2;35367:9;35363:18;35355:26;;35427:9;35421:4;35417:20;35413:1;35402:9;35398:17;35391:47;35455:131;35581:4;35455:131;:::i;:::-;35447:139;;35345:248;;;:::o;35599:419::-;35765:4;35803:2;35792:9;35788:18;35780:26;;35852:9;35846:4;35842:20;35838:1;35827:9;35823:17;35816:47;35880:131;36006:4;35880:131;:::i;:::-;35872:139;;35770:248;;;:::o;36024:419::-;36190:4;36228:2;36217:9;36213:18;36205:26;;36277:9;36271:4;36267:20;36263:1;36252:9;36248:17;36241:47;36305:131;36431:4;36305:131;:::i;:::-;36297:139;;36195:248;;;:::o;36449:419::-;36615:4;36653:2;36642:9;36638:18;36630:26;;36702:9;36696:4;36692:20;36688:1;36677:9;36673:17;36666:47;36730:131;36856:4;36730:131;:::i;:::-;36722:139;;36620:248;;;:::o;36874:222::-;36967:4;37005:2;36994:9;36990:18;36982:26;;37018:71;37086:1;37075:9;37071:17;37062:6;37018:71;:::i;:::-;36972:124;;;;:::o;37102:129::-;37136:6;37163:20;;:::i;:::-;37153:30;;37192:33;37220:4;37212:6;37192:33;:::i;:::-;37143:88;;;:::o;37237:75::-;37270:6;37303:2;37297:9;37287:19;;37277:35;:::o;37318:307::-;37379:4;37469:18;37461:6;37458:30;37455:2;;;37491:18;;:::i;:::-;37455:2;37529:29;37551:6;37529:29;:::i;:::-;37521:37;;37613:4;37607;37603:15;37595:23;;37384:241;;;:::o;37631:98::-;37682:6;37716:5;37710:12;37700:22;;37689:40;;;:::o;37735:99::-;37787:6;37821:5;37815:12;37805:22;;37794:40;;;:::o;37840:168::-;37923:11;37957:6;37952:3;37945:19;37997:4;37992:3;37988:14;37973:29;;37935:73;;;;:::o;38014:169::-;38098:11;38132:6;38127:3;38120:19;38172:4;38167:3;38163:14;38148:29;;38110:73;;;;:::o;38189:148::-;38291:11;38328:3;38313:18;;38303:34;;;;:::o;38343:305::-;38383:3;38402:20;38420:1;38402:20;:::i;:::-;38397:25;;38436:20;38454:1;38436:20;:::i;:::-;38431:25;;38590:1;38522:66;38518:74;38515:1;38512:81;38509:2;;;38596:18;;:::i;:::-;38509:2;38640:1;38637;38633:9;38626:16;;38387:261;;;;:::o;38654:185::-;38694:1;38711:20;38729:1;38711:20;:::i;:::-;38706:25;;38745:20;38763:1;38745:20;:::i;:::-;38740:25;;38784:1;38774:2;;38789:18;;:::i;:::-;38774:2;38831:1;38828;38824:9;38819:14;;38696:143;;;;:::o;38845:348::-;38885:7;38908:20;38926:1;38908:20;:::i;:::-;38903:25;;38942:20;38960:1;38942:20;:::i;:::-;38937:25;;39130:1;39062:66;39058:74;39055:1;39052:81;39047:1;39040:9;39033:17;39029:105;39026:2;;;39137:18;;:::i;:::-;39026:2;39185:1;39182;39178:9;39167:20;;38893:300;;;;:::o;39199:191::-;39239:4;39259:20;39277:1;39259:20;:::i;:::-;39254:25;;39293:20;39311:1;39293:20;:::i;:::-;39288:25;;39332:1;39329;39326:8;39323:2;;;39337:18;;:::i;:::-;39323:2;39382:1;39379;39375:9;39367:17;;39244:146;;;;:::o;39396:96::-;39433:7;39462:24;39480:5;39462:24;:::i;:::-;39451:35;;39441:51;;;:::o;39498:90::-;39532:7;39575:5;39568:13;39561:21;39550:32;;39540:48;;;:::o;39594:149::-;39630:7;39670:66;39663:5;39659:78;39648:89;;39638:105;;;:::o;39749:126::-;39786:7;39826:42;39819:5;39815:54;39804:65;;39794:81;;;:::o;39881:77::-;39918:7;39947:5;39936:16;;39926:32;;;:::o;39964:154::-;40048:6;40043:3;40038;40025:30;40110:1;40101:6;40096:3;40092:16;40085:27;40015:103;;;:::o;40124:307::-;40192:1;40202:113;40216:6;40213:1;40210:13;40202:113;;;40301:1;40296:3;40292:11;40286:18;40282:1;40277:3;40273:11;40266:39;40238:2;40235:1;40231:10;40226:15;;40202:113;;;40333:6;40330:1;40327:13;40324:2;;;40413:1;40404:6;40399:3;40395:16;40388:27;40324:2;40173:258;;;;:::o;40437:320::-;40481:6;40518:1;40512:4;40508:12;40498:22;;40565:1;40559:4;40555:12;40586:18;40576:2;;40642:4;40634:6;40630:17;40620:27;;40576:2;40704;40696:6;40693:14;40673:18;40670:38;40667:2;;;40723:18;;:::i;:::-;40667:2;40488:269;;;;:::o;40763:281::-;40846:27;40868:4;40846:27;:::i;:::-;40838:6;40834:40;40976:6;40964:10;40961:22;40940:18;40928:10;40925:34;40922:62;40919:2;;;40987:18;;:::i;:::-;40919:2;41027:10;41023:2;41016:22;40806:238;;;:::o;41050:233::-;41089:3;41112:24;41130:5;41112:24;:::i;:::-;41103:33;;41158:66;41151:5;41148:77;41145:2;;;41228:18;;:::i;:::-;41145:2;41275:1;41268:5;41264:13;41257:20;;41093:190;;;:::o;41289:176::-;41321:1;41338:20;41356:1;41338:20;:::i;:::-;41333:25;;41372:20;41390:1;41372:20;:::i;:::-;41367:25;;41411:1;41401:2;;41416:18;;:::i;:::-;41401:2;41457:1;41454;41450:9;41445:14;;41323:142;;;;:::o;41471:180::-;41519:77;41516:1;41509:88;41616:4;41613:1;41606:15;41640:4;41637:1;41630:15;41657:180;41705:77;41702:1;41695:88;41802:4;41799:1;41792:15;41826:4;41823:1;41816:15;41843:180;41891:77;41888:1;41881:88;41988:4;41985:1;41978:15;42012:4;42009:1;42002:15;42029:180;42077:77;42074:1;42067:88;42174:4;42171:1;42164:15;42198:4;42195:1;42188:15;42215:102;42256:6;42307:2;42303:7;42298:2;42291:5;42287:14;42283:28;42273:38;;42263:54;;;:::o;42323:577::-;42463:66;42459:1;42451:6;42447:14;42440:90;42564:34;42559:2;42551:6;42547:15;42540:59;42633:34;42628:2;42620:6;42616:15;42609:59;42702:34;42697:2;42689:6;42685:15;42678:59;42772:66;42766:3;42758:6;42754:16;42747:92;42874:18;42868:3;42860:6;42856:16;42849:44;42429:471;:::o;42906:151::-;43046:3;43042:1;43034:6;43030:14;43023:27;43012:45;:::o;43063:230::-;43203:34;43199:1;43191:6;43187:14;43180:58;43272:13;43267:2;43259:6;43255:15;43248:38;43169:124;:::o;43299:237::-;43439:34;43435:1;43427:6;43423:14;43416:58;43508:20;43503:2;43495:6;43491:15;43484:45;43405:131;:::o;43542:225::-;43682:34;43678:1;43670:6;43666:14;43659:58;43751:8;43746:2;43738:6;43734:15;43727:33;43648:119;:::o;43773:178::-;43913:30;43909:1;43901:6;43897:14;43890:54;43879:72;:::o;43957:151::-;44097:3;44093:1;44085:6;44081:14;44074:27;44063:45;:::o;44114:164::-;44254:16;44250:1;44242:6;44238:14;44231:40;44220:58;:::o;44284:223::-;44424:34;44420:1;44412:6;44408:14;44401:58;44493:6;44488:2;44480:6;44476:15;44469:31;44390:117;:::o;44513:175::-;44653:27;44649:1;44641:6;44637:14;44630:51;44619:69;:::o;44694:181::-;44834:33;44830:1;44822:6;44818:14;44811:57;44800:75;:::o;44881:214::-;45021:66;45017:1;45009:6;45005:14;44998:90;44987:108;:::o;45101:231::-;45241:34;45237:1;45229:6;45225:14;45218:58;45310:14;45305:2;45297:6;45293:15;45286:39;45207:125;:::o;45338:243::-;45478:34;45474:1;45466:6;45462:14;45455:58;45547:26;45542:2;45534:6;45530:15;45523:51;45444:137;:::o;45587:229::-;45727:34;45723:1;45715:6;45711:14;45704:58;45796:12;45791:2;45783:6;45779:15;45772:37;45693:123;:::o;45822:228::-;45962:34;45958:1;45950:6;45946:14;45939:58;46031:11;46026:2;46018:6;46014:15;46007:36;45928:122;:::o;46056:214::-;46196:66;46192:1;46184:6;46180:14;46173:90;46162:108;:::o;46276:182::-;46416:34;46412:1;46404:6;46400:14;46393:58;46382:76;:::o;46464:231::-;46604:34;46600:1;46592:6;46588:14;46581:58;46673:14;46668:2;46660:6;46656:15;46649:39;46570:125;:::o;46701:182::-;46841:34;46837:1;46829:6;46825:14;46818:58;46807:76;:::o;46889:166::-;47029:18;47025:1;47017:6;47013:14;47006:42;46995:60;:::o;47061:228::-;47201:34;47197:1;47189:6;47185:14;47178:58;47270:11;47265:2;47257:6;47253:15;47246:36;47167:122;:::o;47295:151::-;47435:3;47431:1;47423:6;47419:14;47412:27;47401:45;:::o;47452:220::-;47592:34;47588:1;47580:6;47576:14;47569:58;47661:3;47656:2;47648:6;47644:15;47637:28;47558:114;:::o;47678:179::-;47818:31;47814:1;47806:6;47802:14;47795:55;47784:73;:::o;47863:236::-;48003:34;47999:1;47991:6;47987:14;47980:58;48072:19;48067:2;48059:6;48055:15;48048:44;47969:130;:::o;48105:151::-;48245:3;48241:1;48233:6;48229:14;48222:27;48211:45;:::o;48262:231::-;48402:34;48398:1;48390:6;48386:14;48379:58;48471:14;48466:2;48458:6;48454:15;48447:39;48368:125;:::o;48499:152::-;48639:4;48635:1;48627:6;48623:14;48616:28;48605:46;:::o;48657:181::-;48797:33;48793:1;48785:6;48781:14;48774:57;48763:75;:::o;48844:122::-;48917:24;48935:5;48917:24;:::i;:::-;48910:5;48907:35;48897:2;;48956:1;48953;48946:12;48897:2;48887:79;:::o;48972:116::-;49042:21;49057:5;49042:21;:::i;:::-;49035:5;49032:32;49022:2;;49078:1;49075;49068:12;49022:2;49012:76;:::o;49094:120::-;49166:23;49183:5;49166:23;:::i;:::-;49159:5;49156:34;49146:2;;49204:1;49201;49194:12;49146:2;49136:78;:::o;49220:122::-;49293:24;49311:5;49293:24;:::i;:::-;49286:5;49283:35;49273:2;;49332:1;49329;49322:12;49273:2;49263:79;:::o

Swarm Source

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