ETH Price: $3,214.97 (+2.13%)
Gas: 5 Gwei

Token

Tutti (TF)
 

Overview

Max Total Supply

111 TF

Holders

102

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

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

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Tutti

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 19 of 19: Tutti.sol
// SPDX-License-Identifier: MIT
/*

███████╗██████╗ ██╗   ██╗████████╗██╗███████╗   
██╔════╝██╔══██╗██║   ██║╚══██╔══╝██║╚══███╔╝
█████╗  ██████╔╝██║   ██║   ██║   ██║  ███╔╝ 
██╔══╝  ██╔══██╗██║   ██║   ██║   ██║ ███╔╝  
██║     ██║  ██║╚██████╔╝   ██║   ██║███████╗
╚═╝     ╚═╝  ╚═╝ ╚═════╝    ╚═╝   ╚═╝╚══════╝   
⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⡄⠀⠀⠀⠀⢀⠀⠀
⠀⠀⠀⠀⠀⠀⣏⠓⠒⠤⣰⠋⠹⡄⠀⣠⠞⣿⠀⠀
⠀⠀⠀⢀⠄⠂⠙⢦⡀⠐⠨⣆⠁⣷⣮⠖⠋⠉⠁⠀
⠀⠀⡰⠁⠀⠮⠇⠀⣩⠶⠒⠾⣿⡯⡋⠩⡓⢦⣀⡀
⠀⡰⢰⡹⠀⠀⠲⣾⣁⣀⣤⠞⢧⡈⢊⢲⠶⠶⠛⠁
⢀⠃⠀⠀⠀⣌⡅⠀⢀⡀⠀⠀⣈⠻⠦⣤⣿⡀⠀⠀
⠸⣎⠇⠀⠀⡠⡄⠀⠷⠎⠀⠐⡶⠁⠀⠀⣟⡇⠀⠀
⡇⠀⡠⣄⠀⠷⠃⠀⠀⡤⠄⠀⠀⣔⡰⠀⢩⠇⠀⠀
⡇⠀⠻⠋⠀⢀⠤⠀⠈⠛⠁⠀⢀⠉⠁⣠⠏⠀⠀⠀
⣷⢰⢢⠀⠀⠘⠚⠀⢰⣂⠆⠰⢥⡡⠞⠁⠀⠀⠀⠀
⠸⣎⠋⢠⢢⠀⢠⢀⠀⠀⣠⠴⠋⠀⠀⠀⠀⠀⠀⠀
⠀⠘⠷⣬⣅⣀⣬⡷⠖⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀                                                                                  
*/
pragma solidity >= 0.8 .9 < 0.9 .0;

import './ERC721AQueryable.sol';
import './Ownable.sol';
import './ReentrancyGuard.sol';
import './SignedTokenVerifier.sol';
import './Pausable.sol';

