ETH Price: $2,629.51 (+8.01%)
 

Overview

Max Total Supply

5,555 Cat

Holders

2,366

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 Cat
0x790f562aefd96bc6328ae71aeee8e097f3401059
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:
TheCats

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 14: TheCats.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "./ERC721A.sol";
import "./Ownable.sol";

contract TheCats is ERC721A, Ownable {
    using Strings for uint256;
    uint256 public maxSupply = 5555;
    uint256 public maxFreeAmount = 555;
    uint256 public maxFreePerWallet = 2;
    uint256 public price = 0.002 ether;
    uint256 public maxPerTx = 10;
    uint256 public maxPerWallet = 100;
    uint256 public teamReserved = 2;
    bool public mintEnabled = false;
    bool revealed = false;
    string public baseURI;
    string unRevealedURI;
    

    constructor() ERC721A("The Cats", "Cat") {
        _safeMint(msg.sender, teamReserved);
    }

    function mint(uint256 quantity) external payable {
        require(mintEnabled, "Not live");
        require(totalSupply() + quantity < maxSupply + 1, "No more");
        uint256 cost = price;
        uint256 _maxPerWallet = maxPerWallet;

        if (_numberMinted(msg.sender) < maxFreePerWallet && quantity <= maxFreePerWallet&& totalSupply() < maxFreeAmount) {
            _maxPerWallet = maxFreePerWallet;
            cost = 0;
        }

        require(
            _numberMinted(msg.sender) + quantity <= _maxPerWallet,
            "Max per wallet"
        );
        require(msg.value >= quantity * cost, "Please send the exact amount.");
        _safeMint(msg.sender, quantity);
    }

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

    function tokenURI(
        uint256 tokenId
    ) public view virtual override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return  revealed ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : unRevealedURI;
    }

    function flipSale() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function setUnRevealedURI(string memory uri) public onlyOwner {
        unRevealedURI = uri;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setMaxFreeAmount(uint256 _amount) external onlyOwner {
        maxFreeAmount = _amount;
    }

    function setMaxFreePerWallet(uint256 _amount) external onlyOwner {
        maxFreePerWallet = _amount;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

/**
 * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //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);

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

File 5 of 14: ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (
                    safe &&
                    !_checkOnERC721Received(address(0), to, updatedIndex, _data)
                ) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 6 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 14: IERC165.sol
// 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 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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 9 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 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 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUnRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b360095561022b600a556002600b5566071afd498d0000600c55600a600d556064600e556002600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200007257600080fd5b506040518060400160405280600881526020017f54686520436174730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f43617400000000000000000000000000000000000000000000000000000000008152508160029081620000f09190620009b2565b508060039081620001029190620009b2565b505050600062000117620001d060201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001ca33600f54620001d860201b60201c565b62000c71565b600033905090565b620001fa828260405180602001604052806000815250620001fe60201b60201c565b5050565b6200021383838360016200021860201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000285576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403620002c0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620002d560008683876200056b60201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200054657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620004f85750620004f660008884886200057160201b60201c565b155b1562000530576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000473565b5080600081905550506200056460008683876200070f60201b60201c565b5050505050565b50505050565b60006200059f8473ffffffffffffffffffffffffffffffffffffffff166200071560201b62001e0f1760201c565b1562000702578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005d1620001d060201b60201c565b8786866040518563ffffffff1660e01b8152600401620005f5949392919062000b89565b6020604051808303816000875af19250505080156200063457506040513d601f19601f8201168201806040525081019062000631919062000c3f565b60015b620006b1573d806000811462000667576040519150601f19603f3d011682016040523d82523d6000602084013e6200066c565b606091505b506000815103620006a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000707565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007ba57607f821691505b602082108103620007d057620007cf62000772565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200083a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007fb565b620008468683620007fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008936200088d62000887846200085e565b62000868565b6200085e565b9050919050565b6000819050919050565b620008af8362000872565b620008c7620008be826200089a565b84845462000808565b825550505050565b600090565b620008de620008cf565b620008eb818484620008a4565b505050565b5b81811015620009135762000907600082620008d4565b600181019050620008f1565b5050565b601f82111562000962576200092c81620007d6565b6200093784620007eb565b8101602085101562000947578190505b6200095f6200095685620007eb565b830182620008f0565b50505b505050565b600082821c905092915050565b6000620009876000198460080262000967565b1980831691505092915050565b6000620009a2838362000974565b9150826002028217905092915050565b620009bd8262000738565b67ffffffffffffffff811115620009d957620009d862000743565b5b620009e58254620007a1565b620009f282828562000917565b600060209050601f83116001811462000a2a576000841562000a15578287015190505b62000a21858262000994565b86555062000a91565b601f19841662000a3a86620007d6565b60005b8281101562000a645784890151825560018201915060208501945060208101905062000a3d565b8683101562000a84578489015162000a80601f89168262000974565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ac68262000a99565b9050919050565b62000ad88162000ab9565b82525050565b62000ae9816200085e565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000b2b57808201518184015260208101905062000b0e565b60008484015250505050565b6000601f19601f8301169050919050565b600062000b558262000aef565b62000b61818562000afa565b935062000b7381856020860162000b0b565b62000b7e8162000b37565b840191505092915050565b600060808201905062000ba0600083018762000acd565b62000baf602083018662000acd565b62000bbe604083018562000ade565b818103606083015262000bd2818462000b48565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000c198162000be2565b811462000c2557600080fd5b50565b60008151905062000c398162000c0e565b92915050565b60006020828403121562000c585762000c5762000bdd565b5b600062000c688482850162000c28565b91505092915050565b6140048062000c816000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a7027357116100a0578063d5abeb011161006f578063d5abeb0114610768578063e985e9c514610793578063f2fde38b146107d0578063f892c6e2146107f9578063f968adbe146108245761020f565b8063a7027357146106ac578063b88d4fde146106d7578063c87b56dd14610700578063d12397301461073d5761020f565b806391b7f5ed116100e757806391b7f5ed146105e857806395d89b4114610611578063a035b1fe1461063c578063a0712d6814610667578063a22cb465146106835761020f565b806370a0823114610552578063715018a61461058f5780637ba5e621146105a65780638da5cb5b146105bd5761020f565b806336f5b9a31161019b5780634f6ccce71161016a5780634f6ccce71461045b57806355f804b3146104985780636352211e146104c15780636c0360eb146104fe5780636d7c4a4b146105295761020f565b806336f5b9a3146103c55780633ccfd60b146103f057806342842e0e14610407578063453c2310146104305761020f565b8063095ea7b3116101e2578063095ea7b3146102e25780630c23bb3f1461030b57806318160ddd1461033457806323b872dd1461035f5780632f745c59146103885761020f565b806301aade7b1461021457806301ffc9a71461023d57806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612fb6565b61084f565b005b34801561024957600080fd5b50610264600480360381019061025f9190613057565b6108de565b604051610271919061309f565b60405180910390f35b34801561028657600080fd5b5061028f610a28565b60405161029c9190613139565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613191565b610aba565b6040516102d991906131ff565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613246565b610b36565b005b34801561031757600080fd5b50610332600480360381019061032d9190613191565b610c40565b005b34801561034057600080fd5b50610349610cc6565b6040516103569190613295565b60405180910390f35b34801561036b57600080fd5b50610386600480360381019061038191906132b0565b610cd4565b005b34801561039457600080fd5b506103af60048036038101906103aa9190613246565b610ce4565b6040516103bc9190613295565b60405180910390f35b3480156103d157600080fd5b506103da610eba565b6040516103e79190613295565b60405180910390f35b3480156103fc57600080fd5b50610405610ec0565b005b34801561041357600080fd5b5061042e600480360381019061042991906132b0565b610feb565b005b34801561043c57600080fd5b5061044561100b565b6040516104529190613295565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613191565b611011565b60405161048f9190613295565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190612fb6565b611155565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613191565b6111e4565b6040516104f591906131ff565b60405180910390f35b34801561050a57600080fd5b506105136111fa565b6040516105209190613139565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613191565b611288565b005b34801561055e57600080fd5b5061057960048036038101906105749190613303565b61130e565b6040516105869190613295565b60405180910390f35b34801561059b57600080fd5b506105a46113dd565b005b3480156105b257600080fd5b506105bb61151a565b005b3480156105c957600080fd5b506105d26115c2565b6040516105df91906131ff565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190613191565b6115ec565b005b34801561061d57600080fd5b50610626611672565b6040516106339190613139565b60405180910390f35b34801561064857600080fd5b50610651611704565b60405161065e9190613295565b60405180910390f35b610681600480360381019061067c9190613191565b61170a565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061335c565b6118ba565b005b3480156106b857600080fd5b506106c1611a31565b6040516106ce9190613295565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f9919061343d565b611a37565b005b34801561070c57600080fd5b5061072760048036038101906107229190613191565b611a8a565b6040516107349190613139565b60405180910390f35b34801561074957600080fd5b50610752611bab565b60405161075f919061309f565b60405180910390f35b34801561077457600080fd5b5061077d611bbe565b60405161078a9190613295565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b591906134c0565b611bc4565b6040516107c7919061309f565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190613303565b611c58565b005b34801561080557600080fd5b5061080e611e03565b60405161081b9190613295565b60405180910390f35b34801561083057600080fd5b50610839611e09565b6040516108469190613295565b60405180910390f35b610857611e32565b73ffffffffffffffffffffffffffffffffffffffff166108756115c2565b73ffffffffffffffffffffffffffffffffffffffff16146108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c29061354c565b60405180910390fd5b80601290816108da9190613778565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109a957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a215750610a2082611e3a565b5b9050919050565b606060028054610a379061359b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a639061359b565b8015610ab05780601f10610a8557610100808354040283529160200191610ab0565b820191906000526020600020905b815481529060010190602001808311610a9357829003601f168201915b5050505050905090565b6000610ac582611ea4565b610afb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b41826111e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ba8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc7611e32565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bf95750610bf781610bf2611e32565b611bc4565b155b15610c30576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3b838383611ede565b505050565b610c48611e32565b73ffffffffffffffffffffffffffffffffffffffff16610c666115c2565b73ffffffffffffffffffffffffffffffffffffffff1614610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061354c565b60405180910390fd5b80600a8190555050565b600060015460005403905090565b610cdf838383611f90565b505050565b6000610cef8361130e565b8210610d27576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610eaf576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e105750610ea2565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e5057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ea057868403610e97578195505050505050610eb4565b83806001019450505b505b8080600101915050610d33565b600080fd5b92915050565b600f5481565b610ec8611e32565b73ffffffffffffffffffffffffffffffffffffffff16610ee66115c2565b73ffffffffffffffffffffffffffffffffffffffff1614610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f339061354c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f629061387b565b60006040518083038185875af1925050503d8060008114610f9f576040519150601f19603f3d011682016040523d82523d6000602084013e610fa4565b606091505b5050905080610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf906138dc565b60405180910390fd5b50565b61100683838360405180602001604052806000815250611a37565b505050565b600e5481565b60008060005490506000805b8281101561111d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161110f578583036111065781945050505050611150565b82806001019350505b50808060010191505061101d565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61115d611e32565b73ffffffffffffffffffffffffffffffffffffffff1661117b6115c2565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c89061354c565b60405180910390fd5b80601190816111e09190613778565b5050565b60006111ef8261247f565b600001519050919050565b601180546112079061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546112339061359b565b80156112805780601f1061125557610100808354040283529160200191611280565b820191906000526020600020905b81548152906001019060200180831161126357829003601f168201915b505050505081565b611290611e32565b73ffffffffffffffffffffffffffffffffffffffff166112ae6115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb9061354c565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611375576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113e5611e32565b73ffffffffffffffffffffffffffffffffffffffff166114036115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611459576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114509061354c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611522611e32565b73ffffffffffffffffffffffffffffffffffffffff166115406115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d9061354c565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115f4611e32565b73ffffffffffffffffffffffffffffffffffffffff166116126115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061354c565b60405180910390fd5b80600c8190555050565b6060600380546116819061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546116ad9061359b565b80156116fa5780601f106116cf576101008083540402835291602001916116fa565b820191906000526020600020905b8154815290600101906020018083116116dd57829003601f168201915b5050505050905090565b600c5481565b601060009054906101000a900460ff16611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090613948565b60405180910390fd5b60016009546117689190613997565b81611771610cc6565b61177b9190613997565b106117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290613a17565b60405180910390fd5b6000600c5490506000600e549050600b546117d5336126fb565b1080156117e45750600b548311155b80156117f85750600a546117f6610cc6565b105b1561180757600b549050600091505b8083611812336126fb565b61181c9190613997565b111561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613a83565b60405180910390fd5b81836118699190613aa3565b3410156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290613b31565b60405180910390fd5b6118b533846127ca565b505050565b6118c2611e32565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611926576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611933611e32565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119e0611e32565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a25919061309f565b60405180910390a35050565b600b5481565b611a42848484611f90565b611a4e848484846127e8565b611a84576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a9582611ea4565b611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613bc3565b60405180910390fd5b601060019054906101000a900460ff16611b785760128054611af59061359b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b219061359b565b8015611b6e5780601f10611b4357610100808354040283529160200191611b6e565b820191906000526020600020905b815481529060010190602001808311611b5157829003601f168201915b5050505050611ba4565b6011611b8383612966565b604051602001611b94929190613cee565b6040516020818303038152906040525b9050919050565b601060009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c60611e32565b73ffffffffffffffffffffffffffffffffffffffff16611c7e6115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061354c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90613d8f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600d5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611ed7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f9b8261247f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611fc2611e32565b73ffffffffffffffffffffffffffffffffffffffff161480611ff55750611ff48260000151611fef611e32565b611bc4565b5b8061203a5750612003611e32565b73ffffffffffffffffffffffffffffffffffffffff1661202284610aba565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612073576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146120dc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612142576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214f8585856001612ac6565b61215f6000848460000151611ede565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361240f5760005481101561240e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124788585856001612acc565b5050505050565b612487612e19565b60008290506000548110156126c4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516126c257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125a65780925050506126f6565b5b6001156126c157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126bc5780925050506126f6565b6125a7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612762576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6127e4828260405180602001604052806000815250612ad2565b5050565b60006128098473ffffffffffffffffffffffffffffffffffffffff16611e0f565b15612959578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612832611e32565b8786866040518563ffffffff1660e01b81526004016128549493929190613e04565b6020604051808303816000875af192505050801561289057506040513d601f19601f8201168201806040525081019061288d9190613e65565b60015b612909573d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b506000815103612901576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061295e565b600190505b949350505050565b6060600082036129ad576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ac1565b600082905060005b600082146129df5780806129c890613e92565b915050600a826129d89190613f09565b91506129b5565b60008167ffffffffffffffff8111156129fb576129fa612e8b565b5b6040519080825280601f01601f191660200182016040528015612a2d5781602001600182028036833780820191505090505b5090505b60008514612aba57600182612a469190613f3a565b9150600a85612a559190613f6e565b6030612a619190613997565b60f81b818381518110612a7757612a76613f9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab39190613f09565b9450612a31565b8093505050505b919050565b50505050565b50505050565b612adf8383836001612ae4565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612b50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612b8a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b976000868387612ac6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612dfc57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612db05750612dae60008884886127e8565b155b15612de7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612d35565b508060008190555050612e126000868387612acc565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ec382612e7a565b810181811067ffffffffffffffff82111715612ee257612ee1612e8b565b5b80604052505050565b6000612ef5612e5c565b9050612f018282612eba565b919050565b600067ffffffffffffffff821115612f2157612f20612e8b565b5b612f2a82612e7a565b9050602081019050919050565b82818337600083830152505050565b6000612f59612f5484612f06565b612eeb565b905082815260208101848484011115612f7557612f74612e75565b5b612f80848285612f37565b509392505050565b600082601f830112612f9d57612f9c612e70565b5b8135612fad848260208601612f46565b91505092915050565b600060208284031215612fcc57612fcb612e66565b5b600082013567ffffffffffffffff811115612fea57612fe9612e6b565b5b612ff684828501612f88565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61303481612fff565b811461303f57600080fd5b50565b6000813590506130518161302b565b92915050565b60006020828403121561306d5761306c612e66565b5b600061307b84828501613042565b91505092915050565b60008115159050919050565b61309981613084565b82525050565b60006020820190506130b46000830184613090565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130f45780820151818401526020810190506130d9565b60008484015250505050565b600061310b826130ba565b61311581856130c5565b93506131258185602086016130d6565b61312e81612e7a565b840191505092915050565b600060208201905081810360008301526131538184613100565b905092915050565b6000819050919050565b61316e8161315b565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a6612e66565b5b60006131b58482850161317c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e9826131be565b9050919050565b6131f9816131de565b82525050565b600060208201905061321460008301846131f0565b92915050565b613223816131de565b811461322e57600080fd5b50565b6000813590506132408161321a565b92915050565b6000806040838503121561325d5761325c612e66565b5b600061326b85828601613231565b925050602061327c8582860161317c565b9150509250929050565b61328f8161315b565b82525050565b60006020820190506132aa6000830184613286565b92915050565b6000806000606084860312156132c9576132c8612e66565b5b60006132d786828701613231565b93505060206132e886828701613231565b92505060406132f98682870161317c565b9150509250925092565b60006020828403121561331957613318612e66565b5b600061332784828501613231565b91505092915050565b61333981613084565b811461334457600080fd5b50565b60008135905061335681613330565b92915050565b6000806040838503121561337357613372612e66565b5b600061338185828601613231565b925050602061339285828601613347565b9150509250929050565b600067ffffffffffffffff8211156133b7576133b6612e8b565b5b6133c082612e7a565b9050602081019050919050565b60006133e06133db8461339c565b612eeb565b9050828152602081018484840111156133fc576133fb612e75565b5b613407848285612f37565b509392505050565b600082601f83011261342457613423612e70565b5b81356134348482602086016133cd565b91505092915050565b6000806000806080858703121561345757613456612e66565b5b600061346587828801613231565b945050602061347687828801613231565b93505060406134878782880161317c565b925050606085013567ffffffffffffffff8111156134a8576134a7612e6b565b5b6134b48782880161340f565b91505092959194509250565b600080604083850312156134d7576134d6612e66565b5b60006134e585828601613231565b92505060206134f685828601613231565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135366020836130c5565b915061354182613500565b602082019050919050565b6000602082019050818103600083015261356581613529565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135b357607f821691505b6020821081036135c6576135c561356c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261362e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135f1565b61363886836135f1565b95508019841693508086168417925050509392505050565b6000819050919050565b600061367561367061366b8461315b565b613650565b61315b565b9050919050565b6000819050919050565b61368f8361365a565b6136a361369b8261367c565b8484546135fe565b825550505050565b600090565b6136b86136ab565b6136c3818484613686565b505050565b5b818110156136e7576136dc6000826136b0565b6001810190506136c9565b5050565b601f82111561372c576136fd816135cc565b613706846135e1565b81016020851015613715578190505b613729613721856135e1565b8301826136c8565b50505b505050565b600082821c905092915050565b600061374f60001984600802613731565b1980831691505092915050565b6000613768838361373e565b9150826002028217905092915050565b613781826130ba565b67ffffffffffffffff81111561379a57613799612e8b565b5b6137a4825461359b565b6137af8282856136eb565b600060209050601f8311600181146137e257600084156137d0578287015190505b6137da858261375c565b865550613842565b601f1984166137f0866135cc565b60005b82811015613818578489015182556001820191506020850194506020810190506137f3565b868310156138355784890151613831601f89168261373e565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b600061386560008361384a565b915061387082613855565b600082019050919050565b600061388682613858565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006138c66010836130c5565b91506138d182613890565b602082019050919050565b600060208201905081810360008301526138f5816138b9565b9050919050565b7f4e6f74206c697665000000000000000000000000000000000000000000000000600082015250565b60006139326008836130c5565b915061393d826138fc565b602082019050919050565b6000602082019050818103600083015261396181613925565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139a28261315b565b91506139ad8361315b565b92508282019050808211156139c5576139c4613968565b5b92915050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b6000613a016007836130c5565b9150613a0c826139cb565b602082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4d6178207065722077616c6c6574000000000000000000000000000000000000600082015250565b6000613a6d600e836130c5565b9150613a7882613a37565b602082019050919050565b60006020820190508181036000830152613a9c81613a60565b9050919050565b6000613aae8261315b565b9150613ab98361315b565b9250828202613ac78161315b565b91508282048414831517613ade57613add613968565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613b1b601d836130c5565b9150613b2682613ae5565b602082019050919050565b60006020820190508181036000830152613b4a81613b0e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613bad602f836130c5565b9150613bb882613b51565b604082019050919050565b60006020820190508181036000830152613bdc81613ba0565b9050919050565b600081905092915050565b60008154613bfb8161359b565b613c058186613be3565b94506001821660008114613c205760018114613c3557613c68565b60ff1983168652811515820286019350613c68565b613c3e856135cc565b60005b83811015613c6057815481890152600182019150602081019050613c41565b838801955050505b50505092915050565b6000613c7c826130ba565b613c868185613be3565b9350613c968185602086016130d6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613cd8600583613be3565b9150613ce382613ca2565b600582019050919050565b6000613cfa8285613bee565b9150613d068284613c71565b9150613d1182613ccb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d796026836130c5565b9150613d8482613d1d565b604082019050919050565b60006020820190508181036000830152613da881613d6c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613dd682613daf565b613de08185613dba565b9350613df08185602086016130d6565b613df981612e7a565b840191505092915050565b6000608082019050613e1960008301876131f0565b613e2660208301866131f0565b613e336040830185613286565b8181036060830152613e458184613dcb565b905095945050505050565b600081519050613e5f8161302b565b92915050565b600060208284031215613e7b57613e7a612e66565b5b6000613e8984828501613e50565b91505092915050565b6000613e9d8261315b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ecf57613ece613968565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f148261315b565b9150613f1f8361315b565b925082613f2f57613f2e613eda565b5b828204905092915050565b6000613f458261315b565b9150613f508361315b565b9250828203905081811115613f6857613f67613968565b5b92915050565b6000613f798261315b565b9150613f848361315b565b925082613f9457613f93613eda565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212202181499bef042061d90e90316774bc344ad1f9c2a5ee8fae0491f1f202f1730b64736f6c63430008120033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063a7027357116100a0578063d5abeb011161006f578063d5abeb0114610768578063e985e9c514610793578063f2fde38b146107d0578063f892c6e2146107f9578063f968adbe146108245761020f565b8063a7027357146106ac578063b88d4fde146106d7578063c87b56dd14610700578063d12397301461073d5761020f565b806391b7f5ed116100e757806391b7f5ed146105e857806395d89b4114610611578063a035b1fe1461063c578063a0712d6814610667578063a22cb465146106835761020f565b806370a0823114610552578063715018a61461058f5780637ba5e621146105a65780638da5cb5b146105bd5761020f565b806336f5b9a31161019b5780634f6ccce71161016a5780634f6ccce71461045b57806355f804b3146104985780636352211e146104c15780636c0360eb146104fe5780636d7c4a4b146105295761020f565b806336f5b9a3146103c55780633ccfd60b146103f057806342842e0e14610407578063453c2310146104305761020f565b8063095ea7b3116101e2578063095ea7b3146102e25780630c23bb3f1461030b57806318160ddd1461033457806323b872dd1461035f5780632f745c59146103885761020f565b806301aade7b1461021457806301ffc9a71461023d57806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612fb6565b61084f565b005b34801561024957600080fd5b50610264600480360381019061025f9190613057565b6108de565b604051610271919061309f565b60405180910390f35b34801561028657600080fd5b5061028f610a28565b60405161029c9190613139565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613191565b610aba565b6040516102d991906131ff565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613246565b610b36565b005b34801561031757600080fd5b50610332600480360381019061032d9190613191565b610c40565b005b34801561034057600080fd5b50610349610cc6565b6040516103569190613295565b60405180910390f35b34801561036b57600080fd5b50610386600480360381019061038191906132b0565b610cd4565b005b34801561039457600080fd5b506103af60048036038101906103aa9190613246565b610ce4565b6040516103bc9190613295565b60405180910390f35b3480156103d157600080fd5b506103da610eba565b6040516103e79190613295565b60405180910390f35b3480156103fc57600080fd5b50610405610ec0565b005b34801561041357600080fd5b5061042e600480360381019061042991906132b0565b610feb565b005b34801561043c57600080fd5b5061044561100b565b6040516104529190613295565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613191565b611011565b60405161048f9190613295565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190612fb6565b611155565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613191565b6111e4565b6040516104f591906131ff565b60405180910390f35b34801561050a57600080fd5b506105136111fa565b6040516105209190613139565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613191565b611288565b005b34801561055e57600080fd5b5061057960048036038101906105749190613303565b61130e565b6040516105869190613295565b60405180910390f35b34801561059b57600080fd5b506105a46113dd565b005b3480156105b257600080fd5b506105bb61151a565b005b3480156105c957600080fd5b506105d26115c2565b6040516105df91906131ff565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190613191565b6115ec565b005b34801561061d57600080fd5b50610626611672565b6040516106339190613139565b60405180910390f35b34801561064857600080fd5b50610651611704565b60405161065e9190613295565b60405180910390f35b610681600480360381019061067c9190613191565b61170a565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061335c565b6118ba565b005b3480156106b857600080fd5b506106c1611a31565b6040516106ce9190613295565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f9919061343d565b611a37565b005b34801561070c57600080fd5b5061072760048036038101906107229190613191565b611a8a565b6040516107349190613139565b60405180910390f35b34801561074957600080fd5b50610752611bab565b60405161075f919061309f565b60405180910390f35b34801561077457600080fd5b5061077d611bbe565b60405161078a9190613295565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b591906134c0565b611bc4565b6040516107c7919061309f565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190613303565b611c58565b005b34801561080557600080fd5b5061080e611e03565b60405161081b9190613295565b60405180910390f35b34801561083057600080fd5b50610839611e09565b6040516108469190613295565b60405180910390f35b610857611e32565b73ffffffffffffffffffffffffffffffffffffffff166108756115c2565b73ffffffffffffffffffffffffffffffffffffffff16146108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c29061354c565b60405180910390fd5b80601290816108da9190613778565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109a957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a215750610a2082611e3a565b5b9050919050565b606060028054610a379061359b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a639061359b565b8015610ab05780601f10610a8557610100808354040283529160200191610ab0565b820191906000526020600020905b815481529060010190602001808311610a9357829003601f168201915b5050505050905090565b6000610ac582611ea4565b610afb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b41826111e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ba8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc7611e32565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bf95750610bf781610bf2611e32565b611bc4565b155b15610c30576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3b838383611ede565b505050565b610c48611e32565b73ffffffffffffffffffffffffffffffffffffffff16610c666115c2565b73ffffffffffffffffffffffffffffffffffffffff1614610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061354c565b60405180910390fd5b80600a8190555050565b600060015460005403905090565b610cdf838383611f90565b505050565b6000610cef8361130e565b8210610d27576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610eaf576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e105750610ea2565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e5057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ea057868403610e97578195505050505050610eb4565b83806001019450505b505b8080600101915050610d33565b600080fd5b92915050565b600f5481565b610ec8611e32565b73ffffffffffffffffffffffffffffffffffffffff16610ee66115c2565b73ffffffffffffffffffffffffffffffffffffffff1614610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f339061354c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f629061387b565b60006040518083038185875af1925050503d8060008114610f9f576040519150601f19603f3d011682016040523d82523d6000602084013e610fa4565b606091505b5050905080610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf906138dc565b60405180910390fd5b50565b61100683838360405180602001604052806000815250611a37565b505050565b600e5481565b60008060005490506000805b8281101561111d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161110f578583036111065781945050505050611150565b82806001019350505b50808060010191505061101d565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61115d611e32565b73ffffffffffffffffffffffffffffffffffffffff1661117b6115c2565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c89061354c565b60405180910390fd5b80601190816111e09190613778565b5050565b60006111ef8261247f565b600001519050919050565b601180546112079061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546112339061359b565b80156112805780601f1061125557610100808354040283529160200191611280565b820191906000526020600020905b81548152906001019060200180831161126357829003601f168201915b505050505081565b611290611e32565b73ffffffffffffffffffffffffffffffffffffffff166112ae6115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb9061354c565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611375576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113e5611e32565b73ffffffffffffffffffffffffffffffffffffffff166114036115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611459576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114509061354c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611522611e32565b73ffffffffffffffffffffffffffffffffffffffff166115406115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d9061354c565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115f4611e32565b73ffffffffffffffffffffffffffffffffffffffff166116126115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061354c565b60405180910390fd5b80600c8190555050565b6060600380546116819061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546116ad9061359b565b80156116fa5780601f106116cf576101008083540402835291602001916116fa565b820191906000526020600020905b8154815290600101906020018083116116dd57829003601f168201915b5050505050905090565b600c5481565b601060009054906101000a900460ff16611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090613948565b60405180910390fd5b60016009546117689190613997565b81611771610cc6565b61177b9190613997565b106117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290613a17565b60405180910390fd5b6000600c5490506000600e549050600b546117d5336126fb565b1080156117e45750600b548311155b80156117f85750600a546117f6610cc6565b105b1561180757600b549050600091505b8083611812336126fb565b61181c9190613997565b111561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490613a83565b60405180910390fd5b81836118699190613aa3565b3410156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290613b31565b60405180910390fd5b6118b533846127ca565b505050565b6118c2611e32565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611926576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611933611e32565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119e0611e32565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a25919061309f565b60405180910390a35050565b600b5481565b611a42848484611f90565b611a4e848484846127e8565b611a84576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a9582611ea4565b611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613bc3565b60405180910390fd5b601060019054906101000a900460ff16611b785760128054611af59061359b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b219061359b565b8015611b6e5780601f10611b4357610100808354040283529160200191611b6e565b820191906000526020600020905b815481529060010190602001808311611b5157829003601f168201915b5050505050611ba4565b6011611b8383612966565b604051602001611b94929190613cee565b6040516020818303038152906040525b9050919050565b601060009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c60611e32565b73ffffffffffffffffffffffffffffffffffffffff16611c7e6115c2565b73ffffffffffffffffffffffffffffffffffffffff1614611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061354c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90613d8f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600d5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611ed7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f9b8261247f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611fc2611e32565b73ffffffffffffffffffffffffffffffffffffffff161480611ff55750611ff48260000151611fef611e32565b611bc4565b5b8061203a5750612003611e32565b73ffffffffffffffffffffffffffffffffffffffff1661202284610aba565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612073576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146120dc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612142576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214f8585856001612ac6565b61215f6000848460000151611ede565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361240f5760005481101561240e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124788585856001612acc565b5050505050565b612487612e19565b60008290506000548110156126c4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516126c257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125a65780925050506126f6565b5b6001156126c157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126bc5780925050506126f6565b6125a7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612762576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6127e4828260405180602001604052806000815250612ad2565b5050565b60006128098473ffffffffffffffffffffffffffffffffffffffff16611e0f565b15612959578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612832611e32565b8786866040518563ffffffff1660e01b81526004016128549493929190613e04565b6020604051808303816000875af192505050801561289057506040513d601f19601f8201168201806040525081019061288d9190613e65565b60015b612909573d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b506000815103612901576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061295e565b600190505b949350505050565b6060600082036129ad576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ac1565b600082905060005b600082146129df5780806129c890613e92565b915050600a826129d89190613f09565b91506129b5565b60008167ffffffffffffffff8111156129fb576129fa612e8b565b5b6040519080825280601f01601f191660200182016040528015612a2d5781602001600182028036833780820191505090505b5090505b60008514612aba57600182612a469190613f3a565b9150600a85612a559190613f6e565b6030612a619190613997565b60f81b818381518110612a7757612a76613f9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab39190613f09565b9450612a31565b8093505050505b919050565b50505050565b50505050565b612adf8383836001612ae4565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612b50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612b8a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b976000868387612ac6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612dfc57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612db05750612dae60008884886127e8565b155b15612de7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612d35565b508060008190555050612e126000868387612acc565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ec382612e7a565b810181811067ffffffffffffffff82111715612ee257612ee1612e8b565b5b80604052505050565b6000612ef5612e5c565b9050612f018282612eba565b919050565b600067ffffffffffffffff821115612f2157612f20612e8b565b5b612f2a82612e7a565b9050602081019050919050565b82818337600083830152505050565b6000612f59612f5484612f06565b612eeb565b905082815260208101848484011115612f7557612f74612e75565b5b612f80848285612f37565b509392505050565b600082601f830112612f9d57612f9c612e70565b5b8135612fad848260208601612f46565b91505092915050565b600060208284031215612fcc57612fcb612e66565b5b600082013567ffffffffffffffff811115612fea57612fe9612e6b565b5b612ff684828501612f88565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61303481612fff565b811461303f57600080fd5b50565b6000813590506130518161302b565b92915050565b60006020828403121561306d5761306c612e66565b5b600061307b84828501613042565b91505092915050565b60008115159050919050565b61309981613084565b82525050565b60006020820190506130b46000830184613090565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130f45780820151818401526020810190506130d9565b60008484015250505050565b600061310b826130ba565b61311581856130c5565b93506131258185602086016130d6565b61312e81612e7a565b840191505092915050565b600060208201905081810360008301526131538184613100565b905092915050565b6000819050919050565b61316e8161315b565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a6612e66565b5b60006131b58482850161317c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e9826131be565b9050919050565b6131f9816131de565b82525050565b600060208201905061321460008301846131f0565b92915050565b613223816131de565b811461322e57600080fd5b50565b6000813590506132408161321a565b92915050565b6000806040838503121561325d5761325c612e66565b5b600061326b85828601613231565b925050602061327c8582860161317c565b9150509250929050565b61328f8161315b565b82525050565b60006020820190506132aa6000830184613286565b92915050565b6000806000606084860312156132c9576132c8612e66565b5b60006132d786828701613231565b93505060206132e886828701613231565b92505060406132f98682870161317c565b9150509250925092565b60006020828403121561331957613318612e66565b5b600061332784828501613231565b91505092915050565b61333981613084565b811461334457600080fd5b50565b60008135905061335681613330565b92915050565b6000806040838503121561337357613372612e66565b5b600061338185828601613231565b925050602061339285828601613347565b9150509250929050565b600067ffffffffffffffff8211156133b7576133b6612e8b565b5b6133c082612e7a565b9050602081019050919050565b60006133e06133db8461339c565b612eeb565b9050828152602081018484840111156133fc576133fb612e75565b5b613407848285612f37565b509392505050565b600082601f83011261342457613423612e70565b5b81356134348482602086016133cd565b91505092915050565b6000806000806080858703121561345757613456612e66565b5b600061346587828801613231565b945050602061347687828801613231565b93505060406134878782880161317c565b925050606085013567ffffffffffffffff8111156134a8576134a7612e6b565b5b6134b48782880161340f565b91505092959194509250565b600080604083850312156134d7576134d6612e66565b5b60006134e585828601613231565b92505060206134f685828601613231565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135366020836130c5565b915061354182613500565b602082019050919050565b6000602082019050818103600083015261356581613529565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135b357607f821691505b6020821081036135c6576135c561356c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261362e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135f1565b61363886836135f1565b95508019841693508086168417925050509392505050565b6000819050919050565b600061367561367061366b8461315b565b613650565b61315b565b9050919050565b6000819050919050565b61368f8361365a565b6136a361369b8261367c565b8484546135fe565b825550505050565b600090565b6136b86136ab565b6136c3818484613686565b505050565b5b818110156136e7576136dc6000826136b0565b6001810190506136c9565b5050565b601f82111561372c576136fd816135cc565b613706846135e1565b81016020851015613715578190505b613729613721856135e1565b8301826136c8565b50505b505050565b600082821c905092915050565b600061374f60001984600802613731565b1980831691505092915050565b6000613768838361373e565b9150826002028217905092915050565b613781826130ba565b67ffffffffffffffff81111561379a57613799612e8b565b5b6137a4825461359b565b6137af8282856136eb565b600060209050601f8311600181146137e257600084156137d0578287015190505b6137da858261375c565b865550613842565b601f1984166137f0866135cc565b60005b82811015613818578489015182556001820191506020850194506020810190506137f3565b868310156138355784890151613831601f89168261373e565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b600061386560008361384a565b915061387082613855565b600082019050919050565b600061388682613858565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006138c66010836130c5565b91506138d182613890565b602082019050919050565b600060208201905081810360008301526138f5816138b9565b9050919050565b7f4e6f74206c697665000000000000000000000000000000000000000000000000600082015250565b60006139326008836130c5565b915061393d826138fc565b602082019050919050565b6000602082019050818103600083015261396181613925565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139a28261315b565b91506139ad8361315b565b92508282019050808211156139c5576139c4613968565b5b92915050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b6000613a016007836130c5565b9150613a0c826139cb565b602082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4d6178207065722077616c6c6574000000000000000000000000000000000000600082015250565b6000613a6d600e836130c5565b9150613a7882613a37565b602082019050919050565b60006020820190508181036000830152613a9c81613a60565b9050919050565b6000613aae8261315b565b9150613ab98361315b565b9250828202613ac78161315b565b91508282048414831517613ade57613add613968565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613b1b601d836130c5565b9150613b2682613ae5565b602082019050919050565b60006020820190508181036000830152613b4a81613b0e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613bad602f836130c5565b9150613bb882613b51565b604082019050919050565b60006020820190508181036000830152613bdc81613ba0565b9050919050565b600081905092915050565b60008154613bfb8161359b565b613c058186613be3565b94506001821660008114613c205760018114613c3557613c68565b60ff1983168652811515820286019350613c68565b613c3e856135cc565b60005b83811015613c6057815481890152600182019150602081019050613c41565b838801955050505b50505092915050565b6000613c7c826130ba565b613c868185613be3565b9350613c968185602086016130d6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613cd8600583613be3565b9150613ce382613ca2565b600582019050919050565b6000613cfa8285613bee565b9150613d068284613c71565b9150613d1182613ccb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d796026836130c5565b9150613d8482613d1d565b604082019050919050565b60006020820190508181036000830152613da881613d6c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613dd682613daf565b613de08185613dba565b9350613df08185602086016130d6565b613df981612e7a565b840191505092915050565b6000608082019050613e1960008301876131f0565b613e2660208301866131f0565b613e336040830185613286565b8181036060830152613e458184613dcb565b905095945050505050565b600081519050613e5f8161302b565b92915050565b600060208284031215613e7b57613e7a612e66565b5b6000613e8984828501613e50565b91505092915050565b6000613e9d8261315b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ecf57613ece613968565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f148261315b565b9150613f1f8361315b565b925082613f2f57613f2e613eda565b5b828204905092915050565b6000613f458261315b565b9150613f508361315b565b9250828203905081811115613f6857613f67613968565b5b92915050565b6000613f798261315b565b9150613f848361315b565b925082613f9457613f93613eda565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212202181499bef042061d90e90316774bc344ad1f9c2a5ee8fae0491f1f202f1730b64736f6c63430008120033

Deployed Bytecode Sourcemap

107:2522:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2004:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6016:410:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8629:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10173:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9750:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2204:102:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3248:278:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4836:1113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;412:31:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:201;;;;;;;;;;;;;:::i;:::-;;11334:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;373:33:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3812:731:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1912:86:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8445:122:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;513:21:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2312:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6485:203:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:11;;;;;;;;;;;;;:::i;:::-;;1824:82:13;;;;;;;;;;;;;:::i;:::-;;1061:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2108:90:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8791:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;299:34:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;671:693;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10476:294:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;258:35:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11579:332:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1482:336:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;449:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;181;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10836:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;218:34:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;339:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2004:98;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2092:3:13::1;2076:13;:19;;;;;;:::i;:::-;;2004:98:::0;:::o;6016:410:4:-;6158:4;6212:25;6197:40;;;:11;:40;;;;:104;;;;6268:33;6253:48;;;:11;:48;;;;6197:104;:170;;;;6332:35;6317:50;;;:11;:50;;;;6197:170;:222;;;;6383:36;6407:11;6383:23;:36::i;:::-;6197:222;6178:241;;6016:410;;;:::o;8629:98::-;8683:13;8715:5;8708:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8629:98;:::o;10173:236::-;10273:7;10301:16;10309:7;10301;:16::i;:::-;10296:64;;10326:34;;;;;;;;;;;;;;10296:64;10378:15;:24;10394:7;10378:24;;;;;;;;;;;;;;;;;;;;;10371:31;;10173:236;;;:::o;9750:362::-;9822:13;9838:24;9854:7;9838:15;:24::i;:::-;9822:40;;9882:5;9876:11;;:2;:11;;;9872:48;;9896:24;;;;;;;;;;;;;;9872:48;9951:5;9935:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9961:37;9978:5;9985:12;:10;:12::i;:::-;9961:16;:37::i;:::-;9960:38;9935:63;9931:136;;;10021:35;;;;;;;;;;;;;;9931:136;10077:28;10086:2;10090:7;10099:5;10077:8;:28::i;:::-;9812:300;9750:362;;:::o;2204:102:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2292:7:13::1;2276:13;:23;;;;2204:102:::0;:::o;3248:278:4:-;3309:7;3497:12;;3481:13;;:28;3474:35;;3248:278;:::o;11104:164::-;11233:28;11243:4;11249:2;11253:7;11233:9;:28::i;:::-;11104:164;;;:::o;4836:1113::-;4957:7;4993:16;5003:5;4993:9;:16::i;:::-;4984:5;:25;4980:61;;5018:23;;;;;;;;;;;;;;4980:61;5051:22;5076:13;;5051:38;;5099:19;5128:25;5324:9;5319:543;5339:14;5335:1;:18;5319:543;;;5378:31;5412:11;:14;5424:1;5412:14;;;;;;;;;;;5378:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5448:9;:16;;;5444:71;;;5488:8;;;5444:71;5562:1;5536:28;;:9;:14;;;:28;;;5532:109;;5608:9;:14;;;5588:34;;5532:109;5683:5;5662:26;;:17;:26;;;5658:190;;5731:5;5716:11;:20;5712:83;;5771:1;5764:8;;;;;;;;;5712:83;5816:13;;;;;;;5658:190;5360:502;5319:543;5355:3;;;;;;;5319:543;;;5934:8;;;4836:1113;;;;;:::o;412:31:13:-;;;;:::o;2426:201::-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2476:12:13::1;2502:10;2494:24;;2539:21;2494:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2475:99;;;2592:7;2584:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2465:162;2426:201::o:0;11334:179:4:-;11467:39;11484:4;11490:2;11494:7;11467:39;;;;;;;;;;;;:16;:39::i;:::-;11334:179;;;:::o;373:33:13:-;;;;:::o;3812:731:4:-;3911:7;3934:22;3959:13;;3934:38;;3982:19;4172:9;4167:320;4187:14;4183:1;:18;4167:320;;;4226:31;4260:11;:14;4272:1;4260:14;;;;;;;;;;;4226:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4297:9;:16;;;4292:181;;4356:5;4341:11;:20;4337:83;;4396:1;4389:8;;;;;;;;4337:83;4441:13;;;;;;;4292:181;4208:279;4203:3;;;;;;;4167:320;;;;4513:23;;;;;;;;;;;;;;3812:731;;;;:::o;1912:86:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1988:3:13::1;1978:7;:13;;;;;;:::i;:::-;;1912:86:::0;:::o;8445:122:4:-;8509:7;8535:20;8547:7;8535:11;:20::i;:::-;:25;;;8528:32;;8445:122;;;:::o;513:21:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2312:108::-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2406:7:13::1;2387:16;:26;;;;2312:108:::0;:::o;6485:203:4:-;6549:7;6589:1;6572:19;;:5;:19;;;6568:60;;6600:28;;;;;;;;;;;;;;6568:60;6653:12;:19;6666:5;6653:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6645:36;;6638:43;;6485:203;;;:::o;1693:145:11:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;1824:82:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1888:11:13::1;;;;;;;;;;;1887:12;1873:11;;:26;;;;;;;;;;;;;;;;;;1824:82::o:0;1061:85:11:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;2108:90:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2182:9:13::1;2174:5;:17;;;;2108:90:::0;:::o;8791:102:4:-;8847:13;8879:7;8872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8791:102;:::o;299:34:13:-;;;;:::o;671:693::-;738:11;;;;;;;;;;;730:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;819:1;807:9;;:13;;;;:::i;:::-;796:8;780:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;772:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;842:12;857:5;;842:20;;872:21;896:12;;872:36;;951:16;;923:25;937:10;923:13;:25::i;:::-;:44;:76;;;;;983:16;;971:8;:28;;923:76;:108;;;;;1018:13;;1002;:11;:13::i;:::-;:29;923:108;919:193;;;1063:16;;1047:32;;1100:1;1093:8;;919:193;1183:13;1171:8;1143:25;1157:10;1143:13;:25::i;:::-;:36;;;;:::i;:::-;:53;;1122:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:4;1267:8;:15;;;;:::i;:::-;1254:9;:28;;1246:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1326:31;1336:10;1348:8;1326:9;:31::i;:::-;720:644;;671:693;:::o;10476:294:4:-;10598:12;:10;:12::i;:::-;10586:24;;:8;:24;;;10582:54;;10619:17;;;;;;;;;;;;;;10582:54;10692:8;10647:18;:32;10666:12;:10;:12::i;:::-;10647:32;;;;;;;;;;;;;;;:42;10680:8;10647:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10744:8;10715:48;;10730:12;:10;:12::i;:::-;10715:48;;;10754:8;10715:48;;;;;;:::i;:::-;;;;;;;;10476:294;;:::o;258:35:13:-;;;;:::o;11579:332:4:-;11740:28;11750:4;11756:2;11760:7;11740:9;:28::i;:::-;11783:48;11806:4;11812:2;11816:7;11825:5;11783:22;:48::i;:::-;11778:127;;11854:40;;;;;;;;;;;;;;11778:127;11579:332;;;;:::o;1482:336:13:-;1569:13;1615:16;1623:7;1615;:16::i;:::-;1594:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;1722:8;;;;;;;;;;;:89;;1798:13;1722:89;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1757:7;1766:18;:7;:16;:18::i;:::-;1740:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1722:89;1714:97;;1482:336;;;:::o;449:31::-;;;;;;;;;;;;;:::o;181:::-;;;;:::o;10836:206:4:-;10973:4;11000:18;:25;11019:5;11000:25;;;;;;;;;;;;;;;:35;11026:8;11000:35;;;;;;;;;;;;;;;;;;;;;;;;;10993:42;;10836:206;;;;:::o;1987:240:11:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;::::0;2067:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;218:34:13:-;;;;:::o;339:28::-;;;;:::o;1160:320:0:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;12157:142:4:-;12214:4;12247:13;;12237:7;:23;:55;;;;;12265:11;:20;12277:7;12265:20;;;;;;;;;;;:27;;;;;;;;;;;;12264:28;12237:55;12230:62;;12157:142;;;:::o;19283:189::-;19420:2;19393:15;:24;19409:7;19393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19457:7;19453:2;19437:28;;19446:5;19437:28;;;;;;;;;;;;19283:189;;;:::o;14839:2092::-;14949:35;14987:20;14999:7;14987:11;:20::i;:::-;14949:58;;15018:22;15060:13;:18;;;15044:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;15094:50;15111:13;:18;;;15131:12;:10;:12::i;:::-;15094:16;:50::i;:::-;15044:100;:152;;;;15184:12;:10;:12::i;:::-;15160:36;;:20;15172:7;15160:11;:20::i;:::-;:36;;;15044:152;15018:179;;15213:17;15208:66;;15239:35;;;;;;;;;;;;;;15208:66;15310:4;15288:26;;:13;:18;;;:26;;;15284:67;;15323:28;;;;;;;;;;;;;;15284:67;15379:1;15365:16;;:2;:16;;;15361:52;;15390:23;;;;;;;;;;;;;;15361:52;15424:43;15446:4;15452:2;15456:7;15465:1;15424:21;:43::i;:::-;15529:49;15546:1;15550:7;15559:13;:18;;;15529:8;:49::i;:::-;15898:1;15868:12;:18;15881:4;15868:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15941:1;15913:12;:16;15926:2;15913:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:2;15957:11;:20;15969:7;15957:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;16046:15;16001:11;:20;16013:7;16001:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;16310:19;16342:1;16332:7;:11;16310:33;;16402:1;16361:43;;:11;:24;16373:11;16361:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16357:463;;16583:13;;16569:11;:27;16565:241;;;16652:13;:18;;;16620:11;:24;16632:11;16620:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16734:13;:53;;;16692:11;:24;16704:11;16692:24;;;;;;;;;;;:39;;;:95;;;;;;;;;;;;;;;;;;16565:241;16357:463;15844:986;16864:7;16860:2;16845:27;;16854:4;16845:27;;;;;;;;;;;;16882:42;16903:4;16909:2;16913:7;16922:1;16882:20;:42::i;:::-;14939:1992;;14839:2092;;;:::o;7304:1084::-;7389:21;;:::i;:::-;7426:12;7441:7;7426:22;;7494:13;;7487:4;:20;7483:841;;;7527:31;7561:11;:17;7573:4;7561:17;;;;;;;;;;;7527:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:9;:16;;;7596:714;;7671:1;7645:28;;:9;:14;;;:28;;;7641:99;;7708:9;7701:16;;;;;;7641:99;8037:255;8044:4;8037:255;;;8076:6;;;;;;;;8120:11;:17;8132:4;8120:17;;;;;;;;;;;8108:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:1;8167:28;;:9;:14;;;:28;;;8163:107;;8234:9;8227:16;;;;;;8163:107;8037:255;;;7596:714;7509:815;7483:841;8350:31;;;;;;;;;;;;;;7304:1084;;;;:::o;6694:204::-;6755:7;6795:1;6778:19;;:5;:19;;;6774:59;;6806:27;;;;;;;;;;;;;;6774:59;6858:12;:19;6871:5;6858:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;6850:41;;6843:48;;6694:204;;;:::o;12305:102::-;12373:27;12383:2;12387:8;12373:27;;;;;;;;;;;;:9;:27::i;:::-;12305:102;;:::o;20025:895::-;20175:4;20195:15;:2;:13;;;:15::i;:::-;20191:723;;;20262:2;20246:36;;;20304:12;:10;:12::i;:::-;20338:4;20364:7;20393:5;20246:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20226:636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20616:1;20599:6;:13;:18;20595:253;;20648:40;;;;;;;;;;;;;;20595:253;20800:6;20794:13;20785:6;20781:2;20777:15;20770:38;20226:636;20488:45;;;20478:55;;;:6;:55;;;;20471:62;;;;;20191:723;20899:4;20892:11;;20025:895;;;;;;;:::o;328:703:12:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;21551:154:4:-;;;;;:::o;22346:153::-;;;;;:::o;12758:157::-;12876:32;12882:2;12886:8;12896:5;12903:4;12876:5;:32::i;:::-;12758:157;;;:::o;13162:1435::-;13295:20;13318:13;;13295:36;;13359:1;13345:16;;:2;:16;;;13341:48;;13370:19;;;;;;;;;;;;;;13341:48;13415:1;13403:8;:13;13399:44;;13425:18;;;;;;;;;;;;;;13399:44;13454:61;13484:1;13488:2;13492:12;13506:8;13454:21;:61::i;:::-;13821:8;13786:12;:16;13799:2;13786:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13884:8;13844:12;:16;13857:2;13844:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13941:2;13908:11;:25;13920:12;13908:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14007:15;13957:11;:25;13969:12;13957:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14038:20;14061:12;14038:35;;14093:9;14088:380;14108:8;14104:1;:12;14088:380;;;14171:12;14167:2;14146:38;;14163:1;14146:38;;;;;;;;;;;;14227:4;:88;;;;;14256:59;14287:1;14291:2;14295:12;14309:5;14256:22;:59::i;:::-;14255:60;14227:88;14202:220;;;14363:40;;;;;;;;;;;;;;14202:220;14439:14;;;;;;;14118:3;;;;;;;14088:380;;;;14498:12;14482:13;:28;;;;13762:759;14530:60;14559:1;14563:2;14567:12;14581:8;14530:20;:60::i;:::-;13285:1312;13162:1435;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:102;621:6;672:2;668:7;663:2;656:5;652:14;648:28;638:38;;580:102;;;:::o;688:180::-;736:77;733:1;726:88;833:4;830:1;823:15;857:4;854:1;847:15;874:281;957:27;979:4;957:27;:::i;:::-;949:6;945:40;1087:6;1075:10;1072:22;1051:18;1039:10;1036:34;1033:62;1030:88;;;1098:18;;:::i;:::-;1030:88;1138:10;1134:2;1127:22;917:238;874:281;;:::o;1161:129::-;1195:6;1222:20;;:::i;:::-;1212:30;;1251:33;1279:4;1271:6;1251:33;:::i;:::-;1161:129;;;:::o;1296:308::-;1358:4;1448:18;1440:6;1437:30;1434:56;;;1470:18;;:::i;:::-;1434:56;1508:29;1530:6;1508:29;:::i;:::-;1500:37;;1592:4;1586;1582:15;1574:23;;1296:308;;;:::o;1610:146::-;1707:6;1702:3;1697;1684:30;1748:1;1739:6;1734:3;1730:16;1723:27;1610:146;;;:::o;1762:425::-;1840:5;1865:66;1881:49;1923:6;1881:49;:::i;:::-;1865:66;:::i;:::-;1856:75;;1954:6;1947:5;1940:21;1992:4;1985:5;1981:16;2030:3;2021:6;2016:3;2012:16;2009:25;2006:112;;;2037:79;;:::i;:::-;2006:112;2127:54;2174:6;2169:3;2164;2127:54;:::i;:::-;1846:341;1762:425;;;;;:::o;2207:340::-;2263:5;2312:3;2305:4;2297:6;2293:17;2289:27;2279:122;;2320:79;;:::i;:::-;2279:122;2437:6;2424:20;2462:79;2537:3;2529:6;2522:4;2514:6;2510:17;2462:79;:::i;:::-;2453:88;;2269:278;2207:340;;;;:::o;2553:509::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2825:1;2814:9;2810:17;2797:31;2855:18;2847:6;2844:30;2841:117;;;2877:79;;:::i;:::-;2841:117;2982:63;3037:7;3028:6;3017:9;3013:22;2982:63;:::i;:::-;2972:73;;2768:287;2553:509;;;;:::o;3068:149::-;3104:7;3144:66;3137:5;3133:78;3122:89;;3068:149;;;:::o;3223:120::-;3295:23;3312:5;3295:23;:::i;:::-;3288:5;3285:34;3275:62;;3333:1;3330;3323:12;3275:62;3223:120;:::o;3349:137::-;3394:5;3432:6;3419:20;3410:29;;3448:32;3474:5;3448:32;:::i;:::-;3349:137;;;;:::o;3492:327::-;3550:6;3599:2;3587:9;3578:7;3574:23;3570:32;3567:119;;;3605:79;;:::i;:::-;3567:119;3725:1;3750:52;3794:7;3785:6;3774:9;3770:22;3750:52;:::i;:::-;3740:62;;3696:116;3492:327;;;;:::o;3825:90::-;3859:7;3902:5;3895:13;3888:21;3877:32;;3825:90;;;:::o;3921:109::-;4002:21;4017:5;4002:21;:::i;:::-;3997:3;3990:34;3921:109;;:::o;4036:210::-;4123:4;4161:2;4150:9;4146:18;4138:26;;4174:65;4236:1;4225:9;4221:17;4212:6;4174:65;:::i;:::-;4036:210;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:122::-;5642:24;5660:5;5642:24;:::i;:::-;5635:5;5632:35;5622:63;;5681:1;5678;5671:12;5622:63;5569:122;:::o;5697:139::-;5743:5;5781:6;5768:20;5759:29;;5797:33;5824:5;5797:33;:::i;:::-;5697:139;;;;:::o;5842:329::-;5901:6;5950:2;5938:9;5929:7;5925:23;5921:32;5918:119;;;5956:79;;:::i;:::-;5918:119;6076:1;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6047:117;5842:329;;;;:::o;6177:126::-;6214:7;6254:42;6247:5;6243:54;6232:65;;6177:126;;;:::o;6309:96::-;6346:7;6375:24;6393:5;6375:24;:::i;:::-;6364:35;;6309:96;;;:::o;6411:118::-;6498:24;6516:5;6498:24;:::i;:::-;6493:3;6486:37;6411:118;;:::o;6535:222::-;6628:4;6666:2;6655:9;6651:18;6643:26;;6679:71;6747:1;6736:9;6732:17;6723:6;6679:71;:::i;:::-;6535:222;;;;:::o;6763:122::-;6836:24;6854:5;6836:24;:::i;:::-;6829:5;6826:35;6816:63;;6875:1;6872;6865:12;6816:63;6763:122;:::o;6891:139::-;6937:5;6975:6;6962:20;6953:29;;6991:33;7018:5;6991:33;:::i;:::-;6891:139;;;;:::o;7036:474::-;7104:6;7112;7161:2;7149:9;7140:7;7136:23;7132:32;7129:119;;;7167:79;;:::i;:::-;7129:119;7287:1;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7258:117;7414:2;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7385:118;7036:474;;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:182::-;12231:34;12227:1;12219:6;12215:14;12208:58;12091:182;:::o;12279:366::-;12421:3;12442:67;12506:2;12501:3;12442:67;:::i;:::-;12435:74;;12518:93;12607:3;12518:93;:::i;:::-;12636:2;12631:3;12627:12;12620:19;;12279:366;;;:::o;12651:419::-;12817:4;12855:2;12844:9;12840:18;12832:26;;12904:9;12898:4;12894:20;12890:1;12879:9;12875:17;12868:47;12932:131;13058:4;12932:131;:::i;:::-;12924:139;;12651:419;;;:::o;13076:180::-;13124:77;13121:1;13114:88;13221:4;13218:1;13211:15;13245:4;13242:1;13235:15;13262:320;13306:6;13343:1;13337:4;13333:12;13323:22;;13390:1;13384:4;13380:12;13411:18;13401:81;;13467:4;13459:6;13455:17;13445:27;;13401:81;13529:2;13521:6;13518:14;13498:18;13495:38;13492:84;;13548:18;;:::i;:::-;13492:84;13313:269;13262:320;;;:::o;13588:141::-;13637:4;13660:3;13652:11;;13683:3;13680:1;13673:14;13717:4;13714:1;13704:18;13696:26;;13588:141;;;:::o;13735:93::-;13772:6;13819:2;13814;13807:5;13803:14;13799:23;13789:33;;13735:93;;;:::o;13834:107::-;13878:8;13928:5;13922:4;13918:16;13897:37;;13834:107;;;;:::o;13947:393::-;14016:6;14066:1;14054:10;14050:18;14089:97;14119:66;14108:9;14089:97;:::i;:::-;14207:39;14237:8;14226:9;14207:39;:::i;:::-;14195:51;;14279:4;14275:9;14268:5;14264:21;14255:30;;14328:4;14318:8;14314:19;14307:5;14304:30;14294:40;;14023:317;;13947:393;;;;;:::o;14346:60::-;14374:3;14395:5;14388:12;;14346:60;;;:::o;14412:142::-;14462:9;14495:53;14513:34;14522:24;14540:5;14522:24;:::i;:::-;14513:34;:::i;:::-;14495:53;:::i;:::-;14482:66;;14412:142;;;:::o;14560:75::-;14603:3;14624:5;14617:12;;14560:75;;;:::o;14641:269::-;14751:39;14782:7;14751:39;:::i;:::-;14812:91;14861:41;14885:16;14861:41;:::i;:::-;14853:6;14846:4;14840:11;14812:91;:::i;:::-;14806:4;14799:105;14717:193;14641:269;;;:::o;14916:73::-;14961:3;14916:73;:::o;14995:189::-;15072:32;;:::i;:::-;15113:65;15171:6;15163;15157:4;15113:65;:::i;:::-;15048:136;14995:189;;:::o;15190:186::-;15250:120;15267:3;15260:5;15257:14;15250:120;;;15321:39;15358:1;15351:5;15321:39;:::i;:::-;15294:1;15287:5;15283:13;15274:22;;15250:120;;;15190:186;;:::o;15382:543::-;15483:2;15478:3;15475:11;15472:446;;;15517:38;15549:5;15517:38;:::i;:::-;15601:29;15619:10;15601:29;:::i;:::-;15591:8;15587:44;15784:2;15772:10;15769:18;15766:49;;;15805:8;15790:23;;15766:49;15828:80;15884:22;15902:3;15884:22;:::i;:::-;15874:8;15870:37;15857:11;15828:80;:::i;:::-;15487:431;;15472:446;15382:543;;;:::o;15931:117::-;15985:8;16035:5;16029:4;16025:16;16004:37;;15931:117;;;;:::o;16054:169::-;16098:6;16131:51;16179:1;16175:6;16167:5;16164:1;16160:13;16131:51;:::i;:::-;16127:56;16212:4;16206;16202:15;16192:25;;16105:118;16054:169;;;;:::o;16228:295::-;16304:4;16450:29;16475:3;16469:4;16450:29;:::i;:::-;16442:37;;16512:3;16509:1;16505:11;16499:4;16496:21;16488:29;;16228:295;;;;:::o;16528:1395::-;16645:37;16678:3;16645:37;:::i;:::-;16747:18;16739:6;16736:30;16733:56;;;16769:18;;:::i;:::-;16733:56;16813:38;16845:4;16839:11;16813:38;:::i;:::-;16898:67;16958:6;16950;16944:4;16898:67;:::i;:::-;16992:1;17016:4;17003:17;;17048:2;17040:6;17037:14;17065:1;17060:618;;;;17722:1;17739:6;17736:77;;;17788:9;17783:3;17779:19;17773:26;17764:35;;17736:77;17839:67;17899:6;17892:5;17839:67;:::i;:::-;17833:4;17826:81;17695:222;17030:887;;17060:618;17112:4;17108:9;17100:6;17096:22;17146:37;17178:4;17146:37;:::i;:::-;17205:1;17219:208;17233:7;17230:1;17227:14;17219:208;;;17312:9;17307:3;17303:19;17297:26;17289:6;17282:42;17363:1;17355:6;17351:14;17341:24;;17410:2;17399:9;17395:18;17382:31;;17256:4;17253:1;17249:12;17244:17;;17219:208;;;17455:6;17446:7;17443:19;17440:179;;;17513:9;17508:3;17504:19;17498:26;17556:48;17598:4;17590:6;17586:17;17575:9;17556:48;:::i;:::-;17548:6;17541:64;17463:156;17440:179;17665:1;17661;17653:6;17649:14;17645:22;17639:4;17632:36;17067:611;;;17030:887;;16620:1303;;;16528:1395;;:::o;17929:147::-;18030:11;18067:3;18052:18;;17929:147;;;;:::o;18082:114::-;;:::o;18202:398::-;18361:3;18382:83;18463:1;18458:3;18382:83;:::i;:::-;18375:90;;18474:93;18563:3;18474:93;:::i;:::-;18592:1;18587:3;18583:11;18576:18;;18202:398;;;:::o;18606:379::-;18790:3;18812:147;18955:3;18812:147;:::i;:::-;18805:154;;18976:3;18969:10;;18606:379;;;:::o;18991:166::-;19131:18;19127:1;19119:6;19115:14;19108:42;18991:166;:::o;19163:366::-;19305:3;19326:67;19390:2;19385:3;19326:67;:::i;:::-;19319:74;;19402:93;19491:3;19402:93;:::i;:::-;19520:2;19515:3;19511:12;19504:19;;19163:366;;;:::o;19535:419::-;19701:4;19739:2;19728:9;19724:18;19716:26;;19788:9;19782:4;19778:20;19774:1;19763:9;19759:17;19752:47;19816:131;19942:4;19816:131;:::i;:::-;19808:139;;19535:419;;;:::o;19960:158::-;20100:10;20096:1;20088:6;20084:14;20077:34;19960:158;:::o;20124:365::-;20266:3;20287:66;20351:1;20346:3;20287:66;:::i;:::-;20280:73;;20362:93;20451:3;20362:93;:::i;:::-;20480:2;20475:3;20471:12;20464:19;;20124:365;;;:::o;20495:419::-;20661:4;20699:2;20688:9;20684:18;20676:26;;20748:9;20742:4;20738:20;20734:1;20723:9;20719:17;20712:47;20776:131;20902:4;20776:131;:::i;:::-;20768:139;;20495:419;;;:::o;20920:180::-;20968:77;20965:1;20958:88;21065:4;21062:1;21055:15;21089:4;21086:1;21079:15;21106:191;21146:3;21165:20;21183:1;21165:20;:::i;:::-;21160:25;;21199:20;21217:1;21199:20;:::i;:::-;21194:25;;21242:1;21239;21235:9;21228:16;;21263:3;21260:1;21257:10;21254:36;;;21270:18;;:::i;:::-;21254:36;21106:191;;;;:::o;21303:157::-;21443:9;21439:1;21431:6;21427:14;21420:33;21303:157;:::o;21466:365::-;21608:3;21629:66;21693:1;21688:3;21629:66;:::i;:::-;21622:73;;21704:93;21793:3;21704:93;:::i;:::-;21822:2;21817:3;21813:12;21806:19;;21466:365;;;:::o;21837:419::-;22003:4;22041:2;22030:9;22026:18;22018:26;;22090:9;22084:4;22080:20;22076:1;22065:9;22061:17;22054:47;22118:131;22244:4;22118:131;:::i;:::-;22110:139;;21837:419;;;:::o;22262:164::-;22402:16;22398:1;22390:6;22386:14;22379:40;22262:164;:::o;22432:366::-;22574:3;22595:67;22659:2;22654:3;22595:67;:::i;:::-;22588:74;;22671:93;22760:3;22671:93;:::i;:::-;22789:2;22784:3;22780:12;22773:19;;22432:366;;;:::o;22804:419::-;22970:4;23008:2;22997:9;22993:18;22985:26;;23057:9;23051:4;23047:20;23043:1;23032:9;23028:17;23021:47;23085:131;23211:4;23085:131;:::i;:::-;23077:139;;22804:419;;;:::o;23229:410::-;23269:7;23292:20;23310:1;23292:20;:::i;:::-;23287:25;;23326:20;23344:1;23326:20;:::i;:::-;23321:25;;23381:1;23378;23374:9;23403:30;23421:11;23403:30;:::i;:::-;23392:41;;23582:1;23573:7;23569:15;23566:1;23563:22;23543:1;23536:9;23516:83;23493:139;;23612:18;;:::i;:::-;23493:139;23277:362;23229:410;;;;:::o;23645:179::-;23785:31;23781:1;23773:6;23769:14;23762:55;23645:179;:::o;23830:366::-;23972:3;23993:67;24057:2;24052:3;23993:67;:::i;:::-;23986:74;;24069:93;24158:3;24069:93;:::i;:::-;24187:2;24182:3;24178:12;24171:19;;23830:366;;;:::o;24202:419::-;24368:4;24406:2;24395:9;24391:18;24383:26;;24455:9;24449:4;24445:20;24441:1;24430:9;24426:17;24419:47;24483:131;24609:4;24483:131;:::i;:::-;24475:139;;24202:419;;;:::o;24627:234::-;24767:34;24763:1;24755:6;24751:14;24744:58;24836:17;24831:2;24823:6;24819:15;24812:42;24627:234;:::o;24867:366::-;25009:3;25030:67;25094:2;25089:3;25030:67;:::i;:::-;25023:74;;25106:93;25195:3;25106:93;:::i;:::-;25224:2;25219:3;25215:12;25208:19;;24867:366;;;:::o;25239:419::-;25405:4;25443:2;25432:9;25428:18;25420:26;;25492:9;25486:4;25482:20;25478:1;25467:9;25463:17;25456:47;25520:131;25646:4;25520:131;:::i;:::-;25512:139;;25239:419;;;:::o;25664:148::-;25766:11;25803:3;25788:18;;25664:148;;;;:::o;25842:874::-;25945:3;25982:5;25976:12;26011:36;26037:9;26011:36;:::i;:::-;26063:89;26145:6;26140:3;26063:89;:::i;:::-;26056:96;;26183:1;26172:9;26168:17;26199:1;26194:166;;;;26374:1;26369:341;;;;26161:549;;26194:166;26278:4;26274:9;26263;26259:25;26254:3;26247:38;26340:6;26333:14;26326:22;26318:6;26314:35;26309:3;26305:45;26298:52;;26194:166;;26369:341;26436:38;26468:5;26436:38;:::i;:::-;26496:1;26510:154;26524:6;26521:1;26518:13;26510:154;;;26598:7;26592:14;26588:1;26583:3;26579:11;26572:35;26648:1;26639:7;26635:15;26624:26;;26546:4;26543:1;26539:12;26534:17;;26510:154;;;26693:6;26688:3;26684:16;26677:23;;26376:334;;26161:549;;25949:767;;25842:874;;;;:::o;26722:390::-;26828:3;26856:39;26889:5;26856:39;:::i;:::-;26911:89;26993:6;26988:3;26911:89;:::i;:::-;26904:96;;27009:65;27067:6;27062:3;27055:4;27048:5;27044:16;27009:65;:::i;:::-;27099:6;27094:3;27090:16;27083:23;;26832:280;26722:390;;;;:::o;27118:155::-;27258:7;27254:1;27246:6;27242:14;27235:31;27118:155;:::o;27279:400::-;27439:3;27460:84;27542:1;27537:3;27460:84;:::i;:::-;27453:91;;27553:93;27642:3;27553:93;:::i;:::-;27671:1;27666:3;27662:11;27655:18;;27279:400;;;:::o;27685:695::-;27963:3;27985:92;28073:3;28064:6;27985:92;:::i;:::-;27978:99;;28094:95;28185:3;28176:6;28094:95;:::i;:::-;28087:102;;28206:148;28350:3;28206:148;:::i;:::-;28199:155;;28371:3;28364:10;;27685:695;;;;;:::o;28386:225::-;28526:34;28522:1;28514:6;28510:14;28503:58;28595:8;28590:2;28582:6;28578:15;28571:33;28386:225;:::o;28617:366::-;28759:3;28780:67;28844:2;28839:3;28780:67;:::i;:::-;28773:74;;28856:93;28945:3;28856:93;:::i;:::-;28974:2;28969:3;28965:12;28958:19;;28617:366;;;:::o;28989:419::-;29155:4;29193:2;29182:9;29178:18;29170:26;;29242:9;29236:4;29232:20;29228:1;29217:9;29213:17;29206:47;29270:131;29396:4;29270:131;:::i;:::-;29262:139;;28989:419;;;:::o;29414:98::-;29465:6;29499:5;29493:12;29483:22;;29414:98;;;:::o;29518:168::-;29601:11;29635:6;29630:3;29623:19;29675:4;29670:3;29666:14;29651:29;;29518:168;;;;:::o;29692:373::-;29778:3;29806:38;29838:5;29806:38;:::i;:::-;29860:70;29923:6;29918:3;29860:70;:::i;:::-;29853:77;;29939:65;29997:6;29992:3;29985:4;29978:5;29974:16;29939:65;:::i;:::-;30029:29;30051:6;30029:29;:::i;:::-;30024:3;30020:39;30013:46;;29782:283;29692:373;;;;:::o;30071:640::-;30266:4;30304:3;30293:9;30289:19;30281:27;;30318:71;30386:1;30375:9;30371:17;30362:6;30318:71;:::i;:::-;30399:72;30467:2;30456:9;30452:18;30443:6;30399:72;:::i;:::-;30481;30549:2;30538:9;30534:18;30525:6;30481:72;:::i;:::-;30600:9;30594:4;30590:20;30585:2;30574:9;30570:18;30563:48;30628:76;30699:4;30690:6;30628:76;:::i;:::-;30620:84;;30071:640;;;;;;;:::o;30717:141::-;30773:5;30804:6;30798:13;30789:22;;30820:32;30846:5;30820:32;:::i;:::-;30717:141;;;;:::o;30864:349::-;30933:6;30982:2;30970:9;30961:7;30957:23;30953:32;30950:119;;;30988:79;;:::i;:::-;30950:119;31108:1;31133:63;31188:7;31179:6;31168:9;31164:22;31133:63;:::i;:::-;31123:73;;31079:127;30864:349;;;;:::o;31219:233::-;31258:3;31281:24;31299:5;31281:24;:::i;:::-;31272:33;;31327:66;31320:5;31317:77;31314:103;;31397:18;;:::i;:::-;31314:103;31444:1;31437:5;31433:13;31426:20;;31219:233;;;:::o;31458:180::-;31506:77;31503:1;31496:88;31603:4;31600:1;31593:15;31627:4;31624:1;31617:15;31644:185;31684:1;31701:20;31719:1;31701:20;:::i;:::-;31696:25;;31735:20;31753:1;31735:20;:::i;:::-;31730:25;;31774:1;31764:35;;31779:18;;:::i;:::-;31764:35;31821:1;31818;31814:9;31809:14;;31644:185;;;;:::o;31835:194::-;31875:4;31895:20;31913:1;31895:20;:::i;:::-;31890:25;;31929:20;31947:1;31929:20;:::i;:::-;31924:25;;31973:1;31970;31966:9;31958:17;;31997:1;31991:4;31988:11;31985:37;;;32002:18;;:::i;:::-;31985:37;31835:194;;;;:::o;32035:176::-;32067:1;32084:20;32102:1;32084:20;:::i;:::-;32079:25;;32118:20;32136:1;32118:20;:::i;:::-;32113:25;;32157:1;32147:35;;32162:18;;:::i;:::-;32147:35;32203:1;32200;32196:9;32191:14;;32035:176;;;;:::o;32217:180::-;32265:77;32262:1;32255:88;32362:4;32359:1;32352:15;32386:4;32383:1;32376:15

Swarm Source

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