ETH Price: $3,344.53 (-0.67%)
Gas: 6 Gwei

Token

AlienAnimatedPunkz (AAP)
 

Overview

Max Total Supply

4,907 AAP

Holders

194

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
zombfyd.eth
Balance
1 AAP
0xc13849e0d791028b313944545f5740d9993113c2
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:
AlienAnimatedPunkz

Compiler Version
v0.8.15+commit.e14f2714

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-19
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity 0.8.15;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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



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



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




/**
 * @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.1.0
// Creator: Chiru Labs



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

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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




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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

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

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

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

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

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

// File: contracts/AlienAnimatedPunkz.sol

   
    contract AlienAnimatedPunkz is Ownable, ERC721A {
        string public notRevealedUri;   
        string public baseExtension = ".json";
        
        uint256 public PRICE = 0.08 ether;
        uint256 public PRESALE_PRICE = 0.04 ether;
        uint256 public MAX_SUPPLY = 6666;
        uint256 public maxPresale = 3333;
        uint256 public maxPublic = 3333;
        uint256 public _preSaleListCounter;
        uint256 public _publicCounter;
        uint256 public _reserveCounter;
        uint256 public _airdropCounter;
        uint256 public maxPresaleMintAmount = 10;
        uint256 public maxpublicsaleMintAmount = 10;
        uint256 public saleMode = 1; // 1- presale 2- public sale
        bool public _revealed = false;

        mapping(address => bool) public allowList;  
        mapping(address => uint256) public _preSaleMintCounter;
        mapping(address => uint256) public _publicsaleMintCounter;

        // merkle root
        bytes32 public preSaleRoot;

        constructor(
            string memory name,
            string memory symbol,
            string memory _notRevealedUri
        )
            ERC721A(name, symbol)
        {
            setNotRevealedURI(_notRevealedUri);
        }

        function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
        {
            require(
                _exists(tokenId),
                "ERC721AMetadata: URI query for nonexistent token"
            );

            if(_revealed == false) {
                return notRevealedUri;
            }

            string memory currentBaseURI = _baseURI();
            return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), baseExtension))
            : "";
        }

        function setMode(uint256 mode) public onlyOwner{
            saleMode = mode;
        }

        function getSaleMode() public view returns (uint256){
            return saleMode;
        }

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

        function setMaxPresale(uint256 _maxPresale) public onlyOwner {
            maxPresale = _maxPresale;
        }

        function setMaxPublic(uint256 _maxPublic) public onlyOwner {
            maxPublic = _maxPublic;
        }

        function setCost(uint256 _newCost) public onlyOwner {
            PRICE = _newCost;
        }

        function setPresaleMintPrice(uint256 _newCost) public onlyOwner {
            PRESALE_PRICE = _newCost;
        }

        function setMaxPresaleMintAmount(uint256 _newQty) public onlyOwner {
            maxPresaleMintAmount = _newQty;
        }

        function setPublicsaleMintAmount(uint256 _newQty) public onlyOwner {
            maxpublicsaleMintAmount = _newQty;
        }

        function setPreSaleRoot(bytes32 _merkleRoot) public onlyOwner {
            preSaleRoot = _merkleRoot;
        }

        function reserveMint(uint256 quantity) public onlyOwner {
            require(
                totalSupply() + quantity <= maxPublic,
                "Exceed max supply"
            );
            _safeMint(msg.sender, quantity);
            _reserveCounter = _reserveCounter + quantity;
        }
 
        function bulkAirdrop(address[] calldata _to, uint256 quantity) public onlyOwner{
            require(
                totalSupply() + quantity <= maxPublic,
                "Exceed max supply"
            );
            for (uint256 i = 0; i < _to.length; i++) {
                _safeMint(_to[i], quantity);
                _airdropCounter = _airdropCounter + quantity;
            }
        }

        // metadata URI
        string private _baseTokenURI;

        function setBaseURI(string calldata baseURI) public onlyOwner {
            _baseTokenURI = baseURI;
        }

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

        function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
            notRevealedUri = _notRevealedURI;
        }

        function reveal(bool _state) public onlyOwner {
            _revealed = _state;
        }

        function mintPreSaleTokens(uint8 quantity, bytes32[] calldata _merkleProof)
            public
            payable
        {
            require(saleMode == 1, "Pre sale is not active");
            require(
                _preSaleListCounter + quantity <= maxPresale,
                "Exceeded max available to purchase"
            );
            require(quantity > 0, "Must mint more than 0 tokens");
            require(
                _preSaleMintCounter[msg.sender] + quantity <= maxPresaleMintAmount,
                "exceeds max per address"
            );
            require(PRESALE_PRICE * quantity == msg.value, "Incorrect funds");

            // check proof & mint
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(
                MerkleProof.verify(_merkleProof, preSaleRoot, leaf) ||
                    allowList[msg.sender],
                "Invalid signature/ Address not whitelisted"
            );
            _safeMint(msg.sender, quantity);
            _preSaleListCounter = _preSaleListCounter + quantity;
            _preSaleMintCounter[msg.sender] = _preSaleMintCounter[msg.sender] + quantity;
        }

        function addToPreSaleOverflow(address[] calldata addresses)
            external
            onlyOwner
        {
            for (uint256 i = 0; i < addresses.length; i++) {
                allowList[addresses[i]] = true;
            }
        }

        // public mint
        function publicSaleMint(uint256 quantity)
            public
            payable
        {
            require(saleMode == 2, "public sale has not begun yet");
            require(quantity > 0, "Must mint more than 0 tokens");
            require(PRICE * quantity == msg.value, "Incorrect funds");
            require(_publicCounter + quantity <= maxPublic, "reached max supply");
            require(
                _publicsaleMintCounter[msg.sender] + quantity <= maxpublicsaleMintAmount,
                "exceeds max per address"
            );

            _safeMint(msg.sender, quantity);
            _publicCounter = _publicCounter + quantity;
            _publicsaleMintCounter[msg.sender] = _publicsaleMintCounter[msg.sender] + quantity;
        }

        function getBalance() public view returns (uint256) {
            return address(this).balance;
        }
      
        function _startTokenId() internal virtual override view returns (uint256) {
            return 1;
        }

        function withdraw() public payable onlyOwner {
            uint256 balance = address(this).balance;
            require(balance > 0, "No ether left to withdraw");
            payable(msg.sender).transfer(balance);
        }
    }

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"_notRevealedUri","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_airdropCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preSaleListCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_preSaleMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_publicsaleMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reserveCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToPreSaleOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"bulkAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleMode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxpublicsaleMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintPreSaleTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"preSaleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleMode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPresale","type":"uint256"}],"name":"setMaxPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newQty","type":"uint256"}],"name":"setMaxPresaleMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPublic","type":"uint256"}],"name":"setMaxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"setMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setPreSaleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPresaleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newQty","type":"uint256"}],"name":"setPublicsaleMintAmount","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90816200004a919062000577565b5067011c37937e080000600b55668e1bc9bf040000600c55611a0a600d55610d05600e55610d05600f55600a601455600a60155560016016556000601760006101000a81548160ff021916908315150217905550348015620000ab57600080fd5b5060405162004fe238038062004fe28339818101604052810190620000d19190620007cc565b8282620000f3620000e76200014960201b60201c565b6200015160201b60201c565b816003908162000104919062000577565b50806004908162000116919062000577565b50620001276200021560201b60201c565b600181905550505062000140816200021e60201b60201c565b50505062000908565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b6200022e6200024360201b60201c565b80600990816200023f919062000577565b5050565b620002536200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000279620002d460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c990620008e6565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200037f57607f821691505b60208210810362000395576200039462000337565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003c0565b6200040b8683620003c0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000458620004526200044c8462000423565b6200042d565b62000423565b9050919050565b6000819050919050565b620004748362000437565b6200048c62000483826200045f565b848454620003cd565b825550505050565b600090565b620004a362000494565b620004b081848462000469565b505050565b5b81811015620004d857620004cc60008262000499565b600181019050620004b6565b5050565b601f8211156200052757620004f1816200039b565b620004fc84620003b0565b810160208510156200050c578190505b620005246200051b85620003b0565b830182620004b5565b50505b505050565b600082821c905092915050565b60006200054c600019846008026200052c565b1980831691505092915050565b600062000567838362000539565b9150826002028217905092915050565b6200058282620002fd565b67ffffffffffffffff8111156200059e576200059d62000308565b5b620005aa825462000366565b620005b7828285620004dc565b600060209050601f831160018114620005ef5760008415620005da578287015190505b620005e6858262000559565b86555062000656565b601f198416620005ff866200039b565b60005b82811015620006295784890151825560018201915060208501945060208101905062000602565b8683101562000649578489015162000645601f89168262000539565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000698826200067c565b810181811067ffffffffffffffff82111715620006ba57620006b962000308565b5b80604052505050565b6000620006cf6200065e565b9050620006dd82826200068d565b919050565b600067ffffffffffffffff8211156200070057620006ff62000308565b5b6200070b826200067c565b9050602081019050919050565b60005b83811015620007385780820151818401526020810190506200071b565b8381111562000748576000848401525b50505050565b6000620007656200075f84620006e2565b620006c3565b90508281526020810184848401111562000784576200078362000677565b5b6200079184828562000718565b509392505050565b600082601f830112620007b157620007b062000672565b5b8151620007c38482602086016200074e565b91505092915050565b600080600060608486031215620007e857620007e762000668565b5b600084015167ffffffffffffffff8111156200080957620008086200066d565b5b620008178682870162000799565b935050602084015167ffffffffffffffff8111156200083b576200083a6200066d565b5b620008498682870162000799565b925050604084015167ffffffffffffffff8111156200086d576200086c6200066d565b5b6200087b8682870162000799565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620008ce60208362000885565b9150620008db8262000896565b602082019050919050565b600060208201905081810360008301526200090181620008bf565b9050919050565b6146ca80620009186000396000f3fe60806040526004361061036b5760003560e01c8063715a609d116101c6578063cc523f26116100f7578063e985e9c511610095578063f74b56361161006f578063f74b563614610c59578063f8c8d49914610c82578063fbdb849414610cab578063fe042d4914610cd45761036b565b8063e985e9c514610bca578063f2c4ce1e14610c07578063f2fde38b14610c305761036b565b8063d7719f64116100d1578063d7719f6414610b1d578063d99079ca14610b5a578063da22488c14610b85578063e7661c7814610bae5761036b565b8063cc523f2614610aa0578063d72dd3b414610acb578063d76fd22014610af45761036b565b806395d89b4111610164578063b3ab66b01161013e578063b3ab66b0146109f3578063b88d4fde14610a0f578063c668286214610a38578063c87b56dd14610a635761036b565b806395d89b41146109625780639b257d731461098d578063a22cb465146109ca5761036b565b806389f3b22d116101a057806389f3b22d146108b85780638d859f3e146108e35780638da5cb5b1461090e578063940cd05b146109395761036b565b8063715a609d146108375780637dc4297514610862578063854807561461088d5761036b565b80632848aeaf116102a057806355f804b31161023e5780636ebeac85116102185780636ebeac851461078f5780636f8b44b0146107ba57806370a08231146107e3578063715018a6146108205761036b565b806355f804b3146106fe57806362dc6e21146107275780636352211e146107525761036b565b806337a131931161027a57806337a13193146106795780633ccfd60b146106a257806342842e0e146106ac57806344a0d68a146106d55761036b565b80632848aeaf146105e65780633154b9c21461062357806332cb6b0c1461064e5761036b565b806312065fe01161030d57806318160ddd116102e757806318160ddd1461053e5780631bbc1afa146105695780632142ab291461059257806323b872dd146105bd5761036b565b806312065fe0146104bf5780631342ff4c146104ea57806317c84ce6146105135761036b565b8063081c8c4411610349578063081c8c4414610415578063095ea7b3146104405780630d43ebc2146104695780630deed6a6146104945761036b565b806301ffc9a71461037057806306fdde03146103ad578063081812fc146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190612edc565b610cfd565b6040516103a49190612f24565b60405180910390f35b3480156103b957600080fd5b506103c2610d8f565b6040516103cf9190612fd8565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613030565b610e21565b60405161040c919061309e565b60405180910390f35b34801561042157600080fd5b5061042a610e9d565b6040516104379190612fd8565b60405180910390f35b34801561044c57600080fd5b50610467600480360381019061046291906130e5565b610f2b565b005b34801561047557600080fd5b5061047e61106c565b60405161048b9190613134565b60405180910390f35b3480156104a057600080fd5b506104a9611076565b6040516104b69190613134565b60405180910390f35b3480156104cb57600080fd5b506104d461107c565b6040516104e19190613134565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190613030565b611084565b005b34801561051f57600080fd5b50610528611104565b6040516105359190613134565b60405180910390f35b34801561054a57600080fd5b5061055361110a565b6040516105609190613134565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613030565b611121565b005b34801561059e57600080fd5b506105a7611133565b6040516105b49190613134565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df919061314f565b611139565b005b3480156105f257600080fd5b5061060d600480360381019061060891906131a2565b61145b565b60405161061a9190612f24565b60405180910390f35b34801561062f57600080fd5b5061063861147b565b60405161064591906131e8565b60405180910390f35b34801561065a57600080fd5b50610663611481565b6040516106709190613134565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613030565b611487565b005b6106aa611499565b005b3480156106b857600080fd5b506106d360048036038101906106ce919061314f565b611533565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613030565b611553565b005b34801561070a57600080fd5b5061072560048036038101906107209190613268565b611565565b005b34801561073357600080fd5b5061073c611583565b6040516107499190613134565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190613030565b611589565b604051610786919061309e565b60405180910390f35b34801561079b57600080fd5b506107a461159b565b6040516107b19190612f24565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613030565b6115ae565b005b3480156107ef57600080fd5b5061080a600480360381019061080591906131a2565b6115c0565b6040516108179190613134565b60405180910390f35b34801561082c57600080fd5b50610835611678565b005b34801561084357600080fd5b5061084c61168c565b6040516108599190613134565b60405180910390f35b34801561086e57600080fd5b50610877611692565b6040516108849190613134565b60405180910390f35b34801561089957600080fd5b506108a2611698565b6040516108af9190613134565b60405180910390f35b3480156108c457600080fd5b506108cd61169e565b6040516108da9190613134565b60405180910390f35b3480156108ef57600080fd5b506108f86116a4565b6040516109059190613134565b60405180910390f35b34801561091a57600080fd5b506109236116aa565b604051610930919061309e565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b91906132e1565b6116d3565b005b34801561096e57600080fd5b506109776116f8565b6040516109849190612fd8565b60405180910390f35b34801561099957600080fd5b506109b460048036038101906109af91906131a2565b61178a565b6040516109c19190613134565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec919061330e565b6117a2565b005b610a0d6004803603810190610a089190613030565b611919565b005b348015610a1b57600080fd5b50610a366004803603810190610a31919061347e565b611b80565b005b348015610a4457600080fd5b50610a4d611bf3565b604051610a5a9190612fd8565b60405180910390f35b348015610a6f57600080fd5b50610a8a6004803603810190610a859190613030565b611c81565b604051610a979190612fd8565b60405180910390f35b348015610aac57600080fd5b50610ab5611dd9565b604051610ac29190613134565b60405180910390f35b348015610ad757600080fd5b50610af26004803603810190610aed9190613030565b611ddf565b005b348015610b0057600080fd5b50610b1b6004803603810190610b169190613030565b611df1565b005b348015610b2957600080fd5b50610b446004803603810190610b3f91906131a2565b611e03565b604051610b519190613134565b60405180910390f35b348015610b6657600080fd5b50610b6f611e1b565b604051610b7c9190613134565b60405180910390f35b348015610b9157600080fd5b50610bac6004803603810190610ba79190613557565b611e21565b005b610bc86004803603810190610bc39190613633565b611ece565b005b348015610bd657600080fd5b50610bf16004803603810190610bec9190613693565b612259565b604051610bfe9190612f24565b60405180910390f35b348015610c1357600080fd5b50610c2e6004803603810190610c299190613774565b6122ed565b005b348015610c3c57600080fd5b50610c576004803603810190610c5291906131a2565b612308565b005b348015610c6557600080fd5b50610c806004803603810190610c7b91906137bd565b61238b565b005b348015610c8e57600080fd5b50610ca96004803603810190610ca49190613030565b612456565b005b348015610cb757600080fd5b50610cd26004803603810190610ccd9190613030565b612468565b005b348015610ce057600080fd5b50610cfb6004803603810190610cf69190613849565b61247a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d885750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610d9e906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610dca906138a5565b8015610e175780601f10610dec57610100808354040283529160200191610e17565b820191906000526020600020905b815481529060010190602001808311610dfa57829003601f168201915b5050505050905090565b6000610e2c8261248c565b610e62576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610eaa906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed6906138a5565b8015610f235780601f10610ef857610100808354040283529160200191610f23565b820191906000526020600020905b815481529060010190602001808311610f0657829003601f168201915b505050505081565b6000610f3682611589565b90508073ffffffffffffffffffffffffffffffffffffffff16610f576124eb565b73ffffffffffffffffffffffffffffffffffffffff1614610fba57610f8381610f7e6124eb565b612259565b610fb9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000601654905090565b60165481565b600047905090565b61108c6124f3565b600f548161109861110a565b6110a29190613905565b11156110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906139a7565b60405180910390fd5b6110ed3382612571565b806012546110fb9190613905565b60128190555050565b60125481565b600061111461258f565b6002546001540303905090565b6111296124f3565b80600e8190555050565b600e5481565b600061114482612598565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111ab576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111b784612664565b915091506111cd81876111c86124eb565b612686565b611219576111e2866111dd6124eb565b612259565b611218576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361127f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61128c86868660016126ca565b801561129757600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611365856113418888876126d0565b7c0200000000000000000000000000000000000000000000000000000000176126f8565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113eb57600060018501905060006005600083815260200190815260200160002054036113e95760015481146113e8578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114538686866001612723565b505050505050565b60186020528060005260406000206000915054906101000a900460ff1681565b601b5481565b600d5481565b61148f6124f3565b80600c8190555050565b6114a16124f3565b6000479050600081116114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090613a13565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561152f573d6000803e3d6000fd5b5050565b61154e83838360405180602001604052806000815250611b80565b505050565b61155b6124f3565b80600b8190555050565b61156d6124f3565b8181601c918261157e929190613bea565b505050565b600c5481565b600061159482612598565b9050919050565b601760009054906101000a900460ff1681565b6115b66124f3565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611627576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116806124f3565b61168a6000612729565b565b60115481565b600f5481565b60145481565b60135481565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116db6124f3565b80601760006101000a81548160ff02191690831515021790555050565b606060048054611707906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611733906138a5565b80156117805780601f1061175557610100808354040283529160200191611780565b820191906000526020600020905b81548152906001019060200180831161176357829003601f168201915b5050505050905090565b601a6020528060005260406000206000915090505481565b6117aa6124eb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361180e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061181b6124eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c86124eb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161190d9190612f24565b60405180910390a35050565b60026016541461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590613d06565b60405180910390fd5b600081116119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890613d72565b60405180910390fd5b3481600b546119b09190613d92565b146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613e38565b60405180910390fd5b600f5481601154611a019190613905565b1115611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613ea4565b60405180910390fd5b60155481601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a909190613905565b1115611ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac890613f10565b60405180910390fd5b611adb3382612571565b80601154611ae99190613905565b60118190555080601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b3a9190613905565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611b8b848484611139565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bed57611bb6848484846127ed565b611bec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a8054611c00906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2c906138a5565b8015611c795780601f10611c4e57610100808354040283529160200191611c79565b820191906000526020600020905b815481529060010190602001808311611c5c57829003601f168201915b505050505081565b6060611c8c8261248c565b611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290613fa2565b60405180910390fd5b60001515601760009054906101000a900460ff16151503611d785760098054611cf3906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1f906138a5565b8015611d6c5780601f10611d4157610100808354040283529160200191611d6c565b820191906000526020600020905b815481529060010190602001808311611d4f57829003601f168201915b50505050509050611dd4565b6000611d8261293d565b90506000815111611da25760405180602001604052806000815250611dd0565b80611dac846129cf565b600a604051602001611dc093929190614081565b6040516020818303038152906040525b9150505b919050565b60155481565b611de76124f3565b8060168190555050565b611df96124f3565b8060148190555050565b60196020528060005260406000206000915090505481565b60105481565b611e296124f3565b60005b82829050811015611ec957600160186000858585818110611e5057611e4f6140b2565b5b9050602002016020810190611e6591906131a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ec1906140e1565b915050611e2c565b505050565b600160165414611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a90614175565b60405180910390fd5b600e548360ff16601054611f279190613905565b1115611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90614207565b60405180910390fd5b60008360ff1611611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590613d72565b60405180910390fd5b6014548360ff16601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fff9190613905565b1115612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790613f10565b60405180910390fd5b348360ff16600c546120529190613d92565b14612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613e38565b60405180910390fd5b6000336040516020016120a5919061426f565b60405160208183030381529060405280519060200120905061210b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601b5483612b2f565b8061215f5750601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61219e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612195906142fc565b60405180910390fd5b6121ab338560ff16612571565b8360ff166010546121bc9190613905565b6010819055508360ff16601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122109190613905565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122f56124f3565b8060099081612304919061431c565b5050565b6123106124f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690614460565b60405180910390fd5b61238881612729565b50565b6123936124f3565b600f548161239f61110a565b6123a99190613905565b11156123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e1906139a7565b60405180910390fd5b60005b838390508110156124505761242984848381811061240e5761240d6140b2565b5b905060200201602081019061242391906131a2565b83612571565b816013546124379190613905565b6013819055508080612448906140e1565b9150506123ed565b50505050565b61245e6124f3565b8060158190555050565b6124706124f3565b80600f8190555050565b6124826124f3565b80601b8190555050565b60008161249761258f565b111580156124a6575060015482105b80156124e4575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b6124fb612b46565b73ffffffffffffffffffffffffffffffffffffffff166125196116aa565b73ffffffffffffffffffffffffffffffffffffffff161461256f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612566906144cc565b60405180910390fd5b565b61258b828260405180602001604052806000815250612b4e565b5050565b60006001905090565b600080829050806125a761258f565b1161262d5760015481101561262c5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361262a575b600081036126205760056000836001900393508381526020019081526020016000205490506125f6565b809250505061265f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86126e7868684612bec565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128136124eb565b8786866040518563ffffffff1660e01b81526004016128359493929190614541565b6020604051808303816000875af192505050801561287157506040513d601f19601f8201168201806040525081019061286e91906145a2565b60015b6128ea573d80600081146128a1576040519150601f19603f3d011682016040523d82523d6000602084013e6128a6565b606091505b5060008151036128e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601c805461294c906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612978906138a5565b80156129c55780601f1061299a576101008083540402835291602001916129c5565b820191906000526020600020905b8154815290600101906020018083116129a857829003601f168201915b5050505050905090565b606060008203612a16576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b2a565b600082905060005b60008214612a48578080612a31906140e1565b915050600a82612a4191906145fe565b9150612a1e565b60008167ffffffffffffffff811115612a6457612a63613353565b5b6040519080825280601f01601f191660200182016040528015612a965781602001600182028036833780820191505090505b5090505b60008514612b2357600182612aaf919061462f565b9150600a85612abe9190614663565b6030612aca9190613905565b60f81b818381518110612ae057612adf6140b2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1c91906145fe565b9450612a9a565b8093505050505b919050565b600082612b3c8584612bf5565b1490509392505050565b600033905090565b612b588383612c4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612be75760006001549050600083820390505b612b9960008683806001019450866127ed565b612bcf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b86578160015414612be457600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015612c4057612c2b82868381518110612c1e57612c1d6140b2565b5b6020026020010151612e1e565b91508080612c38906140e1565b915050612bfe565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cb8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612cf2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cff60008483856126ca565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d7683612d6760008660006126d0565b612d7085612e49565b176126f8565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d9a57806001819055505050612e196000848385612723565b505050565b6000818310612e3657612e318284612e59565b612e41565b612e408383612e59565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612eb981612e84565b8114612ec457600080fd5b50565b600081359050612ed681612eb0565b92915050565b600060208284031215612ef257612ef1612e7a565b5b6000612f0084828501612ec7565b91505092915050565b60008115159050919050565b612f1e81612f09565b82525050565b6000602082019050612f396000830184612f15565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f79578082015181840152602081019050612f5e565b83811115612f88576000848401525b50505050565b6000601f19601f8301169050919050565b6000612faa82612f3f565b612fb48185612f4a565b9350612fc4818560208601612f5b565b612fcd81612f8e565b840191505092915050565b60006020820190508181036000830152612ff28184612f9f565b905092915050565b6000819050919050565b61300d81612ffa565b811461301857600080fd5b50565b60008135905061302a81613004565b92915050565b60006020828403121561304657613045612e7a565b5b60006130548482850161301b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130888261305d565b9050919050565b6130988161307d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b6130c28161307d565b81146130cd57600080fd5b50565b6000813590506130df816130b9565b92915050565b600080604083850312156130fc576130fb612e7a565b5b600061310a858286016130d0565b925050602061311b8582860161301b565b9150509250929050565b61312e81612ffa565b82525050565b60006020820190506131496000830184613125565b92915050565b60008060006060848603121561316857613167612e7a565b5b6000613176868287016130d0565b9350506020613187868287016130d0565b92505060406131988682870161301b565b9150509250925092565b6000602082840312156131b8576131b7612e7a565b5b60006131c6848285016130d0565b91505092915050565b6000819050919050565b6131e2816131cf565b82525050565b60006020820190506131fd60008301846131d9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261322857613227613203565b5b8235905067ffffffffffffffff81111561324557613244613208565b5b6020830191508360018202830111156132615761326061320d565b5b9250929050565b6000806020838503121561327f5761327e612e7a565b5b600083013567ffffffffffffffff81111561329d5761329c612e7f565b5b6132a985828601613212565b92509250509250929050565b6132be81612f09565b81146132c957600080fd5b50565b6000813590506132db816132b5565b92915050565b6000602082840312156132f7576132f6612e7a565b5b6000613305848285016132cc565b91505092915050565b6000806040838503121561332557613324612e7a565b5b6000613333858286016130d0565b9250506020613344858286016132cc565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61338b82612f8e565b810181811067ffffffffffffffff821117156133aa576133a9613353565b5b80604052505050565b60006133bd612e70565b90506133c98282613382565b919050565b600067ffffffffffffffff8211156133e9576133e8613353565b5b6133f282612f8e565b9050602081019050919050565b82818337600083830152505050565b600061342161341c846133ce565b6133b3565b90508281526020810184848401111561343d5761343c61334e565b5b6134488482856133ff565b509392505050565b600082601f83011261346557613464613203565b5b813561347584826020860161340e565b91505092915050565b6000806000806080858703121561349857613497612e7a565b5b60006134a6878288016130d0565b94505060206134b7878288016130d0565b93505060406134c88782880161301b565b925050606085013567ffffffffffffffff8111156134e9576134e8612e7f565b5b6134f587828801613450565b91505092959194509250565b60008083601f84011261351757613516613203565b5b8235905067ffffffffffffffff81111561353457613533613208565b5b6020830191508360208202830111156135505761354f61320d565b5b9250929050565b6000806020838503121561356e5761356d612e7a565b5b600083013567ffffffffffffffff81111561358c5761358b612e7f565b5b61359885828601613501565b92509250509250929050565b600060ff82169050919050565b6135ba816135a4565b81146135c557600080fd5b50565b6000813590506135d7816135b1565b92915050565b60008083601f8401126135f3576135f2613203565b5b8235905067ffffffffffffffff8111156136105761360f613208565b5b60208301915083602082028301111561362c5761362b61320d565b5b9250929050565b60008060006040848603121561364c5761364b612e7a565b5b600061365a868287016135c8565b935050602084013567ffffffffffffffff81111561367b5761367a612e7f565b5b613687868287016135dd565b92509250509250925092565b600080604083850312156136aa576136a9612e7a565b5b60006136b8858286016130d0565b92505060206136c9858286016130d0565b9150509250929050565b600067ffffffffffffffff8211156136ee576136ed613353565b5b6136f782612f8e565b9050602081019050919050565b6000613717613712846136d3565b6133b3565b9050828152602081018484840111156137335761373261334e565b5b61373e8482856133ff565b509392505050565b600082601f83011261375b5761375a613203565b5b813561376b848260208601613704565b91505092915050565b60006020828403121561378a57613789612e7a565b5b600082013567ffffffffffffffff8111156137a8576137a7612e7f565b5b6137b484828501613746565b91505092915050565b6000806000604084860312156137d6576137d5612e7a565b5b600084013567ffffffffffffffff8111156137f4576137f3612e7f565b5b61380086828701613501565b935093505060206138138682870161301b565b9150509250925092565b613826816131cf565b811461383157600080fd5b50565b6000813590506138438161381d565b92915050565b60006020828403121561385f5761385e612e7a565b5b600061386d84828501613834565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138bd57607f821691505b6020821081036138d0576138cf613876565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061391082612ffa565b915061391b83612ffa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139505761394f6138d6565b5b828201905092915050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b6000613991601183612f4a565b915061399c8261395b565b602082019050919050565b600060208201905081810360008301526139c081613984565b9050919050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b60006139fd601983612f4a565b9150613a08826139c7565b602082019050919050565b60006020820190508181036000830152613a2c816139f0565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613aa07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a63565b613aaa8683613a63565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ae7613ae2613add84612ffa565b613ac2565b612ffa565b9050919050565b6000819050919050565b613b0183613acc565b613b15613b0d82613aee565b848454613a70565b825550505050565b600090565b613b2a613b1d565b613b35818484613af8565b505050565b5b81811015613b5957613b4e600082613b22565b600181019050613b3b565b5050565b601f821115613b9e57613b6f81613a3e565b613b7884613a53565b81016020851015613b87578190505b613b9b613b9385613a53565b830182613b3a565b50505b505050565b600082821c905092915050565b6000613bc160001984600802613ba3565b1980831691505092915050565b6000613bda8383613bb0565b9150826002028217905092915050565b613bf48383613a33565b67ffffffffffffffff811115613c0d57613c0c613353565b5b613c1782546138a5565b613c22828285613b5d565b6000601f831160018114613c515760008415613c3f578287013590505b613c498582613bce565b865550613cb1565b601f198416613c5f86613a3e565b60005b82811015613c8757848901358255600182019150602085019450602081019050613c62565b86831015613ca45784890135613ca0601f891682613bb0565b8355505b6001600288020188555050505b50505050505050565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b6000613cf0601d83612f4a565b9150613cfb82613cba565b602082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f4d757374206d696e74206d6f7265207468616e203020746f6b656e7300000000600082015250565b6000613d5c601c83612f4a565b9150613d6782613d26565b602082019050919050565b60006020820190508181036000830152613d8b81613d4f565b9050919050565b6000613d9d82612ffa565b9150613da883612ffa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613de157613de06138d6565b5b828202905092915050565b7f496e636f72726563742066756e64730000000000000000000000000000000000600082015250565b6000613e22600f83612f4a565b9150613e2d82613dec565b602082019050919050565b60006020820190508181036000830152613e5181613e15565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000613e8e601283612f4a565b9150613e9982613e58565b602082019050919050565b60006020820190508181036000830152613ebd81613e81565b9050919050565b7f65786365656473206d6178207065722061646472657373000000000000000000600082015250565b6000613efa601783612f4a565b9150613f0582613ec4565b602082019050919050565b60006020820190508181036000830152613f2981613eed565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000613f8c603083612f4a565b9150613f9782613f30565b604082019050919050565b60006020820190508181036000830152613fbb81613f7f565b9050919050565b600081905092915050565b6000613fd882612f3f565b613fe28185613fc2565b9350613ff2818560208601612f5b565b80840191505092915050565b6000815461400b816138a5565b6140158186613fc2565b94506001821660008114614030576001811461404557614078565b60ff1983168652811515820286019350614078565b61404e85613a3e565b60005b8381101561407057815481890152600182019150602081019050614051565b838801955050505b50505092915050565b600061408d8286613fcd565b91506140998285613fcd565b91506140a58284613ffe565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140ec82612ffa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411e5761411d6138d6565b5b600182019050919050565b7f5072652073616c65206973206e6f742061637469766500000000000000000000600082015250565b600061415f601683612f4a565b915061416a82614129565b602082019050919050565b6000602082019050818103600083015261418e81614152565b9050919050565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b60006141f1602283612f4a565b91506141fc82614195565b604082019050919050565b60006020820190508181036000830152614220816141e4565b9050919050565b60008160601b9050919050565b600061423f82614227565b9050919050565b600061425182614234565b9050919050565b6142696142648261307d565b614246565b82525050565b600061427b8284614258565b60148201915081905092915050565b7f496e76616c6964207369676e61747572652f2041646472657373206e6f74207760008201527f686974656c697374656400000000000000000000000000000000000000000000602082015250565b60006142e6602a83612f4a565b91506142f18261428a565b604082019050919050565b60006020820190508181036000830152614315816142d9565b9050919050565b61432582612f3f565b67ffffffffffffffff81111561433e5761433d613353565b5b61434882546138a5565b614353828285613b5d565b600060209050601f8311600181146143865760008415614374578287015190505b61437e8582613bce565b8655506143e6565b601f19841661439486613a3e565b60005b828110156143bc57848901518255600182019150602085019450602081019050614397565b868310156143d957848901516143d5601f891682613bb0565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444a602683612f4a565b9150614455826143ee565b604082019050919050565b600060208201905081810360008301526144798161443d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144b6602083612f4a565b91506144c182614480565b602082019050919050565b600060208201905081810360008301526144e5816144a9565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614513826144ec565b61451d81856144f7565b935061452d818560208601612f5b565b61453681612f8e565b840191505092915050565b6000608082019050614556600083018761308f565b614563602083018661308f565b6145706040830185613125565b81810360608301526145828184614508565b905095945050505050565b60008151905061459c81612eb0565b92915050565b6000602082840312156145b8576145b7612e7a565b5b60006145c68482850161458d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061460982612ffa565b915061461483612ffa565b925082614624576146236145cf565b5b828204905092915050565b600061463a82612ffa565b915061464583612ffa565b925082821015614658576146576138d6565b5b828203905092915050565b600061466e82612ffa565b915061467983612ffa565b925082614689576146886145cf565b5b82820690509291505056fea264697066735822122027b986c7d13f0354e6b4f01346c680ada0240285cf49663f28275da279845ba064736f6c634300080f0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000012416c69656e416e696d6174656450756e6b7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034141500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f616e696d6174656470756e6b7a2e696f2f6e6f6e2d72657665616c2f72657665616c2e6a736f6e0000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c8063715a609d116101c6578063cc523f26116100f7578063e985e9c511610095578063f74b56361161006f578063f74b563614610c59578063f8c8d49914610c82578063fbdb849414610cab578063fe042d4914610cd45761036b565b8063e985e9c514610bca578063f2c4ce1e14610c07578063f2fde38b14610c305761036b565b8063d7719f64116100d1578063d7719f6414610b1d578063d99079ca14610b5a578063da22488c14610b85578063e7661c7814610bae5761036b565b8063cc523f2614610aa0578063d72dd3b414610acb578063d76fd22014610af45761036b565b806395d89b4111610164578063b3ab66b01161013e578063b3ab66b0146109f3578063b88d4fde14610a0f578063c668286214610a38578063c87b56dd14610a635761036b565b806395d89b41146109625780639b257d731461098d578063a22cb465146109ca5761036b565b806389f3b22d116101a057806389f3b22d146108b85780638d859f3e146108e35780638da5cb5b1461090e578063940cd05b146109395761036b565b8063715a609d146108375780637dc4297514610862578063854807561461088d5761036b565b80632848aeaf116102a057806355f804b31161023e5780636ebeac85116102185780636ebeac851461078f5780636f8b44b0146107ba57806370a08231146107e3578063715018a6146108205761036b565b806355f804b3146106fe57806362dc6e21146107275780636352211e146107525761036b565b806337a131931161027a57806337a13193146106795780633ccfd60b146106a257806342842e0e146106ac57806344a0d68a146106d55761036b565b80632848aeaf146105e65780633154b9c21461062357806332cb6b0c1461064e5761036b565b806312065fe01161030d57806318160ddd116102e757806318160ddd1461053e5780631bbc1afa146105695780632142ab291461059257806323b872dd146105bd5761036b565b806312065fe0146104bf5780631342ff4c146104ea57806317c84ce6146105135761036b565b8063081c8c4411610349578063081c8c4414610415578063095ea7b3146104405780630d43ebc2146104695780630deed6a6146104945761036b565b806301ffc9a71461037057806306fdde03146103ad578063081812fc146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190612edc565b610cfd565b6040516103a49190612f24565b60405180910390f35b3480156103b957600080fd5b506103c2610d8f565b6040516103cf9190612fd8565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613030565b610e21565b60405161040c919061309e565b60405180910390f35b34801561042157600080fd5b5061042a610e9d565b6040516104379190612fd8565b60405180910390f35b34801561044c57600080fd5b50610467600480360381019061046291906130e5565b610f2b565b005b34801561047557600080fd5b5061047e61106c565b60405161048b9190613134565b60405180910390f35b3480156104a057600080fd5b506104a9611076565b6040516104b69190613134565b60405180910390f35b3480156104cb57600080fd5b506104d461107c565b6040516104e19190613134565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190613030565b611084565b005b34801561051f57600080fd5b50610528611104565b6040516105359190613134565b60405180910390f35b34801561054a57600080fd5b5061055361110a565b6040516105609190613134565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613030565b611121565b005b34801561059e57600080fd5b506105a7611133565b6040516105b49190613134565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df919061314f565b611139565b005b3480156105f257600080fd5b5061060d600480360381019061060891906131a2565b61145b565b60405161061a9190612f24565b60405180910390f35b34801561062f57600080fd5b5061063861147b565b60405161064591906131e8565b60405180910390f35b34801561065a57600080fd5b50610663611481565b6040516106709190613134565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613030565b611487565b005b6106aa611499565b005b3480156106b857600080fd5b506106d360048036038101906106ce919061314f565b611533565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613030565b611553565b005b34801561070a57600080fd5b5061072560048036038101906107209190613268565b611565565b005b34801561073357600080fd5b5061073c611583565b6040516107499190613134565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190613030565b611589565b604051610786919061309e565b60405180910390f35b34801561079b57600080fd5b506107a461159b565b6040516107b19190612f24565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613030565b6115ae565b005b3480156107ef57600080fd5b5061080a600480360381019061080591906131a2565b6115c0565b6040516108179190613134565b60405180910390f35b34801561082c57600080fd5b50610835611678565b005b34801561084357600080fd5b5061084c61168c565b6040516108599190613134565b60405180910390f35b34801561086e57600080fd5b50610877611692565b6040516108849190613134565b60405180910390f35b34801561089957600080fd5b506108a2611698565b6040516108af9190613134565b60405180910390f35b3480156108c457600080fd5b506108cd61169e565b6040516108da9190613134565b60405180910390f35b3480156108ef57600080fd5b506108f86116a4565b6040516109059190613134565b60405180910390f35b34801561091a57600080fd5b506109236116aa565b604051610930919061309e565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b91906132e1565b6116d3565b005b34801561096e57600080fd5b506109776116f8565b6040516109849190612fd8565b60405180910390f35b34801561099957600080fd5b506109b460048036038101906109af91906131a2565b61178a565b6040516109c19190613134565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec919061330e565b6117a2565b005b610a0d6004803603810190610a089190613030565b611919565b005b348015610a1b57600080fd5b50610a366004803603810190610a31919061347e565b611b80565b005b348015610a4457600080fd5b50610a4d611bf3565b604051610a5a9190612fd8565b60405180910390f35b348015610a6f57600080fd5b50610a8a6004803603810190610a859190613030565b611c81565b604051610a979190612fd8565b60405180910390f35b348015610aac57600080fd5b50610ab5611dd9565b604051610ac29190613134565b60405180910390f35b348015610ad757600080fd5b50610af26004803603810190610aed9190613030565b611ddf565b005b348015610b0057600080fd5b50610b1b6004803603810190610b169190613030565b611df1565b005b348015610b2957600080fd5b50610b446004803603810190610b3f91906131a2565b611e03565b604051610b519190613134565b60405180910390f35b348015610b6657600080fd5b50610b6f611e1b565b604051610b7c9190613134565b60405180910390f35b348015610b9157600080fd5b50610bac6004803603810190610ba79190613557565b611e21565b005b610bc86004803603810190610bc39190613633565b611ece565b005b348015610bd657600080fd5b50610bf16004803603810190610bec9190613693565b612259565b604051610bfe9190612f24565b60405180910390f35b348015610c1357600080fd5b50610c2e6004803603810190610c299190613774565b6122ed565b005b348015610c3c57600080fd5b50610c576004803603810190610c5291906131a2565b612308565b005b348015610c6557600080fd5b50610c806004803603810190610c7b91906137bd565b61238b565b005b348015610c8e57600080fd5b50610ca96004803603810190610ca49190613030565b612456565b005b348015610cb757600080fd5b50610cd26004803603810190610ccd9190613030565b612468565b005b348015610ce057600080fd5b50610cfb6004803603810190610cf69190613849565b61247a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d885750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610d9e906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610dca906138a5565b8015610e175780601f10610dec57610100808354040283529160200191610e17565b820191906000526020600020905b815481529060010190602001808311610dfa57829003601f168201915b5050505050905090565b6000610e2c8261248c565b610e62576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610eaa906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed6906138a5565b8015610f235780601f10610ef857610100808354040283529160200191610f23565b820191906000526020600020905b815481529060010190602001808311610f0657829003601f168201915b505050505081565b6000610f3682611589565b90508073ffffffffffffffffffffffffffffffffffffffff16610f576124eb565b73ffffffffffffffffffffffffffffffffffffffff1614610fba57610f8381610f7e6124eb565b612259565b610fb9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000601654905090565b60165481565b600047905090565b61108c6124f3565b600f548161109861110a565b6110a29190613905565b11156110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906139a7565b60405180910390fd5b6110ed3382612571565b806012546110fb9190613905565b60128190555050565b60125481565b600061111461258f565b6002546001540303905090565b6111296124f3565b80600e8190555050565b600e5481565b600061114482612598565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111ab576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111b784612664565b915091506111cd81876111c86124eb565b612686565b611219576111e2866111dd6124eb565b612259565b611218576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361127f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61128c86868660016126ca565b801561129757600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611365856113418888876126d0565b7c0200000000000000000000000000000000000000000000000000000000176126f8565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113eb57600060018501905060006005600083815260200190815260200160002054036113e95760015481146113e8578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114538686866001612723565b505050505050565b60186020528060005260406000206000915054906101000a900460ff1681565b601b5481565b600d5481565b61148f6124f3565b80600c8190555050565b6114a16124f3565b6000479050600081116114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090613a13565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561152f573d6000803e3d6000fd5b5050565b61154e83838360405180602001604052806000815250611b80565b505050565b61155b6124f3565b80600b8190555050565b61156d6124f3565b8181601c918261157e929190613bea565b505050565b600c5481565b600061159482612598565b9050919050565b601760009054906101000a900460ff1681565b6115b66124f3565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611627576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116806124f3565b61168a6000612729565b565b60115481565b600f5481565b60145481565b60135481565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116db6124f3565b80601760006101000a81548160ff02191690831515021790555050565b606060048054611707906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611733906138a5565b80156117805780601f1061175557610100808354040283529160200191611780565b820191906000526020600020905b81548152906001019060200180831161176357829003601f168201915b5050505050905090565b601a6020528060005260406000206000915090505481565b6117aa6124eb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361180e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061181b6124eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c86124eb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161190d9190612f24565b60405180910390a35050565b60026016541461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590613d06565b60405180910390fd5b600081116119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890613d72565b60405180910390fd5b3481600b546119b09190613d92565b146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613e38565b60405180910390fd5b600f5481601154611a019190613905565b1115611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613ea4565b60405180910390fd5b60155481601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a909190613905565b1115611ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac890613f10565b60405180910390fd5b611adb3382612571565b80601154611ae99190613905565b60118190555080601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b3a9190613905565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611b8b848484611139565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bed57611bb6848484846127ed565b611bec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a8054611c00906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2c906138a5565b8015611c795780601f10611c4e57610100808354040283529160200191611c79565b820191906000526020600020905b815481529060010190602001808311611c5c57829003601f168201915b505050505081565b6060611c8c8261248c565b611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290613fa2565b60405180910390fd5b60001515601760009054906101000a900460ff16151503611d785760098054611cf3906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1f906138a5565b8015611d6c5780601f10611d4157610100808354040283529160200191611d6c565b820191906000526020600020905b815481529060010190602001808311611d4f57829003601f168201915b50505050509050611dd4565b6000611d8261293d565b90506000815111611da25760405180602001604052806000815250611dd0565b80611dac846129cf565b600a604051602001611dc093929190614081565b6040516020818303038152906040525b9150505b919050565b60155481565b611de76124f3565b8060168190555050565b611df96124f3565b8060148190555050565b60196020528060005260406000206000915090505481565b60105481565b611e296124f3565b60005b82829050811015611ec957600160186000858585818110611e5057611e4f6140b2565b5b9050602002016020810190611e6591906131a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ec1906140e1565b915050611e2c565b505050565b600160165414611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a90614175565b60405180910390fd5b600e548360ff16601054611f279190613905565b1115611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90614207565b60405180910390fd5b60008360ff1611611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590613d72565b60405180910390fd5b6014548360ff16601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fff9190613905565b1115612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790613f10565b60405180910390fd5b348360ff16600c546120529190613d92565b14612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613e38565b60405180910390fd5b6000336040516020016120a5919061426f565b60405160208183030381529060405280519060200120905061210b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601b5483612b2f565b8061215f5750601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61219e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612195906142fc565b60405180910390fd5b6121ab338560ff16612571565b8360ff166010546121bc9190613905565b6010819055508360ff16601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122109190613905565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122f56124f3565b8060099081612304919061431c565b5050565b6123106124f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690614460565b60405180910390fd5b61238881612729565b50565b6123936124f3565b600f548161239f61110a565b6123a99190613905565b11156123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e1906139a7565b60405180910390fd5b60005b838390508110156124505761242984848381811061240e5761240d6140b2565b5b905060200201602081019061242391906131a2565b83612571565b816013546124379190613905565b6013819055508080612448906140e1565b9150506123ed565b50505050565b61245e6124f3565b8060158190555050565b6124706124f3565b80600f8190555050565b6124826124f3565b80601b8190555050565b60008161249761258f565b111580156124a6575060015482105b80156124e4575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b6124fb612b46565b73ffffffffffffffffffffffffffffffffffffffff166125196116aa565b73ffffffffffffffffffffffffffffffffffffffff161461256f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612566906144cc565b60405180910390fd5b565b61258b828260405180602001604052806000815250612b4e565b5050565b60006001905090565b600080829050806125a761258f565b1161262d5760015481101561262c5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361262a575b600081036126205760056000836001900393508381526020019081526020016000205490506125f6565b809250505061265f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86126e7868684612bec565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128136124eb565b8786866040518563ffffffff1660e01b81526004016128359493929190614541565b6020604051808303816000875af192505050801561287157506040513d601f19601f8201168201806040525081019061286e91906145a2565b60015b6128ea573d80600081146128a1576040519150601f19603f3d011682016040523d82523d6000602084013e6128a6565b606091505b5060008151036128e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601c805461294c906138a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612978906138a5565b80156129c55780601f1061299a576101008083540402835291602001916129c5565b820191906000526020600020905b8154815290600101906020018083116129a857829003601f168201915b5050505050905090565b606060008203612a16576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b2a565b600082905060005b60008214612a48578080612a31906140e1565b915050600a82612a4191906145fe565b9150612a1e565b60008167ffffffffffffffff811115612a6457612a63613353565b5b6040519080825280601f01601f191660200182016040528015612a965781602001600182028036833780820191505090505b5090505b60008514612b2357600182612aaf919061462f565b9150600a85612abe9190614663565b6030612aca9190613905565b60f81b818381518110612ae057612adf6140b2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1c91906145fe565b9450612a9a565b8093505050505b919050565b600082612b3c8584612bf5565b1490509392505050565b600033905090565b612b588383612c4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612be75760006001549050600083820390505b612b9960008683806001019450866127ed565b612bcf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b86578160015414612be457600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015612c4057612c2b82868381518110612c1e57612c1d6140b2565b5b6020026020010151612e1e565b91508080612c38906140e1565b915050612bfe565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cb8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612cf2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cff60008483856126ca565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d7683612d6760008660006126d0565b612d7085612e49565b176126f8565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d9a57806001819055505050612e196000848385612723565b505050565b6000818310612e3657612e318284612e59565b612e41565b612e408383612e59565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612eb981612e84565b8114612ec457600080fd5b50565b600081359050612ed681612eb0565b92915050565b600060208284031215612ef257612ef1612e7a565b5b6000612f0084828501612ec7565b91505092915050565b60008115159050919050565b612f1e81612f09565b82525050565b6000602082019050612f396000830184612f15565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f79578082015181840152602081019050612f5e565b83811115612f88576000848401525b50505050565b6000601f19601f8301169050919050565b6000612faa82612f3f565b612fb48185612f4a565b9350612fc4818560208601612f5b565b612fcd81612f8e565b840191505092915050565b60006020820190508181036000830152612ff28184612f9f565b905092915050565b6000819050919050565b61300d81612ffa565b811461301857600080fd5b50565b60008135905061302a81613004565b92915050565b60006020828403121561304657613045612e7a565b5b60006130548482850161301b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130888261305d565b9050919050565b6130988161307d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b6130c28161307d565b81146130cd57600080fd5b50565b6000813590506130df816130b9565b92915050565b600080604083850312156130fc576130fb612e7a565b5b600061310a858286016130d0565b925050602061311b8582860161301b565b9150509250929050565b61312e81612ffa565b82525050565b60006020820190506131496000830184613125565b92915050565b60008060006060848603121561316857613167612e7a565b5b6000613176868287016130d0565b9350506020613187868287016130d0565b92505060406131988682870161301b565b9150509250925092565b6000602082840312156131b8576131b7612e7a565b5b60006131c6848285016130d0565b91505092915050565b6000819050919050565b6131e2816131cf565b82525050565b60006020820190506131fd60008301846131d9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261322857613227613203565b5b8235905067ffffffffffffffff81111561324557613244613208565b5b6020830191508360018202830111156132615761326061320d565b5b9250929050565b6000806020838503121561327f5761327e612e7a565b5b600083013567ffffffffffffffff81111561329d5761329c612e7f565b5b6132a985828601613212565b92509250509250929050565b6132be81612f09565b81146132c957600080fd5b50565b6000813590506132db816132b5565b92915050565b6000602082840312156132f7576132f6612e7a565b5b6000613305848285016132cc565b91505092915050565b6000806040838503121561332557613324612e7a565b5b6000613333858286016130d0565b9250506020613344858286016132cc565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61338b82612f8e565b810181811067ffffffffffffffff821117156133aa576133a9613353565b5b80604052505050565b60006133bd612e70565b90506133c98282613382565b919050565b600067ffffffffffffffff8211156133e9576133e8613353565b5b6133f282612f8e565b9050602081019050919050565b82818337600083830152505050565b600061342161341c846133ce565b6133b3565b90508281526020810184848401111561343d5761343c61334e565b5b6134488482856133ff565b509392505050565b600082601f83011261346557613464613203565b5b813561347584826020860161340e565b91505092915050565b6000806000806080858703121561349857613497612e7a565b5b60006134a6878288016130d0565b94505060206134b7878288016130d0565b93505060406134c88782880161301b565b925050606085013567ffffffffffffffff8111156134e9576134e8612e7f565b5b6134f587828801613450565b91505092959194509250565b60008083601f84011261351757613516613203565b5b8235905067ffffffffffffffff81111561353457613533613208565b5b6020830191508360208202830111156135505761354f61320d565b5b9250929050565b6000806020838503121561356e5761356d612e7a565b5b600083013567ffffffffffffffff81111561358c5761358b612e7f565b5b61359885828601613501565b92509250509250929050565b600060ff82169050919050565b6135ba816135a4565b81146135c557600080fd5b50565b6000813590506135d7816135b1565b92915050565b60008083601f8401126135f3576135f2613203565b5b8235905067ffffffffffffffff8111156136105761360f613208565b5b60208301915083602082028301111561362c5761362b61320d565b5b9250929050565b60008060006040848603121561364c5761364b612e7a565b5b600061365a868287016135c8565b935050602084013567ffffffffffffffff81111561367b5761367a612e7f565b5b613687868287016135dd565b92509250509250925092565b600080604083850312156136aa576136a9612e7a565b5b60006136b8858286016130d0565b92505060206136c9858286016130d0565b9150509250929050565b600067ffffffffffffffff8211156136ee576136ed613353565b5b6136f782612f8e565b9050602081019050919050565b6000613717613712846136d3565b6133b3565b9050828152602081018484840111156137335761373261334e565b5b61373e8482856133ff565b509392505050565b600082601f83011261375b5761375a613203565b5b813561376b848260208601613704565b91505092915050565b60006020828403121561378a57613789612e7a565b5b600082013567ffffffffffffffff8111156137a8576137a7612e7f565b5b6137b484828501613746565b91505092915050565b6000806000604084860312156137d6576137d5612e7a565b5b600084013567ffffffffffffffff8111156137f4576137f3612e7f565b5b61380086828701613501565b935093505060206138138682870161301b565b9150509250925092565b613826816131cf565b811461383157600080fd5b50565b6000813590506138438161381d565b92915050565b60006020828403121561385f5761385e612e7a565b5b600061386d84828501613834565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138bd57607f821691505b6020821081036138d0576138cf613876565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061391082612ffa565b915061391b83612ffa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139505761394f6138d6565b5b828201905092915050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b6000613991601183612f4a565b915061399c8261395b565b602082019050919050565b600060208201905081810360008301526139c081613984565b9050919050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b60006139fd601983612f4a565b9150613a08826139c7565b602082019050919050565b60006020820190508181036000830152613a2c816139f0565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613aa07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a63565b613aaa8683613a63565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ae7613ae2613add84612ffa565b613ac2565b612ffa565b9050919050565b6000819050919050565b613b0183613acc565b613b15613b0d82613aee565b848454613a70565b825550505050565b600090565b613b2a613b1d565b613b35818484613af8565b505050565b5b81811015613b5957613b4e600082613b22565b600181019050613b3b565b5050565b601f821115613b9e57613b6f81613a3e565b613b7884613a53565b81016020851015613b87578190505b613b9b613b9385613a53565b830182613b3a565b50505b505050565b600082821c905092915050565b6000613bc160001984600802613ba3565b1980831691505092915050565b6000613bda8383613bb0565b9150826002028217905092915050565b613bf48383613a33565b67ffffffffffffffff811115613c0d57613c0c613353565b5b613c1782546138a5565b613c22828285613b5d565b6000601f831160018114613c515760008415613c3f578287013590505b613c498582613bce565b865550613cb1565b601f198416613c5f86613a3e565b60005b82811015613c8757848901358255600182019150602085019450602081019050613c62565b86831015613ca45784890135613ca0601f891682613bb0565b8355505b6001600288020188555050505b50505050505050565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b6000613cf0601d83612f4a565b9150613cfb82613cba565b602082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f4d757374206d696e74206d6f7265207468616e203020746f6b656e7300000000600082015250565b6000613d5c601c83612f4a565b9150613d6782613d26565b602082019050919050565b60006020820190508181036000830152613d8b81613d4f565b9050919050565b6000613d9d82612ffa565b9150613da883612ffa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613de157613de06138d6565b5b828202905092915050565b7f496e636f72726563742066756e64730000000000000000000000000000000000600082015250565b6000613e22600f83612f4a565b9150613e2d82613dec565b602082019050919050565b60006020820190508181036000830152613e5181613e15565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000613e8e601283612f4a565b9150613e9982613e58565b602082019050919050565b60006020820190508181036000830152613ebd81613e81565b9050919050565b7f65786365656473206d6178207065722061646472657373000000000000000000600082015250565b6000613efa601783612f4a565b9150613f0582613ec4565b602082019050919050565b60006020820190508181036000830152613f2981613eed565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000613f8c603083612f4a565b9150613f9782613f30565b604082019050919050565b60006020820190508181036000830152613fbb81613f7f565b9050919050565b600081905092915050565b6000613fd882612f3f565b613fe28185613fc2565b9350613ff2818560208601612f5b565b80840191505092915050565b6000815461400b816138a5565b6140158186613fc2565b94506001821660008114614030576001811461404557614078565b60ff1983168652811515820286019350614078565b61404e85613a3e565b60005b8381101561407057815481890152600182019150602081019050614051565b838801955050505b50505092915050565b600061408d8286613fcd565b91506140998285613fcd565b91506140a58284613ffe565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140ec82612ffa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411e5761411d6138d6565b5b600182019050919050565b7f5072652073616c65206973206e6f742061637469766500000000000000000000600082015250565b600061415f601683612f4a565b915061416a82614129565b602082019050919050565b6000602082019050818103600083015261418e81614152565b9050919050565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b60006141f1602283612f4a565b91506141fc82614195565b604082019050919050565b60006020820190508181036000830152614220816141e4565b9050919050565b60008160601b9050919050565b600061423f82614227565b9050919050565b600061425182614234565b9050919050565b6142696142648261307d565b614246565b82525050565b600061427b8284614258565b60148201915081905092915050565b7f496e76616c6964207369676e61747572652f2041646472657373206e6f74207760008201527f686974656c697374656400000000000000000000000000000000000000000000602082015250565b60006142e6602a83612f4a565b91506142f18261428a565b604082019050919050565b60006020820190508181036000830152614315816142d9565b9050919050565b61432582612f3f565b67ffffffffffffffff81111561433e5761433d613353565b5b61434882546138a5565b614353828285613b5d565b600060209050601f8311600181146143865760008415614374578287015190505b61437e8582613bce565b8655506143e6565b601f19841661439486613a3e565b60005b828110156143bc57848901518255600182019150602085019450602081019050614397565b868310156143d957848901516143d5601f891682613bb0565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444a602683612f4a565b9150614455826143ee565b604082019050919050565b600060208201905081810360008301526144798161443d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144b6602083612f4a565b91506144c182614480565b602082019050919050565b600060208201905081810360008301526144e5816144a9565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614513826144ec565b61451d81856144f7565b935061452d818560208601612f5b565b61453681612f8e565b840191505092915050565b6000608082019050614556600083018761308f565b614563602083018661308f565b6145706040830185613125565b81810360608301526145828184614508565b905095945050505050565b60008151905061459c81612eb0565b92915050565b6000602082840312156145b8576145b7612e7a565b5b60006145c68482850161458d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061460982612ffa565b915061461483612ffa565b925082614624576146236145cf565b5b828204905092915050565b600061463a82612ffa565b915061464583612ffa565b925082821015614658576146576138d6565b5b828203905092915050565b600061466e82612ffa565b915061467983612ffa565b925082614689576146886145cf565b5b82820690509291505056fea264697066735822122027b986c7d13f0354e6b4f01346c680ada0240285cf49663f28275da279845ba064736f6c634300080f0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000012416c69656e416e696d6174656450756e6b7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034141500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f616e696d6174656470756e6b7a2e696f2f6e6f6e2d72657665616c2f72657665616c2e6a736f6e0000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): AlienAnimatedPunkz
Arg [1] : symbol (string): AAP
Arg [2] : _notRevealedUri (string): https://animatedpunkz.io/non-reveal/reveal.json

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 416c69656e416e696d6174656450756e6b7a0000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4141500000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [8] : 68747470733a2f2f616e696d6174656470756e6b7a2e696f2f6e6f6e2d726576
Arg [9] : 65616c2f72657665616c2e6a736f6e0000000000000000000000000000000000


Deployed Bytecode Sourcemap

59511:7169:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29325:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34972:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36918:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59570:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36466:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61510:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60166:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66200:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62616:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59979:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28379:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61737:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59809:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46183:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60275:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60488:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59766:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62088:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66446:227;;;:::i;:::-;;37808:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61981:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63413:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59714:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34761:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60233:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61616:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30004:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13962:103;;;;;;;;;;;;;:::i;:::-;;59939:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59852:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60061:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60020:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59670:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13314:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63817:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35141:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60394:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37194:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65416:772;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38064:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59612:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60779:618;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60112:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61409:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62215:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60329:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59894:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65128:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63920:1196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37573:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63671:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14220:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62933:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62351:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61861:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62490:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29325:615;29410:4;29725:10;29710:25;;:11;:25;;;;:102;;;;29802:10;29787:25;;:11;:25;;;;29710:102;:179;;;;29879:10;29864:25;;:11;:25;;;;29710:179;29690:199;;29325:615;;;:::o;34972:100::-;35026:13;35059:5;35052:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34972:100;:::o;36918:204::-;36986:7;37011:16;37019:7;37011;:16::i;:::-;37006:64;;37036:34;;;;;;;;;;;;;;37006:64;37090:15;:24;37106:7;37090:24;;;;;;;;;;;;;;;;;;;;;37083:31;;36918:204;;;:::o;59570:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36466:386::-;36539:13;36555:16;36563:7;36555;:16::i;:::-;36539:32;;36611:5;36588:28;;:19;:17;:19::i;:::-;:28;;;36584:175;;36636:44;36653:5;36660:19;:17;:19::i;:::-;36636:16;:44::i;:::-;36631:128;;36708:35;;;;;;;;;;;;;;36631:128;36584:175;36798:2;36771:15;:24;36787:7;36771:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36836:7;36832:2;36816:28;;36825:5;36816:28;;;;;;;;;;;;36528:324;36466:386;;:::o;61510:94::-;61554:7;61584:8;;61577:15;;61510:94;:::o;60166:27::-;;;;:::o;66200:107::-;66243:7;66274:21;66267:28;;66200:107;:::o;62616:304::-;13200:13;:11;:13::i;:::-;62741:9:::1;;62729:8;62713:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;62687:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;62818:31;62828:10;62840:8;62818:9;:31::i;:::-;62900:8;62882:15;;:26;;;;:::i;:::-;62864:15;:44;;;;62616:304:::0;:::o;59979:30::-;;;;:::o;28379:315::-;28432:7;28660:15;:13;:15::i;:::-;28645:12;;28629:13;;:28;:46;28622:53;;28379:315;:::o;61737:112::-;13200:13;:11;:13::i;:::-;61826:11:::1;61813:10;:24;;;;61737:112:::0;:::o;59809:32::-;;;;:::o;46183:2800::-;46317:27;46347;46366:7;46347:18;:27::i;:::-;46317:57;;46432:4;46391:45;;46407:19;46391:45;;;46387:86;;46445:28;;;;;;;;;;;;;;46387:86;46487:27;46516:23;46543:28;46563:7;46543:19;:28::i;:::-;46486:85;;;;46671:62;46690:15;46707:4;46713:19;:17;:19::i;:::-;46671:18;:62::i;:::-;46666:174;;46753:43;46770:4;46776:19;:17;:19::i;:::-;46753:16;:43::i;:::-;46748:92;;46805:35;;;;;;;;;;;;;;46748:92;46666:174;46871:1;46857:16;;:2;:16;;;46853:52;;46882:23;;;;;;;;;;;;;;46853:52;46918:43;46940:4;46946:2;46950:7;46959:1;46918:21;:43::i;:::-;47054:15;47051:160;;;47194:1;47173:19;47166:30;47051:160;47589:18;:24;47608:4;47589:24;;;;;;;;;;;;;;;;47587:26;;;;;;;;;;;;47658:18;:22;47677:2;47658:22;;;;;;;;;;;;;;;;47656:24;;;;;;;;;;;47980:145;48017:2;48065:45;48080:4;48086:2;48090:19;48065:14;:45::i;:::-;25607:8;48038:72;47980:18;:145::i;:::-;47951:17;:26;47969:7;47951:26;;;;;;;;;;;:174;;;;48295:1;25607:8;48245:19;:46;:51;48241:626;;48317:19;48349:1;48339:7;:11;48317:33;;48506:1;48472:17;:30;48490:11;48472:30;;;;;;;;;;;;:35;48468:384;;48610:13;;48595:11;:28;48591:242;;48790:19;48757:17;:30;48775:11;48757:30;;;;;;;;;;;:52;;;;48591:242;48468:384;48298:569;48241:626;48914:7;48910:2;48895:27;;48904:4;48895:27;;;;;;;;;;;;48933:42;48954:4;48960:2;48964:7;48973:1;48933:20;:42::i;:::-;46306:2677;;;46183:2800;;;:::o;60275:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;60488:26::-;;;;:::o;59766:32::-;;;;:::o;62088:115::-;13200:13;:11;:13::i;:::-;62183:8:::1;62167:13;:24;;;;62088:115:::0;:::o;66446:227::-;13200:13;:11;:13::i;:::-;66506:15:::1;66524:21;66506:39;;66578:1;66568:7;:11;66560:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;66632:10;66624:28;;:37;66653:7;66624:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66491:182;66446:227::o:0;37808:185::-;37946:39;37963:4;37969:2;37973:7;37946:39;;;;;;;;;;;;:16;:39::i;:::-;37808:185;;;:::o;61981:95::-;13200:13;:11;:13::i;:::-;62056:8:::1;62048:5;:16;;;;61981:95:::0;:::o;63413:112::-;13200:13;:11;:13::i;:::-;63506:7:::1;;63490:13;:23;;;;;;;:::i;:::-;;63413:112:::0;;:::o;59714:41::-;;;;:::o;34761:144::-;34825:7;34868:27;34887:7;34868:18;:27::i;:::-;34845:52;;34761:144;;;:::o;60233:29::-;;;;;;;;;;;;;:::o;61616:109::-;13200:13;:11;:13::i;:::-;61703:10:::1;61690;:23;;;;61616:109:::0;:::o;30004:224::-;30068:7;30109:1;30092:19;;:5;:19;;;30088:60;;30120:28;;;;;;;;;;;;;;30088:60;24559:13;30166:18;:25;30185:5;30166:25;;;;;;;;;;;;;;;;:54;30159:61;;30004:224;;;:::o;13962:103::-;13200:13;:11;:13::i;:::-;14027:30:::1;14054:1;14027:18;:30::i;:::-;13962:103::o:0;59939:29::-;;;;:::o;59852:31::-;;;;:::o;60061:40::-;;;;:::o;60020:30::-;;;;:::o;59670:33::-;;;;:::o;13314:87::-;13360:7;13387:6;;;;;;;;;;;13380:13;;13314:87;:::o;63817:91::-;13200:13;:11;:13::i;:::-;63890:6:::1;63878:9;;:18;;;;;;;;;;;;;;;;;;63817:91:::0;:::o;35141:104::-;35197:13;35230:7;35223:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35141:104;:::o;60394:57::-;;;;;;;;;;;;;;;;;:::o;37194:308::-;37305:19;:17;:19::i;:::-;37293:31;;:8;:31;;;37289:61;;37333:17;;;;;;;;;;;;;;37289:61;37415:8;37363:18;:39;37382:19;:17;:19::i;:::-;37363:39;;;;;;;;;;;;;;;:49;37403:8;37363:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37475:8;37439:55;;37454:19;:17;:19::i;:::-;37439:55;;;37485:8;37439:55;;;;;;:::i;:::-;;;;;;;;37194:308;;:::o;65416:772::-;65543:1;65531:8;;:13;65523:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;65612:1;65601:8;:12;65593:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;65689:9;65677:8;65669:5;;:16;;;;:::i;:::-;:29;65661:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65770:9;;65758:8;65741:14;;:25;;;;:::i;:::-;:38;;65733:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65892:23;;65880:8;65843:22;:34;65866:10;65843:34;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:72;;65817:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;65991:31;66001:10;66013:8;65991:9;:31::i;:::-;66071:8;66054:14;;:25;;;;:::i;:::-;66037:14;:42;;;;66168:8;66131:22;:34;66154:10;66131:34;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;66094:22;:34;66117:10;66094:34;;;;;;;;;;;;;;;:82;;;;65416:772;:::o;38064:399::-;38231:31;38244:4;38250:2;38254:7;38231:12;:31::i;:::-;38295:1;38277:2;:14;;;:19;38273:183;;38316:56;38347:4;38353:2;38357:7;38366:5;38316:30;:56::i;:::-;38311:145;;38400:40;;;;;;;;;;;;;;38311:145;38273:183;38064:399;;;;:::o;59612:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60779:618::-;60897:13;60962:16;60970:7;60962;:16::i;:::-;60936:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;61095:5;61082:18;;:9;;;;;;;;;;;:18;;;61079:79;;61128:14;61121:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61079:79;61174:28;61205:10;:8;:10::i;:::-;61174:41;;61268:1;61243:14;61237:28;:32;:148;;;;;;;;;;;;;;;;;61309:14;61325:25;61342:7;61325:16;:25::i;:::-;61352:13;61292:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61237:148;61230:155;;;60779:618;;;;:::o;60112:43::-;;;;:::o;61409:89::-;13200:13;:11;:13::i;:::-;61482:4:::1;61471:8;:15;;;;61409:89:::0;:::o;62215:124::-;13200:13;:11;:13::i;:::-;62320:7:::1;62297:20;:30;;;;62215:124:::0;:::o;60329:54::-;;;;;;;;;;;;;;;;;:::o;59894:34::-;;;;:::o;65128:252::-;13200:13;:11;:13::i;:::-;65262:9:::1;65257:112;65281:9;;:16;;65277:1;:20;65257:112;;;65349:4;65323:9;:23;65333:9;;65343:1;65333:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65323:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;65299:3;;;;;:::i;:::-;;;;65257:112;;;;65128:252:::0;;:::o;63920:1196::-;64081:1;64069:8;;:13;64061:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;64184:10;;64172:8;64150:30;;:19;;:30;;;;:::i;:::-;:44;;64124:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;64298:1;64287:8;:12;;;64279:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;64419:20;;64407:8;64373:42;;:19;:31;64393:10;64373:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:66;;64347:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;64549:9;64537:8;64521:24;;:13;;:24;;;;:::i;:::-;:37;64513:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64630:12;64672:10;64655:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;64645:39;;;;;;64630:54;;64725:51;64744:12;;64725:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64758:11;;64771:4;64725:18;:51::i;:::-;:97;;;;64801:9;:21;64811:10;64801:21;;;;;;;;;;;;;;;;;;;;;;;;;64725:97;64699:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;64915:31;64925:10;64937:8;64915:31;;:9;:31::i;:::-;65005:8;64983:30;;:19;;:30;;;;:::i;:::-;64961:19;:52;;;;65096:8;65062:42;;:19;:31;65082:10;65062:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;65028:19;:31;65048:10;65028:31;;;;;;;;;;;;;;;:76;;;;64046:1070;63920:1196;;;:::o;37573:164::-;37670:4;37694:18;:25;37713:5;37694:25;;;;;;;;;;;;;;;:35;37720:8;37694:35;;;;;;;;;;;;;;;;;;;;;;;;;37687:42;;37573:164;;;;:::o;63671:134::-;13200:13;:11;:13::i;:::-;63778:15:::1;63761:14;:32;;;;;;:::i;:::-;;63671:134:::0;:::o;14220:201::-;13200:13;:11;:13::i;:::-;14329:1:::1;14309:22;;:8;:22;;::::0;14301:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14385:28;14404:8;14385:18;:28::i;:::-;14220:201:::0;:::o;62933:402::-;13200:13;:11;:13::i;:::-;63081:9:::1;;63069:8;63053:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;63027:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;63163:9;63158:166;63182:3;;:10;;63178:1;:14;63158:166;;;63218:27;63228:3;;63232:1;63228:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63236:8;63218:9;:27::i;:::-;63300:8;63282:15;;:26;;;;:::i;:::-;63264:15;:44;;;;63194:3;;;;;:::i;:::-;;;;63158:166;;;;62933:402:::0;;;:::o;62351:127::-;13200:13;:11;:13::i;:::-;62459:7:::1;62433:23;:33;;;;62351:127:::0;:::o;61861:108::-;13200:13;:11;:13::i;:::-;61947:10:::1;61935:9;:22;;;;61861:108:::0;:::o;62490:114::-;13200:13;:11;:13::i;:::-;62581:11:::1;62567;:25;;;;62490:114:::0;:::o;38718:273::-;38775:4;38831:7;38812:15;:13;:15::i;:::-;:26;;:66;;;;;38865:13;;38855:7;:23;38812:66;:152;;;;;38963:1;25329:8;38916:17;:26;38934:7;38916:26;;;;;;;;;;;;:43;:48;38812:152;38792:172;;38718:273;;;:::o;57279:105::-;57339:7;57366:10;57359:17;;57279:105;:::o;13479:132::-;13554:12;:10;:12::i;:::-;13543:23;;:7;:5;:7::i;:::-;:23;;;13535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13479:132::o;39075:104::-;39144:27;39154:2;39158:8;39144:27;;;;;;;;;;;;:9;:27::i;:::-;39075:104;;:::o;66325:109::-;66390:7;66421:1;66414:8;;66325:109;:::o;31678:1129::-;31745:7;31765:12;31780:7;31765:22;;31848:4;31829:15;:13;:15::i;:::-;:23;31825:915;;31882:13;;31875:4;:20;31871:869;;;31920:14;31937:17;:23;31955:4;31937:23;;;;;;;;;;;;31920:40;;32053:1;25329:8;32026:6;:23;:28;32022:699;;32545:113;32562:1;32552:6;:11;32545:113;;32605:17;:25;32623:6;;;;;;;32605:25;;;;;;;;;;;;32596:34;;32545:113;;;32691:6;32684:13;;;;;;32022:699;31897:843;31871:869;31825:915;32768:31;;;;;;;;;;;;;;31678:1129;;;;:::o;44519:652::-;44614:27;44643:23;44684:53;44740:15;44684:71;;44926:7;44920:4;44913:21;44961:22;44955:4;44948:36;45037:4;45031;45021:21;44998:44;;45133:19;45127:26;45108:45;;44864:300;44519:652;;;:::o;45284:645::-;45426:11;45588:15;45582:4;45578:26;45570:34;;45747:15;45736:9;45732:31;45719:44;;45894:15;45883:9;45880:30;45873:4;45862:9;45859:19;45856:55;45846:65;;45284:645;;;;;:::o;56112:159::-;;;;;:::o;54424:309::-;54559:7;54579:16;25730:3;54605:19;:40;;54579:67;;25730:3;54672:31;54683:4;54689:2;54693:9;54672:10;:31::i;:::-;54664:40;;:61;;54657:68;;;54424:309;;;;;:::o;34252:447::-;34332:14;34500:15;34493:5;34489:27;34480:36;;34674:5;34660:11;34636:22;34632:40;34629:51;34622:5;34619:62;34609:72;;34252:447;;;;:::o;56930:158::-;;;;;:::o;14581:191::-;14655:16;14674:6;;;;;;;;;;;14655:25;;14700:8;14691:6;;:17;;;;;;;;;;;;;;;;;;14755:8;14724:40;;14745:8;14724:40;;;;;;;;;;;;14644:128;14581:191;:::o;52934:716::-;53097:4;53143:2;53118:45;;;53164:19;:17;:19::i;:::-;53185:4;53191:7;53200:5;53118:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53114:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53418:1;53401:6;:13;:18;53397:235;;53447:40;;;;;;;;;;;;;;53397:235;53590:6;53584:13;53575:6;53571:2;53567:15;53560:38;53114:529;53287:54;;;53277:64;;;:6;:64;;;;53270:71;;;52934:716;;;;;;:::o;63537:122::-;63597:13;63634;63627:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63537:122;:::o;9165:723::-;9221:13;9451:1;9442:5;:10;9438:53;;9469:10;;;;;;;;;;;;;;;;;;;;;9438:53;9501:12;9516:5;9501:20;;9532:14;9557:78;9572:1;9564:4;:9;9557:78;;9590:8;;;;;:::i;:::-;;;;9621:2;9613:10;;;;;:::i;:::-;;;9557:78;;;9645:19;9677:6;9667:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9645:39;;9695:154;9711:1;9702:5;:10;9695:154;;9739:1;9729:11;;;;;:::i;:::-;;;9806:2;9798:5;:10;;;;:::i;:::-;9785:2;:24;;;;:::i;:::-;9772:39;;9755:6;9762;9755:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9835:2;9826:11;;;;;:::i;:::-;;;9695:154;;;9873:6;9859:21;;;;;9165:723;;;;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;11888:98::-;11941:7;11968:10;11961:17;;11888:98;:::o;39595:681::-;39718:19;39724:2;39728:8;39718:5;:19::i;:::-;39797:1;39779:2;:14;;;:19;39775:483;;39819:11;39833:13;;39819:27;;39865:13;39887:8;39881:3;:14;39865:30;;39914:233;39945:62;39984:1;39988:2;39992:7;;;;;;40001:5;39945:30;:62::i;:::-;39940:167;;40043:40;;;;;;;;;;;;;;39940:167;40142:3;40134:5;:11;39914:233;;40229:3;40212:13;;:20;40208:34;;40234:8;;;40208:34;39800:458;;39775:483;39595:681;;;:::o;55309:147::-;55446:6;55309:147;;;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;:::i;:::-;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;40549:1529::-;40614:20;40637:13;;40614:36;;40679:1;40665:16;;:2;:16;;;40661:48;;40690:19;;;;;;;;;;;;;;40661:48;40736:1;40724:8;:13;40720:44;;40746:18;;;;;;;;;;;;;;40720:44;40777:61;40807:1;40811:2;40815:12;40829:8;40777:21;:61::i;:::-;41320:1;24696:2;41291:1;:25;;41290:31;41278:8;:44;41252:18;:22;41271:2;41252:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;41599:139;41636:2;41690:33;41713:1;41717:2;41721:1;41690:14;:33::i;:::-;41657:30;41678:8;41657:20;:30::i;:::-;:66;41599:18;:139::i;:::-;41565:17;:31;41583:12;41565:31;;;;;;;;;;;:173;;;;41755:15;41773:12;41755:30;;41800:11;41829:8;41814:12;:23;41800:37;;41852:101;41904:9;;;;;;41900:2;41879:35;;41896:1;41879:35;;;;;;;;;;;;41948:3;41938:7;:13;41852:101;;41985:3;41969:13;:19;;;;41026:974;;42010:60;42039:1;42043:2;42047:12;42061:8;42010:20;:60::i;:::-;40603:1475;40549:1529;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;36082:322::-;36152:14;36383:1;36373:8;36370:15;36345:23;36341:45;36331:55;;36082:322;;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8483:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:118::-;6420:24;6438:5;6420:24;:::i;:::-;6415:3;6408:37;6333:118;;:::o;6457:222::-;6550:4;6588:2;6577:9;6573:18;6565:26;;6601:71;6669:1;6658:9;6654:17;6645:6;6601:71;:::i;:::-;6457:222;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:117;7040:1;7037;7030:12;7068:553;7126:8;7136:6;7186:3;7179:4;7171:6;7167:17;7163:27;7153:122;;7194:79;;:::i;:::-;7153:122;7307:6;7294:20;7284:30;;7337:18;7329:6;7326:30;7323:117;;;7359:79;;:::i;:::-;7323:117;7473:4;7465:6;7461:17;7449:29;;7527:3;7519:4;7511:6;7507:17;7497:8;7493:32;7490:41;7487:128;;;7534:79;;:::i;:::-;7487:128;7068:553;;;;;:::o;7627:529::-;7698:6;7706;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7909:1;7898:9;7894:17;7881:31;7939:18;7931:6;7928:30;7925:117;;;7961:79;;:::i;:::-;7925:117;8074:65;8131:7;8122:6;8111:9;8107:22;8074:65;:::i;:::-;8056:83;;;;7852:297;7627:529;;;;;:::o;8162:116::-;8232:21;8247:5;8232:21;:::i;:::-;8225:5;8222:32;8212:60;;8268:1;8265;8258:12;8212:60;8162:116;:::o;8284:133::-;8327:5;8365:6;8352:20;8343:29;;8381:30;8405:5;8381:30;:::i;:::-;8284:133;;;;:::o;8423:323::-;8479:6;8528:2;8516:9;8507:7;8503:23;8499:32;8496:119;;;8534:79;;:::i;:::-;8496:119;8654:1;8679:50;8721:7;8712:6;8701:9;8697:22;8679:50;:::i;:::-;8669:60;;8625:114;8423:323;;;;:::o;8752:468::-;8817:6;8825;8874:2;8862:9;8853:7;8849:23;8845:32;8842:119;;;8880:79;;:::i;:::-;8842:119;9000:1;9025:53;9070:7;9061:6;9050:9;9046:22;9025:53;:::i;:::-;9015:63;;8971:117;9127:2;9153:50;9195:7;9186:6;9175:9;9171:22;9153:50;:::i;:::-;9143:60;;9098:115;8752:468;;;;;:::o;9226:117::-;9335:1;9332;9325:12;9349:180;9397:77;9394:1;9387:88;9494:4;9491:1;9484:15;9518:4;9515:1;9508:15;9535:281;9618:27;9640:4;9618:27;:::i;:::-;9610:6;9606:40;9748:6;9736:10;9733:22;9712:18;9700:10;9697:34;9694:62;9691:88;;;9759:18;;:::i;:::-;9691:88;9799:10;9795:2;9788:22;9578:238;9535:281;;:::o;9822:129::-;9856:6;9883:20;;:::i;:::-;9873:30;;9912:33;9940:4;9932:6;9912:33;:::i;:::-;9822:129;;;:::o;9957:307::-;10018:4;10108:18;10100:6;10097:30;10094:56;;;10130:18;;:::i;:::-;10094:56;10168:29;10190:6;10168:29;:::i;:::-;10160:37;;10252:4;10246;10242:15;10234:23;;9957:307;;;:::o;10270:154::-;10354:6;10349:3;10344;10331:30;10416:1;10407:6;10402:3;10398:16;10391:27;10270:154;;;:::o;10430:410::-;10507:5;10532:65;10548:48;10589:6;10548:48;:::i;:::-;10532:65;:::i;:::-;10523:74;;10620:6;10613:5;10606:21;10658:4;10651:5;10647:16;10696:3;10687:6;10682:3;10678:16;10675:25;10672:112;;;10703:79;;:::i;:::-;10672:112;10793:41;10827:6;10822:3;10817;10793:41;:::i;:::-;10513:327;10430:410;;;;;:::o;10859:338::-;10914:5;10963:3;10956:4;10948:6;10944:17;10940:27;10930:122;;10971:79;;:::i;:::-;10930:122;11088:6;11075:20;11113:78;11187:3;11179:6;11172:4;11164:6;11160:17;11113:78;:::i;:::-;11104:87;;10920:277;10859:338;;;;:::o;11203:943::-;11298:6;11306;11314;11322;11371:3;11359:9;11350:7;11346:23;11342:33;11339:120;;;11378:79;;:::i;:::-;11339:120;11498:1;11523:53;11568:7;11559:6;11548:9;11544:22;11523:53;:::i;:::-;11513:63;;11469:117;11625:2;11651:53;11696:7;11687:6;11676:9;11672:22;11651:53;:::i;:::-;11641:63;;11596:118;11753:2;11779:53;11824:7;11815:6;11804:9;11800:22;11779:53;:::i;:::-;11769:63;;11724:118;11909:2;11898:9;11894:18;11881:32;11940:18;11932:6;11929:30;11926:117;;;11962:79;;:::i;:::-;11926:117;12067:62;12121:7;12112:6;12101:9;12097:22;12067:62;:::i;:::-;12057:72;;11852:287;11203:943;;;;;;;:::o;12169:568::-;12242:8;12252:6;12302:3;12295:4;12287:6;12283:17;12279:27;12269:122;;12310:79;;:::i;:::-;12269:122;12423:6;12410:20;12400:30;;12453:18;12445:6;12442:30;12439:117;;;12475:79;;:::i;:::-;12439:117;12589:4;12581:6;12577:17;12565:29;;12643:3;12635:4;12627:6;12623:17;12613:8;12609:32;12606:41;12603:128;;;12650:79;;:::i;:::-;12603:128;12169:568;;;;;:::o;12743:559::-;12829:6;12837;12886:2;12874:9;12865:7;12861:23;12857:32;12854:119;;;12892:79;;:::i;:::-;12854:119;13040:1;13029:9;13025:17;13012:31;13070:18;13062:6;13059:30;13056:117;;;13092:79;;:::i;:::-;13056:117;13205:80;13277:7;13268:6;13257:9;13253:22;13205:80;:::i;:::-;13187:98;;;;12983:312;12743:559;;;;;:::o;13308:86::-;13343:7;13383:4;13376:5;13372:16;13361:27;;13308:86;;;:::o;13400:118::-;13471:22;13487:5;13471:22;:::i;:::-;13464:5;13461:33;13451:61;;13508:1;13505;13498:12;13451:61;13400:118;:::o;13524:135::-;13568:5;13606:6;13593:20;13584:29;;13622:31;13647:5;13622:31;:::i;:::-;13524:135;;;;:::o;13682:568::-;13755:8;13765:6;13815:3;13808:4;13800:6;13796:17;13792:27;13782:122;;13823:79;;:::i;:::-;13782:122;13936:6;13923:20;13913:30;;13966:18;13958:6;13955:30;13952:117;;;13988:79;;:::i;:::-;13952:117;14102:4;14094:6;14090:17;14078:29;;14156:3;14148:4;14140:6;14136:17;14126:8;14122:32;14119:41;14116:128;;;14163:79;;:::i;:::-;14116:128;13682:568;;;;;:::o;14256:700::-;14349:6;14357;14365;14414:2;14402:9;14393:7;14389:23;14385:32;14382:119;;;14420:79;;:::i;:::-;14382:119;14540:1;14565:51;14608:7;14599:6;14588:9;14584:22;14565:51;:::i;:::-;14555:61;;14511:115;14693:2;14682:9;14678:18;14665:32;14724:18;14716:6;14713:30;14710:117;;;14746:79;;:::i;:::-;14710:117;14859:80;14931:7;14922:6;14911:9;14907:22;14859:80;:::i;:::-;14841:98;;;;14636:313;14256:700;;;;;:::o;14962:474::-;15030:6;15038;15087:2;15075:9;15066:7;15062:23;15058:32;15055:119;;;15093:79;;:::i;:::-;15055:119;15213:1;15238:53;15283:7;15274:6;15263:9;15259:22;15238:53;:::i;:::-;15228:63;;15184:117;15340:2;15366:53;15411:7;15402:6;15391:9;15387:22;15366:53;:::i;:::-;15356:63;;15311:118;14962:474;;;;;:::o;15442:308::-;15504:4;15594:18;15586:6;15583:30;15580:56;;;15616:18;;:::i;:::-;15580:56;15654:29;15676:6;15654:29;:::i;:::-;15646:37;;15738:4;15732;15728:15;15720:23;;15442:308;;;:::o;15756:412::-;15834:5;15859:66;15875:49;15917:6;15875:49;:::i;:::-;15859:66;:::i;:::-;15850:75;;15948:6;15941:5;15934:21;15986:4;15979:5;15975:16;16024:3;16015:6;16010:3;16006:16;16003:25;16000:112;;;16031:79;;:::i;:::-;16000:112;16121:41;16155:6;16150:3;16145;16121:41;:::i;:::-;15840:328;15756:412;;;;;:::o;16188:340::-;16244:5;16293:3;16286:4;16278:6;16274:17;16270:27;16260:122;;16301:79;;:::i;:::-;16260:122;16418:6;16405:20;16443:79;16518:3;16510:6;16503:4;16495:6;16491:17;16443:79;:::i;:::-;16434:88;;16250:278;16188:340;;;;:::o;16534:509::-;16603:6;16652:2;16640:9;16631:7;16627:23;16623:32;16620:119;;;16658:79;;:::i;:::-;16620:119;16806:1;16795:9;16791:17;16778:31;16836:18;16828:6;16825:30;16822:117;;;16858:79;;:::i;:::-;16822:117;16963:63;17018:7;17009:6;16998:9;16994:22;16963:63;:::i;:::-;16953:73;;16749:287;16534:509;;;;:::o;17049:704::-;17144:6;17152;17160;17209:2;17197:9;17188:7;17184:23;17180:32;17177:119;;;17215:79;;:::i;:::-;17177:119;17363:1;17352:9;17348:17;17335:31;17393:18;17385:6;17382:30;17379:117;;;17415:79;;:::i;:::-;17379:117;17528:80;17600:7;17591:6;17580:9;17576:22;17528:80;:::i;:::-;17510:98;;;;17306:312;17657:2;17683:53;17728:7;17719:6;17708:9;17704:22;17683:53;:::i;:::-;17673:63;;17628:118;17049:704;;;;;:::o;17759:122::-;17832:24;17850:5;17832:24;:::i;:::-;17825:5;17822:35;17812:63;;17871:1;17868;17861:12;17812:63;17759:122;:::o;17887:139::-;17933:5;17971:6;17958:20;17949:29;;17987:33;18014:5;17987:33;:::i;:::-;17887:139;;;;:::o;18032:329::-;18091:6;18140:2;18128:9;18119:7;18115:23;18111:32;18108:119;;;18146:79;;:::i;:::-;18108:119;18266:1;18291:53;18336:7;18327:6;18316:9;18312:22;18291:53;:::i;:::-;18281:63;;18237:117;18032:329;;;;:::o;18367:180::-;18415:77;18412:1;18405:88;18512:4;18509:1;18502:15;18536:4;18533:1;18526:15;18553:320;18597:6;18634:1;18628:4;18624:12;18614:22;;18681:1;18675:4;18671:12;18702:18;18692:81;;18758:4;18750:6;18746:17;18736:27;;18692:81;18820:2;18812:6;18809:14;18789:18;18786:38;18783:84;;18839:18;;:::i;:::-;18783:84;18604:269;18553:320;;;:::o;18879:180::-;18927:77;18924:1;18917:88;19024:4;19021:1;19014:15;19048:4;19045:1;19038:15;19065:305;19105:3;19124:20;19142:1;19124:20;:::i;:::-;19119:25;;19158:20;19176:1;19158:20;:::i;:::-;19153:25;;19312:1;19244:66;19240:74;19237:1;19234:81;19231:107;;;19318:18;;:::i;:::-;19231:107;19362:1;19359;19355:9;19348:16;;19065:305;;;;:::o;19376:167::-;19516:19;19512:1;19504:6;19500:14;19493:43;19376:167;:::o;19549:366::-;19691:3;19712:67;19776:2;19771:3;19712:67;:::i;:::-;19705:74;;19788:93;19877:3;19788:93;:::i;:::-;19906:2;19901:3;19897:12;19890:19;;19549:366;;;:::o;19921:419::-;20087:4;20125:2;20114:9;20110:18;20102:26;;20174:9;20168:4;20164:20;20160:1;20149:9;20145:17;20138:47;20202:131;20328:4;20202:131;:::i;:::-;20194:139;;19921:419;;;:::o;20346:175::-;20486:27;20482:1;20474:6;20470:14;20463:51;20346:175;:::o;20527:366::-;20669:3;20690:67;20754:2;20749:3;20690:67;:::i;:::-;20683:74;;20766:93;20855:3;20766:93;:::i;:::-;20884:2;20879:3;20875:12;20868:19;;20527:366;;;:::o;20899:419::-;21065:4;21103:2;21092:9;21088:18;21080:26;;21152:9;21146:4;21142:20;21138:1;21127:9;21123:17;21116:47;21180:131;21306:4;21180:131;:::i;:::-;21172:139;;20899:419;;;:::o;21324:97::-;21383:6;21411:3;21401:13;;21324:97;;;;:::o;21427:141::-;21476:4;21499:3;21491:11;;21522:3;21519:1;21512:14;21556:4;21553:1;21543:18;21535:26;;21427:141;;;:::o;21574:93::-;21611:6;21658:2;21653;21646:5;21642:14;21638:23;21628:33;;21574:93;;;:::o;21673:107::-;21717:8;21767:5;21761:4;21757:16;21736:37;;21673:107;;;;:::o;21786:393::-;21855:6;21905:1;21893:10;21889:18;21928:97;21958:66;21947:9;21928:97;:::i;:::-;22046:39;22076:8;22065:9;22046:39;:::i;:::-;22034:51;;22118:4;22114:9;22107:5;22103:21;22094:30;;22167:4;22157:8;22153:19;22146:5;22143:30;22133:40;;21862:317;;21786:393;;;;;:::o;22185:60::-;22213:3;22234:5;22227:12;;22185:60;;;:::o;22251:142::-;22301:9;22334:53;22352:34;22361:24;22379:5;22361:24;:::i;:::-;22352:34;:::i;:::-;22334:53;:::i;:::-;22321:66;;22251:142;;;:::o;22399:75::-;22442:3;22463:5;22456:12;;22399:75;;;:::o;22480:269::-;22590:39;22621:7;22590:39;:::i;:::-;22651:91;22700:41;22724:16;22700:41;:::i;:::-;22692:6;22685:4;22679:11;22651:91;:::i;:::-;22645:4;22638:105;22556:193;22480:269;;;:::o;22755:73::-;22800:3;22755:73;:::o;22834:189::-;22911:32;;:::i;:::-;22952:65;23010:6;23002;22996:4;22952:65;:::i;:::-;22887:136;22834:189;;:::o;23029:186::-;23089:120;23106:3;23099:5;23096:14;23089:120;;;23160:39;23197:1;23190:5;23160:39;:::i;:::-;23133:1;23126:5;23122:13;23113:22;;23089:120;;;23029:186;;:::o;23221:543::-;23322:2;23317:3;23314:11;23311:446;;;23356:38;23388:5;23356:38;:::i;:::-;23440:29;23458:10;23440:29;:::i;:::-;23430:8;23426:44;23623:2;23611:10;23608:18;23605:49;;;23644:8;23629:23;;23605:49;23667:80;23723:22;23741:3;23723:22;:::i;:::-;23713:8;23709:37;23696:11;23667:80;:::i;:::-;23326:431;;23311:446;23221:543;;;:::o;23770:117::-;23824:8;23874:5;23868:4;23864:16;23843:37;;23770:117;;;;:::o;23893:169::-;23937:6;23970:51;24018:1;24014:6;24006:5;24003:1;23999:13;23970:51;:::i;:::-;23966:56;24051:4;24045;24041:15;24031:25;;23944:118;23893:169;;;;:::o;24067:295::-;24143:4;24289:29;24314:3;24308:4;24289:29;:::i;:::-;24281:37;;24351:3;24348:1;24344:11;24338:4;24335:21;24327:29;;24067:295;;;;:::o;24367:1403::-;24491:44;24531:3;24526;24491:44;:::i;:::-;24600:18;24592:6;24589:30;24586:56;;;24622:18;;:::i;:::-;24586:56;24666:38;24698:4;24692:11;24666:38;:::i;:::-;24751:67;24811:6;24803;24797:4;24751:67;:::i;:::-;24845:1;24874:2;24866:6;24863:14;24891:1;24886:632;;;;25562:1;25579:6;25576:84;;;25635:9;25630:3;25626:19;25613:33;25604:42;;25576:84;25686:67;25746:6;25739:5;25686:67;:::i;:::-;25680:4;25673:81;25535:229;24856:908;;24886:632;24938:4;24934:9;24926:6;24922:22;24972:37;25004:4;24972:37;:::i;:::-;25031:1;25045:215;25059:7;25056:1;25053:14;25045:215;;;25145:9;25140:3;25136:19;25123:33;25115:6;25108:49;25196:1;25188:6;25184:14;25174:24;;25243:2;25232:9;25228:18;25215:31;;25082:4;25079:1;25075:12;25070:17;;25045:215;;;25288:6;25279:7;25276:19;25273:186;;;25353:9;25348:3;25344:19;25331:33;25396:48;25438:4;25430:6;25426:17;25415:9;25396:48;:::i;:::-;25388:6;25381:64;25296:163;25273:186;25505:1;25501;25493:6;25489:14;25485:22;25479:4;25472:36;24893:625;;;24856:908;;24466:1304;;;24367:1403;;;:::o;25776:179::-;25916:31;25912:1;25904:6;25900:14;25893:55;25776:179;:::o;25961:366::-;26103:3;26124:67;26188:2;26183:3;26124:67;:::i;:::-;26117:74;;26200:93;26289:3;26200:93;:::i;:::-;26318:2;26313:3;26309:12;26302:19;;25961:366;;;:::o;26333:419::-;26499:4;26537:2;26526:9;26522:18;26514:26;;26586:9;26580:4;26576:20;26572:1;26561:9;26557:17;26550:47;26614:131;26740:4;26614:131;:::i;:::-;26606:139;;26333:419;;;:::o;26758:178::-;26898:30;26894:1;26886:6;26882:14;26875:54;26758:178;:::o;26942:366::-;27084:3;27105:67;27169:2;27164:3;27105:67;:::i;:::-;27098:74;;27181:93;27270:3;27181:93;:::i;:::-;27299:2;27294:3;27290:12;27283:19;;26942:366;;;:::o;27314:419::-;27480:4;27518:2;27507:9;27503:18;27495:26;;27567:9;27561:4;27557:20;27553:1;27542:9;27538:17;27531:47;27595:131;27721:4;27595:131;:::i;:::-;27587:139;;27314:419;;;:::o;27739:348::-;27779:7;27802:20;27820:1;27802:20;:::i;:::-;27797:25;;27836:20;27854:1;27836:20;:::i;:::-;27831:25;;28024:1;27956:66;27952:74;27949:1;27946:81;27941:1;27934:9;27927:17;27923:105;27920:131;;;28031:18;;:::i;:::-;27920:131;28079:1;28076;28072:9;28061:20;;27739:348;;;;:::o;28093:165::-;28233:17;28229:1;28221:6;28217:14;28210:41;28093:165;:::o;28264:366::-;28406:3;28427:67;28491:2;28486:3;28427:67;:::i;:::-;28420:74;;28503:93;28592:3;28503:93;:::i;:::-;28621:2;28616:3;28612:12;28605:19;;28264:366;;;:::o;28636:419::-;28802:4;28840:2;28829:9;28825:18;28817:26;;28889:9;28883:4;28879:20;28875:1;28864:9;28860:17;28853:47;28917:131;29043:4;28917:131;:::i;:::-;28909:139;;28636:419;;;:::o;29061:168::-;29201:20;29197:1;29189:6;29185:14;29178:44;29061:168;:::o;29235:366::-;29377:3;29398:67;29462:2;29457:3;29398:67;:::i;:::-;29391:74;;29474:93;29563:3;29474:93;:::i;:::-;29592:2;29587:3;29583:12;29576:19;;29235:366;;;:::o;29607:419::-;29773:4;29811:2;29800:9;29796:18;29788:26;;29860:9;29854:4;29850:20;29846:1;29835:9;29831:17;29824:47;29888:131;30014:4;29888:131;:::i;:::-;29880:139;;29607:419;;;:::o;30032:173::-;30172:25;30168:1;30160:6;30156:14;30149:49;30032:173;:::o;30211:366::-;30353:3;30374:67;30438:2;30433:3;30374:67;:::i;:::-;30367:74;;30450:93;30539:3;30450:93;:::i;:::-;30568:2;30563:3;30559:12;30552:19;;30211:366;;;:::o;30583:419::-;30749:4;30787:2;30776:9;30772:18;30764:26;;30836:9;30830:4;30826:20;30822:1;30811:9;30807:17;30800:47;30864:131;30990:4;30864:131;:::i;:::-;30856:139;;30583:419;;;:::o;31008:235::-;31148:34;31144:1;31136:6;31132:14;31125:58;31217:18;31212:2;31204:6;31200:15;31193:43;31008:235;:::o;31249:366::-;31391:3;31412:67;31476:2;31471:3;31412:67;:::i;:::-;31405:74;;31488:93;31577:3;31488:93;:::i;:::-;31606:2;31601:3;31597:12;31590:19;;31249:366;;;:::o;31621:419::-;31787:4;31825:2;31814:9;31810:18;31802:26;;31874:9;31868:4;31864:20;31860:1;31849:9;31845:17;31838:47;31902:131;32028:4;31902:131;:::i;:::-;31894:139;;31621:419;;;:::o;32046:148::-;32148:11;32185:3;32170:18;;32046:148;;;;:::o;32200:377::-;32306:3;32334:39;32367:5;32334:39;:::i;:::-;32389:89;32471:6;32466:3;32389:89;:::i;:::-;32382:96;;32487:52;32532:6;32527:3;32520:4;32513:5;32509:16;32487:52;:::i;:::-;32564:6;32559:3;32555:16;32548:23;;32310:267;32200:377;;;;:::o;32607:874::-;32710:3;32747:5;32741:12;32776:36;32802:9;32776:36;:::i;:::-;32828:89;32910:6;32905:3;32828:89;:::i;:::-;32821:96;;32948:1;32937:9;32933:17;32964:1;32959:166;;;;33139:1;33134:341;;;;32926:549;;32959:166;33043:4;33039:9;33028;33024:25;33019:3;33012:38;33105:6;33098:14;33091:22;33083:6;33079:35;33074:3;33070:45;33063:52;;32959:166;;33134:341;33201:38;33233:5;33201:38;:::i;:::-;33261:1;33275:154;33289:6;33286:1;33283:13;33275:154;;;33363:7;33357:14;33353:1;33348:3;33344:11;33337:35;33413:1;33404:7;33400:15;33389:26;;33311:4;33308:1;33304:12;33299:17;;33275:154;;;33458:6;33453:3;33449:16;33442:23;;33141:334;;32926:549;;32714:767;;32607:874;;;;:::o;33487:589::-;33712:3;33734:95;33825:3;33816:6;33734:95;:::i;:::-;33727:102;;33846:95;33937:3;33928:6;33846:95;:::i;:::-;33839:102;;33958:92;34046:3;34037:6;33958:92;:::i;:::-;33951:99;;34067:3;34060:10;;33487:589;;;;;;:::o;34082:180::-;34130:77;34127:1;34120:88;34227:4;34224:1;34217:15;34251:4;34248:1;34241:15;34268:233;34307:3;34330:24;34348:5;34330:24;:::i;:::-;34321:33;;34376:66;34369:5;34366:77;34363:103;;34446:18;;:::i;:::-;34363:103;34493:1;34486:5;34482:13;34475:20;;34268:233;;;:::o;34507:172::-;34647:24;34643:1;34635:6;34631:14;34624:48;34507:172;:::o;34685:366::-;34827:3;34848:67;34912:2;34907:3;34848:67;:::i;:::-;34841:74;;34924:93;35013:3;34924:93;:::i;:::-;35042:2;35037:3;35033:12;35026:19;;34685:366;;;:::o;35057:419::-;35223:4;35261:2;35250:9;35246:18;35238:26;;35310:9;35304:4;35300:20;35296:1;35285:9;35281:17;35274:47;35338:131;35464:4;35338:131;:::i;:::-;35330:139;;35057:419;;;:::o;35482:221::-;35622:34;35618:1;35610:6;35606:14;35599:58;35691:4;35686:2;35678:6;35674:15;35667:29;35482:221;:::o;35709:366::-;35851:3;35872:67;35936:2;35931:3;35872:67;:::i;:::-;35865:74;;35948:93;36037:3;35948:93;:::i;:::-;36066:2;36061:3;36057:12;36050:19;;35709:366;;;:::o;36081:419::-;36247:4;36285:2;36274:9;36270:18;36262:26;;36334:9;36328:4;36324:20;36320:1;36309:9;36305:17;36298:47;36362:131;36488:4;36362:131;:::i;:::-;36354:139;;36081:419;;;:::o;36506:94::-;36539:8;36587:5;36583:2;36579:14;36558:35;;36506:94;;;:::o;36606:::-;36645:7;36674:20;36688:5;36674:20;:::i;:::-;36663:31;;36606:94;;;:::o;36706:100::-;36745:7;36774:26;36794:5;36774:26;:::i;:::-;36763:37;;36706:100;;;:::o;36812:157::-;36917:45;36937:24;36955:5;36937:24;:::i;:::-;36917:45;:::i;:::-;36912:3;36905:58;36812:157;;:::o;36975:256::-;37087:3;37102:75;37173:3;37164:6;37102:75;:::i;:::-;37202:2;37197:3;37193:12;37186:19;;37222:3;37215:10;;36975:256;;;;:::o;37237:229::-;37377:34;37373:1;37365:6;37361:14;37354:58;37446:12;37441:2;37433:6;37429:15;37422:37;37237:229;:::o;37472:366::-;37614:3;37635:67;37699:2;37694:3;37635:67;:::i;:::-;37628:74;;37711:93;37800:3;37711:93;:::i;:::-;37829:2;37824:3;37820:12;37813:19;;37472:366;;;:::o;37844:419::-;38010:4;38048:2;38037:9;38033:18;38025:26;;38097:9;38091:4;38087:20;38083:1;38072:9;38068:17;38061:47;38125:131;38251:4;38125:131;:::i;:::-;38117:139;;37844:419;;;:::o;38269:1395::-;38386:37;38419:3;38386:37;:::i;:::-;38488:18;38480:6;38477:30;38474:56;;;38510:18;;:::i;:::-;38474:56;38554:38;38586:4;38580:11;38554:38;:::i;:::-;38639:67;38699:6;38691;38685:4;38639:67;:::i;:::-;38733:1;38757:4;38744:17;;38789:2;38781:6;38778:14;38806:1;38801:618;;;;39463:1;39480:6;39477:77;;;39529:9;39524:3;39520:19;39514:26;39505:35;;39477:77;39580:67;39640:6;39633:5;39580:67;:::i;:::-;39574:4;39567:81;39436:222;38771:887;;38801:618;38853:4;38849:9;38841:6;38837:22;38887:37;38919:4;38887:37;:::i;:::-;38946:1;38960:208;38974:7;38971:1;38968:14;38960:208;;;39053:9;39048:3;39044:19;39038:26;39030:6;39023:42;39104:1;39096:6;39092:14;39082:24;;39151:2;39140:9;39136:18;39123:31;;38997:4;38994:1;38990:12;38985:17;;38960:208;;;39196:6;39187:7;39184:19;39181:179;;;39254:9;39249:3;39245:19;39239:26;39297:48;39339:4;39331:6;39327:17;39316:9;39297:48;:::i;:::-;39289:6;39282:64;39204:156;39181:179;39406:1;39402;39394:6;39390:14;39386:22;39380:4;39373:36;38808:611;;;38771:887;;38361:1303;;;38269:1395;;:::o;39670:225::-;39810:34;39806:1;39798:6;39794:14;39787:58;39879:8;39874:2;39866:6;39862:15;39855:33;39670:225;:::o;39901:366::-;40043:3;40064:67;40128:2;40123:3;40064:67;:::i;:::-;40057:74;;40140:93;40229:3;40140:93;:::i;:::-;40258:2;40253:3;40249:12;40242:19;;39901:366;;;:::o;40273:419::-;40439:4;40477:2;40466:9;40462:18;40454:26;;40526:9;40520:4;40516:20;40512:1;40501:9;40497:17;40490:47;40554:131;40680:4;40554:131;:::i;:::-;40546:139;;40273:419;;;:::o;40698:182::-;40838:34;40834:1;40826:6;40822:14;40815:58;40698:182;:::o;40886:366::-;41028:3;41049:67;41113:2;41108:3;41049:67;:::i;:::-;41042:74;;41125:93;41214:3;41125:93;:::i;:::-;41243:2;41238:3;41234:12;41227:19;;40886:366;;;:::o;41258:419::-;41424:4;41462:2;41451:9;41447:18;41439:26;;41511:9;41505:4;41501:20;41497:1;41486:9;41482:17;41475:47;41539:131;41665:4;41539:131;:::i;:::-;41531:139;;41258:419;;;:::o;41683:98::-;41734:6;41768:5;41762:12;41752:22;;41683:98;;;:::o;41787:168::-;41870:11;41904:6;41899:3;41892:19;41944:4;41939:3;41935:14;41920:29;;41787:168;;;;:::o;41961:360::-;42047:3;42075:38;42107:5;42075:38;:::i;:::-;42129:70;42192:6;42187:3;42129:70;:::i;:::-;42122:77;;42208:52;42253:6;42248:3;42241:4;42234:5;42230:16;42208:52;:::i;:::-;42285:29;42307:6;42285:29;:::i;:::-;42280:3;42276:39;42269:46;;42051:270;41961:360;;;;:::o;42327:640::-;42522:4;42560:3;42549:9;42545:19;42537:27;;42574:71;42642:1;42631:9;42627:17;42618:6;42574:71;:::i;:::-;42655:72;42723:2;42712:9;42708:18;42699:6;42655:72;:::i;:::-;42737;42805:2;42794:9;42790:18;42781:6;42737:72;:::i;:::-;42856:9;42850:4;42846:20;42841:2;42830:9;42826:18;42819:48;42884:76;42955:4;42946:6;42884:76;:::i;:::-;42876:84;;42327:640;;;;;;;:::o;42973:141::-;43029:5;43060:6;43054:13;43045:22;;43076:32;43102:5;43076:32;:::i;:::-;42973:141;;;;:::o;43120:349::-;43189:6;43238:2;43226:9;43217:7;43213:23;43209:32;43206:119;;;43244:79;;:::i;:::-;43206:119;43364:1;43389:63;43444:7;43435:6;43424:9;43420:22;43389:63;:::i;:::-;43379:73;;43335:127;43120:349;;;;:::o;43475:180::-;43523:77;43520:1;43513:88;43620:4;43617:1;43610:15;43644:4;43641:1;43634:15;43661:185;43701:1;43718:20;43736:1;43718:20;:::i;:::-;43713:25;;43752:20;43770:1;43752:20;:::i;:::-;43747:25;;43791:1;43781:35;;43796:18;;:::i;:::-;43781:35;43838:1;43835;43831:9;43826:14;;43661:185;;;;:::o;43852:191::-;43892:4;43912:20;43930:1;43912:20;:::i;:::-;43907:25;;43946:20;43964:1;43946:20;:::i;:::-;43941:25;;43985:1;43982;43979:8;43976:34;;;43990:18;;:::i;:::-;43976:34;44035:1;44032;44028:9;44020:17;;43852:191;;;;:::o;44049:176::-;44081:1;44098:20;44116:1;44098:20;:::i;:::-;44093:25;;44132:20;44150:1;44132:20;:::i;:::-;44127:25;;44171:1;44161:35;;44176:18;;:::i;:::-;44161:35;44217:1;44214;44210:9;44205:14;;44049:176;;;;:::o

Swarm Source

ipfs://27b986c7d13f0354e6b4f01346c680ada0240285cf49663f28275da279845ba0
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.