ETH Price: $2,839.41 (+3.43%)
 

Overview

Max Total Supply

88 FLY

Holders

24

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 FLY
0x7f45d60ea27f921bed0972241b0afaaae5923b3c
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:
FlyMan

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 7 of 14: FLYBeast.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./Ownable.sol";
import "./ERC2981.sol";
import "./Address.sol";
import "./Strings.sol";
import "./ERC721AQueryable.sol";

enum Stage {
    NotStarted,
    Claim,
    Sale
}

contract FlyMan is ERC2981, ERC721AQueryable, Ownable {
    using Address for address payable;
    using Strings for uint256;

    address public constant BLACKHOLE = 0x000000000000000000000000000000000000dEaD;

    IERC721 public immutable _fly;

    uint256 public _price;
    uint32 public immutable _maxSupply;
    uint32 public immutable _holderSupply;
    uint32 public immutable _teamSupply;
    uint32 public immutable _walletLimit;

    uint32 public _teamMinted;
    uint32 public _holderClaimed;
    string public _metadataURI;
    string public _notRevealedUri = "ipfs://QmUQNKQ5RN9s7FDBzeeu3N7DxaAoHB8jr1caDueKpofhZ9";
    Stage public _stage = Stage.NotStarted;
    bool public _revealed = false;

    struct Status {
        uint256 price;
        uint32 maxSupply;
        uint32 publicSupply;
        uint32 walletLimit;
        uint32 publicMinted;
        uint32 userMinted;
        bool soldout;
        Stage stage;
    }

    constructor(
        address fly,
        uint256 price,
        uint32 maxSupply,
        uint32 holderSupply,
        uint32 teamSupply,
        uint32 walletLimit
    ) ERC721A("FLY MAN", "FLY") {
        require(fly != address(0));
        require(maxSupply >= holderSupply + teamSupply);

        _fly = IERC721(fly);
        _price = price;
        _maxSupply = maxSupply;
        _holderSupply = holderSupply;
        _teamSupply = teamSupply;
        _walletLimit = walletLimit;

        setFeeNumerator(750);
    }

    function claim(uint256[] memory tokenIds) external {
        require(_stage == Stage.Claim);
        require(tokenIds.length > 0 && tokenIds.length % 2 == 0);
        uint32 pairs = uint32(tokenIds.length / 2);
        require(pairs + _holderClaimed <= _holderSupply);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            _fly.transferFrom(msg.sender, BLACKHOLE, tokenIds[i]);
            unchecked {
                i++;
            }
        }
        _setAux(msg.sender, _getAux(msg.sender) + pairs);
        _safeMint(msg.sender, pairs);
    }

    function mint(uint32 amount) external payable {
        require(_stage == Stage.Sale);
        require(amount + _publicMinted() <= _publicSupply());
        require(amount + uint32(_numberMinted(msg.sender)) - uint32(_getAux(msg.sender)) <= _walletLimit);
        require(msg.value == amount * _price);
        _safeMint(msg.sender, amount);
    }

    function _publicMinted() public view returns (uint32) {
        return uint32(_totalMinted()) - _teamMinted;
    }

    function _publicSupply() public view returns (uint32) {
        return _maxSupply - _teamSupply;
    }

    function _status(address minter) external view returns (Status memory) {
        uint32 publicSupply = _publicSupply();
        uint32 publicMinted = _publicMinted();
        return Status({
            price: _price,
            maxSupply: _maxSupply,
            publicSupply: publicSupply,
            walletLimit: _walletLimit,
            publicMinted: publicMinted,
            soldout: publicMinted >= publicSupply,
            userMinted: uint32(_numberMinted(minter)) - uint32(_getAux(msg.sender)),
            stage: _stage
        });
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        if ( _revealed == false ) {
            return _notRevealedUri;
        }
        string memory baseURI = _metadataURI;
        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC721A) returns (bool) {
        return
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function devMint(address to, uint32 amount) external onlyOwner {
        _teamMinted += amount;
        require(_teamMinted <= _teamSupply);
        _safeMint(to, amount);
    }

    function setFeeNumerator(uint96 feeNumerator) public onlyOwner {
        _setDefaultRoyalty(owner(), feeNumerator);
    }

    function setStage(Stage stage) external onlyOwner {
        _stage = stage;
    }

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

    function setMetadataURI(string memory uri) external onlyOwner {
        _metadataURI = uri;
    }

    function setNotRevealedURI( string memory notRevealedURI ) public onlyOwner {
        _notRevealedUri = notRevealedURI;
    }

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

    function withdraw() external onlyOwner {
        payable(msg.sender).sendValue(address(this).balance);
    }

}

File 1 of 14: 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 14: 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 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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

