ETH Price: $3,458.27 (+0.66%)

Token

ChimpClub (CHIMP)
 

Overview

Max Total Supply

1,880 CHIMP

Holders

673

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Chimp Club is a collection of 10,000 handcrafted and randomly assembled Chimps living on the Ethereum blockchain. Our Club is community-driven, holding a Chimp allows you to take part in coordinating the Club's treasury, development, and direction.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChimpClub

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 13: ChimpClub_NFT.sol
// SPDX-License-Identifier: MIT
/*

01000011011010000110100101101101011100000010111001000011011011000111010101100010 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////////////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@%/////////////////////////////@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@//////////////////////////////////@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@////////////////////////////////////@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@//////////////////////////////////////@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@%////////////////////////////////////////@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@(///////////////////////////////////////////@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@(/////////////////////////////////////////////(@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@///////////////////////////////////////////////@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@////////////////////////////////////////////////@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@/////////////////////////////////////////////////@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@//////////////////////////////////////////////#@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@///////////%@@@&((((((((((((((((((((@@,      @@@,,,,,,,*@@@@@@
@@@@@@@@@@@@@,,,,,@@@@((((((((((@            @(((((@               @,,,,,,,/@@@@
@@@@@@@@@@,,,,,,,,,@(((((((((@                  @@                   @,,,,,,@@@@
@@@@@@@@,,,,,,,,,,,@(((((((((                    ,       @&@@@@       &,,,,,@@@@
@@@@@@@@,,,,,,@*,,,@(((((((@       @@@@@@@        @      @@@@@@@@      @,,,@@@@@
@@@@@@@@,,,,,,,,@,,@((((#@(#       @@@@@@@@       /      %@@@@@@@      @,,@@@@@@
@@@@@@@@*,,,,@,,,@,@(@,,,,,@        @@@@@@        @                   &@@@@@@@@@
@@@@@@@@@@,,,,,,,,,@,,,,,,,,@                    @                   @@@@@@@@@@@
@@@@@@@@@@@@,,,,,,@,,,,,,,,,,(/                .&,,&%              @,@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@,,,,,,@,,,,,,,@&          @@,,,,,,,,,*@@@@@@@/,,,,,,@@@@@@@@@@
@@@@@@@@@@@@@@@@@@,,,,,@,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@
@@@@@@@@@@@@@@@@@(,,,,,,,,,,,@@(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@
@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@
@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,&@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@#((((((@#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(@(@@@@@@@@@@@@@@@
@@@@@@@@@@@@%(((((((((((((((@@%,,,,,,,,,,,,,,,,,,,,,,,,,,,@@((((((((((@@@@@@@@@@
@@@@@@@@@@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((@@@@@@@
@@@@@@@@((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((@@@@@@
@@@@@@&((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%@@@@
@@@@@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%@@@
@@@@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((@@@
@@@%(((((((((((((((%((((((((((((((((((((((((((((((((((((((((((((((@(((((((((((@@
@@@(((((((((((((((@((((((((((((((((((((((((((((((((((((((((((((((((&(((((((((((@
@@(((((((((((((((@(((((((((((((((((((((((((((((((((((((((((((((((((@(((((((((((@
@%(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((&((((((((((JC


*/
pragma solidity ^0.8.0;

import "ERC721.sol";
import "Ownable.sol";
import "ERC721Enumerable.sol";

