ETH Price: $2,620.74 (+0.91%)

Token

Gargoyles (GOYLES)
 

Overview

Max Total Supply

419 GOYLES

Holders

128

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lilweb.eth
Balance
2 GOYLES
0x074DF02d5bA34eC03e4167f8dab7FE6c3a18de63
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Gargoyles

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-24
*/

// File: @openzeppelin/contracts/utils/Context.sol


// 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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: @openzeppelin/contracts/utils/introspection/IERC165.sol


// 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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @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 paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @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) public 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:
     *
     * - `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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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);

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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 IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

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

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev 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 Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        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 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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @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 {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/gargoyals.sol


/* ******************************************************************************* */
/*  _______  _______  _______  _______  _______           _        _______  _______ 
    (  ____ \(  ___  )(  ____ )(  ____ \(  ___  )|\     /|( \      (  ____ \(  ____ \
    | (    \/| (   ) || (    )|| (    \/| (   ) |( \   / )| (      | (    \/| (    \/
    | |      | (___) || (____)|| |      | |   | | \ (_) / | |      | (__    | (_____ 
    | | ____ |  ___  ||     __)| | ____ | |   | |  \   /  | |      |  __)   (_____  )
    | | \_  )| (   ) || (\ (   | | \_  )| |   | |   ) (   | |      | (            ) |
    | (___) || )   ( || ) \ \__| (___) || (___) |   | |   | (____/\| (____/\/\____) |
    (_______)|/     \||/   \__/(_______)(_______)   \_/   (_______/(_______/\_______)                                                                         
*/
/*          The Real Garoyal NFT
        Well See You On the Dark Side

        Visit us on Twitter: https://twitter.com/RealGargoyles
        Visit our website:   https://realgargoylesnft.com/

        Limited Edition Fall 2022 -- Evil Reigns and Mankind is Hanging On For Dear Life. 
*/
/* ******************************************************************************* */
pragma solidity ^0.8.17;



/* ******************************************************************************* */
contract Gargoyles is ERC721A, IERC2981, Ownable  {
    /*       
        IPFS Base URI     
    */
    string baseURL = "";
    /* 
        Contract Controls
    */
    bool public isMintEnabled = false;
    bool public isStonedListEnabled = false;
    /*
        Price
    */
    uint256 public mintPrice = .00420 ether;
    uint256 public royaltyPercentage = 4;
    /*
        Supply 
    */
    uint256 public maxPerWallet = 5;
    uint256 public maxSupply = 420;
    uint256 public maxOrderSize = 5;
    /* 
        Stoned List
    */
    uint256 stonedListGift = 1;
    address[] stonedList;
    mapping(address => uint256) public stonedListClaimed;
    /*      (                                          (               
            )\ )        )   (     (  (          (      )\     (        
           (()/(     ( /(   )(    )\))(    (    )\ )  ((_)   ))\   (   
            /(_))_   )(_)) (()\  ((_))\    )\  (()/(   _    /((_)  )\  
          (_)) __| ((_)_   ((_)  (()(_)  ((_)  )(_)) | |  (_))   ((_) 
           | (_ | / _` | | '_| / _` |  / _ \ | || | | |  / -_)  (_-< 
            \___| \__,_| |_|   \__, |  \___/  \_, | |_|  \___|  /__/ 
                                |___/          |__/                    
    */
    constructor() ERC721A("Gargoyles", "GOYLES") IERC2981() {
        /* 
            Mint To Twitter Winners 
        */
        _mint(0xcc3a97d685AaEf68c5545a98063f0a49a5389eE3, 1);
        _mint(0x3CAc335c61521740E5ac9BE1bbfEC9Bc547AeE30, 1);
        _mint(0x64177b68b4AE0cca9B13a7Bc598e09E12d8Af02B, 1);
        _mint(0x7d82b518A4Bf92352EC2230fc3b7aa4e60A79506, 1);
        _mint(0xf3d69914dc7d68ad87c0f5f678A0022E5Fa32723, 1);
        _mint(0xacbdb4C17F4D6306E5b9F4FF43738FC19373BF94, 1);
        _mint(0x9392daD49330c34d42e8B3D45188840Ad6DFa5f3, 1);
        _mint(0x6903AeE9Cd8673C87205aD555A02A56Dfe9F5aBB, 1);
        _mint(0xf51D7df6E38e8ff9c5Dda72391601171C12A67A2, 1);
        _mint(0x316556e5E64e760EBdfd334bF3D2AfdB6629a251, 1);
        _mint(0xe1a18F5f2A817C271621924E1F1e556682cE91f4, 1);
        _mint(0x5435d524eec19375e53bD0E9ef8E1990880de856, 1);
        _mint(0xD1B355aA41015A273368df991719fEaBAfbbdeef, 1);
        _mint(0xaD32016fa6bd005d2778528731F5635971A7dFB5, 1);
        _mint(0x243822078885d12b6b243D4d6a5cC4CC1703A95A, 1);
        _mint(0xAFb41911b4CcE1828985537018943dCe42EDC7be, 1);
        _mint(0x2d8888DCaF2E490c72c5bEc3a22A237cD79FC0FC, 1);
        /* 
            Lotto
        */
        _mint(0xE1650d50e176aCCde0C56C91a50612e29ca31D1A, 8);
    }
    /* 
        Minting
    */
    function mint(uint256 quantity) external payable {
        require(isMintEnabled, "Minting Not Enabled");
        require(mintPrice * quantity <= msg.value, "Invalid Price");
        require(quantity + _numberMinted(msg.sender) <= maxPerWallet, "You Cannot Mint That Many Tokens");
        require(totalSupply() + quantity < maxSupply, "Sold Out");
        _mint(msg.sender, quantity);
    }

    function stonedListMint(uint256 quantity) external payable {
        require(isStonedListEnabled, "Stoned List Minting Not Enabled");
        require(isStonedListed(msg.sender), "You Are Not On The Stoned List");
        require(!isStoneListClaimed(msg.sender), "You Have Already Claimed Your Spot");
        require(quantity + _numberMinted(msg.sender) <= maxPerWallet, "You Cannot Mint That Many Tokens");
        require(totalSupply() + quantity < maxSupply, "Sold Out");
        /* Mint Free Gift */
        stonedListClaimed[msg.sender] += stonedListGift;
        _mint(msg.sender, stonedListGift);
        quantity -= stonedListGift;
        /* Mint Rest of Order */
        if (quantity > 0) {
            require(mintPrice * quantity <= msg.value, "Invalid Price");
            _mint(msg.sender, quantity);
        }
    }

    function airdrop(address addr, uint256 quantity) external onlyOwner {
        require(quantity > 0, "Cannot Mint Negative Tokens");
        require(maxSupply >= quantity + totalSupply(), "Exceeds Maximum Supply");
        while (quantity > 0) {
            _mint(addr, quantity > maxOrderSize ? maxOrderSize : quantity);
            quantity -= maxOrderSize;
        }
    }
    /*
        Utilities
    */
    function toggleIsMintEnabled() external onlyOwner {
        isMintEnabled = isMintEnabled ? false : true; 
    }

    function toggleIsStonedListEnabled() external onlyOwner {
        isStonedListEnabled = isStonedListEnabled ? false : true; 
    }

    function launch() external onlyOwner {
        isStonedListEnabled = true;
        isMintEnabled = true;
    }

    function setTokenURI(string memory uri) external onlyOwner {
        baseURL = uri;
    }

    function setMintPrice(uint256 ethers) external onlyOwner  {
        mintPrice = ethers;
    }

    function setStonedList(address[] memory stonedlist) external onlyOwner {
        stonedList = stonedlist;
    }

    function setStonedListGift(uint256 amount) external onlyOwner {
        require(amount <= maxPerWallet, "Cannot Give Away More Than One Can Hold...");
        stonedListGift = amount;
    }

    function isStoneListClaimed(address addr) public view returns (bool) {
        if (stonedListClaimed[addr] >= stonedListGift) {
            return true;
        }
        return false;
    }

    function isStonedListed(address addr) public view returns (bool){
        for(uint256 i = 0; i < stonedList.length; i++) {
            if (addr == stonedList[i]) {
                return true;
            }
        }
        return false;
    }

    function withdraw() external payable onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
    /*
        Overrides
    */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURL;
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        string memory baseURI = _baseURI();
        string memory Part1 = bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(Part1, ".json")) : '';
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override(IERC2981) returns (address, uint256) {
        _tokenId;
        uint256 fee = _salePrice * royaltyPercentage / 100;
        return (owner(), fee);
    }

    /*
        Interface Information
    */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721A) returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f || // ERC165 interface ID for ERC721Metadata.
            interfaceId == 0x2a55205a;   // ERC165 interface ID for IERC2981.
    }
/*  _______  _______  _______  _______  _______           _        _______  _______ 
    (  ____ \(  ___  )(  ____ )(  ____ \(  ___  )|\     /|( \      (  ____ \(  ____ \
    | (    \/| (   ) || (    )|| (    \/| (   ) |( \   / )| (      | (    \/| (    \/
    | |      | (___) || (____)|| |      | |   | | \ (_) / | |      | (__    | (_____ 
    | | ____ |  ___  ||     __)| | ____ | |   | |  \   /  | |      |  __)   (_____  )
    | | \_  )| (   ) || (\ (   | | \_  )| |   | |   ) (   | |      | (            ) |
    | (___) || )   ( || ) \ \__| (___) || (___) |   | |   | (____/\| (____/\/\____) |
    (_______)|/     \||/   \__/(_______)(_______)   \_/   (_______/(_______/\_______)                                                                         
*/
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isStoneListClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStonedListEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isStonedListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxOrderSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"royaltyPercentage","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethers","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"stonedlist","type":"address[]"}],"name":"setStonedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setStonedListGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stonedListClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"stonedListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIsMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsStonedListEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"payable","type":"function"}]