contract Tutti is ERC721AQueryable, Ownable, ReentrancyGuard, SignedTokenVerifier, Pausable {
  using Strings for uint256;

  string public uriPrefix = '';
  uint256 public cost = 0.2 ether;
  uint256 public maxSupply = 111;

  uint256 public maxMintAmountPerTx = 1;
  bool public revealed = false;
  string public hiddenMetadataUri = "https://ipfs.io/ipfs/QmUm8NCYFfwxXX8r7YuFEGGZyrxNQarJ2zRKikfXoA1aW5";
  mapping(string => bool) public minted;

  string private uriSuffix = '.json';
  uint256 private orders = 111;
  event Minted(address owner, string email);

  constructor(address _signer) ERC721A("Tutti", "TF") {
    _setSigner(_signer);
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply - orders, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceCompliance(uint256 _mintAmount) {
    require(msg.value >= cost * _mintAmount, 'Insufficient funds!');
    _;
  }

  function mint(uint256 _mintAmount, string memory _email) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) whenNotPaused {
    _safeMint(_msgSender(), _mintAmount);
    emit Minted(_msgSender(), _email);
  }

  function freeMint(uint256 _amount, bytes calldata _token, string calldata _email, string calldata _salt) public nonReentrant {
    require(totalSupply() + _amount <= maxSupply, 'Max supply exceeded!');
    require(verifyTokenForAddress(_salt, _email, _amount, _token, msg.sender), "Unauthorized");
    require(!minted[_email], "Token already minted!");
    _safeMint(msg.sender, _amount);
    minted[_email] = true;
  }

  function teamMint(uint256 _teamAmount) external onlyOwner {
    require(totalSupply() + _teamAmount <= maxSupply - orders, 'Max supply exceeded!');
    _safeMint(_msgSender(), _teamAmount);
  }

  function airdrop(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

  function airdrops(address[] memory _addresses) public onlyOwner {
    for (uint i = 0; i < _addresses.length; i++) {
      airdrop(1, _addresses[i]);
    }
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns(string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0 ?
      string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) :
      '';
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setOrders(uint256 _orders) public onlyOwner {
    orders = _orders;
  }

  function setMaxSupply(uint256 _maxSupply) public onlyOwner {
    maxSupply = _maxSupply;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function withdraw() public onlyOwner nonReentrant {
    (bool os, ) = payable(owner()).call {value: address(this).balance}('');
    require(os);
  }

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

  function _startTokenId() internal view virtual override returns(uint256) {
    return 1;
  }
}

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 19: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

File 4 of 19: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 19: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';
import './IERC721Receiver.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. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

File 7 of 19: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import './ERC721A.sol';

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 19: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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 10 of 19: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721.sol';
import './IERC721Metadata.sol';

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

File 11 of 19: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 15 of 19: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 16 of 19: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 17 of 19: SignedTokenVerifier.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "./Ownable.sol";
import "./ECDSA.sol";

contract SignedTokenVerifier {
    using ECDSA for bytes32;

    address private _signer;
    event SignerUpdated(address newSigner);

    constructor() {
    }

    function _setSigner(address _newSigner) internal {
        _signer = _newSigner;
        emit SignerUpdated(_signer);
    }

    function _hash(string calldata _salt, string calldata _email, uint256 _amount, address _address)
        internal
        view
        returns (bytes32)
    {
        return keccak256(abi.encode(_salt, _email, _amount, address(this), _address));
    }

    function _recover(bytes32 hash, bytes memory token)
        internal
        pure
        returns (address)
    {
        return hash.toEthSignedMessageHash().recover(token);
    }

    function getAddress(
        string calldata _salt,
        string calldata _email,
        uint256 _amount,
        bytes calldata _token,
        address _address
    ) internal view returns (address) {
        return _recover(_hash(_salt, _email, _amount, _address), _token);
    }

    function verifyTokenForAddress(
        string calldata _salt,
        string calldata _email,
        uint256 _amount,
        bytes calldata _token,
        address _address
    ) internal view returns (bool) {
        return getAddress(_salt, _email, _amount, _token, _address) == _signer;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

    function toHexString(bytes memory data) internal pure returns(string memory) {
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
          str[2+i*2] = _HEX_SYMBOLS[uint(uint8(data[i] >> 4))];
            str[3+i*2] = _HEX_SYMBOLS[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }

   function toString(address account) internal pure returns(string memory) {
    return toHexString(abi.encodePacked(account));
   }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"email","type":"string"}],"name":"Minted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"SignerUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"airdrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_token","type":"bytes"},{"internalType":"string","name":"_email","type":"string"},{"internalType":"string","name":"_salt","type":"string"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"string","name":"_email","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orders","type":"uint256"}],"name":"setOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"_teamAmount","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600b9162000214565b506702c68af0bb140000600c55606f600d556001600e55600f805460ff1916905560408051608081019091526043808252620034ba602083013980516200006b9160109160209091019062000214565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200009a9160129162000214565b50606f601355348015620000ad57600080fd5b50604051620034fd380380620034fd833981016040819052620000d091620002ba565b60405180604001604052806005815260200164547574746960d81b815250604051806040016040528060028152602001612a2360f11b81525081600290805190602001906200012192919062000214565b5080516200013790600390602084019062000214565b50506001600055506200014a336200016e565b6001600955600a805460ff60a01b191690556200016781620001c0565b5062000329565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f5553331329228fbd4123164423717a4a7539f6dfa1c3279a923b98fd681a6c739060200160405180910390a150565b8280546200022290620002ec565b90600052602060002090601f01602090048101928262000246576000855562000291565b82601f106200026157805160ff191683800117855562000291565b8280016001018555821562000291579182015b828111156200029157825182559160200191906001019062000274565b506200029f929150620002a3565b5090565b5b808211156200029f5760008155600101620002a4565b600060208284031215620002cd57600080fd5b81516001600160a01b0381168114620002e557600080fd5b9392505050565b600181811c908216806200030157607f821691505b602082108114156200032357634e487b7160e01b600052602260045260246000fd5b50919050565b61318180620003396000396000f3fe60806040526004361061025c5760003560e01c80636f8b44b011610144578063a45ba8e7116100b6578063c87b56dd1161007a578063c87b56dd14610716578063d5abeb0114610736578063e0a808531461074c578063e985e9c51461076c578063eaa4f0071461078c578063f2fde38b146107ac57600080fd5b8063a45ba8e714610674578063b071401b14610689578063b88d4fde146106a9578063bc63f02e146106c9578063c23dc68f146106e957600080fd5b80638462151c116101085780638462151c146105be5780638da5cb5b146105eb57806394354fd01461060957806395d89b411461061f57806399a2557a14610634578063a22cb4651461065457600080fd5b80636f8b44b01461053657806370a0823114610556578063715018a61461057657806377097fc81461058b5780637ec4a6591461059e57600080fd5b806342842e0e116101dd57806351830227116101a157806351830227146104605780635bbb21771461047a5780635c975abb146104a757806362b99ad4146104c65780636352211e146104db5780636a247daa146104fb57600080fd5b806342842e0e146103c057806344a0d68a146103e05780634db00d7d146104005780634e99d51e146104205780634fdd43cb1461044057600080fd5b806316ba10e01161022457806316ba10e01461033657806318160ddd1461035657806323b872dd1461036b5780632fbba1151461038b5780633ccfd60b146103ab57600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b8578063095ea7b3146102f057806313faede614610312575b600080fd5b34801561026d57600080fd5b5061028161027c36600461272b565b6107cc565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab61081e565b60405161028d91906127a0565b3480156102c457600080fd5b506102d86102d33660046127b3565b6108b0565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b3660046127e8565b6108f4565b005b34801561031e57600080fd5b50610328600c5481565b60405190815260200161028d565b34801561034257600080fd5b506103106103513660046128cf565b61097b565b34801561036257600080fd5b506103286109c5565b34801561037757600080fd5b50610310610386366004612903565b6109d3565b34801561039757600080fd5b506103106103a63660046127b3565b6109de565b3480156103b757600080fd5b50610310610a56565b3480156103cc57600080fd5b506103106103db366004612903565b610b51565b3480156103ec57600080fd5b506103106103fb3660046127b3565b610b6c565b34801561040c57600080fd5b5061031061041b366004612980565b610b9b565b34801561042c57600080fd5b5061031061043b366004612a46565b610d28565b34801561044c57600080fd5b5061031061045b3660046128cf565b610d94565b34801561046c57600080fd5b50600f546102819060ff1681565b34801561048657600080fd5b5061049a610495366004612ae2565b610dd1565b60405161028d9190612b67565b3480156104b357600080fd5b50600a54600160a01b900460ff16610281565b3480156104d257600080fd5b506102ab610e97565b3480156104e757600080fd5b506102d86104f63660046127b3565b610f25565b34801561050757600080fd5b506102816105163660046128cf565b805160208183018101805160118252928201919093012091525460ff1681565b34801561054257600080fd5b506103106105513660046127b3565b610f37565b34801561056257600080fd5b50610328610571366004612bd1565b610f66565b34801561058257600080fd5b50610310610fb4565b610310610599366004612bec565b610fea565b3480156105aa57600080fd5b506103106105b93660046128cf565b61116b565b3480156105ca57600080fd5b506105de6105d9366004612bd1565b6111a8565b60405161028d9190612c32565b3480156105f757600080fd5b506008546001600160a01b03166102d8565b34801561061557600080fd5b50610328600e5481565b34801561062b57600080fd5b506102ab6112f5565b34801561064057600080fd5b506105de61064f366004612c6a565b611304565b34801561066057600080fd5b5061031061066f366004612cad565b6114ca565b34801561068057600080fd5b506102ab611560565b34801561069557600080fd5b506103106106a43660046127b3565b61156d565b3480156106b557600080fd5b506103106106c4366004612ce0565b61159c565b3480156106d557600080fd5b506103106106e4366004612d5b565b6115e6565b3480156106f557600080fd5b506107096107043660046127b3565b6116b1565b60405161028d9190612d7e565b34801561072257600080fd5b506102ab6107313660046127b3565b61176b565b34801561074257600080fd5b50610328600d5481565b34801561075857600080fd5b50610310610767366004612db3565b6118d4565b34801561077857600080fd5b50610281610787366004612dce565b611911565b34801561079857600080fd5b506103106107a73660046127b3565b61193f565b3480156107b857600080fd5b506103106107c7366004612bd1565b61196e565b60006001600160e01b031982166380ac58cd60e01b14806107fd57506001600160e01b03198216635b5e139f60e01b145b8061081857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461082d90612df8565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612df8565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b60006108bb82611a06565b6108d8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108ff82610f25565b9050806001600160a01b0316836001600160a01b031614156109345760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461096b5761094e8133611911565b61096b576040516367d9dca160e11b815260040160405180910390fd5b610976838383611a3f565b505050565b6008546001600160a01b031633146109ae5760405162461bcd60e51b81526004016109a590612e33565b60405180910390fd5b80516109c190601290602084019061267c565b5050565b600154600054036000190190565b610976838383611a9b565b6008546001600160a01b03163314610a085760405162461bcd60e51b81526004016109a590612e33565b601354600d54610a189190612e7e565b81610a216109c5565b610a2b9190612e95565b1115610a495760405162461bcd60e51b81526004016109a590612ead565b610a533382611c88565b50565b6008546001600160a01b03163314610a805760405162461bcd60e51b81526004016109a590612e33565b60026009541415610ad35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a5565b60026009556000610aec6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b36576040519150601f19603f3d011682016040523d82523d6000602084013e610b3b565b606091505b5050905080610b4957600080fd5b506001600955565b6109768383836040518060200160405280600081525061159c565b6008546001600160a01b03163314610b965760405162461bcd60e51b81526004016109a590612e33565b600c55565b60026009541415610bee5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a5565b6002600955600d5487610bff6109c5565b610c099190612e95565b1115610c275760405162461bcd60e51b81526004016109a590612ead565b610c37828286868b8b8b33611ca2565b610c725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064016109a5565b60118484604051610c84929190612edb565b9081526040519081900360200190205460ff1615610cdc5760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20616c7265616479206d696e7465642160581b60448201526064016109a5565b610ce63388611c88565b600160118585604051610cfa929190612edb565b908152604051908190036020019020805491151560ff19909216919091179055505060016009555050505050565b6008546001600160a01b03163314610d525760405162461bcd60e51b81526004016109a590612e33565b60005b81518110156109c157610d826001838381518110610d7557610d75612eeb565b60200260200101516115e6565b80610d8c81612f01565b915050610d55565b6008546001600160a01b03163314610dbe5760405162461bcd60e51b81526004016109a590612e33565b80516109c190601090602084019061267c565b80516060906000816001600160401b03811115610df057610df0612812565b604051908082528060200260200182016040528015610e3b57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610e0e5790505b50905060005b828114610e8f57610e6a858281518110610e5d57610e5d612eeb565b60200260200101516116b1565b828281518110610e7c57610e7c612eeb565b6020908102919091010152600101610e41565b509392505050565b600b8054610ea490612df8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed090612df8565b8015610f1d5780601f10610ef257610100808354040283529160200191610f1d565b820191906000526020600020905b815481529060010190602001808311610f0057829003601f168201915b505050505081565b6000610f3082611cd8565b5192915050565b6008546001600160a01b03163314610f615760405162461bcd60e51b81526004016109a590612e33565b600d55565b60006001600160a01b038216610f8f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610fde5760405162461bcd60e51b81526004016109a590612e33565b610fe86000611dfa565b565b81600081118015610ffd5750600e548111155b6110405760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016109a5565b601354600d546110509190612e7e565b816110596109c5565b6110639190612e95565b11156110815760405162461bcd60e51b81526004016109a590612ead565b8280600c546110909190612f1c565b3410156110d55760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109a5565b600a54600160a01b900460ff16156111225760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109a5565b61112c3385611c88565b7f0c1b180fbb60448c5491c5ddc7c3a923854214b9ff70f90a7821333338971f92338460405161115d929190612f3b565b60405180910390a150505050565b6008546001600160a01b031633146111955760405162461bcd60e51b81526004016109a590612e33565b80516109c190600b90602084019061267c565b606060008060006111b885610f66565b90506000816001600160401b038111156111d4576111d4612812565b6040519080825280602002602001820160405280156111fd578160200160208202803683370190505b509050611223604080516060810182526000808252602082018190529181019190915290565b60015b8386146112e957600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252925061128c576112e1565b81516001600160a01b0316156112a157815194505b876001600160a01b0316856001600160a01b031614156112e157808387806001019850815181106112d4576112d4612eeb565b6020026020010181815250505b600101611226565b50909695505050505050565b60606003805461082d90612df8565b606081831061132657604051631960ccad60e11b815260040160405180910390fd5b60008054600185101561133857600194505b80841115611344578093505b600061134f87610f66565b90508486101561136e5785850381811015611368578091505b50611372565b5060005b6000816001600160401b0381111561138c5761138c612812565b6040519080825280602002602001820160405280156113b5578160200160208202803683370190505b509050816113c85793506114c392505050565b60006113d3886116b1565b9050600081604001516113e4575080515b885b8881141580156113f65750848714155b156114b757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252935061145a576114af565b82516001600160a01b03161561146f57825191505b8a6001600160a01b0316826001600160a01b031614156114af57808488806001019950815181106114a2576114a2612eeb565b6020026020010181815250505b6001016113e6565b50505092835250909150505b9392505050565b6001600160a01b0382163314156114f45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60108054610ea490612df8565b6008546001600160a01b031633146115975760405162461bcd60e51b81526004016109a590612e33565b600e55565b6115a7848484611a9b565b6001600160a01b0383163b156115e0576115c384848484611e4c565b6115e0576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b816000811180156115f95750600e548111155b61163c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016109a5565b601354600d5461164c9190612e7e565b816116556109c5565b61165f9190612e95565b111561167d5760405162461bcd60e51b81526004016109a590612ead565b6008546001600160a01b031633146116a75760405162461bcd60e51b81526004016109a590612e33565b6109768284611c88565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806116f757506000548310155b156117025792915050565b50600082815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906117625792915050565b6114c383611cd8565b606061177682611a06565b6117da5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a5565b600f5460ff1661187657601080546117f190612df8565b80601f016020809104026020016040519081016040528092919081815260200182805461181d90612df8565b801561186a5780601f1061183f5761010080835404028352916020019161186a565b820191906000526020600020905b81548152906001019060200180831161184d57829003601f168201915b50505050509050919050565b6000611880611f44565b905060008151116118a057604051806020016040528060008152506114c3565b806118aa84611f53565b60126040516020016118be93929190612f5f565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146118fe5760405162461bcd60e51b81526004016109a590612e33565b600f805460ff1916911515919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146119695760405162461bcd60e51b81526004016109a590612e33565b601355565b6008546001600160a01b031633146119985760405162461bcd60e51b81526004016109a590612e33565b6001600160a01b0381166119fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a5565b610a5381611dfa565b600081600111158015611a1a575060005482105b8015610818575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611aa682611cd8565b9050836001600160a01b031681600001516001600160a01b031614611add5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611afb5750611afb8533611911565b80611b16575033611b0b846108b0565b6001600160a01b0316145b905080611b3657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611b5d57604051633a954ecd60e21b815260040160405180910390fd5b611b6960008487611a3f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611c3d576000548214611c3d57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6109c1828260405180602001604052806000815250612050565b600a546000906001600160a01b0316611cc18a8a8a8a8a8a8a8a612214565b6001600160a01b0316149998505050505050505050565b60408051606081018252600080825260208201819052918101919091528180600111611de157600054811015611de157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611ddf5780516001600160a01b031615611d76579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611dda579392505050565b611d76565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611e81903390899088908890600401613023565b602060405180830381600087803b158015611e9b57600080fd5b505af1925050508015611ecb575060408051601f3d908101601f19168201909252611ec891810190613060565b60015b611f26573d808015611ef9576040519150601f19603f3d011682016040523d82523d6000602084013e611efe565b606091505b508051611f1e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600b805461082d90612df8565b606081611f775750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fa15780611f8b81612f01565b9150611f9a9050600a83613093565b9150611f7b565b6000816001600160401b03811115611fbb57611fbb612812565b6040519080825280601f01601f191660200182016040528015611fe5576020820181803683370190505b5090505b8415611f3c57611ffa600183612e7e565b9150612007600a866130a7565b612012906030612e95565b60f81b81838151811061202757612027612eeb565b60200101906001600160f81b031916908160001a905350612049600a86613093565b9450611fe9565b6000546001600160a01b03841661207957604051622e076360e81b815260040160405180910390fd5b826120975760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156121bf575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46121886000878480600101955087611e4c565b6121a5576040516368d2bf6b60e11b815260040160405180910390fd5b80821061213d5782600054146121ba57600080fd5b612204565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106121c0575b5060009081556115e09085838684565b60006122636122278a8a8a8a8a88612270565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122b192505050565b9998505050505050505050565b60008686868686308760405160200161228f97969594939291906130e4565b6040516020818303038152906040528051906020012090509695505050505050565b60006114c38261230e856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90600080600061231e858561232b565b91509150610e8f8161239b565b6000808251604114156123625760208301516040840151606085015160001a61235687828585612556565b94509450505050612394565b82516040141561238c5760208301516040840151612381868383612643565b935093505050612394565b506000905060025b9250929050565b60008160048111156123af576123af613135565b14156123b85750565b60018160048111156123cc576123cc613135565b141561241a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109a5565b600281600481111561242e5761242e613135565b141561247c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109a5565b600381600481111561249057612490613135565b14156124e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109a5565b60048160048111156124fd576124fd613135565b1415610a535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109a5565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561258d575060009050600361263a565b8460ff16601b141580156125a557508460ff16601c14155b156125b6575060009050600461263a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561260a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126335760006001925092505061263a565b9150600090505b94509492505050565b6000806001600160ff1b0383168161266060ff86901c601b612e95565b905061266e87828885612556565b935093505050935093915050565b82805461268890612df8565b90600052602060002090601f0160209004810192826126aa57600085556126f0565b82601f106126c357805160ff19168380011785556126f0565b828001600101855582156126f0579182015b828111156126f05782518255916020019190600101906126d5565b506126fc929150612700565b5090565b5b808211156126fc5760008155600101612701565b6001600160e01b031981168114610a5357600080fd5b60006020828403121561273d57600080fd5b81356114c381612715565b60005b8381101561276357818101518382015260200161274b565b838111156115e05750506000910152565b6000815180845261278c816020860160208601612748565b601f01601f19169290920160200192915050565b6020815260006114c36020830184612774565b6000602082840312156127c557600080fd5b5035919050565b80356001600160a01b03811681146127e357600080fd5b919050565b600080604083850312156127fb57600080fd5b612804836127cc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561285057612850612812565b604052919050565b60006001600160401b0383111561287157612871612812565b612884601f8401601f1916602001612828565b905082815283838301111561289857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126128c057600080fd5b6114c383833560208501612858565b6000602082840312156128e157600080fd5b81356001600160401b038111156128f757600080fd5b611f3c848285016128af565b60008060006060848603121561291857600080fd5b612921846127cc565b925061292f602085016127cc565b9150604084013590509250925092565b60008083601f84011261295157600080fd5b5081356001600160401b0381111561296857600080fd5b60208301915083602082850101111561239457600080fd5b60008060008060008060006080888a03121561299b57600080fd5b8735965060208801356001600160401b03808211156129b957600080fd5b6129c58b838c0161293f565b909850965060408a01359150808211156129de57600080fd5b6129ea8b838c0161293f565b909650945060608a0135915080821115612a0357600080fd5b50612a108a828b0161293f565b989b979a50959850939692959293505050565b60006001600160401b03821115612a3c57612a3c612812565b5060051b60200190565b60006020808385031215612a5957600080fd5b82356001600160401b03811115612a6f57600080fd5b8301601f81018513612a8057600080fd5b8035612a93612a8e82612a23565b612828565b81815260059190911b82018301908381019087831115612ab257600080fd5b928401925b82841015612ad757612ac8846127cc565b82529284019290840190612ab7565b979650505050505050565b60006020808385031215612af557600080fd5b82356001600160401b03811115612b0b57600080fd5b8301601f81018513612b1c57600080fd5b8035612b2a612a8e82612a23565b81815260059190911b82018301908381019087831115612b4957600080fd5b928401925b82841015612ad757833582529284019290840190612b4e565b6020808252825182820181905260009190848201906040850190845b818110156112e957612bbe83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612b83565b600060208284031215612be357600080fd5b6114c3826127cc565b60008060408385031215612bff57600080fd5b8235915060208301356001600160401b03811115612c1c57600080fd5b612c28858286016128af565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156112e957835183529284019291840191600101612c4e565b600080600060608486031215612c7f57600080fd5b612c88846127cc565b95602085013595506040909401359392505050565b803580151581146127e357600080fd5b60008060408385031215612cc057600080fd5b612cc9836127cc565b9150612cd760208401612c9d565b90509250929050565b60008060008060808587031215612cf657600080fd5b612cff856127cc565b9350612d0d602086016127cc565b92506040850135915060608501356001600160401b03811115612d2f57600080fd5b8501601f81018713612d4057600080fd5b612d4f87823560208401612858565b91505092959194509250565b60008060408385031215612d6e57600080fd5b82359150612cd7602084016127cc565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610818565b600060208284031215612dc557600080fd5b6114c382612c9d565b60008060408385031215612de157600080fd5b612dea836127cc565b9150612cd7602084016127cc565b600181811c90821680612e0c57607f821691505b60208210811415612e2d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015612e9057612e90612e68565b500390565b60008219821115612ea857612ea8612e68565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612f1557612f15612e68565b5060010190565b6000816000190483118215151615612f3657612f36612e68565b500290565b6001600160a01b0383168152604060208201819052600090611f3c90830184612774565b600084516020612f728285838a01612748565b855191840191612f858184848a01612748565b8554920191600090600181811c9080831680612fa257607f831692505b858310811415612fc057634e487b7160e01b85526022600452602485fd5b808015612fd45760018114612fe557613012565b60ff19851688528388019550613012565b60008b81526020902060005b8581101561300a5781548a820152908401908801612ff1565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061305690830184612774565b9695505050505050565b60006020828403121561307257600080fd5b81516114c381612715565b634e487b7160e01b600052601260045260246000fd5b6000826130a2576130a261307d565b500490565b6000826130b6576130b661307d565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60a0815260006130f860a08301898b6130bb565b828103602084015261310b81888a6130bb565b604084019690965250506001600160a01b0392831660608201529116608090910152949350505050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212201308d435f26a2b53c0364be0ea2364f4efe8f181a2db8fa874d1a136c4f17e8264736f6c6343000809003368747470733a2f2f697066732e696f2f697066732f516d556d384e43594666777858583872375975464547475a7972784e5161724a327a524b696b66586f41316157350000000000000000000000008d10505d63581a18063bb1c94cb6e3caefd4c901

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636f8b44b011610144578063a45ba8e7116100b6578063c87b56dd1161007a578063c87b56dd14610716578063d5abeb0114610736578063e0a808531461074c578063e985e9c51461076c578063eaa4f0071461078c578063f2fde38b146107ac57600080fd5b8063a45ba8e714610674578063b071401b14610689578063b88d4fde146106a9578063bc63f02e146106c9578063c23dc68f146106e957600080fd5b80638462151c116101085780638462151c146105be5780638da5cb5b146105eb57806394354fd01461060957806395d89b411461061f57806399a2557a14610634578063a22cb4651461065457600080fd5b80636f8b44b01461053657806370a0823114610556578063715018a61461057657806377097fc81461058b5780637ec4a6591461059e57600080fd5b806342842e0e116101dd57806351830227116101a157806351830227146104605780635bbb21771461047a5780635c975abb146104a757806362b99ad4146104c65780636352211e146104db5780636a247daa146104fb57600080fd5b806342842e0e146103c057806344a0d68a146103e05780634db00d7d146104005780634e99d51e146104205780634fdd43cb1461044057600080fd5b806316ba10e01161022457806316ba10e01461033657806318160ddd1461035657806323b872dd1461036b5780632fbba1151461038b5780633ccfd60b146103ab57600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b8578063095ea7b3146102f057806313faede614610312575b600080fd5b34801561026d57600080fd5b5061028161027c36600461272b565b6107cc565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab61081e565b60405161028d91906127a0565b3480156102c457600080fd5b506102d86102d33660046127b3565b6108b0565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b3660046127e8565b6108f4565b005b34801561031e57600080fd5b50610328600c5481565b60405190815260200161028d565b34801561034257600080fd5b506103106103513660046128cf565b61097b565b34801561036257600080fd5b506103286109c5565b34801561037757600080fd5b50610310610386366004612903565b6109d3565b34801561039757600080fd5b506103106103a63660046127b3565b6109de565b3480156103b757600080fd5b50610310610a56565b3480156103cc57600080fd5b506103106103db366004612903565b610b51565b3480156103ec57600080fd5b506103106103fb3660046127b3565b610b6c565b34801561040c57600080fd5b5061031061041b366004612980565b610b9b565b34801561042c57600080fd5b5061031061043b366004612a46565b610d28565b34801561044c57600080fd5b5061031061045b3660046128cf565b610d94565b34801561046c57600080fd5b50600f546102819060ff1681565b34801561048657600080fd5b5061049a610495366004612ae2565b610dd1565b60405161028d9190612b67565b3480156104b357600080fd5b50600a54600160a01b900460ff16610281565b3480156104d257600080fd5b506102ab610e97565b3480156104e757600080fd5b506102d86104f63660046127b3565b610f25565b34801561050757600080fd5b506102816105163660046128cf565b805160208183018101805160118252928201919093012091525460ff1681565b34801561054257600080fd5b506103106105513660046127b3565b610f37565b34801561056257600080fd5b50610328610571366004612bd1565b610f66565b34801561058257600080fd5b50610310610fb4565b610310610599366004612bec565b610fea565b3480156105aa57600080fd5b506103106105b93660046128cf565b61116b565b3480156105ca57600080fd5b506105de6105d9366004612bd1565b6111a8565b60405161028d9190612c32565b3480156105f757600080fd5b506008546001600160a01b03166102d8565b34801561061557600080fd5b50610328600e5481565b34801561062b57600080fd5b506102ab6112f5565b34801561064057600080fd5b506105de61064f366004612c6a565b611304565b34801561066057600080fd5b5061031061066f366004612cad565b6114ca565b34801561068057600080fd5b506102ab611560565b34801561069557600080fd5b506103106106a43660046127b3565b61156d565b3480156106b557600080fd5b506103106106c4366004612ce0565b61159c565b3480156106d557600080fd5b506103106106e4366004612d5b565b6115e6565b3480156106f557600080fd5b506107096107043660046127b3565b6116b1565b60405161028d9190612d7e565b34801561072257600080fd5b506102ab6107313660046127b3565b61176b565b34801561074257600080fd5b50610328600d5481565b34801561075857600080fd5b50610310610767366004612db3565b6118d4565b34801561077857600080fd5b50610281610787366004612dce565b611911565b34801561079857600080fd5b506103106107a73660046127b3565b61193f565b3480156107b857600080fd5b506103106107c7366004612bd1565b61196e565b60006001600160e01b031982166380ac58cd60e01b14806107fd57506001600160e01b03198216635b5e139f60e01b145b8061081857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461082d90612df8565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612df8565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b60006108bb82611a06565b6108d8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108ff82610f25565b9050806001600160a01b0316836001600160a01b031614156109345760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461096b5761094e8133611911565b61096b576040516367d9dca160e11b815260040160405180910390fd5b610976838383611a3f565b505050565b6008546001600160a01b031633146109ae5760405162461bcd60e51b81526004016109a590612e33565b60405180910390fd5b80516109c190601290602084019061267c565b5050565b600154600054036000190190565b610976838383611a9b565b6008546001600160a01b03163314610a085760405162461bcd60e51b81526004016109a590612e33565b601354600d54610a189190612e7e565b81610a216109c5565b610a2b9190612e95565b1115610a495760405162461bcd60e51b81526004016109a590612ead565b610a533382611c88565b50565b6008546001600160a01b03163314610a805760405162461bcd60e51b81526004016109a590612e33565b60026009541415610ad35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a5565b60026009556000610aec6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b36576040519150601f19603f3d011682016040523d82523d6000602084013e610b3b565b606091505b5050905080610b4957600080fd5b506001600955565b6109768383836040518060200160405280600081525061159c565b6008546001600160a01b03163314610b965760405162461bcd60e51b81526004016109a590612e33565b600c55565b60026009541415610bee5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a5565b6002600955600d5487610bff6109c5565b610c099190612e95565b1115610c275760405162461bcd60e51b81526004016109a590612ead565b610c37828286868b8b8b33611ca2565b610c725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064016109a5565b60118484604051610c84929190612edb565b9081526040519081900360200190205460ff1615610cdc5760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20616c7265616479206d696e7465642160581b60448201526064016109a5565b610ce63388611c88565b600160118585604051610cfa929190612edb565b908152604051908190036020019020805491151560ff19909216919091179055505060016009555050505050565b6008546001600160a01b03163314610d525760405162461bcd60e51b81526004016109a590612e33565b60005b81518110156109c157610d826001838381518110610d7557610d75612eeb565b60200260200101516115e6565b80610d8c81612f01565b915050610d55565b6008546001600160a01b03163314610dbe5760405162461bcd60e51b81526004016109a590612e33565b80516109c190601090602084019061267c565b80516060906000816001600160401b03811115610df057610df0612812565b604051908082528060200260200182016040528015610e3b57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610e0e5790505b50905060005b828114610e8f57610e6a858281518110610e5d57610e5d612eeb565b60200260200101516116b1565b828281518110610e7c57610e7c612eeb565b6020908102919091010152600101610e41565b509392505050565b600b8054610ea490612df8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed090612df8565b8015610f1d5780601f10610ef257610100808354040283529160200191610f1d565b820191906000526020600020905b815481529060010190602001808311610f0057829003601f168201915b505050505081565b6000610f3082611cd8565b5192915050565b6008546001600160a01b03163314610f615760405162461bcd60e51b81526004016109a590612e33565b600d55565b60006001600160a01b038216610f8f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610fde5760405162461bcd60e51b81526004016109a590612e33565b610fe86000611dfa565b565b81600081118015610ffd5750600e548111155b6110405760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016109a5565b601354600d546110509190612e7e565b816110596109c5565b6110639190612e95565b11156110815760405162461bcd60e51b81526004016109a590612ead565b8280600c546110909190612f1c565b3410156110d55760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109a5565b600a54600160a01b900460ff16156111225760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109a5565b61112c3385611c88565b7f0c1b180fbb60448c5491c5ddc7c3a923854214b9ff70f90a7821333338971f92338460405161115d929190612f3b565b60405180910390a150505050565b6008546001600160a01b031633146111955760405162461bcd60e51b81526004016109a590612e33565b80516109c190600b90602084019061267c565b606060008060006111b885610f66565b90506000816001600160401b038111156111d4576111d4612812565b6040519080825280602002602001820160405280156111fd578160200160208202803683370190505b509050611223604080516060810182526000808252602082018190529181019190915290565b60015b8386146112e957600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252925061128c576112e1565b81516001600160a01b0316156112a157815194505b876001600160a01b0316856001600160a01b031614156112e157808387806001019850815181106112d4576112d4612eeb565b6020026020010181815250505b600101611226565b50909695505050505050565b60606003805461082d90612df8565b606081831061132657604051631960ccad60e11b815260040160405180910390fd5b60008054600185101561133857600194505b80841115611344578093505b600061134f87610f66565b90508486101561136e5785850381811015611368578091505b50611372565b5060005b6000816001600160401b0381111561138c5761138c612812565b6040519080825280602002602001820160405280156113b5578160200160208202803683370190505b509050816113c85793506114c392505050565b60006113d3886116b1565b9050600081604001516113e4575080515b885b8881141580156113f65750848714155b156114b757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252935061145a576114af565b82516001600160a01b03161561146f57825191505b8a6001600160a01b0316826001600160a01b031614156114af57808488806001019950815181106114a2576114a2612eeb565b6020026020010181815250505b6001016113e6565b50505092835250909150505b9392505050565b6001600160a01b0382163314156114f45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60108054610ea490612df8565b6008546001600160a01b031633146115975760405162461bcd60e51b81526004016109a590612e33565b600e55565b6115a7848484611a9b565b6001600160a01b0383163b156115e0576115c384848484611e4c565b6115e0576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b816000811180156115f95750600e548111155b61163c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016109a5565b601354600d5461164c9190612e7e565b816116556109c5565b61165f9190612e95565b111561167d5760405162461bcd60e51b81526004016109a590612ead565b6008546001600160a01b031633146116a75760405162461bcd60e51b81526004016109a590612e33565b6109768284611c88565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806116f757506000548310155b156117025792915050565b50600082815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906117625792915050565b6114c383611cd8565b606061177682611a06565b6117da5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a5565b600f5460ff1661187657601080546117f190612df8565b80601f016020809104026020016040519081016040528092919081815260200182805461181d90612df8565b801561186a5780601f1061183f5761010080835404028352916020019161186a565b820191906000526020600020905b81548152906001019060200180831161184d57829003601f168201915b50505050509050919050565b6000611880611f44565b905060008151116118a057604051806020016040528060008152506114c3565b806118aa84611f53565b60126040516020016118be93929190612f5f565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146118fe5760405162461bcd60e51b81526004016109a590612e33565b600f805460ff1916911515919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146119695760405162461bcd60e51b81526004016109a590612e33565b601355565b6008546001600160a01b031633146119985760405162461bcd60e51b81526004016109a590612e33565b6001600160a01b0381166119fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a5565b610a5381611dfa565b600081600111158015611a1a575060005482105b8015610818575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611aa682611cd8565b9050836001600160a01b031681600001516001600160a01b031614611add5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611afb5750611afb8533611911565b80611b16575033611b0b846108b0565b6001600160a01b0316145b905080611b3657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611b5d57604051633a954ecd60e21b815260040160405180910390fd5b611b6960008487611a3f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611c3d576000548214611c3d57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6109c1828260405180602001604052806000815250612050565b600a546000906001600160a01b0316611cc18a8a8a8a8a8a8a8a612214565b6001600160a01b0316149998505050505050505050565b60408051606081018252600080825260208201819052918101919091528180600111611de157600054811015611de157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611ddf5780516001600160a01b031615611d76579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611dda579392505050565b611d76565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611e81903390899088908890600401613023565b602060405180830381600087803b158015611e9b57600080fd5b505af1925050508015611ecb575060408051601f3d908101601f19168201909252611ec891810190613060565b60015b611f26573d808015611ef9576040519150601f19603f3d011682016040523d82523d6000602084013e611efe565b606091505b508051611f1e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600b805461082d90612df8565b606081611f775750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fa15780611f8b81612f01565b9150611f9a9050600a83613093565b9150611f7b565b6000816001600160401b03811115611fbb57611fbb612812565b6040519080825280601f01601f191660200182016040528015611fe5576020820181803683370190505b5090505b8415611f3c57611ffa600183612e7e565b9150612007600a866130a7565b612012906030612e95565b60f81b81838151811061202757612027612eeb565b60200101906001600160f81b031916908160001a905350612049600a86613093565b9450611fe9565b6000546001600160a01b03841661207957604051622e076360e81b815260040160405180910390fd5b826120975760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156121bf575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46121886000878480600101955087611e4c565b6121a5576040516368d2bf6b60e11b815260040160405180910390fd5b80821061213d5782600054146121ba57600080fd5b612204565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106121c0575b5060009081556115e09085838684565b60006122636122278a8a8a8a8a88612270565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122b192505050565b9998505050505050505050565b60008686868686308760405160200161228f97969594939291906130e4565b6040516020818303038152906040528051906020012090509695505050505050565b60006114c38261230e856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90600080600061231e858561232b565b91509150610e8f8161239b565b6000808251604114156123625760208301516040840151606085015160001a61235687828585612556565b94509450505050612394565b82516040141561238c5760208301516040840151612381868383612643565b935093505050612394565b506000905060025b9250929050565b60008160048111156123af576123af613135565b14156123b85750565b60018160048111156123cc576123cc613135565b141561241a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109a5565b600281600481111561242e5761242e613135565b141561247c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109a5565b600381600481111561249057612490613135565b14156124e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109a5565b60048160048111156124fd576124fd613135565b1415610a535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109a5565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561258d575060009050600361263a565b8460ff16601b141580156125a557508460ff16601c14155b156125b6575060009050600461263a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561260a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126335760006001925092505061263a565b9150600090505b94509492505050565b6000806001600160ff1b0383168161266060ff86901c601b612e95565b905061266e87828885612556565b935093505050935093915050565b82805461268890612df8565b90600052602060002090601f0160209004810192826126aa57600085556126f0565b82601f106126c357805160ff19168380011785556126f0565b828001600101855582156126f0579182015b828111156126f05782518255916020019190600101906126d5565b506126fc929150612700565b5090565b5b808211156126fc5760008155600101612701565b6001600160e01b031981168114610a5357600080fd5b60006020828403121561273d57600080fd5b81356114c381612715565b60005b8381101561276357818101518382015260200161274b565b838111156115e05750506000910152565b6000815180845261278c816020860160208601612748565b601f01601f19169290920160200192915050565b6020815260006114c36020830184612774565b6000602082840312156127c557600080fd5b5035919050565b80356001600160a01b03811681146127e357600080fd5b919050565b600080604083850312156127fb57600080fd5b612804836127cc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561285057612850612812565b604052919050565b60006001600160401b0383111561287157612871612812565b612884601f8401601f1916602001612828565b905082815283838301111561289857600080fd5b828260208301376000602084830101529392505050565b600082601f8301126128c057600080fd5b6114c383833560208501612858565b6000602082840312156128e157600080fd5b81356001600160401b038111156128f757600080fd5b611f3c848285016128af565b60008060006060848603121561291857600080fd5b612921846127cc565b925061292f602085016127cc565b9150604084013590509250925092565b60008083601f84011261295157600080fd5b5081356001600160401b0381111561296857600080fd5b60208301915083602082850101111561239457600080fd5b60008060008060008060006080888a03121561299b57600080fd5b8735965060208801356001600160401b03808211156129b957600080fd5b6129c58b838c0161293f565b909850965060408a01359150808211156129de57600080fd5b6129ea8b838c0161293f565b909650945060608a0135915080821115612a0357600080fd5b50612a108a828b0161293f565b989b979a50959850939692959293505050565b60006001600160401b03821115612a3c57612a3c612812565b5060051b60200190565b60006020808385031215612a5957600080fd5b82356001600160401b03811115612a6f57600080fd5b8301601f81018513612a8057600080fd5b8035612a93612a8e82612a23565b612828565b81815260059190911b82018301908381019087831115612ab257600080fd5b928401925b82841015612ad757612ac8846127cc565b82529284019290840190612ab7565b979650505050505050565b60006020808385031215612af557600080fd5b82356001600160401b03811115612b0b57600080fd5b8301601f81018513612b1c57600080fd5b8035612b2a612a8e82612a23565b81815260059190911b82018301908381019087831115612b4957600080fd5b928401925b82841015612ad757833582529284019290840190612b4e565b6020808252825182820181905260009190848201906040850190845b818110156112e957612bbe83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612b83565b600060208284031215612be357600080fd5b6114c3826127cc565b60008060408385031215612bff57600080fd5b8235915060208301356001600160401b03811115612c1c57600080fd5b612c28858286016128af565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156112e957835183529284019291840191600101612c4e565b600080600060608486031215612c7f57600080fd5b612c88846127cc565b95602085013595506040909401359392505050565b803580151581146127e357600080fd5b60008060408385031215612cc057600080fd5b612cc9836127cc565b9150612cd760208401612c9d565b90509250929050565b60008060008060808587031215612cf657600080fd5b612cff856127cc565b9350612d0d602086016127cc565b92506040850135915060608501356001600160401b03811115612d2f57600080fd5b8501601f81018713612d4057600080fd5b612d4f87823560208401612858565b91505092959194509250565b60008060408385031215612d6e57600080fd5b82359150612cd7602084016127cc565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610818565b600060208284031215612dc557600080fd5b6114c382612c9d565b60008060408385031215612de157600080fd5b612dea836127cc565b9150612cd7602084016127cc565b600181811c90821680612e0c57607f821691505b60208210811415612e2d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015612e9057612e90612e68565b500390565b60008219821115612ea857612ea8612e68565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612f1557612f15612e68565b5060010190565b6000816000190483118215151615612f3657612f36612e68565b500290565b6001600160a01b0383168152604060208201819052600090611f3c90830184612774565b600084516020612f728285838a01612748565b855191840191612f858184848a01612748565b8554920191600090600181811c9080831680612fa257607f831692505b858310811415612fc057634e487b7160e01b85526022600452602485fd5b808015612fd45760018114612fe557613012565b60ff19851688528388019550613012565b60008b81526020902060005b8581101561300a5781548a820152908401908801612ff1565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061305690830184612774565b9695505050505050565b60006020828403121561307257600080fd5b81516114c381612715565b634e487b7160e01b600052601260045260246000fd5b6000826130a2576130a261307d565b500490565b6000826130b6576130b661307d565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60a0815260006130f860a08301898b6130bb565b828103602084015261310b81888a6130bb565b604084019690965250506001600160a01b0392831660608201529116608090910152949350505050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212201308d435f26a2b53c0364be0ea2364f4efe8f181a2db8fa874d1a136c4f17e8264736f6c63430008090033

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

0000000000000000000000008d10505d63581a18063bb1c94cb6e3caefd4c901

-----Decoded View---------------
Arg [0] : _signer (address): 0x8d10505d63581A18063Bb1c94cB6e3caefD4c901

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d10505d63581a18063bb1c94cb6e3caefd4c901


Deployed Bytecode Sourcemap

1829:3906:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2986:305:5;;;;;;;;;;-1:-1:-1;2986:305:5;;;;;:::i;:::-;;:::i;:::-;;;565:14:19;;558:22;540:41;;528:2;513:18;2986:305:5;;;;;;;;6101:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7605:204::-;;;;;;;;;;-1:-1:-1;7605:204:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:19;;;1674:51;;1662:2;1647:18;7605:204:5;1528:203:19;7167:372:5;;;;;;;;;;-1:-1:-1;7167:372:5;;;;;:::i;:::-;;:::i;:::-;;1991:31:18;;;;;;;;;;;;;;;;;;;2319:25:19;;;2307:2;2292:18;1991:31:18;2173:177:19;5160:100:18;;;;;;;;;;-1:-1:-1;5160:100:18;;;;;:::i;:::-;;:::i;2226:312:5:-;;;;;;;;;;;;;:::i;8470:170::-;;;;;;;;;;-1:-1:-1;8470:170:5;;;;;:::i;:::-;;:::i;3560:196:18:-;;;;;;;;;;-1:-1:-1;3560:196:18;;;;;:::i;:::-;;:::i;5372:151::-;;;;;;;;;;;;;:::i;8711:185:5:-;;;;;;;;;;-1:-1:-1;8711:185:5;;;;;:::i;:::-;;:::i;4618:74:18:-;;;;;;;;;;-1:-1:-1;4618:74:18;;;;;:::i;:::-;;:::i;3129:425::-;;;;;;;;;;-1:-1:-1;3129:425:18;;;;;:::i;:::-;;:::i;3916:163::-;;;;;;;;;;-1:-1:-1;3916:163:18;;;;;:::i;:::-;;:::i;5022:132::-;;;;;;;;;;-1:-1:-1;5022:132:18;;;;;:::i;:::-;;:::i;2106:28::-;;;;;;;;;;-1:-1:-1;2106:28:18;;;;;;;;1547:468:6;;;;;;;;;;-1:-1:-1;1547:468:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1130:86:14:-;;;;;;;;;;-1:-1:-1;1201:7:14;;-1:-1:-1;;;1201:7:14;;;;1130:86;;1958:28:18;;;;;;;;;;;;;:::i;5909:125:5:-;;;;;;;;;;-1:-1:-1;5909:125:5;;;;;:::i;:::-;;:::i;2247:37:18:-;;;;;;;;;;-1:-1:-1;2247:37:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4922:94;;;;;;;;;;-1:-1:-1;4922:94:18;;;;;:::i;:::-;;:::i;3355:206:5:-;;;;;;;;;;-1:-1:-1;3355:206:5;;;;;:::i;:::-;;:::i;1714:103:13:-;;;;;;;;;;;;;:::i;2887:236:18:-;;;;;;:::i;:::-;;:::i;5266:100::-;;;;;;;;;;-1:-1:-1;5266:100:18;;;;;:::i;:::-;;:::i;5361:891:6:-;;;;;;;;;;-1:-1:-1;5361:891:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1063:87:13:-;;;;;;;;;;-1:-1:-1;1136:6:13;;-1:-1:-1;;;;;1136:6:13;1063:87;;2064:37:18;;;;;;;;;;;;;;;;6270:104:5;;;;;;;;;;;;;:::i;2405:2507:6:-;;;;;;;;;;-1:-1:-1;2405:2507:6;;;;;:::i;:::-;;:::i;7881:287:5:-;;;;;;;;;;-1:-1:-1;7881:287:5;;;;;:::i;:::-;;:::i;2139:103:18:-;;;;;;;;;;;;;:::i;4698:130::-;;;;;;;;;;-1:-1:-1;4698:130:18;;;;;:::i;:::-;;:::i;8967:370:5:-;;;;;;;;;;-1:-1:-1;8967:370:5;;;;;:::i;:::-;;:::i;3762:148:18:-;;;;;;;;;;-1:-1:-1;3762:148:18;;;;;:::i;:::-;;:::i;970:418:6:-;;;;;;;;;;-1:-1:-1;970:418:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4085:440:18:-;;;;;;;;;;-1:-1:-1;4085:440:18;;;;;:::i;:::-;;:::i;2027:30::-;;;;;;;;;;;;;;;;4531:81;;;;;;;;;;-1:-1:-1;4531:81:18;;;;;:::i;:::-;;:::i;8239:164:5:-;;;;;;;;;;-1:-1:-1;8239:164:5;;;;;:::i;:::-;;:::i;4834:82:18:-;;;;;;;;;;-1:-1:-1;4834:82:18;;;;;:::i;:::-;;:::i;1972:201:13:-;;;;;;;;;;-1:-1:-1;1972:201:13;;;;;:::i;:::-;;:::i;2986:305:5:-;3088:4;-1:-1:-1;;;;;;3125:40:5;;-1:-1:-1;;;3125:40:5;;:105;;-1:-1:-1;;;;;;;3182:48:5;;-1:-1:-1;;;3182:48:5;3125:105;:158;;;-1:-1:-1;;;;;;;;;;963:40:4;;;3247:36:5;3105:178;2986:305;-1:-1:-1;;2986:305:5:o;6101:100::-;6155:13;6188:5;6181:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6101:100;:::o;7605:204::-;7673:7;7698:16;7706:7;7698;:16::i;:::-;7693:64;;7723:34;;-1:-1:-1;;;7723:34:5;;;;;;;;;;;7693:64;-1:-1:-1;7777:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;7777:24:5;;7605:204::o;7167:372::-;7240:13;7256:24;7272:7;7256:15;:24::i;:::-;7240:40;;7301:5;-1:-1:-1;;;;;7295:11:5;:2;-1:-1:-1;;;;;7295:11:5;;7291:48;;;7315:24;;-1:-1:-1;;;7315:24:5;;;;;;;;;;;7291:48;736:10:1;-1:-1:-1;;;;;7356:21:5;;;7352:139;;7383:37;7400:5;736:10:1;8239:164:5;:::i;7383:37::-;7379:112;;7444:35;;-1:-1:-1;;;7444:35:5;;;;;;;;;;;7379:112;7503:28;7512:2;7516:7;7525:5;7503:8;:28::i;:::-;7229:310;7167:372;;:::o;5160:100:18:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;;;;;;;;;5232:22:18;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;5160:100:::0;:::o;2226:312:5:-;5725:1:18;2489:12:5;2279:7;2473:13;:28;-1:-1:-1;;2473:46:5;;2226:312::o;8470:170::-;8604:28;8614:4;8620:2;8624:7;8604:9;:28::i;3560:196:18:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;3676:6:18::1;;3664:9;;:18;;;;:::i;:::-;3649:11;3633:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:49;;3625:82;;;;-1:-1:-1::0;;;3625:82:18::1;;;;;;;:::i;:::-;3714:36;736:10:1::0;3738:11:18::1;3714:9;:36::i;:::-;3560:196:::0;:::o;5372:151::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;1778:1:15::1;2376:7;;:19;;2368:63;;;::::0;-1:-1:-1;;;2368:63:15;;13815:2:19;2368:63:15::1;::::0;::::1;13797:21:19::0;13854:2;13834:18;;;13827:30;13893:33;13873:18;;;13866:61;13944:18;;2368:63:15::1;13613:355:19::0;2368:63:15::1;1778:1;2509:7;:18:::0;5430:7:18::2;5451;1136:6:13::0;;-1:-1:-1;;;;;1136:6:13;;1063:87;5451:7:18::2;-1:-1:-1::0;;;;;5443:21:18::2;5473;5443:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5429:70;;;5514:2;5506:11;;;::::0;::::2;;-1:-1:-1::0;1734:1:15::1;2688:7;:22:::0;5372:151:18:o;8711:185:5:-;8849:39;8866:4;8872:2;8876:7;8849:39;;;;;;;;;;;;:16;:39::i;4618:74:18:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;4674:4:18::1;:12:::0;4618:74::o;3129:425::-;1778:1:15;2376:7;;:19;;2368:63;;;;-1:-1:-1;;;2368:63:15;;13815:2:19;2368:63:15;;;13797:21:19;13854:2;13834:18;;;13827:30;13893:33;13873:18;;;13866:61;13944:18;;2368:63:15;13613:355:19;2368:63:15;1778:1;2509:7;:18;3296:9:18::1;::::0;3285:7;3269:13:::1;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;3261:69;;;;-1:-1:-1::0;;;3261:69:18::1;;;;;;;:::i;:::-;3345:65;3367:5;;3374:6;;3382:7;3391:6;;3399:10;3345:21;:65::i;:::-;3337:90;;;::::0;-1:-1:-1;;;3337:90:18;;14385:2:19;3337:90:18::1;::::0;::::1;14367:21:19::0;14424:2;14404:18;;;14397:30;-1:-1:-1;;;14443:18:19;;;14436:42;14495:18;;3337:90:18::1;14183:336:19::0;3337:90:18::1;3443:6;3450;;3443:14;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;3442:15;3434:49;;;::::0;-1:-1:-1;;;3434:49:18;;15004:2:19;3434:49:18::1;::::0;::::1;14986:21:19::0;15043:2;15023:18;;;15016:30;-1:-1:-1;;;15062:18:19;;;15055:51;15123:18;;3434:49:18::1;14802:345:19::0;3434:49:18::1;3490:30;3500:10;3512:7;3490:9;:30::i;:::-;3544:4;3527:6;3534;;3527:14;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:21;;;::::1;;-1:-1:-1::0;;3527:21:18;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;3527:21:18;2688:7:15;:22;-1:-1:-1;;;;;3129:425:18:o;3916:163::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;3992:6:18::1;3987:87;4008:10;:17;4004:1;:21;3987:87;;;4041:25;4049:1;4052:10;4063:1;4052:13;;;;;;;;:::i;:::-;;;;;;;4041:7;:25::i;:::-;4027:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3987:87;;5022:132:::0;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;5110:38:18;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;1547:468:6:-:0;1722:15;;1636:23;;1697:22;1722:15;-1:-1:-1;;;;;1789:36:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;1789:36:6;;-1:-1:-1;;1789:36:6;;;;;;;;;;;;1752:73;;1845:9;1840:125;1861:14;1856:1;:19;1840:125;;1917:32;1937:8;1946:1;1937:11;;;;;;;;:::i;:::-;;;;;;;1917:19;:32::i;:::-;1901:10;1912:1;1901:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;1877:3;;1840:125;;;-1:-1:-1;1986:10:6;1547:468;-1:-1:-1;;;1547:468:6:o;1958:28:18:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5909:125:5:-;5973:7;6000:21;6013:7;6000:12;:21::i;:::-;:26;;5909:125;-1:-1:-1;;5909:125:5:o;4922:94:18:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;4988:9:18::1;:22:::0;4922:94::o;3355:206:5:-;3419:7;-1:-1:-1;;;;;3443:19:5;;3439:60;;3471:28;;-1:-1:-1;;;3471:28:5;;;;;;;;;;;3439:60;-1:-1:-1;;;;;;3525:19:5;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;3525:27:5;;3355:206::o;1714:103:13:-;1136:6;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;2887:236:18:-;2974:11;2575:1;2561:11;:15;:52;;;;;2595:18;;2580:11;:33;;2561:52;2553:85;;;;-1:-1:-1;;;2553:85:18;;15626:2:19;2553:85:18;;;15608:21:19;15665:2;15645:18;;;15638:30;-1:-1:-1;;;15684:18:19;;;15677:50;15744:18;;2553:85:18;15424:344:19;2553:85:18;2696:6;;2684:9;;:18;;;;:::i;:::-;2669:11;2653:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:49;;2645:82;;;;-1:-1:-1;;;2645:82:18;;;;;;;:::i;:::-;3007:11:::1;2832;2825:4;;:18;;;;:::i;:::-;2812:9;:31;;2804:63;;;::::0;-1:-1:-1;;;2804:63:18;;16148:2:19;2804:63:18::1;::::0;::::1;16130:21:19::0;16187:2;16167:18;;;16160:30;-1:-1:-1;;;16206:18:19;;;16199:49;16265:18;;2804:63:18::1;15946:343:19::0;2804:63:18::1;1201:7:14::0;;-1:-1:-1;;;1201:7:14;;;;1455:9:::2;1447:38;;;::::0;-1:-1:-1;;;1447:38:14;;16496:2:19;1447:38:14::2;::::0;::::2;16478:21:19::0;16535:2;16515:18;;;16508:30;-1:-1:-1;;;16554:18:19;;;16547:46;16610:18;;1447:38:14::2;16294:340:19::0;1447:38:14::2;3041:36:18::3;736:10:1::0;3065:11:18::3;3041:9;:36::i;:::-;3089:28;736:10:1::0;3110:6:18::3;3089:28;;;;;;;:::i;:::-;;;;;;;;2734:1:::1;2887:236:::0;;;:::o;5266:100::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;5338:22:18;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;5361:891:6:-:0;5431:16;5485:19;5519:25;5559:22;5584:16;5594:5;5584:9;:16::i;:::-;5559:41;;5615:25;5657:14;-1:-1:-1;;;;;5643:29:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5643:29:6;;5615:57;;5687:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;5687:31:6;5725:1:18;5733:471:6;5782:14;5767:11;:29;5733:471;;5834:14;;;;:11;:14;;;;;;;;;5822:26;;;;;;;;;-1:-1:-1;;;;;5822:26:6;;;;-1:-1:-1;;;5822:26:6;;-1:-1:-1;;;;;5822:26:6;;;;;;;;-1:-1:-1;;;5822:26:6;;;;;;;;;;;;;;;;-1:-1:-1;5867:73:6;;5912:8;;5867:73;5962:14;;-1:-1:-1;;;;;5962:28:6;;5958:111;;6035:14;;;-1:-1:-1;5958:111:6;6112:5;-1:-1:-1;;;;;6091:26:6;:17;-1:-1:-1;;;;;6091:26:6;;6087:102;;;6168:1;6142:8;6151:13;;;;;;6142:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;6087:102;5798:3;;5733:471;;;-1:-1:-1;6225:8:6;;5361:891;-1:-1:-1;;;;;;5361:891:6:o;6270:104:5:-;6326:13;6359:7;6352:14;;;;;:::i;2405:2507:6:-;2540:16;2607:4;2598:5;:13;2594:45;;2620:19;;-1:-1:-1;;;2620:19:6;;;;;;;;;;;2594:45;2654:19;2708:13;;5725:1:18;2799:5:6;:23;2795:87;;;5725:1:18;2843:23:6;;2795:87;2962:9;2955:4;:16;2951:73;;;2999:9;2992:16;;2951:73;3038:25;3066:16;3076:5;3066:9;:16::i;:::-;3038:44;;3260:4;3252:5;:12;3248:278;;;3307:12;;;3342:31;;;3338:111;;;3418:11;3398:31;;3338:111;3266:198;3248:278;;;-1:-1:-1;3509:1:6;3248:278;3540:25;3582:17;-1:-1:-1;;;;;3568:32:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3568:32:6;-1:-1:-1;3540:60:6;-1:-1:-1;3619:22:6;3615:78;;3669:8;-1:-1:-1;3662:15:6;;-1:-1:-1;;;3662:15:6;3615:78;3837:31;3871:26;3891:5;3871:19;:26::i;:::-;3837:60;;3912:25;4157:9;:16;;;4152:92;;-1:-1:-1;4214:14:6;;4152:92;4275:5;4258:477;4287:4;4282:1;:9;;:45;;;;;4310:17;4295:11;:32;;4282:45;4258:477;;;4365:14;;;;:11;:14;;;;;;;;;4353:26;;;;;;;;;-1:-1:-1;;;;;4353:26:6;;;;-1:-1:-1;;;4353:26:6;;-1:-1:-1;;;;;4353:26:6;;;;;;;;-1:-1:-1;;;4353:26:6;;;;;;;;;;;;;;;;-1:-1:-1;4398:73:6;;4443:8;;4398:73;4493:14;;-1:-1:-1;;;;;4493:28:6;;4489:111;;4566:14;;;-1:-1:-1;4489:111:6;4643:5;-1:-1:-1;;;;;4622:26:6;:17;-1:-1:-1;;;;;4622:26:6;;4618:102;;;4699:1;4673:8;4682:13;;;;;;4673:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4618:102;4329:3;;4258:477;;;-1:-1:-1;;;4820:29:6;;;-1:-1:-1;4827:8:6;;-1:-1:-1;;2405:2507:6;;;;;;:::o;7881:287:5:-;-1:-1:-1;;;;;7980:24:5;;736:10:1;7980:24:5;7976:54;;;8013:17;;-1:-1:-1;;;8013:17:5;;;;;;;;;;;7976:54;736:10:1;8043:32:5;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;8043:42:5;;;;;;;;;;;;:53;;-1:-1:-1;;8043:53:5;;;;;;;;;;8112:48;;540:41:19;;;8043:42:5;;736:10:1;8112:48:5;;513:18:19;8112:48:5;;;;;;;7881:287;;:::o;2139:103:18:-;;;;;;;:::i;4698:130::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;4782:18:18::1;:40:::0;4698:130::o;8967:370:5:-;9134:28;9144:4;9150:2;9154:7;9134:9;:28::i;:::-;-1:-1:-1;;;;;9177:13:5;;1505:19:0;:23;9173:157:5;;9198:56;9229:4;9235:2;9239:7;9248:5;9198:30;:56::i;:::-;9194:136;;9278:40;;-1:-1:-1;;;9278:40:5;;;;;;;;;;;9194:136;8967:370;;;;:::o;3762:148:18:-;3841:11;2575:1;2561:11;:15;:52;;;;;2595:18;;2580:11;:33;;2561:52;2553:85;;;;-1:-1:-1;;;2553:85:18;;15626:2:19;2553:85:18;;;15608:21:19;15665:2;15645:18;;;15638:30;-1:-1:-1;;;15684:18:19;;;15677:50;15744:18;;2553:85:18;15424:344:19;2553:85:18;2696:6;;2684:9;;:18;;;;:::i;:::-;2669:11;2653:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:49;;2645:82;;;;-1:-1:-1;;;2645:82:18;;;;;;;:::i;:::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13::1;1275:68;;;;-1:-1:-1::0;;;1275:68:13::1;;;;;;;:::i;:::-;3871:33:18::2;3881:9;3892:11;3871:9;:33::i;970:418:6:-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5725:1:18;1126:25:6;;;:53;;;1166:13;;1155:7;:24;;1126:53;1122:102;;;1203:9;970:418;-1:-1:-1;;970:418:6:o;1122:102::-;-1:-1:-1;1246:20:6;;;;:11;:20;;;;;;;;;1234:32;;;;;;;;;-1:-1:-1;;;;;1234:32:6;;;;-1:-1:-1;;;1234:32:6;;-1:-1:-1;;;;;1234:32:6;;;;;;;;-1:-1:-1;;;1234:32:6;;;;;;;;;;;;;;;;1277:65;;1321:9;970:418;-1:-1:-1;;970:418:6:o;1277:65::-;1359:21;1372:7;1359:12;:21::i;4085:440:18:-;4158:13;4188:17;4196:8;4188:7;:17::i;:::-;4180:77;;;;-1:-1:-1;;;4180:77:18;;17163:2:19;4180:77:18;;;17145:21:19;17202:2;17182:18;;;17175:30;17241:34;17221:18;;;17214:62;-1:-1:-1;;;17292:18:19;;;17285:45;17347:19;;4180:77:18;16961:411:19;4180:77:18;4270:8;;;;4266:64;;4305:17;4298:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4085:440;;;:::o;4266:64::-;4338:28;4369:10;:8;:10::i;:::-;4338:41;;4424:1;4399:14;4393:28;:32;:126;;;;;;;;;;;;;;;;;4459:14;4475:19;:8;:17;:19::i;:::-;4496:9;4442:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4386:133;4085:440;-1:-1:-1;;;4085:440:18:o;4531:81::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;4589:8:18::1;:17:::0;;-1:-1:-1;;4589:17:18::1;::::0;::::1;;::::0;;;::::1;::::0;;4531:81::o;8239:164:5:-;-1:-1:-1;;;;;8360:25:5;;;8336:4;8360:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;8239:164::o;4834:82:18:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;4894:6:18::1;:16:::0;4834:82::o;1972:201:13:-;1136:6;;-1:-1:-1;;;;;1136:6:13;736:10:1;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:13;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:13;;19237:2:19;2053:73:13::1;::::0;::::1;19219:21:19::0;19276:2;19256:18;;;19249:30;19315:34;19295:18;;;19288:62;-1:-1:-1;;;19366:18:19;;;19359:36;19412:19;;2053:73:13::1;19035:402:19::0;2053:73:13::1;2137:28;2156:8;2137:18;:28::i;9592:174:5:-:0;9649:4;9692:7;5725:1:18;9673:26:5;;:53;;;;;9713:13;;9703:7;:23;9673:53;:85;;;;-1:-1:-1;;9731:20:5;;;;:11;:20;;;;;:27;-1:-1:-1;;;9731:27:5;;;;9730:28;;9592:174::o;18814:196::-;18929:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;18929:29:5;-1:-1:-1;;;;;18929:29:5;;;;;;;;;18974:28;;18929:24;;18974:28;;;;;;;18814:196;;;:::o;13762:2130::-;13877:35;13915:21;13928:7;13915:12;:21::i;:::-;13877:59;;13975:4;-1:-1:-1;;;;;13953:26:5;:13;:18;;;-1:-1:-1;;;;;13953:26:5;;13949:67;;13988:28;;-1:-1:-1;;;13988:28:5;;;;;;;;;;;13949:67;14029:22;736:10:1;-1:-1:-1;;;;;14055:20:5;;;;:73;;-1:-1:-1;14092:36:5;14109:4;736:10:1;8239:164:5;:::i;14092:36::-;14055:126;;;-1:-1:-1;736:10:1;14145:20:5;14157:7;14145:11;:20::i;:::-;-1:-1:-1;;;;;14145:36:5;;14055:126;14029:153;;14200:17;14195:66;;14226:35;;-1:-1:-1;;;14226:35:5;;;;;;;;;;;14195:66;-1:-1:-1;;;;;14276:16:5;;14272:52;;14301:23;;-1:-1:-1;;;14301:23:5;;;;;;;;;;;14272:52;14445:35;14462:1;14466:7;14475:4;14445:8;:35::i;:::-;-1:-1:-1;;;;;14776:18:5;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;14776:31:5;;;-1:-1:-1;;;;;14776:31:5;;;-1:-1:-1;;14776:31:5;;;;;;;14822:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;14822:29:5;;;;;;;;;;;14902:20;;;:11;:20;;;;;;14937:18;;-1:-1:-1;;;;;;14970:49:5;;;;-1:-1:-1;;;15003:15:5;14970:49;;;;;;;;;;15293:11;;15353:24;;;;;15396:13;;14902:20;;15353:24;;15396:13;15392:384;;15606:13;;15591:11;:28;15587:174;;15644:20;;15713:28;;;;-1:-1:-1;;;;;15687:54:5;-1:-1:-1;;;15687:54:5;-1:-1:-1;;;;;;15687:54:5;;;-1:-1:-1;;;;;15644:20:5;;15687:54;;;;15587:174;14751:1036;;;15823:7;15819:2;-1:-1:-1;;;;;15804:27:5;15813:4;-1:-1:-1;;;;;15804:27:5;;;;;;;;;;;13866:2026;;13762:2130;;;:::o;9850:104::-;9919:27;9929:2;9933:8;9919:27;;;;;;;;;;;;:9;:27::i;1180:306:16:-;1471:7;;1391:4;;-1:-1:-1;;;;;1471:7:16;1415:52;1426:5;;1433:6;;1441:7;1450:6;;1458:8;1415:10;:52::i;:::-;-1:-1:-1;;;;;1415:63:16;;;1180:306;-1:-1:-1;;;;;;;;;1180:306:16:o;4736:1111:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;4847:7:5;;5725:1:18;4896:23:5;4892:888;;4932:13;;4925:4;:20;4921:859;;;4966:31;5000:17;;;:11;:17;;;;;;;;;4966:51;;;;;;;;;-1:-1:-1;;;;;4966:51:5;;;;-1:-1:-1;;;4966:51:5;;-1:-1:-1;;;;;4966:51:5;;;;;;;;-1:-1:-1;;;4966:51:5;;;;;;;;;;;;;;5036:729;;5086:14;;-1:-1:-1;;;;;5086:28:5;;5082:101;;5150:9;4736:1111;-1:-1:-1;;;4736:1111:5:o;5082:101::-;-1:-1:-1;;;5525:6:5;5570:17;;;;:11;:17;;;;;;;;;5558:29;;;;;;;;;-1:-1:-1;;;;;5558:29:5;;;;;-1:-1:-1;;;5558:29:5;;-1:-1:-1;;;;;5558:29:5;;;;;;;;-1:-1:-1;;;5558:29:5;;;;;;;;;;;;;5618:28;5614:109;;5686:9;4736:1111;-1:-1:-1;;;4736:1111:5:o;5614:109::-;5485:261;;;4947:833;4921:859;5808:31;;-1:-1:-1;;;5808:31:5;;;;;;;;;;;2333:191:13;2426:6;;;-1:-1:-1;;;;;2443:17:13;;;-1:-1:-1;;;;;;2443:17:13;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;19502:667:5:-;19686:72;;-1:-1:-1;;;19686:72:5;;19665:4;;-1:-1:-1;;;;;19686:36:5;;;;;:72;;736:10:1;;19737:4:5;;19743:7;;19752:5;;19686:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19686:72:5;;;;;;;;-1:-1:-1;;19686:72:5;;;;;;;;;;;;:::i;:::-;;;19682:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19920:13:5;;19916:235;;19966:40;;-1:-1:-1;;;19966:40:5;;;;;;;;;;;19916:235;20109:6;20103:13;20094:6;20090:2;20086:15;20079:38;19682:480;-1:-1:-1;;;;;;19805:55:5;-1:-1:-1;;;19805:55:5;;-1:-1:-1;19682:480:5;19502:667;;;;;;:::o;5529:103:18:-;5588:13;5617:9;5610:16;;;;;:::i;342:723:17:-;398:13;619:10;615:53;;-1:-1:-1;;646:10:17;;;;;;;;;;;;-1:-1:-1;;;646:10:17;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:17;;-1:-1:-1;798:2:17;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;-1:-1:-1;;;;;844:17:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:17;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:17;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:17;;;;;;;;-1:-1:-1;1003:11:17;1012:2;1003:11;;:::i;:::-;;;872:154;;10327:1749:5;10450:20;10473:13;-1:-1:-1;;;;;10501:16:5;;10497:48;;10526:19;;-1:-1:-1;;;10526:19:5;;;;;;;;;;;10497:48;10560:13;10556:44;;10582:18;;-1:-1:-1;;;10582:18:5;;;;;;;;;;;10556:44;-1:-1:-1;;;;;10951:16:5;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;11010:49:5;;-1:-1:-1;;;;;10951:44:5;;;;;;;11010:49;;;;-1:-1:-1;;10951:44:5;;;;;;11010:49;;;;;;;;;;;;;;;;11076:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;11126:66:5;;;-1:-1:-1;;;11176:15:5;11126:66;;;;;;;;;;;;;11076:25;;11273:23;;;;1505:19:0;:23;11313:631:5;;11353:313;11384:38;;11409:12;;-1:-1:-1;;;;;11384:38:5;;;11401:1;;11384:38;;11401:1;;11384:38;11450:69;11489:1;11493:2;11497:14;;;;;;11513:5;11450:30;:69::i;:::-;11445:174;;11555:40;;-1:-1:-1;;;11555:40:5;;;;;;;;;;;11445:174;11661:3;11646:12;:18;11353:313;;11747:12;11730:13;;:29;11726:43;;11761:8;;;11726:43;11313:631;;;11810:119;11841:40;;11866:14;;;;;-1:-1:-1;;;;;11841:40:5;;;11858:1;;11841:40;;11858:1;;11841:40;11924:3;11909:12;:18;11810:119;;11313:631;-1:-1:-1;11958:13:5;:28;;;12008:60;;12041:2;12045:12;12059:8;12008:60;:::i;880:292:16:-;1080:7;1107:57;1116:39;1122:5;;1129:6;;1137:7;1146:8;1116:5;:39::i;:::-;1157:6;;1107:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1107:8:16;;-1:-1:-1;;;1107:57:16:i;:::-;1100:64;880:292;-1:-1:-1;;;;;;;;;880:292:16:o;421:257::-;568:7;621:5;;628:6;;636:7;653:4;660:8;610:59;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;600:70;;;;;;593:77;;421:257;;;;;;;;:::o;686:186::-;788:7;820:44;858:5;820:29;:4;8508:58:3;;21792:66:19;8508:58:3;;;21780:79:19;21875:12;;;21868:28;;;8375:7:3;;21912:12:19;;8508:58:3;;;;;;;;;;;;8498:69;;;;;;8491:76;;8306:269;;;;820:29:16;:37;4582:7:3;4603:17;4622:18;4644:27;4655:4;4661:9;4644:10;:27::i;:::-;4602:69;;;;4682:18;4694:5;4682:11;:18::i;2298:1404::-;2379:7;2388:12;2613:9;:16;2633:2;2613:22;2609:1086;;;2957:4;2942:20;;2936:27;3007:4;2992:20;;2986:27;3065:4;3050:20;;3044:27;2652:9;3036:36;3108:25;3119:4;3036:36;2936:27;2986;3108:10;:25::i;:::-;3101:32;;;;;;;;;2609:1086;3155:9;:16;3175:2;3155:22;3151:544;;;3478:4;3463:20;;3457:27;3529:4;3514:20;;3508:27;3571:23;3582:4;3457:27;3508;3571:10;:23::i;:::-;3564:30;;;;;;;;3151:544;-1:-1:-1;3643:1:3;;-1:-1:-1;3647:35:3;3151:544;2298:1404;;;;;:::o;569:643::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:571;;;569:643;:::o;634:571::-;745:29;736:5;:38;;;;;;;;:::i;:::-;;732:473;;;791:34;;-1:-1:-1;;;791:34:3;;22269:2:19;791:34:3;;;22251:21:19;22308:2;22288:18;;;22281:30;22347:26;22327:18;;;22320:54;22391:18;;791:34:3;22067:348:19;732:473:3;856:35;847:5;:44;;;;;;;;:::i;:::-;;843:362;;;908:41;;-1:-1:-1;;;908:41:3;;22622:2:19;908:41:3;;;22604:21:19;22661:2;22641:18;;;22634:30;22700:33;22680:18;;;22673:61;22751:18;;908:41:3;22420:355:19;843:362:3;980:30;971:5;:39;;;;;;;;:::i;:::-;;967:238;;;1027:44;;-1:-1:-1;;;1027:44:3;;22982:2:19;1027:44:3;;;22964:21:19;23021:2;23001:18;;;22994:30;23060:34;23040:18;;;23033:62;-1:-1:-1;;;23111:18:19;;;23104:32;23153:19;;1027:44:3;22780:398:19;967:238:3;1102:30;1093:5;:39;;;;;;;;:::i;:::-;;1089:116;;;1149:44;;-1:-1:-1;;;1149:44:3;;23385:2:19;1149:44:3;;;23367:21:19;23424:2;23404:18;;;23397:30;23463:34;23443:18;;;23436:62;-1:-1:-1;;;23514:18:19;;;23507:32;23556:19;;1149:44:3;23183:398:19;5956:1632:3;6087:7;;7021:66;7008:79;;7004:163;;;-1:-1:-1;7120:1:3;;-1:-1:-1;7124:30:3;7104:51;;7004:163;7181:1;:7;;7186:2;7181:7;;:18;;;;;7192:1;:7;;7197:2;7192:7;;7181:18;7177:102;;;-1:-1:-1;7232:1:3;;-1:-1:-1;7236:30:3;7216:51;;7177:102;7393:24;;;7376:14;7393:24;;;;;;;;;23813:25:19;;;23886:4;23874:17;;23854:18;;;23847:45;;;;23908:18;;;23901:34;;;23951:18;;;23944:34;;;7393:24:3;;23785:19:19;;7393:24:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7393:24:3;;-1:-1:-1;;7393:24:3;;;-1:-1:-1;;;;;;;7432:20:3;;7428:103;;7485:1;7489:29;7469:50;;;;;;;7428:103;7551:6;-1:-1:-1;7559:20:3;;-1:-1:-1;5956:1632:3;;;;;;;;:::o;4998:344::-;5112:7;;-1:-1:-1;;;;;5158:80:3;;5112:7;5265:25;5281:3;5266:18;;;5288:2;5265:25;:::i;:::-;5249:42;;5309:25;5320:4;5326:1;5329;5332;5309:10;:25::i;:::-;5302:32;;;;;;4998:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:19;-1:-1:-1;;;;;;88:32:19;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:19;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:19;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:19:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:19;;1343:180;-1:-1:-1;1343:180:19:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:19;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:19:o;2355:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:275;2558:2;2552:9;2623:2;2604:13;;-1:-1:-1;;2600:27:19;2588:40;;-1:-1:-1;;;;;2643:34:19;;2679:22;;;2640:62;2637:88;;;2705:18;;:::i;:::-;2741:2;2734:22;2487:275;;-1:-1:-1;2487:275:19:o;2767:407::-;2832:5;-1:-1:-1;;;;;2858:6:19;2855:30;2852:56;;;2888:18;;:::i;:::-;2926:57;2971:2;2950:15;;-1:-1:-1;;2946:29:19;2977:4;2942:40;2926:57;:::i;:::-;2917:66;;3006:6;2999:5;2992:21;3046:3;3037:6;3032:3;3028:16;3025:25;3022:45;;;3063:1;3060;3053:12;3022:45;3112:6;3107:3;3100:4;3093:5;3089:16;3076:43;3166:1;3159:4;3150:6;3143:5;3139:18;3135:29;3128:40;2767:407;;;;;:::o;3179:222::-;3222:5;3275:3;3268:4;3260:6;3256:17;3252:27;3242:55;;3293:1;3290;3283:12;3242:55;3315:80;3391:3;3382:6;3369:20;3362:4;3354:6;3350:17;3315:80;:::i;3406:322::-;3475:6;3528:2;3516:9;3507:7;3503:23;3499:32;3496:52;;;3544:1;3541;3534:12;3496:52;3584:9;3571:23;-1:-1:-1;;;;;3609:6:19;3606:30;3603:50;;;3649:1;3646;3639:12;3603:50;3672;3714:7;3705:6;3694:9;3690:22;3672:50;:::i;3733:328::-;3810:6;3818;3826;3879:2;3867:9;3858:7;3854:23;3850:32;3847:52;;;3895:1;3892;3885:12;3847:52;3918:29;3937:9;3918:29;:::i;:::-;3908:39;;3966:38;4000:2;3989:9;3985:18;3966:38;:::i;:::-;3956:48;;4051:2;4040:9;4036:18;4023:32;4013:42;;3733:328;;;;;:::o;4066:347::-;4117:8;4127:6;4181:3;4174:4;4166:6;4162:17;4158:27;4148:55;;4199:1;4196;4189:12;4148:55;-1:-1:-1;4222:20:19;;-1:-1:-1;;;;;4254:30:19;;4251:50;;;4297:1;4294;4287:12;4251:50;4334:4;4326:6;4322:17;4310:29;;4386:3;4379:4;4370:6;4362;4358:19;4354:30;4351:39;4348:59;;;4403:1;4400;4393:12;4418:1075;4539:6;4547;4555;4563;4571;4579;4587;4640:3;4628:9;4619:7;4615:23;4611:33;4608:53;;;4657:1;4654;4647:12;4608:53;4693:9;4680:23;4670:33;;4754:2;4743:9;4739:18;4726:32;-1:-1:-1;;;;;4818:2:19;4810:6;4807:14;4804:34;;;4834:1;4831;4824:12;4804:34;4873:58;4923:7;4914:6;4903:9;4899:22;4873:58;:::i;:::-;4950:8;;-1:-1:-1;4847:84:19;-1:-1:-1;5038:2:19;5023:18;;5010:32;;-1:-1:-1;5054:16:19;;;5051:36;;;5083:1;5080;5073:12;5051:36;5122:60;5174:7;5163:8;5152:9;5148:24;5122:60;:::i;:::-;5201:8;;-1:-1:-1;5096:86:19;-1:-1:-1;5289:2:19;5274:18;;5261:32;;-1:-1:-1;5305:16:19;;;5302:36;;;5334:1;5331;5324:12;5302:36;;5373:60;5425:7;5414:8;5403:9;5399:24;5373:60;:::i;:::-;4418:1075;;;;-1:-1:-1;4418:1075:19;;-1:-1:-1;4418:1075:19;;;;5347:86;;-1:-1:-1;;;4418:1075:19:o;5498:183::-;5558:4;-1:-1:-1;;;;;5583:6:19;5580:30;5577:56;;;5613:18;;:::i;:::-;-1:-1:-1;5658:1:19;5654:14;5670:4;5650:25;;5498:183::o;5686:897::-;5770:6;5801:2;5844;5832:9;5823:7;5819:23;5815:32;5812:52;;;5860:1;5857;5850:12;5812:52;5900:9;5887:23;-1:-1:-1;;;;;5925:6:19;5922:30;5919:50;;;5965:1;5962;5955:12;5919:50;5988:22;;6041:4;6033:13;;6029:27;-1:-1:-1;6019:55:19;;6070:1;6067;6060:12;6019:55;6106:2;6093:16;6129:60;6145:43;6185:2;6145:43;:::i;:::-;6129:60;:::i;:::-;6223:15;;;6305:1;6301:10;;;;6293:19;;6289:28;;;6254:12;;;;6329:19;;;6326:39;;;6361:1;6358;6351:12;6326:39;6385:11;;;;6405:148;6421:6;6416:3;6413:15;6405:148;;;6487:23;6506:3;6487:23;:::i;:::-;6475:36;;6438:12;;;;6531;;;;6405:148;;;6572:5;5686:897;-1:-1:-1;;;;;;;5686:897:19:o;6588:891::-;6672:6;6703:2;6746;6734:9;6725:7;6721:23;6717:32;6714:52;;;6762:1;6759;6752:12;6714:52;6802:9;6789:23;-1:-1:-1;;;;;6827:6:19;6824:30;6821:50;;;6867:1;6864;6857:12;6821:50;6890:22;;6943:4;6935:13;;6931:27;-1:-1:-1;6921:55:19;;6972:1;6969;6962:12;6921:55;7008:2;6995:16;7031:60;7047:43;7087:2;7047:43;:::i;7031:60::-;7125:15;;;7207:1;7203:10;;;;7195:19;;7191:28;;;7156:12;;;;7231:19;;;7228:39;;;7263:1;7260;7253:12;7228:39;7287:11;;;;7307:142;7323:6;7318:3;7315:15;7307:142;;;7389:17;;7377:30;;7340:12;;;;7427;;;;7307:142;;7767:724;8002:2;8054:21;;;8124:13;;8027:18;;;8146:22;;;7973:4;;8002:2;8225:15;;;;8199:2;8184:18;;;7973:4;8268:197;8282:6;8279:1;8276:13;8268:197;;;8331:52;8379:3;8370:6;8364:13;7568:12;;-1:-1:-1;;;;;7564:38:19;7552:51;;7656:4;7645:16;;;7639:23;-1:-1:-1;;;;;7635:48:19;7619:14;;;7612:72;7747:4;7736:16;;;7730:23;7723:31;7716:39;7700:14;;7693:63;7484:278;8331:52;8440:15;;;;8412:4;8403:14;;;;;8304:1;8297:9;8268:197;;8496:186;8555:6;8608:2;8596:9;8587:7;8583:23;8579:32;8576:52;;;8624:1;8621;8614:12;8576:52;8647:29;8666:9;8647:29;:::i;8687:390::-;8765:6;8773;8826:2;8814:9;8805:7;8801:23;8797:32;8794:52;;;8842:1;8839;8832:12;8794:52;8878:9;8865:23;8855:33;;8939:2;8928:9;8924:18;8911:32;-1:-1:-1;;;;;8958:6:19;8955:30;8952:50;;;8998:1;8995;8988:12;8952:50;9021;9063:7;9054:6;9043:9;9039:22;9021:50;:::i;:::-;9011:60;;;8687:390;;;;;:::o;9082:632::-;9253:2;9305:21;;;9375:13;;9278:18;;;9397:22;;;9224:4;;9253:2;9476:15;;;;9450:2;9435:18;;;9224:4;9519:169;9533:6;9530:1;9527:13;9519:169;;;9594:13;;9582:26;;9663:15;;;;9628:12;;;;9555:1;9548:9;9519:169;;9719:322;9796:6;9804;9812;9865:2;9853:9;9844:7;9840:23;9836:32;9833:52;;;9881:1;9878;9871:12;9833:52;9904:29;9923:9;9904:29;:::i;:::-;9894:39;9980:2;9965:18;;9952:32;;-1:-1:-1;10031:2:19;10016:18;;;10003:32;;9719:322;-1:-1:-1;;;9719:322:19:o;10046:160::-;10111:20;;10167:13;;10160:21;10150:32;;10140:60;;10196:1;10193;10186:12;10211:254;10276:6;10284;10337:2;10325:9;10316:7;10312:23;10308:32;10305:52;;;10353:1;10350;10343:12;10305:52;10376:29;10395:9;10376:29;:::i;:::-;10366:39;;10424:35;10455:2;10444:9;10440:18;10424:35;:::i;:::-;10414:45;;10211:254;;;;;:::o;10470:667::-;10565:6;10573;10581;10589;10642:3;10630:9;10621:7;10617:23;10613:33;10610:53;;;10659:1;10656;10649:12;10610:53;10682:29;10701:9;10682:29;:::i;:::-;10672:39;;10730:38;10764:2;10753:9;10749:18;10730:38;:::i;:::-;10720:48;;10815:2;10804:9;10800:18;10787:32;10777:42;;10870:2;10859:9;10855:18;10842:32;-1:-1:-1;;;;;10889:6:19;10886:30;10883:50;;;10929:1;10926;10919:12;10883:50;10952:22;;11005:4;10997:13;;10993:27;-1:-1:-1;10983:55:19;;11034:1;11031;11024:12;10983:55;11057:74;11123:7;11118:2;11105:16;11100:2;11096;11092:11;11057:74;:::i;:::-;11047:84;;;10470:667;;;;;;;:::o;11142:254::-;11210:6;11218;11271:2;11259:9;11250:7;11246:23;11242:32;11239:52;;;11287:1;11284;11277:12;11239:52;11323:9;11310:23;11300:33;;11352:38;11386:2;11375:9;11371:18;11352:38;:::i;11401:267::-;7568:12;;-1:-1:-1;;;;;7564:38:19;7552:51;;7656:4;7645:16;;;7639:23;-1:-1:-1;;;;;7635:48:19;7619:14;;;7612:72;7747:4;7736:16;;;7730:23;7723:31;7716:39;7700:14;;;7693:63;11599:2;11584:18;;11611:51;7484:278;11673:180;11729:6;11782:2;11770:9;11761:7;11757:23;11753:32;11750:52;;;11798:1;11795;11788:12;11750:52;11821:26;11837:9;11821:26;:::i;11858:260::-;11926:6;11934;11987:2;11975:9;11966:7;11962:23;11958:32;11955:52;;;12003:1;12000;11993:12;11955:52;12026:29;12045:9;12026:29;:::i;:::-;12016:39;;12074:38;12108:2;12097:9;12093:18;12074:38;:::i;12123:380::-;12202:1;12198:12;;;;12245;;;12266:61;;12320:4;12312:6;12308:17;12298:27;;12266:61;12373:2;12365:6;12362:14;12342:18;12339:38;12336:161;;;12419:10;12414:3;12410:20;12407:1;12400:31;12454:4;12451:1;12444:15;12482:4;12479:1;12472:15;12336:161;;12123:380;;;:::o;12508:356::-;12710:2;12692:21;;;12729:18;;;12722:30;12788:34;12783:2;12768:18;;12761:62;12855:2;12840:18;;12508:356::o;12869:127::-;12930:10;12925:3;12921:20;12918:1;12911:31;12961:4;12958:1;12951:15;12985:4;12982:1;12975:15;13001:125;13041:4;13069:1;13066;13063:8;13060:34;;;13074:18;;:::i;:::-;-1:-1:-1;13111:9:19;;13001:125::o;13131:128::-;13171:3;13202:1;13198:6;13195:1;13192:13;13189:39;;;13208:18;;:::i;:::-;-1:-1:-1;13244:9:19;;13131:128::o;13264:344::-;13466:2;13448:21;;;13505:2;13485:18;;;13478:30;-1:-1:-1;;;13539:2:19;13524:18;;13517:50;13599:2;13584:18;;13264:344::o;14524:273::-;14709:6;14701;14696:3;14683:33;14665:3;14735:16;;14760:13;;;14735:16;14524:273;-1:-1:-1;14524:273:19:o;15152:127::-;15213:10;15208:3;15204:20;15201:1;15194:31;15244:4;15241:1;15234:15;15268:4;15265:1;15258:15;15284:135;15323:3;-1:-1:-1;;15344:17:19;;15341:43;;;15364:18;;:::i;:::-;-1:-1:-1;15411:1:19;15400:13;;15284:135::o;15773:168::-;15813:7;15879:1;15875;15871:6;15867:14;15864:1;15861:21;15856:1;15849:9;15842:17;15838:45;15835:71;;;15886:18;;:::i;:::-;-1:-1:-1;15926:9:19;;15773:168::o;16639:317::-;-1:-1:-1;;;;;16816:32:19;;16798:51;;16885:2;16880;16865:18;;16858:30;;;-1:-1:-1;;16905:45:19;;16931:18;;16923:6;16905:45;:::i;17503:1527::-;17727:3;17765:6;17759:13;17791:4;17804:51;17848:6;17843:3;17838:2;17830:6;17826:15;17804:51;:::i;:::-;17918:13;;17877:16;;;;17940:55;17918:13;17877:16;17962:15;;;17940:55;:::i;:::-;18084:13;;18017:20;;;18057:1;;18144;18166:18;;;;18219;;;;18246:93;;18324:4;18314:8;18310:19;18298:31;;18246:93;18387:2;18377:8;18374:16;18354:18;18351:40;18348:167;;;-1:-1:-1;;;18414:33:19;;18470:4;18467:1;18460:15;18500:4;18421:3;18488:17;18348:167;18531:18;18558:110;;;;18682:1;18677:328;;;;18524:481;;18558:110;-1:-1:-1;;18593:24:19;;18579:39;;18638:20;;;;-1:-1:-1;18558:110:19;;18677:328;17450:1;17443:14;;;17487:4;17474:18;;18772:1;18786:169;18800:8;18797:1;18794:15;18786:169;;;18882:14;;18867:13;;;18860:37;18925:16;;;;18817:10;;18786:169;;;18790:3;;18986:8;18979:5;18975:20;18968:27;;18524:481;-1:-1:-1;19021:3:19;;17503:1527;-1:-1:-1;;;;;;;;;;;17503:1527:19:o;19442:489::-;-1:-1:-1;;;;;19711:15:19;;;19693:34;;19763:15;;19758:2;19743:18;;19736:43;19810:2;19795:18;;19788:34;;;19858:3;19853:2;19838:18;;19831:31;;;19636:4;;19879:46;;19905:19;;19897:6;19879:46;:::i;:::-;19871:54;19442:489;-1:-1:-1;;;;;;19442:489:19:o;19936:249::-;20005:6;20058:2;20046:9;20037:7;20033:23;20029:32;20026:52;;;20074:1;20071;20064:12;20026:52;20106:9;20100:16;20125:30;20149:5;20125:30;:::i;20190:127::-;20251:10;20246:3;20242:20;20239:1;20232:31;20282:4;20279:1;20272:15;20306:4;20303:1;20296:15;20322:120;20362:1;20388;20378:35;;20393:18;;:::i;:::-;-1:-1:-1;20427:9:19;;20322:120::o;20447:112::-;20479:1;20505;20495:35;;20510:18;;:::i;:::-;-1:-1:-1;20544:9:19;;20447:112::o;20564:267::-;20653:6;20648:3;20641:19;20705:6;20698:5;20691:4;20686:3;20682:14;20669:43;-1:-1:-1;20757:1:19;20732:16;;;20750:4;20728:27;;;20721:38;;;;20813:2;20792:15;;;-1:-1:-1;;20788:29:19;20779:39;;;20775:50;;20564:267::o;20836:709::-;21137:3;21126:9;21119:22;21100:4;21164:63;21222:3;21211:9;21207:19;21199:6;21191;21164:63;:::i;:::-;21275:9;21267:6;21263:22;21258:2;21247:9;21243:18;21236:50;21303;21346:6;21338;21330;21303:50;:::i;:::-;21384:2;21369:18;;21362:34;;;;-1:-1:-1;;;;;;;21470:15:19;;;21465:2;21450:18;;21443:43;21523:15;;21517:3;21502:19;;;21495:44;21295:58;20836:709;-1:-1:-1;;;;20836:709:19:o;21935:127::-;21996:10;21991:3;21987:20;21984:1;21977:31;22027:4;22024:1;22017:15;22051:4;22048:1;22041:15

Swarm Source

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