ETH Price: $2,643.24 (+1.40%)

Token

UltraRareMintPass (URMP)
 

Overview

Max Total Supply

308 URMP

Holders

270

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 URMP
0xc56b2e81ab1405a9e6cd94b860a5ba01889f6577
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:
URMintPass

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts-upgradeable/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMathUpgradeable {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/extends/Salable.sol

pragma solidity ^0.8.0;


// ,--. ,--.,--.  ,--.                 ,------.
// |  | |  ||  |,-'  '-.,--.--. ,--,--.|  .--. ' ,--,--.,--.--. ,---.
// |  | |  ||  |'-.  .-'|  .--'' ,-.  ||  '--'.'' ,-.  ||  .--'| .-. :
// '  '-'  '|  |  |  |  |  |   \ '-'  ||  |\  \ \ '-'  ||  |   \   --.
//  `-----' `--'  `--'  `--'    `--`--'`--' '--' `--`--'`--'    `----'
//
//Common functionality for whitelisting, presales and sales
abstract contract Salable is ERC721Enumerable, Ownable {

    uint256 public maxNFTCirculation;
    bool public isWhitelistSaleActive;
    bool public isPublicSaleActive;
    bool public isPreSaleActive;

    mapping(address => bool) public whitelist;

    modifier onlyWhenPublicSaleIsActive {
        require(isPublicSaleActive, "TCM: Public Sale Is Inactive");
        _;
    }

    modifier onlyWhenWhitelistSaleIsActive {
        require(isWhitelistSaleActive, "TCM: Whitelist Sale Is Inactive");
        _;
    }

    modifier onlyWhenPreSaleIsActive {
        require(isPreSaleActive, "TCM: Presale Is Inactive");
        _;
    }

    //Toggle states
    function setSaleActiveState(bool state) external onlyOwner {

        if (state == true) {
            require(isWhitelistSaleActive == false, "Whitelist sale must be inactive");
            require(isPreSaleActive == false, "Presale must be inactive");
        }
        isPublicSaleActive = state;
    }

    function setWhitelistSaleState(bool state) external onlyOwner {

        if (state == true) {
            require(isPublicSaleActive == false, "Public sale must be inactive");
            require(isPreSaleActive == false, "Presale must be inactive");
        }
        isWhitelistSaleActive = state;
    }

    function setPreSaleState(bool state) external onlyOwner {

        if (state == true) {
            require(isPublicSaleActive == false, "Public sale must be inactive");
            require(isWhitelistSaleActive == false, "Whitelist sale must be inactive");
        }
        isPreSaleActive = state;
    }
    //End Toggle states

    //Allow us to whitelist in bulk
    function addToWhitelistBulk(address[] memory addresses) external onlyOwner {
        for(uint i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    //Add an address to our whitelist
    function addToWhitelist(address newAdd) external onlyOwner {
        whitelist[newAdd] = true;
    }

    //Remove an address from our whitelist
    function removeFromWhitelist(address remove) external onlyOwner {
        whitelist[remove] = false;
    }

    //Allow the owner to mint a set of NFTs to airdrop
    function mintForAirdrop(uint256 numberToMint) external onlyOwner {
        require(totalSupply() + numberToMint <= maxNFTCirculation, "TCM: Cap exceeded");

        for (uint256 i = 0; i < numberToMint; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }


    //See whether an address is whitelisted
    function getWhitelistStatus(address lookupAddress) public view returns (bool) {
        return whitelist[lookupAddress];
    }
}


// File contracts/URMintPass.sol

pragma solidity ^0.8.0;




// ,--. ,--.,--.  ,--.                 ,------.
// |  | |  ||  |,-'  '-.,--.--. ,--,--.|  .--. ' ,--,--.,--.--. ,---.
// |  | |  ||  |'-.  .-'|  .--'' ,-.  ||  '--'.'' ,-.  ||  .--'| .-. :
// '  '-'  '|  |  |  |  |  |   \ '-'  ||  |\  \ \ '-'  ||  |   \   --.
// `-----'  `--'  `--'  `--'    `--`--'`--' '--' `--`--'`--'    `----'
//
// Ultra Rare Mint Pass - https://www.ultrarare.uk
contract URMintPass is ERC721, ERC721Enumerable, Ownable, Salable {

    using SafeMathUpgradeable for uint256;

    string public baseUri;
    uint256 public mintCost;

    address payable public urWallet;
    mapping(address => bool) public hasBought;


    constructor() ERC721("UltraRareMintPass", "URMP") {
        isPublicSaleActive = false;
        isWhitelistSaleActive = false;
        //0.13 Ethereum
        mintCost = 130000000000000000;
        maxNFTCirculation = 666;
    }

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

    function _burn(uint256 tokenId) internal virtual override(ERC721) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    //End overrides

    function _baseURI() internal view override returns (string memory) {
        return baseUri;
    }

    //Set this, will eventually land on the IPFS once all is complete
    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    //Withdraw to the UR defined wallet
    function withdraw() external onlyOwner {

        require(urWallet != address(0), "UR Empty");
        urWallet.transfer(address(this).balance);
    }

    //Allows one mint pass per wallet to be minted in the public sale
    function mintInPublic() external payable onlyWhenPublicSaleIsActive {
        require(totalSupply() + 1 <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost <= msg.value, "TCM: Incorrect Ether Value");
        require(hasBought[msg.sender] == false, "TCM: User may only buy one pass");

        hasBought[msg.sender] = true; //ensure user cannot purchase more than 1 mint pass
        _safeMint(msg.sender, totalSupply() + 1);
    }

    //Allows an NFT to be whitelisted in the whitelist sale
    function mintInWhitelist() external payable onlyWhenWhitelistSaleIsActive {
        require(totalSupply() + 1 <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost <= msg.value, "TCM: Incorrect Ether Value");
        require(whitelist[msg.sender] == true, "User not in whitelist");
        require(hasBought[msg.sender] == false, "TCM: User may only buy one pass");

        hasBought[msg.sender] = true;  //ensure user cannot purchase more than 1 mint pass
        whitelist[msg.sender] = false; //remove from the whitelist so this person can't buy again
        _safeMint(msg.sender, totalSupply() + 1);
    }

    //Sets our wallets to their initial values
    function setWallets(address payable _urWallet) external onlyOwner {
        urWallet = _urWallet;
    }
}

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":"newAdd","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelistBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lookupAddress","type":"address"}],"name":"getWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasBought","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTCirculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberToMint","type":"uint256"}],"name":"mintForAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintInPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintInWhitelist","outputs":[],"stateMutability":"payable","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":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"remove","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","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":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setSaleActiveState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_urWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelistSaleState","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":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"urWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601181526020017f556c747261526172654d696e74506173730000000000000000000000000000008152506040518060400160405280600481526020017f55524d5000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001f4565b508060019080519060200190620000af929190620001f4565b505050620000d2620000c66200012660201b60201c565b6200012e60201b60201c565b6000600c60016101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055506701cdda4faccd0000600f8190555061029a600b8190555062000309565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020290620002a4565b90600052602060002090601f01602090048101928262000226576000855562000272565b82601f106200024157805160ff191683800117855562000272565b8280016001018555821562000272579182015b828111156200027157825182559160200191906001019062000254565b5b50905062000281919062000285565b5090565b5b80821115620002a057600081600090555060010162000286565b5090565b60006002820490506001821680620002bd57607f821691505b60208210811415620002d457620002d3620002da565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61520380620003196000396000f3fe6080604052600436106102465760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063d9ba32fc1161007a578063d9ba32fc1461084c578063e43252d714610889578063e985e9c5146108b2578063eb50e70e146108ef578063f2fde38b14610918578063fa3cf9351461094157610246565b8063b88d4fde14610767578063b98451cf14610790578063bdb4b848146107bb578063c87b56dd146107e6578063cb689f431461082357610246565b80639d044ed3116100fd5780639d044ed3146106b7578063a0bcfc7f146106e2578063a22cb4651461070b578063a81c804e14610734578063ac8278491461075d57610246565b80638da5cb5b146105ce578063939b2c39146105f957806395d89b41146106245780639abc83201461064f5780639b19251a1461067a57610246565b80633ccfd60b116101c75780637046f3401161018b5780637046f3401461051e57806370a0823114610547578063715018a6146105845780637bfb748b1461059b5780638ab1d681146105a557610246565b80633ccfd60b1461042757806342842e0e1461043e5780634f6ccce71461046757806360068dd8146104a45780636352211e146104e157610246565b806318160ddd1161020e57806318160ddd146103425780631e84c4131461036d57806323b872dd146103985780632f745c59146103c15780633ca6fb8c146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630c4dc29c14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613cba565b61096c565b60405161027f91906142cf565b60405180910390f35b34801561029457600080fd5b5061029d6109e6565b6040516102aa91906142ea565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613d4d565b610a78565b6040516102e7919061424d565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613c14565b610afd565b005b34801561032557600080fd5b50610340600480360381019061033b9190613c91565b610c15565b005b34801561034e57600080fd5b50610357610d68565b604051610364919061468c565b60405180910390f35b34801561037957600080fd5b50610382610d75565b60405161038f91906142cf565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613b0e565b610d88565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613c14565b610de8565b6040516103f5919061468c565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613c91565b610e8d565b005b34801561043357600080fd5b5061043c610fe0565b005b34801561044a57600080fd5b5061046560048036038101906104609190613b0e565b611159565b005b34801561047357600080fd5b5061048e60048036038101906104899190613d4d565b611179565b60405161049b919061468c565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613a80565b611210565b6040516104d891906142cf565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613d4d565b611230565b604051610515919061424d565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190613c91565b6112e2565b005b34801561055357600080fd5b5061056e60048036038101906105699190613a80565b611435565b60405161057b919061468c565b60405180910390f35b34801561059057600080fd5b506105996114ed565b005b6105a3611575565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190613a80565b611856565b005b3480156105da57600080fd5b506105e361192d565b6040516105f0919061424d565b60405180910390f35b34801561060557600080fd5b5061060e611957565b60405161061b9190614268565b60405180910390f35b34801561063057600080fd5b5061063961197d565b60405161064691906142ea565b60405180910390f35b34801561065b57600080fd5b50610664611a0f565b60405161067191906142ea565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a80565b611a9d565b6040516106ae91906142cf565b60405180910390f35b3480156106c357600080fd5b506106cc611abd565b6040516106d991906142cf565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613d0c565b611ad0565b005b34801561071757600080fd5b50610732600480360381019061072d9190613bd8565b611b66565b005b34801561074057600080fd5b5061075b60048036038101906107569190613c50565b611ce7565b005b610765611e1e565b005b34801561077357600080fd5b5061078e60048036038101906107899190613b5d565b612014565b005b34801561079c57600080fd5b506107a5612076565b6040516107b291906142cf565b60405180910390f35b3480156107c757600080fd5b506107d0612089565b6040516107dd919061468c565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613d4d565b61208f565b60405161081a91906142ea565b60405180910390f35b34801561082f57600080fd5b5061084a60048036038101906108459190613d4d565b6120a1565b005b34801561085857600080fd5b50610873600480360381019061086e9190613a80565b6121b3565b60405161088091906142cf565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613a80565b612209565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613ad2565b6122e0565b6040516108e691906142cf565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613aa9565b612374565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613a80565b612434565b005b34801561094d57600080fd5b5061095661252c565b604051610963919061468c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109df57506109de82612532565b5b9050919050565b6060600080546109f590614920565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2190614920565b8015610a6e5780601f10610a4357610100808354040283529160200191610a6e565b820191906000526020600020905b815481529060010190602001808311610a5157829003601f168201915b5050505050905090565b6000610a83826125ac565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab99061456c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0882611230565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b709061462c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b98612618565b73ffffffffffffffffffffffffffffffffffffffff161480610bc75750610bc681610bc1612618565b6122e0565b5b610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd906144ec565b60405180910390fd5b610c108383612620565b505050565b610c1d612618565b73ffffffffffffffffffffffffffffffffffffffff16610c3b61192d565b73ffffffffffffffffffffffffffffffffffffffff1614610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906145ac565b60405180910390fd5b600115158115151415610d4b5760001515600c60019054906101000a900460ff16151514610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906144ac565b60405180910390fd5b60001515600c60029054906101000a900460ff16151514610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d419061458c565b60405180910390fd5b5b80600c60006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b600c60019054906101000a900460ff1681565b610d99610d93612618565b826126d9565b610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061464c565b60405180910390fd5b610de38383836127b7565b505050565b6000610df383611435565b8210610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061430c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e95612618565b73ffffffffffffffffffffffffffffffffffffffff16610eb361192d565b73ffffffffffffffffffffffffffffffffffffffff1614610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f00906145ac565b60405180910390fd5b600115158115151415610fc35760001515600c60019054906101000a900460ff16151514610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f63906144ac565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061432c565b60405180910390fd5b5b80600c60026101000a81548160ff02191690831515021790555050565b610fe8612618565b73ffffffffffffffffffffffffffffffffffffffff1661100661192d565b73ffffffffffffffffffffffffffffffffffffffff161461105c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611053906145ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e59061446c565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611156573d6000803e3d6000fd5b50565b61117483838360405180602001604052806000815250612014565b505050565b6000611183610d68565b82106111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb9061466c565b60405180910390fd5b600882815481106111fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60116020528060005260406000206000915054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d09061452c565b60405180910390fd5b80915050919050565b6112ea612618565b73ffffffffffffffffffffffffffffffffffffffff1661130861192d565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611355906145ac565b60405180910390fd5b6001151581151514156114185760001515600c60009054906101000a900460ff161515146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b89061432c565b60405180910390fd5b60001515600c60029054906101000a900460ff16151514611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061458c565b60405180910390fd5b5b80600c60016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061450c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114f5612618565b73ffffffffffffffffffffffffffffffffffffffff1661151361192d565b73ffffffffffffffffffffffffffffffffffffffff1614611569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611560906145ac565b60405180910390fd5b6115736000612a13565b565b600c60009054906101000a900460ff166115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb906143ac565b60405180910390fd5b600b5460016115d1610d68565b6115db919061479d565b111561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906144cc565b60405180910390fd5b34600f541115611661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116589061460c565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb906143ec565b60405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e9061440c565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611854336001611845610d68565b61184f919061479d565b612ad9565b565b61185e612618565b73ffffffffffffffffffffffffffffffffffffffff1661187c61192d565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c9906145ac565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461198c90614920565b80601f01602080910402602001604051908101604052809291908181526020018280546119b890614920565b8015611a055780601f106119da57610100808354040283529160200191611a05565b820191906000526020600020905b8154815290600101906020018083116119e857829003601f168201915b5050505050905090565b600e8054611a1c90614920565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4890614920565b8015611a955780601f10611a6a57610100808354040283529160200191611a95565b820191906000526020600020905b815481529060010190602001808311611a7857829003601f168201915b505050505081565b600d6020528060005260406000206000915054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b611ad8612618565b73ffffffffffffffffffffffffffffffffffffffff16611af661192d565b73ffffffffffffffffffffffffffffffffffffffff1614611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b43906145ac565b60405180910390fd5b80600e9080519060200190611b629291906137f9565b5050565b611b6e612618565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd39061444c565b60405180910390fd5b8060056000611be9612618565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c96612618565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cdb91906142cf565b60405180910390a35050565b611cef612618565b73ffffffffffffffffffffffffffffffffffffffff16611d0d61192d565b73ffffffffffffffffffffffffffffffffffffffff1614611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a906145ac565b60405180910390fd5b60005b8151811015611e1a576001600d6000848481518110611dae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e1290614983565b915050611d66565b5050565b600c60019054906101000a900460ff16611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e64906143cc565b60405180910390fd5b600b546001611e7a610d68565b611e84919061479d565b1115611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906144cc565b60405180910390fd5b34600f541115611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f019061460c565b60405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f949061440c565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612012336001612003610d68565b61200d919061479d565b612ad9565b565b61202561201f612618565b836126d9565b612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b9061464c565b60405180910390fd5b61207084848484612af7565b50505050565b600c60009054906101000a900460ff1681565b600f5481565b606061209a82612b53565b9050919050565b6120a9612618565b73ffffffffffffffffffffffffffffffffffffffff166120c761192d565b73ffffffffffffffffffffffffffffffffffffffff161461211d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612114906145ac565b60405180910390fd5b600b5481612129610d68565b612133919061479d565b1115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b906144cc565b60405180910390fd5b60005b818110156121af5761219c33600161218d610d68565b612197919061479d565b612ad9565b80806121a790614983565b915050612177565b5050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612211612618565b73ffffffffffffffffffffffffffffffffffffffff1661222f61192d565b73ffffffffffffffffffffffffffffffffffffffff1614612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c906145ac565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61237c612618565b73ffffffffffffffffffffffffffffffffffffffff1661239a61192d565b73ffffffffffffffffffffffffffffffffffffffff16146123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e7906145ac565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61243c612618565b73ffffffffffffffffffffffffffffffffffffffff1661245a61192d565b73ffffffffffffffffffffffffffffffffffffffff16146124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a7906145ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612520576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125179061436c565b60405180910390fd5b61252981612a13565b50565b600b5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a557506125a482612bfa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269383611230565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126e4826125ac565b612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a9061448c565b60405180910390fd5b600061272e83611230565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061279d57508373ffffffffffffffffffffffffffffffffffffffff1661278584610a78565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ae57506127ad81856122e0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127d782611230565b73ffffffffffffffffffffffffffffffffffffffff161461282d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612824906145cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128949061442c565b60405180910390fd5b6128a8838383612cdc565b6128b3600082612620565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129039190614824565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461295a919061479d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612af3828260405180602001604052806000815250612cec565b5050565b612b028484846127b7565b612b0e84848484612d47565b612b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b449061434c565b60405180910390fd5b50505050565b6060612b5e826125ac565b612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b94906145ec565b60405180910390fd5b6000612ba7612ede565b90506000815111612bc75760405180602001604052806000815250612bf2565b80612bd184612f70565b604051602001612be2929190614229565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cd55750612cd48261311d565b5b9050919050565b612ce7838383613187565b505050565b612cf6838361329b565b612d036000848484612d47565b612d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d399061434c565b60405180910390fd5b505050565b6000612d688473ffffffffffffffffffffffffffffffffffffffff16613469565b15612ed1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d91612618565b8786866040518563ffffffff1660e01b8152600401612db39493929190614283565b602060405180830381600087803b158015612dcd57600080fd5b505af1925050508015612dfe57506040513d601f19601f82011682018060405250810190612dfb9190613ce3565b60015b612e81573d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b50600081511415612e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e709061434c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ed6565b600190505b949350505050565b6060600e8054612eed90614920565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1990614920565b8015612f665780601f10612f3b57610100808354040283529160200191612f66565b820191906000526020600020905b815481529060010190602001808311612f4957829003601f168201915b5050505050905090565b60606000821415612fb8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613118565b600082905060005b60008214612fea578080612fd390614983565b915050600a82612fe391906147f3565b9150612fc0565b60008167ffffffffffffffff81111561302c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561305e5781602001600182028036833780820191505090505b5090505b60008514613111576001826130779190614824565b9150600a8561308691906149cc565b6030613092919061479d565b60f81b8183815181106130ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561310a91906147f3565b9450613062565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61319283838361347c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131d5576131d081613481565b613214565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132135761321283826134ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132575761325281613637565b613296565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461329557613294828261377a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561330b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133029061454c565b60405180910390fd5b613314816125ac565b15613354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334b9061438c565b60405180910390fd5b61336060008383612cdc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133b0919061479d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134d784611435565b6134e19190614824565b90506000600760008481526020019081526020016000205490508181146135c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061364b9190614824565b90506000600960008481526020019081526020016000205490506000600883815481106136a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106136e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061375e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061378583611435565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461380590614920565b90600052602060002090601f016020900481019282613827576000855561386e565b82601f1061384057805160ff191683800117855561386e565b8280016001018555821561386e579182015b8281111561386d578251825591602001919060010190613852565b5b50905061387b919061387f565b5090565b5b80821115613898576000816000905550600101613880565b5090565b60006138af6138aa846146cc565b6146a7565b905080838252602082019050828560208602820111156138ce57600080fd5b60005b858110156138fe57816138e48882613984565b8452602084019350602083019250506001810190506138d1565b5050509392505050565b600061391b613916846146f8565b6146a7565b90508281526020810184848401111561393357600080fd5b61393e8482856148de565b509392505050565b600061395961395484614729565b6146a7565b90508281526020810184848401111561397157600080fd5b61397c8482856148de565b509392505050565b6000813590506139938161515a565b92915050565b6000813590506139a881615171565b92915050565b600082601f8301126139bf57600080fd5b81356139cf84826020860161389c565b91505092915050565b6000813590506139e781615188565b92915050565b6000813590506139fc8161519f565b92915050565b600081519050613a118161519f565b92915050565b600082601f830112613a2857600080fd5b8135613a38848260208601613908565b91505092915050565b600082601f830112613a5257600080fd5b8135613a62848260208601613946565b91505092915050565b600081359050613a7a816151b6565b92915050565b600060208284031215613a9257600080fd5b6000613aa084828501613984565b91505092915050565b600060208284031215613abb57600080fd5b6000613ac984828501613999565b91505092915050565b60008060408385031215613ae557600080fd5b6000613af385828601613984565b9250506020613b0485828601613984565b9150509250929050565b600080600060608486031215613b2357600080fd5b6000613b3186828701613984565b9350506020613b4286828701613984565b9250506040613b5386828701613a6b565b9150509250925092565b60008060008060808587031215613b7357600080fd5b6000613b8187828801613984565b9450506020613b9287828801613984565b9350506040613ba387828801613a6b565b925050606085013567ffffffffffffffff811115613bc057600080fd5b613bcc87828801613a17565b91505092959194509250565b60008060408385031215613beb57600080fd5b6000613bf985828601613984565b9250506020613c0a858286016139d8565b9150509250929050565b60008060408385031215613c2757600080fd5b6000613c3585828601613984565b9250506020613c4685828601613a6b565b9150509250929050565b600060208284031215613c6257600080fd5b600082013567ffffffffffffffff811115613c7c57600080fd5b613c88848285016139ae565b91505092915050565b600060208284031215613ca357600080fd5b6000613cb1848285016139d8565b91505092915050565b600060208284031215613ccc57600080fd5b6000613cda848285016139ed565b91505092915050565b600060208284031215613cf557600080fd5b6000613d0384828501613a02565b91505092915050565b600060208284031215613d1e57600080fd5b600082013567ffffffffffffffff811115613d3857600080fd5b613d4484828501613a41565b91505092915050565b600060208284031215613d5f57600080fd5b6000613d6d84828501613a6b565b91505092915050565b613d7f8161486a565b82525050565b613d8e81614858565b82525050565b613d9d8161487c565b82525050565b6000613dae8261475a565b613db88185614770565b9350613dc88185602086016148ed565b613dd181614ab9565b840191505092915050565b6000613de782614765565b613df18185614781565b9350613e018185602086016148ed565b613e0a81614ab9565b840191505092915050565b6000613e2082614765565b613e2a8185614792565b9350613e3a8185602086016148ed565b80840191505092915050565b6000613e53602b83614781565b9150613e5e82614aca565b604082019050919050565b6000613e76601f83614781565b9150613e8182614b19565b602082019050919050565b6000613e99603283614781565b9150613ea482614b42565b604082019050919050565b6000613ebc602683614781565b9150613ec782614b91565b604082019050919050565b6000613edf601c83614781565b9150613eea82614be0565b602082019050919050565b6000613f02601f83614781565b9150613f0d82614c09565b602082019050919050565b6000613f25601c83614781565b9150613f3082614c32565b602082019050919050565b6000613f48601583614781565b9150613f5382614c5b565b602082019050919050565b6000613f6b601f83614781565b9150613f7682614c84565b602082019050919050565b6000613f8e602483614781565b9150613f9982614cad565b604082019050919050565b6000613fb1601983614781565b9150613fbc82614cfc565b602082019050919050565b6000613fd4600883614781565b9150613fdf82614d25565b602082019050919050565b6000613ff7602c83614781565b915061400282614d4e565b604082019050919050565b600061401a601c83614781565b915061402582614d9d565b602082019050919050565b600061403d601183614781565b915061404882614dc6565b602082019050919050565b6000614060603883614781565b915061406b82614def565b604082019050919050565b6000614083602a83614781565b915061408e82614e3e565b604082019050919050565b60006140a6602983614781565b91506140b182614e8d565b604082019050919050565b60006140c9602083614781565b91506140d482614edc565b602082019050919050565b60006140ec602c83614781565b91506140f782614f05565b604082019050919050565b600061410f601883614781565b915061411a82614f54565b602082019050919050565b6000614132602083614781565b915061413d82614f7d565b602082019050919050565b6000614155602983614781565b915061416082614fa6565b604082019050919050565b6000614178602f83614781565b915061418382614ff5565b604082019050919050565b600061419b601a83614781565b91506141a682615044565b602082019050919050565b60006141be602183614781565b91506141c98261506d565b604082019050919050565b60006141e1603183614781565b91506141ec826150bc565b604082019050919050565b6000614204602c83614781565b915061420f8261510b565b604082019050919050565b614223816148d4565b82525050565b60006142358285613e15565b91506142418284613e15565b91508190509392505050565b60006020820190506142626000830184613d85565b92915050565b600060208201905061427d6000830184613d76565b92915050565b60006080820190506142986000830187613d85565b6142a56020830186613d85565b6142b2604083018561421a565b81810360608301526142c48184613da3565b905095945050505050565b60006020820190506142e46000830184613d94565b92915050565b600060208201905081810360008301526143048184613ddc565b905092915050565b6000602082019050818103600083015261432581613e46565b9050919050565b6000602082019050818103600083015261434581613e69565b9050919050565b6000602082019050818103600083015261436581613e8c565b9050919050565b6000602082019050818103600083015261438581613eaf565b9050919050565b600060208201905081810360008301526143a581613ed2565b9050919050565b600060208201905081810360008301526143c581613ef5565b9050919050565b600060208201905081810360008301526143e581613f18565b9050919050565b6000602082019050818103600083015261440581613f3b565b9050919050565b6000602082019050818103600083015261442581613f5e565b9050919050565b6000602082019050818103600083015261444581613f81565b9050919050565b6000602082019050818103600083015261446581613fa4565b9050919050565b6000602082019050818103600083015261448581613fc7565b9050919050565b600060208201905081810360008301526144a581613fea565b9050919050565b600060208201905081810360008301526144c58161400d565b9050919050565b600060208201905081810360008301526144e581614030565b9050919050565b6000602082019050818103600083015261450581614053565b9050919050565b6000602082019050818103600083015261452581614076565b9050919050565b6000602082019050818103600083015261454581614099565b9050919050565b60006020820190508181036000830152614565816140bc565b9050919050565b60006020820190508181036000830152614585816140df565b9050919050565b600060208201905081810360008301526145a581614102565b9050919050565b600060208201905081810360008301526145c581614125565b9050919050565b600060208201905081810360008301526145e581614148565b9050919050565b600060208201905081810360008301526146058161416b565b9050919050565b600060208201905081810360008301526146258161418e565b9050919050565b60006020820190508181036000830152614645816141b1565b9050919050565b60006020820190508181036000830152614665816141d4565b9050919050565b60006020820190508181036000830152614685816141f7565b9050919050565b60006020820190506146a1600083018461421a565b92915050565b60006146b16146c2565b90506146bd8282614952565b919050565b6000604051905090565b600067ffffffffffffffff8211156146e7576146e6614a8a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561471357614712614a8a565b5b61471c82614ab9565b9050602081019050919050565b600067ffffffffffffffff82111561474457614743614a8a565b5b61474d82614ab9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147a8826148d4565b91506147b3836148d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147e8576147e76149fd565b5b828201905092915050565b60006147fe826148d4565b9150614809836148d4565b92508261481957614818614a2c565b5b828204905092915050565b600061482f826148d4565b915061483a836148d4565b92508282101561484d5761484c6149fd565b5b828203905092915050565b6000614863826148b4565b9050919050565b6000614875826148b4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561490b5780820151818401526020810190506148f0565b8381111561491a576000848401525b50505050565b6000600282049050600182168061493857607f821691505b6020821081141561494c5761494b614a5b565b5b50919050565b61495b82614ab9565b810181811067ffffffffffffffff8211171561497a57614979614a8a565b5b80604052505050565b600061498e826148d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c1576149c06149fd565b5b600182019050919050565b60006149d7826148d4565b91506149e2836148d4565b9250826149f2576149f1614a2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f57686974656c6973742073616c65206d75737420626520696e61637469766500600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54434d3a2057686974656c6973742053616c6520497320496e61637469766500600082015250565b7f54434d3a205075626c69632053616c6520497320496e61637469766500000000600082015250565b7f55736572206e6f7420696e2077686974656c6973740000000000000000000000600082015250565b7f54434d3a2055736572206d6179206f6e6c7920627579206f6e65207061737300600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f555220456d707479000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206d75737420626520696e61637469766500000000600082015250565b7f54434d3a20436170206578636565646564000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726573616c65206d75737420626520696e6163746976650000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54434d3a20496e636f72726563742045746865722056616c7565000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61516381614858565b811461516e57600080fd5b50565b61517a8161486a565b811461518557600080fd5b50565b6151918161487c565b811461519c57600080fd5b50565b6151a881614888565b81146151b357600080fd5b50565b6151bf816148d4565b81146151ca57600080fd5b5056fea2646970667358221220666d85e7f3c58b264cd6c26c801ec00594264699612e882d233ee48755d198c364736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063d9ba32fc1161007a578063d9ba32fc1461084c578063e43252d714610889578063e985e9c5146108b2578063eb50e70e146108ef578063f2fde38b14610918578063fa3cf9351461094157610246565b8063b88d4fde14610767578063b98451cf14610790578063bdb4b848146107bb578063c87b56dd146107e6578063cb689f431461082357610246565b80639d044ed3116100fd5780639d044ed3146106b7578063a0bcfc7f146106e2578063a22cb4651461070b578063a81c804e14610734578063ac8278491461075d57610246565b80638da5cb5b146105ce578063939b2c39146105f957806395d89b41146106245780639abc83201461064f5780639b19251a1461067a57610246565b80633ccfd60b116101c75780637046f3401161018b5780637046f3401461051e57806370a0823114610547578063715018a6146105845780637bfb748b1461059b5780638ab1d681146105a557610246565b80633ccfd60b1461042757806342842e0e1461043e5780634f6ccce71461046757806360068dd8146104a45780636352211e146104e157610246565b806318160ddd1161020e57806318160ddd146103425780631e84c4131461036d57806323b872dd146103985780632f745c59146103c15780633ca6fb8c146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630c4dc29c14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613cba565b61096c565b60405161027f91906142cf565b60405180910390f35b34801561029457600080fd5b5061029d6109e6565b6040516102aa91906142ea565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613d4d565b610a78565b6040516102e7919061424d565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613c14565b610afd565b005b34801561032557600080fd5b50610340600480360381019061033b9190613c91565b610c15565b005b34801561034e57600080fd5b50610357610d68565b604051610364919061468c565b60405180910390f35b34801561037957600080fd5b50610382610d75565b60405161038f91906142cf565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613b0e565b610d88565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613c14565b610de8565b6040516103f5919061468c565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613c91565b610e8d565b005b34801561043357600080fd5b5061043c610fe0565b005b34801561044a57600080fd5b5061046560048036038101906104609190613b0e565b611159565b005b34801561047357600080fd5b5061048e60048036038101906104899190613d4d565b611179565b60405161049b919061468c565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613a80565b611210565b6040516104d891906142cf565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613d4d565b611230565b604051610515919061424d565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190613c91565b6112e2565b005b34801561055357600080fd5b5061056e60048036038101906105699190613a80565b611435565b60405161057b919061468c565b60405180910390f35b34801561059057600080fd5b506105996114ed565b005b6105a3611575565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190613a80565b611856565b005b3480156105da57600080fd5b506105e361192d565b6040516105f0919061424d565b60405180910390f35b34801561060557600080fd5b5061060e611957565b60405161061b9190614268565b60405180910390f35b34801561063057600080fd5b5061063961197d565b60405161064691906142ea565b60405180910390f35b34801561065b57600080fd5b50610664611a0f565b60405161067191906142ea565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a80565b611a9d565b6040516106ae91906142cf565b60405180910390f35b3480156106c357600080fd5b506106cc611abd565b6040516106d991906142cf565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613d0c565b611ad0565b005b34801561071757600080fd5b50610732600480360381019061072d9190613bd8565b611b66565b005b34801561074057600080fd5b5061075b60048036038101906107569190613c50565b611ce7565b005b610765611e1e565b005b34801561077357600080fd5b5061078e60048036038101906107899190613b5d565b612014565b005b34801561079c57600080fd5b506107a5612076565b6040516107b291906142cf565b60405180910390f35b3480156107c757600080fd5b506107d0612089565b6040516107dd919061468c565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613d4d565b61208f565b60405161081a91906142ea565b60405180910390f35b34801561082f57600080fd5b5061084a60048036038101906108459190613d4d565b6120a1565b005b34801561085857600080fd5b50610873600480360381019061086e9190613a80565b6121b3565b60405161088091906142cf565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613a80565b612209565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613ad2565b6122e0565b6040516108e691906142cf565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613aa9565b612374565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613a80565b612434565b005b34801561094d57600080fd5b5061095661252c565b604051610963919061468c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109df57506109de82612532565b5b9050919050565b6060600080546109f590614920565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2190614920565b8015610a6e5780601f10610a4357610100808354040283529160200191610a6e565b820191906000526020600020905b815481529060010190602001808311610a5157829003601f168201915b5050505050905090565b6000610a83826125ac565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab99061456c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0882611230565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b709061462c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b98612618565b73ffffffffffffffffffffffffffffffffffffffff161480610bc75750610bc681610bc1612618565b6122e0565b5b610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd906144ec565b60405180910390fd5b610c108383612620565b505050565b610c1d612618565b73ffffffffffffffffffffffffffffffffffffffff16610c3b61192d565b73ffffffffffffffffffffffffffffffffffffffff1614610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906145ac565b60405180910390fd5b600115158115151415610d4b5760001515600c60019054906101000a900460ff16151514610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906144ac565b60405180910390fd5b60001515600c60029054906101000a900460ff16151514610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d419061458c565b60405180910390fd5b5b80600c60006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b600c60019054906101000a900460ff1681565b610d99610d93612618565b826126d9565b610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061464c565b60405180910390fd5b610de38383836127b7565b505050565b6000610df383611435565b8210610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061430c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e95612618565b73ffffffffffffffffffffffffffffffffffffffff16610eb361192d565b73ffffffffffffffffffffffffffffffffffffffff1614610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f00906145ac565b60405180910390fd5b600115158115151415610fc35760001515600c60019054906101000a900460ff16151514610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f63906144ac565b60405180910390fd5b60001515600c60009054906101000a900460ff16151514610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061432c565b60405180910390fd5b5b80600c60026101000a81548160ff02191690831515021790555050565b610fe8612618565b73ffffffffffffffffffffffffffffffffffffffff1661100661192d565b73ffffffffffffffffffffffffffffffffffffffff161461105c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611053906145ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e59061446c565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611156573d6000803e3d6000fd5b50565b61117483838360405180602001604052806000815250612014565b505050565b6000611183610d68565b82106111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb9061466c565b60405180910390fd5b600882815481106111fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60116020528060005260406000206000915054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d09061452c565b60405180910390fd5b80915050919050565b6112ea612618565b73ffffffffffffffffffffffffffffffffffffffff1661130861192d565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611355906145ac565b60405180910390fd5b6001151581151514156114185760001515600c60009054906101000a900460ff161515146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b89061432c565b60405180910390fd5b60001515600c60029054906101000a900460ff16151514611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061458c565b60405180910390fd5b5b80600c60016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061450c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114f5612618565b73ffffffffffffffffffffffffffffffffffffffff1661151361192d565b73ffffffffffffffffffffffffffffffffffffffff1614611569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611560906145ac565b60405180910390fd5b6115736000612a13565b565b600c60009054906101000a900460ff166115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb906143ac565b60405180910390fd5b600b5460016115d1610d68565b6115db919061479d565b111561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906144cc565b60405180910390fd5b34600f541115611661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116589061460c565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb906143ec565b60405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e9061440c565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611854336001611845610d68565b61184f919061479d565b612ad9565b565b61185e612618565b73ffffffffffffffffffffffffffffffffffffffff1661187c61192d565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c9906145ac565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461198c90614920565b80601f01602080910402602001604051908101604052809291908181526020018280546119b890614920565b8015611a055780601f106119da57610100808354040283529160200191611a05565b820191906000526020600020905b8154815290600101906020018083116119e857829003601f168201915b5050505050905090565b600e8054611a1c90614920565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4890614920565b8015611a955780601f10611a6a57610100808354040283529160200191611a95565b820191906000526020600020905b815481529060010190602001808311611a7857829003601f168201915b505050505081565b600d6020528060005260406000206000915054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b611ad8612618565b73ffffffffffffffffffffffffffffffffffffffff16611af661192d565b73ffffffffffffffffffffffffffffffffffffffff1614611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b43906145ac565b60405180910390fd5b80600e9080519060200190611b629291906137f9565b5050565b611b6e612618565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd39061444c565b60405180910390fd5b8060056000611be9612618565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c96612618565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cdb91906142cf565b60405180910390a35050565b611cef612618565b73ffffffffffffffffffffffffffffffffffffffff16611d0d61192d565b73ffffffffffffffffffffffffffffffffffffffff1614611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a906145ac565b60405180910390fd5b60005b8151811015611e1a576001600d6000848481518110611dae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e1290614983565b915050611d66565b5050565b600c60019054906101000a900460ff16611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e64906143cc565b60405180910390fd5b600b546001611e7a610d68565b611e84919061479d565b1115611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906144cc565b60405180910390fd5b34600f541115611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f019061460c565b60405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f949061440c565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612012336001612003610d68565b61200d919061479d565b612ad9565b565b61202561201f612618565b836126d9565b612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b9061464c565b60405180910390fd5b61207084848484612af7565b50505050565b600c60009054906101000a900460ff1681565b600f5481565b606061209a82612b53565b9050919050565b6120a9612618565b73ffffffffffffffffffffffffffffffffffffffff166120c761192d565b73ffffffffffffffffffffffffffffffffffffffff161461211d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612114906145ac565b60405180910390fd5b600b5481612129610d68565b612133919061479d565b1115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b906144cc565b60405180910390fd5b60005b818110156121af5761219c33600161218d610d68565b612197919061479d565b612ad9565b80806121a790614983565b915050612177565b5050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612211612618565b73ffffffffffffffffffffffffffffffffffffffff1661222f61192d565b73ffffffffffffffffffffffffffffffffffffffff1614612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c906145ac565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61237c612618565b73ffffffffffffffffffffffffffffffffffffffff1661239a61192d565b73ffffffffffffffffffffffffffffffffffffffff16146123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e7906145ac565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61243c612618565b73ffffffffffffffffffffffffffffffffffffffff1661245a61192d565b73ffffffffffffffffffffffffffffffffffffffff16146124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a7906145ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612520576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125179061436c565b60405180910390fd5b61252981612a13565b50565b600b5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a557506125a482612bfa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269383611230565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126e4826125ac565b612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a9061448c565b60405180910390fd5b600061272e83611230565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061279d57508373ffffffffffffffffffffffffffffffffffffffff1661278584610a78565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ae57506127ad81856122e0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127d782611230565b73ffffffffffffffffffffffffffffffffffffffff161461282d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612824906145cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128949061442c565b60405180910390fd5b6128a8838383612cdc565b6128b3600082612620565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129039190614824565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461295a919061479d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612af3828260405180602001604052806000815250612cec565b5050565b612b028484846127b7565b612b0e84848484612d47565b612b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b449061434c565b60405180910390fd5b50505050565b6060612b5e826125ac565b612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b94906145ec565b60405180910390fd5b6000612ba7612ede565b90506000815111612bc75760405180602001604052806000815250612bf2565b80612bd184612f70565b604051602001612be2929190614229565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cc557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cd55750612cd48261311d565b5b9050919050565b612ce7838383613187565b505050565b612cf6838361329b565b612d036000848484612d47565b612d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d399061434c565b60405180910390fd5b505050565b6000612d688473ffffffffffffffffffffffffffffffffffffffff16613469565b15612ed1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d91612618565b8786866040518563ffffffff1660e01b8152600401612db39493929190614283565b602060405180830381600087803b158015612dcd57600080fd5b505af1925050508015612dfe57506040513d601f19601f82011682018060405250810190612dfb9190613ce3565b60015b612e81573d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b50600081511415612e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e709061434c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ed6565b600190505b949350505050565b6060600e8054612eed90614920565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1990614920565b8015612f665780601f10612f3b57610100808354040283529160200191612f66565b820191906000526020600020905b815481529060010190602001808311612f4957829003601f168201915b5050505050905090565b60606000821415612fb8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613118565b600082905060005b60008214612fea578080612fd390614983565b915050600a82612fe391906147f3565b9150612fc0565b60008167ffffffffffffffff81111561302c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561305e5781602001600182028036833780820191505090505b5090505b60008514613111576001826130779190614824565b9150600a8561308691906149cc565b6030613092919061479d565b60f81b8183815181106130ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561310a91906147f3565b9450613062565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61319283838361347c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131d5576131d081613481565b613214565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132135761321283826134ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132575761325281613637565b613296565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461329557613294828261377a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561330b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133029061454c565b60405180910390fd5b613314816125ac565b15613354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334b9061438c565b60405180910390fd5b61336060008383612cdc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133b0919061479d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134d784611435565b6134e19190614824565b90506000600760008481526020019081526020016000205490508181146135c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061364b9190614824565b90506000600960008481526020019081526020016000205490506000600883815481106136a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106136e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061375e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061378583611435565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461380590614920565b90600052602060002090601f016020900481019282613827576000855561386e565b82601f1061384057805160ff191683800117855561386e565b8280016001018555821561386e579182015b8281111561386d578251825591602001919060010190613852565b5b50905061387b919061387f565b5090565b5b80821115613898576000816000905550600101613880565b5090565b60006138af6138aa846146cc565b6146a7565b905080838252602082019050828560208602820111156138ce57600080fd5b60005b858110156138fe57816138e48882613984565b8452602084019350602083019250506001810190506138d1565b5050509392505050565b600061391b613916846146f8565b6146a7565b90508281526020810184848401111561393357600080fd5b61393e8482856148de565b509392505050565b600061395961395484614729565b6146a7565b90508281526020810184848401111561397157600080fd5b61397c8482856148de565b509392505050565b6000813590506139938161515a565b92915050565b6000813590506139a881615171565b92915050565b600082601f8301126139bf57600080fd5b81356139cf84826020860161389c565b91505092915050565b6000813590506139e781615188565b92915050565b6000813590506139fc8161519f565b92915050565b600081519050613a118161519f565b92915050565b600082601f830112613a2857600080fd5b8135613a38848260208601613908565b91505092915050565b600082601f830112613a5257600080fd5b8135613a62848260208601613946565b91505092915050565b600081359050613a7a816151b6565b92915050565b600060208284031215613a9257600080fd5b6000613aa084828501613984565b91505092915050565b600060208284031215613abb57600080fd5b6000613ac984828501613999565b91505092915050565b60008060408385031215613ae557600080fd5b6000613af385828601613984565b9250506020613b0485828601613984565b9150509250929050565b600080600060608486031215613b2357600080fd5b6000613b3186828701613984565b9350506020613b4286828701613984565b9250506040613b5386828701613a6b565b9150509250925092565b60008060008060808587031215613b7357600080fd5b6000613b8187828801613984565b9450506020613b9287828801613984565b9350506040613ba387828801613a6b565b925050606085013567ffffffffffffffff811115613bc057600080fd5b613bcc87828801613a17565b91505092959194509250565b60008060408385031215613beb57600080fd5b6000613bf985828601613984565b9250506020613c0a858286016139d8565b9150509250929050565b60008060408385031215613c2757600080fd5b6000613c3585828601613984565b9250506020613c4685828601613a6b565b9150509250929050565b600060208284031215613c6257600080fd5b600082013567ffffffffffffffff811115613c7c57600080fd5b613c88848285016139ae565b91505092915050565b600060208284031215613ca357600080fd5b6000613cb1848285016139d8565b91505092915050565b600060208284031215613ccc57600080fd5b6000613cda848285016139ed565b91505092915050565b600060208284031215613cf557600080fd5b6000613d0384828501613a02565b91505092915050565b600060208284031215613d1e57600080fd5b600082013567ffffffffffffffff811115613d3857600080fd5b613d4484828501613a41565b91505092915050565b600060208284031215613d5f57600080fd5b6000613d6d84828501613a6b565b91505092915050565b613d7f8161486a565b82525050565b613d8e81614858565b82525050565b613d9d8161487c565b82525050565b6000613dae8261475a565b613db88185614770565b9350613dc88185602086016148ed565b613dd181614ab9565b840191505092915050565b6000613de782614765565b613df18185614781565b9350613e018185602086016148ed565b613e0a81614ab9565b840191505092915050565b6000613e2082614765565b613e2a8185614792565b9350613e3a8185602086016148ed565b80840191505092915050565b6000613e53602b83614781565b9150613e5e82614aca565b604082019050919050565b6000613e76601f83614781565b9150613e8182614b19565b602082019050919050565b6000613e99603283614781565b9150613ea482614b42565b604082019050919050565b6000613ebc602683614781565b9150613ec782614b91565b604082019050919050565b6000613edf601c83614781565b9150613eea82614be0565b602082019050919050565b6000613f02601f83614781565b9150613f0d82614c09565b602082019050919050565b6000613f25601c83614781565b9150613f3082614c32565b602082019050919050565b6000613f48601583614781565b9150613f5382614c5b565b602082019050919050565b6000613f6b601f83614781565b9150613f7682614c84565b602082019050919050565b6000613f8e602483614781565b9150613f9982614cad565b604082019050919050565b6000613fb1601983614781565b9150613fbc82614cfc565b602082019050919050565b6000613fd4600883614781565b9150613fdf82614d25565b602082019050919050565b6000613ff7602c83614781565b915061400282614d4e565b604082019050919050565b600061401a601c83614781565b915061402582614d9d565b602082019050919050565b600061403d601183614781565b915061404882614dc6565b602082019050919050565b6000614060603883614781565b915061406b82614def565b604082019050919050565b6000614083602a83614781565b915061408e82614e3e565b604082019050919050565b60006140a6602983614781565b91506140b182614e8d565b604082019050919050565b60006140c9602083614781565b91506140d482614edc565b602082019050919050565b60006140ec602c83614781565b91506140f782614f05565b604082019050919050565b600061410f601883614781565b915061411a82614f54565b602082019050919050565b6000614132602083614781565b915061413d82614f7d565b602082019050919050565b6000614155602983614781565b915061416082614fa6565b604082019050919050565b6000614178602f83614781565b915061418382614ff5565b604082019050919050565b600061419b601a83614781565b91506141a682615044565b602082019050919050565b60006141be602183614781565b91506141c98261506d565b604082019050919050565b60006141e1603183614781565b91506141ec826150bc565b604082019050919050565b6000614204602c83614781565b915061420f8261510b565b604082019050919050565b614223816148d4565b82525050565b60006142358285613e15565b91506142418284613e15565b91508190509392505050565b60006020820190506142626000830184613d85565b92915050565b600060208201905061427d6000830184613d76565b92915050565b60006080820190506142986000830187613d85565b6142a56020830186613d85565b6142b2604083018561421a565b81810360608301526142c48184613da3565b905095945050505050565b60006020820190506142e46000830184613d94565b92915050565b600060208201905081810360008301526143048184613ddc565b905092915050565b6000602082019050818103600083015261432581613e46565b9050919050565b6000602082019050818103600083015261434581613e69565b9050919050565b6000602082019050818103600083015261436581613e8c565b9050919050565b6000602082019050818103600083015261438581613eaf565b9050919050565b600060208201905081810360008301526143a581613ed2565b9050919050565b600060208201905081810360008301526143c581613ef5565b9050919050565b600060208201905081810360008301526143e581613f18565b9050919050565b6000602082019050818103600083015261440581613f3b565b9050919050565b6000602082019050818103600083015261442581613f5e565b9050919050565b6000602082019050818103600083015261444581613f81565b9050919050565b6000602082019050818103600083015261446581613fa4565b9050919050565b6000602082019050818103600083015261448581613fc7565b9050919050565b600060208201905081810360008301526144a581613fea565b9050919050565b600060208201905081810360008301526144c58161400d565b9050919050565b600060208201905081810360008301526144e581614030565b9050919050565b6000602082019050818103600083015261450581614053565b9050919050565b6000602082019050818103600083015261452581614076565b9050919050565b6000602082019050818103600083015261454581614099565b9050919050565b60006020820190508181036000830152614565816140bc565b9050919050565b60006020820190508181036000830152614585816140df565b9050919050565b600060208201905081810360008301526145a581614102565b9050919050565b600060208201905081810360008301526145c581614125565b9050919050565b600060208201905081810360008301526145e581614148565b9050919050565b600060208201905081810360008301526146058161416b565b9050919050565b600060208201905081810360008301526146258161418e565b9050919050565b60006020820190508181036000830152614645816141b1565b9050919050565b60006020820190508181036000830152614665816141d4565b9050919050565b60006020820190508181036000830152614685816141f7565b9050919050565b60006020820190506146a1600083018461421a565b92915050565b60006146b16146c2565b90506146bd8282614952565b919050565b6000604051905090565b600067ffffffffffffffff8211156146e7576146e6614a8a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561471357614712614a8a565b5b61471c82614ab9565b9050602081019050919050565b600067ffffffffffffffff82111561474457614743614a8a565b5b61474d82614ab9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147a8826148d4565b91506147b3836148d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147e8576147e76149fd565b5b828201905092915050565b60006147fe826148d4565b9150614809836148d4565b92508261481957614818614a2c565b5b828204905092915050565b600061482f826148d4565b915061483a836148d4565b92508282101561484d5761484c6149fd565b5b828203905092915050565b6000614863826148b4565b9050919050565b6000614875826148b4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561490b5780820151818401526020810190506148f0565b8381111561491a576000848401525b50505050565b6000600282049050600182168061493857607f821691505b6020821081141561494c5761494b614a5b565b5b50919050565b61495b82614ab9565b810181811067ffffffffffffffff8211171561497a57614979614a8a565b5b80604052505050565b600061498e826148d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c1576149c06149fd565b5b600182019050919050565b60006149d7826148d4565b91506149e2836148d4565b9250826149f2576149f1614a2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f57686974656c6973742073616c65206d75737420626520696e61637469766500600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54434d3a2057686974656c6973742053616c6520497320496e61637469766500600082015250565b7f54434d3a205075626c69632053616c6520497320496e61637469766500000000600082015250565b7f55736572206e6f7420696e2077686974656c6973740000000000000000000000600082015250565b7f54434d3a2055736572206d6179206f6e6c7920627579206f6e65207061737300600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f555220456d707479000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206d75737420626520696e61637469766500000000600082015250565b7f54434d3a20436170206578636565646564000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726573616c65206d75737420626520696e6163746976650000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54434d3a20496e636f72726563742045746865722056616c7565000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61516381614858565b811461516e57600080fd5b50565b61517a8161486a565b811461518557600080fd5b50565b6151918161487c565b811461519c57600080fd5b50565b6151a881614888565b81146151b357600080fd5b50565b6151bf816148d4565b81146151ca57600080fd5b5056fea2646970667358221220666d85e7f3c58b264cd6c26c801ec00594264699612e882d233ee48755d198c364736f6c63430008040033

Deployed Bytecode Sourcemap

53977:3145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54976:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21747:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23306:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22829:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51770:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35498:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50905:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24196:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35166:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52090:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55566:154;;;;;;;;;;;;;:::i;:::-;;24606:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35688:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54196:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21441:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51450:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21171:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49660:94;;;;;;;;;;;;;:::i;:::-;;56323:635;;;:::i;:::-;;52867:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49009:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54158:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21916:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54098:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50978:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50942:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55417:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23599:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52473:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55799:455;;;:::i;:::-;;24862:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50865:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54126:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54823:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53039:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53379:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52713:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23965:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57014:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49909:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50826:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54976:233;55087:4;55126:35;55111:50;;;:11;:50;;;;:90;;;;55165:36;55189:11;55165:23;:36::i;:::-;55111:90;55104:97;;54976:233;;;:::o;21747:100::-;21801:13;21834:5;21827:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:100;:::o;23306:221::-;23382:7;23410:16;23418:7;23410;:16::i;:::-;23402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23495:15;:24;23511:7;23495:24;;;;;;;;;;;;;;;;;;;;;23488:31;;23306:221;;;:::o;22829:411::-;22910:13;22926:23;22941:7;22926:14;:23::i;:::-;22910:39;;22974:5;22968:11;;:2;:11;;;;22960:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23068:5;23052:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23077:37;23094:5;23101:12;:10;:12::i;:::-;23077:16;:37::i;:::-;23052:62;23030:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23211:21;23220:2;23224:7;23211:8;:21::i;:::-;22829:411;;;:::o;51770:312::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51858:4:::1;51849:13;;:5;:13;;;51845:190;;;51909:5;51887:27;;:18;;;;;;;;;;;:27;;;51879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51989:5;51970:24;;:15;;;;;;;;;;;:24;;;51962:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51845:190;52069:5;52045:21;;:29;;;;;;;;;;;;;;;;;;51770:312:::0;:::o;35498:113::-;35559:7;35586:10;:17;;;;35579:24;;35498:113;:::o;50905:30::-;;;;;;;;;;;;;:::o;24196:339::-;24391:41;24410:12;:10;:12::i;:::-;24424:7;24391:18;:41::i;:::-;24383:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24499:28;24509:4;24515:2;24519:7;24499:9;:28::i;:::-;24196:339;;;:::o;35166:256::-;35263:7;35299:23;35316:5;35299:16;:23::i;:::-;35291:5;:31;35283:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35388:12;:19;35401:5;35388:19;;;;;;;;;;;;;;;:26;35408:5;35388:26;;;;;;;;;;;;35381:33;;35166:256;;;;:::o;52090:313::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52172:4:::1;52163:13;;:5;:13;;;52159:203;;;52223:5;52201:27;;:18;;;;;;;;;;;:27;;;52193:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52309:5;52284:30;;:21;;;;;;;;;;;:30;;;52276:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52159:203;52390:5;52372:15;;:23;;;;;;;;;;;;;;;;;;52090:313:::0;:::o;55566:154::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55646:1:::1;55626:22;;:8;;;;;;;;;;;:22;;;;55618:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;55672:8;;;;;;;;;;;:17;;:40;55690:21;55672:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55566:154::o:0;24606:185::-;24744:39;24761:4;24767:2;24771:7;24744:39;;;;;;;;;;;;:16;:39::i;:::-;24606:185;;;:::o;35688:233::-;35763:7;35799:30;:28;:30::i;:::-;35791:5;:38;35783:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35896:10;35907:5;35896:17;;;;;;;;;;;;;;;;;;;;;;;;35889:24;;35688:233;;;:::o;54196:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;21441:239::-;21513:7;21533:13;21549:7;:16;21557:7;21549:16;;;;;;;;;;;;;;;;;;;;;21533:32;;21601:1;21584:19;;:5;:19;;;;21576:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21667:5;21660:12;;;21441:239;;;:::o;51450:312::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51535:4:::1;51526:13;;:5;:13;;;51522:196;;;51589:5;51564:30;;:21;;;;;;;;;;;:30;;;51556:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51672:5;51653:24;;:15;;;;;;;;;;;:24;;;51645:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51522:196;51749:5;51728:18;;:26;;;;;;;;;;;;;;;;;;51450:312:::0;:::o;21171:208::-;21243:7;21288:1;21271:19;;:5;:19;;;;21263:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21355:9;:16;21365:5;21355:16;;;;;;;;;;;;;;;;21348:23;;21171:208;;;:::o;49660:94::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49725:21:::1;49743:1;49725:9;:21::i;:::-;49660:94::o:0;56323:635::-;51220:21;;;;;;;;;;;51212:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56437:17:::1;;56432:1;56416:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:38;;56408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56507:9;56495:8;;:21;;56487:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56591:4;56566:29;;:9;:21;56576:10;56566:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;56558:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56665:5;56640:30;;:9;:21;56650:10;56640:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;56632:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56743:4;56719:9;:21;56729:10;56719:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;56835:5;56811:9;:21;56821:10;56811:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56910:40;56920:10;56948:1;56932:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56910:9;:40::i;:::-;56323:635::o:0;52867:108::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52962:5:::1;52942:9;:17;52952:6;52942:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;52867:108:::0;:::o;49009:87::-;49055:7;49082:6;;;;;;;;;;;49075:13;;49009:87;:::o;54158:31::-;;;;;;;;;;;;;:::o;21916:104::-;21972:13;22005:7;21998:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21916:104;:::o;54098:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50978:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;50942:27::-;;;;;;;;;;;;;:::o;55417:100::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55501:8:::1;55491:7;:18;;;;;;;;;;;;:::i;:::-;;55417:100:::0;:::o;23599:295::-;23714:12;:10;:12::i;:::-;23702:24;;:8;:24;;;;23694:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23814:8;23769:18;:32;23788:12;:10;:12::i;:::-;23769:32;;;;;;;;;;;;;;;:42;23802:8;23769:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23867:8;23838:48;;23853:12;:10;:12::i;:::-;23838:48;;;23877:8;23838:48;;;;;;:::i;:::-;;;;;;;;23599:295;;:::o;52473:193::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52563:6:::1;52559:100;52579:9;:16;52575:1;:20;52559:100;;;52643:4;52617:9;:23;52627:9;52637:1;52627:12;;;;;;;;;;;;;;;;;;;;;;52617:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;52597:3;;;;;:::i;:::-;;;;52559:100;;;;52473:193:::0;:::o;55799:455::-;51083:18;;;;;;;;;;;51075:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55907:17:::1;;55902:1;55886:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:38;;55878:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55977:9;55965:8;;:21;;55957:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56061:5;56036:30;;:9;:21;56046:10;56036:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;56028:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56139:4;56115:9;:21;56125:10;56115:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;56206:40;56216:10;56244:1;56228:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56206:9;:40::i;:::-;55799:455::o:0;24862:328::-;25037:41;25056:12;:10;:12::i;:::-;25070:7;25037:18;:41::i;:::-;25029:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:39;25157:4;25163:2;25167:7;25176:5;25143:13;:39::i;:::-;24862:328;;;;:::o;50865:33::-;;;;;;;;;;;;;:::o;54126:23::-;;;;:::o;54823:145::-;54904:13;54937:23;54952:7;54937:14;:23::i;:::-;54930:30;;54823:145;;;:::o;53039:285::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53155:17:::1;;53139:12;53123:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:49;;53115:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53212:9;53207:110;53231:12;53227:1;:16;53207:110;;;53265:40;53275:10;53303:1;53287:13;:11;:13::i;:::-;:17;;;;:::i;:::-;53265:9;:40::i;:::-;53245:3;;;;;:::i;:::-;;;;53207:110;;;;53039:285:::0;:::o;53379:128::-;53451:4;53475:9;:24;53485:13;53475:24;;;;;;;;;;;;;;;;;;;;;;;;;53468:31;;53379:128;;;:::o;52713:102::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52803:4:::1;52783:9;:17;52793:6;52783:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;52713:102:::0;:::o;23965:164::-;24062:4;24086:18;:25;24105:5;24086:25;;;;;;;;;;;;;;;:35;24112:8;24086:35;;;;;;;;;;;;;;;;;;;;;;;;;24079:42;;23965:164;;;;:::o;57014:105::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57102:9:::1;57091:8;;:20;;;;;;;;;;;;;;;;;;57014:105:::0;:::o;49909:192::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50018:1:::1;49998:22;;:8;:22;;;;49990:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50074:19;50084:8;50074:9;:19::i;:::-;49909:192:::0;:::o;50826:32::-;;;;:::o;34858:224::-;34960:4;34999:35;34984:50;;;:11;:50;;;;:90;;;;35038:36;35062:11;35038:23;:36::i;:::-;34984:90;34977:97;;34858:224;;;:::o;26700:127::-;26765:4;26817:1;26789:30;;:7;:16;26797:7;26789:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26782:37;;26700:127;;;:::o;16204:98::-;16257:7;16284:10;16277:17;;16204:98;:::o;30682:174::-;30784:2;30757:15;:24;30773:7;30757:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30840:7;30836:2;30802:46;;30811:23;30826:7;30811:14;:23::i;:::-;30802:46;;;;;;;;;;;;30682:174;;:::o;26994:348::-;27087:4;27112:16;27120:7;27112;:16::i;:::-;27104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27188:13;27204:23;27219:7;27204:14;:23::i;:::-;27188:39;;27257:5;27246:16;;:7;:16;;;:51;;;;27290:7;27266:31;;:20;27278:7;27266:11;:20::i;:::-;:31;;;27246:51;:87;;;;27301:32;27318:5;27325:7;27301:16;:32::i;:::-;27246:87;27238:96;;;26994:348;;;;:::o;29986:578::-;30145:4;30118:31;;:23;30133:7;30118:14;:23::i;:::-;:31;;;30110:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:1;30214:16;;:2;:16;;;;30206:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30284:39;30305:4;30311:2;30315:7;30284:20;:39::i;:::-;30388:29;30405:1;30409:7;30388:8;:29::i;:::-;30449:1;30430:9;:15;30440:4;30430:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30478:1;30461:9;:13;30471:2;30461:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30509:2;30490:7;:16;30498:7;30490:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30548:7;30544:2;30529:27;;30538:4;30529:27;;;;;;;;;;;;29986:578;;;:::o;50109:173::-;50165:16;50184:6;;;;;;;;;;;50165:25;;50210:8;50201:6;;:17;;;;;;;;;;;;;;;;;;50265:8;50234:40;;50255:8;50234:40;;;;;;;;;;;;50109:173;;:::o;27684:110::-;27760:26;27770:2;27774:7;27760:26;;;;;;;;;;;;:9;:26::i;:::-;27684:110;;:::o;26072:315::-;26229:28;26239:4;26245:2;26249:7;26229:9;:28::i;:::-;26276:48;26299:4;26305:2;26309:7;26318:5;26276:22;:48::i;:::-;26268:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:315;;;;:::o;22091:334::-;22164:13;22198:16;22206:7;22198;:16::i;:::-;22190:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22279:21;22303:10;:8;:10::i;:::-;22279:34;;22355:1;22337:7;22331:21;:25;:86;;;;;;;;;;;;;;;;;22383:7;22392:18;:7;:16;:18::i;:::-;22366:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22331:86;22324:93;;;22091:334;;;:::o;20802:305::-;20904:4;20956:25;20941:40;;;:11;:40;;;;:105;;;;21013:33;20998:48;;;:11;:48;;;;20941:105;:158;;;;21063:36;21087:11;21063:23;:36::i;:::-;20941:158;20921:178;;20802:305;;;:::o;54513:189::-;54649:45;54676:4;54682:2;54686:7;54649:26;:45::i;:::-;54513:189;;;:::o;28021:321::-;28151:18;28157:2;28161:7;28151:5;:18::i;:::-;28202:54;28233:1;28237:2;28241:7;28250:5;28202:22;:54::i;:::-;28180:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:321;;;:::o;31421:799::-;31576:4;31597:15;:2;:13;;;:15::i;:::-;31593:620;;;31649:2;31633:36;;;31670:12;:10;:12::i;:::-;31684:4;31690:7;31699:5;31633:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31629:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31892:1;31875:6;:13;:18;31871:272;;;31918:60;;;;;;;;;;:::i;:::-;;;;;;;;31871:272;32093:6;32087:13;32078:6;32074:2;32070:15;32063:38;31629:529;31766:41;;;31756:51;;;:6;:51;;;;31749:58;;;;;31593:620;32197:4;32190:11;;31421:799;;;;;;;:::o;55238:100::-;55290:13;55323:7;55316:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55238:100;:::o;16737:723::-;16793:13;17023:1;17014:5;:10;17010:53;;;17041:10;;;;;;;;;;;;;;;;;;;;;17010:53;17073:12;17088:5;17073:20;;17104:14;17129:78;17144:1;17136:4;:9;17129:78;;17162:8;;;;;:::i;:::-;;;;17193:2;17185:10;;;;;:::i;:::-;;;17129:78;;;17217:19;17249:6;17239:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17217:39;;17267:154;17283:1;17274:5;:10;17267:154;;17311:1;17301:11;;;;;:::i;:::-;;;17378:2;17370:5;:10;;;;:::i;:::-;17357:2;:24;;;;:::i;:::-;17344:39;;17327:6;17334;17327:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17407:2;17398:11;;;;;:::i;:::-;;;17267:154;;;17445:6;17431:21;;;;;16737:723;;;;:::o;19300:157::-;19385:4;19424:25;19409:40;;;:11;:40;;;;19402:47;;19300:157;;;:::o;36534:589::-;36678:45;36705:4;36711:2;36715:7;36678:26;:45::i;:::-;36756:1;36740:18;;:4;:18;;;36736:187;;;36775:40;36807:7;36775:31;:40::i;:::-;36736:187;;;36845:2;36837:10;;:4;:10;;;36833:90;;36864:47;36897:4;36903:7;36864:32;:47::i;:::-;36833:90;36736:187;36951:1;36937:16;;:2;:16;;;36933:183;;;36970:45;37007:7;36970:36;:45::i;:::-;36933:183;;;37043:4;37037:10;;:2;:10;;;37033:83;;37064:40;37092:2;37096:7;37064:27;:40::i;:::-;37033:83;36933:183;36534:589;;;:::o;28678:382::-;28772:1;28758:16;;:2;:16;;;;28750:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:16;28839:7;28831;:16::i;:::-;28830:17;28822:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:45;28922:1;28926:2;28930:7;28893:20;:45::i;:::-;28968:1;28951:9;:13;28961:2;28951:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28999:2;28980:7;:16;28988:7;28980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29044:7;29040:2;29019:33;;29036:1;29019:33;;;;;;;;;;;;28678:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;32792:126::-;;;;:::o;37846:164::-;37950:10;:17;;;;37923:15;:24;37939:7;37923:24;;;;;;;;;;;:44;;;;37978:10;37994:7;37978:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:164;:::o;38637:988::-;38903:22;38953:1;38928:22;38945:4;38928:16;:22::i;:::-;:26;;;;:::i;:::-;38903:51;;38965:18;38986:17;:26;39004:7;38986:26;;;;;;;;;;;;38965:47;;39133:14;39119:10;:28;39115:328;;39164:19;39186:12;:18;39199:4;39186:18;;;;;;;;;;;;;;;:34;39205:14;39186:34;;;;;;;;;;;;39164:56;;39270:11;39237:12;:18;39250:4;39237:18;;;;;;;;;;;;;;;:30;39256:10;39237:30;;;;;;;;;;;:44;;;;39387:10;39354:17;:30;39372:11;39354:30;;;;;;;;;;;:43;;;;39115:328;;39539:17;:26;39557:7;39539:26;;;;;;;;;;;39532:33;;;39583:12;:18;39596:4;39583:18;;;;;;;;;;;;;;;:34;39602:14;39583:34;;;;;;;;;;;39576:41;;;38637:988;;;;:::o;39920:1079::-;40173:22;40218:1;40198:10;:17;;;;:21;;;;:::i;:::-;40173:46;;40230:18;40251:15;:24;40267:7;40251:24;;;;;;;;;;;;40230:45;;40602:19;40624:10;40635:14;40624:26;;;;;;;;;;;;;;;;;;;;;;;;40602:48;;40688:11;40663:10;40674;40663:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40799:10;40768:15;:28;40784:11;40768:28;;;;;;;;;;;:41;;;;40940:15;:24;40956:7;40940:24;;;;;;;;;;;40933:31;;;40975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39920:1079;;;;:::o;37424:221::-;37509:14;37526:20;37543:2;37526:16;:20::i;:::-;37509:37;;37584:7;37557:12;:16;37570:2;37557:16;;;;;;;;;;;;;;;:24;37574:6;37557:24;;;;;;;;;;;:34;;;;37631:6;37602:17;:26;37620:7;37602:26;;;;;;;;;;;:35;;;;37424:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1530:155::-;1584:5;1622:6;1609:20;1600:29;;1638:41;1673:5;1638:41;:::i;:::-;1590:95;;;;:::o;1708:303::-;1779:5;1828:3;1821:4;1813:6;1809:17;1805:27;1795:2;;1846:1;1843;1836:12;1795:2;1886:6;1873:20;1911:94;2001:3;1993:6;1986:4;1978:6;1974:17;1911:94;:::i;:::-;1902:103;;1785:226;;;;;:::o;2017:133::-;2060:5;2098:6;2085:20;2076:29;;2114:30;2138:5;2114:30;:::i;:::-;2066:84;;;;:::o;2156:137::-;2201:5;2239:6;2226:20;2217:29;;2255:32;2281:5;2255:32;:::i;:::-;2207:86;;;;:::o;2299:141::-;2355:5;2386:6;2380:13;2371:22;;2402:32;2428:5;2402:32;:::i;:::-;2361:79;;;;:::o;2459:271::-;2514:5;2563:3;2556:4;2548:6;2544:17;2540:27;2530:2;;2581:1;2578;2571:12;2530:2;2621:6;2608:20;2646:78;2720:3;2712:6;2705:4;2697:6;2693:17;2646:78;:::i;:::-;2637:87;;2520:210;;;;;:::o;2750:273::-;2806:5;2855:3;2848:4;2840:6;2836:17;2832:27;2822:2;;2873:1;2870;2863:12;2822:2;2913:6;2900:20;2938:79;3013:3;3005:6;2998:4;2990:6;2986:17;2938:79;:::i;:::-;2929:88;;2812:211;;;;;:::o;3029:139::-;3075:5;3113:6;3100:20;3091:29;;3129:33;3156:5;3129:33;:::i;:::-;3081:87;;;;:::o;3174:262::-;3233:6;3282:2;3270:9;3261:7;3257:23;3253:32;3250:2;;;3298:1;3295;3288:12;3250:2;3341:1;3366:53;3411:7;3402:6;3391:9;3387:22;3366:53;:::i;:::-;3356:63;;3312:117;3240:196;;;;:::o;3442:278::-;3509:6;3558:2;3546:9;3537:7;3533:23;3529:32;3526:2;;;3574:1;3571;3564:12;3526:2;3617:1;3642:61;3695:7;3686:6;3675:9;3671:22;3642:61;:::i;:::-;3632:71;;3588:125;3516:204;;;;:::o;3726:407::-;3794:6;3802;3851:2;3839:9;3830:7;3826:23;3822:32;3819:2;;;3867:1;3864;3857:12;3819:2;3910:1;3935:53;3980:7;3971:6;3960:9;3956:22;3935:53;:::i;:::-;3925:63;;3881:117;4037:2;4063:53;4108:7;4099:6;4088:9;4084:22;4063:53;:::i;:::-;4053:63;;4008:118;3809:324;;;;;:::o;4139:552::-;4216:6;4224;4232;4281:2;4269:9;4260:7;4256:23;4252:32;4249:2;;;4297:1;4294;4287:12;4249:2;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4467:2;4493:53;4538:7;4529:6;4518:9;4514:22;4493:53;:::i;:::-;4483:63;;4438:118;4595:2;4621:53;4666:7;4657:6;4646:9;4642:22;4621:53;:::i;:::-;4611:63;;4566:118;4239:452;;;;;:::o;4697:809::-;4792:6;4800;4808;4816;4865:3;4853:9;4844:7;4840:23;4836:33;4833:2;;;4882:1;4879;4872:12;4833:2;4925:1;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4896:117;5052:2;5078:53;5123:7;5114:6;5103:9;5099:22;5078:53;:::i;:::-;5068:63;;5023:118;5180:2;5206:53;5251:7;5242:6;5231:9;5227:22;5206:53;:::i;:::-;5196:63;;5151:118;5336:2;5325:9;5321:18;5308:32;5367:18;5359:6;5356:30;5353:2;;;5399:1;5396;5389:12;5353:2;5427:62;5481:7;5472:6;5461:9;5457:22;5427:62;:::i;:::-;5417:72;;5279:220;4823:683;;;;;;;:::o;5512:401::-;5577:6;5585;5634:2;5622:9;5613:7;5609:23;5605:32;5602:2;;;5650:1;5647;5640:12;5602:2;5693:1;5718:53;5763:7;5754:6;5743:9;5739:22;5718:53;:::i;:::-;5708:63;;5664:117;5820:2;5846:50;5888:7;5879:6;5868:9;5864:22;5846:50;:::i;:::-;5836:60;;5791:115;5592:321;;;;;:::o;5919:407::-;5987:6;5995;6044:2;6032:9;6023:7;6019:23;6015:32;6012:2;;;6060:1;6057;6050:12;6012:2;6103:1;6128:53;6173:7;6164:6;6153:9;6149:22;6128:53;:::i;:::-;6118:63;;6074:117;6230:2;6256:53;6301:7;6292:6;6281:9;6277:22;6256:53;:::i;:::-;6246:63;;6201:118;6002:324;;;;;:::o;6332:405::-;6416:6;6465:2;6453:9;6444:7;6440:23;6436:32;6433:2;;;6481:1;6478;6471:12;6433:2;6552:1;6541:9;6537:17;6524:31;6582:18;6574:6;6571:30;6568:2;;;6614:1;6611;6604:12;6568:2;6642:78;6712:7;6703:6;6692:9;6688:22;6642:78;:::i;:::-;6632:88;;6495:235;6423:314;;;;:::o;6743:256::-;6799:6;6848:2;6836:9;6827:7;6823:23;6819:32;6816:2;;;6864:1;6861;6854:12;6816:2;6907:1;6932:50;6974:7;6965:6;6954:9;6950:22;6932:50;:::i;:::-;6922:60;;6878:114;6806:193;;;;:::o;7005:260::-;7063:6;7112:2;7100:9;7091:7;7087:23;7083:32;7080:2;;;7128:1;7125;7118:12;7080:2;7171:1;7196:52;7240:7;7231:6;7220:9;7216:22;7196:52;:::i;:::-;7186:62;;7142:116;7070:195;;;;:::o;7271:282::-;7340:6;7389:2;7377:9;7368:7;7364:23;7360:32;7357:2;;;7405:1;7402;7395:12;7357:2;7448:1;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7419:127;7347:206;;;;:::o;7559:375::-;7628:6;7677:2;7665:9;7656:7;7652:23;7648:32;7645:2;;;7693:1;7690;7683:12;7645:2;7764:1;7753:9;7749:17;7736:31;7794:18;7786:6;7783:30;7780:2;;;7826:1;7823;7816:12;7780:2;7854:63;7909:7;7900:6;7889:9;7885:22;7854:63;:::i;:::-;7844:73;;7707:220;7635:299;;;;:::o;7940:262::-;7999:6;8048:2;8036:9;8027:7;8023:23;8019:32;8016:2;;;8064:1;8061;8054:12;8016:2;8107:1;8132:53;8177:7;8168:6;8157:9;8153:22;8132:53;:::i;:::-;8122:63;;8078:117;8006:196;;;;:::o;8208:142::-;8311:32;8337:5;8311:32;:::i;:::-;8306:3;8299:45;8289:61;;:::o;8356:118::-;8443:24;8461:5;8443:24;:::i;:::-;8438:3;8431:37;8421:53;;:::o;8480:109::-;8561:21;8576:5;8561:21;:::i;:::-;8556:3;8549:34;8539:50;;:::o;8595:360::-;8681:3;8709:38;8741:5;8709:38;:::i;:::-;8763:70;8826:6;8821:3;8763:70;:::i;:::-;8756:77;;8842:52;8887:6;8882:3;8875:4;8868:5;8864:16;8842:52;:::i;:::-;8919:29;8941:6;8919:29;:::i;:::-;8914:3;8910:39;8903:46;;8685:270;;;;;:::o;8961:364::-;9049:3;9077:39;9110:5;9077:39;:::i;:::-;9132:71;9196:6;9191:3;9132:71;:::i;:::-;9125:78;;9212:52;9257:6;9252:3;9245:4;9238:5;9234:16;9212:52;:::i;:::-;9289:29;9311:6;9289:29;:::i;:::-;9284:3;9280:39;9273:46;;9053:272;;;;;:::o;9331:377::-;9437:3;9465:39;9498:5;9465:39;:::i;:::-;9520:89;9602:6;9597:3;9520:89;:::i;:::-;9513:96;;9618:52;9663:6;9658:3;9651:4;9644:5;9640:16;9618:52;:::i;:::-;9695:6;9690:3;9686:16;9679:23;;9441:267;;;;;:::o;9714:366::-;9856:3;9877:67;9941:2;9936:3;9877:67;:::i;:::-;9870:74;;9953:93;10042:3;9953:93;:::i;:::-;10071:2;10066:3;10062:12;10055:19;;9860:220;;;:::o;10086:366::-;10228:3;10249:67;10313:2;10308:3;10249:67;:::i;:::-;10242:74;;10325:93;10414:3;10325:93;:::i;:::-;10443:2;10438:3;10434:12;10427:19;;10232:220;;;:::o;10458:366::-;10600:3;10621:67;10685:2;10680:3;10621:67;:::i;:::-;10614:74;;10697:93;10786:3;10697:93;:::i;:::-;10815:2;10810:3;10806:12;10799:19;;10604:220;;;:::o;10830:366::-;10972:3;10993:67;11057:2;11052:3;10993:67;:::i;:::-;10986:74;;11069:93;11158:3;11069:93;:::i;:::-;11187:2;11182:3;11178:12;11171:19;;10976:220;;;:::o;11202:366::-;11344:3;11365:67;11429:2;11424:3;11365:67;:::i;:::-;11358:74;;11441:93;11530:3;11441:93;:::i;:::-;11559:2;11554:3;11550:12;11543:19;;11348:220;;;:::o;11574:366::-;11716:3;11737:67;11801:2;11796:3;11737:67;:::i;:::-;11730:74;;11813:93;11902:3;11813:93;:::i;:::-;11931:2;11926:3;11922:12;11915:19;;11720:220;;;:::o;11946:366::-;12088:3;12109:67;12173:2;12168:3;12109:67;:::i;:::-;12102:74;;12185:93;12274:3;12185:93;:::i;:::-;12303:2;12298:3;12294:12;12287:19;;12092:220;;;:::o;12318:366::-;12460:3;12481:67;12545:2;12540:3;12481:67;:::i;:::-;12474:74;;12557:93;12646:3;12557:93;:::i;:::-;12675:2;12670:3;12666:12;12659:19;;12464:220;;;:::o;12690:366::-;12832:3;12853:67;12917:2;12912:3;12853:67;:::i;:::-;12846:74;;12929:93;13018:3;12929:93;:::i;:::-;13047:2;13042:3;13038:12;13031:19;;12836:220;;;:::o;13062:366::-;13204:3;13225:67;13289:2;13284:3;13225:67;:::i;:::-;13218:74;;13301:93;13390:3;13301:93;:::i;:::-;13419:2;13414:3;13410:12;13403:19;;13208:220;;;:::o;13434:366::-;13576:3;13597:67;13661:2;13656:3;13597:67;:::i;:::-;13590:74;;13673:93;13762:3;13673:93;:::i;:::-;13791:2;13786:3;13782:12;13775:19;;13580:220;;;:::o;13806:365::-;13948:3;13969:66;14033:1;14028:3;13969:66;:::i;:::-;13962:73;;14044:93;14133:3;14044:93;:::i;:::-;14162:2;14157:3;14153:12;14146:19;;13952:219;;;:::o;14177:366::-;14319:3;14340:67;14404:2;14399:3;14340:67;:::i;:::-;14333:74;;14416:93;14505:3;14416:93;:::i;:::-;14534:2;14529:3;14525:12;14518:19;;14323:220;;;:::o;14549:366::-;14691:3;14712:67;14776:2;14771:3;14712:67;:::i;:::-;14705:74;;14788:93;14877:3;14788:93;:::i;:::-;14906:2;14901:3;14897:12;14890:19;;14695:220;;;:::o;14921:366::-;15063:3;15084:67;15148:2;15143:3;15084:67;:::i;:::-;15077:74;;15160:93;15249:3;15160:93;:::i;:::-;15278:2;15273:3;15269:12;15262:19;;15067:220;;;:::o;15293:366::-;15435:3;15456:67;15520:2;15515:3;15456:67;:::i;:::-;15449:74;;15532:93;15621:3;15532:93;:::i;:::-;15650:2;15645:3;15641:12;15634:19;;15439:220;;;:::o;15665:366::-;15807:3;15828:67;15892:2;15887:3;15828:67;:::i;:::-;15821:74;;15904:93;15993:3;15904:93;:::i;:::-;16022:2;16017:3;16013:12;16006:19;;15811:220;;;:::o;16037:366::-;16179:3;16200:67;16264:2;16259:3;16200:67;:::i;:::-;16193:74;;16276:93;16365:3;16276:93;:::i;:::-;16394:2;16389:3;16385:12;16378:19;;16183:220;;;:::o;16409:366::-;16551:3;16572:67;16636:2;16631:3;16572:67;:::i;:::-;16565:74;;16648:93;16737:3;16648:93;:::i;:::-;16766:2;16761:3;16757:12;16750:19;;16555:220;;;:::o;16781:366::-;16923:3;16944:67;17008:2;17003:3;16944:67;:::i;:::-;16937:74;;17020:93;17109:3;17020:93;:::i;:::-;17138:2;17133:3;17129:12;17122:19;;16927:220;;;:::o;17153:366::-;17295:3;17316:67;17380:2;17375:3;17316:67;:::i;:::-;17309:74;;17392:93;17481:3;17392:93;:::i;:::-;17510:2;17505:3;17501:12;17494:19;;17299:220;;;:::o;17525:366::-;17667:3;17688:67;17752:2;17747:3;17688:67;:::i;:::-;17681:74;;17764:93;17853:3;17764:93;:::i;:::-;17882:2;17877:3;17873:12;17866:19;;17671:220;;;:::o;17897:366::-;18039:3;18060:67;18124:2;18119:3;18060:67;:::i;:::-;18053:74;;18136:93;18225:3;18136:93;:::i;:::-;18254:2;18249:3;18245:12;18238:19;;18043:220;;;:::o;18269:366::-;18411:3;18432:67;18496:2;18491:3;18432:67;:::i;:::-;18425:74;;18508:93;18597:3;18508:93;:::i;:::-;18626:2;18621:3;18617:12;18610:19;;18415:220;;;:::o;18641:366::-;18783:3;18804:67;18868:2;18863:3;18804:67;:::i;:::-;18797:74;;18880:93;18969:3;18880:93;:::i;:::-;18998:2;18993:3;18989:12;18982:19;;18787:220;;;:::o;19013:366::-;19155:3;19176:67;19240:2;19235:3;19176:67;:::i;:::-;19169:74;;19252:93;19341:3;19252:93;:::i;:::-;19370:2;19365:3;19361:12;19354:19;;19159:220;;;:::o;19385:366::-;19527:3;19548:67;19612:2;19607:3;19548:67;:::i;:::-;19541:74;;19624:93;19713:3;19624:93;:::i;:::-;19742:2;19737:3;19733:12;19726:19;;19531:220;;;:::o;19757:366::-;19899:3;19920:67;19984:2;19979:3;19920:67;:::i;:::-;19913:74;;19996:93;20085:3;19996:93;:::i;:::-;20114:2;20109:3;20105:12;20098:19;;19903:220;;;:::o;20129:118::-;20216:24;20234:5;20216:24;:::i;:::-;20211:3;20204:37;20194:53;;:::o;20253:435::-;20433:3;20455:95;20546:3;20537:6;20455:95;:::i;:::-;20448:102;;20567:95;20658:3;20649:6;20567:95;:::i;:::-;20560:102;;20679:3;20672:10;;20437:251;;;;;:::o;20694:222::-;20787:4;20825:2;20814:9;20810:18;20802:26;;20838:71;20906:1;20895:9;20891:17;20882:6;20838:71;:::i;:::-;20792:124;;;;:::o;20922:254::-;21031:4;21069:2;21058:9;21054:18;21046:26;;21082:87;21166:1;21155:9;21151:17;21142:6;21082:87;:::i;:::-;21036:140;;;;:::o;21182:640::-;21377:4;21415:3;21404:9;21400:19;21392:27;;21429:71;21497:1;21486:9;21482:17;21473:6;21429:71;:::i;:::-;21510:72;21578:2;21567:9;21563:18;21554:6;21510:72;:::i;:::-;21592;21660:2;21649:9;21645:18;21636:6;21592:72;:::i;:::-;21711:9;21705:4;21701:20;21696:2;21685:9;21681:18;21674:48;21739:76;21810:4;21801:6;21739:76;:::i;:::-;21731:84;;21382:440;;;;;;;:::o;21828:210::-;21915:4;21953:2;21942:9;21938:18;21930:26;;21966:65;22028:1;22017:9;22013:17;22004:6;21966:65;:::i;:::-;21920:118;;;;:::o;22044:313::-;22157:4;22195:2;22184:9;22180:18;22172:26;;22244:9;22238:4;22234:20;22230:1;22219:9;22215:17;22208:47;22272:78;22345:4;22336:6;22272:78;:::i;:::-;22264:86;;22162:195;;;;:::o;22363:419::-;22529:4;22567:2;22556:9;22552:18;22544:26;;22616:9;22610:4;22606:20;22602:1;22591:9;22587:17;22580:47;22644:131;22770:4;22644:131;:::i;:::-;22636:139;;22534:248;;;:::o;22788:419::-;22954:4;22992:2;22981:9;22977:18;22969:26;;23041:9;23035:4;23031:20;23027:1;23016:9;23012:17;23005:47;23069:131;23195:4;23069:131;:::i;:::-;23061:139;;22959:248;;;:::o;23213:419::-;23379:4;23417:2;23406:9;23402:18;23394:26;;23466:9;23460:4;23456:20;23452:1;23441:9;23437:17;23430:47;23494:131;23620:4;23494:131;:::i;:::-;23486:139;;23384:248;;;:::o;23638:419::-;23804:4;23842:2;23831:9;23827:18;23819:26;;23891:9;23885:4;23881:20;23877:1;23866:9;23862:17;23855:47;23919:131;24045:4;23919:131;:::i;:::-;23911:139;;23809:248;;;:::o;24063:419::-;24229:4;24267:2;24256:9;24252:18;24244:26;;24316:9;24310:4;24306:20;24302:1;24291:9;24287:17;24280:47;24344:131;24470:4;24344:131;:::i;:::-;24336:139;;24234:248;;;:::o;24488:419::-;24654:4;24692:2;24681:9;24677:18;24669:26;;24741:9;24735:4;24731:20;24727:1;24716:9;24712:17;24705:47;24769:131;24895:4;24769:131;:::i;:::-;24761:139;;24659:248;;;:::o;24913:419::-;25079:4;25117:2;25106:9;25102:18;25094:26;;25166:9;25160:4;25156:20;25152:1;25141:9;25137:17;25130:47;25194:131;25320:4;25194:131;:::i;:::-;25186:139;;25084:248;;;:::o;25338:419::-;25504:4;25542:2;25531:9;25527:18;25519:26;;25591:9;25585:4;25581:20;25577:1;25566:9;25562:17;25555:47;25619:131;25745:4;25619:131;:::i;:::-;25611:139;;25509:248;;;:::o;25763:419::-;25929:4;25967:2;25956:9;25952:18;25944:26;;26016:9;26010:4;26006:20;26002:1;25991:9;25987:17;25980:47;26044:131;26170:4;26044:131;:::i;:::-;26036:139;;25934:248;;;:::o;26188:419::-;26354:4;26392:2;26381:9;26377:18;26369:26;;26441:9;26435:4;26431:20;26427:1;26416:9;26412:17;26405:47;26469:131;26595:4;26469:131;:::i;:::-;26461:139;;26359:248;;;:::o;26613:419::-;26779:4;26817:2;26806:9;26802:18;26794:26;;26866:9;26860:4;26856:20;26852:1;26841:9;26837:17;26830:47;26894:131;27020:4;26894:131;:::i;:::-;26886:139;;26784:248;;;:::o;27038:419::-;27204:4;27242:2;27231:9;27227:18;27219:26;;27291:9;27285:4;27281:20;27277:1;27266:9;27262:17;27255:47;27319:131;27445:4;27319:131;:::i;:::-;27311:139;;27209:248;;;:::o;27463:419::-;27629:4;27667:2;27656:9;27652:18;27644:26;;27716:9;27710:4;27706:20;27702:1;27691:9;27687:17;27680:47;27744:131;27870:4;27744:131;:::i;:::-;27736:139;;27634:248;;;:::o;27888:419::-;28054:4;28092:2;28081:9;28077:18;28069:26;;28141:9;28135:4;28131:20;28127:1;28116:9;28112:17;28105:47;28169:131;28295:4;28169:131;:::i;:::-;28161:139;;28059:248;;;:::o;28313:419::-;28479:4;28517:2;28506:9;28502:18;28494:26;;28566:9;28560:4;28556:20;28552:1;28541:9;28537:17;28530:47;28594:131;28720:4;28594:131;:::i;:::-;28586:139;;28484:248;;;:::o;28738:419::-;28904:4;28942:2;28931:9;28927:18;28919:26;;28991:9;28985:4;28981:20;28977:1;28966:9;28962:17;28955:47;29019:131;29145:4;29019:131;:::i;:::-;29011:139;;28909:248;;;:::o;29163:419::-;29329:4;29367:2;29356:9;29352:18;29344:26;;29416:9;29410:4;29406:20;29402:1;29391:9;29387:17;29380:47;29444:131;29570:4;29444:131;:::i;:::-;29436:139;;29334:248;;;:::o;29588:419::-;29754:4;29792:2;29781:9;29777:18;29769:26;;29841:9;29835:4;29831:20;29827:1;29816:9;29812:17;29805:47;29869:131;29995:4;29869:131;:::i;:::-;29861:139;;29759:248;;;:::o;30013:419::-;30179:4;30217:2;30206:9;30202:18;30194:26;;30266:9;30260:4;30256:20;30252:1;30241:9;30237:17;30230:47;30294:131;30420:4;30294:131;:::i;:::-;30286:139;;30184:248;;;:::o;30438:419::-;30604:4;30642:2;30631:9;30627:18;30619:26;;30691:9;30685:4;30681:20;30677:1;30666:9;30662:17;30655:47;30719:131;30845:4;30719:131;:::i;:::-;30711:139;;30609:248;;;:::o;30863:419::-;31029:4;31067:2;31056:9;31052:18;31044:26;;31116:9;31110:4;31106:20;31102:1;31091:9;31087:17;31080:47;31144:131;31270:4;31144:131;:::i;:::-;31136:139;;31034:248;;;:::o;31288:419::-;31454:4;31492:2;31481:9;31477:18;31469:26;;31541:9;31535:4;31531:20;31527:1;31516:9;31512:17;31505:47;31569:131;31695:4;31569:131;:::i;:::-;31561:139;;31459:248;;;:::o;31713:419::-;31879:4;31917:2;31906:9;31902:18;31894:26;;31966:9;31960:4;31956:20;31952:1;31941:9;31937:17;31930:47;31994:131;32120:4;31994:131;:::i;:::-;31986:139;;31884:248;;;:::o;32138:419::-;32304:4;32342:2;32331:9;32327:18;32319:26;;32391:9;32385:4;32381:20;32377:1;32366:9;32362:17;32355:47;32419:131;32545:4;32419:131;:::i;:::-;32411:139;;32309:248;;;:::o;32563:419::-;32729:4;32767:2;32756:9;32752:18;32744:26;;32816:9;32810:4;32806:20;32802:1;32791:9;32787:17;32780:47;32844:131;32970:4;32844:131;:::i;:::-;32836:139;;32734:248;;;:::o;32988:419::-;33154:4;33192:2;33181:9;33177:18;33169:26;;33241:9;33235:4;33231:20;33227:1;33216:9;33212:17;33205:47;33269:131;33395:4;33269:131;:::i;:::-;33261:139;;33159:248;;;:::o;33413:419::-;33579:4;33617:2;33606:9;33602:18;33594:26;;33666:9;33660:4;33656:20;33652:1;33641:9;33637:17;33630:47;33694:131;33820:4;33694:131;:::i;:::-;33686:139;;33584:248;;;:::o;33838:419::-;34004:4;34042:2;34031:9;34027:18;34019:26;;34091:9;34085:4;34081:20;34077:1;34066:9;34062:17;34055:47;34119:131;34245:4;34119:131;:::i;:::-;34111:139;;34009:248;;;:::o;34263:222::-;34356:4;34394:2;34383:9;34379:18;34371:26;;34407:71;34475:1;34464:9;34460:17;34451:6;34407:71;:::i;:::-;34361:124;;;;:::o;34491:129::-;34525:6;34552:20;;:::i;:::-;34542:30;;34581:33;34609:4;34601:6;34581:33;:::i;:::-;34532:88;;;:::o;34626:75::-;34659:6;34692:2;34686:9;34676:19;;34666:35;:::o;34707:311::-;34784:4;34874:18;34866:6;34863:30;34860:2;;;34896:18;;:::i;:::-;34860:2;34946:4;34938:6;34934:17;34926:25;;35006:4;35000;34996:15;34988:23;;34789:229;;;:::o;35024:307::-;35085:4;35175:18;35167:6;35164:30;35161:2;;;35197:18;;:::i;:::-;35161:2;35235:29;35257:6;35235:29;:::i;:::-;35227:37;;35319:4;35313;35309:15;35301:23;;35090:241;;;:::o;35337:308::-;35399:4;35489:18;35481:6;35478:30;35475:2;;;35511:18;;:::i;:::-;35475:2;35549:29;35571:6;35549:29;:::i;:::-;35541:37;;35633:4;35627;35623:15;35615:23;;35404:241;;;:::o;35651:98::-;35702:6;35736:5;35730:12;35720:22;;35709:40;;;:::o;35755:99::-;35807:6;35841:5;35835:12;35825:22;;35814:40;;;:::o;35860:168::-;35943:11;35977:6;35972:3;35965:19;36017:4;36012:3;36008:14;35993:29;;35955:73;;;;:::o;36034:169::-;36118:11;36152:6;36147:3;36140:19;36192:4;36187:3;36183:14;36168:29;;36130:73;;;;:::o;36209:148::-;36311:11;36348:3;36333:18;;36323:34;;;;:::o;36363:305::-;36403:3;36422:20;36440:1;36422:20;:::i;:::-;36417:25;;36456:20;36474:1;36456:20;:::i;:::-;36451:25;;36610:1;36542:66;36538:74;36535:1;36532:81;36529:2;;;36616:18;;:::i;:::-;36529:2;36660:1;36657;36653:9;36646:16;;36407:261;;;;:::o;36674:185::-;36714:1;36731:20;36749:1;36731:20;:::i;:::-;36726:25;;36765:20;36783:1;36765:20;:::i;:::-;36760:25;;36804:1;36794:2;;36809:18;;:::i;:::-;36794:2;36851:1;36848;36844:9;36839:14;;36716:143;;;;:::o;36865:191::-;36905:4;36925:20;36943:1;36925:20;:::i;:::-;36920:25;;36959:20;36977:1;36959:20;:::i;:::-;36954:25;;36998:1;36995;36992:8;36989:2;;;37003:18;;:::i;:::-;36989:2;37048:1;37045;37041:9;37033:17;;36910:146;;;;:::o;37062:96::-;37099:7;37128:24;37146:5;37128:24;:::i;:::-;37117:35;;37107:51;;;:::o;37164:104::-;37209:7;37238:24;37256:5;37238:24;:::i;:::-;37227:35;;37217:51;;;:::o;37274:90::-;37308:7;37351:5;37344:13;37337:21;37326:32;;37316:48;;;:::o;37370:149::-;37406:7;37446:66;37439:5;37435:78;37424:89;;37414:105;;;:::o;37525:126::-;37562:7;37602:42;37595:5;37591:54;37580:65;;37570:81;;;:::o;37657:77::-;37694:7;37723:5;37712:16;;37702:32;;;:::o;37740:154::-;37824:6;37819:3;37814;37801:30;37886:1;37877:6;37872:3;37868:16;37861:27;37791:103;;;:::o;37900:307::-;37968:1;37978:113;37992:6;37989:1;37986:13;37978:113;;;38077:1;38072:3;38068:11;38062:18;38058:1;38053:3;38049:11;38042:39;38014:2;38011:1;38007:10;38002:15;;37978:113;;;38109:6;38106:1;38103:13;38100:2;;;38189:1;38180:6;38175:3;38171:16;38164:27;38100:2;37949:258;;;;:::o;38213:320::-;38257:6;38294:1;38288:4;38284:12;38274:22;;38341:1;38335:4;38331:12;38362:18;38352:2;;38418:4;38410:6;38406:17;38396:27;;38352:2;38480;38472:6;38469:14;38449:18;38446:38;38443:2;;;38499:18;;:::i;:::-;38443:2;38264:269;;;;:::o;38539:281::-;38622:27;38644:4;38622:27;:::i;:::-;38614:6;38610:40;38752:6;38740:10;38737:22;38716:18;38704:10;38701:34;38698:62;38695:2;;;38763:18;;:::i;:::-;38695:2;38803:10;38799:2;38792:22;38582:238;;;:::o;38826:233::-;38865:3;38888:24;38906:5;38888:24;:::i;:::-;38879:33;;38934:66;38927:5;38924:77;38921:2;;;39004:18;;:::i;:::-;38921:2;39051:1;39044:5;39040:13;39033:20;;38869:190;;;:::o;39065:176::-;39097:1;39114:20;39132:1;39114:20;:::i;:::-;39109:25;;39148:20;39166:1;39148:20;:::i;:::-;39143:25;;39187:1;39177:2;;39192:18;;:::i;:::-;39177:2;39233:1;39230;39226:9;39221:14;;39099:142;;;;:::o;39247:180::-;39295:77;39292:1;39285:88;39392:4;39389:1;39382:15;39416:4;39413:1;39406:15;39433:180;39481:77;39478:1;39471:88;39578:4;39575:1;39568:15;39602:4;39599:1;39592:15;39619:180;39667:77;39664:1;39657:88;39764:4;39761:1;39754:15;39788:4;39785:1;39778:15;39805:180;39853:77;39850:1;39843:88;39950:4;39947:1;39940:15;39974:4;39971:1;39964:15;39991:102;40032:6;40083:2;40079:7;40074:2;40067:5;40063:14;40059:28;40049:38;;40039:54;;;:::o;40099:230::-;40239:34;40235:1;40227:6;40223:14;40216:58;40308:13;40303:2;40295:6;40291:15;40284:38;40205:124;:::o;40335:181::-;40475:33;40471:1;40463:6;40459:14;40452:57;40441:75;:::o;40522:237::-;40662:34;40658:1;40650:6;40646:14;40639:58;40731:20;40726:2;40718:6;40714:15;40707:45;40628:131;:::o;40765:225::-;40905:34;40901:1;40893:6;40889:14;40882:58;40974:8;40969:2;40961:6;40957:15;40950:33;40871:119;:::o;40996:178::-;41136:30;41132:1;41124:6;41120:14;41113:54;41102:72;:::o;41180:181::-;41320:33;41316:1;41308:6;41304:14;41297:57;41286:75;:::o;41367:178::-;41507:30;41503:1;41495:6;41491:14;41484:54;41473:72;:::o;41551:171::-;41691:23;41687:1;41679:6;41675:14;41668:47;41657:65;:::o;41728:181::-;41868:33;41864:1;41856:6;41852:14;41845:57;41834:75;:::o;41915:223::-;42055:34;42051:1;42043:6;42039:14;42032:58;42124:6;42119:2;42111:6;42107:15;42100:31;42021:117;:::o;42144:175::-;42284:27;42280:1;42272:6;42268:14;42261:51;42250:69;:::o;42325:158::-;42465:10;42461:1;42453:6;42449:14;42442:34;42431:52;:::o;42489:231::-;42629:34;42625:1;42617:6;42613:14;42606:58;42698:14;42693:2;42685:6;42681:15;42674:39;42595:125;:::o;42726:178::-;42866:30;42862:1;42854:6;42850:14;42843:54;42832:72;:::o;42910:167::-;43050:19;43046:1;43038:6;43034:14;43027:43;43016:61;:::o;43083:243::-;43223:34;43219:1;43211:6;43207:14;43200:58;43292:26;43287:2;43279:6;43275:15;43268:51;43189:137;:::o;43332:229::-;43472:34;43468:1;43460:6;43456:14;43449:58;43541:12;43536:2;43528:6;43524:15;43517:37;43438:123;:::o;43567:228::-;43707:34;43703:1;43695:6;43691:14;43684:58;43776:11;43771:2;43763:6;43759:15;43752:36;43673:122;:::o;43801:182::-;43941:34;43937:1;43929:6;43925:14;43918:58;43907:76;:::o;43989:231::-;44129:34;44125:1;44117:6;44113:14;44106:58;44198:14;44193:2;44185:6;44181:15;44174:39;44095:125;:::o;44226:174::-;44366:26;44362:1;44354:6;44350:14;44343:50;44332:68;:::o;44406:182::-;44546:34;44542:1;44534:6;44530:14;44523:58;44512:76;:::o;44594:228::-;44734:34;44730:1;44722:6;44718:14;44711:58;44803:11;44798:2;44790:6;44786:15;44779:36;44700:122;:::o;44828:234::-;44968:34;44964:1;44956:6;44952:14;44945:58;45037:17;45032:2;45024:6;45020:15;45013:42;44934:128;:::o;45068:176::-;45208:28;45204:1;45196:6;45192:14;45185:52;45174:70;:::o;45250:220::-;45390:34;45386:1;45378:6;45374:14;45367:58;45459:3;45454:2;45446:6;45442:15;45435:28;45356:114;:::o;45476:236::-;45616:34;45612:1;45604:6;45600:14;45593:58;45685:19;45680:2;45672:6;45668:15;45661:44;45582:130;:::o;45718:231::-;45858:34;45854:1;45846:6;45842:14;45835:58;45927:14;45922:2;45914:6;45910:15;45903:39;45824:125;:::o;45955:122::-;46028:24;46046:5;46028:24;:::i;:::-;46021:5;46018:35;46008:2;;46067:1;46064;46057:12;46008:2;45998:79;:::o;46083:138::-;46164:32;46190:5;46164:32;:::i;:::-;46157:5;46154:43;46144:2;;46211:1;46208;46201:12;46144:2;46134:87;:::o;46227:116::-;46297:21;46312:5;46297:21;:::i;:::-;46290:5;46287:32;46277:2;;46333:1;46330;46323:12;46277:2;46267:76;:::o;46349:120::-;46421:23;46438:5;46421:23;:::i;:::-;46414:5;46411:34;46401:2;;46459:1;46456;46449:12;46401:2;46391:78;:::o;46475:122::-;46548:24;46566:5;46548:24;:::i;:::-;46541:5;46538:35;46528:2;;46587:1;46584;46577:12;46528:2;46518:79;:::o

Swarm Source

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