60806040526040518060200160405280600081525060099081620000249190620009e8565b506000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff021916908315150217905550660eebe0b40e8000600b556004600c556005600d556101a4600e556005600f5560016010553480156200008d57600080fd5b506040518060400160405280600981526020017f476172676f796c657300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f474f594c4553000000000000000000000000000000000000000000000000000081525081600290816200010b9190620009e8565b5080600390816200011d9190620009e8565b506200012e6200041a60201b60201c565b6000819055505050620001566200014a6200042360201b60201c565b6200042b60201b60201c565b6200017d73cc3a97d685aaef68c5545a98063f0a49a5389ee36001620004f160201b60201c565b620001a4733cac335c61521740e5ac9be1bbfec9bc547aee306001620004f160201b60201c565b620001cb7364177b68b4ae0cca9b13a7bc598e09e12d8af02b6001620004f160201b60201c565b620001f2737d82b518a4bf92352ec2230fc3b7aa4e60a795066001620004f160201b60201c565b6200021973f3d69914dc7d68ad87c0f5f678a0022e5fa327236001620004f160201b60201c565b6200024073acbdb4c17f4d6306e5b9f4ff43738fc19373bf946001620004f160201b60201c565b62000267739392dad49330c34d42e8b3d45188840ad6dfa5f36001620004f160201b60201c565b6200028e736903aee9cd8673c87205ad555a02a56dfe9f5abb6001620004f160201b60201c565b620002b573f51d7df6e38e8ff9c5dda72391601171c12a67a26001620004f160201b60201c565b620002dc73316556e5e64e760ebdfd334bf3d2afdb6629a2516001620004f160201b60201c565b6200030373e1a18f5f2a817c271621924e1f1e556682ce91f46001620004f160201b60201c565b6200032a735435d524eec19375e53bd0e9ef8e1990880de8566001620004f160201b60201c565b6200035173d1b355aa41015a273368df991719feabafbbdeef6001620004f160201b60201c565b6200037873ad32016fa6bd005d2778528731f5635971a7dfb56001620004f160201b60201c565b6200039f73243822078885d12b6b243d4d6a5cc4cc1703a95a6001620004f160201b60201c565b620003c673afb41911b4cce1828985537018943dce42edc7be6001620004f160201b60201c565b620003ed732d8888dcaf2e490c72c5bec3a22a237cd79fc0fc6001620004f160201b60201c565b6200041473e1650d50e176accde0c56c91a50612e29ca31d1a6008620004f160201b60201c565b62000acf565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200055e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820362000599576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620005ae6000848385620006ee60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200063d836200061f6000866000620006f460201b60201c565b62000630856200072460201b60201c565b176200073460201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200066157806000819055505050620006e960008483856200075f60201b60201c565b505050565b50505050565b60008060e883901c905060e8620007138686846200076560201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007f057607f821691505b602082108103620008065762000805620007a8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000831565b6200087c868362000831565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008c9620008c3620008bd8462000894565b6200089e565b62000894565b9050919050565b6000819050919050565b620008e583620008a8565b620008fd620008f482620008d0565b8484546200083e565b825550505050565b600090565b6200091462000905565b62000921818484620008da565b505050565b5b8181101562000949576200093d6000826200090a565b60018101905062000927565b5050565b601f821115620009985762000962816200080c565b6200096d8462000821565b810160208510156200097d578190505b620009956200098c8562000821565b83018262000926565b50505b505050565b600082821c905092915050565b6000620009bd600019846008026200099d565b1980831691505092915050565b6000620009d88383620009aa565b9150826002028217905092915050565b620009f3826200076e565b67ffffffffffffffff81111562000a0f5762000a0e62000779565b5b62000a1b8254620007d7565b62000a288282856200094d565b600060209050601f83116001811462000a60576000841562000a4b578287015190505b62000a578582620009ca565b86555062000ac7565b601f19841662000a70866200080c565b60005b8281101562000a9a5784890151825560018201915060208501945060208101905062000a73565b8683101562000aba578489015162000ab6601f891682620009aa565b8355505b6001600288020188555050505b505050505050565b6139408062000adf6000396000f3fe6080604052600436106102305760003560e01c80638a71bb2d1161012e578063c4073217116100ab578063e0df5b6f1161006f578063e0df5b6f146107ef578063e985e9c514610818578063f1a82c7e14610855578063f2fde38b14610880578063f4a0a528146108a957610230565b8063c4073217146106f6578063c87b56dd1461070d578063cf7384cd1461074a578063d4d406bb14610787578063d5abeb01146107c457610230565b8063a0712d68116100f2578063a0712d6814610641578063a22cb4651461065d578063a698874a14610686578063ad8aa7a4146106b1578063b88d4fde146106cd57610230565b80638a71bb2d1461056e5780638ba4cc3c146105995780638da5cb5b146105c257806395d89b41146105ed5780639ec833571461061857610230565b8063346de50a116101bc5780636817c76c116101805780636817c76c146104af57806370a08231146104da578063715018a61461051757806373899a0d1461052e5780637eef68181461055757610230565b8063346de50a146103e95780633ccfd60b1461041457806342842e0e1461041e578063453c2310146104475780636352211e1461047257610230565b8063095ea7b311610203578063095ea7b3146102f15780631154d2831461031a57806318160ddd1461035757806323b872dd146103825780632a55205a146103ab57610230565b806301339c211461023557806301ffc9a71461024c57806306fdde0314610289578063081812fc146102b4575b600080fd5b34801561024157600080fd5b5061024a6108d2565b005b34801561025857600080fd5b50610273600480360381019061026e9190612597565b610912565b60405161028091906125df565b60405180910390f35b34801561029557600080fd5b5061029e6109d4565b6040516102ab919061268a565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906126e2565b610a66565b6040516102e89190612750565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190612797565b610ae2565b005b34801561032657600080fd5b50610341600480360381019061033c91906127d7565b610c23565b60405161034e9190612813565b60405180910390f35b34801561036357600080fd5b5061036c610c3b565b6040516103799190612813565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a4919061282e565b610c52565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612881565b610f74565b6040516103e09291906128c1565b60405180910390f35b3480156103f557600080fd5b506103fe610faa565b60405161040b91906125df565b60405180910390f35b61041c610fbd565b005b34801561042a57600080fd5b506104456004803603810190610440919061282e565b611015565b005b34801561045357600080fd5b5061045c611035565b6040516104699190612813565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906126e2565b61103b565b6040516104a69190612750565b60405180910390f35b3480156104bb57600080fd5b506104c461104d565b6040516104d19190612813565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc91906127d7565b611053565b60405161050e9190612813565b60405180910390f35b34801561052357600080fd5b5061052c61110b565b005b34801561053a57600080fd5b50610555600480360381019061055091906126e2565b61111f565b005b34801561056357600080fd5b5061056c611176565b005b34801561057a57600080fd5b506105836111b7565b6040516105909190612813565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb9190612797565b6111bd565b005b3480156105ce57600080fd5b506105d761129e565b6040516105e49190612750565b60405180910390f35b3480156105f957600080fd5b506106026112c8565b60405161060f919061268a565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a9190612a32565b61135a565b005b61065b600480360381019061065691906126e2565b61137c565b005b34801561066957600080fd5b50610684600480360381019061067f9190612aa7565b6114d6565b005b34801561069257600080fd5b5061069b61164d565b6040516106a891906125df565b60405180910390f35b6106cb60048036038101906106c691906126e2565b611660565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190612b9c565b6118c9565b005b34801561070257600080fd5b5061070b61193c565b005b34801561071957600080fd5b50610734600480360381019061072f91906126e2565b61197d565b604051610741919061268a565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906127d7565b611a5e565b60405161077e91906125df565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906127d7565b611b0c565b6040516107bb91906125df565b60405180910390f35b3480156107d057600080fd5b506107d9611b69565b6040516107e69190612813565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190612cc0565b611b6f565b005b34801561082457600080fd5b5061083f600480360381019061083a9190612d09565b611b8a565b60405161084c91906125df565b60405180910390f35b34801561086157600080fd5b5061086a611c1e565b6040516108779190612813565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a291906127d7565b611c24565b005b3480156108b557600080fd5b506108d060048036038101906108cb91906126e2565b611ca7565b005b6108da611cb9565b6001600a60016101000a81548160ff0219169083151502179055506001600a60006101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061099d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cd5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109e390612d78565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f90612d78565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b5050505050905090565b6000610a7182611d37565b610aa7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aed8261103b565b90508073ffffffffffffffffffffffffffffffffffffffff16610b0e611d96565b73ffffffffffffffffffffffffffffffffffffffff1614610b7157610b3a81610b35611d96565b611b8a565b610b70576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60126020528060005260406000206000915090505481565b6000610c45611d9e565b6001546000540303905090565b6000610c5d82611da7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cd084611e73565b91509150610ce68187610ce1611d96565b611e95565b610d3257610cfb86610cf6611d96565b611b8a565b610d31576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d98576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da58686866001611ed9565b8015610db057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e7e85610e5a888887611edf565b7c020000000000000000000000000000000000000000000000000000000017611f07565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f045760006001850190506000600460008381526020019081526020016000205403610f02576000548114610f01578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6c8686866001611f32565b505050505050565b60008060006064600c5485610f899190612dd8565b610f939190612e49565b9050610f9d61129e565b8192509250509250929050565b600a60009054906101000a900460ff1681565b610fc5611cb9565b610fcd61129e565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611012573d6000803e3d6000fd5b50565b611030838383604051806020016040528060008152506118c9565b505050565b600d5481565b600061104682611da7565b9050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611113611cb9565b61111d6000611f38565b565b611127611cb9565b600d5481111561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390612eec565b60405180910390fd5b8060108190555050565b61117e611cb9565b600a60019054906101000a900460ff1661119957600161119c565b60005b600a60016101000a81548160ff021916908315150217905550565b600c5481565b6111c5611cb9565b60008111611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90612f58565b60405180910390fd5b611210610c3b565b8161121b9190612f78565b600e54101561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690612ff8565b60405180910390fd5b5b600081111561129a5761128582600f54831161127c5782611280565b600f545b611ffe565b600f54816112939190613018565b9050611260565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d790612d78565b80601f016020809104026020016040519081016040528092919081815260200182805461130390612d78565b80156113505780601f1061132557610100808354040283529160200191611350565b820191906000526020600020905b81548152906001019060200180831161133357829003601f168201915b5050505050905090565b611362611cb9565b8060119080519060200190611378929190612484565b5050565b600a60009054906101000a900460ff166113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c290613098565b60405180910390fd5b3481600b546113da9190612dd8565b111561141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613104565b60405180910390fd5b600d54611427336121d0565b826114329190612f78565b1115611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613170565b60405180910390fd5b600e548161147f610c3b565b6114899190612f78565b106114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906131dc565b60405180910390fd5b6114d33382611ffe565b50565b6114de611d96565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611542576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061154f611d96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115fc611d96565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161164191906125df565b60405180910390a35050565b600a60019054906101000a900460ff1681565b600a60019054906101000a900460ff166116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613248565b60405180910390fd5b6116b833611a5e565b6116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee906132b4565b60405180910390fd5b61170033611b0c565b15611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613346565b60405180910390fd5b600d5461174c336121d0565b826117579190612f78565b1115611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90613170565b60405180910390fd5b600e54816117a4610c3b565b6117ae9190612f78565b106117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e5906131dc565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183f9190612f78565b9250508190555061185233601054611ffe565b601054816118609190613018565b905060008111156118c6573481600b5461187a9190612dd8565b11156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613104565b60405180910390fd5b6118c53382611ffe565b5b50565b6118d4848484610c52565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611936576118ff84848484612227565b611935576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611944611cb9565b600a60009054906101000a900460ff1661195f576001611962565b60005b600a60006101000a81548160ff021916908315150217905550565b606061198882611d37565b6119be576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119c8612377565b90506000808251036119e95760405180602001604052806000815250611a14565b816119f385612409565b604051602001611a049291906133a2565b6040516020818303038152906040525b90506000825103611a345760405180602001604052806000815250611a55565b80604051602001611a459190613412565b6040516020818303038152906040525b92505050919050565b600080600090505b601180549050811015611b015760118181548110611a8757611a86613434565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611aee576001915050611b07565b8080611af990613463565b915050611a66565b50600090505b919050565b6000601054601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611b5f5760019050611b64565b600090505b919050565b600e5481565b611b77611cb9565b8060099081611b869190613657565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611c2c611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c929061379b565b60405180910390fd5b611ca481611f38565b50565b611caf611cb9565b80600b8190555050565b611cc1612463565b73ffffffffffffffffffffffffffffffffffffffff16611cdf61129e565b73ffffffffffffffffffffffffffffffffffffffff1614611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c90613807565b60405180910390fd5b565b600081611d42611d9e565b11158015611d51575060005482105b8015611d8f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611db6611d9e565b11611e3c57600054811015611e3b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e39575b60008103611e2f576004600083600190039350838152602001908152602001600020549050611e05565b8092505050611e6e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ef686868461246b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361206a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036120a4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b16000848385611ed9565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612128836121196000866000611edf565b61212285612474565b17611f07565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061214c578060008190555050506121cb6000848385611f32565b505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261224d611d96565b8786866040518563ffffffff1660e01b815260040161226f949392919061387c565b6020604051808303816000875af19250505080156122ab57506040513d601f19601f820116820180604052508101906122a891906138dd565b60015b612324573d80600081146122db576040519150601f19603f3d011682016040523d82523d6000602084013e6122e0565b606091505b50600081510361231c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461238690612d78565b80601f01602080910402602001604051908101604052809291908181526020018280546123b290612d78565b80156123ff5780601f106123d4576101008083540402835291602001916123ff565b820191906000526020600020905b8154815290600101906020018083116123e257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561244f57600183039250600a81066030018353600a8104905061242f565b508181036020830392508083525050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b8280548282559060005260206000209081019282156124fd579160200282015b828111156124fc5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906124a4565b5b50905061250a919061250e565b5090565b5b8082111561252757600081600090555060010161250f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125748161253f565b811461257f57600080fd5b50565b6000813590506125918161256b565b92915050565b6000602082840312156125ad576125ac612535565b5b60006125bb84828501612582565b91505092915050565b60008115159050919050565b6125d9816125c4565b82525050565b60006020820190506125f460008301846125d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612634578082015181840152602081019050612619565b60008484015250505050565b6000601f19601f8301169050919050565b600061265c826125fa565b6126668185612605565b9350612676818560208601612616565b61267f81612640565b840191505092915050565b600060208201905081810360008301526126a48184612651565b905092915050565b6000819050919050565b6126bf816126ac565b81146126ca57600080fd5b50565b6000813590506126dc816126b6565b92915050565b6000602082840312156126f8576126f7612535565b5b6000612706848285016126cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061273a8261270f565b9050919050565b61274a8161272f565b82525050565b60006020820190506127656000830184612741565b92915050565b6127748161272f565b811461277f57600080fd5b50565b6000813590506127918161276b565b92915050565b600080604083850312156127ae576127ad612535565b5b60006127bc85828601612782565b92505060206127cd858286016126cd565b9150509250929050565b6000602082840312156127ed576127ec612535565b5b60006127fb84828501612782565b91505092915050565b61280d816126ac565b82525050565b60006020820190506128286000830184612804565b92915050565b60008060006060848603121561284757612846612535565b5b600061285586828701612782565b935050602061286686828701612782565b9250506040612877868287016126cd565b9150509250925092565b6000806040838503121561289857612897612535565b5b60006128a6858286016126cd565b92505060206128b7858286016126cd565b9150509250929050565b60006040820190506128d66000830185612741565b6128e36020830184612804565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61292782612640565b810181811067ffffffffffffffff82111715612946576129456128ef565b5b80604052505050565b600061295961252b565b9050612965828261291e565b919050565b600067ffffffffffffffff821115612985576129846128ef565b5b602082029050602081019050919050565b600080fd5b60006129ae6129a98461296a565b61294f565b905080838252602082019050602084028301858111156129d1576129d0612996565b5b835b818110156129fa57806129e68882612782565b8452602084019350506020810190506129d3565b5050509392505050565b600082601f830112612a1957612a186128ea565b5b8135612a2984826020860161299b565b91505092915050565b600060208284031215612a4857612a47612535565b5b600082013567ffffffffffffffff811115612a6657612a6561253a565b5b612a7284828501612a04565b91505092915050565b612a84816125c4565b8114612a8f57600080fd5b50565b600081359050612aa181612a7b565b92915050565b60008060408385031215612abe57612abd612535565b5b6000612acc85828601612782565b9250506020612add85828601612a92565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612b0757612b066128ef565b5b612b1082612640565b9050602081019050919050565b82818337600083830152505050565b6000612b3f612b3a84612aec565b61294f565b905082815260208101848484011115612b5b57612b5a612ae7565b5b612b66848285612b1d565b509392505050565b600082601f830112612b8357612b826128ea565b5b8135612b93848260208601612b2c565b91505092915050565b60008060008060808587031215612bb657612bb5612535565b5b6000612bc487828801612782565b9450506020612bd587828801612782565b9350506040612be6878288016126cd565b925050606085013567ffffffffffffffff811115612c0757612c0661253a565b5b612c1387828801612b6e565b91505092959194509250565b600067ffffffffffffffff821115612c3a57612c396128ef565b5b612c4382612640565b9050602081019050919050565b6000612c63612c5e84612c1f565b61294f565b905082815260208101848484011115612c7f57612c7e612ae7565b5b612c8a848285612b1d565b509392505050565b600082601f830112612ca757612ca66128ea565b5b8135612cb7848260208601612c50565b91505092915050565b600060208284031215612cd657612cd5612535565b5b600082013567ffffffffffffffff811115612cf457612cf361253a565b5b612d0084828501612c92565b91505092915050565b60008060408385031215612d2057612d1f612535565b5b6000612d2e85828601612782565b9250506020612d3f85828601612782565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d9057607f821691505b602082108103612da357612da2612d49565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de3826126ac565b9150612dee836126ac565b9250828202612dfc816126ac565b91508282048414831517612e1357612e12612da9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e54826126ac565b9150612e5f836126ac565b925082612e6f57612e6e612e1a565b5b828204905092915050565b7f43616e6e6f7420476976652041776179204d6f7265205468616e204f6e65204360008201527f616e20486f6c642e2e2e00000000000000000000000000000000000000000000602082015250565b6000612ed6602a83612605565b9150612ee182612e7a565b604082019050919050565b60006020820190508181036000830152612f0581612ec9565b9050919050565b7f43616e6e6f74204d696e74204e6567617469766520546f6b656e730000000000600082015250565b6000612f42601b83612605565b9150612f4d82612f0c565b602082019050919050565b60006020820190508181036000830152612f7181612f35565b9050919050565b6000612f83826126ac565b9150612f8e836126ac565b9250828201905080821115612fa657612fa5612da9565b5b92915050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000612fe2601683612605565b9150612fed82612fac565b602082019050919050565b6000602082019050818103600083015261301181612fd5565b9050919050565b6000613023826126ac565b915061302e836126ac565b925082820390508181111561304657613045612da9565b5b92915050565b7f4d696e74696e67204e6f7420456e61626c656400000000000000000000000000600082015250565b6000613082601383612605565b915061308d8261304c565b602082019050919050565b600060208201905081810360008301526130b181613075565b9050919050565b7f496e76616c696420507269636500000000000000000000000000000000000000600082015250565b60006130ee600d83612605565b91506130f9826130b8565b602082019050919050565b6000602082019050818103600083015261311d816130e1565b9050919050565b7f596f752043616e6e6f74204d696e742054686174204d616e7920546f6b656e73600082015250565b600061315a602083612605565b915061316582613124565b602082019050919050565b600060208201905081810360008301526131898161314d565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b60006131c6600883612605565b91506131d182613190565b602082019050919050565b600060208201905081810360008301526131f5816131b9565b9050919050565b7f53746f6e6564204c697374204d696e74696e67204e6f7420456e61626c656400600082015250565b6000613232601f83612605565b915061323d826131fc565b602082019050919050565b6000602082019050818103600083015261326181613225565b9050919050565b7f596f7520417265204e6f74204f6e205468652053746f6e6564204c6973740000600082015250565b600061329e601e83612605565b91506132a982613268565b602082019050919050565b600060208201905081810360008301526132cd81613291565b9050919050565b7f596f75204861766520416c726561647920436c61696d656420596f757220537060008201527f6f74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613330602283612605565b915061333b826132d4565b604082019050919050565b6000602082019050818103600083015261335f81613323565b9050919050565b600081905092915050565b600061337c826125fa565b6133868185613366565b9350613396818560208601612616565b80840191505092915050565b60006133ae8285613371565b91506133ba8284613371565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006133fc600583613366565b9150613407826133c6565b600582019050919050565b600061341e8284613371565b9150613429826133ef565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061346e826126ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134a05761349f612da9565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261350d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134d0565b61351786836134d0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061355461354f61354a846126ac565b61352f565b6126ac565b9050919050565b6000819050919050565b61356e83613539565b61358261357a8261355b565b8484546134dd565b825550505050565b600090565b61359761358a565b6135a2818484613565565b505050565b5b818110156135c6576135bb60008261358f565b6001810190506135a8565b5050565b601f82111561360b576135dc816134ab565b6135e5846134c0565b810160208510156135f4578190505b613608613600856134c0565b8301826135a7565b50505b505050565b600082821c905092915050565b600061362e60001984600802613610565b1980831691505092915050565b6000613647838361361d565b9150826002028217905092915050565b613660826125fa565b67ffffffffffffffff811115613679576136786128ef565b5b6136838254612d78565b61368e8282856135ca565b600060209050601f8311600181146136c157600084156136af578287015190505b6136b9858261363b565b865550613721565b601f1984166136cf866134ab565b60005b828110156136f7578489015182556001820191506020850194506020810190506136d2565b868310156137145784890151613710601f89168261361d565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613785602683612605565b915061379082613729565b604082019050919050565b600060208201905081810360008301526137b481613778565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137f1602083612605565b91506137fc826137bb565b602082019050919050565b60006020820190508181036000830152613820816137e4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061384e82613827565b6138588185613832565b9350613868818560208601612616565b61387181612640565b840191505092915050565b60006080820190506138916000830187612741565b61389e6020830186612741565b6138ab6040830185612804565b81810360608301526138bd8184613843565b905095945050505050565b6000815190506138d78161256b565b92915050565b6000602082840312156138f3576138f2612535565b5b6000613901848285016138c8565b9150509291505056fea26469706673582212202ae1afb9f6823d64f252602a1c9034d3a222b9e7d6238d97c85ff1827d8df34464736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80638a71bb2d1161012e578063c4073217116100ab578063e0df5b6f1161006f578063e0df5b6f146107ef578063e985e9c514610818578063f1a82c7e14610855578063f2fde38b14610880578063f4a0a528146108a957610230565b8063c4073217146106f6578063c87b56dd1461070d578063cf7384cd1461074a578063d4d406bb14610787578063d5abeb01146107c457610230565b8063a0712d68116100f2578063a0712d6814610641578063a22cb4651461065d578063a698874a14610686578063ad8aa7a4146106b1578063b88d4fde146106cd57610230565b80638a71bb2d1461056e5780638ba4cc3c146105995780638da5cb5b146105c257806395d89b41146105ed5780639ec833571461061857610230565b8063346de50a116101bc5780636817c76c116101805780636817c76c146104af57806370a08231146104da578063715018a61461051757806373899a0d1461052e5780637eef68181461055757610230565b8063346de50a146103e95780633ccfd60b1461041457806342842e0e1461041e578063453c2310146104475780636352211e1461047257610230565b8063095ea7b311610203578063095ea7b3146102f15780631154d2831461031a57806318160ddd1461035757806323b872dd146103825780632a55205a146103ab57610230565b806301339c211461023557806301ffc9a71461024c57806306fdde0314610289578063081812fc146102b4575b600080fd5b34801561024157600080fd5b5061024a6108d2565b005b34801561025857600080fd5b50610273600480360381019061026e9190612597565b610912565b60405161028091906125df565b60405180910390f35b34801561029557600080fd5b5061029e6109d4565b6040516102ab919061268a565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906126e2565b610a66565b6040516102e89190612750565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190612797565b610ae2565b005b34801561032657600080fd5b50610341600480360381019061033c91906127d7565b610c23565b60405161034e9190612813565b60405180910390f35b34801561036357600080fd5b5061036c610c3b565b6040516103799190612813565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a4919061282e565b610c52565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612881565b610f74565b6040516103e09291906128c1565b60405180910390f35b3480156103f557600080fd5b506103fe610faa565b60405161040b91906125df565b60405180910390f35b61041c610fbd565b005b34801561042a57600080fd5b506104456004803603810190610440919061282e565b611015565b005b34801561045357600080fd5b5061045c611035565b6040516104699190612813565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906126e2565b61103b565b6040516104a69190612750565b60405180910390f35b3480156104bb57600080fd5b506104c461104d565b6040516104d19190612813565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc91906127d7565b611053565b60405161050e9190612813565b60405180910390f35b34801561052357600080fd5b5061052c61110b565b005b34801561053a57600080fd5b50610555600480360381019061055091906126e2565b61111f565b005b34801561056357600080fd5b5061056c611176565b005b34801561057a57600080fd5b506105836111b7565b6040516105909190612813565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb9190612797565b6111bd565b005b3480156105ce57600080fd5b506105d761129e565b6040516105e49190612750565b60405180910390f35b3480156105f957600080fd5b506106026112c8565b60405161060f919061268a565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a9190612a32565b61135a565b005b61065b600480360381019061065691906126e2565b61137c565b005b34801561066957600080fd5b50610684600480360381019061067f9190612aa7565b6114d6565b005b34801561069257600080fd5b5061069b61164d565b6040516106a891906125df565b60405180910390f35b6106cb60048036038101906106c691906126e2565b611660565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190612b9c565b6118c9565b005b34801561070257600080fd5b5061070b61193c565b005b34801561071957600080fd5b50610734600480360381019061072f91906126e2565b61197d565b604051610741919061268a565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906127d7565b611a5e565b60405161077e91906125df565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906127d7565b611b0c565b6040516107bb91906125df565b60405180910390f35b3480156107d057600080fd5b506107d9611b69565b6040516107e69190612813565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190612cc0565b611b6f565b005b34801561082457600080fd5b5061083f600480360381019061083a9190612d09565b611b8a565b60405161084c91906125df565b60405180910390f35b34801561086157600080fd5b5061086a611c1e565b6040516108779190612813565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a291906127d7565b611c24565b005b3480156108b557600080fd5b506108d060048036038101906108cb91906126e2565b611ca7565b005b6108da611cb9565b6001600a60016101000a81548160ff0219169083151502179055506001600a60006101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061099d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cd5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109e390612d78565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f90612d78565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b5050505050905090565b6000610a7182611d37565b610aa7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aed8261103b565b90508073ffffffffffffffffffffffffffffffffffffffff16610b0e611d96565b73ffffffffffffffffffffffffffffffffffffffff1614610b7157610b3a81610b35611d96565b611b8a565b610b70576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60126020528060005260406000206000915090505481565b6000610c45611d9e565b6001546000540303905090565b6000610c5d82611da7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cd084611e73565b91509150610ce68187610ce1611d96565b611e95565b610d3257610cfb86610cf6611d96565b611b8a565b610d31576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d98576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da58686866001611ed9565b8015610db057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e7e85610e5a888887611edf565b7c020000000000000000000000000000000000000000000000000000000017611f07565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f045760006001850190506000600460008381526020019081526020016000205403610f02576000548114610f01578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6c8686866001611f32565b505050505050565b60008060006064600c5485610f899190612dd8565b610f939190612e49565b9050610f9d61129e565b8192509250509250929050565b600a60009054906101000a900460ff1681565b610fc5611cb9565b610fcd61129e565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611012573d6000803e3d6000fd5b50565b611030838383604051806020016040528060008152506118c9565b505050565b600d5481565b600061104682611da7565b9050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611113611cb9565b61111d6000611f38565b565b611127611cb9565b600d5481111561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390612eec565b60405180910390fd5b8060108190555050565b61117e611cb9565b600a60019054906101000a900460ff1661119957600161119c565b60005b600a60016101000a81548160ff021916908315150217905550565b600c5481565b6111c5611cb9565b60008111611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90612f58565b60405180910390fd5b611210610c3b565b8161121b9190612f78565b600e54101561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690612ff8565b60405180910390fd5b5b600081111561129a5761128582600f54831161127c5782611280565b600f545b611ffe565b600f54816112939190613018565b9050611260565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d790612d78565b80601f016020809104026020016040519081016040528092919081815260200182805461130390612d78565b80156113505780601f1061132557610100808354040283529160200191611350565b820191906000526020600020905b81548152906001019060200180831161133357829003601f168201915b5050505050905090565b611362611cb9565b8060119080519060200190611378929190612484565b5050565b600a60009054906101000a900460ff166113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c290613098565b60405180910390fd5b3481600b546113da9190612dd8565b111561141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613104565b60405180910390fd5b600d54611427336121d0565b826114329190612f78565b1115611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613170565b60405180910390fd5b600e548161147f610c3b565b6114899190612f78565b106114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906131dc565b60405180910390fd5b6114d33382611ffe565b50565b6114de611d96565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611542576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061154f611d96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115fc611d96565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161164191906125df565b60405180910390a35050565b600a60019054906101000a900460ff1681565b600a60019054906101000a900460ff166116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613248565b60405180910390fd5b6116b833611a5e565b6116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee906132b4565b60405180910390fd5b61170033611b0c565b15611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613346565b60405180910390fd5b600d5461174c336121d0565b826117579190612f78565b1115611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90613170565b60405180910390fd5b600e54816117a4610c3b565b6117ae9190612f78565b106117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e5906131dc565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183f9190612f78565b9250508190555061185233601054611ffe565b601054816118609190613018565b905060008111156118c6573481600b5461187a9190612dd8565b11156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613104565b60405180910390fd5b6118c53382611ffe565b5b50565b6118d4848484610c52565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611936576118ff84848484612227565b611935576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611944611cb9565b600a60009054906101000a900460ff1661195f576001611962565b60005b600a60006101000a81548160ff021916908315150217905550565b606061198882611d37565b6119be576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119c8612377565b90506000808251036119e95760405180602001604052806000815250611a14565b816119f385612409565b604051602001611a049291906133a2565b6040516020818303038152906040525b90506000825103611a345760405180602001604052806000815250611a55565b80604051602001611a459190613412565b6040516020818303038152906040525b92505050919050565b600080600090505b601180549050811015611b015760118181548110611a8757611a86613434565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611aee576001915050611b07565b8080611af990613463565b915050611a66565b50600090505b919050565b6000601054601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611b5f5760019050611b64565b600090505b919050565b600e5481565b611b77611cb9565b8060099081611b869190613657565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611c2c611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c929061379b565b60405180910390fd5b611ca481611f38565b50565b611caf611cb9565b80600b8190555050565b611cc1612463565b73ffffffffffffffffffffffffffffffffffffffff16611cdf61129e565b73ffffffffffffffffffffffffffffffffffffffff1614611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c90613807565b60405180910390fd5b565b600081611d42611d9e565b11158015611d51575060005482105b8015611d8f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611db6611d9e565b11611e3c57600054811015611e3b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e39575b60008103611e2f576004600083600190039350838152602001908152602001600020549050611e05565b8092505050611e6e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ef686868461246b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361206a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036120a4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b16000848385611ed9565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612128836121196000866000611edf565b61212285612474565b17611f07565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061214c578060008190555050506121cb6000848385611f32565b505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261224d611d96565b8786866040518563ffffffff1660e01b815260040161226f949392919061387c565b6020604051808303816000875af19250505080156122ab57506040513d601f19601f820116820180604052508101906122a891906138dd565b60015b612324573d80600081146122db576040519150601f19603f3d011682016040523d82523d6000602084013e6122e0565b606091505b50600081510361231c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461238690612d78565b80601f01602080910402602001604051908101604052809291908181526020018280546123b290612d78565b80156123ff5780601f106123d4576101008083540402835291602001916123ff565b820191906000526020600020905b8154815290600101906020018083116123e257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561244f57600183039250600a81066030018353600a8104905061242f565b508181036020830392508083525050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b8280548282559060005260206000209081019282156124fd579160200282015b828111156124fc5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906124a4565b5b50905061250a919061250e565b5090565b5b8082111561252757600081600090555060010161250f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125748161253f565b811461257f57600080fd5b50565b6000813590506125918161256b565b92915050565b6000602082840312156125ad576125ac612535565b5b60006125bb84828501612582565b91505092915050565b60008115159050919050565b6125d9816125c4565b82525050565b60006020820190506125f460008301846125d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612634578082015181840152602081019050612619565b60008484015250505050565b6000601f19601f8301169050919050565b600061265c826125fa565b6126668185612605565b9350612676818560208601612616565b61267f81612640565b840191505092915050565b600060208201905081810360008301526126a48184612651565b905092915050565b6000819050919050565b6126bf816126ac565b81146126ca57600080fd5b50565b6000813590506126dc816126b6565b92915050565b6000602082840312156126f8576126f7612535565b5b6000612706848285016126cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061273a8261270f565b9050919050565b61274a8161272f565b82525050565b60006020820190506127656000830184612741565b92915050565b6127748161272f565b811461277f57600080fd5b50565b6000813590506127918161276b565b92915050565b600080604083850312156127ae576127ad612535565b5b60006127bc85828601612782565b92505060206127cd858286016126cd565b9150509250929050565b6000602082840312156127ed576127ec612535565b5b60006127fb84828501612782565b91505092915050565b61280d816126ac565b82525050565b60006020820190506128286000830184612804565b92915050565b60008060006060848603121561284757612846612535565b5b600061285586828701612782565b935050602061286686828701612782565b9250506040612877868287016126cd565b9150509250925092565b6000806040838503121561289857612897612535565b5b60006128a6858286016126cd565b92505060206128b7858286016126cd565b9150509250929050565b60006040820190506128d66000830185612741565b6128e36020830184612804565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61292782612640565b810181811067ffffffffffffffff82111715612946576129456128ef565b5b80604052505050565b600061295961252b565b9050612965828261291e565b919050565b600067ffffffffffffffff821115612985576129846128ef565b5b602082029050602081019050919050565b600080fd5b60006129ae6129a98461296a565b61294f565b905080838252602082019050602084028301858111156129d1576129d0612996565b5b835b818110156129fa57806129e68882612782565b8452602084019350506020810190506129d3565b5050509392505050565b600082601f830112612a1957612a186128ea565b5b8135612a2984826020860161299b565b91505092915050565b600060208284031215612a4857612a47612535565b5b600082013567ffffffffffffffff811115612a6657612a6561253a565b5b612a7284828501612a04565b91505092915050565b612a84816125c4565b8114612a8f57600080fd5b50565b600081359050612aa181612a7b565b92915050565b60008060408385031215612abe57612abd612535565b5b6000612acc85828601612782565b9250506020612add85828601612a92565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612b0757612b066128ef565b5b612b1082612640565b9050602081019050919050565b82818337600083830152505050565b6000612b3f612b3a84612aec565b61294f565b905082815260208101848484011115612b5b57612b5a612ae7565b5b612b66848285612b1d565b509392505050565b600082601f830112612b8357612b826128ea565b5b8135612b93848260208601612b2c565b91505092915050565b60008060008060808587031215612bb657612bb5612535565b5b6000612bc487828801612782565b9450506020612bd587828801612782565b9350506040612be6878288016126cd565b925050606085013567ffffffffffffffff811115612c0757612c0661253a565b5b612c1387828801612b6e565b91505092959194509250565b600067ffffffffffffffff821115612c3a57612c396128ef565b5b612c4382612640565b9050602081019050919050565b6000612c63612c5e84612c1f565b61294f565b905082815260208101848484011115612c7f57612c7e612ae7565b5b612c8a848285612b1d565b509392505050565b600082601f830112612ca757612ca66128ea565b5b8135612cb7848260208601612c50565b91505092915050565b600060208284031215612cd657612cd5612535565b5b600082013567ffffffffffffffff811115612cf457612cf361253a565b5b612d0084828501612c92565b91505092915050565b60008060408385031215612d2057612d1f612535565b5b6000612d2e85828601612782565b9250506020612d3f85828601612782565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d9057607f821691505b602082108103612da357612da2612d49565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de3826126ac565b9150612dee836126ac565b9250828202612dfc816126ac565b91508282048414831517612e1357612e12612da9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e54826126ac565b9150612e5f836126ac565b925082612e6f57612e6e612e1a565b5b828204905092915050565b7f43616e6e6f7420476976652041776179204d6f7265205468616e204f6e65204360008201527f616e20486f6c642e2e2e00000000000000000000000000000000000000000000602082015250565b6000612ed6602a83612605565b9150612ee182612e7a565b604082019050919050565b60006020820190508181036000830152612f0581612ec9565b9050919050565b7f43616e6e6f74204d696e74204e6567617469766520546f6b656e730000000000600082015250565b6000612f42601b83612605565b9150612f4d82612f0c565b602082019050919050565b60006020820190508181036000830152612f7181612f35565b9050919050565b6000612f83826126ac565b9150612f8e836126ac565b9250828201905080821115612fa657612fa5612da9565b5b92915050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000612fe2601683612605565b9150612fed82612fac565b602082019050919050565b6000602082019050818103600083015261301181612fd5565b9050919050565b6000613023826126ac565b915061302e836126ac565b925082820390508181111561304657613045612da9565b5b92915050565b7f4d696e74696e67204e6f7420456e61626c656400000000000000000000000000600082015250565b6000613082601383612605565b915061308d8261304c565b602082019050919050565b600060208201905081810360008301526130b181613075565b9050919050565b7f496e76616c696420507269636500000000000000000000000000000000000000600082015250565b60006130ee600d83612605565b91506130f9826130b8565b602082019050919050565b6000602082019050818103600083015261311d816130e1565b9050919050565b7f596f752043616e6e6f74204d696e742054686174204d616e7920546f6b656e73600082015250565b600061315a602083612605565b915061316582613124565b602082019050919050565b600060208201905081810360008301526131898161314d565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b60006131c6600883612605565b91506131d182613190565b602082019050919050565b600060208201905081810360008301526131f5816131b9565b9050919050565b7f53746f6e6564204c697374204d696e74696e67204e6f7420456e61626c656400600082015250565b6000613232601f83612605565b915061323d826131fc565b602082019050919050565b6000602082019050818103600083015261326181613225565b9050919050565b7f596f7520417265204e6f74204f6e205468652053746f6e6564204c6973740000600082015250565b600061329e601e83612605565b91506132a982613268565b602082019050919050565b600060208201905081810360008301526132cd81613291565b9050919050565b7f596f75204861766520416c726561647920436c61696d656420596f757220537060008201527f6f74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613330602283612605565b915061333b826132d4565b604082019050919050565b6000602082019050818103600083015261335f81613323565b9050919050565b600081905092915050565b600061337c826125fa565b6133868185613366565b9350613396818560208601612616565b80840191505092915050565b60006133ae8285613371565b91506133ba8284613371565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006133fc600583613366565b9150613407826133c6565b600582019050919050565b600061341e8284613371565b9150613429826133ef565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061346e826126ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134a05761349f612da9565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261350d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134d0565b61351786836134d0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061355461354f61354a846126ac565b61352f565b6126ac565b9050919050565b6000819050919050565b61356e83613539565b61358261357a8261355b565b8484546134dd565b825550505050565b600090565b61359761358a565b6135a2818484613565565b505050565b5b818110156135c6576135bb60008261358f565b6001810190506135a8565b5050565b601f82111561360b576135dc816134ab565b6135e5846134c0565b810160208510156135f4578190505b613608613600856134c0565b8301826135a7565b50505b505050565b600082821c905092915050565b600061362e60001984600802613610565b1980831691505092915050565b6000613647838361361d565b9150826002028217905092915050565b613660826125fa565b67ffffffffffffffff811115613679576136786128ef565b5b6136838254612d78565b61368e8282856135ca565b600060209050601f8311600181146136c157600084156136af578287015190505b6136b9858261363b565b865550613721565b601f1984166136cf866134ab565b60005b828110156136f7578489015182556001820191506020850194506020810190506136d2565b868310156137145784890151613710601f89168261361d565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613785602683612605565b915061379082613729565b604082019050919050565b600060208201905081810360008301526137b481613778565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137f1602083612605565b91506137fc826137bb565b602082019050919050565b60006020820190508181036000830152613820816137e4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061384e82613827565b6138588185613832565b9350613868818560208601612616565b61387181612640565b840191505092915050565b60006080820190506138916000830187612741565b61389e6020830186612741565b6138ab6040830185612804565b81810360608301526138bd8184613843565b905095945050505050565b6000815190506138d78161256b565b92915050565b6000602082840312156138f3576138f2612535565b5b6000613901848285016138c8565b9150509291505056fea26469706673582212202ae1afb9f6823d64f252602a1c9034d3a222b9e7d6238d97c85ff1827d8df34464736f6c63430008110033