pragma solidity ^0.8.4;

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata 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, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public 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() && !_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;
    }

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

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

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

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

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

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

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

            if (safe && 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 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 This is 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 6 of 14: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './ERC721A.sol';

error InvalidQueryRange();

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A {
    /**
     * @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 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 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 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 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 14: 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 14: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 10 of 14: 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 11 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

File 13 of 14: 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 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"fly","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint32","name":"maxSupply","type":"uint32"},{"internalType":"uint32","name":"holderSupply","type":"uint32"},{"internalType":"uint32","name":"teamSupply","type":"uint32"},{"internalType":"uint32","name":"walletLimit","type":"uint32"}],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BLACKHOLE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fly","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_holderClaimed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_holderSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicMinted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stage","outputs":[{"internalType":"enum Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"_status","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint32","name":"maxSupply","type":"uint32"},{"internalType":"uint32","name":"publicSupply","type":"uint32"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"uint32","name":"publicMinted","type":"uint32"},{"internalType":"uint32","name":"userMinted","type":"uint32"},{"internalType":"bool","name":"soldout","type":"bool"},{"internalType":"enum Stage","name":"stage","type":"uint8"}],"internalType":"struct FlyMan.Status","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamMinted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","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 ERC721A.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 ERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"revealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Stage","name":"stage","type":"uint8"}],"name":"setStage","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":"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101806040526035610120818152906200352b6101403980516200002c91600e9160209091019062000330565b50600f805461ffff191690553480156200004557600080fd5b5060405162003560380380620035608339810160408190526200006891620003f0565b604080518082018252600781526623262c9026a0a760c91b602080830191825283518085019094526003845262464c5960e81b908401528151919291620000b29160049162000330565b508051620000c890600590602084019062000330565b5050600060025550620000db336200015c565b6001600160a01b038616620000ef57600080fd5b620000fb828462000476565b63ffffffff168463ffffffff1610156200011457600080fd5b6001600160a01b038616608052600b85905563ffffffff80851660a05283811660c05282811660e052811661010052620001506102ee620001ae565b505050505050620004ea565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200020e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6200022c62000225600a546001600160a01b031690565b826200022f565b50565b6127106001600160601b03821611156200029f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000205565b6001600160a01b038216620002f75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000205565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b8280546200033e90620004ad565b90600052602060002090601f016020900481019282620003625760008555620003ad565b82601f106200037d57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ad57825182559160200191906001019062000390565b50620003bb929150620003bf565b5090565b5b80821115620003bb5760008155600101620003c0565b805163ffffffff81168114620003eb57600080fd5b919050565b60008060008060008060c087890312156200040a57600080fd5b86516001600160a01b03811681146200042257600080fd5b602088015190965094506200043a60408801620003d6565b93506200044a60608801620003d6565b92506200045a60808801620003d6565b91506200046a60a08801620003d6565b90509295509295509295565b600063ffffffff808316818516808303821115620004a457634e487b7160e01b600052601160045260246000fd5b01949350505050565b600181811c90821680620004c257607f821691505b60208210811415620004e457634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051612fc462000567600039600081816103a40152818161145b01526115f70152600081816102df01528181610b4a015261194c01526000818161085c0152610e1b01526000818161045801528181611423015261196d0152600081816107be0152610e700152612fc46000f3fe6080604052600436106102935760003560e01c80637c0171411161015a578063c61c3f76116100c1578063dd48f07d1161007a578063dd48f07d1461087e578063e0a808531461089b578063e985e9c5146108bb578063f2c4ce1e146108db578063f2fde38b146108fb578063f9f5274c1461091b57600080fd5b8063c61c3f76146107ac578063c87b56dd146107e0578063ccd5f6a214610800578063ce3cd99714610815578063d4a6762314610835578063daefeade1461084a57600080fd5b80639a7cfa4f116101135780639a7cfa4f146106ea578063a22cb46514610717578063a71bbebe14610737578063aa0739071461074a578063b88d4fde1461075f578063c23dc68f1461077f57600080fd5b80637c017141146106255780638462151c1461064a5780638da5cb5b1461067757806391b7f5ed1461069557806395d89b41146106b557806399a2557a146106ca57600080fd5b806323b872dd116101fe578063653a819e116101b7578063653a819e146105715780636ba4c138146105915780636ebeac85146105b157806370a08231146105d0578063715018a6146105f0578063750521f51461060557600080fd5b806323b872dd146104905780632a55205a146104b05780633ccfd60b146104ef57806342842e0e146105045780635bbb2177146105245780636352211e1461055157600080fd5b806316396b631161025057806316396b63146103c657806317a5aced146103ed57806318160ddd1461040d5780631cd3a4ac1461043057806322f4596f14610446578063235b6ea11461047a57600080fd5b806301ffc9a7146102985780630517431e146102cd57806306fdde0314610316578063081812fc14610338578063095ea7b3146103705780630e2351e214610392575b600080fd5b3480156102a457600080fd5b506102b86102b33660046126ed565b610930565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c4565b34801561032257600080fd5b5061032b610976565b6040516102c49190612762565b34801561034457600080fd5b50610358610353366004612775565b610a08565b6040516001600160a01b0390911681526020016102c4565b34801561037c57600080fd5b5061039061038b3660046127aa565b610a4c565b005b34801561039e57600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d257600080fd5b50600f546103e09060ff1681565b6040516102c4919061280c565b3480156103f957600080fd5b5061039061040836600461282e565b610ada565b34801561041957600080fd5b50600354600254035b6040519081526020016102c4565b34801561043c57600080fd5b5061035861dead81565b34801561045257600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b34801561048657600080fd5b50610422600b5481565b34801561049c57600080fd5b506103906104ab366004612861565b610b8e565b3480156104bc57600080fd5b506104d06104cb36600461289d565b610b99565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104fb57600080fd5b50610390610c45565b34801561051057600080fd5b5061039061051f366004612861565b610c7b565b34801561053057600080fd5b5061054461053f366004612905565b610c96565b6040516102c491906129aa565b34801561055d57600080fd5b5061035861056c366004612775565b610d5c565b34801561057d57600080fd5b5061039061058c366004612a14565b610d6e565b34801561059d57600080fd5b506103906105ac366004612905565b610db6565b3480156105bd57600080fd5b50600f546102b890610100900460ff1681565b3480156105dc57600080fd5b506104226105eb366004612a3d565b610fac565b3480156105fc57600080fd5b50610390610ffa565b34801561061157600080fd5b50610390610620366004612aaf565b61102e565b34801561063157600080fd5b50600c5461030190640100000000900463ffffffff1681565b34801561065657600080fd5b5061066a610665366004612a3d565b61106b565b6040516102c49190612af7565b34801561068357600080fd5b50600a546001600160a01b0316610358565b3480156106a157600080fd5b506103906106b0366004612775565b6111b8565b3480156106c157600080fd5b5061032b6111e7565b3480156106d657600080fd5b5061066a6106e5366004612b2f565b6111f6565b3480156106f657600080fd5b5061070a610705366004612a3d565b6113b0565b6040516102c49190612b62565b34801561072357600080fd5b50610390610732366004612be8565b61150b565b610390610745366004612c12565b6115a1565b34801561075657600080fd5b50610301611698565b34801561076b57600080fd5b5061039061077a366004612c2d565b6116bc565b34801561078b57600080fd5b5061079f61079a366004612775565b61170d565b6040516102c49190612ca8565b3480156107b857600080fd5b506103587f000000000000000000000000000000000000000000000000000000000000000081565b3480156107ec57600080fd5b5061032b6107fb366004612775565b6117bb565b34801561080c57600080fd5b50610301611945565b34801561082157600080fd5b50610390610830366004612cdd565b611991565b34801561084157600080fd5b5061032b6119e2565b34801561085657600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000081565b34801561088a57600080fd5b50600c546103019063ffffffff1681565b3480156108a757600080fd5b506103906108b6366004612cfe565b611a70565b3480156108c757600080fd5b506102b86108d6366004612d19565b611ab4565b3480156108e757600080fd5b506103906108f6366004612aaf565b611ae2565b34801561090757600080fd5b50610390610916366004612a3d565b611b1f565b34801561092757600080fd5b5061032b611bb7565b60006001600160e01b0319821663152a902d60e11b148061096157506001600160e01b031982166380ac58cd60e01b145b80610970575061097082611bc4565b92915050565b60606004805461098590612d43565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190612d43565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b6000610a1382611c04565b610a30576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a5782610d5c565b9050806001600160a01b0316836001600160a01b03161415610a8c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610aac5750610aaa8133611ab4565b155b15610aca576040516367d9dca160e11b815260040160405180910390fd5b610ad5838383611c30565b505050565b600a546001600160a01b03163314610b0d5760405162461bcd60e51b8152600401610b0490612d7e565b60405180910390fd5b600c8054829190600090610b2890849063ffffffff16612dc9565b82546101009290920a63ffffffff818102199093169183160217909155600c547f00000000000000000000000000000000000000000000000000000000000000008216911611159050610b7a57600080fd5b610b8a828263ffffffff16611c8c565b5050565b610ad5838383611ca6565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610c0e5750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610c2d906001600160601b031687612df1565b610c379190612e26565b915196919550909350505050565b600a546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401610b0490612d7e565b610c793347611e94565b565b610ad5838383604051806020016040528060008152506116bc565b80516060906000816001600160401b03811115610cb557610cb56128bf565b604051908082528060200260200182016040528015610d0057816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610cd35790505b50905060005b828114610d5457610d2f858281518110610d2257610d22612e3a565b602002602001015161170d565b828281518110610d4157610d41612e3a565b6020908102919091010152600101610d06565b509392505050565b6000610d6782611fad565b5192915050565b600a546001600160a01b03163314610d985760405162461bcd60e51b8152600401610b0490612d7e565b610db3610dad600a546001600160a01b031690565b826120c7565b50565b6001600f5460ff166002811115610dcf57610dcf6127d4565b14610dd957600080fd5b60008151118015610df5575060028151610df39190612e50565b155b610dfe57600080fd5b600060028251610e0e9190612e26565b600c5490915063ffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691610e51916401000000009091041683612dc9565b63ffffffff161115610e6257600080fd5b60005b8251811015610f3e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd3361dead868581518110610eb357610eb3612e3a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610f0d57600080fd5b505af1158015610f21573d6000803e3d6000fd5b505060019092019150819050610f3681612e64565b915050610e65565b50610f9c338263ffffffff16610f53336121c4565b610f5d9190612e7f565b6001600160a01b03909116600090815260076020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b610b8a338263ffffffff16611c8c565b60006001600160a01b038216610fd5576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b600a546001600160a01b031633146110245760405162461bcd60e51b8152600401610b0490612d7e565b610c7960006121ef565b600a546001600160a01b031633146110585760405162461bcd60e51b8152600401610b0490612d7e565b8051610b8a90600d90602084019061263e565b6060600080600061107b85610fac565b90506000816001600160401b03811115611097576110976128bf565b6040519080825280602002602001820160405280156110c0578160200160208202803683370190505b5090506110e6604080516060810182526000808252602082018190529181019190915290565b60005b8386146111ac57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252925061114f576111a4565b81516001600160a01b03161561116457815194505b876001600160a01b0316856001600160a01b031614156111a4578083878060010198508151811061119757611197612e3a565b6020026020010181815250505b6001016110e9565b50909695505050505050565b600a546001600160a01b031633146111e25760405162461bcd60e51b8152600401610b0490612d7e565b600b55565b60606005805461098590612d43565b606081831061121857604051631960ccad60e11b815260040160405180910390fd5b6002546000908084111561122a578093505b600061123587610fac565b905084861015611254578585038181101561124e578091505b50611258565b5060005b6000816001600160401b03811115611272576112726128bf565b60405190808252806020026020018201604052801561129b578160200160208202803683370190505b509050816112ae5793506113a992505050565b60006112b98861170d565b9050600081604001516112ca575080515b885b8881141580156112dc5750848714155b1561139d57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252935061134057611395565b82516001600160a01b03161561135557825191505b8a6001600160a01b0316826001600160a01b03161415611395578084888060010199508151811061138857611388612e3a565b6020026020010181815250505b6001016112cc565b50505092835250909150505b9392505050565b6113f56040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529060e082015290565b60006113ff611945565b9050600061140b611698565b9050604051806101000160405280600b5481526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020018363ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020018263ffffffff16815260200161149a336121c4565b6001600160a01b038716600090815260076020526040902054600160401b90046001600160401b03166114cd9190612ea1565b63ffffffff908116825284811690841610156020820152600f5460409091019060ff166002811115611501576115016127d4565b9052949350505050565b6001600160a01b0382163314156115355760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600f5460ff1660028111156115ba576115ba6127d4565b146115c457600080fd5b6115cc611945565b63ffffffff166115da611698565b6115e49083612dc9565b63ffffffff1611156115f557600080fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16611625336121c4565b33600090815260076020526040902054600160401b90046001600160401b031661164f9084612dc9565b6116599190612ea1565b63ffffffff16111561166a57600080fd5b600b5461167d9063ffffffff8316612df1565b341461168857600080fd5b610db3338263ffffffff16611c8c565b600c5460009063ffffffff166116ad60025490565b6116b79190612ea1565b905090565b6116c7848484611ca6565b6001600160a01b0383163b151580156116e957506116e784848484612241565b155b15611707576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051606080820183526000808352602080840182905283850182905284519283018552818352820181905292810183905290915060025483106117525792915050565b50600082815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906117b25792915050565b6113a983611fad565b60606117c682611c04565b6117e357604051630a14c4b560e41b815260040160405180910390fd5b600f54610100900460ff1661188457600e80546117ff90612d43565b80601f016020809104026020016040519081016040528092919081815260200182805461182b90612d43565b80156118785780601f1061184d57610100808354040283529160200191611878565b820191906000526020600020905b81548152906001019060200180831161185b57829003601f168201915b50505050509050919050565b6000600d805461189390612d43565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf90612d43565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b505050505090508061191d84612339565b60405160200161192e929190612ec6565b604051602081830303815290604052915050919050565b60006116b77f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612ea1565b600a546001600160a01b031633146119bb5760405162461bcd60e51b8152600401610b0490612d7e565b600f805482919060ff191660018360028111156119da576119da6127d4565b021790555050565b600d80546119ef90612d43565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1b90612d43565b8015611a685780601f10611a3d57610100808354040283529160200191611a68565b820191906000526020600020905b815481529060010190602001808311611a4b57829003601f168201915b505050505081565b600a546001600160a01b03163314611a9a5760405162461bcd60e51b8152600401610b0490612d7e565b600f80549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314611b0c5760405162461bcd60e51b8152600401610b0490612d7e565b8051610b8a90600e90602084019061263e565b600a546001600160a01b03163314611b495760405162461bcd60e51b8152600401610b0490612d7e565b6001600160a01b038116611bae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b04565b610db3816121ef565b600e80546119ef90612d43565b60006001600160e01b031982166380ac58cd60e01b1480611bf557506001600160e01b03198216635b5e139f60e01b145b80610970575061097082612436565b600060025482108015610970575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610b8a82826040518060200160405280600081525061246b565b6000611cb182611fad565b9050836001600160a01b031681600001516001600160a01b031614611ce85760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611d065750611d068533611ab4565b80611d21575033611d1684610a08565b6001600160a01b0316145b905080611d4157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611d6857604051633a954ecd60e21b815260040160405180910390fd5b611d7460008487611c30565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611e48576002548214611e4857805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611ee45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b04565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f31576040519150601f19603f3d011682016040523d82523d6000602084013e611f36565b606091505b5050905080610ad55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b04565b6040805160608101825260008082526020820181905291810191909152816002548110156120ae57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120ac5780516001600160a01b031615612043579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120a7579392505050565b612043565b505b604051636f96cda160e11b815260040160405180910390fd5b6127106001600160601b03821611156121355760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b04565b6001600160a01b03821661218b5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b04565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b6001600160a01b0316600090815260076020526040902054600160c01b90046001600160401b031690565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612276903390899088908890600401612f05565b602060405180830381600087803b15801561229057600080fd5b505af19250505080156122c0575060408051601f3d908101601f191682019092526122bd91810190612f42565b60015b61231b573d8080156122ee576040519150601f19603f3d011682016040523d82523d6000602084013e6122f3565b606091505b508051612313576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161235d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612387578061237181612e64565b91506123809050600a83612e26565b9150612361565b6000816001600160401b038111156123a1576123a16128bf565b6040519080825280601f01601f1916602001820160405280156123cb576020820181803683370190505b5090505b8415612331576123e0600183612f5f565b91506123ed600a86612e50565b6123f8906030612f76565b60f81b81838151811061240d5761240d612e3a565b60200101906001600160f81b031916908160001a90535061242f600a86612e26565b94506123cf565b60006001600160e01b0319821663152a902d60e11b148061097057506301ffc9a760e01b6001600160e01b0319831614610970565b610ad583838360016002546001600160a01b03851661249c57604051622e076360e81b815260040160405180910390fd5b836124ba5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561256657506001600160a01b0387163b15155b156125ef575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125b76000888480600101955088612241565b6125d4576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561256c5782600254146125ea57600080fd5b612635565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156125f0575b50600255611e8d565b82805461264a90612d43565b90600052602060002090601f01602090048101928261266c57600085556126b2565b82601f1061268557805160ff19168380011785556126b2565b828001600101855582156126b2579182015b828111156126b2578251825591602001919060010190612697565b506126be9291506126c2565b5090565b5b808211156126be57600081556001016126c3565b6001600160e01b031981168114610db357600080fd5b6000602082840312156126ff57600080fd5b81356113a9816126d7565b60005b8381101561272557818101518382015260200161270d565b838111156117075750506000910152565b6000815180845261274e81602086016020860161270a565b601f01601f19169290920160200192915050565b6020815260006113a96020830184612736565b60006020828403121561278757600080fd5b5035919050565b80356001600160a01b03811681146127a557600080fd5b919050565b600080604083850312156127bd57600080fd5b6127c68361278e565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6003811061280857634e487b7160e01b600052602160045260246000fd5b9052565b6020810161097082846127ea565b803563ffffffff811681146127a557600080fd5b6000806040838503121561284157600080fd5b61284a8361278e565b91506128586020840161281a565b90509250929050565b60008060006060848603121561287657600080fd5b61287f8461278e565b925061288d6020850161278e565b9150604084013590509250925092565b600080604083850312156128b057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156128fd576128fd6128bf565b604052919050565b6000602080838503121561291857600080fd5b82356001600160401b038082111561292f57600080fd5b818501915085601f83011261294357600080fd5b813581811115612955576129556128bf565b8060051b91506129668483016128d5565b818152918301840191848101908884111561298057600080fd5b938501935b8385101561299e57843582529385019390850190612985565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156111ac57612a0183855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016129c6565b600060208284031215612a2657600080fd5b81356001600160601b03811681146113a957600080fd5b600060208284031215612a4f57600080fd5b6113a98261278e565b60006001600160401b03831115612a7157612a716128bf565b612a84601f8401601f19166020016128d5565b9050828152838383011115612a9857600080fd5b828260208301376000602084830101529392505050565b600060208284031215612ac157600080fd5b81356001600160401b03811115612ad757600080fd5b8201601f81018413612ae857600080fd5b61233184823560208401612a58565b6020808252825182820181905260009190848201906040850190845b818110156111ac57835183529284019291840191600101612b13565b600080600060608486031215612b4457600080fd5b612b4d8461278e565b95602085013595506040909401359392505050565b60006101008201905082518252602083015163ffffffff80821660208501528060408601511660408501528060608601511660608501528060808601511660808501528060a08601511660a0850152505060c0830151151560c083015260e0830151612bd160e08401826127ea565b5092915050565b803580151581146127a557600080fd5b60008060408385031215612bfb57600080fd5b612c048361278e565b915061285860208401612bd8565b600060208284031215612c2457600080fd5b6113a98261281a565b60008060008060808587031215612c4357600080fd5b612c4c8561278e565b9350612c5a6020860161278e565b92506040850135915060608501356001600160401b03811115612c7c57600080fd5b8501601f81018713612c8d57600080fd5b612c9c87823560208401612a58565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610970565b600060208284031215612cef57600080fd5b8135600381106113a957600080fd5b600060208284031215612d1057600080fd5b6113a982612bd8565b60008060408385031215612d2c57600080fd5b612d358361278e565b91506128586020840161278e565b600181811c90821680612d5757607f821691505b60208210811415612d7857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818516808303821115612de857612de8612db3565b01949350505050565b6000816000190483118215151615612e0b57612e0b612db3565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612e3557612e35612e10565b500490565b634e487b7160e01b600052603260045260246000fd5b600082612e5f57612e5f612e10565b500690565b6000600019821415612e7857612e78612db3565b5060010190565b60006001600160401b03808316818516808303821115612de857612de8612db3565b600063ffffffff83811690831681811015612ebe57612ebe612db3565b039392505050565b60008351612ed881846020880161270a565b835190830190612eec81836020880161270a565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3890830184612736565b9695505050505050565b600060208284031215612f5457600080fd5b81516113a9816126d7565b600082821015612f7157612f71612db3565b500390565b60008219821115612f8957612f89612db3565b50019056fea26469706673582212207adda817daaa9a18dbfb727347454d4492ecb9ee1c39042d838fc74ce03b13cc64736f6c63430008090033697066733a2f2f516d55514e4b5135524e3973374644427a656575334e37447861416f4842386a723163614475654b706f66685a39000000000000000000000000c79728346734679fcef39a39fd1a71c216ddeb5700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x6080604052600436106102935760003560e01c80637c0171411161015a578063c61c3f76116100c1578063dd48f07d1161007a578063dd48f07d1461087e578063e0a808531461089b578063e985e9c5146108bb578063f2c4ce1e146108db578063f2fde38b146108fb578063f9f5274c1461091b57600080fd5b8063c61c3f76146107ac578063c87b56dd146107e0578063ccd5f6a214610800578063ce3cd99714610815578063d4a6762314610835578063daefeade1461084a57600080fd5b80639a7cfa4f116101135780639a7cfa4f146106ea578063a22cb46514610717578063a71bbebe14610737578063aa0739071461074a578063b88d4fde1461075f578063c23dc68f1461077f57600080fd5b80637c017141146106255780638462151c1461064a5780638da5cb5b1461067757806391b7f5ed1461069557806395d89b41146106b557806399a2557a146106ca57600080fd5b806323b872dd116101fe578063653a819e116101b7578063653a819e146105715780636ba4c138146105915780636ebeac85146105b157806370a08231146105d0578063715018a6146105f0578063750521f51461060557600080fd5b806323b872dd146104905780632a55205a146104b05780633ccfd60b146104ef57806342842e0e146105045780635bbb2177146105245780636352211e1461055157600080fd5b806316396b631161025057806316396b63146103c657806317a5aced146103ed57806318160ddd1461040d5780631cd3a4ac1461043057806322f4596f14610446578063235b6ea11461047a57600080fd5b806301ffc9a7146102985780630517431e146102cd57806306fdde0314610316578063081812fc14610338578063095ea7b3146103705780630e2351e214610392575b600080fd5b3480156102a457600080fd5b506102b86102b33660046126ed565b610930565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506103017f00000000000000000000000000000000000000000000000000000000000003e881565b60405163ffffffff90911681526020016102c4565b34801561032257600080fd5b5061032b610976565b6040516102c49190612762565b34801561034457600080fd5b50610358610353366004612775565b610a08565b6040516001600160a01b0390911681526020016102c4565b34801561037c57600080fd5b5061039061038b3660046127aa565b610a4c565b005b34801561039e57600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000000a81565b3480156103d257600080fd5b50600f546103e09060ff1681565b6040516102c4919061280c565b3480156103f957600080fd5b5061039061040836600461282e565b610ada565b34801561041957600080fd5b50600354600254035b6040519081526020016102c4565b34801561043c57600080fd5b5061035861dead81565b34801561045257600080fd5b506103017f000000000000000000000000000000000000000000000000000000000000271081565b34801561048657600080fd5b50610422600b5481565b34801561049c57600080fd5b506103906104ab366004612861565b610b8e565b3480156104bc57600080fd5b506104d06104cb36600461289d565b610b99565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104fb57600080fd5b50610390610c45565b34801561051057600080fd5b5061039061051f366004612861565b610c7b565b34801561053057600080fd5b5061054461053f366004612905565b610c96565b6040516102c491906129aa565b34801561055d57600080fd5b5061035861056c366004612775565b610d5c565b34801561057d57600080fd5b5061039061058c366004612a14565b610d6e565b34801561059d57600080fd5b506103906105ac366004612905565b610db6565b3480156105bd57600080fd5b50600f546102b890610100900460ff1681565b3480156105dc57600080fd5b506104226105eb366004612a3d565b610fac565b3480156105fc57600080fd5b50610390610ffa565b34801561061157600080fd5b50610390610620366004612aaf565b61102e565b34801561063157600080fd5b50600c5461030190640100000000900463ffffffff1681565b34801561065657600080fd5b5061066a610665366004612a3d565b61106b565b6040516102c49190612af7565b34801561068357600080fd5b50600a546001600160a01b0316610358565b3480156106a157600080fd5b506103906106b0366004612775565b6111b8565b3480156106c157600080fd5b5061032b6111e7565b3480156106d657600080fd5b5061066a6106e5366004612b2f565b6111f6565b3480156106f657600080fd5b5061070a610705366004612a3d565b6113b0565b6040516102c49190612b62565b34801561072357600080fd5b50610390610732366004612be8565b61150b565b610390610745366004612c12565b6115a1565b34801561075657600080fd5b50610301611698565b34801561076b57600080fd5b5061039061077a366004612c2d565b6116bc565b34801561078b57600080fd5b5061079f61079a366004612775565b61170d565b6040516102c49190612ca8565b3480156107b857600080fd5b506103587f000000000000000000000000c79728346734679fcef39a39fd1a71c216ddeb5781565b3480156107ec57600080fd5b5061032b6107fb366004612775565b6117bb565b34801561080c57600080fd5b50610301611945565b34801561082157600080fd5b50610390610830366004612cdd565b611991565b34801561084157600080fd5b5061032b6119e2565b34801561085657600080fd5b506103017f00000000000000000000000000000000000000000000000000000000000003b581565b34801561088a57600080fd5b50600c546103019063ffffffff1681565b3480156108a757600080fd5b506103906108b6366004612cfe565b611a70565b3480156108c757600080fd5b506102b86108d6366004612d19565b611ab4565b3480156108e757600080fd5b506103906108f6366004612aaf565b611ae2565b34801561090757600080fd5b50610390610916366004612a3d565b611b1f565b34801561092757600080fd5b5061032b611bb7565b60006001600160e01b0319821663152a902d60e11b148061096157506001600160e01b031982166380ac58cd60e01b145b80610970575061097082611bc4565b92915050565b60606004805461098590612d43565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190612d43565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b6000610a1382611c04565b610a30576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a5782610d5c565b9050806001600160a01b0316836001600160a01b03161415610a8c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610aac5750610aaa8133611ab4565b155b15610aca576040516367d9dca160e11b815260040160405180910390fd5b610ad5838383611c30565b505050565b600a546001600160a01b03163314610b0d5760405162461bcd60e51b8152600401610b0490612d7e565b60405180910390fd5b600c8054829190600090610b2890849063ffffffff16612dc9565b82546101009290920a63ffffffff818102199093169183160217909155600c547f00000000000000000000000000000000000000000000000000000000000003e88216911611159050610b7a57600080fd5b610b8a828263ffffffff16611c8c565b5050565b610ad5838383611ca6565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610c0e5750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610c2d906001600160601b031687612df1565b610c379190612e26565b915196919550909350505050565b600a546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401610b0490612d7e565b610c793347611e94565b565b610ad5838383604051806020016040528060008152506116bc565b80516060906000816001600160401b03811115610cb557610cb56128bf565b604051908082528060200260200182016040528015610d0057816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610cd35790505b50905060005b828114610d5457610d2f858281518110610d2257610d22612e3a565b602002602001015161170d565b828281518110610d4157610d41612e3a565b6020908102919091010152600101610d06565b509392505050565b6000610d6782611fad565b5192915050565b600a546001600160a01b03163314610d985760405162461bcd60e51b8152600401610b0490612d7e565b610db3610dad600a546001600160a01b031690565b826120c7565b50565b6001600f5460ff166002811115610dcf57610dcf6127d4565b14610dd957600080fd5b60008151118015610df5575060028151610df39190612e50565b155b610dfe57600080fd5b600060028251610e0e9190612e26565b600c5490915063ffffffff7f00000000000000000000000000000000000000000000000000000000000003b5811691610e51916401000000009091041683612dc9565b63ffffffff161115610e6257600080fd5b60005b8251811015610f3e577f000000000000000000000000c79728346734679fcef39a39fd1a71c216ddeb576001600160a01b03166323b872dd3361dead868581518110610eb357610eb3612e3a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610f0d57600080fd5b505af1158015610f21573d6000803e3d6000fd5b505060019092019150819050610f3681612e64565b915050610e65565b50610f9c338263ffffffff16610f53336121c4565b610f5d9190612e7f565b6001600160a01b03909116600090815260076020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b610b8a338263ffffffff16611c8c565b60006001600160a01b038216610fd5576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b600a546001600160a01b031633146110245760405162461bcd60e51b8152600401610b0490612d7e565b610c7960006121ef565b600a546001600160a01b031633146110585760405162461bcd60e51b8152600401610b0490612d7e565b8051610b8a90600d90602084019061263e565b6060600080600061107b85610fac565b90506000816001600160401b03811115611097576110976128bf565b6040519080825280602002602001820160405280156110c0578160200160208202803683370190505b5090506110e6604080516060810182526000808252602082018190529181019190915290565b60005b8386146111ac57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252925061114f576111a4565b81516001600160a01b03161561116457815194505b876001600160a01b0316856001600160a01b031614156111a4578083878060010198508151811061119757611197612e3a565b6020026020010181815250505b6001016110e9565b50909695505050505050565b600a546001600160a01b031633146111e25760405162461bcd60e51b8152600401610b0490612d7e565b600b55565b60606005805461098590612d43565b606081831061121857604051631960ccad60e11b815260040160405180910390fd5b6002546000908084111561122a578093505b600061123587610fac565b905084861015611254578585038181101561124e578091505b50611258565b5060005b6000816001600160401b03811115611272576112726128bf565b60405190808252806020026020018201604052801561129b578160200160208202803683370190505b509050816112ae5793506113a992505050565b60006112b98861170d565b9050600081604001516112ca575080515b885b8881141580156112dc5750848714155b1561139d57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252935061134057611395565b82516001600160a01b03161561135557825191505b8a6001600160a01b0316826001600160a01b03161415611395578084888060010199508151811061138857611388612e3a565b6020026020010181815250505b6001016112cc565b50505092835250909150505b9392505050565b6113f56040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529060e082015290565b60006113ff611945565b9050600061140b611698565b9050604051806101000160405280600b5481526020017f000000000000000000000000000000000000000000000000000000000000271063ffffffff1681526020018363ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000a63ffffffff1681526020018263ffffffff16815260200161149a336121c4565b6001600160a01b038716600090815260076020526040902054600160401b90046001600160401b03166114cd9190612ea1565b63ffffffff908116825284811690841610156020820152600f5460409091019060ff166002811115611501576115016127d4565b9052949350505050565b6001600160a01b0382163314156115355760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600f5460ff1660028111156115ba576115ba6127d4565b146115c457600080fd5b6115cc611945565b63ffffffff166115da611698565b6115e49083612dc9565b63ffffffff1611156115f557600080fd5b7f000000000000000000000000000000000000000000000000000000000000000a63ffffffff16611625336121c4565b33600090815260076020526040902054600160401b90046001600160401b031661164f9084612dc9565b6116599190612ea1565b63ffffffff16111561166a57600080fd5b600b5461167d9063ffffffff8316612df1565b341461168857600080fd5b610db3338263ffffffff16611c8c565b600c5460009063ffffffff166116ad60025490565b6116b79190612ea1565b905090565b6116c7848484611ca6565b6001600160a01b0383163b151580156116e957506116e784848484612241565b155b15611707576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051606080820183526000808352602080840182905283850182905284519283018552818352820181905292810183905290915060025483106117525792915050565b50600082815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906117b25792915050565b6113a983611fad565b60606117c682611c04565b6117e357604051630a14c4b560e41b815260040160405180910390fd5b600f54610100900460ff1661188457600e80546117ff90612d43565b80601f016020809104026020016040519081016040528092919081815260200182805461182b90612d43565b80156118785780601f1061184d57610100808354040283529160200191611878565b820191906000526020600020905b81548152906001019060200180831161185b57829003601f168201915b50505050509050919050565b6000600d805461189390612d43565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf90612d43565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b505050505090508061191d84612339565b60405160200161192e929190612ec6565b604051602081830303815290604052915050919050565b60006116b77f00000000000000000000000000000000000000000000000000000000000003e87f0000000000000000000000000000000000000000000000000000000000002710612ea1565b600a546001600160a01b031633146119bb5760405162461bcd60e51b8152600401610b0490612d7e565b600f805482919060ff191660018360028111156119da576119da6127d4565b021790555050565b600d80546119ef90612d43565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1b90612d43565b8015611a685780601f10611a3d57610100808354040283529160200191611a68565b820191906000526020600020905b815481529060010190602001808311611a4b57829003601f168201915b505050505081565b600a546001600160a01b03163314611a9a5760405162461bcd60e51b8152600401610b0490612d7e565b600f80549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314611b0c5760405162461bcd60e51b8152600401610b0490612d7e565b8051610b8a90600e90602084019061263e565b600a546001600160a01b03163314611b495760405162461bcd60e51b8152600401610b0490612d7e565b6001600160a01b038116611bae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b04565b610db3816121ef565b600e80546119ef90612d43565b60006001600160e01b031982166380ac58cd60e01b1480611bf557506001600160e01b03198216635b5e139f60e01b145b80610970575061097082612436565b600060025482108015610970575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610b8a82826040518060200160405280600081525061246b565b6000611cb182611fad565b9050836001600160a01b031681600001516001600160a01b031614611ce85760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611d065750611d068533611ab4565b80611d21575033611d1684610a08565b6001600160a01b0316145b905080611d4157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611d6857604051633a954ecd60e21b815260040160405180910390fd5b611d7460008487611c30565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611e48576002548214611e4857805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611ee45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b04565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f31576040519150601f19603f3d011682016040523d82523d6000602084013e611f36565b606091505b5050905080610ad55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b04565b6040805160608101825260008082526020820181905291810191909152816002548110156120ae57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120ac5780516001600160a01b031615612043579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120a7579392505050565b612043565b505b604051636f96cda160e11b815260040160405180910390fd5b6127106001600160601b03821611156121355760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b04565b6001600160a01b03821661218b5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b04565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b6001600160a01b0316600090815260076020526040902054600160c01b90046001600160401b031690565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612276903390899088908890600401612f05565b602060405180830381600087803b15801561229057600080fd5b505af19250505080156122c0575060408051601f3d908101601f191682019092526122bd91810190612f42565b60015b61231b573d8080156122ee576040519150601f19603f3d011682016040523d82523d6000602084013e6122f3565b606091505b508051612313576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161235d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612387578061237181612e64565b91506123809050600a83612e26565b9150612361565b6000816001600160401b038111156123a1576123a16128bf565b6040519080825280601f01601f1916602001820160405280156123cb576020820181803683370190505b5090505b8415612331576123e0600183612f5f565b91506123ed600a86612e50565b6123f8906030612f76565b60f81b81838151811061240d5761240d612e3a565b60200101906001600160f81b031916908160001a90535061242f600a86612e26565b94506123cf565b60006001600160e01b0319821663152a902d60e11b148061097057506301ffc9a760e01b6001600160e01b0319831614610970565b610ad583838360016002546001600160a01b03851661249c57604051622e076360e81b815260040160405180910390fd5b836124ba5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561256657506001600160a01b0387163b15155b156125ef575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125b76000888480600101955088612241565b6125d4576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561256c5782600254146125ea57600080fd5b612635565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156125f0575b50600255611e8d565b82805461264a90612d43565b90600052602060002090601f01602090048101928261266c57600085556126b2565b82601f1061268557805160ff19168380011785556126b2565b828001600101855582156126b2579182015b828111156126b2578251825591602001919060010190612697565b506126be9291506126c2565b5090565b5b808211156126be57600081556001016126c3565b6001600160e01b031981168114610db357600080fd5b6000602082840312156126ff57600080fd5b81356113a9816126d7565b60005b8381101561272557818101518382015260200161270d565b838111156117075750506000910152565b6000815180845261274e81602086016020860161270a565b601f01601f19169290920160200192915050565b6020815260006113a96020830184612736565b60006020828403121561278757600080fd5b5035919050565b80356001600160a01b03811681146127a557600080fd5b919050565b600080604083850312156127bd57600080fd5b6127c68361278e565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6003811061280857634e487b7160e01b600052602160045260246000fd5b9052565b6020810161097082846127ea565b803563ffffffff811681146127a557600080fd5b6000806040838503121561284157600080fd5b61284a8361278e565b91506128586020840161281a565b90509250929050565b60008060006060848603121561287657600080fd5b61287f8461278e565b925061288d6020850161278e565b9150604084013590509250925092565b600080604083850312156128b057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156128fd576128fd6128bf565b604052919050565b6000602080838503121561291857600080fd5b82356001600160401b038082111561292f57600080fd5b818501915085601f83011261294357600080fd5b813581811115612955576129556128bf565b8060051b91506129668483016128d5565b818152918301840191848101908884111561298057600080fd5b938501935b8385101561299e57843582529385019390850190612985565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156111ac57612a0183855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016129c6565b600060208284031215612a2657600080fd5b81356001600160601b03811681146113a957600080fd5b600060208284031215612a4f57600080fd5b6113a98261278e565b60006001600160401b03831115612a7157612a716128bf565b612a84601f8401601f19166020016128d5565b9050828152838383011115612a9857600080fd5b828260208301376000602084830101529392505050565b600060208284031215612ac157600080fd5b81356001600160401b03811115612ad757600080fd5b8201601f81018413612ae857600080fd5b61233184823560208401612a58565b6020808252825182820181905260009190848201906040850190845b818110156111ac57835183529284019291840191600101612b13565b600080600060608486031215612b4457600080fd5b612b4d8461278e565b95602085013595506040909401359392505050565b60006101008201905082518252602083015163ffffffff80821660208501528060408601511660408501528060608601511660608501528060808601511660808501528060a08601511660a0850152505060c0830151151560c083015260e0830151612bd160e08401826127ea565b5092915050565b803580151581146127a557600080fd5b60008060408385031215612bfb57600080fd5b612c048361278e565b915061285860208401612bd8565b600060208284031215612c2457600080fd5b6113a98261281a565b60008060008060808587031215612c4357600080fd5b612c4c8561278e565b9350612c5a6020860161278e565b92506040850135915060608501356001600160401b03811115612c7c57600080fd5b8501601f81018713612c8d57600080fd5b612c9c87823560208401612a58565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610970565b600060208284031215612cef57600080fd5b8135600381106113a957600080fd5b600060208284031215612d1057600080fd5b6113a982612bd8565b60008060408385031215612d2c57600080fd5b612d358361278e565b91506128586020840161278e565b600181811c90821680612d5757607f821691505b60208210811415612d7857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818516808303821115612de857612de8612db3565b01949350505050565b6000816000190483118215151615612e0b57612e0b612db3565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612e3557612e35612e10565b500490565b634e487b7160e01b600052603260045260246000fd5b600082612e5f57612e5f612e10565b500690565b6000600019821415612e7857612e78612db3565b5060010190565b60006001600160401b03808316818516808303821115612de857612de8612db3565b600063ffffffff83811690831681811015612ebe57612ebe612db3565b039392505050565b60008351612ed881846020880161270a565b835190830190612eec81836020880161270a565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3890830184612736565b9695505050505050565b600060208284031215612f5457600080fd5b81516113a9816126d7565b600082821015612f7157612f71612db3565b500390565b60008219821115612f8957612f89612db3565b50019056fea26469706673582212207adda817daaa9a18dbfb727347454d4492ecb9ee1c39042d838fc74ce03b13cc64736f6c63430008090033

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

000000000000000000000000c79728346734679fcef39a39fd1a71c216ddeb5700000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : fly (address): 0xC79728346734679FcEF39a39FD1a71c216dDEB57
Arg [1] : price (uint256): 1000000000000000
Arg [2] : maxSupply (uint32): 10000
Arg [3] : holderSupply (uint32): 949
Arg [4] : teamSupply (uint32): 1000
Arg [5] : walletLimit (uint32): 10

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000c79728346734679fcef39a39fd1a71c216ddeb57
Arg [1] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003b5
Arg [4] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a


Deployed Bytecode Sourcemap

239:4787:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3799:294;;;;;;;;;;-1:-1:-1;3799:294:6;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;3799:294:6;;;;;;;;601:35;;;;;;;;;;;;;;;;;;766:10:14;754:23;;;736:42;;724:2;709:18;601:35:6;592:192:14;7337:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8793:200::-;;;;;;;;;;-1:-1:-1;8793:200:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1889:32:14;;;1871:51;;1859:2;1844:18;8793:200:4;1725:203:14;8370:362:4;;;;;;;;;;-1:-1:-1;8370:362:4;;;;;:::i;:::-;;:::i;:::-;;642:36:6;;;;;;;;;;;;;;;875:38;;;;;;;;;;-1:-1:-1;875:38:6;;;;;;;;;;;;;;;:::i;4099:177::-;;;;;;;;;;-1:-1:-1;4099:177:6;;;;;:::i;:::-;;:::i;3580:297:4:-;;;;;;;;;;-1:-1:-1;3830:12:4;;3814:13;;:28;3580:297;;;3522:25:14;;;3510:2;3495:18;3580:297:4;3376:177:14;370:78:6;;;;;;;;;;;;406:42;370:78;;518:34;;;;;;;;;;;;;;;491:21;;;;;;;;;;;;;;;;9632:164:4;;;;;;;;;;-1:-1:-1;9632:164:4;;;;;:::i;:::-;;:::i;1632:478:3:-;;;;;;;;;;-1:-1:-1;1632:478:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4336:32:14;;;4318:51;;4400:2;4385:18;;4378:34;;;;4291:18;1632:478:3;4144:274:14;4915:108:6;;;;;;;;;;;;;:::i;9862:179:4:-;;;;;;;;;;-1:-1:-1;9862:179:4;;;;;:::i;:::-;;:::i;1437:450:5:-;;;;;;;;;;-1:-1:-1;1437:450:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7152:123:4:-;;;;;;;;;;-1:-1:-1;7152:123:4;;;;;:::i;:::-;;:::i;4282:121:6:-;;;;;;;;;;-1:-1:-1;4282:121:6;;;;;:::i;:::-;;:::i;1716:562::-;;;;;;;;;;-1:-1:-1;1716:562:6;;;;;:::i;:::-;;:::i;919:29::-;;;;;;;;;;-1:-1:-1;919:29:6;;;;;;;;;;;4668:203:4;;;;;;;;;;-1:-1:-1;4668:203:4;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;4585:97:6:-;;;;;;;;;;-1:-1:-1;4585:97:6;;;;;:::i;:::-;;:::i;716:28::-;;;;;;;;;;-1:-1:-1;716:28:6;;;;;;;;;;;5139:861:5;;;;;;;;;;-1:-1:-1;5139:861:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;4496:83:6;;;;;;;;;;-1:-1:-1;4496:83:6;;;;;:::i;:::-;;:::i;7499:102:4:-;;;;;;;;;;;;;:::i;2263:2439:5:-;;;;;;;;;;-1:-1:-1;2263:2439:5;;;;;:::i;:::-;;:::i;2865:551:6:-;;;;;;;;;;-1:-1:-1;2865:551:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9060:282:4:-;;;;;;;;;;-1:-1:-1;9060:282:4;;;;;:::i;:::-;;:::i;2284:347:6:-;;;;;;:::i;:::-;;:::i;2637:114::-;;;;;;;;;;;;;:::i;10107:359:4:-;;;;;;;;;;-1:-1:-1;10107:359:4;;;;;:::i;:::-;;:::i;885:399:5:-;;;;;;;;;;-1:-1:-1;885:399:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;455:29:6:-;;;;;;;;;;;;;;;3422:371;;;;;;;;;;-1:-1:-1;3422:371:6;;;;;:::i;:::-;;:::i;2757:102::-;;;;;;;;;;;;;:::i;4409:81::-;;;;;;;;;;-1:-1:-1;4409:81:6;;;;;:::i;:::-;;:::i;750:26::-;;;;;;;;;;;;;:::i;558:37::-;;;;;;;;;;;;;;;685:25;;;;;;;;;;-1:-1:-1;685:25:6;;;;;;;;4819:90;;;;;;;;;;-1:-1:-1;4819:90:6;;;;;:::i;:::-;;:::i;9408:162:4:-;;;;;;;;;;-1:-1:-1;9408:162:4;;;;;:::i;:::-;;:::i;4688:125:6:-;;;;;;;;;;-1:-1:-1;4688:125:6;;;;;:::i;:::-;;:::i;1911:198:12:-;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;782:87:6:-;;;;;;;;;;;;;:::i;3799:294::-;3902:4;-1:-1:-1;;;;;;3937:41:6;;-1:-1:-1;;;3937:41:6;;:97;;-1:-1:-1;;;;;;;3994:40:6;;-1:-1:-1;;;3994:40:6;3937:97;:149;;;;4050:36;4074:11;4050:23;:36::i;:::-;3918:168;3799:294;-1:-1:-1;;3799:294:6:o;7337:98:4:-;7391:13;7423:5;7416:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7337:98;:::o;8793:200::-;8861:7;8885:16;8893:7;8885;:16::i;:::-;8880:64;;8910:34;;-1:-1:-1;;;8910:34:4;;;;;;;;;;;8880:64;-1:-1:-1;8962:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;8962:24:4;;8793:200::o;8370:362::-;8442:13;8458:24;8474:7;8458:15;:24::i;:::-;8442:40;;8502:5;-1:-1:-1;;;;;8496:11:4;:2;-1:-1:-1;;;;;8496:11:4;;8492:48;;;8516:24;;-1:-1:-1;;;8516:24:4;;;;;;;;;;;8492:48;719:10:1;-1:-1:-1;;;;;8555:21:4;;;;;;:63;;-1:-1:-1;8581:37:4;8598:5;719:10:1;9408:162:4;:::i;8581:37::-;8580:38;8555:63;8551:136;;;8641:35;;-1:-1:-1;;;8641:35:4;;;;;;;;;;;8551:136;8697:28;8706:2;8710:7;8719:5;8697:8;:28::i;:::-;8432:300;8370:362;;:::o;4099:177:6:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;;;;;;;;;4172:11:6::1;:21:::0;;4187:6;;4172:11;::::1;::::0;:21:::1;::::0;4187:6;;4172:21:::1;;;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;4211:11:::1;::::0;4226::::1;4211:26:::0;::::1;:11:::0;::::1;:26;;::::0;-1:-1:-1;4203:35:6::1;;;::::0;::::1;;4248:21;4258:2;4262:6;4248:21;;:9;:21::i;:::-;4099:177:::0;;:::o;9632:164:4:-;9761:28;9771:4;9777:2;9781:7;9761:9;:28::i;1632:478:3:-;1771:7;1832:27;;;:17;:27;;;;;;;;1803:56;;;;;;;;;-1:-1:-1;;;;;1803:56:3;;;;;-1:-1:-1;;;1803:56:3;;;-1:-1:-1;;;;;1803:56:3;;;;;;;;1771:7;;1870:90;;-1:-1:-1;1920:29:3;;;;;;;;;-1:-1:-1;1920:29:3;-1:-1:-1;;;;;1920:29:3;;;;-1:-1:-1;;;1920:29:3;;-1:-1:-1;;;;;1920:29:3;;;;;1870:90;2008:23;;;;1970:21;;2468:5;;1995:36;;-1:-1:-1;;;;;1995:36:3;:10;:36;:::i;:::-;1994:58;;;;:::i;:::-;2071:16;;;;;-1:-1:-1;1632:478:3;;-1:-1:-1;;;;1632:478:3:o;4915:108:6:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4964:52:6::1;4972:10;4994:21;4964:29;:52::i;:::-;4915:108::o:0;9862:179:4:-;9995:39;10012:4;10018:2;10022:7;9995:39;;;;;;;;;;;;:16;:39::i;1437:450:5:-;1601:15;;1517:23;;1576:22;1601:15;-1:-1:-1;;;;;1667:36:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;1667:36:5;;-1:-1:-1;;1667:36:5;;;;;;;;;;;;1630:73;;1722:9;1717:123;1738:14;1733:1;:19;1717:123;;1793:32;1813:8;1822:1;1813:11;;;;;;;;:::i;:::-;;;;;;;1793:19;:32::i;:::-;1777:10;1788:1;1777:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;1754:3;;1717:123;;;-1:-1:-1;1860:10:5;1437:450;-1:-1:-1;;;1437:450:5:o;7152:123:4:-;7216:7;7242:21;7255:7;7242:12;:21::i;:::-;:26;;7152:123;-1:-1:-1;;7152:123:4:o;4282:121:6:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4355:41:6::1;4374:7;1101:6:12::0;;-1:-1:-1;;;;;1101:6:12;;1029:85;4374:7:6::1;4383:12;4355:18;:41::i;:::-;4282:121:::0;:::o;1716:562::-;1795:11;1785:6;;;;:21;;;;;;;;:::i;:::-;;1777:30;;;;;;1843:1;1825:8;:15;:19;:47;;;;;1866:1;1848:8;:15;:19;;;;:::i;:::-;:24;1825:47;1817:56;;;;;;1883:12;1923:1;1905:8;:15;:19;;;;:::i;:::-;1951:14;;1883:42;;-1:-1:-1;1943:39:6;1969:13;1943:39;;;:22;;1951:14;;;;;1883:42;1943:22;:::i;:::-;:39;;;;1935:48;;;;;;1998:9;1993:183;2017:8;:15;2013:1;:19;1993:183;;;2053:4;-1:-1:-1;;;;;2053:17:6;;2071:10;406:42;2094:8;2103:1;2094:11;;;;;;;;:::i;:::-;;;;;;;;;;;2053:53;;-1:-1:-1;;;;;;2053:53:6;;;;;;;-1:-1:-1;;;;;14534:15:14;;;2053:53:6;;;14516:34:14;14586:15;;;;14566:18;;;14559:43;14618:18;;;14611:34;14451:18;;2053:53:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2148:3:6;;;;;-1:-1:-1;2148:3:6;;-1:-1:-1;2034:3:6;2148;2034;:::i;:::-;;;;1993:183;;;;2185:48;2193:10;2227:5;2205:27;;:19;2213:10;2205:7;:19::i;:::-;:27;;;;:::i;:::-;-1:-1:-1;;;;;5779:19:4;;;;;;;:12;:19;;;;;:29;;-1:-1:-1;;;;;5779:29:4;;;-1:-1:-1;;;5779:29:4;-1:-1:-1;;;;;5779:29:4;;;;;;;;;5716:99;2185:48:6;2243:28;2253:10;2265:5;2243:28;;:9;:28::i;4668:203:4:-;4732:7;-1:-1:-1;;;;;4755:19:4;;4751:60;;4783:28;;-1:-1:-1;;;4783:28:4;;;;;;;;;;;4751:60;-1:-1:-1;;;;;;4836:19:4;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;4836:27:4;;4668:203::o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;4585:97:6:-:0;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4657:18:6;;::::1;::::0;:12:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;5139:861:5:-:0;5200:16;5252:19;5285:25;5324:22;5349:16;5359:5;5349:9;:16::i;:::-;5324:41;;5379:25;5421:14;-1:-1:-1;;;;;5407:29:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5407:29:5;;5379:57;;5450:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;5450:31:5;5500:9;5495:460;5544:14;5529:11;:29;5495:460;;5595:14;;;;:11;:14;;;;;;;;;5583:26;;;;;;;;;-1:-1:-1;;;;;5583:26:5;;;;-1:-1:-1;;;5583:26:5;;-1:-1:-1;;;;;5583:26:5;;;;;;;;-1:-1:-1;;;5583:26:5;;;;;;;;;;;;;;;;-1:-1:-1;5627:71:5;;5671:8;;5627:71;5719:14;;-1:-1:-1;;;;;5719:28:5;;5715:109;;5791:14;;;-1:-1:-1;5715:109:5;5866:5;-1:-1:-1;;;;;5845:26:5;:17;-1:-1:-1;;;;;5845:26:5;;5841:100;;;5921:1;5895:8;5904:13;;;;;;5895:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;5841:100;5560:3;;5495:460;;;-1:-1:-1;5975:8:5;;5139:861;-1:-1:-1;;;;;;5139:861:5:o;4496:83:6:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4558:6:6::1;:14:::0;4496:83::o;7499:102:4:-;7555:13;7587:7;7580:14;;;;;:::i;2263:2439:5:-;2385:16;2450:4;2441:5;:13;2437:45;;2463:19;;-1:-1:-1;;;2463:19:5;;;;;;;;;;;2437:45;2549:13;;2496:19;;2797:9;2790:4;:16;2786:71;;;2833:9;2826:16;;2786:71;2870:25;2898:16;2908:5;2898:9;:16::i;:::-;2870:44;;3089:4;3081:5;:12;3077:271;;;3135:12;;;3169:31;;;3165:109;;;3244:11;3224:31;;3165:109;3095:193;3077:271;;;-1:-1:-1;3332:1:5;3077:271;3361:25;3403:17;-1:-1:-1;;;;;3389:32:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3389:32:5;-1:-1:-1;3361:60:5;-1:-1:-1;3439:22:5;3435:76;;3488:8;-1:-1:-1;3481:15:5;;-1:-1:-1;;;3481:15:5;3435:76;3652:31;3686:26;3706:5;3686:19;:26::i;:::-;3652:60;;3726:25;3968:9;:16;;;3963:90;;-1:-1:-1;4024:14:5;;3963:90;4083:5;4066:466;4095:4;4090:1;:9;;:45;;;;;4118:17;4103:11;:32;;4090:45;4066:466;;;4172:14;;;;:11;:14;;;;;;;;;4160:26;;;;;;;;;-1:-1:-1;;;;;4160:26:5;;;;-1:-1:-1;;;4160:26:5;;-1:-1:-1;;;;;4160:26:5;;;;;;;;-1:-1:-1;;;4160:26:5;;;;;;;;;;;;;;;;-1:-1:-1;4204:71:5;;4248:8;;4204:71;4296:14;;-1:-1:-1;;;;;4296:28:5;;4292:109;;4368:14;;;-1:-1:-1;4292:109:5;4443:5;-1:-1:-1;;;;;4422:26:5;:17;-1:-1:-1;;;;;4422:26:5;;4418:100;;;4498:1;4472:8;4481:13;;;;;;4472:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4418:100;4137:3;;4066:466;;;-1:-1:-1;;;4614:29:5;;;-1:-1:-1;4621:8:5;;-1:-1:-1;;2263:2439:5;;;;;;:::o;2865:551:6:-;2921:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2921:13:6;2946:19;2968:15;:13;:15::i;:::-;2946:37;;2993:19;3015:15;:13;:15::i;:::-;2993:37;;3047:362;;;;;;;;3075:6;;3047:362;;;;3106:10;3047:362;;;;;;3144:12;3047:362;;;;;;3183:12;3047:362;;;;;;3223:12;3047:362;;;;;;3351:19;3359:10;3351:7;:19::i;:::-;-1:-1:-1;;;;;5043:19:4;;5009:7;5043:19;;;:12;:19;;;;;:32;-1:-1:-1;;;5043:32:4;;-1:-1:-1;;;;;5043:32:4;3312:59:6;;;;:::i;:::-;3047:362;;;;;;3258:28;;;;;;;;3047:362;;;;3392:6;;3047:362;;;;;3392:6;;3047:362;;;;;;;;:::i;:::-;;;3040:369;2865:551;-1:-1:-1;;;;2865:551:6:o;9060:282:4:-;-1:-1:-1;;;;;9158:24:4;;719:10:1;9158:24:4;9154:54;;;9191:17;;-1:-1:-1;;;9191:17:4;;;;;;;;;;;9154:54;719:10:1;9219:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9219:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;9219:53:4;;;;;;;;;;9287:48;;540:41:14;;;9219:42:4;;719:10:1;9287:48:4;;513:18:14;9287:48:4;;;;;;;9060:282;;:::o;2284:347:6:-;2358:10;2348:6;;;;:20;;;;;;;;:::i;:::-;;2340:29;;;;;;2415:15;:13;:15::i;:::-;2387:43;;2396:15;:13;:15::i;:::-;2387:24;;:6;:24;:::i;:::-;:43;;;;2379:52;;;;;;2525:12;2449:88;;2501:19;2509:10;2501:7;:19::i;:::-;2479:10;5009:7:4;5043:19;;;:12;:19;;;;;:32;-1:-1:-1;;;5043:32:4;;-1:-1:-1;;;;;5043:32:4;2449:42:6;;:6;:42;:::i;:::-;:72;;;;:::i;:::-;:88;;;;2441:97;;;;;;2578:6;;2569:15;;;;;;:::i;:::-;2556:9;:28;2548:37;;;;;;2595:29;2605:10;2617:6;2595:29;;:9;:29::i;2637:114::-;2733:11;;2683:6;;2733:11;;2715:14;4194:13:4;;;3965:277;2715:14:6;2708:36;;;;:::i;:::-;2701:43;;2637:114;:::o;10107:359:4:-;10268:28;10278:4;10284:2;10288:7;10268:9;:28::i;:::-;-1:-1:-1;;;;;10310:13:4;;1465:19:0;:23;;10310:76:4;;;;;10330:56;10361:4;10367:2;10371:7;10380:5;10330:30;:56::i;:::-;10329:57;10310:76;10306:154;;;10409:40;;-1:-1:-1;;;10409:40:4;;;;;;;;;;;10306:154;10107:359;;;;:::o;885:399:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1030:53:5;1070:13;;1059:7;:24;1026:100;;1106:9;885:399;-1:-1:-1;;885:399:5:o;1026:100::-;-1:-1:-1;1147:20:5;;;;:11;:20;;;;;;;;;1135:32;;;;;;;;;-1:-1:-1;;;;;1135:32:5;;;;-1:-1:-1;;;1135:32:5;;-1:-1:-1;;;;;1135:32:5;;;;;;;;-1:-1:-1;;;1135:32:5;;;;;;;;;;;;;;;;1177:63;;1220:9;885:399;-1:-1:-1;;885:399:5:o;1177:63::-;1256:21;1269:7;1256:12;:21::i;3422:371:6:-;3495:13;3525:16;3533:7;3525;:16::i;:::-;3520:59;;3550:29;;-1:-1:-1;;;3550:29:6;;;;;;;;;;;3520:59;3594:9;;;;;;;3589:73;;3636:15;3629:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3422:371;;;:::o;3589:73::-;3671:21;3695:12;3671:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3748:7;3757:18;:7;:16;:18::i;:::-;3731:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3717:69;;;3422:371;;;:::o;2757:102::-;2803:6;2828:24;2841:11;2828:10;:24;:::i;4409:81::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4469:6:6::1;:14:::0;;4478:5;;4469:6;-1:-1:-1;;4469:14:6::1;::::0;4478:5;4469:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;4409:81:::0;:::o;750:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4819:90::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4882:9:6::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;4882:20:6;;::::1;::::0;;;::::1;::::0;;4819:90::o;9408:162:4:-;-1:-1:-1;;;;;9528:25:4;;;9505:4;9528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9408:162::o;4688:125:6:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;4774:32:6;;::::1;::::0;:15:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;1911:198:12:-:0;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;16107:2:14;1991:73:12::1;::::0;::::1;16089:21:14::0;16146:2;16126:18;;;16119:30;16185:34;16165:18;;;16158:62;-1:-1:-1;;;16236:18:14;;;16229:36;16282:19;;1991:73:12::1;15905:402:14::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;782:87:6:-:0;;;;;;;:::i;4309:300:4:-;4411:4;-1:-1:-1;;;;;;4446:40:4;;-1:-1:-1;;;4446:40:4;;:104;;-1:-1:-1;;;;;;;4502:48:4;;-1:-1:-1;;;4502:48:4;4446:104;:156;;;;4566:36;4590:11;4566:23;:36::i;10712:172::-;10769:4;10832:13;;10822:7;:23;10792:85;;;;-1:-1:-1;;10850:20:4;;;;:11;:20;;;;;:27;-1:-1:-1;;;10850:27:4;;;;10849:28;;10712:172::o;18652:189::-;18762:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;18762:29:4;-1:-1:-1;;;;;18762:29:4;;;;;;;;;18806:28;;18762:24;;18806:28;;;;;;;18652:189;;;:::o;10890:102::-;10958:27;10968:2;10972:8;10958:27;;;;;;;;;;;;:9;:27::i;13722:2082::-;13832:35;13870:21;13883:7;13870:12;:21::i;:::-;13832:59;;13928:4;-1:-1:-1;;;;;13906:26:4;:13;:18;;;-1:-1:-1;;;;;13906:26:4;;13902:67;;13941:28;;-1:-1:-1;;;13941:28:4;;;;;;;;;;;13902:67;13980:22;719:10:1;-1:-1:-1;;;;;14006:20:4;;;;:72;;-1:-1:-1;14042:36:4;14059:4;719:10:1;9408:162:4;:::i;14042:36::-;14006:124;;;-1:-1:-1;719:10:1;14094:20:4;14106:7;14094:11;:20::i;:::-;-1:-1:-1;;;;;14094:36:4;;14006:124;13980:151;;14147:17;14142:66;;14173:35;;-1:-1:-1;;;14173:35:4;;;;;;;;;;;14142:66;-1:-1:-1;;;;;14222:16:4;;14218:52;;14247:23;;-1:-1:-1;;;14247:23:4;;;;;;;;;;;14218:52;14386:35;14403:1;14407:7;14416:4;14386:8;:35::i;:::-;-1:-1:-1;;;;;14711:18:4;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;14711:31:4;;;-1:-1:-1;;;;;14711:31:4;;;-1:-1:-1;;14711:31:4;;;;;;;14756:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;14756:29:4;;;;;;;;;;;14834:20;;;:11;:20;;;;;;14868:18;;-1:-1:-1;;;;;;14900:49:4;;;;-1:-1:-1;;;14933:15:4;14900:49;;;;;;;;;;15219:11;;15278:24;;;;;15320:13;;14834:20;;15278:24;;15320:13;15316:377;;15527:13;;15512:11;:28;15508:171;;15564:20;;15632:28;;;;-1:-1:-1;;;;;15606:54:4;-1:-1:-1;;;15606:54:4;-1:-1:-1;;;;;;15606:54:4;;;-1:-1:-1;;;;;15564:20:4;;15606:54;;;;15508:171;14687:1016;;;15737:7;15733:2;-1:-1:-1;;;;;15718:27:4;15727:4;-1:-1:-1;;;;;15718:27:4;;;;;;;;;;;15755:42;13822:1982;;13722:2082;;;:::o;2412:312:0:-;2526:6;2501:21;:31;;2493:73;;;;-1:-1:-1;;;2493:73:0;;16514:2:14;2493:73:0;;;16496:21:14;16553:2;16533:18;;;16526:30;16592:31;16572:18;;;16565:59;16641:18;;2493:73:0;16312:353:14;2493:73:0;2578:12;2596:9;-1:-1:-1;;;;;2596:14:0;2618:6;2596:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:52;;;2647:7;2639:78;;;;-1:-1:-1;;;2639:78:0;;17082:2:14;2639:78:0;;;17064:21:14;17121:2;17101:18;;;17094:30;17160:34;17140:18;;;17133:62;17231:28;17211:18;;;17204:56;17277:19;;2639:78:0;16880:422:14;6011:1084:4;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6121:7:4;6201:13;;6194:4;:20;6163:868;;;6234:31;6268:17;;;:11;:17;;;;;;;;;6234:51;;;;;;;;;-1:-1:-1;;;;;6234:51:4;;;;-1:-1:-1;;;6234:51:4;;-1:-1:-1;;;;;6234:51:4;;;;;;;;-1:-1:-1;;;6234:51:4;;;;;;;;;;;;;;6303:714;;6352:14;;-1:-1:-1;;;;;6352:28:4;;6348:99;;6415:9;6011:1084;-1:-1:-1;;;6011:1084:4:o;6348:99::-;-1:-1:-1;;;6783:6:4;6827:17;;;;:11;:17;;;;;;;;;6815:29;;;;;;;;;-1:-1:-1;;;;;6815:29:4;;;;;-1:-1:-1;;;6815:29:4;;-1:-1:-1;;;;;6815:29:4;;;;;;;;-1:-1:-1;;;6815:29:4;;;;;;;;;;;;;6874:28;6870:107;;6941:9;6011:1084;-1:-1:-1;;;6011:1084:4:o;6870:107::-;6744:255;;;6216:815;6163:868;7057:31;;-1:-1:-1;;;7057:31:4;;;;;;;;;;;2741:327:3;2468:5;-1:-1:-1;;;;;2843:33:3;;;;2835:88;;;;-1:-1:-1;;;2835:88:3;;17509:2:14;2835:88:3;;;17491:21:14;17548:2;17528:18;;;17521:30;17587:34;17567:18;;;17560:62;-1:-1:-1;;;17638:18:14;;;17631:40;17688:19;;2835:88:3;17307:406:14;2835:88:3;-1:-1:-1;;;;;2941:22:3;;2933:60;;;;-1:-1:-1;;;2933:60:3;;17920:2:14;2933:60:3;;;17902:21:14;17959:2;17939:18;;;17932:30;17998:27;17978:18;;;17971:55;18043:18;;2933:60:3;17718:349:14;2933:60:3;3026:35;;;;;;;;;-1:-1:-1;;;;;3026:35:3;;;;;;-1:-1:-1;;;;;3026:35:3;;;;;;;;;;-1:-1:-1;;;3004:57:3;;;;-1:-1:-1;3004:57:3;2741:327::o;5424:110:4:-;-1:-1:-1;;;;;5504:19:4;5479:6;5504:19;;;:12;:19;;;;;:23;-1:-1:-1;;;5504:23:4;;-1:-1:-1;;;;;5504:23:4;;5424:110::o;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;19322:650:4:-;19500:72;;-1:-1:-1;;;19500:72:4;;19480:4;;-1:-1:-1;;;;;19500:36:4;;;;;:72;;719:10:1;;19551:4:4;;19557:7;;19566:5;;19500:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19500:72:4;;;;;;;;-1:-1:-1;;19500:72:4;;;;;;;;;;;;:::i;:::-;;;19496:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19731:13:4;;19727:229;;19776:40;;-1:-1:-1;;;19776:40:4;;;;;;;;;;;19727:229;19916:6;19910:13;19901:6;19897:2;19893:15;19886:38;19496:470;-1:-1:-1;;;;;;19618:55:4;-1:-1:-1;;;19618:55:4;;-1:-1:-1;19496:470:4;19322:650;;;;;;:::o;328:703:13:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:13;;;;;;;;;;;;-1:-1:-1;;;627:10:13;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:13;;-1:-1:-1;773:2:13;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:13;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:13;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:13;;;;;;;;-1:-1:-1;972:11:13;981:2;972:11;;:::i;:::-;;;844:150;;1369:213:3;1471:4;-1:-1:-1;;;;;;1494:41:3;;-1:-1:-1;;;1494:41:3;;:81;;-1:-1:-1;;;;;;;;;;937:40:2;;;1539:36:3;829:155:2;11343:157:4;11461:32;11467:2;11471:8;11481:5;11488:4;11903:13;;-1:-1:-1;;;;;11930:16:4;;11926:48;;11955:19;;-1:-1:-1;;;11955:19:4;;;;;;;;;;;11926:48;11988:13;11984:44;;12010:18;;-1:-1:-1;;;12010:18:4;;;;;;;;;;;11984:44;-1:-1:-1;;;;;12371:16:4;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12429:49:4;;-1:-1:-1;;;;;12371:44:4;;;;;;;12429:49;;;-1:-1:-1;;;;;12371:44:4;;;;;;12429:49;;;;;;;;;;;;;;;;12493:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12542:66:4;;;;-1:-1:-1;;;12592:15:4;12542:66;;;;;;;;;;12493:25;12686:23;;;12728:4;:23;;;;-1:-1:-1;;;;;;12736:13:4;;1465:19:0;:23;;12736:15:4;12724:628;;;12771:309;12801:38;;12826:12;;-1:-1:-1;;;;;12801:38:4;;;12818:1;;12801:38;;12818:1;;12801:38;12866:69;12905:1;12909:2;12913:14;;;;;;12929:5;12866:30;:69::i;:::-;12861:172;;12970:40;;-1:-1:-1;;;12970:40:4;;;;;;;;;;;12861:172;13075:3;13059:12;:19;;12771:309;;13159:12;13142:13;;:29;13138:43;;13173:8;;;13138:43;12724:628;;;13220:118;13250:40;;13275:14;;;;;-1:-1:-1;;;;;13250:40:4;;;13267:1;;13250:40;;13267:1;;13250:40;13333:3;13317:12;:19;;13220:118;;12724:628;-1:-1:-1;13365:13:4;:28;13413:60;10107:359;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;;88:32:14;;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;789:258::-;861:1;871:113;885:6;882:1;879:13;871:113;;;961:11;;;955:18;942:11;;;935:39;907:2;900:10;871:113;;;1002:6;999:1;996:13;993:48;;;-1:-1:-1;;1037:1:14;1019:16;;1012:27;789:258::o;1052:::-;1094:3;1132:5;1126:12;1159:6;1154:3;1147:19;1175:63;1231:6;1224:4;1219:3;1215:14;1208:4;1201:5;1197:16;1175:63;:::i;:::-;1292:2;1271:15;-1:-1:-1;;1267:29:14;1258:39;;;;1299:4;1254:50;;1052:258;-1:-1:-1;;1052:258:14:o;1315:220::-;1464:2;1453:9;1446:21;1427:4;1484:45;1525:2;1514:9;1510:18;1502:6;1484:45;:::i;1540:180::-;1599:6;1652:2;1640:9;1631:7;1627:23;1623:32;1620:52;;;1668:1;1665;1658:12;1620:52;-1:-1:-1;1691:23:14;;1540:180;-1:-1:-1;1540:180:14:o;1933:173::-;2001:20;;-1:-1:-1;;;;;2050:31:14;;2040:42;;2030:70;;2096:1;2093;2086:12;2030:70;1933:173;;;:::o;2111:254::-;2179:6;2187;2240:2;2228:9;2219:7;2215:23;2211:32;2208:52;;;2256:1;2253;2246:12;2208:52;2279:29;2298:9;2279:29;:::i;:::-;2269:39;2355:2;2340:18;;;;2327:32;;-1:-1:-1;;;2111:254:14:o;2370:127::-;2431:10;2426:3;2422:20;2419:1;2412:31;2462:4;2459:1;2452:15;2486:4;2483:1;2476:15;2502:233;2579:1;2572:5;2569:12;2559:143;;2624:10;2619:3;2615:20;2612:1;2605:31;2659:4;2656:1;2649:15;2687:4;2684:1;2677:15;2559:143;2711:18;;2502:233::o;2740:200::-;2882:2;2867:18;;2894:40;2871:9;2916:6;2894:40;:::i;2945:163::-;3012:20;;3072:10;3061:22;;3051:33;;3041:61;;3098:1;3095;3088:12;3113:258;3180:6;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3280:29;3299:9;3280:29;:::i;:::-;3270:39;;3328:37;3361:2;3350:9;3346:18;3328:37;:::i;:::-;3318:47;;3113:258;;;;;:::o;3558:328::-;3635:6;3643;3651;3704:2;3692:9;3683:7;3679:23;3675:32;3672:52;;;3720:1;3717;3710:12;3672:52;3743:29;3762:9;3743:29;:::i;:::-;3733:39;;3791:38;3825:2;3814:9;3810:18;3791:38;:::i;:::-;3781:48;;3876:2;3865:9;3861:18;3848:32;3838:42;;3558:328;;;;;:::o;3891:248::-;3959:6;3967;4020:2;4008:9;3999:7;3995:23;3991:32;3988:52;;;4036:1;4033;4026:12;3988:52;-1:-1:-1;;4059:23:14;;;4129:2;4114:18;;;4101:32;;-1:-1:-1;3891:248:14:o;4423:127::-;4484:10;4479:3;4475:20;4472:1;4465:31;4515:4;4512:1;4505:15;4539:4;4536:1;4529:15;4555:275;4626:2;4620:9;4691:2;4672:13;;-1:-1:-1;;4668:27:14;4656:40;;-1:-1:-1;;;;;4711:34:14;;4747:22;;;4708:62;4705:88;;;4773:18;;:::i;:::-;4809:2;4802:22;4555:275;;-1:-1:-1;4555:275:14:o;4835:946::-;4919:6;4950:2;4993;4981:9;4972:7;4968:23;4964:32;4961:52;;;5009:1;5006;4999:12;4961:52;5049:9;5036:23;-1:-1:-1;;;;;5119:2:14;5111:6;5108:14;5105:34;;;5135:1;5132;5125:12;5105:34;5173:6;5162:9;5158:22;5148:32;;5218:7;5211:4;5207:2;5203:13;5199:27;5189:55;;5240:1;5237;5230:12;5189:55;5276:2;5263:16;5298:2;5294;5291:10;5288:36;;;5304:18;;:::i;:::-;5350:2;5347:1;5343:10;5333:20;;5373:28;5397:2;5393;5389:11;5373:28;:::i;:::-;5435:15;;;5505:11;;;5501:20;;;5466:12;;;;5533:19;;;5530:39;;;5565:1;5562;5555:12;5530:39;5589:11;;;;5609:142;5625:6;5620:3;5617:15;5609:142;;;5691:17;;5679:30;;5642:12;;;;5729;;;;5609:142;;;5770:5;4835:946;-1:-1:-1;;;;;;;;4835:946:14:o;6069:722::-;6302:2;6354:21;;;6424:13;;6327:18;;;6446:22;;;6273:4;;6302:2;6525:15;;;;6499:2;6484:18;;;6273:4;6568:197;6582:6;6579:1;6576:13;6568:197;;;6631:52;6679:3;6670:6;6664:13;5870:12;;-1:-1:-1;;;;;5866:38:14;5854:51;;5958:4;5947:16;;;5941:23;-1:-1:-1;;;;;5937:48:14;5921:14;;;5914:72;6049:4;6038:16;;;6032:23;6025:31;6018:39;6002:14;;5995:63;5786:278;6631:52;6740:15;;;;6712:4;6703:14;;;;;6604:1;6597:9;6568:197;;6796:292;6854:6;6907:2;6895:9;6886:7;6882:23;6878:32;6875:52;;;6923:1;6920;6913:12;6875:52;6962:9;6949:23;-1:-1:-1;;;;;7005:5:14;7001:38;6994:5;6991:49;6981:77;;7054:1;7051;7044:12;7093:186;7152:6;7205:2;7193:9;7184:7;7180:23;7176:32;7173:52;;;7221:1;7218;7211:12;7173:52;7244:29;7263:9;7244:29;:::i;7284:407::-;7349:5;-1:-1:-1;;;;;7375:6:14;7372:30;7369:56;;;7405:18;;:::i;:::-;7443:57;7488:2;7467:15;;-1:-1:-1;;7463:29:14;7494:4;7459:40;7443:57;:::i;:::-;7434:66;;7523:6;7516:5;7509:21;7563:3;7554:6;7549:3;7545:16;7542:25;7539:45;;;7580:1;7577;7570:12;7539:45;7629:6;7624:3;7617:4;7610:5;7606:16;7593:43;7683:1;7676:4;7667:6;7660:5;7656:18;7652:29;7645:40;7284:407;;;;;:::o;7696:451::-;7765:6;7818:2;7806:9;7797:7;7793:23;7789:32;7786:52;;;7834:1;7831;7824:12;7786:52;7874:9;7861:23;-1:-1:-1;;;;;7899:6:14;7896:30;7893:50;;;7939:1;7936;7929:12;7893:50;7962:22;;8015:4;8007:13;;8003:27;-1:-1:-1;7993:55:14;;8044:1;8041;8034:12;7993:55;8067:74;8133:7;8128:2;8115:16;8110:2;8106;8102:11;8067:74;:::i;8152:632::-;8323:2;8375:21;;;8445:13;;8348:18;;;8467:22;;;8294:4;;8323:2;8546:15;;;;8520:2;8505:18;;;8294:4;8589:169;8603:6;8600:1;8597:13;8589:169;;;8664:13;;8652:26;;8733:15;;;;8698:12;;;;8625:1;8618:9;8589:169;;8789:322;8866:6;8874;8882;8935:2;8923:9;8914:7;8910:23;8906:32;8903:52;;;8951:1;8948;8941:12;8903:52;8974:29;8993:9;8974:29;:::i;:::-;8964:39;9050:2;9035:18;;9022:32;;-1:-1:-1;9101:2:14;9086:18;;;9073:32;;8789:322;-1:-1:-1;;;8789:322:14:o;9116:865::-;9256:4;9298:3;9287:9;9283:19;9275:27;;9335:6;9329:13;9318:9;9311:32;9390:4;9382:6;9378:17;9372:24;9415:10;9481:2;9467:12;9463:21;9456:4;9445:9;9441:20;9434:51;9553:2;9545:4;9537:6;9533:17;9527:24;9523:33;9516:4;9505:9;9501:20;9494:63;9625:2;9617:4;9609:6;9605:17;9599:24;9595:33;9588:4;9577:9;9573:20;9566:63;9697:2;9689:4;9681:6;9677:17;9671:24;9667:33;9660:4;9649:9;9645:20;9638:63;9769:2;9761:4;9753:6;9749:17;9743:24;9739:33;9732:4;9721:9;9717:20;9710:63;;;9843:4;9835:6;9831:17;9825:24;9818:32;9811:40;9804:4;9793:9;9789:20;9782:70;9901:4;9893:6;9889:17;9883:24;9916:59;9969:4;9958:9;9954:20;9938:14;9916:59;:::i;:::-;;9116:865;;;;:::o;9986:160::-;10051:20;;10107:13;;10100:21;10090:32;;10080:60;;10136:1;10133;10126:12;10151:254;10216:6;10224;10277:2;10265:9;10256:7;10252:23;10248:32;10245:52;;;10293:1;10290;10283:12;10245:52;10316:29;10335:9;10316:29;:::i;:::-;10306:39;;10364:35;10395:2;10384:9;10380:18;10364:35;:::i;10410:184::-;10468:6;10521:2;10509:9;10500:7;10496:23;10492:32;10489:52;;;10537:1;10534;10527:12;10489:52;10560:28;10578:9;10560:28;:::i;10599:667::-;10694:6;10702;10710;10718;10771:3;10759:9;10750:7;10746:23;10742:33;10739:53;;;10788:1;10785;10778:12;10739:53;10811:29;10830:9;10811:29;:::i;:::-;10801:39;;10859:38;10893:2;10882:9;10878:18;10859:38;:::i;:::-;10849:48;;10944:2;10933:9;10929:18;10916:32;10906:42;;10999:2;10988:9;10984:18;10971:32;-1:-1:-1;;;;;11018:6:14;11015:30;11012:50;;;11058:1;11055;11048:12;11012:50;11081:22;;11134:4;11126:13;;11122:27;-1:-1:-1;11112:55:14;;11163:1;11160;11153:12;11112:55;11186:74;11252:7;11247:2;11234:16;11229:2;11225;11221:11;11186:74;:::i;:::-;11176:84;;;10599:667;;;;;;;:::o;11271:265::-;5870:12;;-1:-1:-1;;;;;5866:38:14;5854:51;;5958:4;5947:16;;;5941:23;-1:-1:-1;;;;;5937:48:14;5921:14;;;5914:72;6049:4;6038:16;;;6032:23;6025:31;6018:39;6002:14;;;5995:63;11467:2;11452:18;;11479:51;5786:278;11765:266;11834:6;11887:2;11875:9;11866:7;11862:23;11858:32;11855:52;;;11903:1;11900;11893:12;11855:52;11942:9;11929:23;11981:1;11974:5;11971:12;11961:40;;11997:1;11994;11987:12;12036:180;12092:6;12145:2;12133:9;12124:7;12120:23;12116:32;12113:52;;;12161:1;12158;12151:12;12113:52;12184:26;12200:9;12184:26;:::i;12221:260::-;12289:6;12297;12350:2;12338:9;12329:7;12325:23;12321:32;12318:52;;;12366:1;12363;12356:12;12318:52;12389:29;12408:9;12389:29;:::i;:::-;12379:39;;12437:38;12471:2;12460:9;12456:18;12437:38;:::i;12486:380::-;12565:1;12561:12;;;;12608;;;12629:61;;12683:4;12675:6;12671:17;12661:27;;12629:61;12736:2;12728:6;12725:14;12705:18;12702:38;12699:161;;;12782:10;12777:3;12773:20;12770:1;12763:31;12817:4;12814:1;12807:15;12845:4;12842:1;12835:15;12699:161;;12486:380;;;:::o;12871:356::-;13073:2;13055:21;;;13092:18;;;13085:30;13151:34;13146:2;13131:18;;13124:62;13218:2;13203:18;;12871:356::o;13232:127::-;13293:10;13288:3;13284:20;13281:1;13274:31;13324:4;13321:1;13314:15;13348:4;13345:1;13338:15;13364:228;13403:3;13431:10;13468:2;13465:1;13461:10;13498:2;13495:1;13491:10;13529:3;13525:2;13521:12;13516:3;13513:21;13510:47;;;13537:18;;:::i;:::-;13573:13;;13364:228;-1:-1:-1;;;;13364:228:14:o;13597:168::-;13637:7;13703:1;13699;13695:6;13691:14;13688:1;13685:21;13680:1;13673:9;13666:17;13662:45;13659:71;;;13710:18;;:::i;:::-;-1:-1:-1;13750:9:14;;13597:168::o;13770:127::-;13831:10;13826:3;13822:20;13819:1;13812:31;13862:4;13859:1;13852:15;13886:4;13883:1;13876:15;13902:120;13942:1;13968;13958:35;;13973:18;;:::i;:::-;-1:-1:-1;14007:9:14;;13902:120::o;14027:127::-;14088:10;14083:3;14079:20;14076:1;14069:31;14119:4;14116:1;14109:15;14143:4;14140:1;14133:15;14159:112;14191:1;14217;14207:35;;14222:18;;:::i;:::-;-1:-1:-1;14256:9:14;;14159:112::o;14656:135::-;14695:3;-1:-1:-1;;14716:17:14;;14713:43;;;14736:18;;:::i;:::-;-1:-1:-1;14783:1:14;14772:13;;14656:135::o;14796:236::-;14835:3;-1:-1:-1;;;;;14908:2:14;14905:1;14901:10;14938:2;14935:1;14931:10;14969:3;14965:2;14961:12;14956:3;14953:21;14950:47;;;14977:18;;:::i;15037:221::-;15076:4;15105:10;15165;;;;15135;;15187:12;;;15184:38;;;15202:18;;:::i;:::-;15239:13;;15037:221;-1:-1:-1;;;15037:221:14:o;15263:637::-;15543:3;15581:6;15575:13;15597:53;15643:6;15638:3;15631:4;15623:6;15619:17;15597:53;:::i;:::-;15713:13;;15672:16;;;;15735:57;15713:13;15672:16;15769:4;15757:17;;15735:57;:::i;:::-;-1:-1:-1;;;15814:20:14;;15843:22;;;15892:1;15881:13;;15263:637;-1:-1:-1;;;;15263:637:14:o;18072:489::-;-1:-1:-1;;;;;18341:15:14;;;18323:34;;18393:15;;18388:2;18373:18;;18366:43;18440:2;18425:18;;18418:34;;;18488:3;18483:2;18468:18;;18461:31;;;18266:4;;18509:46;;18535:19;;18527:6;18509:46;:::i;:::-;18501:54;18072:489;-1:-1:-1;;;;;;18072:489:14:o;18566:249::-;18635:6;18688:2;18676:9;18667:7;18663:23;18659:32;18656:52;;;18704:1;18701;18694:12;18656:52;18736:9;18730:16;18755:30;18779:5;18755:30;:::i;18820:125::-;18860:4;18888:1;18885;18882:8;18879:34;;;18893:18;;:::i;:::-;-1:-1:-1;18930:9:14;;18820:125::o;18950:128::-;18990:3;19021:1;19017:6;19014:1;19011:13;19008:39;;;19027:18;;:::i;:::-;-1:-1:-1;19063:9:14;;18950:128::o

Swarm Source

ipfs://7adda817daaa9a18dbfb727347454d4492ecb9ee1c39042d838fc74ce03b13cc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.