contract ChimpClub is ERC721, ERC721Enumerable, Ownable {
    string public PROVENANCE;
    bool public saleIsActive = false;
    string private _baseURIextended;

    bool public isAllowListActive = false;
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant MAX_PUBLIC_MINT = 10;
    uint256 public constant PRICE_PER_TOKEN = 0.05 ether;

    mapping(address => uint8) private _allowList;

    constructor() ERC721("ChimpClub", "CHIMP") {
    }

    function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
        isAllowListActive = _isAllowListActive;
    }

    function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _allowList[addresses[i]] = numAllowedToMint;
        }
    }

    function numAvailableToMint(address addr) external view returns (uint8) {
        return _allowList[addr];
    }

    function mintAllowList(uint8 numberOfTokens) external payable {
        uint256 ts = totalSupply();
        require(isAllowListActive, "Allow list is not active");
        require(numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct");

        _allowList[msg.sender] -= numberOfTokens;
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

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

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function reserve(uint256 n) public onlyOwner {
      uint supply = totalSupply();
      uint i;
      for (i = 0; i < n; i++) {
          _safeMint(msg.sender, supply + i);
      }
    }

    function setSaleState(bool newState) public onlyOwner {
        saleIsActive = newState;
    }

    function mint(uint numberOfTokens) public payable {
        uint256 ts = totalSupply();
        require(saleIsActive, "Sale must be active to mint tokens");
        require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 13: 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) {
        return msg.data;
    }
}

File 4 of 13: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC165.sol";

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

File 5 of 13: ERC721.sol
// SPDX-License-Identifier: MIT

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 6 of 13: 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 13: 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 13: 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 13: 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 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 13: 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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT

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"},{"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":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506000600e60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600981526020017f4368696d70436c756200000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4348494d500000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620001dc565b508060019080519060200190620000e5929190620001dc565b50505062000108620000fc6200010e60201b60201c565b6200011660201b60201c565b620002f1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ea906200028c565b90600052602060002090601f0160209004810192826200020e57600085556200025a565b82601f106200022957805160ff19168380011785556200025a565b828001600101855582156200025a579182015b82811115620002595782518255916020019190600101906200023c565b5b5090506200026991906200026d565b5090565b5b80821115620002885760008160009055506001016200026e565b5090565b60006002820490506001821680620002a557607f821691505b60208210811415620002bc57620002bb620002c2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6146b980620003016000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063b88d4fde116100a0578063ddff5b1c1161006f578063ddff5b1c14610758578063e985e9c514610774578063eb8d2444146107b1578063f2fde38b146107dc578063ffe630b51461080557610204565b8063b88d4fde1461068c578063c04a2836146106b5578063c4e37095146106f2578063c87b56dd1461071b57610204565b8063833b9499116100e7578063833b9499146105c65780638da5cb5b146105f157806395d89b411461061c578063a0712d6814610647578063a22cb4651461066357610204565b8063715018a614610534578063718bc4af1461054b578063819b25ba146105745780638295784d1461059d57610204565b806332cb6b0c1161019b57806355f804b31161016a57806355f804b31461043b5780636352211e146104645780636373a6b1146104a157806365f13097146104cc57806370a08231146104f757610204565b806332cb6b0c146103935780633ccfd60b146103be57806342842e0e146103d55780634f6ccce7146103fe57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd1461030257806329fc6bae1461032b5780632f745c591461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613395565b61082e565b60405161023d9190613e44565b60405180910390f35b34801561025257600080fd5b5061025b610840565b6040516102689190613e5f565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613428565b6108d2565b6040516102a59190613ddd565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906132d8565b610957565b005b3480156102e357600080fd5b506102ec610a6f565b6040516102f99190614181565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906131d2565b610a7c565b005b34801561033757600080fd5b50610340610adc565b60405161034d9190613e44565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906132d8565b610aef565b60405161038a9190614181565b60405180910390f35b34801561039f57600080fd5b506103a8610b94565b6040516103b59190614181565b60405180910390f35b3480156103ca57600080fd5b506103d3610b9a565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906131d2565b610c65565b005b34801561040a57600080fd5b5061042560048036038101906104209190613428565b610c85565b6040516104329190614181565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d91906133e7565b610d1c565b005b34801561047057600080fd5b5061048b60048036038101906104869190613428565b610db2565b6040516104989190613ddd565b60405180910390f35b3480156104ad57600080fd5b506104b6610e64565b6040516104c39190613e5f565b60405180910390f35b3480156104d857600080fd5b506104e1610ef2565b6040516104ee9190614181565b60405180910390f35b34801561050357600080fd5b5061051e6004803603810190610519919061316d565b610ef7565b60405161052b9190614181565b60405180910390f35b34801561054057600080fd5b50610549610faf565b005b34801561055757600080fd5b50610572600480360381019061056d919061336c565b611037565b005b34801561058057600080fd5b5061059b60048036038101906105969190613428565b6110d0565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613314565b611190565b005b3480156105d257600080fd5b506105db6112d8565b6040516105e89190614181565b60405180910390f35b3480156105fd57600080fd5b506106066112e3565b6040516106139190613ddd565b60405180910390f35b34801561062857600080fd5b5061063161130d565b60405161063e9190613e5f565b60405180910390f35b610661600480360381019061065c9190613428565b61139f565b005b34801561066f57600080fd5b5061068a6004803603810190610685919061329c565b61151b565b005b34801561069857600080fd5b506106b360048036038101906106ae9190613221565b61169c565b005b3480156106c157600080fd5b506106dc60048036038101906106d7919061316d565b6116fe565b6040516106e9919061419c565b60405180910390f35b3480156106fe57600080fd5b506107196004803603810190610714919061336c565b611754565b005b34801561072757600080fd5b50610742600480360381019061073d9190613428565b6117ed565b60405161074f9190613e5f565b60405180910390f35b610772600480360381019061076d9190613451565b611894565b005b34801561078057600080fd5b5061079b60048036038101906107969190613196565b611add565b6040516107a89190613e44565b60405180910390f35b3480156107bd57600080fd5b506107c6611b71565b6040516107d39190613e44565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe919061316d565b611b84565b005b34801561081157600080fd5b5061082c600480360381019061082791906133e7565b611c7c565b005b600061083982611d12565b9050919050565b60606000805461084f90614497565b80601f016020809104026020016040519081016040528092919081815260200182805461087b90614497565b80156108c85780601f1061089d576101008083540402835291602001916108c8565b820191906000526020600020905b8154815290600101906020018083116108ab57829003601f168201915b5050505050905090565b60006108dd82611d8c565b61091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390614021565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096282610db2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca906140c1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109f2611df8565b73ffffffffffffffffffffffffffffffffffffffff161480610a215750610a2081610a1b611df8565b611add565b5b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613fa1565b60405180910390fd5b610a6a8383611e00565b505050565b6000600880549050905090565b610a8d610a87611df8565b82611eb9565b610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390614121565b60405180910390fd5b610ad7838383611f97565b505050565b600e60009054906101000a900460ff1681565b6000610afa83610ef7565b8210610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613e81565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610ba2611df8565b73ffffffffffffffffffffffffffffffffffffffff16610bc06112e3565b73ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90614041565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c61573d6000803e3d6000fd5b5050565b610c808383836040518060200160405280600081525061169c565b505050565b6000610c8f610a6f565b8210610cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc790614141565b60405180910390fd5b60088281548110610d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d24611df8565b73ffffffffffffffffffffffffffffffffffffffff16610d426112e3565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90614041565b60405180910390fd5b80600d9080519060200190610dae929190612f32565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613fe1565b60405180910390fd5b80915050919050565b600b8054610e7190614497565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9d90614497565b8015610eea5780601f10610ebf57610100808354040283529160200191610eea565b820191906000526020600020905b815481529060010190602001808311610ecd57829003601f168201915b505050505081565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613fc1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fb7611df8565b73ffffffffffffffffffffffffffffffffffffffff16610fd56112e3565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290614041565b60405180910390fd5b61103560006121f3565b565b61103f611df8565b73ffffffffffffffffffffffffffffffffffffffff1661105d6112e3565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614041565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6110d8611df8565b73ffffffffffffffffffffffffffffffffffffffff166110f66112e3565b73ffffffffffffffffffffffffffffffffffffffff161461114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390614041565b60405180910390fd5b6000611156610a6f565b905060005b8281101561118b57611178338284611173919061428b565b6122b9565b8080611183906144c9565b91505061115b565b505050565b611198611df8565b73ffffffffffffffffffffffffffffffffffffffff166111b66112e3565b73ffffffffffffffffffffffffffffffffffffffff161461120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614041565b60405180910390fd5b60005b838390508110156112d25781600f6000868685818110611258577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061126d919061316d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806112ca906144c9565b91505061120f565b50505050565b66b1a2bc2ec5000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461131c90614497565b80601f016020809104026020016040519081016040528092919081815260200182805461134890614497565b80156113955780601f1061136a57610100808354040283529160200191611395565b820191906000526020600020905b81548152906001019060200180831161137857829003601f168201915b5050505050905090565b60006113a9610a6f565b9050600c60009054906101000a900460ff166113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906140a1565b60405180910390fd5b600a82111561143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906140e1565b60405180910390fd5b612710828261144d919061428b565b111561148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613ee1565b60405180910390fd5b348266b1a2bc2ec500006114a29190614312565b11156114e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114da90613f61565b60405180910390fd5b60005b82811015611516576115033382846114fe919061428b565b6122b9565b808061150e906144c9565b9150506114e6565b505050565b611523611df8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890613f41565b60405180910390fd5b806005600061159e611df8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661164b611df8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116909190613e44565b60405180910390a35050565b6116ad6116a7611df8565b83611eb9565b6116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614121565b60405180910390fd5b6116f8848484846122d7565b50505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61175c611df8565b73ffffffffffffffffffffffffffffffffffffffff1661177a6112e3565b73ffffffffffffffffffffffffffffffffffffffff16146117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614041565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606117f882611d8c565b611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614081565b60405180910390fd5b6000611841612333565b90506000815111611861576040518060200160405280600081525061188c565b8061186b846123c5565b60405160200161187c929190613db9565b6040516020818303038152906040525b915050919050565b600061189e610a6f565b9050600e60009054906101000a900460ff166118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690614161565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90614101565b60405180910390fd5b6127108260ff1682611996919061428b565b11156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90613ee1565b60405180910390fd5b348260ff1666b1a2bc2ec500006119ee9190614312565b1115611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613f61565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611a8a91906143a0565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015611ad857611ac5338284611ac0919061428b565b6122b9565b8080611ad0906144c9565b915050611aa5565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611b8c611df8565b73ffffffffffffffffffffffffffffffffffffffff16611baa6112e3565b73ffffffffffffffffffffffffffffffffffffffff1614611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790614041565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613ec1565b60405180910390fd5b611c79816121f3565b50565b611c84611df8565b73ffffffffffffffffffffffffffffffffffffffff16611ca26112e3565b73ffffffffffffffffffffffffffffffffffffffff1614611cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cef90614041565b60405180910390fd5b80600b9080519060200190611d0e929190612f32565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d855750611d8482612572565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7383610db2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ec482611d8c565b611f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efa90613f81565b60405180910390fd5b6000611f0e83610db2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f7d57508373ffffffffffffffffffffffffffffffffffffffff16611f65846108d2565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f8e5750611f8d8185611add565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fb782610db2565b73ffffffffffffffffffffffffffffffffffffffff161461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490614061565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207490613f21565b60405180910390fd5b612088838383612654565b612093600082611e00565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e3919061436c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461213a919061428b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122d3828260405180602001604052806000815250612664565b5050565b6122e2848484611f97565b6122ee848484846126bf565b61232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490613ea1565b60405180910390fd5b50505050565b6060600d805461234290614497565b80601f016020809104026020016040519081016040528092919081815260200182805461236e90614497565b80156123bb5780601f10612390576101008083540402835291602001916123bb565b820191906000526020600020905b81548152906001019060200180831161239e57829003601f168201915b5050505050905090565b6060600082141561240d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061256d565b600082905060005b6000821461243f578080612428906144c9565b915050600a8261243891906142e1565b9150612415565b60008167ffffffffffffffff811115612481577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124b35781602001600182028036833780820191505090505b5090505b60008514612566576001826124cc919061436c565b9150600a856124db9190614512565b60306124e7919061428b565b60f81b818381518110612523577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561255f91906142e1565b94506124b7565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061264d575061264c82612856565b5b9050919050565b61265f8383836128c0565b505050565b61266e83836129d4565b61267b60008484846126bf565b6126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b190613ea1565b60405180910390fd5b505050565b60006126e08473ffffffffffffffffffffffffffffffffffffffff16612ba2565b15612849578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612709611df8565b8786866040518563ffffffff1660e01b815260040161272b9493929190613df8565b602060405180830381600087803b15801561274557600080fd5b505af192505050801561277657506040513d601f19601f8201168201806040525081019061277391906133be565b60015b6127f9573d80600081146127a6576040519150601f19603f3d011682016040523d82523d6000602084013e6127ab565b606091505b506000815114156127f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e890613ea1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061284e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128cb838383612bb5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561290e5761290981612bba565b61294d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461294c5761294b8382612c03565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129905761298b81612d70565b6129cf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129ce576129cd8282612eb3565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b90614001565b60405180910390fd5b612a4d81611d8c565b15612a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8490613f01565b60405180910390fd5b612a9960008383612654565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ae9919061428b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1084610ef7565b612c1a919061436c565b9050600060076000848152602001908152602001600020549050818114612cff576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d84919061436c565b9050600060096000848152602001908152602001600020549050600060088381548110612dda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ebe83610ef7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f3e90614497565b90600052602060002090601f016020900481019282612f605760008555612fa7565b82601f10612f7957805160ff1916838001178555612fa7565b82800160010185558215612fa7579182015b82811115612fa6578251825591602001919060010190612f8b565b5b509050612fb49190612fb8565b5090565b5b80821115612fd1576000816000905550600101612fb9565b5090565b6000612fe8612fe3846141e8565b6141b7565b90508281526020810184848401111561300057600080fd5b61300b848285614455565b509392505050565b600061302661302184614218565b6141b7565b90508281526020810184848401111561303e57600080fd5b613049848285614455565b509392505050565b60008135905061306081614610565b92915050565b60008083601f84011261307857600080fd5b8235905067ffffffffffffffff81111561309157600080fd5b6020830191508360208202830111156130a957600080fd5b9250929050565b6000813590506130bf81614627565b92915050565b6000813590506130d48161463e565b92915050565b6000815190506130e98161463e565b92915050565b600082601f83011261310057600080fd5b8135613110848260208601612fd5565b91505092915050565b600082601f83011261312a57600080fd5b813561313a848260208601613013565b91505092915050565b60008135905061315281614655565b92915050565b6000813590506131678161466c565b92915050565b60006020828403121561317f57600080fd5b600061318d84828501613051565b91505092915050565b600080604083850312156131a957600080fd5b60006131b785828601613051565b92505060206131c885828601613051565b9150509250929050565b6000806000606084860312156131e757600080fd5b60006131f586828701613051565b935050602061320686828701613051565b925050604061321786828701613143565b9150509250925092565b6000806000806080858703121561323757600080fd5b600061324587828801613051565b945050602061325687828801613051565b935050604061326787828801613143565b925050606085013567ffffffffffffffff81111561328457600080fd5b613290878288016130ef565b91505092959194509250565b600080604083850312156132af57600080fd5b60006132bd85828601613051565b92505060206132ce858286016130b0565b9150509250929050565b600080604083850312156132eb57600080fd5b60006132f985828601613051565b925050602061330a85828601613143565b9150509250929050565b60008060006040848603121561332957600080fd5b600084013567ffffffffffffffff81111561334357600080fd5b61334f86828701613066565b9350935050602061336286828701613158565b9150509250925092565b60006020828403121561337e57600080fd5b600061338c848285016130b0565b91505092915050565b6000602082840312156133a757600080fd5b60006133b5848285016130c5565b91505092915050565b6000602082840312156133d057600080fd5b60006133de848285016130da565b91505092915050565b6000602082840312156133f957600080fd5b600082013567ffffffffffffffff81111561341357600080fd5b61341f84828501613119565b91505092915050565b60006020828403121561343a57600080fd5b600061344884828501613143565b91505092915050565b60006020828403121561346357600080fd5b600061347184828501613158565b91505092915050565b613483816143d4565b82525050565b613492816143e6565b82525050565b60006134a382614248565b6134ad818561425e565b93506134bd818560208601614464565b6134c6816145ff565b840191505092915050565b60006134dc82614253565b6134e6818561426f565b93506134f6818560208601614464565b6134ff816145ff565b840191505092915050565b600061351582614253565b61351f8185614280565b935061352f818560208601614464565b80840191505092915050565b6000613548602b8361426f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006135ae60328361426f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061361460268361426f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061367a60208361426f565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e736000830152602082019050919050565b60006136ba601c8361426f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006136fa60248361426f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061376060198361426f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006137a0601f8361426f565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b60006137e0602c8361426f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061384660388361426f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006138ac602a8361426f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061391260298361426f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061397860208361426f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006139b8602c8361426f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a1e60208361426f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613a5e60298361426f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ac4602f8361426f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613b2a60228361426f565b91507f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008301527f6e730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b9060218361426f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bf6601b8361426f565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b6000613c3660228361426f565b91507f4578636565646564206d617820617661696c61626c6520746f2070757263686160008301527f73650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9c60318361426f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d02602c8361426f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613d6860188361426f565b91507f416c6c6f77206c697374206973206e6f742061637469766500000000000000006000830152602082019050919050565b613da48161443e565b82525050565b613db381614448565b82525050565b6000613dc5828561350a565b9150613dd1828461350a565b91508190509392505050565b6000602082019050613df2600083018461347a565b92915050565b6000608082019050613e0d600083018761347a565b613e1a602083018661347a565b613e276040830185613d9b565b8181036060830152613e398184613498565b905095945050505050565b6000602082019050613e596000830184613489565b92915050565b60006020820190508181036000830152613e7981846134d1565b905092915050565b60006020820190508181036000830152613e9a8161353b565b9050919050565b60006020820190508181036000830152613eba816135a1565b9050919050565b60006020820190508181036000830152613eda81613607565b9050919050565b60006020820190508181036000830152613efa8161366d565b9050919050565b60006020820190508181036000830152613f1a816136ad565b9050919050565b60006020820190508181036000830152613f3a816136ed565b9050919050565b60006020820190508181036000830152613f5a81613753565b9050919050565b60006020820190508181036000830152613f7a81613793565b9050919050565b60006020820190508181036000830152613f9a816137d3565b9050919050565b60006020820190508181036000830152613fba81613839565b9050919050565b60006020820190508181036000830152613fda8161389f565b9050919050565b60006020820190508181036000830152613ffa81613905565b9050919050565b6000602082019050818103600083015261401a8161396b565b9050919050565b6000602082019050818103600083015261403a816139ab565b9050919050565b6000602082019050818103600083015261405a81613a11565b9050919050565b6000602082019050818103600083015261407a81613a51565b9050919050565b6000602082019050818103600083015261409a81613ab7565b9050919050565b600060208201905081810360008301526140ba81613b1d565b9050919050565b600060208201905081810360008301526140da81613b83565b9050919050565b600060208201905081810360008301526140fa81613be9565b9050919050565b6000602082019050818103600083015261411a81613c29565b9050919050565b6000602082019050818103600083015261413a81613c8f565b9050919050565b6000602082019050818103600083015261415a81613cf5565b9050919050565b6000602082019050818103600083015261417a81613d5b565b9050919050565b60006020820190506141966000830184613d9b565b92915050565b60006020820190506141b16000830184613daa565b92915050565b6000604051905081810181811067ffffffffffffffff821117156141de576141dd6145d0565b5b8060405250919050565b600067ffffffffffffffff821115614203576142026145d0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614233576142326145d0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142968261443e565b91506142a18361443e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142d6576142d5614543565b5b828201905092915050565b60006142ec8261443e565b91506142f78361443e565b92508261430757614306614572565b5b828204905092915050565b600061431d8261443e565b91506143288361443e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561436157614360614543565b5b828202905092915050565b60006143778261443e565b91506143828361443e565b92508282101561439557614394614543565b5b828203905092915050565b60006143ab82614448565b91506143b683614448565b9250828210156143c9576143c8614543565b5b828203905092915050565b60006143df8261441e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614482578082015181840152602081019050614467565b83811115614491576000848401525b50505050565b600060028204905060018216806144af57607f821691505b602082108114156144c3576144c26145a1565b5b50919050565b60006144d48261443e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450757614506614543565b5b600182019050919050565b600061451d8261443e565b91506145288361443e565b92508261453857614537614572565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614619816143d4565b811461462457600080fd5b50565b614630816143e6565b811461463b57600080fd5b50565b614647816143f2565b811461465257600080fd5b50565b61465e8161443e565b811461466957600080fd5b50565b61467581614448565b811461468057600080fd5b5056fea264697066735822122015ba73cf7ddc5cdbde70d39edf0ecd9f01b01f0cc875ed8e724dcccd339a6efe64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063715018a611610118578063b88d4fde116100a0578063ddff5b1c1161006f578063ddff5b1c14610758578063e985e9c514610774578063eb8d2444146107b1578063f2fde38b146107dc578063ffe630b51461080557610204565b8063b88d4fde1461068c578063c04a2836146106b5578063c4e37095146106f2578063c87b56dd1461071b57610204565b8063833b9499116100e7578063833b9499146105c65780638da5cb5b146105f157806395d89b411461061c578063a0712d6814610647578063a22cb4651461066357610204565b8063715018a614610534578063718bc4af1461054b578063819b25ba146105745780638295784d1461059d57610204565b806332cb6b0c1161019b57806355f804b31161016a57806355f804b31461043b5780636352211e146104645780636373a6b1146104a157806365f13097146104cc57806370a08231146104f757610204565b806332cb6b0c146103935780633ccfd60b146103be57806342842e0e146103d55780634f6ccce7146103fe57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd1461030257806329fc6bae1461032b5780632f745c591461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613395565b61082e565b60405161023d9190613e44565b60405180910390f35b34801561025257600080fd5b5061025b610840565b6040516102689190613e5f565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613428565b6108d2565b6040516102a59190613ddd565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906132d8565b610957565b005b3480156102e357600080fd5b506102ec610a6f565b6040516102f99190614181565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906131d2565b610a7c565b005b34801561033757600080fd5b50610340610adc565b60405161034d9190613e44565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906132d8565b610aef565b60405161038a9190614181565b60405180910390f35b34801561039f57600080fd5b506103a8610b94565b6040516103b59190614181565b60405180910390f35b3480156103ca57600080fd5b506103d3610b9a565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906131d2565b610c65565b005b34801561040a57600080fd5b5061042560048036038101906104209190613428565b610c85565b6040516104329190614181565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d91906133e7565b610d1c565b005b34801561047057600080fd5b5061048b60048036038101906104869190613428565b610db2565b6040516104989190613ddd565b60405180910390f35b3480156104ad57600080fd5b506104b6610e64565b6040516104c39190613e5f565b60405180910390f35b3480156104d857600080fd5b506104e1610ef2565b6040516104ee9190614181565b60405180910390f35b34801561050357600080fd5b5061051e6004803603810190610519919061316d565b610ef7565b60405161052b9190614181565b60405180910390f35b34801561054057600080fd5b50610549610faf565b005b34801561055757600080fd5b50610572600480360381019061056d919061336c565b611037565b005b34801561058057600080fd5b5061059b60048036038101906105969190613428565b6110d0565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613314565b611190565b005b3480156105d257600080fd5b506105db6112d8565b6040516105e89190614181565b60405180910390f35b3480156105fd57600080fd5b506106066112e3565b6040516106139190613ddd565b60405180910390f35b34801561062857600080fd5b5061063161130d565b60405161063e9190613e5f565b60405180910390f35b610661600480360381019061065c9190613428565b61139f565b005b34801561066f57600080fd5b5061068a6004803603810190610685919061329c565b61151b565b005b34801561069857600080fd5b506106b360048036038101906106ae9190613221565b61169c565b005b3480156106c157600080fd5b506106dc60048036038101906106d7919061316d565b6116fe565b6040516106e9919061419c565b60405180910390f35b3480156106fe57600080fd5b506107196004803603810190610714919061336c565b611754565b005b34801561072757600080fd5b50610742600480360381019061073d9190613428565b6117ed565b60405161074f9190613e5f565b60405180910390f35b610772600480360381019061076d9190613451565b611894565b005b34801561078057600080fd5b5061079b60048036038101906107969190613196565b611add565b6040516107a89190613e44565b60405180910390f35b3480156107bd57600080fd5b506107c6611b71565b6040516107d39190613e44565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe919061316d565b611b84565b005b34801561081157600080fd5b5061082c600480360381019061082791906133e7565b611c7c565b005b600061083982611d12565b9050919050565b60606000805461084f90614497565b80601f016020809104026020016040519081016040528092919081815260200182805461087b90614497565b80156108c85780601f1061089d576101008083540402835291602001916108c8565b820191906000526020600020905b8154815290600101906020018083116108ab57829003601f168201915b5050505050905090565b60006108dd82611d8c565b61091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390614021565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096282610db2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca906140c1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109f2611df8565b73ffffffffffffffffffffffffffffffffffffffff161480610a215750610a2081610a1b611df8565b611add565b5b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613fa1565b60405180910390fd5b610a6a8383611e00565b505050565b6000600880549050905090565b610a8d610a87611df8565b82611eb9565b610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390614121565b60405180910390fd5b610ad7838383611f97565b505050565b600e60009054906101000a900460ff1681565b6000610afa83610ef7565b8210610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613e81565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610ba2611df8565b73ffffffffffffffffffffffffffffffffffffffff16610bc06112e3565b73ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90614041565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c61573d6000803e3d6000fd5b5050565b610c808383836040518060200160405280600081525061169c565b505050565b6000610c8f610a6f565b8210610cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc790614141565b60405180910390fd5b60088281548110610d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d24611df8565b73ffffffffffffffffffffffffffffffffffffffff16610d426112e3565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90614041565b60405180910390fd5b80600d9080519060200190610dae929190612f32565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613fe1565b60405180910390fd5b80915050919050565b600b8054610e7190614497565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9d90614497565b8015610eea5780601f10610ebf57610100808354040283529160200191610eea565b820191906000526020600020905b815481529060010190602001808311610ecd57829003601f168201915b505050505081565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613fc1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fb7611df8565b73ffffffffffffffffffffffffffffffffffffffff16610fd56112e3565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290614041565b60405180910390fd5b61103560006121f3565b565b61103f611df8565b73ffffffffffffffffffffffffffffffffffffffff1661105d6112e3565b73ffffffffffffffffffffffffffffffffffffffff16146110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614041565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6110d8611df8565b73ffffffffffffffffffffffffffffffffffffffff166110f66112e3565b73ffffffffffffffffffffffffffffffffffffffff161461114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390614041565b60405180910390fd5b6000611156610a6f565b905060005b8281101561118b57611178338284611173919061428b565b6122b9565b8080611183906144c9565b91505061115b565b505050565b611198611df8565b73ffffffffffffffffffffffffffffffffffffffff166111b66112e3565b73ffffffffffffffffffffffffffffffffffffffff161461120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614041565b60405180910390fd5b60005b838390508110156112d25781600f6000868685818110611258577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061126d919061316d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806112ca906144c9565b91505061120f565b50505050565b66b1a2bc2ec5000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461131c90614497565b80601f016020809104026020016040519081016040528092919081815260200182805461134890614497565b80156113955780601f1061136a57610100808354040283529160200191611395565b820191906000526020600020905b81548152906001019060200180831161137857829003601f168201915b5050505050905090565b60006113a9610a6f565b9050600c60009054906101000a900460ff166113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906140a1565b60405180910390fd5b600a82111561143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906140e1565b60405180910390fd5b612710828261144d919061428b565b111561148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613ee1565b60405180910390fd5b348266b1a2bc2ec500006114a29190614312565b11156114e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114da90613f61565b60405180910390fd5b60005b82811015611516576115033382846114fe919061428b565b6122b9565b808061150e906144c9565b9150506114e6565b505050565b611523611df8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890613f41565b60405180910390fd5b806005600061159e611df8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661164b611df8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116909190613e44565b60405180910390a35050565b6116ad6116a7611df8565b83611eb9565b6116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614121565b60405180910390fd5b6116f8848484846122d7565b50505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61175c611df8565b73ffffffffffffffffffffffffffffffffffffffff1661177a6112e3565b73ffffffffffffffffffffffffffffffffffffffff16146117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614041565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606117f882611d8c565b611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614081565b60405180910390fd5b6000611841612333565b90506000815111611861576040518060200160405280600081525061188c565b8061186b846123c5565b60405160200161187c929190613db9565b6040516020818303038152906040525b915050919050565b600061189e610a6f565b9050600e60009054906101000a900460ff166118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690614161565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90614101565b60405180910390fd5b6127108260ff1682611996919061428b565b11156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90613ee1565b60405180910390fd5b348260ff1666b1a2bc2ec500006119ee9190614312565b1115611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613f61565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611a8a91906143a0565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015611ad857611ac5338284611ac0919061428b565b6122b9565b8080611ad0906144c9565b915050611aa5565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611b8c611df8565b73ffffffffffffffffffffffffffffffffffffffff16611baa6112e3565b73ffffffffffffffffffffffffffffffffffffffff1614611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790614041565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613ec1565b60405180910390fd5b611c79816121f3565b50565b611c84611df8565b73ffffffffffffffffffffffffffffffffffffffff16611ca26112e3565b73ffffffffffffffffffffffffffffffffffffffff1614611cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cef90614041565b60405180910390fd5b80600b9080519060200190611d0e929190612f32565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d855750611d8482612572565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7383610db2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ec482611d8c565b611f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efa90613f81565b60405180910390fd5b6000611f0e83610db2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f7d57508373ffffffffffffffffffffffffffffffffffffffff16611f65846108d2565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f8e5750611f8d8185611add565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fb782610db2565b73ffffffffffffffffffffffffffffffffffffffff161461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490614061565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207490613f21565b60405180910390fd5b612088838383612654565b612093600082611e00565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e3919061436c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461213a919061428b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122d3828260405180602001604052806000815250612664565b5050565b6122e2848484611f97565b6122ee848484846126bf565b61232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490613ea1565b60405180910390fd5b50505050565b6060600d805461234290614497565b80601f016020809104026020016040519081016040528092919081815260200182805461236e90614497565b80156123bb5780601f10612390576101008083540402835291602001916123bb565b820191906000526020600020905b81548152906001019060200180831161239e57829003601f168201915b5050505050905090565b6060600082141561240d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061256d565b600082905060005b6000821461243f578080612428906144c9565b915050600a8261243891906142e1565b9150612415565b60008167ffffffffffffffff811115612481577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124b35781602001600182028036833780820191505090505b5090505b60008514612566576001826124cc919061436c565b9150600a856124db9190614512565b60306124e7919061428b565b60f81b818381518110612523577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561255f91906142e1565b94506124b7565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061264d575061264c82612856565b5b9050919050565b61265f8383836128c0565b505050565b61266e83836129d4565b61267b60008484846126bf565b6126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b190613ea1565b60405180910390fd5b505050565b60006126e08473ffffffffffffffffffffffffffffffffffffffff16612ba2565b15612849578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612709611df8565b8786866040518563ffffffff1660e01b815260040161272b9493929190613df8565b602060405180830381600087803b15801561274557600080fd5b505af192505050801561277657506040513d601f19601f8201168201806040525081019061277391906133be565b60015b6127f9573d80600081146127a6576040519150601f19603f3d011682016040523d82523d6000602084013e6127ab565b606091505b506000815114156127f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e890613ea1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061284e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128cb838383612bb5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561290e5761290981612bba565b61294d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461294c5761294b8382612c03565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129905761298b81612d70565b6129cf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129ce576129cd8282612eb3565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b90614001565b60405180910390fd5b612a4d81611d8c565b15612a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8490613f01565b60405180910390fd5b612a9960008383612654565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ae9919061428b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1084610ef7565b612c1a919061436c565b9050600060076000848152602001908152602001600020549050818114612cff576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d84919061436c565b9050600060096000848152602001908152602001600020549050600060088381548110612dda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ebe83610ef7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f3e90614497565b90600052602060002090601f016020900481019282612f605760008555612fa7565b82601f10612f7957805160ff1916838001178555612fa7565b82800160010185558215612fa7579182015b82811115612fa6578251825591602001919060010190612f8b565b5b509050612fb49190612fb8565b5090565b5b80821115612fd1576000816000905550600101612fb9565b5090565b6000612fe8612fe3846141e8565b6141b7565b90508281526020810184848401111561300057600080fd5b61300b848285614455565b509392505050565b600061302661302184614218565b6141b7565b90508281526020810184848401111561303e57600080fd5b613049848285614455565b509392505050565b60008135905061306081614610565b92915050565b60008083601f84011261307857600080fd5b8235905067ffffffffffffffff81111561309157600080fd5b6020830191508360208202830111156130a957600080fd5b9250929050565b6000813590506130bf81614627565b92915050565b6000813590506130d48161463e565b92915050565b6000815190506130e98161463e565b92915050565b600082601f83011261310057600080fd5b8135613110848260208601612fd5565b91505092915050565b600082601f83011261312a57600080fd5b813561313a848260208601613013565b91505092915050565b60008135905061315281614655565b92915050565b6000813590506131678161466c565b92915050565b60006020828403121561317f57600080fd5b600061318d84828501613051565b91505092915050565b600080604083850312156131a957600080fd5b60006131b785828601613051565b92505060206131c885828601613051565b9150509250929050565b6000806000606084860312156131e757600080fd5b60006131f586828701613051565b935050602061320686828701613051565b925050604061321786828701613143565b9150509250925092565b6000806000806080858703121561323757600080fd5b600061324587828801613051565b945050602061325687828801613051565b935050604061326787828801613143565b925050606085013567ffffffffffffffff81111561328457600080fd5b613290878288016130ef565b91505092959194509250565b600080604083850312156132af57600080fd5b60006132bd85828601613051565b92505060206132ce858286016130b0565b9150509250929050565b600080604083850312156132eb57600080fd5b60006132f985828601613051565b925050602061330a85828601613143565b9150509250929050565b60008060006040848603121561332957600080fd5b600084013567ffffffffffffffff81111561334357600080fd5b61334f86828701613066565b9350935050602061336286828701613158565b9150509250925092565b60006020828403121561337e57600080fd5b600061338c848285016130b0565b91505092915050565b6000602082840312156133a757600080fd5b60006133b5848285016130c5565b91505092915050565b6000602082840312156133d057600080fd5b60006133de848285016130da565b91505092915050565b6000602082840312156133f957600080fd5b600082013567ffffffffffffffff81111561341357600080fd5b61341f84828501613119565b91505092915050565b60006020828403121561343a57600080fd5b600061344884828501613143565b91505092915050565b60006020828403121561346357600080fd5b600061347184828501613158565b91505092915050565b613483816143d4565b82525050565b613492816143e6565b82525050565b60006134a382614248565b6134ad818561425e565b93506134bd818560208601614464565b6134c6816145ff565b840191505092915050565b60006134dc82614253565b6134e6818561426f565b93506134f6818560208601614464565b6134ff816145ff565b840191505092915050565b600061351582614253565b61351f8185614280565b935061352f818560208601614464565b80840191505092915050565b6000613548602b8361426f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006135ae60328361426f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061361460268361426f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061367a60208361426f565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e736000830152602082019050919050565b60006136ba601c8361426f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006136fa60248361426f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061376060198361426f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006137a0601f8361426f565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b60006137e0602c8361426f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061384660388361426f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006138ac602a8361426f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061391260298361426f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061397860208361426f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006139b8602c8361426f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a1e60208361426f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613a5e60298361426f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ac4602f8361426f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613b2a60228361426f565b91507f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008301527f6e730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b9060218361426f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bf6601b8361426f565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b6000613c3660228361426f565b91507f4578636565646564206d617820617661696c61626c6520746f2070757263686160008301527f73650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9c60318361426f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d02602c8361426f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613d6860188361426f565b91507f416c6c6f77206c697374206973206e6f742061637469766500000000000000006000830152602082019050919050565b613da48161443e565b82525050565b613db381614448565b82525050565b6000613dc5828561350a565b9150613dd1828461350a565b91508190509392505050565b6000602082019050613df2600083018461347a565b92915050565b6000608082019050613e0d600083018761347a565b613e1a602083018661347a565b613e276040830185613d9b565b8181036060830152613e398184613498565b905095945050505050565b6000602082019050613e596000830184613489565b92915050565b60006020820190508181036000830152613e7981846134d1565b905092915050565b60006020820190508181036000830152613e9a8161353b565b9050919050565b60006020820190508181036000830152613eba816135a1565b9050919050565b60006020820190508181036000830152613eda81613607565b9050919050565b60006020820190508181036000830152613efa8161366d565b9050919050565b60006020820190508181036000830152613f1a816136ad565b9050919050565b60006020820190508181036000830152613f3a816136ed565b9050919050565b60006020820190508181036000830152613f5a81613753565b9050919050565b60006020820190508181036000830152613f7a81613793565b9050919050565b60006020820190508181036000830152613f9a816137d3565b9050919050565b60006020820190508181036000830152613fba81613839565b9050919050565b60006020820190508181036000830152613fda8161389f565b9050919050565b60006020820190508181036000830152613ffa81613905565b9050919050565b6000602082019050818103600083015261401a8161396b565b9050919050565b6000602082019050818103600083015261403a816139ab565b9050919050565b6000602082019050818103600083015261405a81613a11565b9050919050565b6000602082019050818103600083015261407a81613a51565b9050919050565b6000602082019050818103600083015261409a81613ab7565b9050919050565b600060208201905081810360008301526140ba81613b1d565b9050919050565b600060208201905081810360008301526140da81613b83565b9050919050565b600060208201905081810360008301526140fa81613be9565b9050919050565b6000602082019050818103600083015261411a81613c29565b9050919050565b6000602082019050818103600083015261413a81613c8f565b9050919050565b6000602082019050818103600083015261415a81613cf5565b9050919050565b6000602082019050818103600083015261417a81613d5b565b9050919050565b60006020820190506141966000830184613d9b565b92915050565b60006020820190506141b16000830184613daa565b92915050565b6000604051905081810181811067ffffffffffffffff821117156141de576141dd6145d0565b5b8060405250919050565b600067ffffffffffffffff821115614203576142026145d0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614233576142326145d0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142968261443e565b91506142a18361443e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142d6576142d5614543565b5b828201905092915050565b60006142ec8261443e565b91506142f78361443e565b92508261430757614306614572565b5b828204905092915050565b600061431d8261443e565b91506143288361443e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561436157614360614543565b5b828202905092915050565b60006143778261443e565b91506143828361443e565b92508282101561439557614394614543565b5b828203905092915050565b60006143ab82614448565b91506143b683614448565b9250828210156143c9576143c8614543565b5b828203905092915050565b60006143df8261441e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614482578082015181840152602081019050614467565b83811115614491576000848401525b50505050565b600060028204905060018216806144af57607f821691505b602082108114156144c3576144c26145a1565b5b50919050565b60006144d48261443e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450757614506614543565b5b600182019050919050565b600061451d8261443e565b91506145288361443e565b92508261453857614537614572565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614619816143d4565b811461462457600080fd5b50565b614630816143e6565b811461463b57600080fd5b50565b614647816143f2565b811461465257600080fd5b50565b61465e8161443e565b811461466957600080fd5b50565b61467581614448565b811461468057600080fd5b5056fea264697066735822122015ba73cf7ddc5cdbde70d39edf0ecd9f01b01f0cc875ed8e724dcccd339a6efe64736f6c63430008000033

Deployed Bytecode Sourcemap

3544:3272:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5307:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2335:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3846:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3384:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1530:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4710:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3712:37:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1206:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3755:42:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6677:137;;;;;;;;;;;;;:::i;:::-;;5106:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1713:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5490:109:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2038:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3606:24:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3803:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1776:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1596:92:11;;;;;;;;;;;;;:::i;:::-;;4019:129:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5838:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4154:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3853:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;964:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2497:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6130:541:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4130:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5351:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4386:112:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6030:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2665:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4504:612:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4486:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3636:32:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1837:189:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5726:106:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5307:177;5418:4;5441:36;5465:11;5441:23;:36::i;:::-;5434:43;;5307:177;;;:::o;2335:98:4:-;2389:13;2421:5;2414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2335:98;:::o;3846:217::-;3922:7;3949:16;3957:7;3949;:16::i;:::-;3941:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4032:15;:24;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;4025:31;;3846:217;;;:::o;3384:401::-;3464:13;3480:23;3495:7;3480:14;:23::i;:::-;3464:39;;3527:5;3521:11;;:2;:11;;;;3513:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3618:5;3602:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3627:37;3644:5;3651:12;:10;:12::i;:::-;3627:16;:37::i;:::-;3602:62;3581:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3757:21;3766:2;3770:7;3757:8;:21::i;:::-;3384:401;;;:::o;1530:111:5:-;1591:7;1617:10;:17;;;;1610:24;;1530:111;:::o;4710:330:4:-;4899:41;4918:12;:10;:12::i;:::-;4932:7;4899:18;:41::i;:::-;4891:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:28;5015:4;5021:2;5025:7;5005:9;:28::i;:::-;4710:330;;;:::o;3712:37:1:-;;;;;;;;;;;;;:::o;1206:253:5:-;1303:7;1338:23;1355:5;1338:16;:23::i;:::-;1330:5;:31;1322:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1426:12;:19;1439:5;1426:19;;;;;;;;;;;;;;;:26;1446:5;1426:26;;;;;;;;;;;;1419:33;;1206:253;;;;:::o;3755:42:1:-;3792:5;3755:42;:::o;6677:137::-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6724:12:1::1;6739:21;6724:36;;6778:10;6770:28;;:37;6799:7;6770:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1246:1:11;6677:137:1:o:0;5106:179:4:-;5239:39;5256:4;5262:2;5266:7;5239:39;;;;;;;;;;;;:16;:39::i;:::-;5106:179;;;:::o;1713:230:5:-;1788:7;1823:30;:28;:30::i;:::-;1815:5;:38;1807:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1919:10;1930:5;1919:17;;;;;;;;;;;;;;;;;;;;;;;;1912:24;;1713:230;;;:::o;5490:109:1:-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5584:8:1::1;5565:16;:27;;;;;;;;;;;;:::i;:::-;;5490:109:::0;:::o;2038:235:4:-;2110:7;2129:13;2145:7;:16;2153:7;2145:16;;;;;;;;;;;;;;;;;;;;;2129:32;;2196:1;2179:19;;:5;:19;;;;2171:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2261:5;2254:12;;;2038:235;;;:::o;3606:24:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3803:44::-;3845:2;3803:44;:::o;1776:205:4:-;1848:7;1892:1;1875:19;;:5;:19;;;;1867:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1958:9;:16;1968:5;1958:16;;;;;;;;;;;;;;;;1951:23;;1776:205;;;:::o;1596:92:11:-;1187:12;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:21:::1;1678:1;1660:9;:21::i;:::-;1596:92::o:0;4019:129:1:-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4123:18:1::1;4103:17;;:38;;;;;;;;;;;;;;;;;;4019:129:::0;:::o;5838:186::-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5891:11:1::1;5905:13;:11;:13::i;:::-;5891:27;;5926:6;5940:78;5956:1;5952;:5;5940:78;;;5976:33;5986:10;6007:1;5998:6;:10;;;;:::i;:::-;5976:9;:33::i;:::-;5959:3;;;;;:::i;:::-;;;;5940:78;;;1246:1:11;;5838:186:1::0;:::o;4154:226::-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4264:9:1::1;4259:115;4283:9;;:16;;4279:1;:20;4259:115;;;4347:16;4320:10;:24;4331:9;;4341:1;4331:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4320:24;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;4301:3;;;;;:::i;:::-;;;;4259:115;;;;4154:226:::0;;;:::o;3853:52::-;3895:10;3853:52;:::o;964:85:11:-;1010:7;1036:6;;;;;;;;;;;1029:13;;964:85;:::o;2497:102:4:-;2553:13;2585:7;2578:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2497:102;:::o;6130:541:1:-;6190:10;6203:13;:11;:13::i;:::-;6190:26;;6234:12;;;;;;;;;;;6226:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3845:2;6303:14;:33;;6295:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3792:5;6391:14;6386:2;:19;;;;:::i;:::-;:33;;6378:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;6510:9;6492:14;3895:10;6474:32;;;;:::i;:::-;:45;;6466:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;6571:9;6566:99;6590:14;6586:1;:18;6566:99;;;6625:29;6635:10;6652:1;6647:2;:6;;;;:::i;:::-;6625:9;:29::i;:::-;6606:3;;;;;:::i;:::-;;;;6566:99;;;;6130:541;;:::o;4130:290:4:-;4244:12;:10;:12::i;:::-;4232:24;;:8;:24;;;;4224:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4342:8;4297:18;:32;4316:12;:10;:12::i;:::-;4297:32;;;;;;;;;;;;;;;:42;4330:8;4297:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4394:8;4365:48;;4380:12;:10;:12::i;:::-;4365:48;;;4404:8;4365:48;;;;;;:::i;:::-;;;;;;;;4130:290;;:::o;5351:320::-;5520:41;5539:12;:10;:12::i;:::-;5553:7;5520:18;:41::i;:::-;5512:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5625:39;5639:4;5645:2;5649:7;5658:5;5625:13;:39::i;:::-;5351:320;;;;:::o;4386:112:1:-;4451:5;4475:10;:16;4486:4;4475:16;;;;;;;;;;;;;;;;;;;;;;;;;4468:23;;4386:112;;;:::o;6030:94::-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6109:8:1::1;6094:12;;:23;;;;;;;;;;;;;;;;;;6030:94:::0;:::o;2665:329:4:-;2738:13;2771:16;2779:7;2771;:16::i;:::-;2763:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2850:21;2874:10;:8;:10::i;:::-;2850:34;;2925:1;2907:7;2901:21;:25;:86;;;;;;;;;;;;;;;;;2953:7;2962:18;:7;:16;:18::i;:::-;2936:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2901:86;2894:93;;;2665:329;;;:::o;4504:612:1:-;4576:10;4589:13;:11;:13::i;:::-;4576:26;;4620:17;;;;;;;;;;;4612:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4702:10;:22;4713:10;4702:22;;;;;;;;;;;;;;;;;;;;;;;;;4684:40;;:14;:40;;;;4676:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3792:5;4786:14;4781:19;;:2;:19;;;;:::i;:::-;:33;;4773:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;4905:9;4887:14;4869:32;;3895:10;4869:32;;;;:::i;:::-;:45;;4861:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;4987:14;4961:10;:22;4972:10;4961:22;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5016:9;5011:99;5035:14;5031:18;;:1;:18;5011:99;;;5070:29;5080:10;5097:1;5092:2;:6;;;;:::i;:::-;5070:9;:29::i;:::-;5051:3;;;;;:::i;:::-;;;;5011:99;;;;4504:612;;:::o;4486:162:4:-;4583:4;4606:18;:25;4625:5;4606:25;;;;;;;;;;;;;;;:35;4632:8;4606:35;;;;;;;;;;;;;;;;;;;;;;;;;4599:42;;4486:162;;;;:::o;3636:32:1:-;;;;;;;;;;;;;:::o;1837:189:11:-;1187:12;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1945:1:::1;1925:22;;:8;:22;;;;1917:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2000:19;2010:8;2000:9;:19::i;:::-;1837:189:::0;:::o;5726:106:1:-;1187:12:11;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5815:10:1::1;5802;:23;;;;;;;;;;;;:::i;:::-;;5726:106:::0;:::o;905:222:5:-;1007:4;1045:35;1030:50;;;:11;:50;;;;:90;;;;1084:36;1108:11;1084:23;:36::i;:::-;1030:90;1023:97;;905:222;;;:::o;7143:125:4:-;7208:4;7259:1;7231:30;;:7;:16;7239:7;7231:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7224:37;;7143:125;;;:::o;586:96:2:-;639:7;665:10;658:17;;586:96;:::o;10994:171:4:-;11095:2;11068:15;:24;11084:7;11068:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11150:7;11146:2;11112:46;;11121:23;11136:7;11121:14;:23::i;:::-;11112:46;;;;;;;;;;;;10994:171;;:::o;7426:344::-;7519:4;7543:16;7551:7;7543;:16::i;:::-;7535:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7618:13;7634:23;7649:7;7634:14;:23::i;:::-;7618:39;;7686:5;7675:16;;:7;:16;;;:51;;;;7719:7;7695:31;;:20;7707:7;7695:11;:20::i;:::-;:31;;;7675:51;:87;;;;7730:32;7747:5;7754:7;7730:16;:32::i;:::-;7675:87;7667:96;;;7426:344;;;;:::o;10323:560::-;10477:4;10450:31;;:23;10465:7;10450:14;:23::i;:::-;:31;;;10442:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10559:1;10545:16;;:2;:16;;;;10537:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10613:39;10634:4;10640:2;10644:7;10613:20;:39::i;:::-;10714:29;10731:1;10735:7;10714:8;:29::i;:::-;10773:1;10754:9;:15;10764:4;10754:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10801:1;10784:9;:13;10794:2;10784:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10831:2;10812:7;:16;10820:7;10812:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10868:7;10864:2;10849:27;;10858:4;10849:27;;;;;;;;;;;;10323:560;;;:::o;2032:169:11:-;2087:16;2106:6;;;;;;;;;;;2087:25;;2131:8;2122:6;;:17;;;;;;;;;;;;;;;;;;2185:8;2154:40;;2175:8;2154:40;;;;;;;;;;;;2032:169;;:::o;8100:108:4:-;8175:26;8185:2;8189:7;8175:26;;;;;;;;;;;;:9;:26::i;:::-;8100:108;;:::o;6533:307::-;6684:28;6694:4;6700:2;6704:7;6684:9;:28::i;:::-;6730:48;6753:4;6759:2;6763:7;6772:5;6730:22;:48::i;:::-;6722:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6533:307;;;;:::o;5605:115:1:-;5665:13;5697:16;5690:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5605:115;:::o;275:703:12:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;1417:300:4:-;1519:4;1569:25;1554:40;;;:11;:40;;;;:104;;;;1625:33;1610:48;;;:11;:48;;;;1554:104;:156;;;;1674:36;1698:11;1674:23;:36::i;:::-;1554:156;1535:175;;1417:300;;;:::o;5122:179:1:-;5249:45;5276:4;5282:2;5286:7;5249:26;:45::i;:::-;5122:179;;;:::o;8429:311:4:-;8554:18;8560:2;8564:7;8554:5;:18::i;:::-;8603:54;8634:1;8638:2;8642:7;8651:5;8603:22;:54::i;:::-;8582:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8429:311;;;:::o;11718:782::-;11868:4;11888:15;:2;:13;;;:15::i;:::-;11884:610;;;11939:2;11923:36;;;11960:12;:10;:12::i;:::-;11974:4;11980:7;11989:5;11923:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11919:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12183:1;12166:6;:13;:18;12162:266;;;12208:60;;;;;;;;;;:::i;:::-;;;;;;;;12162:266;12380:6;12374:13;12365:6;12361:2;12357:15;12350:38;11919:523;12055:45;;;12045:55;;;:6;:55;;;;12038:62;;;;;11884:610;12479:4;12472:11;;11718:782;;;;;;;:::o;761:155:3:-;846:4;884:25;869:40;;;:11;:40;;;;862:47;;761:155;;;:::o;2539:572:5:-;2678:45;2705:4;2711:2;2715:7;2678:26;:45::i;:::-;2754:1;2738:18;;:4;:18;;;2734:183;;;2772:40;2804:7;2772:31;:40::i;:::-;2734:183;;;2841:2;2833:10;;:4;:10;;;2829:88;;2859:47;2892:4;2898:7;2859:32;:47::i;:::-;2829:88;2734:183;2944:1;2930:16;;:2;:16;;;2926:179;;;2962:45;2999:7;2962:36;:45::i;:::-;2926:179;;;3034:4;3028:10;;:2;:10;;;3024:81;;3054:40;3082:2;3086:7;3054:27;:40::i;:::-;3024:81;2926:179;2539:572;;;:::o;9062:372:4:-;9155:1;9141:16;;:2;:16;;;;9133:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9213:16;9221:7;9213;:16::i;:::-;9212:17;9204:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9273:45;9302:1;9306:2;9310:7;9273:20;:45::i;:::-;9346:1;9329:9;:13;9339:2;9329:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9376:2;9357:7;:16;9365:7;9357:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9419:7;9415:2;9394:33;;9411:1;9394:33;;;;;;;;;;;;9062:372;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;13056:122:4:-;;;;:::o;3817:161:5:-;3920:10;:17;;;;3893:15;:24;3909:7;3893:24;;;;;;;;;;;:44;;;;3947:10;3963:7;3947:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3817:161;:::o;4595:970::-;4857:22;4907:1;4882:22;4899:4;4882:16;:22::i;:::-;:26;;;;:::i;:::-;4857:51;;4918:18;4939:17;:26;4957:7;4939:26;;;;;;;;;;;;4918:47;;5083:14;5069:10;:28;5065:323;;5113:19;5135:12;:18;5148:4;5135:18;;;;;;;;;;;;;;;:34;5154:14;5135:34;;;;;;;;;;;;5113:56;;5217:11;5184:12;:18;5197:4;5184:18;;;;;;;;;;;;;;;:30;5203:10;5184:30;;;;;;;;;;;:44;;;;5333:10;5300:17;:30;5318:11;5300:30;;;;;;;;;;;:43;;;;5065:323;;5481:17;:26;5499:7;5481:26;;;;;;;;;;;5474:33;;;5524:12;:18;5537:4;5524:18;;;;;;;;;;;;;;;:34;5543:14;5524:34;;;;;;;;;;;5517:41;;;4595:970;;;;:::o;5853:1061::-;6102:22;6147:1;6127:10;:17;;;;:21;;;;:::i;:::-;6102:46;;6158:18;6179:15;:24;6195:7;6179:24;;;;;;;;;;;;6158:45;;6525:19;6547:10;6558:14;6547:26;;;;;;;;;;;;;;;;;;;;;;;;6525:48;;6609:11;6584:10;6595;6584:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6719:10;6688:15;:28;6704:11;6688:28;;;;;;;;;;;:41;;;;6857:15;:24;6873:7;6857:24;;;;;;;;;;;6850:31;;;6891:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5853:1061;;;;:::o;3405:217::-;3489:14;3506:20;3523:2;3506:16;:20::i;:::-;3489:37;;3563:7;3536:12;:16;3549:2;3536:16;;;;;;;;;;;;;;;:24;3553:6;3536:24;;;;;;;;;;;:34;;;;3609:6;3580:17;:26;3598:7;3580:26;;;;;;;;;;;:35;;;;3405:217;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:13:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1973:273::-;;2078:3;2071:4;2063:6;2059:17;2055:27;2045:2;;2096:1;2093;2086:12;2045:2;2136:6;2123:20;2161:79;2236:3;2228:6;2221:4;2213:6;2209:17;2161:79;:::i;:::-;2152:88;;2035:211;;;;;:::o;2252:139::-;;2336:6;2323:20;2314:29;;2352:33;2379:5;2352:33;:::i;:::-;2304:87;;;;:::o;2397:135::-;;2479:6;2466:20;2457:29;;2495:31;2520:5;2495:31;:::i;:::-;2447:85;;;;:::o;2538:262::-;;2646:2;2634:9;2625:7;2621:23;2617:32;2614:2;;;2662:1;2659;2652:12;2614:2;2705:1;2730:53;2775:7;2766:6;2755:9;2751:22;2730:53;:::i;:::-;2720:63;;2676:117;2604:196;;;;:::o;2806:407::-;;;2931:2;2919:9;2910:7;2906:23;2902:32;2899:2;;;2947:1;2944;2937:12;2899:2;2990:1;3015:53;3060:7;3051:6;3040:9;3036:22;3015:53;:::i;:::-;3005:63;;2961:117;3117:2;3143:53;3188:7;3179:6;3168:9;3164:22;3143:53;:::i;:::-;3133:63;;3088:118;2889:324;;;;;:::o;3219:552::-;;;;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3377:1;3374;3367:12;3329:2;3420:1;3445:53;3490:7;3481:6;3470:9;3466:22;3445:53;:::i;:::-;3435:63;;3391:117;3547:2;3573:53;3618:7;3609:6;3598:9;3594:22;3573:53;:::i;:::-;3563:63;;3518:118;3675:2;3701:53;3746:7;3737:6;3726:9;3722:22;3701:53;:::i;:::-;3691:63;;3646:118;3319:452;;;;;:::o;3777:809::-;;;;;3945:3;3933:9;3924:7;3920:23;3916:33;3913:2;;;3962:1;3959;3952:12;3913:2;4005:1;4030:53;4075:7;4066:6;4055:9;4051:22;4030:53;:::i;:::-;4020:63;;3976:117;4132:2;4158:53;4203:7;4194:6;4183:9;4179:22;4158:53;:::i;:::-;4148:63;;4103:118;4260:2;4286:53;4331:7;4322:6;4311:9;4307:22;4286:53;:::i;:::-;4276:63;;4231:118;4416:2;4405:9;4401:18;4388:32;4447:18;4439:6;4436:30;4433:2;;;4479:1;4476;4469:12;4433:2;4507:62;4561:7;4552:6;4541:9;4537:22;4507:62;:::i;:::-;4497:72;;4359:220;3903:683;;;;;;;:::o;4592:401::-;;;4714:2;4702:9;4693:7;4689:23;4685:32;4682:2;;;4730:1;4727;4720:12;4682:2;4773:1;4798:53;4843:7;4834:6;4823:9;4819:22;4798:53;:::i;:::-;4788:63;;4744:117;4900:2;4926:50;4968:7;4959:6;4948:9;4944:22;4926:50;:::i;:::-;4916:60;;4871:115;4672:321;;;;;:::o;4999:407::-;;;5124:2;5112:9;5103:7;5099:23;5095:32;5092:2;;;5140:1;5137;5130:12;5092:2;5183:1;5208:53;5253:7;5244:6;5233:9;5229:22;5208:53;:::i;:::-;5198:63;;5154:117;5310:2;5336:53;5381:7;5372:6;5361:9;5357:22;5336:53;:::i;:::-;5326:63;;5281:118;5082:324;;;;;:::o;5412:566::-;;;;5570:2;5558:9;5549:7;5545:23;5541:32;5538:2;;;5586:1;5583;5576:12;5538:2;5657:1;5646:9;5642:17;5629:31;5687:18;5679:6;5676:30;5673:2;;;5719:1;5716;5709:12;5673:2;5755:80;5827:7;5818:6;5807:9;5803:22;5755:80;:::i;:::-;5737:98;;;;5600:245;5884:2;5910:51;5953:7;5944:6;5933:9;5929:22;5910:51;:::i;:::-;5900:61;;5855:116;5528:450;;;;;:::o;5984:256::-;;6089:2;6077:9;6068:7;6064:23;6060:32;6057:2;;;6105:1;6102;6095:12;6057:2;6148:1;6173:50;6215:7;6206:6;6195:9;6191:22;6173:50;:::i;:::-;6163:60;;6119:114;6047:193;;;;:::o;6246:260::-;;6353:2;6341:9;6332:7;6328:23;6324:32;6321:2;;;6369:1;6366;6359:12;6321:2;6412:1;6437:52;6481:7;6472:6;6461:9;6457:22;6437:52;:::i;:::-;6427:62;;6383:116;6311:195;;;;:::o;6512:282::-;;6630:2;6618:9;6609:7;6605:23;6601:32;6598:2;;;6646:1;6643;6636:12;6598:2;6689:1;6714:63;6769:7;6760:6;6749:9;6745:22;6714:63;:::i;:::-;6704:73;;6660:127;6588:206;;;;:::o;6800:375::-;;6918:2;6906:9;6897:7;6893:23;6889:32;6886:2;;;6934:1;6931;6924:12;6886:2;7005:1;6994:9;6990:17;6977:31;7035:18;7027:6;7024:30;7021:2;;;7067:1;7064;7057:12;7021:2;7095:63;7150:7;7141:6;7130:9;7126:22;7095:63;:::i;:::-;7085:73;;6948:220;6876:299;;;;:::o;7181:262::-;;7289:2;7277:9;7268:7;7264:23;7260:32;7257:2;;;7305:1;7302;7295:12;7257:2;7348:1;7373:53;7418:7;7409:6;7398:9;7394:22;7373:53;:::i;:::-;7363:63;;7319:117;7247:196;;;;:::o;7449:258::-;;7555:2;7543:9;7534:7;7530:23;7526:32;7523:2;;;7571:1;7568;7561:12;7523:2;7614:1;7639:51;7682:7;7673:6;7662:9;7658:22;7639:51;:::i;:::-;7629:61;;7585:115;7513:194;;;;:::o;7713:118::-;7800:24;7818:5;7800:24;:::i;:::-;7795:3;7788:37;7778:53;;:::o;7837:109::-;7918:21;7933:5;7918:21;:::i;:::-;7913:3;7906:34;7896:50;;:::o;7952:360::-;;8066:38;8098:5;8066:38;:::i;:::-;8120:70;8183:6;8178:3;8120:70;:::i;:::-;8113:77;;8199:52;8244:6;8239:3;8232:4;8225:5;8221:16;8199:52;:::i;:::-;8276:29;8298:6;8276:29;:::i;:::-;8271:3;8267:39;8260:46;;8042:270;;;;;:::o;8318:364::-;;8434:39;8467:5;8434:39;:::i;:::-;8489:71;8553:6;8548:3;8489:71;:::i;:::-;8482:78;;8569:52;8614:6;8609:3;8602:4;8595:5;8591:16;8569:52;:::i;:::-;8646:29;8668:6;8646:29;:::i;:::-;8641:3;8637:39;8630:46;;8410:272;;;;;:::o;8688:377::-;;8822:39;8855:5;8822:39;:::i;:::-;8877:89;8959:6;8954:3;8877:89;:::i;:::-;8870:96;;8975:52;9020:6;9015:3;9008:4;9001:5;8997:16;8975:52;:::i;:::-;9052:6;9047:3;9043:16;9036:23;;8798:267;;;;;:::o;9071:375::-;;9234:67;9298:2;9293:3;9234:67;:::i;:::-;9227:74;;9331:34;9327:1;9322:3;9318:11;9311:55;9397:13;9392:2;9387:3;9383:12;9376:35;9437:2;9432:3;9428:12;9421:19;;9217:229;;;:::o;9452:382::-;;9615:67;9679:2;9674:3;9615:67;:::i;:::-;9608:74;;9712:34;9708:1;9703:3;9699:11;9692:55;9778:20;9773:2;9768:3;9764:12;9757:42;9825:2;9820:3;9816:12;9809:19;;9598:236;;;:::o;9840:370::-;;10003:67;10067:2;10062:3;10003:67;:::i;:::-;9996:74;;10100:34;10096:1;10091:3;10087:11;10080:55;10166:8;10161:2;10156:3;10152:12;10145:30;10201:2;10196:3;10192:12;10185:19;;9986:224;;;:::o;10216:330::-;;10379:67;10443:2;10438:3;10379:67;:::i;:::-;10372:74;;10476:34;10472:1;10467:3;10463:11;10456:55;10537:2;10532:3;10528:12;10521:19;;10362:184;;;:::o;10552:326::-;;10715:67;10779:2;10774:3;10715:67;:::i;:::-;10708:74;;10812:30;10808:1;10803:3;10799:11;10792:51;10869:2;10864:3;10860:12;10853:19;;10698:180;;;:::o;10884:368::-;;11047:67;11111:2;11106:3;11047:67;:::i;:::-;11040:74;;11144:34;11140:1;11135:3;11131:11;11124:55;11210:6;11205:2;11200:3;11196:12;11189:28;11243:2;11238:3;11234:12;11227:19;;11030:222;;;:::o;11258:323::-;;11421:67;11485:2;11480:3;11421:67;:::i;:::-;11414:74;;11518:27;11514:1;11509:3;11505:11;11498:48;11572:2;11567:3;11563:12;11556:19;;11404:177;;;:::o;11587:329::-;;11750:67;11814:2;11809:3;11750:67;:::i;:::-;11743:74;;11847:33;11843:1;11838:3;11834:11;11827:54;11907:2;11902:3;11898:12;11891:19;;11733:183;;;:::o;11922:376::-;;12085:67;12149:2;12144:3;12085:67;:::i;:::-;12078:74;;12182:34;12178:1;12173:3;12169:11;12162:55;12248:14;12243:2;12238:3;12234:12;12227:36;12289:2;12284:3;12280:12;12273:19;;12068:230;;;:::o;12304:388::-;;12467:67;12531:2;12526:3;12467:67;:::i;:::-;12460:74;;12564:34;12560:1;12555:3;12551:11;12544:55;12630:26;12625:2;12620:3;12616:12;12609:48;12683:2;12678:3;12674:12;12667:19;;12450:242;;;:::o;12698:374::-;;12861:67;12925:2;12920:3;12861:67;:::i;:::-;12854:74;;12958:34;12954:1;12949:3;12945:11;12938:55;13024:12;13019:2;13014:3;13010:12;13003:34;13063:2;13058:3;13054:12;13047:19;;12844:228;;;:::o;13078:373::-;;13241:67;13305:2;13300:3;13241:67;:::i;:::-;13234:74;;13338:34;13334:1;13329:3;13325:11;13318:55;13404:11;13399:2;13394:3;13390:12;13383:33;13442:2;13437:3;13433:12;13426:19;;13224:227;;;:::o;13457:330::-;;13620:67;13684:2;13679:3;13620:67;:::i;:::-;13613:74;;13717:34;13713:1;13708:3;13704:11;13697:55;13778:2;13773:3;13769:12;13762:19;;13603:184;;;:::o;13793:376::-;;13956:67;14020:2;14015:3;13956:67;:::i;:::-;13949:74;;14053:34;14049:1;14044:3;14040:11;14033:55;14119:14;14114:2;14109:3;14105:12;14098:36;14160:2;14155:3;14151:12;14144:19;;13939:230;;;:::o;14175:330::-;;14338:67;14402:2;14397:3;14338:67;:::i;:::-;14331:74;;14435:34;14431:1;14426:3;14422:11;14415:55;14496:2;14491:3;14487:12;14480:19;;14321:184;;;:::o;14511:373::-;;14674:67;14738:2;14733:3;14674:67;:::i;:::-;14667:74;;14771:34;14767:1;14762:3;14758:11;14751:55;14837:11;14832:2;14827:3;14823:12;14816:33;14875:2;14870:3;14866:12;14859:19;;14657:227;;;:::o;14890:379::-;;15053:67;15117:2;15112:3;15053:67;:::i;:::-;15046:74;;15150:34;15146:1;15141:3;15137:11;15130:55;15216:17;15211:2;15206:3;15202:12;15195:39;15260:2;15255:3;15251:12;15244:19;;15036:233;;;:::o;15275:366::-;;15438:67;15502:2;15497:3;15438:67;:::i;:::-;15431:74;;15535:34;15531:1;15526:3;15522:11;15515:55;15601:4;15596:2;15591:3;15587:12;15580:26;15632:2;15627:3;15623:12;15616:19;;15421:220;;;:::o;15647:365::-;;15810:67;15874:2;15869:3;15810:67;:::i;:::-;15803:74;;15907:34;15903:1;15898:3;15894:11;15887:55;15973:3;15968:2;15963:3;15959:12;15952:25;16003:2;15998:3;15994:12;15987:19;;15793:219;;;:::o;16018:325::-;;16181:67;16245:2;16240:3;16181:67;:::i;:::-;16174:74;;16278:29;16274:1;16269:3;16265:11;16258:50;16334:2;16329:3;16325:12;16318:19;;16164:179;;;:::o;16349:366::-;;16512:67;16576:2;16571:3;16512:67;:::i;:::-;16505:74;;16609:34;16605:1;16600:3;16596:11;16589:55;16675:4;16670:2;16665:3;16661:12;16654:26;16706:2;16701:3;16697:12;16690:19;;16495:220;;;:::o;16721:381::-;;16884:67;16948:2;16943:3;16884:67;:::i;:::-;16877:74;;16981:34;16977:1;16972:3;16968:11;16961:55;17047:19;17042:2;17037:3;17033:12;17026:41;17093:2;17088:3;17084:12;17077:19;;16867:235;;;:::o;17108:376::-;;17271:67;17335:2;17330:3;17271:67;:::i;:::-;17264:74;;17368:34;17364:1;17359:3;17355:11;17348:55;17434:14;17429:2;17424:3;17420:12;17413:36;17475:2;17470:3;17466:12;17459:19;;17254:230;;;:::o;17490:322::-;;17653:67;17717:2;17712:3;17653:67;:::i;:::-;17646:74;;17750:26;17746:1;17741:3;17737:11;17730:47;17803:2;17798:3;17794:12;17787:19;;17636:176;;;:::o;17818:118::-;17905:24;17923:5;17905:24;:::i;:::-;17900:3;17893:37;17883:53;;:::o;17942:112::-;18025:22;18041:5;18025:22;:::i;:::-;18020:3;18013:35;18003:51;;:::o;18060:435::-;;18262:95;18353:3;18344:6;18262:95;:::i;:::-;18255:102;;18374:95;18465:3;18456:6;18374:95;:::i;:::-;18367:102;;18486:3;18479:10;;18244:251;;;;;:::o;18501:222::-;;18632:2;18621:9;18617:18;18609:26;;18645:71;18713:1;18702:9;18698:17;18689:6;18645:71;:::i;:::-;18599:124;;;;:::o;18729:640::-;;18962:3;18951:9;18947:19;18939:27;;18976:71;19044:1;19033:9;19029:17;19020:6;18976:71;:::i;:::-;19057:72;19125:2;19114:9;19110:18;19101:6;19057:72;:::i;:::-;19139;19207:2;19196:9;19192:18;19183:6;19139:72;:::i;:::-;19258:9;19252:4;19248:20;19243:2;19232:9;19228:18;19221:48;19286:76;19357:4;19348:6;19286:76;:::i;:::-;19278:84;;18929:440;;;;;;;:::o;19375:210::-;;19500:2;19489:9;19485:18;19477:26;;19513:65;19575:1;19564:9;19560:17;19551:6;19513:65;:::i;:::-;19467:118;;;;:::o;19591:313::-;;19742:2;19731:9;19727:18;19719:26;;19791:9;19785:4;19781:20;19777:1;19766:9;19762:17;19755:47;19819:78;19892:4;19883:6;19819:78;:::i;:::-;19811:86;;19709:195;;;;:::o;19910:419::-;;20114:2;20103:9;20099:18;20091:26;;20163:9;20157:4;20153:20;20149:1;20138:9;20134:17;20127:47;20191:131;20317:4;20191:131;:::i;:::-;20183:139;;20081:248;;;:::o;20335:419::-;;20539:2;20528:9;20524:18;20516:26;;20588:9;20582:4;20578:20;20574:1;20563:9;20559:17;20552:47;20616:131;20742:4;20616:131;:::i;:::-;20608:139;;20506:248;;;:::o;20760:419::-;;20964:2;20953:9;20949:18;20941:26;;21013:9;21007:4;21003:20;20999:1;20988:9;20984:17;20977:47;21041:131;21167:4;21041:131;:::i;:::-;21033:139;;20931:248;;;:::o;21185:419::-;;21389:2;21378:9;21374:18;21366:26;;21438:9;21432:4;21428:20;21424:1;21413:9;21409:17;21402:47;21466:131;21592:4;21466:131;:::i;:::-;21458:139;;21356:248;;;:::o;21610:419::-;;21814:2;21803:9;21799:18;21791:26;;21863:9;21857:4;21853:20;21849:1;21838:9;21834:17;21827:47;21891:131;22017:4;21891:131;:::i;:::-;21883:139;;21781:248;;;:::o;22035:419::-;;22239:2;22228:9;22224:18;22216:26;;22288:9;22282:4;22278:20;22274:1;22263:9;22259:17;22252:47;22316:131;22442:4;22316:131;:::i;:::-;22308:139;;22206:248;;;:::o;22460:419::-;;22664:2;22653:9;22649:18;22641:26;;22713:9;22707:4;22703:20;22699:1;22688:9;22684:17;22677:47;22741:131;22867:4;22741:131;:::i;:::-;22733:139;;22631:248;;;:::o;22885:419::-;;23089:2;23078:9;23074:18;23066:26;;23138:9;23132:4;23128:20;23124:1;23113:9;23109:17;23102:47;23166:131;23292:4;23166:131;:::i;:::-;23158:139;;23056:248;;;:::o;23310:419::-;;23514:2;23503:9;23499:18;23491:26;;23563:9;23557:4;23553:20;23549:1;23538:9;23534:17;23527:47;23591:131;23717:4;23591:131;:::i;:::-;23583:139;;23481:248;;;:::o;23735:419::-;;23939:2;23928:9;23924:18;23916:26;;23988:9;23982:4;23978:20;23974:1;23963:9;23959:17;23952:47;24016:131;24142:4;24016:131;:::i;:::-;24008:139;;23906:248;;;:::o;24160:419::-;;24364:2;24353:9;24349:18;24341:26;;24413:9;24407:4;24403:20;24399:1;24388:9;24384:17;24377:47;24441:131;24567:4;24441:131;:::i;:::-;24433:139;;24331:248;;;:::o;24585:419::-;;24789:2;24778:9;24774:18;24766:26;;24838:9;24832:4;24828:20;24824:1;24813:9;24809:17;24802:47;24866:131;24992:4;24866:131;:::i;:::-;24858:139;;24756:248;;;:::o;25010:419::-;;25214:2;25203:9;25199:18;25191:26;;25263:9;25257:4;25253:20;25249:1;25238:9;25234:17;25227:47;25291:131;25417:4;25291:131;:::i;:::-;25283:139;;25181:248;;;:::o;25435:419::-;;25639:2;25628:9;25624:18;25616:26;;25688:9;25682:4;25678:20;25674:1;25663:9;25659:17;25652:47;25716:131;25842:4;25716:131;:::i;:::-;25708:139;;25606:248;;;:::o;25860:419::-;;26064:2;26053:9;26049:18;26041:26;;26113:9;26107:4;26103:20;26099:1;26088:9;26084:17;26077:47;26141:131;26267:4;26141:131;:::i;:::-;26133:139;;26031:248;;;:::o;26285:419::-;;26489:2;26478:9;26474:18;26466:26;;26538:9;26532:4;26528:20;26524:1;26513:9;26509:17;26502:47;26566:131;26692:4;26566:131;:::i;:::-;26558:139;;26456:248;;;:::o;26710:419::-;;26914:2;26903:9;26899:18;26891:26;;26963:9;26957:4;26953:20;26949:1;26938:9;26934:17;26927:47;26991:131;27117:4;26991:131;:::i;:::-;26983:139;;26881:248;;;:::o;27135:419::-;;27339:2;27328:9;27324:18;27316:26;;27388:9;27382:4;27378:20;27374:1;27363:9;27359:17;27352:47;27416:131;27542:4;27416:131;:::i;:::-;27408:139;;27306:248;;;:::o;27560:419::-;;27764:2;27753:9;27749:18;27741:26;;27813:9;27807:4;27803:20;27799:1;27788:9;27784:17;27777:47;27841:131;27967:4;27841:131;:::i;:::-;27833:139;;27731:248;;;:::o;27985:419::-;;28189:2;28178:9;28174:18;28166:26;;28238:9;28232:4;28228:20;28224:1;28213:9;28209:17;28202:47;28266:131;28392:4;28266:131;:::i;:::-;28258:139;;28156:248;;;:::o;28410:419::-;;28614:2;28603:9;28599:18;28591:26;;28663:9;28657:4;28653:20;28649:1;28638:9;28634:17;28627:47;28691:131;28817:4;28691:131;:::i;:::-;28683:139;;28581:248;;;:::o;28835:419::-;;29039:2;29028:9;29024:18;29016:26;;29088:9;29082:4;29078:20;29074:1;29063:9;29059:17;29052:47;29116:131;29242:4;29116:131;:::i;:::-;29108:139;;29006:248;;;:::o;29260:419::-;;29464:2;29453:9;29449:18;29441:26;;29513:9;29507:4;29503:20;29499:1;29488:9;29484:17;29477:47;29541:131;29667:4;29541:131;:::i;:::-;29533:139;;29431:248;;;:::o;29685:419::-;;29889:2;29878:9;29874:18;29866:26;;29938:9;29932:4;29928:20;29924:1;29913:9;29909:17;29902:47;29966:131;30092:4;29966:131;:::i;:::-;29958:139;;29856:248;;;:::o;30110:222::-;;30241:2;30230:9;30226:18;30218:26;;30254:71;30322:1;30311:9;30307:17;30298:6;30254:71;:::i;:::-;30208:124;;;;:::o;30338:214::-;;30465:2;30454:9;30450:18;30442:26;;30478:67;30542:1;30531:9;30527:17;30518:6;30478:67;:::i;:::-;30432:120;;;;:::o;30558:283::-;;30624:2;30618:9;30608:19;;30666:4;30658:6;30654:17;30773:6;30761:10;30758:22;30737:18;30725:10;30722:34;30719:62;30716:2;;;30784:18;;:::i;:::-;30716:2;30824:10;30820:2;30813:22;30598:243;;;;:::o;30847:331::-;;30998:18;30990:6;30987:30;30984:2;;;31020:18;;:::i;:::-;30984:2;31105:4;31101:9;31094:4;31086:6;31082:17;31078:33;31070:41;;31166:4;31160;31156:15;31148:23;;30913:265;;;:::o;31184:332::-;;31336:18;31328:6;31325:30;31322:2;;;31358:18;;:::i;:::-;31322:2;31443:4;31439:9;31432:4;31424:6;31420:17;31416:33;31408:41;;31504:4;31498;31494:15;31486:23;;31251:265;;;:::o;31522:98::-;;31607:5;31601:12;31591:22;;31580:40;;;:::o;31626:99::-;;31712:5;31706:12;31696:22;;31685:40;;;:::o;31731:168::-;;31848:6;31843:3;31836:19;31888:4;31883:3;31879:14;31864:29;;31826:73;;;;:::o;31905:169::-;;32023:6;32018:3;32011:19;32063:4;32058:3;32054:14;32039:29;;32001:73;;;;:::o;32080:148::-;;32219:3;32204:18;;32194:34;;;;:::o;32234:305::-;;32293:20;32311:1;32293:20;:::i;:::-;32288:25;;32327:20;32345:1;32327:20;:::i;:::-;32322:25;;32481:1;32413:66;32409:74;32406:1;32403:81;32400:2;;;32487:18;;:::i;:::-;32400:2;32531:1;32528;32524:9;32517:16;;32278:261;;;;:::o;32545:185::-;;32602:20;32620:1;32602:20;:::i;:::-;32597:25;;32636:20;32654:1;32636:20;:::i;:::-;32631:25;;32675:1;32665:2;;32680:18;;:::i;:::-;32665:2;32722:1;32719;32715:9;32710:14;;32587:143;;;;:::o;32736:348::-;;32799:20;32817:1;32799:20;:::i;:::-;32794:25;;32833:20;32851:1;32833:20;:::i;:::-;32828:25;;33021:1;32953:66;32949:74;32946:1;32943:81;32938:1;32931:9;32924:17;32920:105;32917:2;;;33028:18;;:::i;:::-;32917:2;33076:1;33073;33069:9;33058:20;;32784:300;;;;:::o;33090:191::-;;33150:20;33168:1;33150:20;:::i;:::-;33145:25;;33184:20;33202:1;33184:20;:::i;:::-;33179:25;;33223:1;33220;33217:8;33214:2;;;33228:18;;:::i;:::-;33214:2;33273:1;33270;33266:9;33258:17;;33135:146;;;;:::o;33287:185::-;;33345:18;33361:1;33345:18;:::i;:::-;33340:23;;33377:18;33393:1;33377:18;:::i;:::-;33372:23;;33414:1;33411;33408:8;33405:2;;;33419:18;;:::i;:::-;33405:2;33464:1;33461;33457:9;33449:17;;33330:142;;;;:::o;33478:96::-;;33544:24;33562:5;33544:24;:::i;:::-;33533:35;;33523:51;;;:::o;33580:90::-;;33657:5;33650:13;33643:21;33632:32;;33622:48;;;:::o;33676:149::-;;33752:66;33745:5;33741:78;33730:89;;33720:105;;;:::o;33831:126::-;;33908:42;33901:5;33897:54;33886:65;;33876:81;;;:::o;33963:77::-;;34029:5;34018:16;;34008:32;;;:::o;34046:86::-;;34121:4;34114:5;34110:16;34099:27;;34089:43;;;:::o;34138:154::-;34222:6;34217:3;34212;34199:30;34284:1;34275:6;34270:3;34266:16;34259:27;34189:103;;;:::o;34298:307::-;34366:1;34376:113;34390:6;34387:1;34384:13;34376:113;;;34475:1;34470:3;34466:11;34460:18;34456:1;34451:3;34447:11;34440:39;34412:2;34409:1;34405:10;34400:15;;34376:113;;;34507:6;34504:1;34501:13;34498:2;;;34587:1;34578:6;34573:3;34569:16;34562:27;34498:2;34347:258;;;;:::o;34611:320::-;;34692:1;34686:4;34682:12;34672:22;;34739:1;34733:4;34729:12;34760:18;34750:2;;34816:4;34808:6;34804:17;34794:27;;34750:2;34878;34870:6;34867:14;34847:18;34844:38;34841:2;;;34897:18;;:::i;:::-;34841:2;34662:269;;;;:::o;34937:233::-;;34999:24;35017:5;34999:24;:::i;:::-;34990:33;;35045:66;35038:5;35035:77;35032:2;;;35115:18;;:::i;:::-;35032:2;35162:1;35155:5;35151:13;35144:20;;34980:190;;;:::o;35176:176::-;;35225:20;35243:1;35225:20;:::i;:::-;35220:25;;35259:20;35277:1;35259:20;:::i;:::-;35254:25;;35298:1;35288:2;;35303:18;;:::i;:::-;35288:2;35344:1;35341;35337:9;35332:14;;35210:142;;;;:::o;35358:180::-;35406:77;35403:1;35396:88;35503:4;35500:1;35493:15;35527:4;35524:1;35517:15;35544:180;35592:77;35589:1;35582:88;35689:4;35686:1;35679:15;35713:4;35710:1;35703:15;35730:180;35778:77;35775:1;35768:88;35875:4;35872:1;35865:15;35899:4;35896:1;35889:15;35916:180;35964:77;35961:1;35954:88;36061:4;36058:1;36051:15;36085:4;36082:1;36075:15;36102:102;;36194:2;36190:7;36185:2;36178:5;36174:14;36170:28;36160:38;;36150:54;;;:::o;36210:122::-;36283:24;36301:5;36283:24;:::i;:::-;36276:5;36273:35;36263:2;;36322:1;36319;36312:12;36263:2;36253:79;:::o;36338:116::-;36408:21;36423:5;36408:21;:::i;:::-;36401:5;36398:32;36388:2;;36444:1;36441;36434:12;36388:2;36378:76;:::o;36460:120::-;36532:23;36549:5;36532:23;:::i;:::-;36525:5;36522:34;36512:2;;36570:1;36567;36560:12;36512:2;36502:78;:::o;36586:122::-;36659:24;36677:5;36659:24;:::i;:::-;36652:5;36649:35;36639:2;;36698:1;36695;36688:12;36639:2;36629:79;:::o;36714:118::-;36785:22;36801:5;36785:22;:::i;:::-;36778:5;36775:33;36765:2;;36822:1;36819;36812:12;36765:2;36755:77;:::o

Swarm Source

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