Deployed Bytecode Sourcemap

56714:8004:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61275:113;;;;;;;;;;;;;:::i;:::-;;63492:451;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30829:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32775:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32323:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57342:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24236:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42040:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63192:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56892:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62381:114;;;:::i;:::-;;33665:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57131:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30618:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57009:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25861:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2776:103;;;;;;;;;;;;;:::i;:::-;;61719:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61135:132;;;;;;;;;;;;;:::i;:::-;;57055:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60591:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2128:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30998:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61598:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59333:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33051:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56932:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59738:845;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33921:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61013:114;;;;;;;;;;;;;:::i;:::-;;62761:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62122:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61919:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57169:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61396:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33430:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57206:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3034:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61495:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61275:113;2014:13;:11;:13::i;:::-;61345:4:::1;61323:19;;:26;;;;;;;;;;;;;;;;;;61376:4;61360:13;;:20;;;;;;;;;;;;;;;;;;61275:113::o:0;63492:451::-;63595:4;63647:10;63632:25;;:11;:25;;;;:102;;;;63724:10;63709:25;;:11;:25;;;;63632:102;:179;;;;63801:10;63786:25;;:11;:25;;;;63632:179;:264;;;;63886:10;63871:25;;:11;:25;;;;63632:264;63612:284;;63492:451;;;:::o;30829:100::-;30883:13;30916:5;30909:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30829:100;:::o;32775:204::-;32843:7;32868:16;32876:7;32868;:16::i;:::-;32863:64;;32893:34;;;;;;;;;;;;;;32863:64;32947:15;:24;32963:7;32947:24;;;;;;;;;;;;;;;;;;;;;32940:31;;32775:204;;;:::o;32323:386::-;32396:13;32412:16;32420:7;32412;:16::i;:::-;32396:32;;32468:5;32445:28;;:19;:17;:19::i;:::-;:28;;;32441:175;;32493:44;32510:5;32517:19;:17;:19::i;:::-;32493:16;:44::i;:::-;32488:128;;32565:35;;;;;;;;;;;;;;32488:128;32441:175;32655:2;32628:15;:24;32644:7;32628:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32693:7;32689:2;32673:28;;32682:5;32673:28;;;;;;;;;;;;32385:324;32323:386;;:::o;57342:52::-;;;;;;;;;;;;;;;;;:::o;24236:315::-;24289:7;24517:15;:13;:15::i;:::-;24502:12;;24486:13;;:28;:46;24479:53;;24236:315;:::o;42040:2800::-;42174:27;42204;42223:7;42204:18;:27::i;:::-;42174:57;;42289:4;42248:45;;42264:19;42248:45;;;42244:86;;42302:28;;;;;;;;;;;;;;42244:86;42344:27;42373:23;42400:28;42420:7;42400:19;:28::i;:::-;42343:85;;;;42528:62;42547:15;42564:4;42570:19;:17;:19::i;:::-;42528:18;:62::i;:::-;42523:174;;42610:43;42627:4;42633:19;:17;:19::i;:::-;42610:16;:43::i;:::-;42605:92;;42662:35;;;;;;;;;;;;;;42605:92;42523:174;42728:1;42714:16;;:2;:16;;;42710:52;;42739:23;;;;;;;;;;;;;;42710:52;42775:43;42797:4;42803:2;42807:7;42816:1;42775:21;:43::i;:::-;42911:15;42908:160;;;43051:1;43030:19;43023:30;42908:160;43446:18;:24;43465:4;43446:24;;;;;;;;;;;;;;;;43444:26;;;;;;;;;;;;43515:18;:22;43534:2;43515:22;;;;;;;;;;;;;;;;43513:24;;;;;;;;;;;43837:145;43874:2;43922:45;43937:4;43943:2;43947:19;43922:14;:45::i;:::-;21464:8;43895:72;43837:18;:145::i;:::-;43808:17;:26;43826:7;43808:26;;;;;;;;;;;:174;;;;44152:1;21464:8;44102:19;:46;:51;44098:626;;44174:19;44206:1;44196:7;:11;44174:33;;44363:1;44329:17;:30;44347:11;44329:30;;;;;;;;;;;;:35;44325:384;;44467:13;;44452:11;:28;44448:242;;44647:19;44614:17;:30;44632:11;44614:30;;;;;;;;;;;:52;;;;44448:242;44325:384;44155:569;44098:626;44771:7;44767:2;44752:27;;44761:4;44752:27;;;;;;;;;;;;44790:42;44811:4;44817:2;44821:7;44830:1;44790:20;:42::i;:::-;42163:2677;;;42040:2800;;;:::o;63192:245::-;63299:7;63308;63347:11;63394:3;63374:17;;63361:10;:30;;;;:::i;:::-;:36;;;;:::i;:::-;63347:50;;63416:7;:5;:7::i;:::-;63425:3;63408:21;;;;;63192:245;;;;;:::o;56892:33::-;;;;;;;;;;;;;:::o;62381:114::-;2014:13;:11;:13::i;:::-;62447:7:::1;:5;:7::i;:::-;62439:25;;:48;62465:21;62439:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62381:114::o:0;33665:185::-;33803:39;33820:4;33826:2;33830:7;33803:39;;;;;;;;;;;;:16;:39::i;:::-;33665:185;;;:::o;57131:31::-;;;;:::o;30618:144::-;30682:7;30725:27;30744:7;30725:18;:27::i;:::-;30702:52;;30618:144;;;:::o;57009:39::-;;;;:::o;25861:224::-;25925:7;25966:1;25949:19;;:5;:19;;;25945:60;;25977:28;;;;;;;;;;;;;;25945:60;20416:13;26023:18;:25;26042:5;26023:25;;;;;;;;;;;;;;;;:54;26016:61;;25861:224;;;:::o;2776:103::-;2014:13;:11;:13::i;:::-;2841:30:::1;2868:1;2841:18;:30::i;:::-;2776:103::o:0;61719:192::-;2014:13;:11;:13::i;:::-;61810:12:::1;;61800:6;:22;;61792:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61897:6;61880:14;:23;;;;61719:192:::0;:::o;61135:132::-;2014:13;:11;:13::i;:::-;61224:19:::1;;;;;;;;;;;:34;;61254:4;61224:34;;;61246:5;61224:34;61202:19;;:56;;;;;;;;;;;;;;;;;;61135:132::o:0;57055:36::-;;;;:::o;60591:381::-;2014:13;:11;:13::i;:::-;60689:1:::1;60678:8;:12;60670:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;60765:13;:11;:13::i;:::-;60754:8;:24;;;;:::i;:::-;60741:9;;:37;;60733:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;60816:149;60834:1;60823:8;:12;60816:149;;;60852:62;60858:4;60875:12;;60864:8;:23;:49;;60905:8;60864:49;;;60890:12;;60864:49;60852:5;:62::i;:::-;60941:12;;60929:24;;;;;:::i;:::-;;;60816:149;;;60591:381:::0;;:::o;2128:87::-;2174:7;2201:6;;;;;;;;;;;2194:13;;2128:87;:::o;30998:104::-;31054:13;31087:7;31080:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30998:104;:::o;61598:113::-;2014:13;:11;:13::i;:::-;61693:10:::1;61680;:23;;;;;;;;;;;;:::i;:::-;;61598:113:::0;:::o;59333:397::-;59401:13;;;;;;;;;;;59393:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59481:9;59469:8;59457:9;;:20;;;;:::i;:::-;:33;;59449:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59567:12;;59538:25;59552:10;59538:13;:25::i;:::-;59527:8;:36;;;;:::i;:::-;:52;;59519:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;59662:9;;59651:8;59635:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;59627:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59695:27;59701:10;59713:8;59695:5;:27::i;:::-;59333:397;:::o;33051:308::-;33162:19;:17;:19::i;:::-;33150:31;;:8;:31;;;33146:61;;33190:17;;;;;;;;;;;;;;33146:61;33272:8;33220:18;:39;33239:19;:17;:19::i;:::-;33220:39;;;;;;;;;;;;;;;:49;33260:8;33220:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;33332:8;33296:55;;33311:19;:17;:19::i;:::-;33296:55;;;33342:8;33296:55;;;;;;:::i;:::-;;;;;;;;33051:308;;:::o;56932:39::-;;;;;;;;;;;;;:::o;59738:845::-;59816:19;;;;;;;;;;;59808:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59890:26;59905:10;59890:14;:26::i;:::-;59882:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59971:30;59990:10;59971:18;:30::i;:::-;59970:31;59962:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60099:12;;60070:25;60084:10;60070:13;:25::i;:::-;60059:8;:36;;;;:::i;:::-;:52;;60051:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;60194:9;;60183:8;60167:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;60159:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60290:14;;60257:17;:29;60275:10;60257:29;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;60315:33;60321:10;60333:14;;60315:5;:33::i;:::-;60371:14;;60359:26;;;;;:::i;:::-;;;60445:1;60434:8;:12;60430:146;;;60495:9;60483:8;60471:9;;:20;;;;:::i;:::-;:33;;60463:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60537:27;60543:10;60555:8;60537:5;:27::i;:::-;60430:146;59738:845;:::o;33921:399::-;34088:31;34101:4;34107:2;34111:7;34088:12;:31::i;:::-;34152:1;34134:2;:14;;;:19;34130:183;;34173:56;34204:4;34210:2;34214:7;34223:5;34173:30;:56::i;:::-;34168:145;;34257:40;;;;;;;;;;;;;;34168:145;34130:183;33921:399;;;;:::o;61013:114::-;2014:13;:11;:13::i;:::-;61090::::1;;;;;;;;;;;:28;;61114:4;61090:28;;;61106:5;61090:28;61074:13;;:44;;;;;;;;;;;;;;;;;;61013:114::o:0;62761:423::-;62834:13;62865:16;62873:7;62865;:16::i;:::-;62860:59;;62890:29;;;;;;;;;;;;;;62860:59;62930:21;62954:10;:8;:10::i;:::-;62930:34;;62975:19;63022:1;63003:7;62997:21;:26;:87;;;;;;;;;;;;;;;;;63050:7;63059:18;63069:7;63059:9;:18::i;:::-;63033:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62997:87;62975:109;;63127:1;63108:7;63102:21;:26;:74;;;;;;;;;;;;;;;;;63155:5;63138:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;63102:74;63095:81;;;;62761:423;;;:::o;62122:251::-;62181:4;62201:9;62213:1;62201:13;;62197:146;62220:10;:17;;;;62216:1;:21;62197:146;;;62271:10;62282:1;62271:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62263:21;;:4;:21;;;62259:73;;62312:4;62305:11;;;;;62259:73;62239:3;;;;;:::i;:::-;;;;62197:146;;;;62360:5;62353:12;;62122:251;;;;:::o;61919:195::-;61982:4;62030:14;;62003:17;:23;62021:4;62003:23;;;;;;;;;;;;;;;;:41;61999:85;;62068:4;62061:11;;;;61999:85;62101:5;62094:12;;61919:195;;;;:::o;57169:30::-;;;;:::o;61396:91::-;2014:13;:11;:13::i;:::-;61476:3:::1;61466:7;:13;;;;;;:::i;:::-;;61396:91:::0;:::o;33430:164::-;33527:4;33551:18;:25;33570:5;33551:25;;;;;;;;;;;;;;;:35;33577:8;33551:35;;;;;;;;;;;;;;;;;;;;;;;;;33544:42;;33430:164;;;;:::o;57206:31::-;;;;:::o;3034:201::-;2014:13;:11;:13::i;:::-;3143:1:::1;3123:22;;:8;:22;;::::0;3115:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3199:28;3218:8;3199:18;:28::i;:::-;3034:201:::0;:::o;61495:95::-;2014:13;:11;:13::i;:::-;61576:6:::1;61564:9;:18;;;;61495:95:::0;:::o;2293:132::-;2368:12;:10;:12::i;:::-;2357:23;;:7;:5;:7::i;:::-;:23;;;2349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2293:132::o;34575:273::-;34632:4;34688:7;34669:15;:13;:15::i;:::-;:26;;:66;;;;;34722:13;;34712:7;:23;34669:66;:152;;;;;34820:1;21186:8;34773:17;:26;34791:7;34773:26;;;;;;;;;;;;:43;:48;34669:152;34649:172;;34575:273;;;:::o;53136:105::-;53196:7;53223:10;53216:17;;53136:105;:::o;62652:101::-;62717:7;62744:1;62737:8;;62652:101;:::o;27535:1129::-;27602:7;27622:12;27637:7;27622:22;;27705:4;27686:15;:13;:15::i;:::-;:23;27682:915;;27739:13;;27732:4;:20;27728:869;;;27777:14;27794:17;:23;27812:4;27794:23;;;;;;;;;;;;27777:40;;27910:1;21186:8;27883:6;:23;:28;27879:699;;28402:113;28419:1;28409:6;:11;28402:113;;28462:17;:25;28480:6;;;;;;;28462:25;;;;;;;;;;;;28453:34;;28402:113;;;28548:6;28541:13;;;;;;27879:699;27754:843;27728:869;27682:915;28625:31;;;;;;;;;;;;;;27535:1129;;;;:::o;40376:652::-;40471:27;40500:23;40541:53;40597:15;40541:71;;40783:7;40777:4;40770:21;40818:22;40812:4;40805:36;40894:4;40888;40878:21;40855:44;;40990:19;40984:26;40965:45;;40721:300;40376:652;;;:::o;41141:645::-;41283:11;41445:15;41439:4;41435:26;41427:34;;41604:15;41593:9;41589:31;41576:44;;41751:15;41740:9;41737:30;41730:4;41719:9;41716:19;41713:55;41703:65;;41141:645;;;;;:::o;51969:159::-;;;;;:::o;50281:309::-;50416:7;50436:16;21587:3;50462:19;:40;;50436:67;;21587:3;50529:31;50540:4;50546:2;50550:9;50529:10;:31::i;:::-;50521:40;;:61;;50514:68;;;50281:309;;;;;:::o;30109:447::-;30189:14;30357:15;30350:5;30346:27;30337:36;;30531:5;30517:11;30493:22;30489:40;30486:51;30479:5;30476:62;30466:72;;30109:447;;;;:::o;52787:158::-;;;;;:::o;3395:191::-;3469:16;3488:6;;;;;;;;;;;3469:25;;3514:8;3505:6;;:17;;;;;;;;;;;;;;;;;;3569:8;3538:40;;3559:8;3538:40;;;;;;;;;;;;3458:128;3395:191;:::o;36406:1529::-;36471:20;36494:13;;36471:36;;36536:1;36522:16;;:2;:16;;;36518:48;;36547:19;;;;;;;;;;;;;;36518:48;36593:1;36581:8;:13;36577:44;;36603:18;;;;;;;;;;;;;;36577:44;36634:61;36664:1;36668:2;36672:12;36686:8;36634:21;:61::i;:::-;37177:1;20553:2;37148:1;:25;;37147:31;37135:8;:44;37109:18;:22;37128:2;37109:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;37456:139;37493:2;37547:33;37570:1;37574:2;37578:1;37547:14;:33::i;:::-;37514:30;37535:8;37514:20;:30::i;:::-;:66;37456:18;:139::i;:::-;37422:17;:31;37440:12;37422:31;;;;;;;;;;;:173;;;;37612:15;37630:12;37612:30;;37657:11;37686:8;37671:12;:23;37657:37;;37709:101;37761:9;;;;;;37757:2;37736:35;;37753:1;37736:35;;;;;;;;;;;;37805:3;37795:7;:13;37709:101;;37842:3;37826:13;:19;;;;36883:974;;37867:60;37896:1;37900:2;37904:12;37918:8;37867:20;:60::i;:::-;36460:1475;36406:1529;;:::o;26167:176::-;26228:7;20416:13;20553:2;26256:18;:25;26275:5;26256:25;;;;;;;;;;;;;;;;:49;;26255:80;26248:87;;26167:176;;;:::o;48791:716::-;48954:4;49000:2;48975:45;;;49021:19;:17;:19::i;:::-;49042:4;49048:7;49057:5;48975:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48971:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49275:1;49258:6;:13;:18;49254:235;;49304:40;;;;;;;;;;;;;;49254:235;49447:6;49441:13;49432:6;49428:2;49424:15;49417:38;48971:529;49144:54;;;49134:64;;;:6;:64;;;;49127:71;;;48791:716;;;;;;:::o;62536:108::-;62596:13;62629:7;62622:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62536:108;:::o;53347:1960::-;53404:17;53823:3;53816:4;53810:11;53806:21;53799:28;;53914:3;53908:4;53901:17;54020:3;54476:5;54606:1;54601:3;54597:11;54590:18;;54743:2;54737:4;54733:13;54729:2;54725:22;54720:3;54712:36;54784:2;54778:4;54774:13;54766:21;;54368:697;54803:4;54368:697;;;54994:1;54989:3;54985:11;54978:18;;55045:2;55039:4;55035:13;55031:2;55027:22;55022:3;55014:36;54898:2;54892:4;54888:13;54880:21;;54368:697;;;54372:430;55104:3;55099;55095:13;55219:2;55214:3;55210:12;55203:19;;55282:6;55277:3;55270:19;53443:1857;;53347:1960;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;51166:147::-;51303:6;51166:147;;;;;:::o;31939:322::-;32009:14;32240:1;32230:8;32227:15;32202:23;32198:45;32188:55;;31939:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:332::-;6803:4;6841:2;6830:9;6826:18;6818:26;;6854:71;6922:1;6911:9;6907:17;6898:6;6854:71;:::i;:::-;6935:72;7003:2;6992:9;6988:18;6979:6;6935:72;:::i;:::-;6682:332;;;;;:::o;7020:117::-;7129:1;7126;7119:12;7143:180;7191:77;7188:1;7181:88;7288:4;7285:1;7278:15;7312:4;7309:1;7302:15;7329:281;7412:27;7434:4;7412:27;:::i;:::-;7404:6;7400:40;7542:6;7530:10;7527:22;7506:18;7494:10;7491:34;7488:62;7485:88;;;7553:18;;:::i;:::-;7485:88;7593:10;7589:2;7582:22;7372:238;7329:281;;:::o;7616:129::-;7650:6;7677:20;;:::i;:::-;7667:30;;7706:33;7734:4;7726:6;7706:33;:::i;:::-;7616:129;;;:::o;7751:311::-;7828:4;7918:18;7910:6;7907:30;7904:56;;;7940:18;;:::i;:::-;7904:56;7990:4;7982:6;7978:17;7970:25;;8050:4;8044;8040:15;8032:23;;7751:311;;;:::o;8068:117::-;8177:1;8174;8167:12;8208:710;8304:5;8329:81;8345:64;8402:6;8345:64;:::i;:::-;8329:81;:::i;:::-;8320:90;;8430:5;8459:6;8452:5;8445:21;8493:4;8486:5;8482:16;8475:23;;8546:4;8538:6;8534:17;8526:6;8522:30;8575:3;8567:6;8564:15;8561:122;;;8594:79;;:::i;:::-;8561:122;8709:6;8692:220;8726:6;8721:3;8718:15;8692:220;;;8801:3;8830:37;8863:3;8851:10;8830:37;:::i;:::-;8825:3;8818:50;8897:4;8892:3;8888:14;8881:21;;8768:144;8752:4;8747:3;8743:14;8736:21;;8692:220;;;8696:21;8310:608;;8208:710;;;;;:::o;8941:370::-;9012:5;9061:3;9054:4;9046:6;9042:17;9038:27;9028:122;;9069:79;;:::i;:::-;9028:122;9186:6;9173:20;9211:94;9301:3;9293:6;9286:4;9278:6;9274:17;9211:94;:::i;:::-;9202:103;;9018:293;8941:370;;;;:::o;9317:539::-;9401:6;9450:2;9438:9;9429:7;9425:23;9421:32;9418:119;;;9456:79;;:::i;:::-;9418:119;9604:1;9593:9;9589:17;9576:31;9634:18;9626:6;9623:30;9620:117;;;9656:79;;:::i;:::-;9620:117;9761:78;9831:7;9822:6;9811:9;9807:22;9761:78;:::i;:::-;9751:88;;9547:302;9317:539;;;;:::o;9862:116::-;9932:21;9947:5;9932:21;:::i;:::-;9925:5;9922:32;9912:60;;9968:1;9965;9958:12;9912:60;9862:116;:::o;9984:133::-;10027:5;10065:6;10052:20;10043:29;;10081:30;10105:5;10081:30;:::i;:::-;9984:133;;;;:::o;10123:468::-;10188:6;10196;10245:2;10233:9;10224:7;10220:23;10216:32;10213:119;;;10251:79;;:::i;:::-;10213:119;10371:1;10396:53;10441:7;10432:6;10421:9;10417:22;10396:53;:::i;:::-;10386:63;;10342:117;10498:2;10524:50;10566:7;10557:6;10546:9;10542:22;10524:50;:::i;:::-;10514:60;;10469:115;10123:468;;;;;:::o;10597:117::-;10706:1;10703;10696:12;10720:307;10781:4;10871:18;10863:6;10860:30;10857:56;;;10893:18;;:::i;:::-;10857:56;10931:29;10953:6;10931:29;:::i;:::-;10923:37;;11015:4;11009;11005:15;10997:23;;10720:307;;;:::o;11033:146::-;11130:6;11125:3;11120;11107:30;11171:1;11162:6;11157:3;11153:16;11146:27;11033:146;;;:::o;11185:423::-;11262:5;11287:65;11303:48;11344:6;11303:48;:::i;:::-;11287:65;:::i;:::-;11278:74;;11375:6;11368:5;11361:21;11413:4;11406:5;11402:16;11451:3;11442:6;11437:3;11433:16;11430:25;11427:112;;;11458:79;;:::i;:::-;11427:112;11548:54;11595:6;11590:3;11585;11548:54;:::i;:::-;11268:340;11185:423;;;;;:::o;11627:338::-;11682:5;11731:3;11724:4;11716:6;11712:17;11708:27;11698:122;;11739:79;;:::i;:::-;11698:122;11856:6;11843:20;11881:78;11955:3;11947:6;11940:4;11932:6;11928:17;11881:78;:::i;:::-;11872:87;;11688:277;11627:338;;;;:::o;11971:943::-;12066:6;12074;12082;12090;12139:3;12127:9;12118:7;12114:23;12110:33;12107:120;;;12146:79;;:::i;:::-;12107:120;12266:1;12291:53;12336:7;12327:6;12316:9;12312:22;12291:53;:::i;:::-;12281:63;;12237:117;12393:2;12419:53;12464:7;12455:6;12444:9;12440:22;12419:53;:::i;:::-;12409:63;;12364:118;12521:2;12547:53;12592:7;12583:6;12572:9;12568:22;12547:53;:::i;:::-;12537:63;;12492:118;12677:2;12666:9;12662:18;12649:32;12708:18;12700:6;12697:30;12694:117;;;12730:79;;:::i;:::-;12694:117;12835:62;12889:7;12880:6;12869:9;12865:22;12835:62;:::i;:::-;12825:72;;12620:287;11971:943;;;;;;;:::o;12920:308::-;12982:4;13072:18;13064:6;13061:30;13058:56;;;13094:18;;:::i;:::-;13058:56;13132:29;13154:6;13132:29;:::i;:::-;13124:37;;13216:4;13210;13206:15;13198:23;;12920:308;;;:::o;13234:425::-;13312:5;13337:66;13353:49;13395:6;13353:49;:::i;:::-;13337:66;:::i;:::-;13328:75;;13426:6;13419:5;13412:21;13464:4;13457:5;13453:16;13502:3;13493:6;13488:3;13484:16;13481:25;13478:112;;;13509:79;;:::i;:::-;13478:112;13599:54;13646:6;13641:3;13636;13599:54;:::i;:::-;13318:341;13234:425;;;;;:::o;13679:340::-;13735:5;13784:3;13777:4;13769:6;13765:17;13761:27;13751:122;;13792:79;;:::i;:::-;13751:122;13909:6;13896:20;13934:79;14009:3;14001:6;13994:4;13986:6;13982:17;13934:79;:::i;:::-;13925:88;;13741:278;13679:340;;;;:::o;14025:509::-;14094:6;14143:2;14131:9;14122:7;14118:23;14114:32;14111:119;;;14149:79;;:::i;:::-;14111:119;14297:1;14286:9;14282:17;14269:31;14327:18;14319:6;14316:30;14313:117;;;14349:79;;:::i;:::-;14313:117;14454:63;14509:7;14500:6;14489:9;14485:22;14454:63;:::i;:::-;14444:73;;14240:287;14025:509;;;;:::o;14540:474::-;14608:6;14616;14665:2;14653:9;14644:7;14640:23;14636:32;14633:119;;;14671:79;;:::i;:::-;14633:119;14791:1;14816:53;14861:7;14852:6;14841:9;14837:22;14816:53;:::i;:::-;14806:63;;14762:117;14918:2;14944:53;14989:7;14980:6;14969:9;14965:22;14944:53;:::i;:::-;14934:63;;14889:118;14540:474;;;;;:::o;15020:180::-;15068:77;15065:1;15058:88;15165:4;15162:1;15155:15;15189:4;15186:1;15179:15;15206:320;15250:6;15287:1;15281:4;15277:12;15267:22;;15334:1;15328:4;15324:12;15355:18;15345:81;;15411:4;15403:6;15399:17;15389:27;;15345:81;15473:2;15465:6;15462:14;15442:18;15439:38;15436:84;;15492:18;;:::i;:::-;15436:84;15257:269;15206:320;;;:::o;15532:180::-;15580:77;15577:1;15570:88;15677:4;15674:1;15667:15;15701:4;15698:1;15691:15;15718:410;15758:7;15781:20;15799:1;15781:20;:::i;:::-;15776:25;;15815:20;15833:1;15815:20;:::i;:::-;15810:25;;15870:1;15867;15863:9;15892:30;15910:11;15892:30;:::i;:::-;15881:41;;16071:1;16062:7;16058:15;16055:1;16052:22;16032:1;16025:9;16005:83;15982:139;;16101:18;;:::i;:::-;15982:139;15766:362;15718:410;;;;:::o;16134:180::-;16182:77;16179:1;16172:88;16279:4;16276:1;16269:15;16303:4;16300:1;16293:15;16320:185;16360:1;16377:20;16395:1;16377:20;:::i;:::-;16372:25;;16411:20;16429:1;16411:20;:::i;:::-;16406:25;;16450:1;16440:35;;16455:18;;:::i;:::-;16440:35;16497:1;16494;16490:9;16485:14;;16320:185;;;;:::o;16511:229::-;16651:34;16647:1;16639:6;16635:14;16628:58;16720:12;16715:2;16707:6;16703:15;16696:37;16511:229;:::o;16746:366::-;16888:3;16909:67;16973:2;16968:3;16909:67;:::i;:::-;16902:74;;16985:93;17074:3;16985:93;:::i;:::-;17103:2;17098:3;17094:12;17087:19;;16746:366;;;:::o;17118:419::-;17284:4;17322:2;17311:9;17307:18;17299:26;;17371:9;17365:4;17361:20;17357:1;17346:9;17342:17;17335:47;17399:131;17525:4;17399:131;:::i;:::-;17391:139;;17118:419;;;:::o;17543:177::-;17683:29;17679:1;17671:6;17667:14;17660:53;17543:177;:::o;17726:366::-;17868:3;17889:67;17953:2;17948:3;17889:67;:::i;:::-;17882:74;;17965:93;18054:3;17965:93;:::i;:::-;18083:2;18078:3;18074:12;18067:19;;17726:366;;;:::o;18098:419::-;18264:4;18302:2;18291:9;18287:18;18279:26;;18351:9;18345:4;18341:20;18337:1;18326:9;18322:17;18315:47;18379:131;18505:4;18379:131;:::i;:::-;18371:139;;18098:419;;;:::o;18523:191::-;18563:3;18582:20;18600:1;18582:20;:::i;:::-;18577:25;;18616:20;18634:1;18616:20;:::i;:::-;18611:25;;18659:1;18656;18652:9;18645:16;;18680:3;18677:1;18674:10;18671:36;;;18687:18;;:::i;:::-;18671:36;18523:191;;;;:::o;18720:172::-;18860:24;18856:1;18848:6;18844:14;18837:48;18720:172;:::o;18898:366::-;19040:3;19061:67;19125:2;19120:3;19061:67;:::i;:::-;19054:74;;19137:93;19226:3;19137:93;:::i;:::-;19255:2;19250:3;19246:12;19239:19;;18898:366;;;:::o;19270:419::-;19436:4;19474:2;19463:9;19459:18;19451:26;;19523:9;19517:4;19513:20;19509:1;19498:9;19494:17;19487:47;19551:131;19677:4;19551:131;:::i;:::-;19543:139;;19270:419;;;:::o;19695:194::-;19735:4;19755:20;19773:1;19755:20;:::i;:::-;19750:25;;19789:20;19807:1;19789:20;:::i;:::-;19784:25;;19833:1;19830;19826:9;19818:17;;19857:1;19851:4;19848:11;19845:37;;;19862:18;;:::i;:::-;19845:37;19695:194;;;;:::o;19895:169::-;20035:21;20031:1;20023:6;20019:14;20012:45;19895:169;:::o;20070:366::-;20212:3;20233:67;20297:2;20292:3;20233:67;:::i;:::-;20226:74;;20309:93;20398:3;20309:93;:::i;:::-;20427:2;20422:3;20418:12;20411:19;;20070:366;;;:::o;20442:419::-;20608:4;20646:2;20635:9;20631:18;20623:26;;20695:9;20689:4;20685:20;20681:1;20670:9;20666:17;20659:47;20723:131;20849:4;20723:131;:::i;:::-;20715:139;;20442:419;;;:::o;20867:163::-;21007:15;21003:1;20995:6;20991:14;20984:39;20867:163;:::o;21036:366::-;21178:3;21199:67;21263:2;21258:3;21199:67;:::i;:::-;21192:74;;21275:93;21364:3;21275:93;:::i;:::-;21393:2;21388:3;21384:12;21377:19;;21036:366;;;:::o;21408:419::-;21574:4;21612:2;21601:9;21597:18;21589:26;;21661:9;21655:4;21651:20;21647:1;21636:9;21632:17;21625:47;21689:131;21815:4;21689:131;:::i;:::-;21681:139;;21408:419;;;:::o;21833:182::-;21973:34;21969:1;21961:6;21957:14;21950:58;21833:182;:::o;22021:366::-;22163:3;22184:67;22248:2;22243:3;22184:67;:::i;:::-;22177:74;;22260:93;22349:3;22260:93;:::i;:::-;22378:2;22373:3;22369:12;22362:19;;22021:366;;;:::o;22393:419::-;22559:4;22597:2;22586:9;22582:18;22574:26;;22646:9;22640:4;22636:20;22632:1;22621:9;22617:17;22610:47;22674:131;22800:4;22674:131;:::i;:::-;22666:139;;22393:419;;;:::o;22818:158::-;22958:10;22954:1;22946:6;22942:14;22935:34;22818:158;:::o;22982:365::-;23124:3;23145:66;23209:1;23204:3;23145:66;:::i;:::-;23138:73;;23220:93;23309:3;23220:93;:::i;:::-;23338:2;23333:3;23329:12;23322:19;;22982:365;;;:::o;23353:419::-;23519:4;23557:2;23546:9;23542:18;23534:26;;23606:9;23600:4;23596:20;23592:1;23581:9;23577:17;23570:47;23634:131;23760:4;23634:131;:::i;:::-;23626:139;;23353:419;;;:::o;23778:181::-;23918:33;23914:1;23906:6;23902:14;23895:57;23778:181;:::o;23965:366::-;24107:3;24128:67;24192:2;24187:3;24128:67;:::i;:::-;24121:74;;24204:93;24293:3;24204:93;:::i;:::-;24322:2;24317:3;24313:12;24306:19;;23965:366;;;:::o;24337:419::-;24503:4;24541:2;24530:9;24526:18;24518:26;;24590:9;24584:4;24580:20;24576:1;24565:9;24561:17;24554:47;24618:131;24744:4;24618:131;:::i;:::-;24610:139;;24337:419;;;:::o;24762:180::-;24902:32;24898:1;24890:6;24886:14;24879:56;24762:180;:::o;24948:366::-;25090:3;25111:67;25175:2;25170:3;25111:67;:::i;:::-;25104:74;;25187:93;25276:3;25187:93;:::i;:::-;25305:2;25300:3;25296:12;25289:19;;24948:366;;;:::o;25320:419::-;25486:4;25524:2;25513:9;25509:18;25501:26;;25573:9;25567:4;25563:20;25559:1;25548:9;25544:17;25537:47;25601:131;25727:4;25601:131;:::i;:::-;25593:139;;25320:419;;;:::o;25745:221::-;25885:34;25881:1;25873:6;25869:14;25862:58;25954:4;25949:2;25941:6;25937:15;25930:29;25745:221;:::o;25972:366::-;26114:3;26135:67;26199:2;26194:3;26135:67;:::i;:::-;26128:74;;26211:93;26300:3;26211:93;:::i;:::-;26329:2;26324:3;26320:12;26313:19;;25972:366;;;:::o;26344:419::-;26510:4;26548:2;26537:9;26533:18;26525:26;;26597:9;26591:4;26587:20;26583:1;26572:9;26568:17;26561:47;26625:131;26751:4;26625:131;:::i;:::-;26617:139;;26344:419;;;:::o;26769:148::-;26871:11;26908:3;26893:18;;26769:148;;;;:::o;26923:390::-;27029:3;27057:39;27090:5;27057:39;:::i;:::-;27112:89;27194:6;27189:3;27112:89;:::i;:::-;27105:96;;27210:65;27268:6;27263:3;27256:4;27249:5;27245:16;27210:65;:::i;:::-;27300:6;27295:3;27291:16;27284:23;;27033:280;26923:390;;;;:::o;27319:435::-;27499:3;27521:95;27612:3;27603:6;27521:95;:::i;:::-;27514:102;;27633:95;27724:3;27715:6;27633:95;:::i;:::-;27626:102;;27745:3;27738:10;;27319:435;;;;;:::o;27760:155::-;27900:7;27896:1;27888:6;27884:14;27877:31;27760:155;:::o;27921:400::-;28081:3;28102:84;28184:1;28179:3;28102:84;:::i;:::-;28095:91;;28195:93;28284:3;28195:93;:::i;:::-;28313:1;28308:3;28304:11;28297:18;;27921:400;;;:::o;28327:541::-;28560:3;28582:95;28673:3;28664:6;28582:95;:::i;:::-;28575:102;;28694:148;28838:3;28694:148;:::i;:::-;28687:155;;28859:3;28852:10;;28327:541;;;;:::o;28874:180::-;28922:77;28919:1;28912:88;29019:4;29016:1;29009:15;29043:4;29040:1;29033:15;29060:233;29099:3;29122:24;29140:5;29122:24;:::i;:::-;29113:33;;29168:66;29161:5;29158:77;29155:103;;29238:18;;:::i;:::-;29155:103;29285:1;29278:5;29274:13;29267:20;;29060:233;;;:::o;29299:141::-;29348:4;29371:3;29363:11;;29394:3;29391:1;29384:14;29428:4;29425:1;29415:18;29407:26;;29299:141;;;:::o;29446:93::-;29483:6;29530:2;29525;29518:5;29514:14;29510:23;29500:33;;29446:93;;;:::o;29545:107::-;29589:8;29639:5;29633:4;29629:16;29608:37;;29545:107;;;;:::o;29658:393::-;29727:6;29777:1;29765:10;29761:18;29800:97;29830:66;29819:9;29800:97;:::i;:::-;29918:39;29948:8;29937:9;29918:39;:::i;:::-;29906:51;;29990:4;29986:9;29979:5;29975:21;29966:30;;30039:4;30029:8;30025:19;30018:5;30015:30;30005:40;;29734:317;;29658:393;;;;;:::o;30057:60::-;30085:3;30106:5;30099:12;;30057:60;;;:::o;30123:142::-;30173:9;30206:53;30224:34;30233:24;30251:5;30233:24;:::i;:::-;30224:34;:::i;:::-;30206:53;:::i;:::-;30193:66;;30123:142;;;:::o;30271:75::-;30314:3;30335:5;30328:12;;30271:75;;;:::o;30352:269::-;30462:39;30493:7;30462:39;:::i;:::-;30523:91;30572:41;30596:16;30572:41;:::i;:::-;30564:6;30557:4;30551:11;30523:91;:::i;:::-;30517:4;30510:105;30428:193;30352:269;;;:::o;30627:73::-;30672:3;30627:73;:::o;30706:189::-;30783:32;;:::i;:::-;30824:65;30882:6;30874;30868:4;30824:65;:::i;:::-;30759:136;30706:189;;:::o;30901:186::-;30961:120;30978:3;30971:5;30968:14;30961:120;;;31032:39;31069:1;31062:5;31032:39;:::i;:::-;31005:1;30998:5;30994:13;30985:22;;30961:120;;;30901:186;;:::o;31093:543::-;31194:2;31189:3;31186:11;31183:446;;;31228:38;31260:5;31228:38;:::i;:::-;31312:29;31330:10;31312:29;:::i;:::-;31302:8;31298:44;31495:2;31483:10;31480:18;31477:49;;;31516:8;31501:23;;31477:49;31539:80;31595:22;31613:3;31595:22;:::i;:::-;31585:8;31581:37;31568:11;31539:80;:::i;:::-;31198:431;;31183:446;31093:543;;;:::o;31642:117::-;31696:8;31746:5;31740:4;31736:16;31715:37;;31642:117;;;;:::o;31765:169::-;31809:6;31842:51;31890:1;31886:6;31878:5;31875:1;31871:13;31842:51;:::i;:::-;31838:56;31923:4;31917;31913:15;31903:25;;31816:118;31765:169;;;;:::o;31939:295::-;32015:4;32161:29;32186:3;32180:4;32161:29;:::i;:::-;32153:37;;32223:3;32220:1;32216:11;32210:4;32207:21;32199:29;;31939:295;;;;:::o;32239:1395::-;32356:37;32389:3;32356:37;:::i;:::-;32458:18;32450:6;32447:30;32444:56;;;32480:18;;:::i;:::-;32444:56;32524:38;32556:4;32550:11;32524:38;:::i;:::-;32609:67;32669:6;32661;32655:4;32609:67;:::i;:::-;32703:1;32727:4;32714:17;;32759:2;32751:6;32748:14;32776:1;32771:618;;;;33433:1;33450:6;33447:77;;;33499:9;33494:3;33490:19;33484:26;33475:35;;33447:77;33550:67;33610:6;33603:5;33550:67;:::i;:::-;33544:4;33537:81;33406:222;32741:887;;32771:618;32823:4;32819:9;32811:6;32807:22;32857:37;32889:4;32857:37;:::i;:::-;32916:1;32930:208;32944:7;32941:1;32938:14;32930:208;;;33023:9;33018:3;33014:19;33008:26;33000:6;32993:42;33074:1;33066:6;33062:14;33052:24;;33121:2;33110:9;33106:18;33093:31;;32967:4;32964:1;32960:12;32955:17;;32930:208;;;33166:6;33157:7;33154:19;33151:179;;;33224:9;33219:3;33215:19;33209:26;33267:48;33309:4;33301:6;33297:17;33286:9;33267:48;:::i;:::-;33259:6;33252:64;33174:156;33151:179;33376:1;33372;33364:6;33360:14;33356:22;33350:4;33343:36;32778:611;;;32741:887;;32331:1303;;;32239:1395;;:::o;33640:225::-;33780:34;33776:1;33768:6;33764:14;33757:58;33849:8;33844:2;33836:6;33832:15;33825:33;33640:225;:::o;33871:366::-;34013:3;34034:67;34098:2;34093:3;34034:67;:::i;:::-;34027:74;;34110:93;34199:3;34110:93;:::i;:::-;34228:2;34223:3;34219:12;34212:19;;33871:366;;;:::o;34243:419::-;34409:4;34447:2;34436:9;34432:18;34424:26;;34496:9;34490:4;34486:20;34482:1;34471:9;34467:17;34460:47;34524:131;34650:4;34524:131;:::i;:::-;34516:139;;34243:419;;;:::o;34668:182::-;34808:34;34804:1;34796:6;34792:14;34785:58;34668:182;:::o;34856:366::-;34998:3;35019:67;35083:2;35078:3;35019:67;:::i;:::-;35012:74;;35095:93;35184:3;35095:93;:::i;:::-;35213:2;35208:3;35204:12;35197:19;;34856:366;;;:::o;35228:419::-;35394:4;35432:2;35421:9;35417:18;35409:26;;35481:9;35475:4;35471:20;35467:1;35456:9;35452:17;35445:47;35509:131;35635:4;35509:131;:::i;:::-;35501:139;;35228:419;;;:::o;35653:98::-;35704:6;35738:5;35732:12;35722:22;;35653:98;;;:::o;35757:168::-;35840:11;35874:6;35869:3;35862:19;35914:4;35909:3;35905:14;35890:29;;35757:168;;;;:::o;35931:373::-;36017:3;36045:38;36077:5;36045:38;:::i;:::-;36099:70;36162:6;36157:3;36099:70;:::i;:::-;36092:77;;36178:65;36236:6;36231:3;36224:4;36217:5;36213:16;36178:65;:::i;:::-;36268:29;36290:6;36268:29;:::i;:::-;36263:3;36259:39;36252:46;;36021:283;35931:373;;;;:::o;36310:640::-;36505:4;36543:3;36532:9;36528:19;36520:27;;36557:71;36625:1;36614:9;36610:17;36601:6;36557:71;:::i;:::-;36638:72;36706:2;36695:9;36691:18;36682:6;36638:72;:::i;:::-;36720;36788:2;36777:9;36773:18;36764:6;36720:72;:::i;:::-;36839:9;36833:4;36829:20;36824:2;36813:9;36809:18;36802:48;36867:76;36938:4;36929:6;36867:76;:::i;:::-;36859:84;;36310:640;;;;;;;:::o;36956:141::-;37012:5;37043:6;37037:13;37028:22;;37059:32;37085:5;37059:32;:::i;:::-;36956:141;;;;:::o;37103:349::-;37172:6;37221:2;37209:9;37200:7;37196:23;37192:32;37189:119;;;37227:79;;:::i;:::-;37189:119;37347:1;37372:63;37427:7;37418:6;37407:9;37403:22;37372:63;:::i;:::-;37362:73;;37318:127;37103:349;;;;:::o

Swarm Source

ipfs://2ae1afb9f6823d64f252602a1c9034d3a222b9e7d6238d97c85ff1827d8df344
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.