ETH Price: $3,654.16 (-1.99%)

Token

ERC-20: Eggs Nfts By xx (Eggs Nfts By xx)
 

Overview

Max Total Supply

118 Eggs Nfts By xx

Holders

67

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Eggs Nfts By xx
0x5c7cc29b4f47c67c9117230a498b49b25c776012
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:
WIKIFREE

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-21
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
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();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores 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 via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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](https://eips.ethereum.org/EIPS/eip-2309) 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.2.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 virtual {
        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;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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 '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 virtual {
        uint256 startTokenId = _currentIndex;
        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 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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 virtual {
        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 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 virtual {
        _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 Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(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++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        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 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 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;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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.
                // The ASCII index of the '0' character is 48.
                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/freemint.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;




contract WIKIFREE is Ownable, ERC721A {
    uint256 constant public maxSupply = 9999;
    uint256 public publicPrice = 0.005 ether;
    uint256 constant public limitAmountPerTx = 5;
    uint256 constant public limitAmountPerWallet = 5;
    uint256 public totalTeamSupply;
    string public revealedURI = "ipfs:// ----IFPS---/";
    bool public paused = true;
    bool public freeSale = true;
    bool public publicSale = true;
    uint256 public freecount = 1;
    mapping(address => bool) public userMintedFree;
    mapping(address => uint256) public mintedWallets;
    string private _baseTokenUri;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _revealedURI
    ) ERC721A(_name, _symbol) {
        revealedURI = _revealedURI;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }
    
    function freeMint(uint256 quantity) external payable mintCompliance(quantity) {
        require(freeSale, "Free sale inactive");
        require(!userMintedFree[msg.sender], "User max free limit");
        require(maxSupply > totalSupply(), "sold out");
        uint256 currMints = mintedWallets[msg.sender];
        if (quantity == 1 && currMints == 0) {
            mintedWallets[msg.sender]++;
            _safeMint(msg.sender, 1);    
        } else {
            if (currMints == 0 && quantity > 1) {
               require(publicSale, "Public sale inactive1");
                require(msg.value >= (quantity-1) * publicPrice, "give me more money1");
                require(quantity <= limitAmountPerTx, "Quantity too high1");
                require(quantity <= limitAmountPerWallet, "u wanna mint too many1");
                mintedWallets[msg.sender] = quantity;
                _safeMint(msg.sender, quantity);
            } else {
                require(publicSale, "Public sale inactive");
                require(msg.value >= (quantity) * publicPrice, "give me more money");
                require(quantity <= limitAmountPerTx, "Quantity too high");
                require(currMints + quantity  <= limitAmountPerWallet, "u wanna mint too many");
                mintedWallets[msg.sender] = (currMints + quantity);
                _safeMint(msg.sender, quantity);
            }
            
        }
    }

    function publicMint(uint256 quantity) external payable mintCompliance(quantity) {
        require(publicSale, "Public sale inactive");
        require(msg.value >= quantity * publicPrice, "give me more money");
        require(quantity <= limitAmountPerTx, "Quantity too high");
        uint256 currMints = mintedWallets[msg.sender];
        require(currMints + quantity <= limitAmountPerWallet, "u wanna mint too many");
        mintedWallets[msg.sender] = (currMints + quantity);
        _safeMint(msg.sender, quantity);
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            address currentTokenOwner = ownerOf(currentTokenId);
            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
                ownedTokenIndex++;
            }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

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

    function setBaseUri(string memory _baseUri) external onlyOwner {
        _baseTokenUri = _baseUri;
    }

    function contractURI() public view returns (string memory) {
        return revealedURI;
    }

    function setPublicPrice(uint256 _publicPrice) public onlyOwner {
        publicPrice = _publicPrice;
    }

    function setBaseURI(string memory _baseUri) public onlyOwner {
        revealedURI = _baseUri;
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        revealedURI = _contractURI;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(revealedURI, Strings.toString(_tokenId), ".json"));
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function setPublicEnabled(bool _state) public onlyOwner {
        publicSale = _state;
        freeSale = !_state;
    }
    function setFreeEnabled(bool _state) public onlyOwner {
        freeSale = _state;
        publicSale = !_state;
    }
    

    function mintToUser(uint256 quantity, address receiver) public onlyOwner mintCompliance(quantity) {
        _safeMint(receiver, quantity);
    }

    function withdrawFundsToAddress(address _address, uint256 amount) external onlyOwner {
        (bool success, ) =_address.call{value: amount}("");
        require(success, "Transfer failed.");
    }

    modifier mintCompliance(uint256 quantity) {
        require(!paused, "Contract is paused");
        require(totalSupply() + quantity <= maxSupply, "you cant become ugly anymore");
        require(tx.origin == msg.sender, "No contract minting");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_revealedURI","type":"string"}],"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freecount","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":"limitAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitAmountPerWallet","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"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWallets","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setFreeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTeamSupply","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":[{"internalType":"address","name":"","type":"address"}],"name":"userMintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFundsToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526611c37937e080006009556040518060400160405280601481526020017f697066733a2f2f202d2d2d2d494650532d2d2d2f000000000000000000000000815250600b90805190602001906200005c92919062000249565b506001600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff0219169083151502179055506001600c60026101000a81548160ff0219169083151502179055506001600d55348015620000c057600080fd5b50604051620047f7380380620047f78339818101604052810190620000e6919062000377565b828262000108620000fc6200017460201b60201c565b6200017c60201b60201c565b81600390805190602001906200012092919062000249565b5080600490805190602001906200013992919062000249565b506200014a6200024060201b60201c565b600181905550505080600b90805190602001906200016a92919062000249565b50505050620005b4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8280546200025790620004c5565b90600052602060002090601f0160209004810192826200027b5760008555620002c7565b82601f106200029657805160ff1916838001178555620002c7565b82800160010185558215620002c7579182015b82811115620002c6578251825591602001919060010190620002a9565b5b509050620002d69190620002da565b5090565b5b80821115620002f5576000816000905550600101620002db565b5090565b6000620003106200030a8462000459565b62000430565b9050828152602081018484840111156200032f576200032e62000594565b5b6200033c8482856200048f565b509392505050565b600082601f8301126200035c576200035b6200058f565b5b81516200036e848260208601620002f9565b91505092915050565b6000806000606084860312156200039357620003926200059e565b5b600084015167ffffffffffffffff811115620003b457620003b362000599565b5b620003c28682870162000344565b935050602084015167ffffffffffffffff811115620003e657620003e562000599565b5b620003f48682870162000344565b925050604084015167ffffffffffffffff81111562000418576200041762000599565b5b620004268682870162000344565b9150509250925092565b60006200043c6200044f565b90506200044a8282620004fb565b919050565b6000604051905090565b600067ffffffffffffffff82111562000477576200047662000560565b5b6200048282620005a3565b9050602081019050919050565b60005b83811015620004af57808201518184015260208101905062000492565b83811115620004bf576000848401525b50505050565b60006002820490506001821680620004de57607f821691505b60208210811415620004f557620004f462000531565b5b50919050565b6200050682620005a3565b810181811067ffffffffffffffff8211171562000528576200052762000560565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61423380620005c46000396000f3fe6080604052600436106102515760003560e01c806388dedc1411610139578063a945bf80116100b6578063c87b56dd1161007a578063c87b56dd14610892578063d5abeb01146108cf578063e8a3d485146108fa578063e985e9c514610925578063f2fde38b14610962578063f7e8d6ea1461098b57610251565b8063a945bf80146107ad578063abc025d1146107d8578063ada7c4ed14610803578063b88d4fde14610840578063c62752551461086957610251565b8063938e3d7b116100fd578063938e3d7b146106dc57806395d89b4114610705578063a0bcfc7f14610730578063a22cb46514610759578063a4b41a151461078257610251565b806388dedc14146106095780638942bbff146106325780638da5cb5b1461065d5780639007bd721461068857806390134eb7146106b157610251565b806342842e0e116101d25780636352211e116101965780636352211e146104f657806364f640761461053357806370a0823114610570578063715018a6146105ad5780637af3a1af146105c45780637c928fe9146105ed57610251565b806342842e0e14610413578063438b63001461043c5780634f7f89761461047957806355f804b3146104a25780635c975abb146104cb57610251565b8063170594c611610219578063170594c61461034d57806318160ddd1461037857806323b872dd146103a35780632db11544146103cc57806333bc1c5c146103e857610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806316c38b3c14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613067565b6109b6565b60405161028a91906136d4565b60405180910390f35b34801561029f57600080fd5b506102a8610a48565b6040516102b591906136ef565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e0919061310a565b610ada565b6040516102f2919061364b565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190612ffa565b610b59565b005b34801561033057600080fd5b5061034b6004803603810190610346919061303a565b610c9d565b005b34801561035957600080fd5b50610362610cc2565b60405161036f9190613951565b60405180910390f35b34801561038457600080fd5b5061038d610cc8565b60405161039a9190613951565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612ee4565b610cdf565b005b6103e660048036038101906103e1919061310a565b611004565b005b3480156103f457600080fd5b506103fd6112ee565b60405161040a91906136d4565b60405180910390f35b34801561041f57600080fd5b5061043a60048036038101906104359190612ee4565b611301565b005b34801561044857600080fd5b50610463600480360381019061045e9190612e77565b611321565b60405161047091906136b2565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190612ffa565b61142c565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906130c1565b6114e5565b005b3480156104d757600080fd5b506104e0611507565b6040516104ed91906136d4565b60405180910390f35b34801561050257600080fd5b5061051d6004803603810190610518919061310a565b61151a565b60405161052a919061364b565b60405180910390f35b34801561053f57600080fd5b5061055a60048036038101906105559190612e77565b61152c565b60405161056791906136d4565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190612e77565b61154c565b6040516105a49190613951565b60405180910390f35b3480156105b957600080fd5b506105c2611605565b005b3480156105d057600080fd5b506105eb60048036038101906105e6919061303a565b611619565b005b6106076004803603810190610602919061310a565b611659565b005b34801561061557600080fd5b50610630600480360381019061062b919061303a565b611c81565b005b34801561063e57600080fd5b50610647611cc1565b6040516106549190613951565b60405180910390f35b34801561066957600080fd5b50610672611cc6565b60405161067f919061364b565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613137565b611cef565b005b3480156106bd57600080fd5b506106c6611e1c565b6040516106d39190613951565b60405180910390f35b3480156106e857600080fd5b5061070360048036038101906106fe91906130c1565b611e22565b005b34801561071157600080fd5b5061071a611e44565b60405161072791906136ef565b60405180910390f35b34801561073c57600080fd5b50610757600480360381019061075291906130c1565b611ed6565b005b34801561076557600080fd5b50610780600480360381019061077b9190612fba565b611ef8565b005b34801561078e57600080fd5b50610797612070565b6040516107a491906136d4565b60405180910390f35b3480156107b957600080fd5b506107c2612083565b6040516107cf9190613951565b60405180910390f35b3480156107e457600080fd5b506107ed612089565b6040516107fa9190613951565b60405180910390f35b34801561080f57600080fd5b5061082a60048036038101906108259190612e77565b61208e565b6040516108379190613951565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190612f37565b6120a6565b005b34801561087557600080fd5b50610890600480360381019061088b919061310a565b612119565b005b34801561089e57600080fd5b506108b960048036038101906108b4919061310a565b61212b565b6040516108c691906136ef565b60405180910390f35b3480156108db57600080fd5b506108e46121a7565b6040516108f19190613951565b60405180910390f35b34801561090657600080fd5b5061090f6121ad565b60405161091c91906136ef565b60405180910390f35b34801561093157600080fd5b5061094c60048036038101906109479190612ea4565b61223f565b60405161095991906136d4565b60405180910390f35b34801561096e57600080fd5b5061098960048036038101906109849190612e77565b6122d3565b005b34801561099757600080fd5b506109a0612357565b6040516109ad91906136ef565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a415750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a5790613c5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8390613c5a565b8015610ad05780601f10610aa557610100808354040283529160200191610ad0565b820191906000526020600020905b815481529060010190602001808311610ab357829003601f168201915b5050505050905090565b6000610ae5826123e5565b610b1b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b648261151a565b90508073ffffffffffffffffffffffffffffffffffffffff16610b85612444565b73ffffffffffffffffffffffffffffffffffffffff1614610be857610bb181610bac612444565b61223f565b610be7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610ca561244c565b80600c60006101000a81548160ff02191690831515021790555050565b600a5481565b6000610cd26124ca565b6002546001540303905090565b6000610cea826124d3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d51576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d5d846125a1565b91509150610d738187610d6e612444565b6125c8565b610dbf57610d8886610d83612444565b61223f565b610dbe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e26576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e33868686600161260c565b8015610e3e57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f0c85610ee8888887612612565b7c02000000000000000000000000000000000000000000000000000000001761263a565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f94576000600185019050600060056000838152602001908152602001600020541415610f92576001548114610f91578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ffc8686866001612665565b505050505050565b80600c60009054906101000a900460ff1615611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c90613931565b60405180910390fd5b61270f81611061610cc8565b61106b9190613a8f565b11156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390613711565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111190613771565b60405180910390fd5b600c60029054906101000a900460ff16611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116090613891565b60405180910390fd5b600954826111779190613b16565b3410156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b0906138b1565b60405180910390fd5b60058211156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f4906138d1565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005838261124f9190613a8f565b1115611290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611287906137d1565b60405180910390fd5b828161129c9190613a8f565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112e9338461266b565b505050565b600c60029054906101000a900460ff1681565b61131c838383604051806020016040528060008152506120a6565b505050565b6060600061132e8361154c565b905060008167ffffffffffffffff81111561134c5761134b613df3565b5b60405190808252806020026020018201604052801561137a5781602001602082028036833780820191505090505b50905060006001905060005b8381108015611397575061270f8211155b156114205760006113a78361151a565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561140c57828483815181106113f1576113f0613dc4565b5b602002602001018181525050818061140890613cbd565b9250505b828061141790613cbd565b93505050611386565b82945050505050919050565b61143461244c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161145a90613636565b60006040518083038185875af1925050503d8060008114611497576040519150601f19603f3d011682016040523d82523d6000602084013e61149c565b606091505b50509050806114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d7906138f1565b60405180910390fd5b505050565b6114ed61244c565b80600b9080519060200190611503929190612c8b565b5050565b600c60009054906101000a900460ff1681565b6000611525826124d3565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61160d61244c565b6116176000612689565b565b61162161244c565b80600c60026101000a81548160ff0219169083151502179055508015600c60016101000a81548160ff02191690831515021790555050565b80600c60009054906101000a900460ff16156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613931565b60405180910390fd5b61270f816116b6610cc8565b6116c09190613a8f565b1115611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613711565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690613771565b60405180910390fd5b600c60019054906101000a900460ff166117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b5906137f1565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561184b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184290613851565b60405180910390fd5b611853610cc8565b61270f11611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90613791565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001831480156118ea5750600081145b1561195457600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061193f90613cbd565b919050555061194f33600161266b565b611c7c565b6000811480156119645750600183115b15611aef57600c60029054906101000a900460ff166119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90613731565b60405180910390fd5b6009546001846119c89190613b70565b6119d29190613b16565b341015611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b90613911565b60405180910390fd5b6005831115611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f906137b1565b60405180910390fd5b6005831115611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390613831565b60405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611aea338461266b565b611c7b565b600c60029054906101000a900460ff16611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3590613891565b60405180910390fd5b60095483611b4c9190613b16565b341015611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906138b1565b60405180910390fd5b6005831115611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906138d1565b60405180910390fd5b60058382611be09190613a8f565b1115611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c18906137d1565b60405180910390fd5b8281611c2d9190613a8f565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c7a338461266b565b5b5b505050565b611c8961244c565b80600c60016101000a81548160ff0219169083151502179055508015600c60026101000a81548160ff02191690831515021790555050565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611cf761244c565b81600c60009054906101000a900460ff1615611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90613931565b60405180910390fd5b61270f81611d54610cc8565b611d5e9190613a8f565b1115611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613711565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0490613771565b60405180910390fd5b611e17828461266b565b505050565b600d5481565b611e2a61244c565b80600b9080519060200190611e40929190612c8b565b5050565b606060048054611e5390613c5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7f90613c5a565b8015611ecc5780601f10611ea157610100808354040283529160200191611ecc565b820191906000526020600020905b815481529060010190602001808311611eaf57829003601f168201915b5050505050905090565b611ede61244c565b8060109080519060200190611ef4929190612c8b565b5050565b611f00612444565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f65576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611f72612444565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201f612444565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161206491906136d4565b60405180910390a35050565b600c60019054906101000a900460ff1681565b60095481565b600581565b600f6020528060005260406000206000915090505481565b6120b1848484610cdf565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612113576120dc8484848461274d565b612112576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61212161244c565b8060098190555050565b6060612136826123e5565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90613871565b60405180910390fd5b600b612180836128ad565b604051602001612191929190613607565b6040516020818303038152906040529050919050565b61270f81565b6060600b80546121bc90613c5a565b80601f01602080910402602001604051908101604052809291908181526020018280546121e890613c5a565b80156122355780601f1061220a57610100808354040283529160200191612235565b820191906000526020600020905b81548152906001019060200180831161221857829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122db61244c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561234b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234290613751565b60405180910390fd5b61235481612689565b50565b600b805461236490613c5a565b80601f016020809104026020016040519081016040528092919081815260200182805461239090613c5a565b80156123dd5780601f106123b2576101008083540402835291602001916123dd565b820191906000526020600020905b8154815290600101906020018083116123c057829003601f168201915b505050505081565b6000816123f06124ca565b111580156123ff575060015482105b801561243d575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b612454612a0e565b73ffffffffffffffffffffffffffffffffffffffff16612472611cc6565b73ffffffffffffffffffffffffffffffffffffffff16146124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90613811565b60405180910390fd5b565b60006001905090565b600080829050806124e26124ca565b1161256a576001548110156125695760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612567575b600081141561255d576005600083600190039350838152602001908152602001600020549050612532565b809250505061259c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612629868684612a16565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612685828260405180602001604052806000815250612a1f565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612773612444565b8786866040518563ffffffff1660e01b81526004016127959493929190613666565b602060405180830381600087803b1580156127af57600080fd5b505af19250505080156127e057506040513d601f19601f820116820180604052508101906127dd9190613094565b60015b61285a573d8060008114612810576040519150601f19603f3d011682016040523d82523d6000602084013e612815565b606091505b50600081511415612852576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156128f5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a09565b600082905060005b6000821461292757808061291090613cbd565b915050600a826129209190613ae5565b91506128fd565b60008167ffffffffffffffff81111561294357612942613df3565b5b6040519080825280601f01601f1916602001820160405280156129755781602001600182028036833780820191505090505b5090505b60008514612a025760018261298e9190613b70565b9150600a8561299d9190613d06565b60306129a99190613a8f565b60f81b8183815181106129bf576129be613dc4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129fb9190613ae5565b9450612979565b8093505050505b919050565b600033905090565b60009392505050565b612a298383612abd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ab85760006001549050600083820390505b612a6a600086838060010194508661274d565b612aa0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a57578160015414612ab557600080fd5b50505b505050565b600060015490506000821415612aff576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b0c600084838561260c565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b8383612b746000866000612612565b612b7d85612c7b565b1761263a565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c2457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612be9565b506000821415612c60576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c766000848385612665565b505050565b60006001821460e11b9050919050565b828054612c9790613c5a565b90600052602060002090601f016020900481019282612cb95760008555612d00565b82601f10612cd257805160ff1916838001178555612d00565b82800160010185558215612d00579182015b82811115612cff578251825591602001919060010190612ce4565b5b509050612d0d9190612d11565b5090565b5b80821115612d2a576000816000905550600101612d12565b5090565b6000612d41612d3c84613991565b61396c565b905082815260208101848484011115612d5d57612d5c613e27565b5b612d68848285613c18565b509392505050565b6000612d83612d7e846139c2565b61396c565b905082815260208101848484011115612d9f57612d9e613e27565b5b612daa848285613c18565b509392505050565b600081359050612dc1816141a1565b92915050565b600081359050612dd6816141b8565b92915050565b600081359050612deb816141cf565b92915050565b600081519050612e00816141cf565b92915050565b600082601f830112612e1b57612e1a613e22565b5b8135612e2b848260208601612d2e565b91505092915050565b600082601f830112612e4957612e48613e22565b5b8135612e59848260208601612d70565b91505092915050565b600081359050612e71816141e6565b92915050565b600060208284031215612e8d57612e8c613e31565b5b6000612e9b84828501612db2565b91505092915050565b60008060408385031215612ebb57612eba613e31565b5b6000612ec985828601612db2565b9250506020612eda85828601612db2565b9150509250929050565b600080600060608486031215612efd57612efc613e31565b5b6000612f0b86828701612db2565b9350506020612f1c86828701612db2565b9250506040612f2d86828701612e62565b9150509250925092565b60008060008060808587031215612f5157612f50613e31565b5b6000612f5f87828801612db2565b9450506020612f7087828801612db2565b9350506040612f8187828801612e62565b925050606085013567ffffffffffffffff811115612fa257612fa1613e2c565b5b612fae87828801612e06565b91505092959194509250565b60008060408385031215612fd157612fd0613e31565b5b6000612fdf85828601612db2565b9250506020612ff085828601612dc7565b9150509250929050565b6000806040838503121561301157613010613e31565b5b600061301f85828601612db2565b925050602061303085828601612e62565b9150509250929050565b6000602082840312156130505761304f613e31565b5b600061305e84828501612dc7565b91505092915050565b60006020828403121561307d5761307c613e31565b5b600061308b84828501612ddc565b91505092915050565b6000602082840312156130aa576130a9613e31565b5b60006130b884828501612df1565b91505092915050565b6000602082840312156130d7576130d6613e31565b5b600082013567ffffffffffffffff8111156130f5576130f4613e2c565b5b61310184828501612e34565b91505092915050565b6000602082840312156131205761311f613e31565b5b600061312e84828501612e62565b91505092915050565b6000806040838503121561314e5761314d613e31565b5b600061315c85828601612e62565b925050602061316d85828601612db2565b9150509250929050565b600061318383836135e9565b60208301905092915050565b61319881613ba4565b82525050565b60006131a982613a18565b6131b38185613a46565b93506131be836139f3565b8060005b838110156131ef5781516131d68882613177565b97506131e183613a39565b9250506001810190506131c2565b5085935050505092915050565b61320581613bb6565b82525050565b600061321682613a23565b6132208185613a57565b9350613230818560208601613c27565b61323981613e36565b840191505092915050565b600061324f82613a2e565b6132598185613a73565b9350613269818560208601613c27565b61327281613e36565b840191505092915050565b600061328882613a2e565b6132928185613a84565b93506132a2818560208601613c27565b80840191505092915050565b600081546132bb81613c5a565b6132c58186613a84565b945060018216600081146132e057600181146132f157613324565b60ff19831686528186019350613324565b6132fa85613a03565b60005b8381101561331c578154818901526001820191506020810190506132fd565b838801955050505b50505092915050565b600061333a601c83613a73565b915061334582613e47565b602082019050919050565b600061335d601583613a73565b915061336882613e70565b602082019050919050565b6000613380602683613a73565b915061338b82613e99565b604082019050919050565b60006133a3601383613a73565b91506133ae82613ee8565b602082019050919050565b60006133c6600883613a73565b91506133d182613f11565b602082019050919050565b60006133e9601283613a73565b91506133f482613f3a565b602082019050919050565b600061340c601583613a73565b915061341782613f63565b602082019050919050565b600061342f601283613a73565b915061343a82613f8c565b602082019050919050565b6000613452600583613a84565b915061345d82613fb5565b600582019050919050565b6000613475602083613a73565b915061348082613fde565b602082019050919050565b6000613498601683613a73565b91506134a382614007565b602082019050919050565b60006134bb601383613a73565b91506134c682614030565b602082019050919050565b60006134de602f83613a73565b91506134e982614059565b604082019050919050565b6000613501601483613a73565b915061350c826140a8565b602082019050919050565b6000613524601283613a73565b915061352f826140d1565b602082019050919050565b6000613547601183613a73565b9150613552826140fa565b602082019050919050565b600061356a600083613a68565b915061357582614123565b600082019050919050565b600061358d601083613a73565b915061359882614126565b602082019050919050565b60006135b0601383613a73565b91506135bb8261414f565b602082019050919050565b60006135d3601283613a73565b91506135de82614178565b602082019050919050565b6135f281613c0e565b82525050565b61360181613c0e565b82525050565b600061361382856132ae565b915061361f828461327d565b915061362a82613445565b91508190509392505050565b60006136418261355d565b9150819050919050565b6000602082019050613660600083018461318f565b92915050565b600060808201905061367b600083018761318f565b613688602083018661318f565b61369560408301856135f8565b81810360608301526136a7818461320b565b905095945050505050565b600060208201905081810360008301526136cc818461319e565b905092915050565b60006020820190506136e960008301846131fc565b92915050565b600060208201905081810360008301526137098184613244565b905092915050565b6000602082019050818103600083015261372a8161332d565b9050919050565b6000602082019050818103600083015261374a81613350565b9050919050565b6000602082019050818103600083015261376a81613373565b9050919050565b6000602082019050818103600083015261378a81613396565b9050919050565b600060208201905081810360008301526137aa816133b9565b9050919050565b600060208201905081810360008301526137ca816133dc565b9050919050565b600060208201905081810360008301526137ea816133ff565b9050919050565b6000602082019050818103600083015261380a81613422565b9050919050565b6000602082019050818103600083015261382a81613468565b9050919050565b6000602082019050818103600083015261384a8161348b565b9050919050565b6000602082019050818103600083015261386a816134ae565b9050919050565b6000602082019050818103600083015261388a816134d1565b9050919050565b600060208201905081810360008301526138aa816134f4565b9050919050565b600060208201905081810360008301526138ca81613517565b9050919050565b600060208201905081810360008301526138ea8161353a565b9050919050565b6000602082019050818103600083015261390a81613580565b9050919050565b6000602082019050818103600083015261392a816135a3565b9050919050565b6000602082019050818103600083015261394a816135c6565b9050919050565b600060208201905061396660008301846135f8565b92915050565b6000613976613987565b90506139828282613c8c565b919050565b6000604051905090565b600067ffffffffffffffff8211156139ac576139ab613df3565b5b6139b582613e36565b9050602081019050919050565b600067ffffffffffffffff8211156139dd576139dc613df3565b5b6139e682613e36565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9a82613c0e565b9150613aa583613c0e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ada57613ad9613d37565b5b828201905092915050565b6000613af082613c0e565b9150613afb83613c0e565b925082613b0b57613b0a613d66565b5b828204905092915050565b6000613b2182613c0e565b9150613b2c83613c0e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b6557613b64613d37565b5b828202905092915050565b6000613b7b82613c0e565b9150613b8683613c0e565b925082821015613b9957613b98613d37565b5b828203905092915050565b6000613baf82613bee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c45578082015181840152602081019050613c2a565b83811115613c54576000848401525b50505050565b60006002820490506001821680613c7257607f821691505b60208210811415613c8657613c85613d95565b5b50919050565b613c9582613e36565b810181811067ffffffffffffffff82111715613cb457613cb3613df3565b5b80604052505050565b6000613cc882613c0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cfb57613cfa613d37565b5b600182019050919050565b6000613d1182613c0e565b9150613d1c83613c0e565b925082613d2c57613d2b613d66565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f796f752063616e74206265636f6d652075676c7920616e796d6f726500000000600082015250565b7f5075626c69632073616c6520696e616374697665310000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20636f6e7472616374206d696e74696e6700000000000000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5175616e7469747920746f6f2068696768310000000000000000000000000000600082015250565b7f752077616e6e61206d696e7420746f6f206d616e790000000000000000000000600082015250565b7f467265652073616c6520696e6163746976650000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f752077616e6e61206d696e7420746f6f206d616e793100000000000000000000600082015250565b7f55736572206d61782066726565206c696d697400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c6520696e616374697665000000000000000000000000600082015250565b7f67697665206d65206d6f7265206d6f6e65790000000000000000000000000000600082015250565b7f5175616e7469747920746f6f2068696768000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f67697665206d65206d6f7265206d6f6e65793100000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b6141aa81613ba4565b81146141b557600080fd5b50565b6141c181613bb6565b81146141cc57600080fd5b50565b6141d881613bc2565b81146141e357600080fd5b50565b6141ef81613c0e565b81146141fa57600080fd5b5056fea2646970667358221220295fe7fc5644358d9cac4b54c28198a0553c9e3371e0c46cc1aaa4d2cca2597164736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000f45676773204e6674732042792078780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f45676773204e6674732042792078780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003268747470733a2f2f656767733030312e6f73732d636e2d686f6e676b6f6e672e616c6979756e63732e636f6d2f6d6574612f0000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c806388dedc1411610139578063a945bf80116100b6578063c87b56dd1161007a578063c87b56dd14610892578063d5abeb01146108cf578063e8a3d485146108fa578063e985e9c514610925578063f2fde38b14610962578063f7e8d6ea1461098b57610251565b8063a945bf80146107ad578063abc025d1146107d8578063ada7c4ed14610803578063b88d4fde14610840578063c62752551461086957610251565b8063938e3d7b116100fd578063938e3d7b146106dc57806395d89b4114610705578063a0bcfc7f14610730578063a22cb46514610759578063a4b41a151461078257610251565b806388dedc14146106095780638942bbff146106325780638da5cb5b1461065d5780639007bd721461068857806390134eb7146106b157610251565b806342842e0e116101d25780636352211e116101965780636352211e146104f657806364f640761461053357806370a0823114610570578063715018a6146105ad5780637af3a1af146105c45780637c928fe9146105ed57610251565b806342842e0e14610413578063438b63001461043c5780634f7f89761461047957806355f804b3146104a25780635c975abb146104cb57610251565b8063170594c611610219578063170594c61461034d57806318160ddd1461037857806323b872dd146103a35780632db11544146103cc57806333bc1c5c146103e857610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806316c38b3c14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613067565b6109b6565b60405161028a91906136d4565b60405180910390f35b34801561029f57600080fd5b506102a8610a48565b6040516102b591906136ef565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e0919061310a565b610ada565b6040516102f2919061364b565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190612ffa565b610b59565b005b34801561033057600080fd5b5061034b6004803603810190610346919061303a565b610c9d565b005b34801561035957600080fd5b50610362610cc2565b60405161036f9190613951565b60405180910390f35b34801561038457600080fd5b5061038d610cc8565b60405161039a9190613951565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612ee4565b610cdf565b005b6103e660048036038101906103e1919061310a565b611004565b005b3480156103f457600080fd5b506103fd6112ee565b60405161040a91906136d4565b60405180910390f35b34801561041f57600080fd5b5061043a60048036038101906104359190612ee4565b611301565b005b34801561044857600080fd5b50610463600480360381019061045e9190612e77565b611321565b60405161047091906136b2565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190612ffa565b61142c565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906130c1565b6114e5565b005b3480156104d757600080fd5b506104e0611507565b6040516104ed91906136d4565b60405180910390f35b34801561050257600080fd5b5061051d6004803603810190610518919061310a565b61151a565b60405161052a919061364b565b60405180910390f35b34801561053f57600080fd5b5061055a60048036038101906105559190612e77565b61152c565b60405161056791906136d4565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190612e77565b61154c565b6040516105a49190613951565b60405180910390f35b3480156105b957600080fd5b506105c2611605565b005b3480156105d057600080fd5b506105eb60048036038101906105e6919061303a565b611619565b005b6106076004803603810190610602919061310a565b611659565b005b34801561061557600080fd5b50610630600480360381019061062b919061303a565b611c81565b005b34801561063e57600080fd5b50610647611cc1565b6040516106549190613951565b60405180910390f35b34801561066957600080fd5b50610672611cc6565b60405161067f919061364b565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613137565b611cef565b005b3480156106bd57600080fd5b506106c6611e1c565b6040516106d39190613951565b60405180910390f35b3480156106e857600080fd5b5061070360048036038101906106fe91906130c1565b611e22565b005b34801561071157600080fd5b5061071a611e44565b60405161072791906136ef565b60405180910390f35b34801561073c57600080fd5b50610757600480360381019061075291906130c1565b611ed6565b005b34801561076557600080fd5b50610780600480360381019061077b9190612fba565b611ef8565b005b34801561078e57600080fd5b50610797612070565b6040516107a491906136d4565b60405180910390f35b3480156107b957600080fd5b506107c2612083565b6040516107cf9190613951565b60405180910390f35b3480156107e457600080fd5b506107ed612089565b6040516107fa9190613951565b60405180910390f35b34801561080f57600080fd5b5061082a60048036038101906108259190612e77565b61208e565b6040516108379190613951565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190612f37565b6120a6565b005b34801561087557600080fd5b50610890600480360381019061088b919061310a565b612119565b005b34801561089e57600080fd5b506108b960048036038101906108b4919061310a565b61212b565b6040516108c691906136ef565b60405180910390f35b3480156108db57600080fd5b506108e46121a7565b6040516108f19190613951565b60405180910390f35b34801561090657600080fd5b5061090f6121ad565b60405161091c91906136ef565b60405180910390f35b34801561093157600080fd5b5061094c60048036038101906109479190612ea4565b61223f565b60405161095991906136d4565b60405180910390f35b34801561096e57600080fd5b5061098960048036038101906109849190612e77565b6122d3565b005b34801561099757600080fd5b506109a0612357565b6040516109ad91906136ef565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a415750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a5790613c5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8390613c5a565b8015610ad05780601f10610aa557610100808354040283529160200191610ad0565b820191906000526020600020905b815481529060010190602001808311610ab357829003601f168201915b5050505050905090565b6000610ae5826123e5565b610b1b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b648261151a565b90508073ffffffffffffffffffffffffffffffffffffffff16610b85612444565b73ffffffffffffffffffffffffffffffffffffffff1614610be857610bb181610bac612444565b61223f565b610be7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610ca561244c565b80600c60006101000a81548160ff02191690831515021790555050565b600a5481565b6000610cd26124ca565b6002546001540303905090565b6000610cea826124d3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d51576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d5d846125a1565b91509150610d738187610d6e612444565b6125c8565b610dbf57610d8886610d83612444565b61223f565b610dbe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e26576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e33868686600161260c565b8015610e3e57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f0c85610ee8888887612612565b7c02000000000000000000000000000000000000000000000000000000001761263a565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f94576000600185019050600060056000838152602001908152602001600020541415610f92576001548114610f91578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ffc8686866001612665565b505050505050565b80600c60009054906101000a900460ff1615611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c90613931565b60405180910390fd5b61270f81611061610cc8565b61106b9190613a8f565b11156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390613711565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111190613771565b60405180910390fd5b600c60029054906101000a900460ff16611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116090613891565b60405180910390fd5b600954826111779190613b16565b3410156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b0906138b1565b60405180910390fd5b60058211156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f4906138d1565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005838261124f9190613a8f565b1115611290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611287906137d1565b60405180910390fd5b828161129c9190613a8f565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112e9338461266b565b505050565b600c60029054906101000a900460ff1681565b61131c838383604051806020016040528060008152506120a6565b505050565b6060600061132e8361154c565b905060008167ffffffffffffffff81111561134c5761134b613df3565b5b60405190808252806020026020018201604052801561137a5781602001602082028036833780820191505090505b50905060006001905060005b8381108015611397575061270f8211155b156114205760006113a78361151a565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561140c57828483815181106113f1576113f0613dc4565b5b602002602001018181525050818061140890613cbd565b9250505b828061141790613cbd565b93505050611386565b82945050505050919050565b61143461244c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161145a90613636565b60006040518083038185875af1925050503d8060008114611497576040519150601f19603f3d011682016040523d82523d6000602084013e61149c565b606091505b50509050806114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d7906138f1565b60405180910390fd5b505050565b6114ed61244c565b80600b9080519060200190611503929190612c8b565b5050565b600c60009054906101000a900460ff1681565b6000611525826124d3565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61160d61244c565b6116176000612689565b565b61162161244c565b80600c60026101000a81548160ff0219169083151502179055508015600c60016101000a81548160ff02191690831515021790555050565b80600c60009054906101000a900460ff16156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613931565b60405180910390fd5b61270f816116b6610cc8565b6116c09190613a8f565b1115611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613711565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690613771565b60405180910390fd5b600c60019054906101000a900460ff166117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b5906137f1565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561184b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184290613851565b60405180910390fd5b611853610cc8565b61270f11611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90613791565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001831480156118ea5750600081145b1561195457600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061193f90613cbd565b919050555061194f33600161266b565b611c7c565b6000811480156119645750600183115b15611aef57600c60029054906101000a900460ff166119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90613731565b60405180910390fd5b6009546001846119c89190613b70565b6119d29190613b16565b341015611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b90613911565b60405180910390fd5b6005831115611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f906137b1565b60405180910390fd5b6005831115611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390613831565b60405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611aea338461266b565b611c7b565b600c60029054906101000a900460ff16611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3590613891565b60405180910390fd5b60095483611b4c9190613b16565b341015611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906138b1565b60405180910390fd5b6005831115611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906138d1565b60405180910390fd5b60058382611be09190613a8f565b1115611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c18906137d1565b60405180910390fd5b8281611c2d9190613a8f565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c7a338461266b565b5b5b505050565b611c8961244c565b80600c60016101000a81548160ff0219169083151502179055508015600c60026101000a81548160ff02191690831515021790555050565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611cf761244c565b81600c60009054906101000a900460ff1615611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90613931565b60405180910390fd5b61270f81611d54610cc8565b611d5e9190613a8f565b1115611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613711565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0490613771565b60405180910390fd5b611e17828461266b565b505050565b600d5481565b611e2a61244c565b80600b9080519060200190611e40929190612c8b565b5050565b606060048054611e5390613c5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7f90613c5a565b8015611ecc5780601f10611ea157610100808354040283529160200191611ecc565b820191906000526020600020905b815481529060010190602001808311611eaf57829003601f168201915b5050505050905090565b611ede61244c565b8060109080519060200190611ef4929190612c8b565b5050565b611f00612444565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f65576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611f72612444565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201f612444565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161206491906136d4565b60405180910390a35050565b600c60019054906101000a900460ff1681565b60095481565b600581565b600f6020528060005260406000206000915090505481565b6120b1848484610cdf565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612113576120dc8484848461274d565b612112576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61212161244c565b8060098190555050565b6060612136826123e5565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90613871565b60405180910390fd5b600b612180836128ad565b604051602001612191929190613607565b6040516020818303038152906040529050919050565b61270f81565b6060600b80546121bc90613c5a565b80601f01602080910402602001604051908101604052809291908181526020018280546121e890613c5a565b80156122355780601f1061220a57610100808354040283529160200191612235565b820191906000526020600020905b81548152906001019060200180831161221857829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122db61244c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561234b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234290613751565b60405180910390fd5b61235481612689565b50565b600b805461236490613c5a565b80601f016020809104026020016040519081016040528092919081815260200182805461239090613c5a565b80156123dd5780601f106123b2576101008083540402835291602001916123dd565b820191906000526020600020905b8154815290600101906020018083116123c057829003601f168201915b505050505081565b6000816123f06124ca565b111580156123ff575060015482105b801561243d575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b612454612a0e565b73ffffffffffffffffffffffffffffffffffffffff16612472611cc6565b73ffffffffffffffffffffffffffffffffffffffff16146124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90613811565b60405180910390fd5b565b60006001905090565b600080829050806124e26124ca565b1161256a576001548110156125695760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612567575b600081141561255d576005600083600190039350838152602001908152602001600020549050612532565b809250505061259c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612629868684612a16565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612685828260405180602001604052806000815250612a1f565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612773612444565b8786866040518563ffffffff1660e01b81526004016127959493929190613666565b602060405180830381600087803b1580156127af57600080fd5b505af19250505080156127e057506040513d601f19601f820116820180604052508101906127dd9190613094565b60015b61285a573d8060008114612810576040519150601f19603f3d011682016040523d82523d6000602084013e612815565b606091505b50600081511415612852576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156128f5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a09565b600082905060005b6000821461292757808061291090613cbd565b915050600a826129209190613ae5565b91506128fd565b60008167ffffffffffffffff81111561294357612942613df3565b5b6040519080825280601f01601f1916602001820160405280156129755781602001600182028036833780820191505090505b5090505b60008514612a025760018261298e9190613b70565b9150600a8561299d9190613d06565b60306129a99190613a8f565b60f81b8183815181106129bf576129be613dc4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129fb9190613ae5565b9450612979565b8093505050505b919050565b600033905090565b60009392505050565b612a298383612abd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ab85760006001549050600083820390505b612a6a600086838060010194508661274d565b612aa0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a57578160015414612ab557600080fd5b50505b505050565b600060015490506000821415612aff576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b0c600084838561260c565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b8383612b746000866000612612565b612b7d85612c7b565b1761263a565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c2457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612be9565b506000821415612c60576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c766000848385612665565b505050565b60006001821460e11b9050919050565b828054612c9790613c5a565b90600052602060002090601f016020900481019282612cb95760008555612d00565b82601f10612cd257805160ff1916838001178555612d00565b82800160010185558215612d00579182015b82811115612cff578251825591602001919060010190612ce4565b5b509050612d0d9190612d11565b5090565b5b80821115612d2a576000816000905550600101612d12565b5090565b6000612d41612d3c84613991565b61396c565b905082815260208101848484011115612d5d57612d5c613e27565b5b612d68848285613c18565b509392505050565b6000612d83612d7e846139c2565b61396c565b905082815260208101848484011115612d9f57612d9e613e27565b5b612daa848285613c18565b509392505050565b600081359050612dc1816141a1565b92915050565b600081359050612dd6816141b8565b92915050565b600081359050612deb816141cf565b92915050565b600081519050612e00816141cf565b92915050565b600082601f830112612e1b57612e1a613e22565b5b8135612e2b848260208601612d2e565b91505092915050565b600082601f830112612e4957612e48613e22565b5b8135612e59848260208601612d70565b91505092915050565b600081359050612e71816141e6565b92915050565b600060208284031215612e8d57612e8c613e31565b5b6000612e9b84828501612db2565b91505092915050565b60008060408385031215612ebb57612eba613e31565b5b6000612ec985828601612db2565b9250506020612eda85828601612db2565b9150509250929050565b600080600060608486031215612efd57612efc613e31565b5b6000612f0b86828701612db2565b9350506020612f1c86828701612db2565b9250506040612f2d86828701612e62565b9150509250925092565b60008060008060808587031215612f5157612f50613e31565b5b6000612f5f87828801612db2565b9450506020612f7087828801612db2565b9350506040612f8187828801612e62565b925050606085013567ffffffffffffffff811115612fa257612fa1613e2c565b5b612fae87828801612e06565b91505092959194509250565b60008060408385031215612fd157612fd0613e31565b5b6000612fdf85828601612db2565b9250506020612ff085828601612dc7565b9150509250929050565b6000806040838503121561301157613010613e31565b5b600061301f85828601612db2565b925050602061303085828601612e62565b9150509250929050565b6000602082840312156130505761304f613e31565b5b600061305e84828501612dc7565b91505092915050565b60006020828403121561307d5761307c613e31565b5b600061308b84828501612ddc565b91505092915050565b6000602082840312156130aa576130a9613e31565b5b60006130b884828501612df1565b91505092915050565b6000602082840312156130d7576130d6613e31565b5b600082013567ffffffffffffffff8111156130f5576130f4613e2c565b5b61310184828501612e34565b91505092915050565b6000602082840312156131205761311f613e31565b5b600061312e84828501612e62565b91505092915050565b6000806040838503121561314e5761314d613e31565b5b600061315c85828601612e62565b925050602061316d85828601612db2565b9150509250929050565b600061318383836135e9565b60208301905092915050565b61319881613ba4565b82525050565b60006131a982613a18565b6131b38185613a46565b93506131be836139f3565b8060005b838110156131ef5781516131d68882613177565b97506131e183613a39565b9250506001810190506131c2565b5085935050505092915050565b61320581613bb6565b82525050565b600061321682613a23565b6132208185613a57565b9350613230818560208601613c27565b61323981613e36565b840191505092915050565b600061324f82613a2e565b6132598185613a73565b9350613269818560208601613c27565b61327281613e36565b840191505092915050565b600061328882613a2e565b6132928185613a84565b93506132a2818560208601613c27565b80840191505092915050565b600081546132bb81613c5a565b6132c58186613a84565b945060018216600081146132e057600181146132f157613324565b60ff19831686528186019350613324565b6132fa85613a03565b60005b8381101561331c578154818901526001820191506020810190506132fd565b838801955050505b50505092915050565b600061333a601c83613a73565b915061334582613e47565b602082019050919050565b600061335d601583613a73565b915061336882613e70565b602082019050919050565b6000613380602683613a73565b915061338b82613e99565b604082019050919050565b60006133a3601383613a73565b91506133ae82613ee8565b602082019050919050565b60006133c6600883613a73565b91506133d182613f11565b602082019050919050565b60006133e9601283613a73565b91506133f482613f3a565b602082019050919050565b600061340c601583613a73565b915061341782613f63565b602082019050919050565b600061342f601283613a73565b915061343a82613f8c565b602082019050919050565b6000613452600583613a84565b915061345d82613fb5565b600582019050919050565b6000613475602083613a73565b915061348082613fde565b602082019050919050565b6000613498601683613a73565b91506134a382614007565b602082019050919050565b60006134bb601383613a73565b91506134c682614030565b602082019050919050565b60006134de602f83613a73565b91506134e982614059565b604082019050919050565b6000613501601483613a73565b915061350c826140a8565b602082019050919050565b6000613524601283613a73565b915061352f826140d1565b602082019050919050565b6000613547601183613a73565b9150613552826140fa565b602082019050919050565b600061356a600083613a68565b915061357582614123565b600082019050919050565b600061358d601083613a73565b915061359882614126565b602082019050919050565b60006135b0601383613a73565b91506135bb8261414f565b602082019050919050565b60006135d3601283613a73565b91506135de82614178565b602082019050919050565b6135f281613c0e565b82525050565b61360181613c0e565b82525050565b600061361382856132ae565b915061361f828461327d565b915061362a82613445565b91508190509392505050565b60006136418261355d565b9150819050919050565b6000602082019050613660600083018461318f565b92915050565b600060808201905061367b600083018761318f565b613688602083018661318f565b61369560408301856135f8565b81810360608301526136a7818461320b565b905095945050505050565b600060208201905081810360008301526136cc818461319e565b905092915050565b60006020820190506136e960008301846131fc565b92915050565b600060208201905081810360008301526137098184613244565b905092915050565b6000602082019050818103600083015261372a8161332d565b9050919050565b6000602082019050818103600083015261374a81613350565b9050919050565b6000602082019050818103600083015261376a81613373565b9050919050565b6000602082019050818103600083015261378a81613396565b9050919050565b600060208201905081810360008301526137aa816133b9565b9050919050565b600060208201905081810360008301526137ca816133dc565b9050919050565b600060208201905081810360008301526137ea816133ff565b9050919050565b6000602082019050818103600083015261380a81613422565b9050919050565b6000602082019050818103600083015261382a81613468565b9050919050565b6000602082019050818103600083015261384a8161348b565b9050919050565b6000602082019050818103600083015261386a816134ae565b9050919050565b6000602082019050818103600083015261388a816134d1565b9050919050565b600060208201905081810360008301526138aa816134f4565b9050919050565b600060208201905081810360008301526138ca81613517565b9050919050565b600060208201905081810360008301526138ea8161353a565b9050919050565b6000602082019050818103600083015261390a81613580565b9050919050565b6000602082019050818103600083015261392a816135a3565b9050919050565b6000602082019050818103600083015261394a816135c6565b9050919050565b600060208201905061396660008301846135f8565b92915050565b6000613976613987565b90506139828282613c8c565b919050565b6000604051905090565b600067ffffffffffffffff8211156139ac576139ab613df3565b5b6139b582613e36565b9050602081019050919050565b600067ffffffffffffffff8211156139dd576139dc613df3565b5b6139e682613e36565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9a82613c0e565b9150613aa583613c0e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ada57613ad9613d37565b5b828201905092915050565b6000613af082613c0e565b9150613afb83613c0e565b925082613b0b57613b0a613d66565b5b828204905092915050565b6000613b2182613c0e565b9150613b2c83613c0e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b6557613b64613d37565b5b828202905092915050565b6000613b7b82613c0e565b9150613b8683613c0e565b925082821015613b9957613b98613d37565b5b828203905092915050565b6000613baf82613bee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c45578082015181840152602081019050613c2a565b83811115613c54576000848401525b50505050565b60006002820490506001821680613c7257607f821691505b60208210811415613c8657613c85613d95565b5b50919050565b613c9582613e36565b810181811067ffffffffffffffff82111715613cb457613cb3613df3565b5b80604052505050565b6000613cc882613c0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cfb57613cfa613d37565b5b600182019050919050565b6000613d1182613c0e565b9150613d1c83613c0e565b925082613d2c57613d2b613d66565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f796f752063616e74206265636f6d652075676c7920616e796d6f726500000000600082015250565b7f5075626c69632073616c6520696e616374697665310000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20636f6e7472616374206d696e74696e6700000000000000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5175616e7469747920746f6f2068696768310000000000000000000000000000600082015250565b7f752077616e6e61206d696e7420746f6f206d616e790000000000000000000000600082015250565b7f467265652073616c6520696e6163746976650000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f752077616e6e61206d696e7420746f6f206d616e793100000000000000000000600082015250565b7f55736572206d61782066726565206c696d697400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c6520696e616374697665000000000000000000000000600082015250565b7f67697665206d65206d6f7265206d6f6e65790000000000000000000000000000600082015250565b7f5175616e7469747920746f6f2068696768000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f67697665206d65206d6f7265206d6f6e65793100000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b6141aa81613ba4565b81146141b557600080fd5b50565b6141c181613bb6565b81146141cc57600080fd5b50565b6141d881613bc2565b81146141e357600080fd5b50565b6141ef81613c0e565b81146141fa57600080fd5b5056fea2646970667358221220295fe7fc5644358d9cac4b54c28198a0553c9e3371e0c46cc1aaa4d2cca2597164736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000f45676773204e6674732042792078780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f45676773204e6674732042792078780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003268747470733a2f2f656767733030312e6f73732d636e2d686f6e676b6f6e672e616c6979756e63732e636f6d2f6d6574612f0000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Eggs Nfts By xx
Arg [1] : _symbol (string): Eggs Nfts By xx
Arg [2] : _revealedURI (string): https://eggs001.oss-cn-hongkong.aliyuncs.com/meta/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [4] : 45676773204e6674732042792078780000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [6] : 45676773204e6674732042792078780000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [8] : 68747470733a2f2f656767733030312e6f73732d636e2d686f6e676b6f6e672e
Arg [9] : 616c6979756e63732e636f6d2f6d6574612f0000000000000000000000000000


Deployed Bytecode Sourcemap

57437:5564:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24525:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25427:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31910:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31351:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62014:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57682:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21178:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35617:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59821:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57842:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38530:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60365:684;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62523:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61505:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57776:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26820:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57913:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22362:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;62105:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58366:1447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62234:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57576:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62369:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57878:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61615:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25603:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61171:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32468:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57808:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57529:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57627:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57966;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39313:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61389:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61737:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57482:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61285:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32933:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57719:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24525:639;24610:4;24949:10;24934:25;;:11;:25;;;;:102;;;;25026:10;25011:25;;:11;:25;;;;24934:102;:179;;;;25103:10;25088:25;;:11;:25;;;;24934:179;24914:199;;24525:639;;;:::o;25427:100::-;25481:13;25514:5;25507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25427:100;:::o;31910:218::-;31986:7;32011:16;32019:7;32011;:16::i;:::-;32006:64;;32036:34;;;;;;;;;;;;;;32006:64;32090:15;:24;32106:7;32090:24;;;;;;;;;;;:30;;;;;;;;;;;;32083:37;;31910:218;;;:::o;31351:400::-;31432:13;31448:16;31456:7;31448;:16::i;:::-;31432:32;;31504:5;31481:28;;:19;:17;:19::i;:::-;:28;;;31477:175;;31529:44;31546:5;31553:19;:17;:19::i;:::-;31529:16;:44::i;:::-;31524:128;;31601:35;;;;;;;;;;;;;;31524:128;31477:175;31697:2;31664:15;:24;31680:7;31664:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31735:7;31731:2;31715:28;;31724:5;31715:28;;;;;;;;;;;;31421:330;31351:400;;:::o;62014:83::-;4511:13;:11;:13::i;:::-;62083:6:::1;62074;;:15;;;;;;;;;;;;;;;;;;62014:83:::0;:::o;57682:30::-;;;;:::o;21178:323::-;21239:7;21467:15;:13;:15::i;:::-;21452:12;;21436:13;;:28;:46;21429:53;;21178:323;:::o;35617:2817::-;35751:27;35781;35800:7;35781:18;:27::i;:::-;35751:57;;35866:4;35825:45;;35841:19;35825:45;;;35821:86;;35879:28;;;;;;;;;;;;;;35821:86;35921:27;35950:23;35977:35;36004:7;35977:26;:35::i;:::-;35920:92;;;;36112:68;36137:15;36154:4;36160:19;:17;:19::i;:::-;36112:24;:68::i;:::-;36107:180;;36200:43;36217:4;36223:19;:17;:19::i;:::-;36200:16;:43::i;:::-;36195:92;;36252:35;;;;;;;;;;;;;;36195:92;36107:180;36318:1;36304:16;;:2;:16;;;36300:52;;;36329:23;;;;;;;;;;;;;;36300:52;36365:43;36387:4;36393:2;36397:7;36406:1;36365:21;:43::i;:::-;36501:15;36498:160;;;36641:1;36620:19;36613:30;36498:160;37038:18;:24;37057:4;37038:24;;;;;;;;;;;;;;;;37036:26;;;;;;;;;;;;37107:18;:22;37126:2;37107:22;;;;;;;;;;;;;;;;37105:24;;;;;;;;;;;37429:146;37466:2;37515:45;37530:4;37536:2;37540:19;37515:14;:45::i;:::-;17577:8;37487:73;37429:18;:146::i;:::-;37400:17;:26;37418:7;37400:26;;;;;;;;;;;:175;;;;37746:1;17577:8;37695:19;:47;:52;37691:627;;;37768:19;37800:1;37790:7;:11;37768:33;;37957:1;37923:17;:30;37941:11;37923:30;;;;;;;;;;;;:35;37919:384;;;38061:13;;38046:11;:28;38042:242;;38241:19;38208:17;:30;38226:11;38208:30;;;;;;;;;;;:52;;;;38042:242;37919:384;37749:569;37691:627;38365:7;38361:2;38346:27;;38355:4;38346:27;;;;;;;;;;;;38384:42;38405:4;38411:2;38415:7;38424:1;38384:20;:42::i;:::-;35740:2694;;;35617:2817;;;:::o;59821:536::-;59891:8;62794:6;;;;;;;;;;;62793:7;62785:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57518:4;62858:8;62842:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;62834:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62944:10;62931:23;;:9;:23;;;62923:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59920:10:::1;;;;;;;;;;;59912:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59998:11;;59987:8;:22;;;;:::i;:::-;59974:9;:35;;59966:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57619:1;60051:8;:28;;60043:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60112:17;60132:13;:25;60146:10;60132:25;;;;;;;;;;;;;;;;60112:45;;57674:1;60188:8;60176:9;:20;;;;:::i;:::-;:44;;60168:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60298:8;60286:9;:20;;;;:::i;:::-;60257:13;:25;60271:10;60257:25;;;;;;;;;;;;;;;:50;;;;60318:31;60328:10;60340:8;60318:9;:31::i;:::-;59901:456;59821:536:::0;;:::o;57842:29::-;;;;;;;;;;;;;:::o;38530:185::-;38668:39;38685:4;38691:2;38695:7;38668:39;;;;;;;;;;;;:16;:39::i;:::-;38530:185;;;:::o;60365:684::-;60425:16;60459:23;60485:17;60495:6;60485:9;:17::i;:::-;60459:43;;60513:30;60560:15;60546:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60513:63;;60587:22;60612:1;60587:26;;60624:23;60664:345;60689:15;60671;:33;:64;;;;;57518:4;60708:14;:27;;60671:64;60664:345;;;60752:25;60780:23;60788:14;60780:7;:23::i;:::-;60752:51;;60843:6;60822:27;;:17;:27;;;60818:151;;;60903:14;60870:13;60884:15;60870:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;60936:17;;;;;:::i;:::-;;;;60818:151;60981:16;;;;;:::i;:::-;;;;60737:272;60664:345;;;61028:13;61021:20;;;;;;60365:684;;;:::o;62523:201::-;4511:13;:11;:13::i;:::-;62620:12:::1;62637:8;:13;;62658:6;62637:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62619:50;;;62688:7;62680:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;62608:116;62523:201:::0;;:::o;61505:102::-;4511:13;:11;:13::i;:::-;61591:8:::1;61577:11;:22;;;;;;;;;;;;:::i;:::-;;61505:102:::0;:::o;57776:25::-;;;;;;;;;;;;;:::o;26820:152::-;26892:7;26935:27;26954:7;26935:18;:27::i;:::-;26912:52;;26820:152;;;:::o;57913:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;22362:233::-;22434:7;22475:1;22458:19;;:5;:19;;;22454:60;;;22486:28;;;;;;;;;;;;;;22454:60;16521:13;22532:18;:25;22551:5;22532:25;;;;;;;;;;;;;;;;:55;22525:62;;22362:233;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;62105:123::-;4511:13;:11;:13::i;:::-;62185:6:::1;62172:10;;:19;;;;;;;;;;;;;;;;;;62214:6;62213:7;62202:8;;:18;;;;;;;;;;;;;;;;;;62105:123:::0;:::o;58366:1447::-;58434:8;62794:6;;;;;;;;;;;62793:7;62785:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57518:4;62858:8;62842:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;62834:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62944:10;62931:23;;:9;:23;;;62923:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58463:8:::1;;;;;;;;;;;58455:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;58514:14;:26;58529:10;58514:26;;;;;;;;;;;;;;;;;;;;;;;;;58513:27;58505:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58595:13;:11;:13::i;:::-;57518:4;58583:25;58575:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;58632:17;58652:13;:25;58666:10;58652:25;;;;;;;;;;;;;;;;58632:45;;58704:1;58692:8;:13;:31;;;;;58722:1;58709:9;:14;58692:31;58688:1118;;;58740:13;:25;58754:10;58740:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;58782:24;58792:10;58804:1;58782:9;:24::i;:::-;58688:1118;;;58860:1;58847:9;:14;:30;;;;;58876:1;58865:8;:12;58847:30;58843:938;;;58905:10;;;;;;;;;;;58897:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58996:11;;58991:1;58982:8;:10;;;;:::i;:::-;58981:26;;;;:::i;:::-;58968:9;:39;;58960:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57619:1;59058:8;:28;;59050:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57674:1;59136:8;:32;;59128:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59242:8;59214:13;:25;59228:10;59214:25;;;;;;;;;;;;;;;:36;;;;59269:31;59279:10;59291:8;59269:9;:31::i;:::-;58843:938;;;59349:10;;;;;;;;;;;59341:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59437:11;;59425:8;59424:24;;;;:::i;:::-;59411:9;:37;;59403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57619:1;59498:8;:28;;59490:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57674:1;59587:8;59575:9;:20;;;;:::i;:::-;:45;;59567:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;59706:8;59694:9;:20;;;;:::i;:::-;59665:13;:25;59679:10;59665:25;;;;;;;;;;;;;;;:50;;;;59734:31;59744:10;59756:8;59734:9;:31::i;:::-;58843:938;58688:1118;58444:1369;58366:1447:::0;;:::o;62234:121::-;4511:13;:11;:13::i;:::-;62310:6:::1;62299:8;;:17;;;;;;;;;;;;;;;;;;62341:6;62340:7;62327:10;;:20;;;;;;;;;;;;;;;;;;62234:121:::0;:::o;57576:44::-;57619:1;57576:44;:::o;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;62369:146::-;4511:13;:11;:13::i;:::-;62457:8:::1;62794:6;;;;;;;;;;;62793:7;62785:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57518:4;62858:8;62842:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;62834:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62944:10;62931:23;;:9;:23;;;62923:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62478:29:::2;62488:8;62498;62478:9;:29::i;:::-;4535:1:::1;62369:146:::0;;:::o;57878:28::-;;;;:::o;61615:114::-;4511:13;:11;:13::i;:::-;61709:12:::1;61695:11;:26;;;;;;;;;;;;:::i;:::-;;61615:114:::0;:::o;25603:104::-;25659:13;25692:7;25685:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25603:104;:::o;61171:106::-;4511:13;:11;:13::i;:::-;61261:8:::1;61245:13;:24;;;;;;;;;;;;:::i;:::-;;61171:106:::0;:::o;32468:308::-;32579:19;:17;:19::i;:::-;32567:31;;:8;:31;;;32563:61;;;32607:17;;;;;;;;;;;;;;32563:61;32689:8;32637:18;:39;32656:19;:17;:19::i;:::-;32637:39;;;;;;;;;;;;;;;:49;32677:8;32637:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32749:8;32713:55;;32728:19;:17;:19::i;:::-;32713:55;;;32759:8;32713:55;;;;;;:::i;:::-;;;;;;;;32468:308;;:::o;57808:27::-;;;;;;;;;;;;;:::o;57529:40::-;;;;:::o;57627:48::-;57674:1;57627:48;:::o;57966:::-;;;;;;;;;;;;;;;;;:::o;39313:399::-;39480:31;39493:4;39499:2;39503:7;39480:12;:31::i;:::-;39544:1;39526:2;:14;;;:19;39522:183;;39565:56;39596:4;39602:2;39606:7;39615:5;39565:30;:56::i;:::-;39560:145;;39649:40;;;;;;;;;;;;;;39560:145;39522:183;39313:399;;;;:::o;61389:108::-;4511:13;:11;:13::i;:::-;61477:12:::1;61463:11;:26;;;;61389:108:::0;:::o;61737:269::-;61803:13;61837:17;61845:8;61837:7;:17::i;:::-;61829:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61948:11;61961:26;61978:8;61961:16;:26::i;:::-;61931:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61917:81;;61737:269;;;:::o;57482:40::-;57518:4;57482:40;:::o;61285:96::-;61329:13;61362:11;61355:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61285:96;:::o;32933:164::-;33030:4;33054:18;:25;33073:5;33054:25;;;;;;;;;;;;;;;:35;33080:8;33054:35;;;;;;;;;;;;;;;;;;;;;;;;;33047:42;;32933:164;;;;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;57719:50::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33355:282::-;33420:4;33476:7;33457:15;:13;:15::i;:::-;:26;;:66;;;;;33510:13;;33500:7;:23;33457:66;:153;;;;;33609:1;17297:8;33561:17;:26;33579:7;33561:26;;;;;;;;;;;;:44;:49;33457:153;33437:173;;33355:282;;;:::o;55121:105::-;55181:7;55208:10;55201:17;;55121:105;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;58253:101::-;58318:7;58345:1;58338:8;;58253:101;:::o;27975:1275::-;28042:7;28062:12;28077:7;28062:22;;28145:4;28126:15;:13;:15::i;:::-;:23;28122:1061;;28179:13;;28172:4;:20;28168:1015;;;28217:14;28234:17;:23;28252:4;28234:23;;;;;;;;;;;;28217:40;;28351:1;17297:8;28323:6;:24;:29;28319:845;;;28988:113;29005:1;28995:6;:11;28988:113;;;29048:17;:25;29066:6;;;;;;;29048:25;;;;;;;;;;;;29039:34;;28988:113;;;29134:6;29127:13;;;;;;28319:845;28194:989;28168:1015;28122:1061;29211:31;;;;;;;;;;;;;;27975:1275;;;;:::o;34518:479::-;34620:27;34649:23;34690:38;34731:15;:24;34747:7;34731:24;;;;;;;;;;;34690:65;;34902:18;34879:41;;34959:19;34953:26;34934:45;;34864:126;34518:479;;;:::o;33746:659::-;33895:11;34060:16;34053:5;34049:28;34040:37;;34220:16;34209:9;34205:32;34192:45;;34370:15;34359:9;34356:30;34348:5;34337:9;34334:20;34331:56;34321:66;;33746:659;;;;;:::o;40374:159::-;;;;;:::o;54430:311::-;54565:7;54585:16;17701:3;54611:19;:41;;54585:68;;17701:3;54679:31;54690:4;54696:2;54700:9;54679:10;:31::i;:::-;54671:40;;:62;;54664:69;;;54430:311;;;;;:::o;29798:450::-;29878:14;30046:16;30039:5;30035:28;30026:37;;30223:5;30209:11;30184:23;30180:41;30177:52;30170:5;30167:63;30157:73;;29798:450;;;;:::o;41198:158::-;;;;;:::o;48953:112::-;49030:27;49040:2;49044:8;49030:27;;;;;;;;;;;;:9;:27::i;:::-;48953:112;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;41796:716::-;41959:4;42005:2;41980:45;;;42026:19;:17;:19::i;:::-;42047:4;42053:7;42062:5;41980:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41976:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42280:1;42263:6;:13;:18;42259:235;;;42309:40;;;;;;;;;;;;;;42259:235;42452:6;42446:13;42437:6;42433:2;42429:15;42422:38;41976:529;42149:54;;;42139:64;;;:6;:64;;;;42132:71;;;41796:716;;;;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;54131:147::-;54268:6;54131:147;;;;;:::o;48180:689::-;48311:19;48317:2;48321:8;48311:5;:19::i;:::-;48390:1;48372:2;:14;;;:19;48368:483;;48412:11;48426:13;;48412:27;;48458:13;48480:8;48474:3;:14;48458:30;;48507:233;48538:62;48577:1;48581:2;48585:7;;;;;;48594:5;48538:30;:62::i;:::-;48533:167;;48636:40;;;;;;;;;;;;;;48533:167;48735:3;48727:5;:11;48507:233;;48822:3;48805:13;;:20;48801:34;;48827:8;;;48801:34;48393:458;;48368:483;48180:689;;;:::o;42974:2454::-;43047:20;43070:13;;43047:36;;43110:1;43098:8;:13;43094:44;;;43120:18;;;;;;;;;;;;;;43094:44;43151:61;43181:1;43185:2;43189:12;43203:8;43151:21;:61::i;:::-;43695:1;16659:2;43665:1;:26;;43664:32;43652:8;:45;43626:18;:22;43645:2;43626:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;43974:139;44011:2;44065:33;44088:1;44092:2;44096:1;44065:14;:33::i;:::-;44032:30;44053:8;44032:20;:30::i;:::-;:66;43974:18;:139::i;:::-;43940:17;:31;43958:12;43940:31;;;;;;;;;;;:173;;;;44130:16;44161:11;44190:8;44175:12;:23;44161:37;;44445:16;44441:2;44437:25;44425:37;;44817:12;44777:8;44736:1;44674:25;44615:1;44554;44527:335;44942:1;44928:12;44924:20;44882:346;44983:3;44974:7;44971:16;44882:346;;45201:7;45191:8;45188:1;45161:25;45158:1;45155;45150:59;45036:1;45027:7;45023:15;45012:26;;44882:346;;;44886:77;45273:1;45261:8;:13;45257:45;;;45283:19;;;;;;;;;;;;;;45257:45;45335:3;45319:13;:19;;;;43400:1950;;45360:60;45389:1;45393:2;45397:12;45411:8;45360:20;:60::i;:::-;43036:2392;42974:2454;;:::o;30350:324::-;30420:14;30653:1;30643:8;30640:15;30614:24;30610:46;30600:56;;30350:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:179::-;8036:10;8057:46;8099:3;8091:6;8057:46;:::i;:::-;8135:4;8130:3;8126:14;8112:28;;7967:179;;;;:::o;8152:118::-;8239:24;8257:5;8239:24;:::i;:::-;8234:3;8227:37;8152:118;;:::o;8306:732::-;8425:3;8454:54;8502:5;8454:54;:::i;:::-;8524:86;8603:6;8598:3;8524:86;:::i;:::-;8517:93;;8634:56;8684:5;8634:56;:::i;:::-;8713:7;8744:1;8729:284;8754:6;8751:1;8748:13;8729:284;;;8830:6;8824:13;8857:63;8916:3;8901:13;8857:63;:::i;:::-;8850:70;;8943:60;8996:6;8943:60;:::i;:::-;8933:70;;8789:224;8776:1;8773;8769:9;8764:14;;8729:284;;;8733:14;9029:3;9022:10;;8430:608;;;8306:732;;;;:::o;9044:109::-;9125:21;9140:5;9125:21;:::i;:::-;9120:3;9113:34;9044:109;;:::o;9159:360::-;9245:3;9273:38;9305:5;9273:38;:::i;:::-;9327:70;9390:6;9385:3;9327:70;:::i;:::-;9320:77;;9406:52;9451:6;9446:3;9439:4;9432:5;9428:16;9406:52;:::i;:::-;9483:29;9505:6;9483:29;:::i;:::-;9478:3;9474:39;9467:46;;9249:270;9159:360;;;;:::o;9525:364::-;9613:3;9641:39;9674:5;9641:39;:::i;:::-;9696:71;9760:6;9755:3;9696:71;:::i;:::-;9689:78;;9776:52;9821:6;9816:3;9809:4;9802:5;9798:16;9776:52;:::i;:::-;9853:29;9875:6;9853:29;:::i;:::-;9848:3;9844:39;9837:46;;9617:272;9525:364;;;;:::o;9895:377::-;10001:3;10029:39;10062:5;10029:39;:::i;:::-;10084:89;10166:6;10161:3;10084:89;:::i;:::-;10077:96;;10182:52;10227:6;10222:3;10215:4;10208:5;10204:16;10182:52;:::i;:::-;10259:6;10254:3;10250:16;10243:23;;10005:267;9895:377;;;;:::o;10302:845::-;10405:3;10442:5;10436:12;10471:36;10497:9;10471:36;:::i;:::-;10523:89;10605:6;10600:3;10523:89;:::i;:::-;10516:96;;10643:1;10632:9;10628:17;10659:1;10654:137;;;;10805:1;10800:341;;;;10621:520;;10654:137;10738:4;10734:9;10723;10719:25;10714:3;10707:38;10774:6;10769:3;10765:16;10758:23;;10654:137;;10800:341;10867:38;10899:5;10867:38;:::i;:::-;10927:1;10941:154;10955:6;10952:1;10949:13;10941:154;;;11029:7;11023:14;11019:1;11014:3;11010:11;11003:35;11079:1;11070:7;11066:15;11055:26;;10977:4;10974:1;10970:12;10965:17;;10941:154;;;11124:6;11119:3;11115:16;11108:23;;10807:334;;10621:520;;10409:738;;10302:845;;;;:::o;11153:366::-;11295:3;11316:67;11380:2;11375:3;11316:67;:::i;:::-;11309:74;;11392:93;11481:3;11392:93;:::i;:::-;11510:2;11505:3;11501:12;11494:19;;11153:366;;;:::o;11525:::-;11667:3;11688:67;11752:2;11747:3;11688:67;:::i;:::-;11681:74;;11764:93;11853:3;11764:93;:::i;:::-;11882:2;11877:3;11873:12;11866:19;;11525:366;;;:::o;11897:::-;12039:3;12060:67;12124:2;12119:3;12060:67;:::i;:::-;12053:74;;12136:93;12225:3;12136:93;:::i;:::-;12254:2;12249:3;12245:12;12238:19;;11897:366;;;:::o;12269:::-;12411:3;12432:67;12496:2;12491:3;12432:67;:::i;:::-;12425:74;;12508:93;12597:3;12508:93;:::i;:::-;12626:2;12621:3;12617:12;12610:19;;12269:366;;;:::o;12641:365::-;12783:3;12804:66;12868:1;12863:3;12804:66;:::i;:::-;12797:73;;12879:93;12968:3;12879:93;:::i;:::-;12997:2;12992:3;12988:12;12981:19;;12641:365;;;:::o;13012:366::-;13154:3;13175:67;13239:2;13234:3;13175:67;:::i;:::-;13168:74;;13251:93;13340:3;13251:93;:::i;:::-;13369:2;13364:3;13360:12;13353:19;;13012:366;;;:::o;13384:::-;13526:3;13547:67;13611:2;13606:3;13547:67;:::i;:::-;13540:74;;13623:93;13712:3;13623:93;:::i;:::-;13741:2;13736:3;13732:12;13725:19;;13384:366;;;:::o;13756:::-;13898:3;13919:67;13983:2;13978:3;13919:67;:::i;:::-;13912:74;;13995:93;14084:3;13995:93;:::i;:::-;14113:2;14108:3;14104:12;14097:19;;13756:366;;;:::o;14128:400::-;14288:3;14309:84;14391:1;14386:3;14309:84;:::i;:::-;14302:91;;14402:93;14491:3;14402:93;:::i;:::-;14520:1;14515:3;14511:11;14504:18;;14128:400;;;:::o;14534:366::-;14676:3;14697:67;14761:2;14756:3;14697:67;:::i;:::-;14690:74;;14773:93;14862:3;14773:93;:::i;:::-;14891:2;14886:3;14882:12;14875:19;;14534:366;;;:::o;14906:::-;15048:3;15069:67;15133:2;15128:3;15069:67;:::i;:::-;15062:74;;15145:93;15234:3;15145:93;:::i;:::-;15263:2;15258:3;15254:12;15247:19;;14906:366;;;:::o;15278:::-;15420:3;15441:67;15505:2;15500:3;15441:67;:::i;:::-;15434:74;;15517:93;15606:3;15517:93;:::i;:::-;15635:2;15630:3;15626:12;15619:19;;15278:366;;;:::o;15650:::-;15792:3;15813:67;15877:2;15872:3;15813:67;:::i;:::-;15806:74;;15889:93;15978:3;15889:93;:::i;:::-;16007:2;16002:3;15998:12;15991:19;;15650:366;;;:::o;16022:::-;16164:3;16185:67;16249:2;16244:3;16185:67;:::i;:::-;16178:74;;16261:93;16350:3;16261:93;:::i;:::-;16379:2;16374:3;16370:12;16363:19;;16022:366;;;:::o;16394:::-;16536:3;16557:67;16621:2;16616:3;16557:67;:::i;:::-;16550:74;;16633:93;16722:3;16633:93;:::i;:::-;16751:2;16746:3;16742:12;16735:19;;16394:366;;;:::o;16766:::-;16908:3;16929:67;16993:2;16988:3;16929:67;:::i;:::-;16922:74;;17005:93;17094:3;17005:93;:::i;:::-;17123:2;17118:3;17114:12;17107:19;;16766:366;;;:::o;17138:398::-;17297:3;17318:83;17399:1;17394:3;17318:83;:::i;:::-;17311:90;;17410:93;17499:3;17410:93;:::i;:::-;17528:1;17523:3;17519:11;17512:18;;17138:398;;;:::o;17542:366::-;17684:3;17705:67;17769:2;17764:3;17705:67;:::i;:::-;17698:74;;17781:93;17870:3;17781:93;:::i;:::-;17899:2;17894:3;17890:12;17883:19;;17542:366;;;:::o;17914:::-;18056:3;18077:67;18141:2;18136:3;18077:67;:::i;:::-;18070:74;;18153:93;18242:3;18153:93;:::i;:::-;18271:2;18266:3;18262:12;18255:19;;17914:366;;;:::o;18286:::-;18428:3;18449:67;18513:2;18508:3;18449:67;:::i;:::-;18442:74;;18525:93;18614:3;18525:93;:::i;:::-;18643:2;18638:3;18634:12;18627:19;;18286:366;;;:::o;18658:108::-;18735:24;18753:5;18735:24;:::i;:::-;18730:3;18723:37;18658:108;;:::o;18772:118::-;18859:24;18877:5;18859:24;:::i;:::-;18854:3;18847:37;18772:118;;:::o;18896:695::-;19174:3;19196:92;19284:3;19275:6;19196:92;:::i;:::-;19189:99;;19305:95;19396:3;19387:6;19305:95;:::i;:::-;19298:102;;19417:148;19561:3;19417:148;:::i;:::-;19410:155;;19582:3;19575:10;;18896:695;;;;;:::o;19597:379::-;19781:3;19803:147;19946:3;19803:147;:::i;:::-;19796:154;;19967:3;19960:10;;19597:379;;;:::o;19982:222::-;20075:4;20113:2;20102:9;20098:18;20090:26;;20126:71;20194:1;20183:9;20179:17;20170:6;20126:71;:::i;:::-;19982:222;;;;:::o;20210:640::-;20405:4;20443:3;20432:9;20428:19;20420:27;;20457:71;20525:1;20514:9;20510:17;20501:6;20457:71;:::i;:::-;20538:72;20606:2;20595:9;20591:18;20582:6;20538:72;:::i;:::-;20620;20688:2;20677:9;20673:18;20664:6;20620:72;:::i;:::-;20739:9;20733:4;20729:20;20724:2;20713:9;20709:18;20702:48;20767:76;20838:4;20829:6;20767:76;:::i;:::-;20759:84;;20210:640;;;;;;;:::o;20856:373::-;20999:4;21037:2;21026:9;21022:18;21014:26;;21086:9;21080:4;21076:20;21072:1;21061:9;21057:17;21050:47;21114:108;21217:4;21208:6;21114:108;:::i;:::-;21106:116;;20856:373;;;;:::o;21235:210::-;21322:4;21360:2;21349:9;21345:18;21337:26;;21373:65;21435:1;21424:9;21420:17;21411:6;21373:65;:::i;:::-;21235:210;;;;:::o;21451:313::-;21564:4;21602:2;21591:9;21587:18;21579:26;;21651:9;21645:4;21641:20;21637:1;21626:9;21622:17;21615:47;21679:78;21752:4;21743:6;21679:78;:::i;:::-;21671:86;;21451:313;;;;:::o;21770:419::-;21936:4;21974:2;21963:9;21959:18;21951:26;;22023:9;22017:4;22013:20;22009:1;21998:9;21994:17;21987:47;22051:131;22177:4;22051:131;:::i;:::-;22043:139;;21770:419;;;:::o;22195:::-;22361:4;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:131;22602:4;22476:131;:::i;:::-;22468:139;;22195:419;;;:::o;22620:::-;22786:4;22824:2;22813:9;22809:18;22801:26;;22873:9;22867:4;22863:20;22859:1;22848:9;22844:17;22837:47;22901:131;23027:4;22901:131;:::i;:::-;22893:139;;22620:419;;;:::o;23045:::-;23211:4;23249:2;23238:9;23234:18;23226:26;;23298:9;23292:4;23288:20;23284:1;23273:9;23269:17;23262:47;23326:131;23452:4;23326:131;:::i;:::-;23318:139;;23045:419;;;:::o;23470:::-;23636:4;23674:2;23663:9;23659:18;23651:26;;23723:9;23717:4;23713:20;23709:1;23698:9;23694:17;23687:47;23751:131;23877:4;23751:131;:::i;:::-;23743:139;;23470:419;;;:::o;23895:::-;24061:4;24099:2;24088:9;24084:18;24076:26;;24148:9;24142:4;24138:20;24134:1;24123:9;24119:17;24112:47;24176:131;24302:4;24176:131;:::i;:::-;24168:139;;23895:419;;;:::o;24320:::-;24486:4;24524:2;24513:9;24509:18;24501:26;;24573:9;24567:4;24563:20;24559:1;24548:9;24544:17;24537:47;24601:131;24727:4;24601:131;:::i;:::-;24593:139;;24320:419;;;:::o;24745:::-;24911:4;24949:2;24938:9;24934:18;24926:26;;24998:9;24992:4;24988:20;24984:1;24973:9;24969:17;24962:47;25026:131;25152:4;25026:131;:::i;:::-;25018:139;;24745:419;;;:::o;25170:::-;25336:4;25374:2;25363:9;25359:18;25351:26;;25423:9;25417:4;25413:20;25409:1;25398:9;25394:17;25387:47;25451:131;25577:4;25451:131;:::i;:::-;25443:139;;25170:419;;;:::o;25595:::-;25761:4;25799:2;25788:9;25784:18;25776:26;;25848:9;25842:4;25838:20;25834:1;25823:9;25819:17;25812:47;25876:131;26002:4;25876:131;:::i;:::-;25868:139;;25595:419;;;:::o;26020:::-;26186:4;26224:2;26213:9;26209:18;26201:26;;26273:9;26267:4;26263:20;26259:1;26248:9;26244:17;26237:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26020:419;;;:::o;26445:::-;26611:4;26649:2;26638:9;26634:18;26626:26;;26698:9;26692:4;26688:20;26684:1;26673:9;26669:17;26662:47;26726:131;26852:4;26726:131;:::i;:::-;26718:139;;26445:419;;;:::o;26870:::-;27036:4;27074:2;27063:9;27059:18;27051:26;;27123:9;27117:4;27113:20;27109:1;27098:9;27094:17;27087:47;27151:131;27277:4;27151:131;:::i;:::-;27143:139;;26870:419;;;:::o;27295:::-;27461:4;27499:2;27488:9;27484:18;27476:26;;27548:9;27542:4;27538:20;27534:1;27523:9;27519:17;27512:47;27576:131;27702:4;27576:131;:::i;:::-;27568:139;;27295:419;;;:::o;27720:::-;27886:4;27924:2;27913:9;27909:18;27901:26;;27973:9;27967:4;27963:20;27959:1;27948:9;27944:17;27937:47;28001:131;28127:4;28001:131;:::i;:::-;27993:139;;27720:419;;;:::o;28145:::-;28311:4;28349:2;28338:9;28334:18;28326:26;;28398:9;28392:4;28388:20;28384:1;28373:9;28369:17;28362:47;28426:131;28552:4;28426:131;:::i;:::-;28418:139;;28145:419;;;:::o;28570:::-;28736:4;28774:2;28763:9;28759:18;28751:26;;28823:9;28817:4;28813:20;28809:1;28798:9;28794:17;28787:47;28851:131;28977:4;28851:131;:::i;:::-;28843:139;;28570:419;;;:::o;28995:::-;29161:4;29199:2;29188:9;29184:18;29176:26;;29248:9;29242:4;29238:20;29234:1;29223:9;29219:17;29212:47;29276:131;29402:4;29276:131;:::i;:::-;29268:139;;28995:419;;;:::o;29420:222::-;29513:4;29551:2;29540:9;29536:18;29528:26;;29564:71;29632:1;29621:9;29617:17;29608:6;29564:71;:::i;:::-;29420:222;;;;:::o;29648:129::-;29682:6;29709:20;;:::i;:::-;29699:30;;29738:33;29766:4;29758:6;29738:33;:::i;:::-;29648:129;;;:::o;29783:75::-;29816:6;29849:2;29843:9;29833:19;;29783:75;:::o;29864:307::-;29925:4;30015:18;30007:6;30004:30;30001:56;;;30037:18;;:::i;:::-;30001:56;30075:29;30097:6;30075:29;:::i;:::-;30067:37;;30159:4;30153;30149:15;30141:23;;29864:307;;;:::o;30177:308::-;30239:4;30329:18;30321:6;30318:30;30315:56;;;30351:18;;:::i;:::-;30315:56;30389:29;30411:6;30389:29;:::i;:::-;30381:37;;30473:4;30467;30463:15;30455:23;;30177:308;;;:::o;30491:132::-;30558:4;30581:3;30573:11;;30611:4;30606:3;30602:14;30594:22;;30491:132;;;:::o;30629:141::-;30678:4;30701:3;30693:11;;30724:3;30721:1;30714:14;30758:4;30755:1;30745:18;30737:26;;30629:141;;;:::o;30776:114::-;30843:6;30877:5;30871:12;30861:22;;30776:114;;;:::o;30896:98::-;30947:6;30981:5;30975:12;30965:22;;30896:98;;;:::o;31000:99::-;31052:6;31086:5;31080:12;31070:22;;31000:99;;;:::o;31105:113::-;31175:4;31207;31202:3;31198:14;31190:22;;31105:113;;;:::o;31224:184::-;31323:11;31357:6;31352:3;31345:19;31397:4;31392:3;31388:14;31373:29;;31224:184;;;;:::o;31414:168::-;31497:11;31531:6;31526:3;31519:19;31571:4;31566:3;31562:14;31547:29;;31414:168;;;;:::o;31588:147::-;31689:11;31726:3;31711:18;;31588:147;;;;:::o;31741:169::-;31825:11;31859:6;31854:3;31847:19;31899:4;31894:3;31890:14;31875:29;;31741:169;;;;:::o;31916:148::-;32018:11;32055:3;32040:18;;31916:148;;;;:::o;32070:305::-;32110:3;32129:20;32147:1;32129:20;:::i;:::-;32124:25;;32163:20;32181:1;32163:20;:::i;:::-;32158:25;;32317:1;32249:66;32245:74;32242:1;32239:81;32236:107;;;32323:18;;:::i;:::-;32236:107;32367:1;32364;32360:9;32353:16;;32070:305;;;;:::o;32381:185::-;32421:1;32438:20;32456:1;32438:20;:::i;:::-;32433:25;;32472:20;32490:1;32472:20;:::i;:::-;32467:25;;32511:1;32501:35;;32516:18;;:::i;:::-;32501:35;32558:1;32555;32551:9;32546:14;;32381:185;;;;:::o;32572:348::-;32612:7;32635:20;32653:1;32635:20;:::i;:::-;32630:25;;32669:20;32687:1;32669:20;:::i;:::-;32664:25;;32857:1;32789:66;32785:74;32782:1;32779:81;32774:1;32767:9;32760:17;32756:105;32753:131;;;32864:18;;:::i;:::-;32753:131;32912:1;32909;32905:9;32894:20;;32572:348;;;;:::o;32926:191::-;32966:4;32986:20;33004:1;32986:20;:::i;:::-;32981:25;;33020:20;33038:1;33020:20;:::i;:::-;33015:25;;33059:1;33056;33053:8;33050:34;;;33064:18;;:::i;:::-;33050:34;33109:1;33106;33102:9;33094:17;;32926:191;;;;:::o;33123:96::-;33160:7;33189:24;33207:5;33189:24;:::i;:::-;33178:35;;33123:96;;;:::o;33225:90::-;33259:7;33302:5;33295:13;33288:21;33277:32;;33225:90;;;:::o;33321:149::-;33357:7;33397:66;33390:5;33386:78;33375:89;;33321:149;;;:::o;33476:126::-;33513:7;33553:42;33546:5;33542:54;33531:65;;33476:126;;;:::o;33608:77::-;33645:7;33674:5;33663:16;;33608:77;;;:::o;33691:154::-;33775:6;33770:3;33765;33752:30;33837:1;33828:6;33823:3;33819:16;33812:27;33691:154;;;:::o;33851:307::-;33919:1;33929:113;33943:6;33940:1;33937:13;33929:113;;;34028:1;34023:3;34019:11;34013:18;34009:1;34004:3;34000:11;33993:39;33965:2;33962:1;33958:10;33953:15;;33929:113;;;34060:6;34057:1;34054:13;34051:101;;;34140:1;34131:6;34126:3;34122:16;34115:27;34051:101;33900:258;33851:307;;;:::o;34164:320::-;34208:6;34245:1;34239:4;34235:12;34225:22;;34292:1;34286:4;34282:12;34313:18;34303:81;;34369:4;34361:6;34357:17;34347:27;;34303:81;34431:2;34423:6;34420:14;34400:18;34397:38;34394:84;;;34450:18;;:::i;:::-;34394:84;34215:269;34164:320;;;:::o;34490:281::-;34573:27;34595:4;34573:27;:::i;:::-;34565:6;34561:40;34703:6;34691:10;34688:22;34667:18;34655:10;34652:34;34649:62;34646:88;;;34714:18;;:::i;:::-;34646:88;34754:10;34750:2;34743:22;34533:238;34490:281;;:::o;34777:233::-;34816:3;34839:24;34857:5;34839:24;:::i;:::-;34830:33;;34885:66;34878:5;34875:77;34872:103;;;34955:18;;:::i;:::-;34872:103;35002:1;34995:5;34991:13;34984:20;;34777:233;;;:::o;35016:176::-;35048:1;35065:20;35083:1;35065:20;:::i;:::-;35060:25;;35099:20;35117:1;35099:20;:::i;:::-;35094:25;;35138:1;35128:35;;35143:18;;:::i;:::-;35128:35;35184:1;35181;35177:9;35172:14;;35016:176;;;;:::o;35198:180::-;35246:77;35243:1;35236:88;35343:4;35340:1;35333:15;35367:4;35364:1;35357:15;35384:180;35432:77;35429:1;35422:88;35529:4;35526:1;35519:15;35553:4;35550:1;35543:15;35570:180;35618:77;35615:1;35608:88;35715:4;35712:1;35705:15;35739:4;35736:1;35729:15;35756:180;35804:77;35801:1;35794:88;35901:4;35898:1;35891:15;35925:4;35922:1;35915:15;35942:180;35990:77;35987:1;35980:88;36087:4;36084:1;36077:15;36111:4;36108:1;36101:15;36128:117;36237:1;36234;36227:12;36251:117;36360:1;36357;36350:12;36374:117;36483:1;36480;36473:12;36497:117;36606:1;36603;36596:12;36620:102;36661:6;36712:2;36708:7;36703:2;36696:5;36692:14;36688:28;36678:38;;36620:102;;;:::o;36728:178::-;36868:30;36864:1;36856:6;36852:14;36845:54;36728:178;:::o;36912:171::-;37052:23;37048:1;37040:6;37036:14;37029:47;36912:171;:::o;37089:225::-;37229:34;37225:1;37217:6;37213:14;37206:58;37298:8;37293:2;37285:6;37281:15;37274:33;37089:225;:::o;37320:169::-;37460:21;37456:1;37448:6;37444:14;37437:45;37320:169;:::o;37495:158::-;37635:10;37631:1;37623:6;37619:14;37612:34;37495:158;:::o;37659:168::-;37799:20;37795:1;37787:6;37783:14;37776:44;37659:168;:::o;37833:171::-;37973:23;37969:1;37961:6;37957:14;37950:47;37833:171;:::o;38010:168::-;38150:20;38146:1;38138:6;38134:14;38127:44;38010:168;:::o;38184:155::-;38324:7;38320:1;38312:6;38308:14;38301:31;38184:155;:::o;38345:182::-;38485:34;38481:1;38473:6;38469:14;38462:58;38345:182;:::o;38533:172::-;38673:24;38669:1;38661:6;38657:14;38650:48;38533:172;:::o;38711:169::-;38851:21;38847:1;38839:6;38835:14;38828:45;38711:169;:::o;38886:234::-;39026:34;39022:1;39014:6;39010:14;39003:58;39095:17;39090:2;39082:6;39078:15;39071:42;38886:234;:::o;39126:170::-;39266:22;39262:1;39254:6;39250:14;39243:46;39126:170;:::o;39302:168::-;39442:20;39438:1;39430:6;39426:14;39419:44;39302:168;:::o;39476:167::-;39616:19;39612:1;39604:6;39600:14;39593:43;39476:167;:::o;39649:114::-;;:::o;39769:166::-;39909:18;39905:1;39897:6;39893:14;39886:42;39769:166;:::o;39941:169::-;40081:21;40077:1;40069:6;40065:14;40058:45;39941:169;:::o;40116:168::-;40256:20;40252:1;40244:6;40240:14;40233:44;40116:168;:::o;40290:122::-;40363:24;40381:5;40363:24;:::i;:::-;40356:5;40353:35;40343:63;;40402:1;40399;40392:12;40343:63;40290:122;:::o;40418:116::-;40488:21;40503:5;40488:21;:::i;:::-;40481:5;40478:32;40468:60;;40524:1;40521;40514:12;40468:60;40418:116;:::o;40540:120::-;40612:23;40629:5;40612:23;:::i;:::-;40605:5;40602:34;40592:62;;40650:1;40647;40640:12;40592:62;40540:120;:::o;40666:122::-;40739:24;40757:5;40739:24;:::i;:::-;40732:5;40729:35;40719:63;;40778:1;40775;40768:12;40719:63;40666:122;:::o

Swarm Source

ipfs://295fe7fc5644358d9cac4b54c28198a0553c9e3371e0c46cc1aaa4d2cca25971
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.