ETH Price: $3,482.27 (+0.97%)

Token

RubbishBeast (RB)
 

Overview

Max Total Supply

1,862 RB

Holders

733

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
impaper.eth
Balance
1 RB
0x314EFdC75B58E1E09c187AC3cEe9E75A42d4590d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

RubbishBeast is an NFT project.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RubbishBeast

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 13 of 14: rubbishbeast.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,
    RubbishClaim,
    Sale
}

interface IRubbishCoin {
    function holderClaim(address holder, uint256 amount) external;
}

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

    address public constant BLACKHOLE = 0x000000000000000000000000000000000000dEaD;

    IERC721 public immutable _rubbish;
    IRubbishCoin public immutable _rubbishCoin;
    uint256 public immutable _rubbishCoinPerPair;
    uint256 public immutable _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 = "https://gateway.pinata.cloud/ipfs/QmeSiyq5HeFfy7vwJVaRo3HaNBZ4BvyZnu1EsUAWTjG64R/";
    Stage public _stage = Stage.NotStarted;

    struct Status {
        // config
        uint256 price;
        uint256 rubbishCoinPerPair;
        uint32 maxSupply;
        uint32 publicSupply;
        uint32 walletLimit;

        // state
        uint32 publicMinted;
        uint32 userMinted;
        bool soldout;
        Stage stage;
    }

    constructor(
        address rubbish,
        address rubbishCoin,
        uint256 rubbishCoinPerPair,
        uint256 price,
        uint32 maxSupply,
        uint32 holderSupply,
        uint32 teamSupply,
        uint32 walletLimit
    ) ERC721A("RubbishBeast", "RB") {
        require(rubbish != address(0));
        require(rubbishCoin != address(0));
        require(maxSupply >= holderSupply + teamSupply);

        _rubbish = IERC721(rubbish);
        _rubbishCoin = IRubbishCoin(rubbishCoin);
        _rubbishCoinPerPair = rubbishCoinPerPair;
        _price = price;
        _maxSupply = maxSupply;
        _holderSupply = holderSupply;
        _teamSupply = teamSupply;
        _walletLimit = walletLimit;

        setFeeNumerator(750);
    }

    function rubbishClaim(uint256[] memory tokenIds) external {
        require(_stage == Stage.RubbishClaim, "RubbishBeast: Claiming is not started yet");
        require(tokenIds.length > 0 && tokenIds.length % 4 == 0, "RubbishBeast: You must provide token pairs");
        uint32 pairs = uint32(tokenIds.length / 4);
        require(pairs + _holderClaimed <= _holderSupply, "RubbishBeast: Exceed holder supply");

        for (uint256 i = 0; i < tokenIds.length; ) {
            _rubbish.transferFrom(msg.sender, BLACKHOLE, tokenIds[i]);
            unchecked {
                i++;
            }
        }

        _setAux(msg.sender, _getAux(msg.sender) + pairs);
        _rubbishCoin.holderClaim(msg.sender, pairs * _rubbishCoinPerPair);
        _safeMint(msg.sender, pairs);
    }

    function mint(uint32 amount) external payable {
        require(_stage == Stage.Sale, "ShitBeast: Sale is not started");
        require(amount + _publicMinted() <= _publicSupply(), "ShitBeast: Exceed max supply");
        require(amount + uint32(_numberMinted(msg.sender)) - uint32(_getAux(msg.sender)) <= _walletLimit, "ShitBeast: Exceed wallet limit");
        require(msg.value == amount * _price, "ShitBeast: Insufficient fund");

        _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({
            // config
            price: _price,
            maxSupply: _maxSupply,
            publicSupply: publicSupply,
            rubbishCoinPerPair: _rubbishCoinPerPair,
            walletLimit: _walletLimit,

            // state
            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();

        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, "ShitBeast: Exceed max supply");
        _safeMint(to, amount);
    }

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

File 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// 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":"rubbish","type":"address"},{"internalType":"address","name":"rubbishCoin","type":"address"},{"internalType":"uint256","name":"rubbishCoinPerPair","type":"uint256"},{"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":"_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":"_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":"_rubbish","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rubbishCoin","outputs":[{"internalType":"contract IRubbishCoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rubbishCoinPerPair","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"rubbishCoinPerPair","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 RubbishBeast.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":"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":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"rubbishClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"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"}]

610200604052605161018081815290620037db6101a03980516200002c91600b9160209091019062000357565b50600c805460ff191690553480156200004457600080fd5b506040516200382c3803806200382c83398101604081905262000067916200042f565b604080518082018252600c81526b149d58989a5cda1099585cdd60a21b602080830191825283518085019094526002845261292160f11b908401528151919291620000b59160049162000357565b508051620000cb90600590602084019062000357565b5050600060025550620000de3362000183565b6001600160a01b038816620000f257600080fd5b6001600160a01b0387166200010657600080fd5b620001128284620004c5565b63ffffffff168463ffffffff1610156200012b57600080fd5b6001600160a01b03808916608052871660a05260c086905260e085905263ffffffff808516610100528381166101205282811661014052811661016052620001756102ee620001d5565b505050505050505062000539565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620002355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b620002536200024c600a546001600160a01b031690565b8262000256565b50565b6127106001600160601b0382161115620002c65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016200022c565b6001600160a01b0382166200031e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200022c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b8280546200036590620004fc565b90600052602060002090601f016020900481019282620003895760008555620003d4565b82601f10620003a457805160ff1916838001178555620003d4565b82800160010185558215620003d4579182015b82811115620003d4578251825591602001919060010190620003b7565b50620003e2929150620003e6565b5090565b5b80821115620003e25760008155600101620003e7565b80516001600160a01b03811681146200041557600080fd5b919050565b805163ffffffff811681146200041557600080fd5b600080600080600080600080610100898b0312156200044d57600080fd5b6200045889620003fd565b97506200046860208a01620003fd565b965060408901519550606089015194506200048660808a016200041a565b93506200049660a08a016200041a565b9250620004a660c08a016200041a565b9150620004b660e08a016200041a565b90509295985092959890939650565b600063ffffffff808316818516808303821115620004f357634e487b7160e01b600052601160045260246000fd5b01949350505050565b600181811c908216806200051157607f821691505b602082108114156200053357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161014051610160516131e1620005fa600039600081816103b701528181611658015261187a0152600081816102be01528181610b250152611bd8015260008181610881015261110901526000818161046b015281816116200152611bf901526000818161049f015281816115d401526119350152600081816104f3015281816112ff01526115fa01526000818161036101526112d401526000818161083801526111ab01526131e16000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063aa073907116100c1578063d02867a61161007a578063d02867a614610826578063d4a676231461085a578063daefeade1461086f578063dd48f07d146108a3578063e985e9c5146108c7578063f2fde38b146108e757600080fd5b8063aa0739071461076f578063b88d4fde14610784578063c23dc68f146107a4578063c87b56dd146107d1578063ccd5f6a2146107f1578063ce3cd9971461080657600080fd5b80638da5cb5b116101135780638da5cb5b146106bc57806395d89b41146106da57806399a2557a146106ef5780639a7cfa4f1461070f578063a22cb4651461073c578063a71bbebe1461075c57600080fd5b8063715018a614610616578063750521f51461062b5780637c0171411461064b5780638462151c1461066f57806389cd36d21461069c57600080fd5b806322f4596f116101e85780633ccfd60b116101ac5780633ccfd60b1461055457806342842e0e146105695780635bbb2177146105895780636352211e146105b6578063653a819e146105d657806370a08231146105f657600080fd5b806322f4596f14610459578063235b6ea11461048d57806323b872dd146104c157806326cacd90146104e15780632a55205a1461051557600080fd5b8063095ea7b31161023a578063095ea7b3146103835780630e2351e2146103a557806316396b63146103d957806317a5aced1461040057806318160ddd146104205780631cd3a4ac1461044357600080fd5b806301ffc9a7146102775780630517431e146102ac57806306fdde03146102f5578063081812fc146103175780630847065c1461034f575b600080fd5b34801561028357600080fd5b506102976102923660046128eb565b610907565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a3565b34801561030157600080fd5b5061030a61094d565b6040516102a39190612960565b34801561032357600080fd5b50610337610332366004612973565b6109df565b6040516001600160a01b0390911681526020016102a3565b34801561035b57600080fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561038f57600080fd5b506103a361039e3660046129a8565b610a23565b005b3480156103b157600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e557600080fd5b50600c546103f39060ff1681565b6040516102a39190612a0a565b34801561040c57600080fd5b506103a361041b366004612a2c565b610ab1565b34801561042c57600080fd5b50600354600254035b6040519081526020016102a3565b34801561044f57600080fd5b5061033761dead81565b34801561046557600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b34801561049957600080fd5b506104357f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cd57600080fd5b506103a36104dc366004612a5f565b610bc5565b3480156104ed57600080fd5b506104357f000000000000000000000000000000000000000000000000000000000000000081565b34801561052157600080fd5b50610535610530366004612a9b565b610bd0565b604080516001600160a01b0390931683526020830191909152016102a3565b34801561056057600080fd5b506103a3610c7c565b34801561057557600080fd5b506103a3610584366004612a5f565b610cb2565b34801561059557600080fd5b506105a96105a4366004612b03565b610ccd565b6040516102a39190612ba8565b3480156105c257600080fd5b506103376105d1366004612973565b610d93565b3480156105e257600080fd5b506103a36105f1366004612c12565b610da5565b34801561060257600080fd5b50610435610611366004612c3b565b610ded565b34801561062257600080fd5b506103a3610e3b565b34801561063757600080fd5b506103a3610646366004612cad565b610e6f565b34801561065757600080fd5b50600a546102e090600160c01b900463ffffffff1681565b34801561067b57600080fd5b5061068f61068a366004612c3b565b610eac565b6040516102a39190612cf5565b3480156106a857600080fd5b506103a36106b7366004612b03565b610ff9565b3480156106c857600080fd5b50600a546001600160a01b0316610337565b3480156106e657600080fd5b5061030a611398565b3480156106fb57600080fd5b5061068f61070a366004612d2d565b6113a7565b34801561071b57600080fd5b5061072f61072a366004612c3b565b611561565b6040516102a39190612d60565b34801561074857600080fd5b506103a3610757366004612e0e565b611708565b6103a361076a366004612e4a565b61179e565b34801561077b57600080fd5b506102e06119be565b34801561079057600080fd5b506103a361079f366004612e65565b6119e9565b3480156107b057600080fd5b506107c46107bf366004612973565b611a3a565b6040516102a39190612ee0565b3480156107dd57600080fd5b5061030a6107ec366004612973565b611ae8565b3480156107fd57600080fd5b506102e0611bd1565b34801561081257600080fd5b506103a3610821366004612f15565b611c1d565b34801561083257600080fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561086657600080fd5b5061030a611c6e565b34801561087b57600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b3480156108af57600080fd5b50600a546102e090600160a01b900463ffffffff1681565b3480156108d357600080fd5b506102976108e2366004612f36565b611cfc565b3480156108f357600080fd5b506103a3610902366004612c3b565b611d2a565b60006001600160e01b0319821663152a902d60e11b148061093857506001600160e01b031982166380ac58cd60e01b145b80610947575061094782611dc2565b92915050565b60606004805461095c90612f60565b80601f016020809104026020016040519081016040528092919081815260200182805461098890612f60565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b5050505050905090565b60006109ea82611e02565b610a07576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a2e82610d93565b9050806001600160a01b0316836001600160a01b03161415610a635760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a835750610a818133611cfc565b155b15610aa1576040516367d9dca160e11b815260040160405180910390fd5b610aac838383611e2e565b505050565b600a546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610adb90612f9b565b60405180910390fd5b80600a60148282829054906101000a900463ffffffff16610b059190612fe6565b92506101000a81548163ffffffff021916908363ffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16600a60149054906101000a900463ffffffff1663ffffffff161115610bb15760405162461bcd60e51b815260206004820152601c60248201527f5368697442656173743a20457863656564206d617820737570706c79000000006044820152606401610adb565b610bc1828263ffffffff16611e8a565b5050565b610aac838383611ea4565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610c455750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610c64906001600160601b03168761300e565b610c6e9190613043565b915196919550909350505050565b600a546001600160a01b03163314610ca65760405162461bcd60e51b8152600401610adb90612f9b565b610cb03347612092565b565b610aac838383604051806020016040528060008152506119e9565b80516060906000816001600160401b03811115610cec57610cec612abd565b604051908082528060200260200182016040528015610d3757816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610d0a5790505b50905060005b828114610d8b57610d66858281518110610d5957610d59613057565b6020026020010151611a3a565b828281518110610d7857610d78613057565b6020908102919091010152600101610d3d565b509392505050565b6000610d9e826121ab565b5192915050565b600a546001600160a01b03163314610dcf5760405162461bcd60e51b8152600401610adb90612f9b565b610dea610de4600a546001600160a01b031690565b826122c5565b50565b60006001600160a01b038216610e16576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b600a546001600160a01b03163314610e655760405162461bcd60e51b8152600401610adb90612f9b565b610cb060006123c2565b600a546001600160a01b03163314610e995760405162461bcd60e51b8152600401610adb90612f9b565b8051610bc190600b90602084019061283c565b60606000806000610ebc85610ded565b90506000816001600160401b03811115610ed857610ed8612abd565b604051908082528060200260200182016040528015610f01578160200160208202803683370190505b509050610f27604080516060810182526000808252602082018190529181019190915290565b60005b838614610fed57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529250610f9057610fe5565b81516001600160a01b031615610fa557815194505b876001600160a01b0316856001600160a01b03161415610fe55780838780600101985081518110610fd857610fd8613057565b6020026020010181815250505b600101610f2a565b50909695505050505050565b6001600c5460ff166002811115611012576110126129d2565b146110715760405162461bcd60e51b815260206004820152602960248201527f5275626269736842656173743a20436c61696d696e67206973206e6f74207374604482015268185c9d1959081e595d60ba1b6064820152608401610adb565b6000815111801561108d57506004815161108b919061306d565b155b6110ec5760405162461bcd60e51b815260206004820152602a60248201527f5275626269736842656173743a20596f75206d7573742070726f7669646520746044820152696f6b656e20706169727360b01b6064820152608401610adb565b6000600482516110fc9190613043565b600a5490915063ffffffff7f000000000000000000000000000000000000000000000000000000000000000081169161113e91600160c01b9091041683612fe6565b63ffffffff16111561119d5760405162461bcd60e51b815260206004820152602260248201527f5275626269736842656173743a2045786365656420686f6c64657220737570706044820152616c7960f01b6064820152608401610adb565b60005b825181101561126c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd3361dead8685815181106111ee576111ee613057565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561124857600080fd5b505af115801561125c573d6000803e3d6000fd5b5050600190920191506111a09050565b506112ca338263ffffffff1661128133612414565b61128b9190613081565b6001600160a01b03909116600090815260076020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663957237923361132a7f000000000000000000000000000000000000000000000000000000000000000063ffffffff861661300e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b50505050610bc1338263ffffffff16611e8a565b60606005805461095c90612f60565b60608183106113c957604051631960ccad60e11b815260040160405180910390fd5b600254600090808411156113db578093505b60006113e687610ded565b90508486101561140557858503818110156113ff578091505b50611409565b5060005b6000816001600160401b0381111561142357611423612abd565b60405190808252806020026020018201604052801561144c578160200160208202803683370190505b5090508161145f57935061155a92505050565b600061146a88611a3a565b90506000816040015161147b575080515b885b88811415801561148d5750848714155b1561154e57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925293506114f157611546565b82516001600160a01b03161561150657825191505b8a6001600160a01b0316826001600160a01b03161415611546578084888060010199508151811061153957611539613057565b6020026020010181815250505b60010161147d565b50505092835250909150505b9392505050565b6115ae6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290529061010082015290565b60006115b8611bd1565b905060006115c46119be565b90506040518061012001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020018363ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020018263ffffffff16815260200161169733612414565b6001600160a01b038716600090815260076020526040902054600160401b90046001600160401b03166116ca91906130a3565b63ffffffff908116825284811690841610156020820152600c5460409091019060ff1660028111156116fe576116fe6129d2565b9052949350505050565b6001600160a01b0382163314156117325760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600c5460ff1660028111156117b7576117b76129d2565b146118045760405162461bcd60e51b815260206004820152601e60248201527f5368697442656173743a2053616c65206973206e6f74207374617274656400006044820152606401610adb565b61180c611bd1565b63ffffffff1661181a6119be565b6118249083612fe6565b63ffffffff1611156118785760405162461bcd60e51b815260206004820152601c60248201527f5368697442656173743a20457863656564206d617820737570706c79000000006044820152606401610adb565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff166118a833612414565b33600090815260076020526040902054600160401b90046001600160401b03166118d29084612fe6565b6118dc91906130a3565b63ffffffff1611156119305760405162461bcd60e51b815260206004820152601e60248201527f5368697442656173743a204578636565642077616c6c6574206c696d697400006044820152606401610adb565b6119607f000000000000000000000000000000000000000000000000000000000000000063ffffffff831661300e565b34146119ae5760405162461bcd60e51b815260206004820152601c60248201527f5368697442656173743a20496e73756666696369656e742066756e64000000006044820152606401610adb565b610dea338263ffffffff16611e8a565b600a54600090600160a01b900463ffffffff166119da60025490565b6119e491906130a3565b905090565b6119f4848484611ea4565b6001600160a01b0383163b15158015611a165750611a148484848461243f565b155b15611a34576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281018390529091506002548310611a7f5792915050565b50600082815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290611adf5792915050565b61155a836121ab565b6060611af382611e02565b611b1057604051630a14c4b560e41b815260040160405180910390fd5b6000600b8054611b1f90612f60565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4b90612f60565b8015611b985780601f10611b6d57610100808354040283529160200191611b98565b820191906000526020600020905b815481529060010190602001808311611b7b57829003601f168201915b5050505050905080611ba984612537565b604051602001611bba9291906130c8565b604051602081830303815290604052915050919050565b60006119e47f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006130a3565b600a546001600160a01b03163314611c475760405162461bcd60e51b8152600401610adb90612f9b565b600c805482919060ff19166001836002811115611c6657611c666129d2565b021790555050565b600b8054611c7b90612f60565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790612f60565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b505050505081565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314611d545760405162461bcd60e51b8152600401610adb90612f9b565b6001600160a01b038116611db95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610adb565b610dea816123c2565b60006001600160e01b031982166380ac58cd60e01b1480611df357506001600160e01b03198216635b5e139f60e01b145b80610947575061094782612634565b600060025482108015610947575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610bc1828260405180602001604052806000815250612669565b6000611eaf826121ab565b9050836001600160a01b031681600001516001600160a01b031614611ee65760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611f045750611f048533611cfc565b80611f1f575033611f14846109df565b6001600160a01b0316145b905080611f3f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611f6657604051633a954ecd60e21b815260040160405180910390fd5b611f7260008487611e2e565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661204657600254821461204657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b804710156120e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610adb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461212f576040519150601f19603f3d011682016040523d82523d6000602084013e612134565b606091505b5050905080610aac5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610adb565b6040805160608101825260008082526020820181905291810191909152816002548110156122ac57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906122aa5780516001600160a01b031615612241579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156122a5579392505050565b612241565b505b604051636f96cda160e11b815260040160405180910390fd5b6127106001600160601b03821611156123335760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610adb565b6001600160a01b0382166123895760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610adb565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0316600090815260076020526040902054600160c01b90046001600160401b031690565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612474903390899088908890600401613107565b602060405180830381600087803b15801561248e57600080fd5b505af19250505080156124be575060408051601f3d908101601f191682019092526124bb91810190613144565b60015b612519573d8080156124ec576040519150601f19603f3d011682016040523d82523d6000602084013e6124f1565b606091505b508051612511576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161255b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612585578061256f81613161565b915061257e9050600a83613043565b915061255f565b6000816001600160401b0381111561259f5761259f612abd565b6040519080825280601f01601f1916602001820160405280156125c9576020820181803683370190505b5090505b841561252f576125de60018361317c565b91506125eb600a8661306d565b6125f6906030613193565b60f81b81838151811061260b5761260b613057565b60200101906001600160f81b031916908160001a90535061262d600a86613043565b94506125cd565b60006001600160e01b0319821663152a902d60e11b148061094757506301ffc9a760e01b6001600160e01b0319831614610947565b610aac83838360016002546001600160a01b03851661269a57604051622e076360e81b815260040160405180910390fd5b836126b85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561276457506001600160a01b0387163b15155b156127ed575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46127b5600088848060010195508861243f565b6127d2576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561276a5782600254146127e857600080fd5b612833565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156127ee575b5060025561208b565b82805461284890612f60565b90600052602060002090601f01602090048101928261286a57600085556128b0565b82601f1061288357805160ff19168380011785556128b0565b828001600101855582156128b0579182015b828111156128b0578251825591602001919060010190612895565b506128bc9291506128c0565b5090565b5b808211156128bc57600081556001016128c1565b6001600160e01b031981168114610dea57600080fd5b6000602082840312156128fd57600080fd5b813561155a816128d5565b60005b8381101561292357818101518382015260200161290b565b83811115611a345750506000910152565b6000815180845261294c816020860160208601612908565b601f01601f19169290920160200192915050565b60208152600061155a6020830184612934565b60006020828403121561298557600080fd5b5035919050565b80356001600160a01b03811681146129a357600080fd5b919050565b600080604083850312156129bb57600080fd5b6129c48361298c565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110612a0657634e487b7160e01b600052602160045260246000fd5b9052565b6020810161094782846129e8565b803563ffffffff811681146129a357600080fd5b60008060408385031215612a3f57600080fd5b612a488361298c565b9150612a5660208401612a18565b90509250929050565b600080600060608486031215612a7457600080fd5b612a7d8461298c565b9250612a8b6020850161298c565b9150604084013590509250925092565b60008060408385031215612aae57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612afb57612afb612abd565b604052919050565b60006020808385031215612b1657600080fd5b82356001600160401b0380821115612b2d57600080fd5b818501915085601f830112612b4157600080fd5b813581811115612b5357612b53612abd565b8060051b9150612b64848301612ad3565b8181529183018401918481019088841115612b7e57600080fd5b938501935b83851015612b9c57843582529385019390850190612b83565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610fed57612bff83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612bc4565b600060208284031215612c2457600080fd5b81356001600160601b038116811461155a57600080fd5b600060208284031215612c4d57600080fd5b61155a8261298c565b60006001600160401b03831115612c6f57612c6f612abd565b612c82601f8401601f1916602001612ad3565b9050828152838383011115612c9657600080fd5b828260208301376000602084830101529392505050565b600060208284031215612cbf57600080fd5b81356001600160401b03811115612cd557600080fd5b8201601f81018413612ce657600080fd5b61252f84823560208401612c56565b6020808252825182820181905260009190848201906040850190845b81811015610fed57835183529284019291840191600101612d11565b600080600060608486031215612d4257600080fd5b612d4b8461298c565b95602085013595506040909401359392505050565b6000610120820190508251825260208301516020830152604083015163ffffffff808216604085015280606086015116606085015250506080830151612dae608084018263ffffffff169052565b5060a0830151612dc660a084018263ffffffff169052565b5060c0830151612dde60c084018263ffffffff169052565b5060e0830151612df260e084018215159052565b5061010080840151612e06828501826129e8565b505092915050565b60008060408385031215612e2157600080fd5b612e2a8361298c565b915060208301358015158114612e3f57600080fd5b809150509250929050565b600060208284031215612e5c57600080fd5b61155a82612a18565b60008060008060808587031215612e7b57600080fd5b612e848561298c565b9350612e926020860161298c565b92506040850135915060608501356001600160401b03811115612eb457600080fd5b8501601f81018713612ec557600080fd5b612ed487823560208401612c56565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610947565b600060208284031215612f2757600080fd5b81356003811061155a57600080fd5b60008060408385031215612f4957600080fd5b612f528361298c565b9150612a566020840161298c565b600181811c90821680612f7457607f821691505b60208210811415612f9557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681851680830382111561300557613005612fd0565b01949350505050565b600081600019048311821515161561302857613028612fd0565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826130525761305261302d565b500490565b634e487b7160e01b600052603260045260246000fd5b60008261307c5761307c61302d565b500690565b60006001600160401b0380831681851680830382111561300557613005612fd0565b600063ffffffff838116908316818110156130c0576130c0612fd0565b039392505050565b600083516130da818460208801612908565b8351908301906130ee818360208801612908565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061313a90830184612934565b9695505050505050565b60006020828403121561315657600080fd5b815161155a816128d5565b600060001982141561317557613175612fd0565b5060010190565b60008282101561318e5761318e612fd0565b500390565b600082198211156131a6576131a6612fd0565b50019056fea264697066735822122097b5595646a17dc4548319f5c43e14be8a60f20af96f4088115a89d520d631f464736f6c6343000809003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d65536979713548654666793776774a5661526f3348614e425a344276795a6e75314573554157546a473634522f0000000000000000000000008b44b715004020773e8da1cd730de2f47c7d88b800000000000000000000000064237de2a291be08b77bbd57dd186daecd4c64c000000000000000000000000000000000000000001027e72f1f1281308800000000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063715018a61161014f578063aa073907116100c1578063d02867a61161007a578063d02867a614610826578063d4a676231461085a578063daefeade1461086f578063dd48f07d146108a3578063e985e9c5146108c7578063f2fde38b146108e757600080fd5b8063aa0739071461076f578063b88d4fde14610784578063c23dc68f146107a4578063c87b56dd146107d1578063ccd5f6a2146107f1578063ce3cd9971461080657600080fd5b80638da5cb5b116101135780638da5cb5b146106bc57806395d89b41146106da57806399a2557a146106ef5780639a7cfa4f1461070f578063a22cb4651461073c578063a71bbebe1461075c57600080fd5b8063715018a614610616578063750521f51461062b5780637c0171411461064b5780638462151c1461066f57806389cd36d21461069c57600080fd5b806322f4596f116101e85780633ccfd60b116101ac5780633ccfd60b1461055457806342842e0e146105695780635bbb2177146105895780636352211e146105b6578063653a819e146105d657806370a08231146105f657600080fd5b806322f4596f14610459578063235b6ea11461048d57806323b872dd146104c157806326cacd90146104e15780632a55205a1461051557600080fd5b8063095ea7b31161023a578063095ea7b3146103835780630e2351e2146103a557806316396b63146103d957806317a5aced1461040057806318160ddd146104205780631cd3a4ac1461044357600080fd5b806301ffc9a7146102775780630517431e146102ac57806306fdde03146102f5578063081812fc146103175780630847065c1461034f575b600080fd5b34801561028357600080fd5b506102976102923660046128eb565b610907565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102a3565b34801561030157600080fd5b5061030a61094d565b6040516102a39190612960565b34801561032357600080fd5b50610337610332366004612973565b6109df565b6040516001600160a01b0390911681526020016102a3565b34801561035b57600080fd5b506103377f00000000000000000000000064237de2a291be08b77bbd57dd186daecd4c64c081565b34801561038f57600080fd5b506103a361039e3660046129a8565b610a23565b005b3480156103b157600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000581565b3480156103e557600080fd5b50600c546103f39060ff1681565b6040516102a39190612a0a565b34801561040c57600080fd5b506103a361041b366004612a2c565b610ab1565b34801561042c57600080fd5b50600354600254035b6040519081526020016102a3565b34801561044f57600080fd5b5061033761dead81565b34801561046557600080fd5b506102e07f00000000000000000000000000000000000000000000000000000000000009c481565b34801561049957600080fd5b506104357f00000000000000000000000000000000000000000000000006f05b59d3b2000081565b3480156104cd57600080fd5b506103a36104dc366004612a5f565b610bc5565b3480156104ed57600080fd5b506104357f00000000000000000000000000000000000000001027e72f1f1281308800000081565b34801561052157600080fd5b50610535610530366004612a9b565b610bd0565b604080516001600160a01b0390931683526020830191909152016102a3565b34801561056057600080fd5b506103a3610c7c565b34801561057557600080fd5b506103a3610584366004612a5f565b610cb2565b34801561059557600080fd5b506105a96105a4366004612b03565b610ccd565b6040516102a39190612ba8565b3480156105c257600080fd5b506103376105d1366004612973565b610d93565b3480156105e257600080fd5b506103a36105f1366004612c12565b610da5565b34801561060257600080fd5b50610435610611366004612c3b565b610ded565b34801561062257600080fd5b506103a3610e3b565b34801561063757600080fd5b506103a3610646366004612cad565b610e6f565b34801561065757600080fd5b50600a546102e090600160c01b900463ffffffff1681565b34801561067b57600080fd5b5061068f61068a366004612c3b565b610eac565b6040516102a39190612cf5565b3480156106a857600080fd5b506103a36106b7366004612b03565b610ff9565b3480156106c857600080fd5b50600a546001600160a01b0316610337565b3480156106e657600080fd5b5061030a611398565b3480156106fb57600080fd5b5061068f61070a366004612d2d565b6113a7565b34801561071b57600080fd5b5061072f61072a366004612c3b565b611561565b6040516102a39190612d60565b34801561074857600080fd5b506103a3610757366004612e0e565b611708565b6103a361076a366004612e4a565b61179e565b34801561077b57600080fd5b506102e06119be565b34801561079057600080fd5b506103a361079f366004612e65565b6119e9565b3480156107b057600080fd5b506107c46107bf366004612973565b611a3a565b6040516102a39190612ee0565b3480156107dd57600080fd5b5061030a6107ec366004612973565b611ae8565b3480156107fd57600080fd5b506102e0611bd1565b34801561081257600080fd5b506103a3610821366004612f15565b611c1d565b34801561083257600080fd5b506103377f0000000000000000000000008b44b715004020773e8da1cd730de2f47c7d88b881565b34801561086657600080fd5b5061030a611c6e565b34801561087b57600080fd5b506102e07f00000000000000000000000000000000000000000000000000000000000009c481565b3480156108af57600080fd5b50600a546102e090600160a01b900463ffffffff1681565b3480156108d357600080fd5b506102976108e2366004612f36565b611cfc565b3480156108f357600080fd5b506103a3610902366004612c3b565b611d2a565b60006001600160e01b0319821663152a902d60e11b148061093857506001600160e01b031982166380ac58cd60e01b145b80610947575061094782611dc2565b92915050565b60606004805461095c90612f60565b80601f016020809104026020016040519081016040528092919081815260200182805461098890612f60565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b5050505050905090565b60006109ea82611e02565b610a07576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a2e82610d93565b9050806001600160a01b0316836001600160a01b03161415610a635760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a835750610a818133611cfc565b155b15610aa1576040516367d9dca160e11b815260040160405180910390fd5b610aac838383611e2e565b505050565b600a546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610adb90612f9b565b60405180910390fd5b80600a60148282829054906101000a900463ffffffff16610b059190612fe6565b92506101000a81548163ffffffff021916908363ffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16600a60149054906101000a900463ffffffff1663ffffffff161115610bb15760405162461bcd60e51b815260206004820152601c60248201527f5368697442656173743a20457863656564206d617820737570706c79000000006044820152606401610adb565b610bc1828263ffffffff16611e8a565b5050565b610aac838383611ea4565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610c455750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610c64906001600160601b03168761300e565b610c6e9190613043565b915196919550909350505050565b600a546001600160a01b03163314610ca65760405162461bcd60e51b8152600401610adb90612f9b565b610cb03347612092565b565b610aac838383604051806020016040528060008152506119e9565b80516060906000816001600160401b03811115610cec57610cec612abd565b604051908082528060200260200182016040528015610d3757816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610d0a5790505b50905060005b828114610d8b57610d66858281518110610d5957610d59613057565b6020026020010151611a3a565b828281518110610d7857610d78613057565b6020908102919091010152600101610d3d565b509392505050565b6000610d9e826121ab565b5192915050565b600a546001600160a01b03163314610dcf5760405162461bcd60e51b8152600401610adb90612f9b565b610dea610de4600a546001600160a01b031690565b826122c5565b50565b60006001600160a01b038216610e16576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b600a546001600160a01b03163314610e655760405162461bcd60e51b8152600401610adb90612f9b565b610cb060006123c2565b600a546001600160a01b03163314610e995760405162461bcd60e51b8152600401610adb90612f9b565b8051610bc190600b90602084019061283c565b60606000806000610ebc85610ded565b90506000816001600160401b03811115610ed857610ed8612abd565b604051908082528060200260200182016040528015610f01578160200160208202803683370190505b509050610f27604080516060810182526000808252602082018190529181019190915290565b60005b838614610fed57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529250610f9057610fe5565b81516001600160a01b031615610fa557815194505b876001600160a01b0316856001600160a01b03161415610fe55780838780600101985081518110610fd857610fd8613057565b6020026020010181815250505b600101610f2a565b50909695505050505050565b6001600c5460ff166002811115611012576110126129d2565b146110715760405162461bcd60e51b815260206004820152602960248201527f5275626269736842656173743a20436c61696d696e67206973206e6f74207374604482015268185c9d1959081e595d60ba1b6064820152608401610adb565b6000815111801561108d57506004815161108b919061306d565b155b6110ec5760405162461bcd60e51b815260206004820152602a60248201527f5275626269736842656173743a20596f75206d7573742070726f7669646520746044820152696f6b656e20706169727360b01b6064820152608401610adb565b6000600482516110fc9190613043565b600a5490915063ffffffff7f00000000000000000000000000000000000000000000000000000000000009c481169161113e91600160c01b9091041683612fe6565b63ffffffff16111561119d5760405162461bcd60e51b815260206004820152602260248201527f5275626269736842656173743a2045786365656420686f6c64657220737570706044820152616c7960f01b6064820152608401610adb565b60005b825181101561126c577f0000000000000000000000008b44b715004020773e8da1cd730de2f47c7d88b86001600160a01b03166323b872dd3361dead8685815181106111ee576111ee613057565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561124857600080fd5b505af115801561125c573d6000803e3d6000fd5b5050600190920191506111a09050565b506112ca338263ffffffff1661128133612414565b61128b9190613081565b6001600160a01b03909116600090815260076020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b6001600160a01b037f00000000000000000000000064237de2a291be08b77bbd57dd186daecd4c64c01663957237923361132a7f00000000000000000000000000000000000000001027e72f1f1281308800000063ffffffff861661300e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b50505050610bc1338263ffffffff16611e8a565b60606005805461095c90612f60565b60608183106113c957604051631960ccad60e11b815260040160405180910390fd5b600254600090808411156113db578093505b60006113e687610ded565b90508486101561140557858503818110156113ff578091505b50611409565b5060005b6000816001600160401b0381111561142357611423612abd565b60405190808252806020026020018201604052801561144c578160200160208202803683370190505b5090508161145f57935061155a92505050565b600061146a88611a3a565b90506000816040015161147b575080515b885b88811415801561148d5750848714155b1561154e57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925293506114f157611546565b82516001600160a01b03161561150657825191505b8a6001600160a01b0316826001600160a01b03161415611546578084888060010199508151811061153957611539613057565b6020026020010181815250505b60010161147d565b50505092835250909150505b9392505050565b6115ae6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290529061010082015290565b60006115b8611bd1565b905060006115c46119be565b90506040518061012001604052807f00000000000000000000000000000000000000000000000006f05b59d3b2000081526020017f00000000000000000000000000000000000000001027e72f1f1281308800000081526020017f00000000000000000000000000000000000000000000000000000000000009c463ffffffff1681526020018363ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000563ffffffff1681526020018263ffffffff16815260200161169733612414565b6001600160a01b038716600090815260076020526040902054600160401b90046001600160401b03166116ca91906130a3565b63ffffffff908116825284811690841610156020820152600c5460409091019060ff1660028111156116fe576116fe6129d2565b9052949350505050565b6001600160a01b0382163314156117325760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600c5460ff1660028111156117b7576117b76129d2565b146118045760405162461bcd60e51b815260206004820152601e60248201527f5368697442656173743a2053616c65206973206e6f74207374617274656400006044820152606401610adb565b61180c611bd1565b63ffffffff1661181a6119be565b6118249083612fe6565b63ffffffff1611156118785760405162461bcd60e51b815260206004820152601c60248201527f5368697442656173743a20457863656564206d617820737570706c79000000006044820152606401610adb565b7f000000000000000000000000000000000000000000000000000000000000000563ffffffff166118a833612414565b33600090815260076020526040902054600160401b90046001600160401b03166118d29084612fe6565b6118dc91906130a3565b63ffffffff1611156119305760405162461bcd60e51b815260206004820152601e60248201527f5368697442656173743a204578636565642077616c6c6574206c696d697400006044820152606401610adb565b6119607f00000000000000000000000000000000000000000000000006f05b59d3b2000063ffffffff831661300e565b34146119ae5760405162461bcd60e51b815260206004820152601c60248201527f5368697442656173743a20496e73756666696369656e742066756e64000000006044820152606401610adb565b610dea338263ffffffff16611e8a565b600a54600090600160a01b900463ffffffff166119da60025490565b6119e491906130a3565b905090565b6119f4848484611ea4565b6001600160a01b0383163b15158015611a165750611a148484848461243f565b155b15611a34576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281018390529091506002548310611a7f5792915050565b50600082815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290611adf5792915050565b61155a836121ab565b6060611af382611e02565b611b1057604051630a14c4b560e41b815260040160405180910390fd5b6000600b8054611b1f90612f60565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4b90612f60565b8015611b985780601f10611b6d57610100808354040283529160200191611b98565b820191906000526020600020905b815481529060010190602001808311611b7b57829003601f168201915b5050505050905080611ba984612537565b604051602001611bba9291906130c8565b604051602081830303815290604052915050919050565b60006119e47f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000009c46130a3565b600a546001600160a01b03163314611c475760405162461bcd60e51b8152600401610adb90612f9b565b600c805482919060ff19166001836002811115611c6657611c666129d2565b021790555050565b600b8054611c7b90612f60565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790612f60565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b505050505081565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314611d545760405162461bcd60e51b8152600401610adb90612f9b565b6001600160a01b038116611db95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610adb565b610dea816123c2565b60006001600160e01b031982166380ac58cd60e01b1480611df357506001600160e01b03198216635b5e139f60e01b145b80610947575061094782612634565b600060025482108015610947575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610bc1828260405180602001604052806000815250612669565b6000611eaf826121ab565b9050836001600160a01b031681600001516001600160a01b031614611ee65760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611f045750611f048533611cfc565b80611f1f575033611f14846109df565b6001600160a01b0316145b905080611f3f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611f6657604051633a954ecd60e21b815260040160405180910390fd5b611f7260008487611e2e565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661204657600254821461204657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b804710156120e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610adb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461212f576040519150601f19603f3d011682016040523d82523d6000602084013e612134565b606091505b5050905080610aac5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610adb565b6040805160608101825260008082526020820181905291810191909152816002548110156122ac57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906122aa5780516001600160a01b031615612241579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156122a5579392505050565b612241565b505b604051636f96cda160e11b815260040160405180910390fd5b6127106001600160601b03821611156123335760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610adb565b6001600160a01b0382166123895760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610adb565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0316600090815260076020526040902054600160c01b90046001600160401b031690565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612474903390899088908890600401613107565b602060405180830381600087803b15801561248e57600080fd5b505af19250505080156124be575060408051601f3d908101601f191682019092526124bb91810190613144565b60015b612519573d8080156124ec576040519150601f19603f3d011682016040523d82523d6000602084013e6124f1565b606091505b508051612511576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161255b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612585578061256f81613161565b915061257e9050600a83613043565b915061255f565b6000816001600160401b0381111561259f5761259f612abd565b6040519080825280601f01601f1916602001820160405280156125c9576020820181803683370190505b5090505b841561252f576125de60018361317c565b91506125eb600a8661306d565b6125f6906030613193565b60f81b81838151811061260b5761260b613057565b60200101906001600160f81b031916908160001a90535061262d600a86613043565b94506125cd565b60006001600160e01b0319821663152a902d60e11b148061094757506301ffc9a760e01b6001600160e01b0319831614610947565b610aac83838360016002546001600160a01b03851661269a57604051622e076360e81b815260040160405180910390fd5b836126b85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561276457506001600160a01b0387163b15155b156127ed575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46127b5600088848060010195508861243f565b6127d2576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561276a5782600254146127e857600080fd5b612833565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156127ee575b5060025561208b565b82805461284890612f60565b90600052602060002090601f01602090048101928261286a57600085556128b0565b82601f1061288357805160ff19168380011785556128b0565b828001600101855582156128b0579182015b828111156128b0578251825591602001919060010190612895565b506128bc9291506128c0565b5090565b5b808211156128bc57600081556001016128c1565b6001600160e01b031981168114610dea57600080fd5b6000602082840312156128fd57600080fd5b813561155a816128d5565b60005b8381101561292357818101518382015260200161290b565b83811115611a345750506000910152565b6000815180845261294c816020860160208601612908565b601f01601f19169290920160200192915050565b60208152600061155a6020830184612934565b60006020828403121561298557600080fd5b5035919050565b80356001600160a01b03811681146129a357600080fd5b919050565b600080604083850312156129bb57600080fd5b6129c48361298c565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60038110612a0657634e487b7160e01b600052602160045260246000fd5b9052565b6020810161094782846129e8565b803563ffffffff811681146129a357600080fd5b60008060408385031215612a3f57600080fd5b612a488361298c565b9150612a5660208401612a18565b90509250929050565b600080600060608486031215612a7457600080fd5b612a7d8461298c565b9250612a8b6020850161298c565b9150604084013590509250925092565b60008060408385031215612aae57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612afb57612afb612abd565b604052919050565b60006020808385031215612b1657600080fd5b82356001600160401b0380821115612b2d57600080fd5b818501915085601f830112612b4157600080fd5b813581811115612b5357612b53612abd565b8060051b9150612b64848301612ad3565b8181529183018401918481019088841115612b7e57600080fd5b938501935b83851015612b9c57843582529385019390850190612b83565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610fed57612bff83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612bc4565b600060208284031215612c2457600080fd5b81356001600160601b038116811461155a57600080fd5b600060208284031215612c4d57600080fd5b61155a8261298c565b60006001600160401b03831115612c6f57612c6f612abd565b612c82601f8401601f1916602001612ad3565b9050828152838383011115612c9657600080fd5b828260208301376000602084830101529392505050565b600060208284031215612cbf57600080fd5b81356001600160401b03811115612cd557600080fd5b8201601f81018413612ce657600080fd5b61252f84823560208401612c56565b6020808252825182820181905260009190848201906040850190845b81811015610fed57835183529284019291840191600101612d11565b600080600060608486031215612d4257600080fd5b612d4b8461298c565b95602085013595506040909401359392505050565b6000610120820190508251825260208301516020830152604083015163ffffffff808216604085015280606086015116606085015250506080830151612dae608084018263ffffffff169052565b5060a0830151612dc660a084018263ffffffff169052565b5060c0830151612dde60c084018263ffffffff169052565b5060e0830151612df260e084018215159052565b5061010080840151612e06828501826129e8565b505092915050565b60008060408385031215612e2157600080fd5b612e2a8361298c565b915060208301358015158114612e3f57600080fd5b809150509250929050565b600060208284031215612e5c57600080fd5b61155a82612a18565b60008060008060808587031215612e7b57600080fd5b612e848561298c565b9350612e926020860161298c565b92506040850135915060608501356001600160401b03811115612eb457600080fd5b8501601f81018713612ec557600080fd5b612ed487823560208401612c56565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610947565b600060208284031215612f2757600080fd5b81356003811061155a57600080fd5b60008060408385031215612f4957600080fd5b612f528361298c565b9150612a566020840161298c565b600181811c90821680612f7457607f821691505b60208210811415612f9557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681851680830382111561300557613005612fd0565b01949350505050565b600081600019048311821515161561302857613028612fd0565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826130525761305261302d565b500490565b634e487b7160e01b600052603260045260246000fd5b60008261307c5761307c61302d565b500690565b60006001600160401b0380831681851680830382111561300557613005612fd0565b600063ffffffff838116908316818110156130c0576130c0612fd0565b039392505050565b600083516130da818460208801612908565b8351908301906130ee818360208801612908565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061313a90830184612934565b9695505050505050565b60006020828403121561315657600080fd5b815161155a816128d5565b600060001982141561317557613175612fd0565b5060010190565b60008282101561318e5761318e612fd0565b500390565b600082198211156131a6576131a6612fd0565b50019056fea264697066735822122097b5595646a17dc4548319f5c43e14be8a60f20af96f4088115a89d520d631f464736f6c63430008090033

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

0000000000000000000000008b44b715004020773e8da1cd730de2f47c7d88b800000000000000000000000064237de2a291be08b77bbd57dd186daecd4c64c000000000000000000000000000000000000000001027e72f1f1281308800000000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005

-----Decoded View---------------
Arg [0] : rubbish (address): 0x8B44b715004020773E8da1cD730de2f47c7D88b8
Arg [1] : rubbishCoin (address): 0x64237DE2A291BE08B77bBd57DD186DAECd4c64c0
Arg [2] : rubbishCoinPerPair (uint256): 5000000000000000000000000000
Arg [3] : price (uint256): 500000000000000000
Arg [4] : maxSupply (uint32): 2500
Arg [5] : holderSupply (uint32): 2500
Arg [6] : teamSupply (uint32): 0
Arg [7] : walletLimit (uint32): 5

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b44b715004020773e8da1cd730de2f47c7d88b8
Arg [1] : 00000000000000000000000064237de2a291be08b77bbd57dd186daecd4c64c0
Arg [2] : 00000000000000000000000000000000000000001027e72f1f12813088000000
Arg [3] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [4] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [5] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005


Deployed Bytecode Sourcemap

360:5400:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4790:299;;;;;;;;;;-1:-1:-1;4790:299:13;;;;;:::i;:::-;;:::i;:::-;;;661:14:14;;654:22;636:41;;624:2;609:18;4790:299:13;;;;;;;;851:35;;;;;;;;;;;;;;;;;;961:10:14;949:23;;;931:42;;919:2;904:18;851:35:13;787:192:14;7550:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9053:204::-;;;;;;;;;;-1:-1:-1;9053:204:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2084:32:14;;;2066:51;;2054:2;2039:18;9053:204:4;1920:203:14;628:42:13;;;;;;;;;;;;;;;8616:371:4;;;;;;;;;;-1:-1:-1;8616:371:4;;;;;:::i;:::-;;:::i;:::-;;893:36:13;;;;;;;;;;;;;;;1124:38;;;;;;;;;;-1:-1:-1;1124:38:13;;;;;;;;;;;;;;;:::i;5097:213::-;;;;;;;;;;-1:-1:-1;5097:213:13;;;;;:::i;:::-;;:::i;3686:303:4:-;;;;;;;;;;-1:-1:-1;3940:12:4;;3924:13;;:28;3686:303;;;3946:25:14;;;3934:2;3919:18;3686:303:4;3800:177:14;501:78:13;;;;;;;;;;;;537:42;501:78;;766:34;;;;;;;;;;;;;;;728:31;;;;;;;;;;;;;;;9918:170:4;;;;;;;;;;-1:-1:-1;9918:170:4;;;;;:::i;:::-;;:::i;677:44:13:-;;;;;;;;;;;;;;;1674:494:3;;;;;;;;;;-1:-1:-1;1674:494:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4760:32:14;;;4742:51;;4824:2;4809:18;;4802:34;;;;4715:18;1674:494:3;4568:274:14;5647:110:13;;;;;;;;;;;;;:::i;10159:185:4:-;;;;;;;;;;-1:-1:-1;10159:185:4;;;;;:::i;:::-;;:::i;1485:459:5:-;;;;;;;;;;-1:-1:-1;1485:459:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7358:125:4:-;;;;;;;;;;-1:-1:-1;7358:125:4;;;;;:::i;:::-;;:::i;5318:123:13:-;;;;;;;;;;-1:-1:-1;5318:123:13;;;;;:::i;:::-;;:::i;4806:206:4:-;;;;;;;;;;-1:-1:-1;4806:206:4;;;;;:::i;:::-;;:::i;1714:103:11:-;;;;;;;;;;;;;:::i;5540:99:13:-;;;;;;;;;;-1:-1:-1;5540:99:13;;;;;:::i;:::-;;:::i;970:28::-;;;;;;;;;;-1:-1:-1;970:28:13;;;;-1:-1:-1;;;970:28:13;;;;;;5281:882:5;;;;;;;;;;-1:-1:-1;5281:882:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2274:799:13:-;;;;;;;;;;-1:-1:-1;2274:799:13;;;;;:::i;:::-;;:::i;1063:87:11:-;;;;;;;;;;-1:-1:-1;1136:6:11;;-1:-1:-1;;;;;1136:6:11;1063:87;;7719:104:4;;;;;;;;;;;;;:::i;2334:2498:5:-;;;;;;;;;;-1:-1:-1;2334:2498:5;;;;;:::i;:::-;;:::i;3812:667:13:-;;;;;;;;;;-1:-1:-1;3812:667:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9329:287:4:-;;;;;;;;;;-1:-1:-1;9329:287:4;;;;;:::i;:::-;;:::i;3081:487:13:-;;;;;;:::i;:::-;;:::i;3576:116::-;;;;;;;;;;;;;:::i;10415:369:4:-;;;;;;;;;;-1:-1:-1;10415:369:4;;;;;:::i;:::-;;:::i;917:409:5:-;;;;;;;;;;-1:-1:-1;917:409:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4487:295:13:-;;;;;;;;;;-1:-1:-1;4487:295:13;;;;;:::i;:::-;;:::i;3700:104::-;;;;;;;;;;;;;:::i;5449:83::-;;;;;;;;;;-1:-1:-1;5449:83:13;;;;;:::i;:::-;;:::i;588:33::-;;;;;;;;;;;;;;;1005:112;;;;;;;;;;;;;:::i;807:37::-;;;;;;;;;;;;;;;938:25;;;;;;;;;;-1:-1:-1;938:25:13;;;;-1:-1:-1;;;938:25:13;;;;;;9687:164:4;;;;;;;;;;-1:-1:-1;9687:164:4;;;;;:::i;:::-;;:::i;1972:201:11:-;;;;;;;;;;-1:-1:-1;1972:201:11;;;;;:::i;:::-;;:::i;4790:299:13:-;4893:4;-1:-1:-1;;;;;;4930:41:13;;-1:-1:-1;;;4930:41:13;;:98;;-1:-1:-1;;;;;;;4988:40:13;;-1:-1:-1;;;4988:40:13;4930:98;:151;;;;5045:36;5069:11;5045:23;:36::i;:::-;4910:171;4790:299;-1:-1:-1;;4790:299:13:o;7550:100:4:-;7604:13;7637:5;7630:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7550:100;:::o;9053:204::-;9121:7;9146:16;9154:7;9146;:16::i;:::-;9141:64;;9171:34;;-1:-1:-1;;;9171:34:4;;;;;;;;;;;9141:64;-1:-1:-1;9225:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;9225:24:4;;9053:204::o;8616:371::-;8689:13;8705:24;8721:7;8705:15;:24::i;:::-;8689:40;;8750:5;-1:-1:-1;;;;;8744:11:4;:2;-1:-1:-1;;;;;8744:11:4;;8740:48;;;8764:24;;-1:-1:-1;;;8764:24:4;;;;;;;;;;;8740:48;736:10:1;-1:-1:-1;;;;;8805:21:4;;;;;;:63;;-1:-1:-1;8831:37:4;8848:5;736:10:1;9687:164:4;:::i;8831:37::-;8830:38;8805:63;8801:138;;;8892:35;;-1:-1:-1;;;8892:35:4;;;;;;;;;;;8801:138;8951:28;8960:2;8964:7;8973:5;8951:8;:28::i;:::-;8678:309;8616:371;;:::o;5097:213:13:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;;;;;;;;;5186:6:13::1;5171:11;;:21;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5226:11;5211:26;;:11;;;;;;;;;;;:26;;;;5203:67;;;::::0;-1:-1:-1;;;5203:67:13;;14229:2:14;5203:67:13::1;::::0;::::1;14211:21:14::0;14268:2;14248:18;;;14241:30;14307;14287:18;;;14280:58;14355:18;;5203:67:13::1;14027:352:14::0;5203:67:13::1;5281:21;5291:2;5295:6;5281:21;;:9;:21::i;:::-;5097:213:::0;;:::o;9918:170:4:-;10052:28;10062:4;10068:2;10072:7;10052:9;:28::i;1674:494:3:-;1818:7;1881:27;;;:17;:27;;;;;;;;1852:56;;;;;;;;;-1:-1:-1;;;;;1852:56:3;;;;;-1:-1:-1;;;1852:56:3;;;-1:-1:-1;;;;;1852:56:3;;;;;;;;1818:7;;1921:92;;-1:-1:-1;1972:29:3;;;;;;;;;-1:-1:-1;1972:29:3;-1:-1:-1;;;;;1972:29:3;;;;-1:-1:-1;;;1972:29:3;;-1:-1:-1;;;;;1972:29:3;;;;;1921:92;2063:23;;;;2025:21;;2534:5;;2050:36;;-1:-1:-1;;;;;2050:36:3;:10;:36;:::i;:::-;2049:58;;;;:::i;:::-;2128:16;;;;;-1:-1:-1;1674:494:3;;-1:-1:-1;;;;1674:494:3:o;5647:110:13:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;5697:52:13::1;5705:10;5727:21;5697:29;:52::i;:::-;5647:110::o:0;10159:185:4:-;10297:39;10314:4;10320:2;10324:7;10297:39;;;;;;;;;;;;:16;:39::i;1485:459:5:-;1651:15;;1565:23;;1626:22;1651:15;-1:-1:-1;;;;;1718:36:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;1718:36:5;;-1:-1:-1;;1718:36:5;;;;;;;;;;;;1681:73;;1774:9;1769:125;1790:14;1785:1;:19;1769:125;;1846:32;1866:8;1875:1;1866:11;;;;;;;;:::i;:::-;;;;;;;1846:19;:32::i;:::-;1830:10;1841:1;1830:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;1806:3;;1769:125;;;-1:-1:-1;1915:10:5;1485:459;-1:-1:-1;;;1485:459:5:o;7358:125:4:-;7422:7;7449:21;7462:7;7449:12;:21::i;:::-;:26;;7358:125;-1:-1:-1;;7358:125:4:o;5318:123:13:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;5392:41:13::1;5411:7;1136:6:11::0;;-1:-1:-1;;;;;1136:6:11;;1063:87;5411:7:13::1;5420:12;5392:18;:41::i;:::-;5318:123:::0;:::o;4806:206:4:-;4870:7;-1:-1:-1;;;;;4894:19:4;;4890:60;;4922:28;;-1:-1:-1;;;4922:28:4;;;;;;;;;;;4890:60;-1:-1:-1;;;;;;4976:19:4;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;4976:27:4;;4806:206::o;1714:103:11:-;1136:6;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;5540:99:13:-:0;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;5613:18:13;;::::1;::::0;:12:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;5281:882:5:-:0;5342:16;5396:19;5430:25;5470:22;5495:16;5505:5;5495:9;:16::i;:::-;5470:41;;5526:25;5568:14;-1:-1:-1;;;;;5554:29:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5554:29:5;;5526:57;;5598:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;5598:31:5;5649:9;5644:471;5693:14;5678:11;:29;5644:471;;5745:14;;;;:11;:14;;;;;;;;;5733:26;;;;;;;;;-1:-1:-1;;;;;5733:26:5;;;;-1:-1:-1;;;5733:26:5;;-1:-1:-1;;;;;5733:26:5;;;;;;;;-1:-1:-1;;;5733:26:5;;;;;;;;;;;;;;;;-1:-1:-1;5778:73:5;;5823:8;;5778:73;5873:14;;-1:-1:-1;;;;;5873:28:5;;5869:111;;5946:14;;;-1:-1:-1;5869:111:5;6023:5;-1:-1:-1;;;;;6002:26:5;:17;-1:-1:-1;;;;;6002:26:5;;5998:102;;;6079:1;6053:8;6062:13;;;;;;6053:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;5998:102;5709:3;;5644:471;;;-1:-1:-1;6136:8:5;;5281:882;-1:-1:-1;;;;;;5281:882:5:o;2274:799:13:-;2361:18;2351:6;;;;:28;;;;;;;;:::i;:::-;;2343:82;;;;-1:-1:-1;;;2343:82:13;;15148:2:14;2343:82:13;;;15130:21:14;15187:2;15167:18;;;15160:30;15226:34;15206:18;;;15199:62;-1:-1:-1;;;15277:18:14;;;15270:39;15326:19;;2343:82:13;14946:405:14;2343:82:13;2462:1;2444:8;:15;:19;:47;;;;;2485:1;2467:8;:15;:19;;;;:::i;:::-;:24;2444:47;2436:102;;;;-1:-1:-1;;;2436:102:13;;15675:2:14;2436:102:13;;;15657:21:14;15714:2;15694:18;;;15687:30;15753:34;15733:18;;;15726:62;-1:-1:-1;;;15804:18:14;;;15797:40;15854:19;;2436:102:13;15473:406:14;2436:102:13;2549:12;2589:1;2571:8;:15;:19;;;;:::i;:::-;2618:14;;2549:42;;-1:-1:-1;2610:39:13;2636:13;2610:39;;;:22;;-1:-1:-1;;;2618:14:13;;;;2549:42;2610:22;:::i;:::-;:39;;;;2602:86;;;;-1:-1:-1;;;2602:86:13;;16086:2:14;2602:86:13;;;16068:21:14;16125:2;16105:18;;;16098:30;16164:34;16144:18;;;16137:62;-1:-1:-1;;;16215:18:14;;;16208:32;16257:19;;2602:86:13;15884:398:14;2602:86:13;2706:9;2701:189;2725:8;:15;2721:1;:19;2701:189;;;2759:8;-1:-1:-1;;;;;2759:21:13;;2781:10;537:42;2804:8;2813:1;2804:11;;;;;;;;:::i;:::-;;;;;;;;;;;2759:57;;-1:-1:-1;;;;;;2759:57:13;;;;;;;-1:-1:-1;;;;;16545:15:14;;;2759:57:13;;;16527:34:14;16597:15;;;;16577:18;;;16570:43;16629:18;;;16622:34;16462:18;;2759:57:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2860:3:13;;;;;-1:-1:-1;2701:189:13;;-1:-1:-1;2701:189:13;;;2902:48;2910:10;2944:5;2922:27;;:19;2930:10;2922:7;:19::i;:::-;:27;;;;:::i;:::-;-1:-1:-1;;;;;5948:19:4;;;;;;;:12;:19;;;;;:29;;-1:-1:-1;;;;;5948:29:4;;;-1:-1:-1;;;5948:29:4;-1:-1:-1;;;;;5948:29:4;;;;;;;;;5884:101;2902:48:13;-1:-1:-1;;;;;2961:12:13;:24;;2986:10;2998:27;3006:19;2998:27;;;;:::i;:::-;2961:65;;-1:-1:-1;;;;;;2961:65:13;;;;;;;-1:-1:-1;;;;;4760:32:14;;;2961:65:13;;;4742:51:14;4809:18;;;4802:34;4715:18;;2961:65:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3037:28;3047:10;3059:5;3037:28;;:9;:28::i;7719:104:4:-;7775:13;7808:7;7801:14;;;;;:::i;2334:2498:5:-;2460:16;2527:4;2518:5;:13;2514:45;;2540:19;;-1:-1:-1;;;2540:19:5;;;;;;;;;;;2514:45;2628:13;;2574:19;;2882:9;2875:4;:16;2871:73;;;2919:9;2912:16;;2871:73;2958:25;2986:16;2996:5;2986:9;:16::i;:::-;2958:44;;3180:4;3172:5;:12;3168:278;;;3227:12;;;3262:31;;;3258:111;;;3338:11;3318:31;;3258:111;3186:198;3168:278;;;-1:-1:-1;3429:1:5;3168:278;3460:25;3502:17;-1:-1:-1;;;;;3488:32:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3488:32:5;-1:-1:-1;3460:60:5;-1:-1:-1;3539:22:5;3535:78;;3589:8;-1:-1:-1;3582:15:5;;-1:-1:-1;;;3582:15:5;3535:78;3757:31;3791:26;3811:5;3791:19;:26::i;:::-;3757:60;;3832:25;4077:9;:16;;;4072:92;;-1:-1:-1;4134:14:5;;4072:92;4195:5;4178:477;4207:4;4202:1;:9;;:45;;;;;4230:17;4215:11;:32;;4202:45;4178:477;;;4285:14;;;;:11;:14;;;;;;;;;4273:26;;;;;;;;;-1:-1:-1;;;;;4273:26:5;;;;-1:-1:-1;;;4273:26:5;;-1:-1:-1;;;;;4273:26:5;;;;;;;;-1:-1:-1;;;4273:26:5;;;;;;;;;;;;;;;;-1:-1:-1;4318:73:5;;4363:8;;4318:73;4413:14;;-1:-1:-1;;;;;4413:28:5;;4409:111;;4486:14;;;-1:-1:-1;4409:111:5;4563:5;-1:-1:-1;;;;;4542:26:5;:17;-1:-1:-1;;;;;4542:26:5;;4538:102;;;4619:1;4593:8;4602:13;;;;;;4593:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4538:102;4249:3;;4178:477;;;-1:-1:-1;;;4740:29:5;;;-1:-1:-1;4747:8:5;;-1:-1:-1;;2334:2498:5;;;;;;:::o;3812:667:13:-;3868:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3868:13:13;3894:19;3916:15;:13;:15::i;:::-;3894:37;;3942:19;3964:15;:13;:15::i;:::-;3942:37;;3999:472;;;;;;;;4051:6;3999:472;;;;4169:19;3999:472;;;;4083:10;3999:472;;;;;;4122:12;3999:472;;;;;;4216:12;3999:472;;;;;;4281:12;3999:472;;;;;;4411:19;4419:10;4411:7;:19::i;:::-;-1:-1:-1;;;;;5190:19:4;;5155:7;5190:19;;;:12;:19;;;;;:32;-1:-1:-1;;;5190:32:4;;-1:-1:-1;;;;;5190:32:4;4372:59:13;;;;:::i;:::-;3999:472;;;;;;4317:28;;;;;;;;3999:472;;;;4453:6;;3999:472;;;;;4453:6;;3999:472;;;;;;;;:::i;:::-;;;3992:479;3812:667;-1:-1:-1;;;;3812:667:13:o;9329:287:4:-;-1:-1:-1;;;;;9428:24:4;;736:10:1;9428:24:4;9424:54;;;9461:17;;-1:-1:-1;;;9461:17:4;;;;;;;;;;;9424:54;736:10:1;9491:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9491:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;9491:53:4;;;;;;;;;;9560:48;;636:41:14;;;9491:42:4;;736:10:1;9560:48:4;;609:18:14;9560:48:4;;;;;;;9329:287;;:::o;3081:487:13:-;3156:10;3146:6;;;;:20;;;;;;;;:::i;:::-;;3138:63;;;;-1:-1:-1;;;3138:63:13;;17336:2:14;3138:63:13;;;17318:21:14;17375:2;17355:18;;;17348:30;17414:32;17394:18;;;17387:60;17464:18;;3138:63:13;17134:354:14;3138:63:13;3248:15;:13;:15::i;:::-;3220:43;;3229:15;:13;:15::i;:::-;3220:24;;:6;:24;:::i;:::-;:43;;;;3212:84;;;;-1:-1:-1;;;3212:84:13;;14229:2:14;3212:84:13;;;14211:21:14;14268:2;14248:18;;;14241:30;14307;14287:18;;;14280:58;14355:18;;3212:84:13;14027:352:14;3212:84:13;3391:12;3315:88;;3367:19;3375:10;3367:7;:19::i;:::-;3345:10;5155:7:4;5190:19;;;:12;:19;;;;;:32;-1:-1:-1;;;5190:32:4;;-1:-1:-1;;;;;5190:32:4;3315:42:13;;:6;:42;:::i;:::-;:72;;;;:::i;:::-;:88;;;;3307:131;;;;-1:-1:-1;;;3307:131:13;;17695:2:14;3307:131:13;;;17677:21:14;17734:2;17714:18;;;17707:30;17773:32;17753:18;;;17746:60;17823:18;;3307:131:13;17493:354:14;3307:131:13;3470:15;3479:6;3470:15;;;;:::i;:::-;3457:9;:28;3449:69;;;;-1:-1:-1;;;3449:69:13;;18054:2:14;3449:69:13;;;18036:21:14;18093:2;18073:18;;;18066:30;18132;18112:18;;;18105:58;18180:18;;3449:69:13;17852:352:14;3449:69:13;3531:29;3541:10;3553:6;3531:29;;:9;:29::i;3576:116::-;3673:11;;3622:6;;-1:-1:-1;;;3673:11:13;;;;3655:14;4315:13:4;;;4082:283;3655:14:13;3648:36;;;;:::i;:::-;3641:43;;3576:116;:::o;10415:369:4:-;10582:28;10592:4;10598:2;10602:7;10582:9;:28::i;:::-;-1:-1:-1;;;;;10625:13:4;;1505:19:0;:23;;10625:76:4;;;;;10645:56;10676:4;10682:2;10686:7;10695:5;10645:30;:56::i;:::-;10644:57;10625:76;10621:156;;;10725:40;;-1:-1:-1;;;10725:40:4;;;;;;;;;;;10621:156;10415:369;;;;:::o;917:409:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1064:53:5;1104:13;;1093:7;:24;1060:102;;1141:9;917:409;-1:-1:-1;;917:409:5:o;1060:102::-;-1:-1:-1;1184:20:5;;;;:11;:20;;;;;;;;;1172:32;;;;;;;;;-1:-1:-1;;;;;1172:32:5;;;;-1:-1:-1;;;1172:32:5;;-1:-1:-1;;;;;1172:32:5;;;;;;;;-1:-1:-1;;;1172:32:5;;;;;;;;;;;;;;;;1215:65;;1259:9;917:409;-1:-1:-1;;917:409:5:o;1215:65::-;1297:21;1310:7;1297:12;:21::i;4487:295:13:-;4560:13;4591:16;4599:7;4591;:16::i;:::-;4586:59;;4616:29;;-1:-1:-1;;;4616:29:13;;;;;;;;;;;4586:59;4658:21;4682:12;4658:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4736:7;4745:18;:7;:16;:18::i;:::-;4719:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4705:69;;;4487:295;;;:::o;3700:104::-;3746:6;3772:24;3785:11;3772:10;:24;:::i;5449:83::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;5510:6:13::1;:14:::0;;5519:5;;5510:6;-1:-1:-1;;5510:14:13::1;::::0;5519:5;5510:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;5449:83:::0;:::o;1005:112::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9687:164:4:-;-1:-1:-1;;;;;9808:25:4;;;9784:4;9808:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9687:164::o;1972:201:11:-;1136:6;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:11;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:11;;19053:2:14;2053:73:11::1;::::0;::::1;19035:21:14::0;19092:2;19072:18;;;19065:30;19131:34;19111:18;;;19104:62;-1:-1:-1;;;19182:18:14;;;19175:36;19228:19;;2053:73:11::1;18851:402:14::0;2053:73:11::1;2137:28;2156:8;2137:18;:28::i;4437:305:4:-:0;4539:4;-1:-1:-1;;;;;;4576:40:4;;-1:-1:-1;;;4576:40:4;;:105;;-1:-1:-1;;;;;;;4633:48:4;;-1:-1:-1;;;4633:48:4;4576:105;:158;;;;4698:36;4722:11;4698:23;:36::i;11039:174::-;11096:4;11160:13;;11150:7;:23;11120:85;;;;-1:-1:-1;;11178:20:4;;;;:11;:20;;;;;:27;-1:-1:-1;;;11178:27:4;;;;11177:28;;11039:174::o;19196:196::-;19311:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19311:29:4;-1:-1:-1;;;;;19311:29:4;;;;;;;;;19356:28;;19311:24;;19356:28;;;;;;;19196:196;;;:::o;11221:104::-;11290:27;11300:2;11304:8;11290:27;;;;;;;;;;;;:9;:27::i;14139:2130::-;14254:35;14292:21;14305:7;14292:12;:21::i;:::-;14254:59;;14352:4;-1:-1:-1;;;;;14330:26:4;:13;:18;;;-1:-1:-1;;;;;14330:26:4;;14326:67;;14365:28;;-1:-1:-1;;;14365:28:4;;;;;;;;;;;14326:67;14406:22;736:10:1;-1:-1:-1;;;;;14432:20:4;;;;:73;;-1:-1:-1;14469:36:4;14486:4;736:10:1;9687:164:4;:::i;14469:36::-;14432:126;;;-1:-1:-1;736:10:1;14522:20:4;14534:7;14522:11;:20::i;:::-;-1:-1:-1;;;;;14522:36:4;;14432:126;14406:153;;14577:17;14572:66;;14603:35;;-1:-1:-1;;;14603:35:4;;;;;;;;;;;14572:66;-1:-1:-1;;;;;14653:16:4;;14649:52;;14678:23;;-1:-1:-1;;;14678:23:4;;;;;;;;;;;14649:52;14822:35;14839:1;14843:7;14852:4;14822:8;:35::i;:::-;-1:-1:-1;;;;;15153:18:4;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15153:31:4;;;-1:-1:-1;;;;;15153:31:4;;;-1:-1:-1;;15153:31:4;;;;;;;15199:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15199:29:4;;;;;;;;;;;15279:20;;;:11;:20;;;;;;15314:18;;-1:-1:-1;;;;;;15347:49:4;;;;-1:-1:-1;;;15380:15:4;15347:49;;;;;;;;;;15670:11;;15730:24;;;;;15773:13;;15279:20;;15730:24;;15773:13;15769:384;;15983:13;;15968:11;:28;15964:174;;16021:20;;16090:28;;;;-1:-1:-1;;;;;16064:54:4;-1:-1:-1;;;16064:54:4;-1:-1:-1;;;;;;16064:54:4;;;-1:-1:-1;;;;;16021:20:4;;16064:54;;;;15964:174;15128:1036;;;16200:7;16196:2;-1:-1:-1;;;;;16181:27:4;16190:4;-1:-1:-1;;;;;16181:27:4;;;;;;;;;;;16219:42;14243:2026;;14139:2130;;;:::o;2471:317:0:-;2586:6;2561:21;:31;;2553:73;;;;-1:-1:-1;;;2553:73:0;;19460:2:14;2553:73:0;;;19442:21:14;19499:2;19479:18;;;19472:30;19538:31;19518:18;;;19511:59;19587:18;;2553:73:0;19258:353:14;2553:73:0;2640:12;2658:9;-1:-1:-1;;;;;2658:14:0;2680:6;2658:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2639:52;;;2710:7;2702:78;;;;-1:-1:-1;;;2702:78:0;;20028:2:14;2702:78:0;;;20010:21:14;20067:2;20047:18;;;20040:30;20106:34;20086:18;;;20079:62;20177:28;20157:18;;;20150:56;20223:19;;2702:78:0;19826:422:14;6187:1109:4;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6298:7:4;6381:13;;6374:4;:20;6343:886;;;6415:31;6449:17;;;:11;:17;;;;;;;;;6415:51;;;;;;;;;-1:-1:-1;;;;;6415:51:4;;;;-1:-1:-1;;;6415:51:4;;-1:-1:-1;;;;;6415:51:4;;;;;;;;-1:-1:-1;;;6415:51:4;;;;;;;;;;;;;;6485:729;;6535:14;;-1:-1:-1;;;;;6535:28:4;;6531:101;;6599:9;6187:1109;-1:-1:-1;;;6187:1109:4:o;6531:101::-;-1:-1:-1;;;6974:6:4;7019:17;;;;:11;:17;;;;;;;;;7007:29;;;;;;;;;-1:-1:-1;;;;;7007:29:4;;;;;-1:-1:-1;;;7007:29:4;;-1:-1:-1;;;;;7007:29:4;;;;;;;;-1:-1:-1;;;7007:29:4;;;;;;;;;;;;;7067:28;7063:109;;7135:9;6187:1109;-1:-1:-1;;;6187:1109:4:o;7063:109::-;6934:261;;;6396:833;6343:886;7257:31;;-1:-1:-1;;;7257:31:4;;;;;;;;;;;2818:332:3;2534:5;-1:-1:-1;;;;;2921:33:3;;;;2913:88;;;;-1:-1:-1;;;2913:88:3;;20455:2:14;2913:88:3;;;20437:21:14;20494:2;20474:18;;;20467:30;20533:34;20513:18;;;20506:62;-1:-1:-1;;;20584:18:14;;;20577:40;20634:19;;2913:88:3;20253:406:14;2913:88:3;-1:-1:-1;;;;;3020:22:3;;3012:60;;;;-1:-1:-1;;;3012:60:3;;20866:2:14;3012:60:3;;;20848:21:14;20905:2;20885:18;;;20878:30;20944:27;20924:18;;;20917:55;20989:18;;3012:60:3;20664:349:14;3012:60:3;3107:35;;;;;;;;;-1:-1:-1;;;;;3107:35:3;;;;;;-1:-1:-1;;;;;3107:35:3;;;;;;;;;;-1:-1:-1;;;3085:57:3;;;;-1:-1:-1;3085:57:3;2818:332::o;2333:191:11:-;2426:6;;;-1:-1:-1;;;;;2443:17:11;;;-1:-1:-1;;;;;;2443:17:11;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;5584:112:4:-;-1:-1:-1;;;;;5665:19:4;5639:6;5665:19;;;:12;:19;;;;;:23;-1:-1:-1;;;5665:23:4;;-1:-1:-1;;;;;5665:23:4;;5584:112::o;19884:667::-;20068:72;;-1:-1:-1;;;20068:72:4;;20047:4;;-1:-1:-1;;;;;20068:36:4;;;;;:72;;736:10:1;;20119:4:4;;20125:7;;20134:5;;20068:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20068:72:4;;;;;;;;-1:-1:-1;;20068:72:4;;;;;;;;;;;;:::i;:::-;;;20064:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20302:13:4;;20298:235;;20348:40;;-1:-1:-1;;;20348:40:4;;;;;;;;;;;20298:235;20491:6;20485:13;20476:6;20472:2;20468:15;20461:38;20064:480;-1:-1:-1;;;;;;20187:55:4;-1:-1:-1;;;20187:55:4;;-1:-1:-1;20064:480:4;19884:667;;;;;;:::o;342:723:12:-;398:13;619:10;615:53;;-1:-1:-1;;646:10:12;;;;;;;;;;;;-1:-1:-1;;;646:10:12;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:12;;-1:-1:-1;798:2:12;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;-1:-1:-1;;;;;844:17:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:12;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:12;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:12;;;;;;;;-1:-1:-1;1003:11:12;1012:2;1003:11;;:::i;:::-;;;872:154;;1404:215:3;1506:4;-1:-1:-1;;;;;;1530:41:3;;-1:-1:-1;;;1530:41:3;;:81;;-1:-1:-1;;;;;;;;;;963:40:2;;;1575:36:3;854:157:2;11688:163:4;11811:32;11817:2;11821:8;11831:5;11838:4;12272:13;;-1:-1:-1;;;;;12300:16:4;;12296:48;;12325:19;;-1:-1:-1;;;12325:19:4;;;;;;;;;;;12296:48;12359:13;12355:44;;12381:18;;-1:-1:-1;;;12381:18:4;;;;;;;;;;;12355:44;-1:-1:-1;;;;;12750:16:4;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12809:49:4;;-1:-1:-1;;;;;12750:44:4;;;;;;;12809:49;;;-1:-1:-1;;;;;12750:44:4;;;;;;12809:49;;;;;;;;;;;;;;;;12875:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12925:66:4;;;;-1:-1:-1;;;12975:15:4;12925:66;;;;;;;;;;12875:25;13072:23;;;13116:4;:23;;;;-1:-1:-1;;;;;;13124:13:4;;1505:19:0;:23;;13124:15:4;13112:641;;;13160:314;13191:38;;13216:12;;-1:-1:-1;;;;;13191:38:4;;;13208:1;;13191:38;;13208:1;;13191:38;13257:69;13296:1;13300:2;13304:14;;;;;;13320:5;13257:30;:69::i;:::-;13252:174;;13362:40;;-1:-1:-1;;;13362:40:4;;;;;;;;;;;13252:174;13469:3;13453:12;:19;;13160:314;;13555:12;13538:13;;:29;13534:43;;13569:8;;;13534:43;13112:641;;;13618:120;13649:40;;13674:14;;;;;-1:-1:-1;;;;;13649:40:4;;;13666:1;;13649:40;;13666:1;;13649:40;13733:3;13717:12;:19;;13618:120;;13112:641;-1:-1:-1;13767:13:4;:28;13817:60;10415:369;-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;984:258::-;1056:1;1066:113;1080:6;1077:1;1074:13;1066:113;;;1156:11;;;1150:18;1137:11;;;1130:39;1102:2;1095:10;1066:113;;;1197:6;1194:1;1191:13;1188:48;;;-1:-1:-1;;1232:1:14;1214:16;;1207:27;984:258::o;1247:::-;1289:3;1327:5;1321:12;1354:6;1349:3;1342:19;1370:63;1426:6;1419:4;1414:3;1410:14;1403:4;1396:5;1392:16;1370:63;:::i;:::-;1487:2;1466:15;-1:-1:-1;;1462:29:14;1453:39;;;;1494:4;1449:50;;1247:258;-1:-1:-1;;1247:258:14:o;1510:220::-;1659:2;1648:9;1641:21;1622:4;1679:45;1720:2;1709:9;1705:18;1697:6;1679:45;:::i;1735:180::-;1794:6;1847:2;1835:9;1826:7;1822:23;1818:32;1815:52;;;1863:1;1860;1853:12;1815:52;-1:-1:-1;1886:23:14;;1735:180;-1:-1:-1;1735:180:14:o;2357:173::-;2425:20;;-1:-1:-1;;;;;2474:31:14;;2464:42;;2454:70;;2520:1;2517;2510:12;2454:70;2357:173;;;:::o;2535:254::-;2603:6;2611;2664:2;2652:9;2643:7;2639:23;2635:32;2632:52;;;2680:1;2677;2670:12;2632:52;2703:29;2722:9;2703:29;:::i;:::-;2693:39;2779:2;2764:18;;;;2751:32;;-1:-1:-1;;;2535:254:14:o;2794:127::-;2855:10;2850:3;2846:20;2843:1;2836:31;2886:4;2883:1;2876:15;2910:4;2907:1;2900:15;2926:233;3003:1;2996:5;2993:12;2983:143;;3048:10;3043:3;3039:20;3036:1;3029:31;3083:4;3080:1;3073:15;3111:4;3108:1;3101:15;2983:143;3135:18;;2926:233::o;3164:200::-;3306:2;3291:18;;3318:40;3295:9;3340:6;3318:40;:::i;3369:163::-;3436:20;;3496:10;3485:22;;3475:33;;3465:61;;3522:1;3519;3512:12;3537:258;3604:6;3612;3665:2;3653:9;3644:7;3640:23;3636:32;3633:52;;;3681:1;3678;3671:12;3633:52;3704:29;3723:9;3704:29;:::i;:::-;3694:39;;3752:37;3785:2;3774:9;3770:18;3752:37;:::i;:::-;3742:47;;3537:258;;;;;:::o;3982:328::-;4059:6;4067;4075;4128:2;4116:9;4107:7;4103:23;4099:32;4096:52;;;4144:1;4141;4134:12;4096:52;4167:29;4186:9;4167:29;:::i;:::-;4157:39;;4215:38;4249:2;4238:9;4234:18;4215:38;:::i;:::-;4205:48;;4300:2;4289:9;4285:18;4272:32;4262:42;;3982:328;;;;;:::o;4315:248::-;4383:6;4391;4444:2;4432:9;4423:7;4419:23;4415:32;4412:52;;;4460:1;4457;4450:12;4412:52;-1:-1:-1;;4483:23:14;;;4553:2;4538:18;;;4525:32;;-1:-1:-1;4315:248:14:o;4847:127::-;4908:10;4903:3;4899:20;4896:1;4889:31;4939:4;4936:1;4929:15;4963:4;4960:1;4953:15;4979:275;5050:2;5044:9;5115:2;5096:13;;-1:-1:-1;;5092:27:14;5080:40;;-1:-1:-1;;;;;5135:34:14;;5171:22;;;5132:62;5129:88;;;5197:18;;:::i;:::-;5233:2;5226:22;4979:275;;-1:-1:-1;4979:275:14:o;5259:946::-;5343:6;5374:2;5417;5405:9;5396:7;5392:23;5388:32;5385:52;;;5433:1;5430;5423:12;5385:52;5473:9;5460:23;-1:-1:-1;;;;;5543:2:14;5535:6;5532:14;5529:34;;;5559:1;5556;5549:12;5529:34;5597:6;5586:9;5582:22;5572:32;;5642:7;5635:4;5631:2;5627:13;5623:27;5613:55;;5664:1;5661;5654:12;5613:55;5700:2;5687:16;5722:2;5718;5715:10;5712:36;;;5728:18;;:::i;:::-;5774:2;5771:1;5767:10;5757:20;;5797:28;5821:2;5817;5813:11;5797:28;:::i;:::-;5859:15;;;5929:11;;;5925:20;;;5890:12;;;;5957:19;;;5954:39;;;5989:1;5986;5979:12;5954:39;6013:11;;;;6033:142;6049:6;6044:3;6041:15;6033:142;;;6115:17;;6103:30;;6066:12;;;;6153;;;;6033:142;;;6194:5;5259:946;-1:-1:-1;;;;;;;;5259:946:14:o;6493:722::-;6726:2;6778:21;;;6848:13;;6751:18;;;6870:22;;;6697:4;;6726:2;6949:15;;;;6923:2;6908:18;;;6697:4;6992:197;7006:6;7003:1;7000:13;6992:197;;;7055:52;7103:3;7094:6;7088:13;6294:12;;-1:-1:-1;;;;;6290:38:14;6278:51;;6382:4;6371:16;;;6365:23;-1:-1:-1;;;;;6361:48:14;6345:14;;;6338:72;6473:4;6462:16;;;6456:23;6449:31;6442:39;6426:14;;6419:63;6210:278;7055:52;7164:15;;;;7136:4;7127:14;;;;;7028:1;7021:9;6992:197;;7220:292;7278:6;7331:2;7319:9;7310:7;7306:23;7302:32;7299:52;;;7347:1;7344;7337:12;7299:52;7386:9;7373:23;-1:-1:-1;;;;;7429:5:14;7425:38;7418:5;7415:49;7405:77;;7478:1;7475;7468:12;7517:186;7576:6;7629:2;7617:9;7608:7;7604:23;7600:32;7597:52;;;7645:1;7642;7635:12;7597:52;7668:29;7687:9;7668:29;:::i;7708:407::-;7773:5;-1:-1:-1;;;;;7799:6:14;7796:30;7793:56;;;7829:18;;:::i;:::-;7867:57;7912:2;7891:15;;-1:-1:-1;;7887:29:14;7918:4;7883:40;7867:57;:::i;:::-;7858:66;;7947:6;7940:5;7933:21;7987:3;7978:6;7973:3;7969:16;7966:25;7963:45;;;8004:1;8001;7994:12;7963:45;8053:6;8048:3;8041:4;8034:5;8030:16;8017:43;8107:1;8100:4;8091:6;8084:5;8080:18;8076:29;8069:40;7708:407;;;;;:::o;8120:451::-;8189:6;8242:2;8230:9;8221:7;8217:23;8213:32;8210:52;;;8258:1;8255;8248:12;8210:52;8298:9;8285:23;-1:-1:-1;;;;;8323:6:14;8320:30;8317:50;;;8363:1;8360;8353:12;8317:50;8386:22;;8439:4;8431:13;;8427:27;-1:-1:-1;8417:55:14;;8468:1;8465;8458:12;8417:55;8491:74;8557:7;8552:2;8539:16;8534:2;8530;8526:11;8491:74;:::i;8576:632::-;8747:2;8799:21;;;8869:13;;8772:18;;;8891:22;;;8718:4;;8747:2;8970:15;;;;8944:2;8929:18;;;8718:4;9013:169;9027:6;9024:1;9021:13;9013:169;;;9088:13;;9076:26;;9157:15;;;;9122:12;;;;9049:1;9042:9;9013:169;;9213:322;9290:6;9298;9306;9359:2;9347:9;9338:7;9334:23;9330:32;9327:52;;;9375:1;9372;9365:12;9327:52;9398:29;9417:9;9398:29;:::i;:::-;9388:39;9474:2;9459:18;;9446:32;;-1:-1:-1;9525:2:14;9510:18;;;9497:32;;9213:322;-1:-1:-1;;;9213:322:14:o;9540:1128::-;9680:4;9722:3;9711:9;9707:19;9699:27;;9759:6;9753:13;9742:9;9735:32;9823:4;9815:6;9811:17;9805:24;9798:4;9787:9;9783:20;9776:54;9877:4;9869:6;9865:17;9859:24;9902:10;9968:2;9954:12;9950:21;9943:4;9932:9;9928:20;9921:51;10040:2;10032:4;10024:6;10020:17;10014:24;10010:33;10003:4;9992:9;9988:20;9981:63;;;10093:4;10085:6;10081:17;10075:24;10108:55;10157:4;10146:9;10142:20;10126:14;764:10;753:22;741:35;;688:94;10108:55;;10212:4;10204:6;10200:17;10194:24;10227:55;10276:4;10265:9;10261:20;10245:14;764:10;753:22;741:35;;688:94;10227:55;;10331:4;10323:6;10319:17;10313:24;10346:55;10395:4;10384:9;10380:20;10364:14;764:10;753:22;741:35;;688:94;10346:55;;10450:4;10442:6;10438:17;10432:24;10465:53;10512:4;10501:9;10497:20;10481:14;470:13;463:21;451:34;;400:91;10465:53;;10537:6;10592:2;10584:6;10580:15;10574:22;10605:57;10658:2;10647:9;10643:18;10627:14;10605:57;:::i;:::-;;;9540:1128;;;;:::o;10673:347::-;10738:6;10746;10799:2;10787:9;10778:7;10774:23;10770:32;10767:52;;;10815:1;10812;10805:12;10767:52;10838:29;10857:9;10838:29;:::i;:::-;10828:39;;10917:2;10906:9;10902:18;10889:32;10964:5;10957:13;10950:21;10943:5;10940:32;10930:60;;10986:1;10983;10976:12;10930:60;11009:5;10999:15;;;10673:347;;;;;:::o;11025:184::-;11083:6;11136:2;11124:9;11115:7;11111:23;11107:32;11104:52;;;11152:1;11149;11142:12;11104:52;11175:28;11193:9;11175:28;:::i;11214:667::-;11309:6;11317;11325;11333;11386:3;11374:9;11365:7;11361:23;11357:33;11354:53;;;11403:1;11400;11393:12;11354:53;11426:29;11445:9;11426:29;:::i;:::-;11416:39;;11474:38;11508:2;11497:9;11493:18;11474:38;:::i;:::-;11464:48;;11559:2;11548:9;11544:18;11531:32;11521:42;;11614:2;11603:9;11599:18;11586:32;-1:-1:-1;;;;;11633:6:14;11630:30;11627:50;;;11673:1;11670;11663:12;11627:50;11696:22;;11749:4;11741:13;;11737:27;-1:-1:-1;11727:55:14;;11778:1;11775;11768:12;11727:55;11801:74;11867:7;11862:2;11849:16;11844:2;11840;11836:11;11801:74;:::i;:::-;11791:84;;;11214:667;;;;;;;:::o;11886:265::-;6294:12;;-1:-1:-1;;;;;6290:38:14;6278:51;;6382:4;6371:16;;;6365:23;-1:-1:-1;;;;;6361:48:14;6345:14;;;6338:72;6473:4;6462:16;;;6456:23;6449:31;6442:39;6426:14;;;6419:63;12082:2;12067:18;;12094:51;6210:278;12156:266;12225:6;12278:2;12266:9;12257:7;12253:23;12249:32;12246:52;;;12294:1;12291;12284:12;12246:52;12333:9;12320:23;12372:1;12365:5;12362:12;12352:40;;12388:1;12385;12378:12;12651:260;12719:6;12727;12780:2;12768:9;12759:7;12755:23;12751:32;12748:52;;;12796:1;12793;12786:12;12748:52;12819:29;12838:9;12819:29;:::i;:::-;12809:39;;12867:38;12901:2;12890:9;12886:18;12867:38;:::i;12916:380::-;12995:1;12991:12;;;;13038;;;13059:61;;13113:4;13105:6;13101:17;13091:27;;13059:61;13166:2;13158:6;13155:14;13135:18;13132:38;13129:161;;;13212:10;13207:3;13203:20;13200:1;13193:31;13247:4;13244:1;13237:15;13275:4;13272:1;13265:15;13129:161;;12916:380;;;:::o;13301:356::-;13503:2;13485:21;;;13522:18;;;13515:30;13581:34;13576:2;13561:18;;13554:62;13648:2;13633:18;;13301:356::o;13662:127::-;13723:10;13718:3;13714:20;13711:1;13704:31;13754:4;13751:1;13744:15;13778:4;13775:1;13768:15;13794:228;13833:3;13861:10;13898:2;13895:1;13891:10;13928:2;13925:1;13921:10;13959:3;13955:2;13951:12;13946:3;13943:21;13940:47;;;13967:18;;:::i;:::-;14003:13;;13794:228;-1:-1:-1;;;;13794:228:14:o;14384:168::-;14424:7;14490:1;14486;14482:6;14478:14;14475:1;14472:21;14467:1;14460:9;14453:17;14449:45;14446:71;;;14497:18;;:::i;:::-;-1:-1:-1;14537:9:14;;14384:168::o;14557:127::-;14618:10;14613:3;14609:20;14606:1;14599:31;14649:4;14646:1;14639:15;14673:4;14670:1;14663:15;14689:120;14729:1;14755;14745:35;;14760:18;;:::i;:::-;-1:-1:-1;14794:9:14;;14689:120::o;14814:127::-;14875:10;14870:3;14866:20;14863:1;14856:31;14906:4;14903:1;14896:15;14930:4;14927:1;14920:15;15356:112;15388:1;15414;15404:35;;15419:18;;:::i;:::-;-1:-1:-1;15453:9:14;;15356:112::o;16667:236::-;16706:3;-1:-1:-1;;;;;16779:2:14;16776:1;16772:10;16809:2;16806:1;16802:10;16840:3;16836:2;16832:12;16827:3;16824:21;16821:47;;;16848:18;;:::i;16908:221::-;16947:4;16976:10;17036;;;;17006;;17058:12;;;17055:38;;;17073:18;;:::i;:::-;17110:13;;16908:221;-1:-1:-1;;;16908:221:14:o;18209:637::-;18489:3;18527:6;18521:13;18543:53;18589:6;18584:3;18577:4;18569:6;18565:17;18543:53;:::i;:::-;18659:13;;18618:16;;;;18681:57;18659:13;18618:16;18715:4;18703:17;;18681:57;:::i;:::-;-1:-1:-1;;;18760:20:14;;18789:22;;;18838:1;18827:13;;18209:637;-1:-1:-1;;;;18209:637:14:o;21018:489::-;-1:-1:-1;;;;;21287:15:14;;;21269:34;;21339:15;;21334:2;21319:18;;21312:43;21386:2;21371:18;;21364:34;;;21434:3;21429:2;21414:18;;21407:31;;;21212:4;;21455:46;;21481:19;;21473:6;21455:46;:::i;:::-;21447:54;21018:489;-1:-1:-1;;;;;;21018:489:14:o;21512:249::-;21581:6;21634:2;21622:9;21613:7;21609:23;21605:32;21602:52;;;21650:1;21647;21640:12;21602:52;21682:9;21676:16;21701:30;21725:5;21701:30;:::i;21766:135::-;21805:3;-1:-1:-1;;21826:17:14;;21823:43;;;21846:18;;:::i;:::-;-1:-1:-1;21893:1:14;21882:13;;21766:135::o;21906:125::-;21946:4;21974:1;21971;21968:8;21965:34;;;21979:18;;:::i;:::-;-1:-1:-1;22016:9:14;;21906:125::o;22036:128::-;22076:3;22107:1;22103:6;22100:1;22097:13;22094:39;;;22113:18;;:::i;:::-;-1:-1:-1;22149:9:14;;22036:128::o

Swarm Source

ipfs://97b5595646a17dc4548319f5c43e14be8a60f20af96f4088115a89d520d631f4
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.