ETH Price: $3,006.00 (+4.34%)
Gas: 2 Gwei

Token

X-MAS BADDIES (BAD)
 

Overview

Max Total Supply

2,937 BAD

Holders

269

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BAD
0xbbeec79615e725e82eeef5f4b618ed94f63f02d6
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:
XMASBADDIES

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-01
*/

// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @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/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

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

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: contracts/xmas.sol


// Dev: https://twitter.com/MatthewPaquette
pragma solidity ^0.8.4;







contract XMASBADDIES is ERC721AQueryable, DefaultOperatorFilterer, Ownable, Pausable {
    uint256 public MAX_MINTS = 2000;
    uint256 public MAX_SUPPLY = 10000;

    IERC721AQueryable public baddies;

    string public baseURI;

    mapping(uint256 => bool) public tokenClaimTracker;
    mapping(address => bool) public VIPClaimTracker;

    mapping(uint256 => mapping(address => bool)) public winnersClaimTracker;
    uint256 currentRound = 0;

    bytes32 public vipRoot;
    bytes32 public winnerRoot;

    constructor(address _baddies) ERC721A("X-MAS BADDIES", "BAD") {
        baddies = IERC721AQueryable(_baddies);
    }

    function claimAll() external whenNotPaused {
        uint256[] memory ids = baddies.tokensOfOwner(msg.sender);
        uint256 bal = ids.length;

        require(totalSupply() + bal <= MAX_SUPPLY, "mintVIP: Not enough tokens left");
        require(bal > 0, "claimAll: No Baddies to claim");

        uint256 claimable = 0;
        for (uint256 i = 0; i < bal; i++) {
            if (tokenClaimTracker[ids[i]] == false) {
                claimable++;
                tokenClaimTracker[ids[i]] = true;
            }
        }

        require(claimable > 0, "claimAll: all ids have already been claimed");
        _safeMint(msg.sender, claimable);

    }

    function claimSingle(uint256 id) external whenNotPaused {
        require(tokenClaimTracker[id] == false, "claimSingle: token id has already been claimed");
        require(baddies.ownerOf(id) == msg.sender, "claimSingle: wallet is not owner");
        require(totalSupply() + 1 <= MAX_SUPPLY, "claimSingle: Not enough tokens left");

        tokenClaimTracker[id] = true;

        _safeMint(msg.sender, 1);
    }

    function claimVIP(uint256 quantity, bytes32[] calldata _proof) external whenNotPaused {
        require(VIPClaimTracker[msg.sender] == false, "claimVIP: address already claimed");
        require(totalSupply() + quantity <= MAX_SUPPLY, "claimVIP: Not enough tokens left");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_proof, vipRoot, leaf), "claimVIP: address can not claim");

        VIPClaimTracker[msg.sender] = true;

        _safeMint(msg.sender, quantity);
    }

    function claimWinner(bytes32[] calldata _proof) external whenNotPaused {

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_proof, winnerRoot, leaf), "claimWinner: address is not winner");

        require(winnersClaimTracker[currentRound][msg.sender] == false, "claimWinner: address already claimed");
        require(totalSupply() + 1 <= MAX_SUPPLY, "claimWinner: Not enough tokens left");

        winnersClaimTracker[currentRound][msg.sender] = true;

        _safeMint(msg.sender, 1);
    }

    function airDrop(address[] calldata addrs, uint256 quantity) external onlyOwner {
        uint256 len = addrs.length;
        require(totalSupply() + (quantity * len) <= MAX_SUPPLY, "airDrop: Not enough tokens to airdrop");
        for (uint256 i = 0; i < len; i++) {
            _safeMint(addrs[i], quantity);
        }
    }

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

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

        function transferFrom(address from, address to, uint256 tokenId)
        public
        payable
        override(ERC721A, IERC721A)
        onlyAllowedOperator(from)
    {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId)
        public
        payable
        override(ERC721A, IERC721A)
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        payable
        override(ERC721A, IERC721A)
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    //ADMIN

    function updateVIPTracker(address wallet, bool state) external onlyOwner {
        VIPClaimTracker[wallet] = state;
    }

    function updateTokenTracker(uint256 id, bool state) external onlyOwner {
        tokenClaimTracker[id] = state;
    }

    function updateVIPRoot(bytes32 _vipRoot) external onlyOwner {
        vipRoot = _vipRoot;
    }

    function updateRound(bytes32 _winnerRoot) external onlyOwner {
        currentRound++;
        winnerRoot = _winnerRoot;
    }

    function updateWinnerRoot(bytes32 _winnerRoot) external onlyOwner {
        winnerRoot = _winnerRoot;
    }

    function setMaxMint(uint256 _max) external onlyOwner {
        MAX_MINTS = _max;
    }

    function toggleAllMintPause() public onlyOwner {
        paused() ? _unpause() : _pause();
    }

    function setBaseURI(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    function updateMaxSupply(uint256 _max) external onlyOwner {
        MAX_SUPPLY = _max;
    }

    // ya never know!
    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "withdraw: contract balance must be greater than 0"); 
        uint256 balance = address(this).balance; 
        payable(msg.sender).transfer(balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_baddies","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"VIPClaimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"baddies","outputs":[{"internalType":"contract IERC721AQueryable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"payable","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":"payable","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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMint","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":[],"name":"toggleAllMintPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenClaimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_winnerRoot","type":"bytes32"}],"name":"updateRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"updateTokenTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_vipRoot","type":"bytes32"}],"name":"updateVIPRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"updateVIPTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_winnerRoot","type":"bytes32"}],"name":"updateWinnerRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vipRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winnerRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"winnersClaimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526107d0600955612710600a5560006010553480156200002257600080fd5b5060405162005b3b38038062005b3b833981810160405281019062000048919062000580565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f582d4d41532042414444494553000000000000000000000000000000000000008152506040518060400160405280600381526020017f42414400000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e392919062000466565b508060039080519060200190620000fc92919062000466565b506200010d6200038f60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200030a578015620001d0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000196929190620005c3565b600060405180830381600087803b158015620001b157600080fd5b505af1158015620001c6573d6000803e3d6000fd5b5050505062000309565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200028a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000250929190620005c3565b600060405180830381600087803b1580156200026b57600080fd5b505af115801562000280573d6000803e3d6000fd5b5050505062000308565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d39190620005f0565b600060405180830381600087803b158015620002ee57600080fd5b505af115801562000303573d6000803e3d6000fd5b505050505b5b5b50506200032c620003206200039860201b60201c565b620003a060201b60201c565b6000600860146101000a81548160ff02191690831515021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000671565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000474906200063c565b90600052602060002090601f016020900481019282620004985760008555620004e4565b82601f10620004b357805160ff1916838001178555620004e4565b82800160010185558215620004e4579182015b82811115620004e3578251825591602001919060010190620004c6565b5b509050620004f39190620004f7565b5090565b5b8082111562000512576000816000905550600101620004f8565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000548826200051b565b9050919050565b6200055a816200053b565b81146200056657600080fd5b50565b6000815190506200057a816200054f565b92915050565b60006020828403121562000599576200059862000516565b5b6000620005a98482850162000569565b91505092915050565b620005bd816200053b565b82525050565b6000604082019050620005da6000830185620005b2565b620005e96020830184620005b2565b9392505050565b6000602082019050620006076000830184620005b2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065557607f821691505b6020821081036200066b576200066a6200060d565b5b50919050565b6154ba80620006816000396000f3fe60806040526004361061027d5760003560e01c806370a082311161014f578063b7acfe86116100c1578063d1058e591161007a578063d1058e5914610986578063d67a18221461099d578063e985e9c5146109c6578063f103b43314610a03578063f2fde38b14610a2c578063fd1fc4a014610a555761027d565b8063b7acfe8614610871578063b88d4fde1461089c578063c23dc68f146108b8578063c87b56dd146108f5578063cce132d114610932578063d0ff02161461095d5761027d565b806390043de21161011357806390043de21461076357806395d89b411461078c57806399a2557a146107b7578063a22cb465146107f4578063a432786f1461081d578063b6a45f4d146108485761027d565b806370a082311461067e578063715018a6146106bb5780638462151c146106d257806384823bf81461070f5780638da5cb5b146107385761027d565b806332cb6b0c116101f35780635a1d64ad116101ac5780635a1d64ad146105485780635bbb2177146105715780635c975abb146105ae5780635d17fef0146105d95780636352211e146106165780636c0360eb146106535761027d565b806332cb6b0c1461046f5780633ccfd60b1461049a5780634238090b146104b157806342842e0e146104da578063547520fe146104f657806355f804b31461051f5761027d565b806314f744511161024557806314f744511461036e57806318160ddd146103ab5780631b6bac48146103d657806323b872dd14610413578063274a32d31461042f5780632b4ce54b146104465761027d565b806301ffc9a7146102825780630680f0a0146102bf57806306fdde03146102ea578063081812fc14610315578063095ea7b314610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906138f0565b610a7e565b6040516102b69190613938565b60405180910390f35b3480156102cb57600080fd5b506102d4610b10565b6040516102e1919061396c565b60405180910390f35b3480156102f657600080fd5b506102ff610b16565b60405161030c9190613a20565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613a78565b610ba8565b6040516103499190613ae6565b60405180910390f35b61036c60048036038101906103679190613b2d565b610c27565b005b34801561037a57600080fd5b5061039560048036038101906103909190613b6d565b610d6b565b6040516103a29190613938565b60405180910390f35b3480156103b757600080fd5b506103c0610d9a565b6040516103cd9190613bbc565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613bd7565b610db1565b60405161040a9190613938565b60405180910390f35b61042d60048036038101906104289190613c04565b610dd1565b005b34801561043b57600080fd5b50610444610fb3565b005b34801561045257600080fd5b5061046d60048036038101906104689190613c83565b610fdf565b005b34801561047b57600080fd5b50610484611042565b6040516104919190613bbc565b60405180910390f35b3480156104a657600080fd5b506104af611048565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613cef565b6110e2565b005b6104f460048036038101906104ef9190613c04565b6110f4565b005b34801561050257600080fd5b5061051d60048036038101906105189190613a78565b6112d6565b005b34801561052b57600080fd5b5061054660048036038101906105419190613e51565b6112e8565b005b34801561055457600080fd5b5061056f600480360381019061056a9190613efa565b61130a565b005b34801561057d57600080fd5b5061059860048036038101906105939190613f9d565b611543565b6040516105a5919061414d565b60405180910390f35b3480156105ba57600080fd5b506105c3611606565b6040516105d09190613938565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613a78565b61161d565b60405161060d9190613938565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613a78565b61163d565b60405161064a9190613ae6565b60405180910390f35b34801561065f57600080fd5b5061066861164f565b6040516106759190613a20565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190613bd7565b6116dd565b6040516106b29190613bbc565b60405180910390f35b3480156106c757600080fd5b506106d0611795565b005b3480156106de57600080fd5b506106f960048036038101906106f49190613bd7565b6117a9565b604051610706919061422d565b60405180910390f35b34801561071b57600080fd5b506107366004803603810190610731919061424f565b6118ec565b005b34801561074457600080fd5b5061074d611afe565b60405161075a9190613ae6565b60405180910390f35b34801561076f57600080fd5b5061078a600480360381019061078591906142af565b611b28565b005b34801561079857600080fd5b506107a1611b5f565b6040516107ae9190613a20565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d991906142ef565b611bf1565b6040516107eb919061422d565b60405180910390f35b34801561080057600080fd5b5061081b60048036038101906108169190613c83565b611dfd565b005b34801561082957600080fd5b50610832611f08565b60405161083f91906143a1565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613cef565b611f2e565b005b34801561087d57600080fd5b50610886611f40565b604051610893919061396c565b60405180910390f35b6108b660048036038101906108b1919061445d565b611f46565b005b3480156108c457600080fd5b506108df60048036038101906108da9190613a78565b61212b565b6040516108ec9190614535565b60405180910390f35b34801561090157600080fd5b5061091c60048036038101906109179190613a78565b612195565b6040516109299190613a20565b60405180910390f35b34801561093e57600080fd5b50610947612233565b6040516109549190613bbc565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f9190613a78565b612239565b005b34801561099257600080fd5b5061099b612443565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190613cef565b61269d565b005b3480156109d257600080fd5b506109ed60048036038101906109e89190614550565b6126c7565b6040516109fa9190613938565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613a78565b61275b565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190613bd7565b61276d565b005b348015610a6157600080fd5b50610a7c6004803603810190610a7791906145e6565b6127f0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b095750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60125481565b606060028054610b2590614675565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5190614675565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b6000610bb3826128b8565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c328261163d565b90508073ffffffffffffffffffffffffffffffffffffffff16610c53612917565b73ffffffffffffffffffffffffffffffffffffffff1614610cb657610c7f81610c7a612917565b6126c7565b610cb5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000610da461291f565b6001546000540303905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fa1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e4357610e3e848484612928565b610fad565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e8c9291906146a6565b602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecd91906146e4565b8015610f5f57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f1d9291906146a6565b602060405180830381865afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e91906146e4565b5b610fa057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f979190613ae6565b60405180910390fd5b5b610fac848484612928565b5b50505050565b610fbb612c4a565b610fc3611606565b610fd457610fcf612cc8565b610fdd565b610fdc612d2b565b5b565b610fe7612c4a565b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600a5481565b611050612c4a565b60004711611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90614783565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110de573d6000803e3d6000fd5b5050565b6110ea612c4a565b8060118190555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112c4573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116657611161848484612d8e565b6112d0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111af9291906146a6565b602060405180830381865afa1580156111cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f091906146e4565b801561128257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112409291906146a6565b602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128191906146e4565b5b6112c357336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016112ba9190613ae6565b60405180910390fd5b5b6112cf848484612d8e565b5b50505050565b6112de612c4a565b8060098190555050565b6112f0612c4a565b80600c9080519060200190611306929190613792565b5050565b611312612dae565b60003360405160200161132591906147eb565b60405160208183030381529060405280519060200120905061138b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060125483612df8565b6113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190614878565b60405180910390fd5b60001515600f6000601054815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114679061490a565b60405180910390fd5b600a54600161147d610d9a565b6114879190614959565b11156114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90614a21565b60405180910390fd5b6001600f6000601054815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061153e336001612e0f565b505050565b6060600083839050905060008167ffffffffffffffff81111561156957611568613d26565b5b6040519080825280602002602001820160405280156115a257816020015b61158f613818565b8152602001906001900390816115875790505b50905060005b8281146115fa576115d18686838181106115c5576115c4614a41565b5b9050602002013561212b565b8282815181106115e4576115e3614a41565b5b60200260200101819052508060010190506115a8565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b600d6020528060005260406000206000915054906101000a900460ff1681565b600061164882612e2d565b9050919050565b600c805461165c90614675565b80601f016020809104026020016040519081016040528092919081815260200182805461168890614675565b80156116d55780601f106116aa576101008083540402835291602001916116d5565b820191906000526020600020905b8154815290600101906020018083116116b857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611744576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61179d612c4a565b6117a76000612ef9565b565b606060008060006117b9856116dd565b905060008167ffffffffffffffff8111156117d7576117d6613d26565b5b6040519080825280602002602001820160405280156118055781602001602082028036833780820191505090505b509050611810613818565b600061181a61291f565b90505b8386146118de5761182d81612fbf565b915081604001516118d357600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461187857816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036118d257808387806001019850815181106118c5576118c4614a41565b5b6020026020010181815250505b5b80600101905061181d565b508195505050505050919050565b6118f4612dae565b60001515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90614ae2565b60405180910390fd5b600a5483611993610d9a565b61199d9190614959565b11156119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590614b4e565b60405180910390fd5b6000336040516020016119f191906147eb565b604051602081830303815290604052805190602001209050611a57838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612df8565b611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90614bba565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611af83385612e0f565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b30612c4a565b80600d600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b606060038054611b6e90614675565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9a90614675565b8015611be75780601f10611bbc57610100808354040283529160200191611be7565b820191906000526020600020905b815481529060010190602001808311611bca57829003601f168201915b5050505050905090565b6060818310611c2c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611c37612fea565b9050611c4161291f565b851015611c5357611c5061291f565b94505b80841115611c5f578093505b6000611c6a876116dd565b905084861015611c8d576000868603905081811015611c87578091505b50611c92565b600090505b60008167ffffffffffffffff811115611cae57611cad613d26565b5b604051908082528060200260200182016040528015611cdc5781602001602082028036833780820191505090505b50905060008203611cf35780945050505050611df6565b6000611cfe8861212b565b905060008160400151611d1357816000015190505b60008990505b888114158015611d295750848714155b15611de857611d3781612fbf565b92508260400151611ddd57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611d8257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ddc5780848880600101995081518110611dcf57611dce614a41565b5b6020026020010181815250505b5b806001019050611d19565b508583528296505050505050505b9392505050565b8060076000611e0a612917565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eb7612917565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611efc9190613938565b60405180910390a35050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f36612c4a565b8060128190555050565b60115481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612117573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fb957611fb485858585612ff3565b612124565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016120029291906146a6565b602060405180830381865afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204391906146e4565b80156120d557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016120939291906146a6565b602060405180830381865afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d491906146e4565b5b61211657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161210d9190613ae6565b60405180910390fd5b5b61212385858585612ff3565b5b5050505050565b612133613818565b61213b613818565b61214361291f565b8310806121575750612153612fea565b8310155b156121655780915050612190565b61216e83612fbf565b90508060400151156121835780915050612190565b61218c83613066565b9150505b919050565b60606121a0826128b8565b6121d6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121e0613086565b90506000815103612200576040518060200160405280600081525061222b565b8061220a84613118565b60405160200161221b929190614c16565b6040516020818303038152906040525b915050919050565b60095481565b612241612dae565b60001515600d600083815260200190815260200160002060009054906101000a900460ff161515146122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614cac565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161231a9190613bbc565b602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b9190614ce1565b73ffffffffffffffffffffffffffffffffffffffff16146123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890614d5a565b60405180910390fd5b600a5460016123be610d9a565b6123c89190614959565b1115612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614dec565b60405180910390fd5b6001600d600083815260200190815260200160002060006101000a81548160ff021916908315150217905550612440336001612e0f565b50565b61244b612dae565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b81526004016124a89190613ae6565b600060405180830381865afa1580156124c5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906124ee9190614ee4565b9050600081519050600a5481612502610d9a565b61250c9190614959565b111561254d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254490614f79565b60405180910390fd5b60008111612590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258790614fe5565b60405180910390fd5b6000805b8281101561264a5760001515600d60008684815181106125b7576125b6614a41565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161515036126375781806125ed90615005565b9250506001600d600086848151811061260957612608614a41565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061264290615005565b915050612594565b506000811161268e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612685906150bf565b60405180910390fd5b6126983382612e0f565b505050565b6126a5612c4a565b601060008154809291906126b890615005565b91905055508060128190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612763612c4a565b80600a8190555050565b612775612c4a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90615151565b60405180910390fd5b6127ed81612ef9565b50565b6127f8612c4a565b6000838390509050600a54818361280f9190615171565b612817610d9a565b6128219190614959565b1115612862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128599061523d565b60405180910390fd5b60005b818110156128b15761289e85858381811061288357612882614a41565b5b90506020020160208101906128989190613bd7565b84612e0f565b80806128a990615005565b915050612865565b5050505050565b6000816128c361291f565b111580156128d2575060005482105b8015612910575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600061293382612e2d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461299a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806129a684613168565b915091506129bc81876129b7612917565b61318f565b612a08576129d1866129cc612917565b6126c7565b612a07576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a6e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a7b86868660016131d3565b8015612a8657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612b5485612b308888876131d9565b7c020000000000000000000000000000000000000000000000000000000017613201565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612bda5760006001850190506000600460008381526020019081526020016000205403612bd8576000548114612bd7578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c42868686600161322c565b505050505050565b612c52613232565b73ffffffffffffffffffffffffffffffffffffffff16612c70611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbd906152a9565b60405180910390fd5b565b612cd0612dae565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d14613232565b604051612d219190613ae6565b60405180910390a1565b612d3361323a565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d77613232565b604051612d849190613ae6565b60405180910390a1565b612da983838360405180602001604052806000815250611f46565b505050565b612db6611606565b15612df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ded90615315565b60405180910390fd5b565b600082612e058584613283565b1490509392505050565b612e298282604051806020016040528060008152506132d9565b5050565b60008082905080612e3c61291f565b11612ec257600054811015612ec15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612ebf575b60008103612eb5576004600083600190039350838152602001908152602001600020549050612e8b565b8092505050612ef4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fc7613818565b612fe36004600084815260200190815260200160002054613376565b9050919050565b60008054905090565b612ffe848484610dd1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613060576130298484848461342c565b61305f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61306e613818565b61307f61307a83612e2d565b613376565b9050919050565b6060600c805461309590614675565b80601f01602080910402602001604051908101604052809291908181526020018280546130c190614675565b801561310e5780601f106130e35761010080835404028352916020019161310e565b820191906000526020600020905b8154815290600101906020018083116130f157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561315357600184039350600a81066030018453600a8104905080613131575b50828103602084039350808452505050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86131f086868461357c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b613242611606565b613281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327890615381565b60405180910390fd5b565b60008082905060005b84518110156132ce576132b9828683815181106132ac576132ab614a41565b5b6020026020010151613585565b915080806132c690615005565b91505061328c565b508091505092915050565b6132e383836135b0565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461337157600080549050600083820390505b613323600086838060010194508661342c565b613359576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061331057816000541461336e57600080fd5b50505b505050565b61337e613818565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613452612917565b8786866040518563ffffffff1660e01b815260040161347494939291906153f6565b6020604051808303816000875af19250505080156134b057506040513d601f19601f820116820180604052508101906134ad9190615457565b60015b613529573d80600081146134e0576040519150601f19603f3d011682016040523d82523d6000602084013e6134e5565b606091505b506000815103613521576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600081831061359d57613598828461376b565b6135a8565b6135a7838361376b565b5b905092915050565b600080549050600082036135f0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135fd60008483856131d3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506136748361366560008660006131d9565b61366e85613782565b17613201565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461371557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506136da565b5060008203613750576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613766600084838561322c565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461379e90614675565b90600052602060002090601f0160209004810192826137c05760008555613807565b82601f106137d957805160ff1916838001178555613807565b82800160010185558215613807579182015b828111156138065782518255916020019190600101906137eb565b5b5090506138149190613867565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613880576000816000905550600101613868565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138cd81613898565b81146138d857600080fd5b50565b6000813590506138ea816138c4565b92915050565b6000602082840312156139065761390561388e565b5b6000613914848285016138db565b91505092915050565b60008115159050919050565b6139328161391d565b82525050565b600060208201905061394d6000830184613929565b92915050565b6000819050919050565b61396681613953565b82525050565b6000602082019050613981600083018461395d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139c15780820151818401526020810190506139a6565b838111156139d0576000848401525b50505050565b6000601f19601f8301169050919050565b60006139f282613987565b6139fc8185613992565b9350613a0c8185602086016139a3565b613a15816139d6565b840191505092915050565b60006020820190508181036000830152613a3a81846139e7565b905092915050565b6000819050919050565b613a5581613a42565b8114613a6057600080fd5b50565b600081359050613a7281613a4c565b92915050565b600060208284031215613a8e57613a8d61388e565b5b6000613a9c84828501613a63565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ad082613aa5565b9050919050565b613ae081613ac5565b82525050565b6000602082019050613afb6000830184613ad7565b92915050565b613b0a81613ac5565b8114613b1557600080fd5b50565b600081359050613b2781613b01565b92915050565b60008060408385031215613b4457613b4361388e565b5b6000613b5285828601613b18565b9250506020613b6385828601613a63565b9150509250929050565b60008060408385031215613b8457613b8361388e565b5b6000613b9285828601613a63565b9250506020613ba385828601613b18565b9150509250929050565b613bb681613a42565b82525050565b6000602082019050613bd16000830184613bad565b92915050565b600060208284031215613bed57613bec61388e565b5b6000613bfb84828501613b18565b91505092915050565b600080600060608486031215613c1d57613c1c61388e565b5b6000613c2b86828701613b18565b9350506020613c3c86828701613b18565b9250506040613c4d86828701613a63565b9150509250925092565b613c608161391d565b8114613c6b57600080fd5b50565b600081359050613c7d81613c57565b92915050565b60008060408385031215613c9a57613c9961388e565b5b6000613ca885828601613b18565b9250506020613cb985828601613c6e565b9150509250929050565b613ccc81613953565b8114613cd757600080fd5b50565b600081359050613ce981613cc3565b92915050565b600060208284031215613d0557613d0461388e565b5b6000613d1384828501613cda565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d5e826139d6565b810181811067ffffffffffffffff82111715613d7d57613d7c613d26565b5b80604052505050565b6000613d90613884565b9050613d9c8282613d55565b919050565b600067ffffffffffffffff821115613dbc57613dbb613d26565b5b613dc5826139d6565b9050602081019050919050565b82818337600083830152505050565b6000613df4613def84613da1565b613d86565b905082815260208101848484011115613e1057613e0f613d21565b5b613e1b848285613dd2565b509392505050565b600082601f830112613e3857613e37613d1c565b5b8135613e48848260208601613de1565b91505092915050565b600060208284031215613e6757613e6661388e565b5b600082013567ffffffffffffffff811115613e8557613e84613893565b5b613e9184828501613e23565b91505092915050565b600080fd5b600080fd5b60008083601f840112613eba57613eb9613d1c565b5b8235905067ffffffffffffffff811115613ed757613ed6613e9a565b5b602083019150836020820283011115613ef357613ef2613e9f565b5b9250929050565b60008060208385031215613f1157613f1061388e565b5b600083013567ffffffffffffffff811115613f2f57613f2e613893565b5b613f3b85828601613ea4565b92509250509250929050565b60008083601f840112613f5d57613f5c613d1c565b5b8235905067ffffffffffffffff811115613f7a57613f79613e9a565b5b602083019150836020820283011115613f9657613f95613e9f565b5b9250929050565b60008060208385031215613fb457613fb361388e565b5b600083013567ffffffffffffffff811115613fd257613fd1613893565b5b613fde85828601613f47565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61401f81613ac5565b82525050565b600067ffffffffffffffff82169050919050565b61404281614025565b82525050565b6140518161391d565b82525050565b600062ffffff82169050919050565b61406f81614057565b82525050565b60808201600082015161408b6000850182614016565b50602082015161409e6020850182614039565b5060408201516140b16040850182614048565b5060608201516140c46060850182614066565b50505050565b60006140d68383614075565b60808301905092915050565b6000602082019050919050565b60006140fa82613fea565b6141048185613ff5565b935061410f83614006565b8060005b8381101561414057815161412788826140ca565b9750614132836140e2565b925050600181019050614113565b5085935050505092915050565b6000602082019050818103600083015261416781846140ef565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141a481613a42565b82525050565b60006141b6838361419b565b60208301905092915050565b6000602082019050919050565b60006141da8261416f565b6141e4818561417a565b93506141ef8361418b565b8060005b8381101561422057815161420788826141aa565b9750614212836141c2565b9250506001810190506141f3565b5085935050505092915050565b6000602082019050818103600083015261424781846141cf565b905092915050565b6000806000604084860312156142685761426761388e565b5b600061427686828701613a63565b935050602084013567ffffffffffffffff81111561429757614296613893565b5b6142a386828701613ea4565b92509250509250925092565b600080604083850312156142c6576142c561388e565b5b60006142d485828601613a63565b92505060206142e585828601613c6e565b9150509250929050565b6000806000606084860312156143085761430761388e565b5b600061431686828701613b18565b935050602061432786828701613a63565b925050604061433886828701613a63565b9150509250925092565b6000819050919050565b600061436761436261435d84613aa5565b614342565b613aa5565b9050919050565b60006143798261434c565b9050919050565b600061438b8261436e565b9050919050565b61439b81614380565b82525050565b60006020820190506143b66000830184614392565b92915050565b600067ffffffffffffffff8211156143d7576143d6613d26565b5b6143e0826139d6565b9050602081019050919050565b60006144006143fb846143bc565b613d86565b90508281526020810184848401111561441c5761441b613d21565b5b614427848285613dd2565b509392505050565b600082601f83011261444457614443613d1c565b5b81356144548482602086016143ed565b91505092915050565b600080600080608085870312156144775761447661388e565b5b600061448587828801613b18565b945050602061449687828801613b18565b93505060406144a787828801613a63565b925050606085013567ffffffffffffffff8111156144c8576144c7613893565b5b6144d48782880161442f565b91505092959194509250565b6080820160008201516144f66000850182614016565b5060208201516145096020850182614039565b50604082015161451c6040850182614048565b50606082015161452f6060850182614066565b50505050565b600060808201905061454a60008301846144e0565b92915050565b600080604083850312156145675761456661388e565b5b600061457585828601613b18565b925050602061458685828601613b18565b9150509250929050565b60008083601f8401126145a6576145a5613d1c565b5b8235905067ffffffffffffffff8111156145c3576145c2613e9a565b5b6020830191508360208202830111156145df576145de613e9f565b5b9250929050565b6000806000604084860312156145ff576145fe61388e565b5b600084013567ffffffffffffffff81111561461d5761461c613893565b5b61462986828701614590565b9350935050602061463c86828701613a63565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468d57607f821691505b6020821081036146a05761469f614646565b5b50919050565b60006040820190506146bb6000830185613ad7565b6146c86020830184613ad7565b9392505050565b6000815190506146de81613c57565b92915050565b6000602082840312156146fa576146f961388e565b5b6000614708848285016146cf565b91505092915050565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b600061476d603183613992565b915061477882614711565b604082019050919050565b6000602082019050818103600083015261479c81614760565b9050919050565b60008160601b9050919050565b60006147bb826147a3565b9050919050565b60006147cd826147b0565b9050919050565b6147e56147e082613ac5565b6147c2565b82525050565b60006147f782846147d4565b60148201915081905092915050565b7f636c61696d57696e6e65723a2061646472657373206973206e6f742077696e6e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614862602283613992565b915061486d82614806565b604082019050919050565b6000602082019050818103600083015261489181614855565b9050919050565b7f636c61696d57696e6e65723a206164647265737320616c726561647920636c6160008201527f696d656400000000000000000000000000000000000000000000000000000000602082015250565b60006148f4602483613992565b91506148ff82614898565b604082019050919050565b60006020820190508181036000830152614923816148e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061496482613a42565b915061496f83613a42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149a4576149a361492a565b5b828201905092915050565b7f636c61696d57696e6e65723a204e6f7420656e6f75676820746f6b656e73206c60008201527f6566740000000000000000000000000000000000000000000000000000000000602082015250565b6000614a0b602383613992565b9150614a16826149af565b604082019050919050565b60006020820190508181036000830152614a3a816149fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f636c61696d5649503a206164647265737320616c726561647920636c61696d6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614acc602183613992565b9150614ad782614a70565b604082019050919050565b60006020820190508181036000830152614afb81614abf565b9050919050565b7f636c61696d5649503a204e6f7420656e6f75676820746f6b656e73206c656674600082015250565b6000614b38602083613992565b9150614b4382614b02565b602082019050919050565b60006020820190508181036000830152614b6781614b2b565b9050919050565b7f636c61696d5649503a20616464726573732063616e206e6f7420636c61696d00600082015250565b6000614ba4601f83613992565b9150614baf82614b6e565b602082019050919050565b60006020820190508181036000830152614bd381614b97565b9050919050565b600081905092915050565b6000614bf082613987565b614bfa8185614bda565b9350614c0a8185602086016139a3565b80840191505092915050565b6000614c228285614be5565b9150614c2e8284614be5565b91508190509392505050565b7f636c61696d53696e676c653a20746f6b656e2069642068617320616c7265616460008201527f79206265656e20636c61696d6564000000000000000000000000000000000000602082015250565b6000614c96602e83613992565b9150614ca182614c3a565b604082019050919050565b60006020820190508181036000830152614cc581614c89565b9050919050565b600081519050614cdb81613b01565b92915050565b600060208284031215614cf757614cf661388e565b5b6000614d0584828501614ccc565b91505092915050565b7f636c61696d53696e676c653a2077616c6c6574206973206e6f74206f776e6572600082015250565b6000614d44602083613992565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b7f636c61696d53696e676c653a204e6f7420656e6f75676820746f6b656e73206c60008201527f6566740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd6602383613992565b9150614de182614d7a565b604082019050919050565b60006020820190508181036000830152614e0581614dc9565b9050919050565b600067ffffffffffffffff821115614e2757614e26613d26565b5b602082029050602081019050919050565b600081519050614e4781613a4c565b92915050565b6000614e60614e5b84614e0c565b613d86565b90508083825260208201905060208402830185811115614e8357614e82613e9f565b5b835b81811015614eac5780614e988882614e38565b845260208401935050602081019050614e85565b5050509392505050565b600082601f830112614ecb57614eca613d1c565b5b8151614edb848260208601614e4d565b91505092915050565b600060208284031215614efa57614ef961388e565b5b600082015167ffffffffffffffff811115614f1857614f17613893565b5b614f2484828501614eb6565b91505092915050565b7f6d696e745649503a204e6f7420656e6f75676820746f6b656e73206c65667400600082015250565b6000614f63601f83613992565b9150614f6e82614f2d565b602082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f636c61696d416c6c3a204e6f204261646469657320746f20636c61696d000000600082015250565b6000614fcf601d83613992565b9150614fda82614f99565b602082019050919050565b60006020820190508181036000830152614ffe81614fc2565b9050919050565b600061501082613a42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150425761504161492a565b5b600182019050919050565b7f636c61696d416c6c3a20616c6c20696473206861766520616c7265616479206260008201527f65656e20636c61696d6564000000000000000000000000000000000000000000602082015250565b60006150a9602b83613992565b91506150b48261504d565b604082019050919050565b600060208201905081810360008301526150d88161509c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061513b602683613992565b9150615146826150df565b604082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b600061517c82613a42565b915061518783613a42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151c0576151bf61492a565b5b828202905092915050565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b6000615227602583613992565b9150615232826151cb565b604082019050919050565b600060208201905081810360008301526152568161521a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615293602083613992565b915061529e8261525d565b602082019050919050565b600060208201905081810360008301526152c281615286565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006152ff601083613992565b915061530a826152c9565b602082019050919050565b6000602082019050818103600083015261532e816152f2565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061536b601483613992565b915061537682615335565b602082019050919050565b6000602082019050818103600083015261539a8161535e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153c8826153a1565b6153d281856153ac565b93506153e28185602086016139a3565b6153eb816139d6565b840191505092915050565b600060808201905061540b6000830187613ad7565b6154186020830186613ad7565b6154256040830185613bad565b818103606083015261543781846153bd565b905095945050505050565b600081519050615451816138c4565b92915050565b60006020828403121561546d5761546c61388e565b5b600061547b84828501615442565b9150509291505056fea264697066735822122010d7d04e96a241b8b35d0cb173ef567d09f55c8b877ca341a745aa7e51fe878e64736f6c634300080d003300000000000000000000000087212aa99f65611f6d67e0fbad76d06478753704

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806370a082311161014f578063b7acfe86116100c1578063d1058e591161007a578063d1058e5914610986578063d67a18221461099d578063e985e9c5146109c6578063f103b43314610a03578063f2fde38b14610a2c578063fd1fc4a014610a555761027d565b8063b7acfe8614610871578063b88d4fde1461089c578063c23dc68f146108b8578063c87b56dd146108f5578063cce132d114610932578063d0ff02161461095d5761027d565b806390043de21161011357806390043de21461076357806395d89b411461078c57806399a2557a146107b7578063a22cb465146107f4578063a432786f1461081d578063b6a45f4d146108485761027d565b806370a082311461067e578063715018a6146106bb5780638462151c146106d257806384823bf81461070f5780638da5cb5b146107385761027d565b806332cb6b0c116101f35780635a1d64ad116101ac5780635a1d64ad146105485780635bbb2177146105715780635c975abb146105ae5780635d17fef0146105d95780636352211e146106165780636c0360eb146106535761027d565b806332cb6b0c1461046f5780633ccfd60b1461049a5780634238090b146104b157806342842e0e146104da578063547520fe146104f657806355f804b31461051f5761027d565b806314f744511161024557806314f744511461036e57806318160ddd146103ab5780631b6bac48146103d657806323b872dd14610413578063274a32d31461042f5780632b4ce54b146104465761027d565b806301ffc9a7146102825780630680f0a0146102bf57806306fdde03146102ea578063081812fc14610315578063095ea7b314610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906138f0565b610a7e565b6040516102b69190613938565b60405180910390f35b3480156102cb57600080fd5b506102d4610b10565b6040516102e1919061396c565b60405180910390f35b3480156102f657600080fd5b506102ff610b16565b60405161030c9190613a20565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613a78565b610ba8565b6040516103499190613ae6565b60405180910390f35b61036c60048036038101906103679190613b2d565b610c27565b005b34801561037a57600080fd5b5061039560048036038101906103909190613b6d565b610d6b565b6040516103a29190613938565b60405180910390f35b3480156103b757600080fd5b506103c0610d9a565b6040516103cd9190613bbc565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613bd7565b610db1565b60405161040a9190613938565b60405180910390f35b61042d60048036038101906104289190613c04565b610dd1565b005b34801561043b57600080fd5b50610444610fb3565b005b34801561045257600080fd5b5061046d60048036038101906104689190613c83565b610fdf565b005b34801561047b57600080fd5b50610484611042565b6040516104919190613bbc565b60405180910390f35b3480156104a657600080fd5b506104af611048565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190613cef565b6110e2565b005b6104f460048036038101906104ef9190613c04565b6110f4565b005b34801561050257600080fd5b5061051d60048036038101906105189190613a78565b6112d6565b005b34801561052b57600080fd5b5061054660048036038101906105419190613e51565b6112e8565b005b34801561055457600080fd5b5061056f600480360381019061056a9190613efa565b61130a565b005b34801561057d57600080fd5b5061059860048036038101906105939190613f9d565b611543565b6040516105a5919061414d565b60405180910390f35b3480156105ba57600080fd5b506105c3611606565b6040516105d09190613938565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613a78565b61161d565b60405161060d9190613938565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613a78565b61163d565b60405161064a9190613ae6565b60405180910390f35b34801561065f57600080fd5b5061066861164f565b6040516106759190613a20565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190613bd7565b6116dd565b6040516106b29190613bbc565b60405180910390f35b3480156106c757600080fd5b506106d0611795565b005b3480156106de57600080fd5b506106f960048036038101906106f49190613bd7565b6117a9565b604051610706919061422d565b60405180910390f35b34801561071b57600080fd5b506107366004803603810190610731919061424f565b6118ec565b005b34801561074457600080fd5b5061074d611afe565b60405161075a9190613ae6565b60405180910390f35b34801561076f57600080fd5b5061078a600480360381019061078591906142af565b611b28565b005b34801561079857600080fd5b506107a1611b5f565b6040516107ae9190613a20565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d991906142ef565b611bf1565b6040516107eb919061422d565b60405180910390f35b34801561080057600080fd5b5061081b60048036038101906108169190613c83565b611dfd565b005b34801561082957600080fd5b50610832611f08565b60405161083f91906143a1565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613cef565b611f2e565b005b34801561087d57600080fd5b50610886611f40565b604051610893919061396c565b60405180910390f35b6108b660048036038101906108b1919061445d565b611f46565b005b3480156108c457600080fd5b506108df60048036038101906108da9190613a78565b61212b565b6040516108ec9190614535565b60405180910390f35b34801561090157600080fd5b5061091c60048036038101906109179190613a78565b612195565b6040516109299190613a20565b60405180910390f35b34801561093e57600080fd5b50610947612233565b6040516109549190613bbc565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f9190613a78565b612239565b005b34801561099257600080fd5b5061099b612443565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190613cef565b61269d565b005b3480156109d257600080fd5b506109ed60048036038101906109e89190614550565b6126c7565b6040516109fa9190613938565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613a78565b61275b565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190613bd7565b61276d565b005b348015610a6157600080fd5b50610a7c6004803603810190610a7791906145e6565b6127f0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b095750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60125481565b606060028054610b2590614675565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5190614675565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b6000610bb3826128b8565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c328261163d565b90508073ffffffffffffffffffffffffffffffffffffffff16610c53612917565b73ffffffffffffffffffffffffffffffffffffffff1614610cb657610c7f81610c7a612917565b6126c7565b610cb5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000610da461291f565b6001546000540303905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fa1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e4357610e3e848484612928565b610fad565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e8c9291906146a6565b602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecd91906146e4565b8015610f5f57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f1d9291906146a6565b602060405180830381865afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e91906146e4565b5b610fa057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f979190613ae6565b60405180910390fd5b5b610fac848484612928565b5b50505050565b610fbb612c4a565b610fc3611606565b610fd457610fcf612cc8565b610fdd565b610fdc612d2b565b5b565b610fe7612c4a565b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600a5481565b611050612c4a565b60004711611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90614783565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110de573d6000803e3d6000fd5b5050565b6110ea612c4a565b8060118190555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112c4573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116657611161848484612d8e565b6112d0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111af9291906146a6565b602060405180830381865afa1580156111cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f091906146e4565b801561128257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112409291906146a6565b602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128191906146e4565b5b6112c357336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016112ba9190613ae6565b60405180910390fd5b5b6112cf848484612d8e565b5b50505050565b6112de612c4a565b8060098190555050565b6112f0612c4a565b80600c9080519060200190611306929190613792565b5050565b611312612dae565b60003360405160200161132591906147eb565b60405160208183030381529060405280519060200120905061138b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060125483612df8565b6113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190614878565b60405180910390fd5b60001515600f6000601054815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114679061490a565b60405180910390fd5b600a54600161147d610d9a565b6114879190614959565b11156114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90614a21565b60405180910390fd5b6001600f6000601054815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061153e336001612e0f565b505050565b6060600083839050905060008167ffffffffffffffff81111561156957611568613d26565b5b6040519080825280602002602001820160405280156115a257816020015b61158f613818565b8152602001906001900390816115875790505b50905060005b8281146115fa576115d18686838181106115c5576115c4614a41565b5b9050602002013561212b565b8282815181106115e4576115e3614a41565b5b60200260200101819052508060010190506115a8565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b600d6020528060005260406000206000915054906101000a900460ff1681565b600061164882612e2d565b9050919050565b600c805461165c90614675565b80601f016020809104026020016040519081016040528092919081815260200182805461168890614675565b80156116d55780601f106116aa576101008083540402835291602001916116d5565b820191906000526020600020905b8154815290600101906020018083116116b857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611744576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61179d612c4a565b6117a76000612ef9565b565b606060008060006117b9856116dd565b905060008167ffffffffffffffff8111156117d7576117d6613d26565b5b6040519080825280602002602001820160405280156118055781602001602082028036833780820191505090505b509050611810613818565b600061181a61291f565b90505b8386146118de5761182d81612fbf565b915081604001516118d357600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461187857816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036118d257808387806001019850815181106118c5576118c4614a41565b5b6020026020010181815250505b5b80600101905061181d565b508195505050505050919050565b6118f4612dae565b60001515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90614ae2565b60405180910390fd5b600a5483611993610d9a565b61199d9190614959565b11156119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590614b4e565b60405180910390fd5b6000336040516020016119f191906147eb565b604051602081830303815290604052805190602001209050611a57838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612df8565b611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90614bba565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611af83385612e0f565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b30612c4a565b80600d600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b606060038054611b6e90614675565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9a90614675565b8015611be75780601f10611bbc57610100808354040283529160200191611be7565b820191906000526020600020905b815481529060010190602001808311611bca57829003601f168201915b5050505050905090565b6060818310611c2c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611c37612fea565b9050611c4161291f565b851015611c5357611c5061291f565b94505b80841115611c5f578093505b6000611c6a876116dd565b905084861015611c8d576000868603905081811015611c87578091505b50611c92565b600090505b60008167ffffffffffffffff811115611cae57611cad613d26565b5b604051908082528060200260200182016040528015611cdc5781602001602082028036833780820191505090505b50905060008203611cf35780945050505050611df6565b6000611cfe8861212b565b905060008160400151611d1357816000015190505b60008990505b888114158015611d295750848714155b15611de857611d3781612fbf565b92508260400151611ddd57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611d8257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ddc5780848880600101995081518110611dcf57611dce614a41565b5b6020026020010181815250505b5b806001019050611d19565b508583528296505050505050505b9392505050565b8060076000611e0a612917565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eb7612917565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611efc9190613938565b60405180910390a35050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f36612c4a565b8060128190555050565b60115481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612117573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fb957611fb485858585612ff3565b612124565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016120029291906146a6565b602060405180830381865afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204391906146e4565b80156120d557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016120939291906146a6565b602060405180830381865afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d491906146e4565b5b61211657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161210d9190613ae6565b60405180910390fd5b5b61212385858585612ff3565b5b5050505050565b612133613818565b61213b613818565b61214361291f565b8310806121575750612153612fea565b8310155b156121655780915050612190565b61216e83612fbf565b90508060400151156121835780915050612190565b61218c83613066565b9150505b919050565b60606121a0826128b8565b6121d6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121e0613086565b90506000815103612200576040518060200160405280600081525061222b565b8061220a84613118565b60405160200161221b929190614c16565b6040516020818303038152906040525b915050919050565b60095481565b612241612dae565b60001515600d600083815260200190815260200160002060009054906101000a900460ff161515146122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614cac565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161231a9190613bbc565b602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b9190614ce1565b73ffffffffffffffffffffffffffffffffffffffff16146123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890614d5a565b60405180910390fd5b600a5460016123be610d9a565b6123c89190614959565b1115612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614dec565b60405180910390fd5b6001600d600083815260200190815260200160002060006101000a81548160ff021916908315150217905550612440336001612e0f565b50565b61244b612dae565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b81526004016124a89190613ae6565b600060405180830381865afa1580156124c5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906124ee9190614ee4565b9050600081519050600a5481612502610d9a565b61250c9190614959565b111561254d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254490614f79565b60405180910390fd5b60008111612590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258790614fe5565b60405180910390fd5b6000805b8281101561264a5760001515600d60008684815181106125b7576125b6614a41565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161515036126375781806125ed90615005565b9250506001600d600086848151811061260957612608614a41565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061264290615005565b915050612594565b506000811161268e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612685906150bf565b60405180910390fd5b6126983382612e0f565b505050565b6126a5612c4a565b601060008154809291906126b890615005565b91905055508060128190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612763612c4a565b80600a8190555050565b612775612c4a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90615151565b60405180910390fd5b6127ed81612ef9565b50565b6127f8612c4a565b6000838390509050600a54818361280f9190615171565b612817610d9a565b6128219190614959565b1115612862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128599061523d565b60405180910390fd5b60005b818110156128b15761289e85858381811061288357612882614a41565b5b90506020020160208101906128989190613bd7565b84612e0f565b80806128a990615005565b915050612865565b5050505050565b6000816128c361291f565b111580156128d2575060005482105b8015612910575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600061293382612e2d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461299a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806129a684613168565b915091506129bc81876129b7612917565b61318f565b612a08576129d1866129cc612917565b6126c7565b612a07576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a6e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a7b86868660016131d3565b8015612a8657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612b5485612b308888876131d9565b7c020000000000000000000000000000000000000000000000000000000017613201565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612bda5760006001850190506000600460008381526020019081526020016000205403612bd8576000548114612bd7578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c42868686600161322c565b505050505050565b612c52613232565b73ffffffffffffffffffffffffffffffffffffffff16612c70611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbd906152a9565b60405180910390fd5b565b612cd0612dae565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d14613232565b604051612d219190613ae6565b60405180910390a1565b612d3361323a565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d77613232565b604051612d849190613ae6565b60405180910390a1565b612da983838360405180602001604052806000815250611f46565b505050565b612db6611606565b15612df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ded90615315565b60405180910390fd5b565b600082612e058584613283565b1490509392505050565b612e298282604051806020016040528060008152506132d9565b5050565b60008082905080612e3c61291f565b11612ec257600054811015612ec15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612ebf575b60008103612eb5576004600083600190039350838152602001908152602001600020549050612e8b565b8092505050612ef4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fc7613818565b612fe36004600084815260200190815260200160002054613376565b9050919050565b60008054905090565b612ffe848484610dd1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613060576130298484848461342c565b61305f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61306e613818565b61307f61307a83612e2d565b613376565b9050919050565b6060600c805461309590614675565b80601f01602080910402602001604051908101604052809291908181526020018280546130c190614675565b801561310e5780601f106130e35761010080835404028352916020019161310e565b820191906000526020600020905b8154815290600101906020018083116130f157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561315357600184039350600a81066030018453600a8104905080613131575b50828103602084039350808452505050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86131f086868461357c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b613242611606565b613281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327890615381565b60405180910390fd5b565b60008082905060005b84518110156132ce576132b9828683815181106132ac576132ab614a41565b5b6020026020010151613585565b915080806132c690615005565b91505061328c565b508091505092915050565b6132e383836135b0565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461337157600080549050600083820390505b613323600086838060010194508661342c565b613359576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061331057816000541461336e57600080fd5b50505b505050565b61337e613818565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613452612917565b8786866040518563ffffffff1660e01b815260040161347494939291906153f6565b6020604051808303816000875af19250505080156134b057506040513d601f19601f820116820180604052508101906134ad9190615457565b60015b613529573d80600081146134e0576040519150601f19603f3d011682016040523d82523d6000602084013e6134e5565b606091505b506000815103613521576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600081831061359d57613598828461376b565b6135a8565b6135a7838361376b565b5b905092915050565b600080549050600082036135f0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135fd60008483856131d3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506136748361366560008660006131d9565b61366e85613782565b17613201565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461371557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506136da565b5060008203613750576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613766600084838561322c565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461379e90614675565b90600052602060002090601f0160209004810192826137c05760008555613807565b82601f106137d957805160ff1916838001178555613807565b82800160010185558215613807579182015b828111156138065782518255916020019190600101906137eb565b5b5090506138149190613867565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613880576000816000905550600101613868565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138cd81613898565b81146138d857600080fd5b50565b6000813590506138ea816138c4565b92915050565b6000602082840312156139065761390561388e565b5b6000613914848285016138db565b91505092915050565b60008115159050919050565b6139328161391d565b82525050565b600060208201905061394d6000830184613929565b92915050565b6000819050919050565b61396681613953565b82525050565b6000602082019050613981600083018461395d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139c15780820151818401526020810190506139a6565b838111156139d0576000848401525b50505050565b6000601f19601f8301169050919050565b60006139f282613987565b6139fc8185613992565b9350613a0c8185602086016139a3565b613a15816139d6565b840191505092915050565b60006020820190508181036000830152613a3a81846139e7565b905092915050565b6000819050919050565b613a5581613a42565b8114613a6057600080fd5b50565b600081359050613a7281613a4c565b92915050565b600060208284031215613a8e57613a8d61388e565b5b6000613a9c84828501613a63565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ad082613aa5565b9050919050565b613ae081613ac5565b82525050565b6000602082019050613afb6000830184613ad7565b92915050565b613b0a81613ac5565b8114613b1557600080fd5b50565b600081359050613b2781613b01565b92915050565b60008060408385031215613b4457613b4361388e565b5b6000613b5285828601613b18565b9250506020613b6385828601613a63565b9150509250929050565b60008060408385031215613b8457613b8361388e565b5b6000613b9285828601613a63565b9250506020613ba385828601613b18565b9150509250929050565b613bb681613a42565b82525050565b6000602082019050613bd16000830184613bad565b92915050565b600060208284031215613bed57613bec61388e565b5b6000613bfb84828501613b18565b91505092915050565b600080600060608486031215613c1d57613c1c61388e565b5b6000613c2b86828701613b18565b9350506020613c3c86828701613b18565b9250506040613c4d86828701613a63565b9150509250925092565b613c608161391d565b8114613c6b57600080fd5b50565b600081359050613c7d81613c57565b92915050565b60008060408385031215613c9a57613c9961388e565b5b6000613ca885828601613b18565b9250506020613cb985828601613c6e565b9150509250929050565b613ccc81613953565b8114613cd757600080fd5b50565b600081359050613ce981613cc3565b92915050565b600060208284031215613d0557613d0461388e565b5b6000613d1384828501613cda565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d5e826139d6565b810181811067ffffffffffffffff82111715613d7d57613d7c613d26565b5b80604052505050565b6000613d90613884565b9050613d9c8282613d55565b919050565b600067ffffffffffffffff821115613dbc57613dbb613d26565b5b613dc5826139d6565b9050602081019050919050565b82818337600083830152505050565b6000613df4613def84613da1565b613d86565b905082815260208101848484011115613e1057613e0f613d21565b5b613e1b848285613dd2565b509392505050565b600082601f830112613e3857613e37613d1c565b5b8135613e48848260208601613de1565b91505092915050565b600060208284031215613e6757613e6661388e565b5b600082013567ffffffffffffffff811115613e8557613e84613893565b5b613e9184828501613e23565b91505092915050565b600080fd5b600080fd5b60008083601f840112613eba57613eb9613d1c565b5b8235905067ffffffffffffffff811115613ed757613ed6613e9a565b5b602083019150836020820283011115613ef357613ef2613e9f565b5b9250929050565b60008060208385031215613f1157613f1061388e565b5b600083013567ffffffffffffffff811115613f2f57613f2e613893565b5b613f3b85828601613ea4565b92509250509250929050565b60008083601f840112613f5d57613f5c613d1c565b5b8235905067ffffffffffffffff811115613f7a57613f79613e9a565b5b602083019150836020820283011115613f9657613f95613e9f565b5b9250929050565b60008060208385031215613fb457613fb361388e565b5b600083013567ffffffffffffffff811115613fd257613fd1613893565b5b613fde85828601613f47565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61401f81613ac5565b82525050565b600067ffffffffffffffff82169050919050565b61404281614025565b82525050565b6140518161391d565b82525050565b600062ffffff82169050919050565b61406f81614057565b82525050565b60808201600082015161408b6000850182614016565b50602082015161409e6020850182614039565b5060408201516140b16040850182614048565b5060608201516140c46060850182614066565b50505050565b60006140d68383614075565b60808301905092915050565b6000602082019050919050565b60006140fa82613fea565b6141048185613ff5565b935061410f83614006565b8060005b8381101561414057815161412788826140ca565b9750614132836140e2565b925050600181019050614113565b5085935050505092915050565b6000602082019050818103600083015261416781846140ef565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141a481613a42565b82525050565b60006141b6838361419b565b60208301905092915050565b6000602082019050919050565b60006141da8261416f565b6141e4818561417a565b93506141ef8361418b565b8060005b8381101561422057815161420788826141aa565b9750614212836141c2565b9250506001810190506141f3565b5085935050505092915050565b6000602082019050818103600083015261424781846141cf565b905092915050565b6000806000604084860312156142685761426761388e565b5b600061427686828701613a63565b935050602084013567ffffffffffffffff81111561429757614296613893565b5b6142a386828701613ea4565b92509250509250925092565b600080604083850312156142c6576142c561388e565b5b60006142d485828601613a63565b92505060206142e585828601613c6e565b9150509250929050565b6000806000606084860312156143085761430761388e565b5b600061431686828701613b18565b935050602061432786828701613a63565b925050604061433886828701613a63565b9150509250925092565b6000819050919050565b600061436761436261435d84613aa5565b614342565b613aa5565b9050919050565b60006143798261434c565b9050919050565b600061438b8261436e565b9050919050565b61439b81614380565b82525050565b60006020820190506143b66000830184614392565b92915050565b600067ffffffffffffffff8211156143d7576143d6613d26565b5b6143e0826139d6565b9050602081019050919050565b60006144006143fb846143bc565b613d86565b90508281526020810184848401111561441c5761441b613d21565b5b614427848285613dd2565b509392505050565b600082601f83011261444457614443613d1c565b5b81356144548482602086016143ed565b91505092915050565b600080600080608085870312156144775761447661388e565b5b600061448587828801613b18565b945050602061449687828801613b18565b93505060406144a787828801613a63565b925050606085013567ffffffffffffffff8111156144c8576144c7613893565b5b6144d48782880161442f565b91505092959194509250565b6080820160008201516144f66000850182614016565b5060208201516145096020850182614039565b50604082015161451c6040850182614048565b50606082015161452f6060850182614066565b50505050565b600060808201905061454a60008301846144e0565b92915050565b600080604083850312156145675761456661388e565b5b600061457585828601613b18565b925050602061458685828601613b18565b9150509250929050565b60008083601f8401126145a6576145a5613d1c565b5b8235905067ffffffffffffffff8111156145c3576145c2613e9a565b5b6020830191508360208202830111156145df576145de613e9f565b5b9250929050565b6000806000604084860312156145ff576145fe61388e565b5b600084013567ffffffffffffffff81111561461d5761461c613893565b5b61462986828701614590565b9350935050602061463c86828701613a63565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468d57607f821691505b6020821081036146a05761469f614646565b5b50919050565b60006040820190506146bb6000830185613ad7565b6146c86020830184613ad7565b9392505050565b6000815190506146de81613c57565b92915050565b6000602082840312156146fa576146f961388e565b5b6000614708848285016146cf565b91505092915050565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b600061476d603183613992565b915061477882614711565b604082019050919050565b6000602082019050818103600083015261479c81614760565b9050919050565b60008160601b9050919050565b60006147bb826147a3565b9050919050565b60006147cd826147b0565b9050919050565b6147e56147e082613ac5565b6147c2565b82525050565b60006147f782846147d4565b60148201915081905092915050565b7f636c61696d57696e6e65723a2061646472657373206973206e6f742077696e6e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614862602283613992565b915061486d82614806565b604082019050919050565b6000602082019050818103600083015261489181614855565b9050919050565b7f636c61696d57696e6e65723a206164647265737320616c726561647920636c6160008201527f696d656400000000000000000000000000000000000000000000000000000000602082015250565b60006148f4602483613992565b91506148ff82614898565b604082019050919050565b60006020820190508181036000830152614923816148e7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061496482613a42565b915061496f83613a42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149a4576149a361492a565b5b828201905092915050565b7f636c61696d57696e6e65723a204e6f7420656e6f75676820746f6b656e73206c60008201527f6566740000000000000000000000000000000000000000000000000000000000602082015250565b6000614a0b602383613992565b9150614a16826149af565b604082019050919050565b60006020820190508181036000830152614a3a816149fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f636c61696d5649503a206164647265737320616c726561647920636c61696d6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614acc602183613992565b9150614ad782614a70565b604082019050919050565b60006020820190508181036000830152614afb81614abf565b9050919050565b7f636c61696d5649503a204e6f7420656e6f75676820746f6b656e73206c656674600082015250565b6000614b38602083613992565b9150614b4382614b02565b602082019050919050565b60006020820190508181036000830152614b6781614b2b565b9050919050565b7f636c61696d5649503a20616464726573732063616e206e6f7420636c61696d00600082015250565b6000614ba4601f83613992565b9150614baf82614b6e565b602082019050919050565b60006020820190508181036000830152614bd381614b97565b9050919050565b600081905092915050565b6000614bf082613987565b614bfa8185614bda565b9350614c0a8185602086016139a3565b80840191505092915050565b6000614c228285614be5565b9150614c2e8284614be5565b91508190509392505050565b7f636c61696d53696e676c653a20746f6b656e2069642068617320616c7265616460008201527f79206265656e20636c61696d6564000000000000000000000000000000000000602082015250565b6000614c96602e83613992565b9150614ca182614c3a565b604082019050919050565b60006020820190508181036000830152614cc581614c89565b9050919050565b600081519050614cdb81613b01565b92915050565b600060208284031215614cf757614cf661388e565b5b6000614d0584828501614ccc565b91505092915050565b7f636c61696d53696e676c653a2077616c6c6574206973206e6f74206f776e6572600082015250565b6000614d44602083613992565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b7f636c61696d53696e676c653a204e6f7420656e6f75676820746f6b656e73206c60008201527f6566740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd6602383613992565b9150614de182614d7a565b604082019050919050565b60006020820190508181036000830152614e0581614dc9565b9050919050565b600067ffffffffffffffff821115614e2757614e26613d26565b5b602082029050602081019050919050565b600081519050614e4781613a4c565b92915050565b6000614e60614e5b84614e0c565b613d86565b90508083825260208201905060208402830185811115614e8357614e82613e9f565b5b835b81811015614eac5780614e988882614e38565b845260208401935050602081019050614e85565b5050509392505050565b600082601f830112614ecb57614eca613d1c565b5b8151614edb848260208601614e4d565b91505092915050565b600060208284031215614efa57614ef961388e565b5b600082015167ffffffffffffffff811115614f1857614f17613893565b5b614f2484828501614eb6565b91505092915050565b7f6d696e745649503a204e6f7420656e6f75676820746f6b656e73206c65667400600082015250565b6000614f63601f83613992565b9150614f6e82614f2d565b602082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f636c61696d416c6c3a204e6f204261646469657320746f20636c61696d000000600082015250565b6000614fcf601d83613992565b9150614fda82614f99565b602082019050919050565b60006020820190508181036000830152614ffe81614fc2565b9050919050565b600061501082613a42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150425761504161492a565b5b600182019050919050565b7f636c61696d416c6c3a20616c6c20696473206861766520616c7265616479206260008201527f65656e20636c61696d6564000000000000000000000000000000000000000000602082015250565b60006150a9602b83613992565b91506150b48261504d565b604082019050919050565b600060208201905081810360008301526150d88161509c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061513b602683613992565b9150615146826150df565b604082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b600061517c82613a42565b915061518783613a42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151c0576151bf61492a565b5b828202905092915050565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b6000615227602583613992565b9150615232826151cb565b604082019050919050565b600060208201905081810360008301526152568161521a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615293602083613992565b915061529e8261525d565b602082019050919050565b600060208201905081810360008301526152c281615286565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006152ff601083613992565b915061530a826152c9565b602082019050919050565b6000602082019050818103600083015261532e816152f2565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061536b601483613992565b915061537682615335565b602082019050919050565b6000602082019050818103600083015261539a8161535e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153c8826153a1565b6153d281856153ac565b93506153e28185602086016139a3565b6153eb816139d6565b840191505092915050565b600060808201905061540b6000830187613ad7565b6154186020830186613ad7565b6154256040830185613bad565b818103606083015261543781846153bd565b905095945050505050565b600081519050615451816138c4565b92915050565b60006020828403121561546d5761546c61388e565b5b600061547b84828501615442565b9150509291505056fea264697066735822122010d7d04e96a241b8b35d0cb173ef567d09f55c8b877ca341a745aa7e51fe878e64736f6c634300080d0033

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

00000000000000000000000087212aa99f65611f6d67e0fbad76d06478753704

-----Decoded View---------------
Arg [0] : _baddies (address): 0x87212Aa99f65611F6D67E0fBAD76d06478753704

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000087212aa99f65611f6d67e0fbad76d06478753704


Deployed Bytecode Sourcemap

80135:5490:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38012:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80630:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38914:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45405:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44838:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80490:71;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34665:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80434:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83558:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85044:98;;;;;;;;;;;;;:::i;:::-;;84331:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80265:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85375:245;;;;;;;;;;;;;:::i;:::-;;84589:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83797:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84948:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85150:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82441:556;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75235:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15926:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80378:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40307:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80348:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35849:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18791:103;;;;;;;;;;;;;:::i;:::-;;79111:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81898:535;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18143:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84462:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39090:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76151:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45963:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80307:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84831:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80601:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84044:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74648:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39300:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80227:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81469:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80790:671;;;;;;;;;;;;;:::i;:::-;;84694:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46354:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85250:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19049:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83005:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38012:639;38097:4;38436:10;38421:25;;:11;:25;;;;:102;;;;38513:10;38498:25;;:11;:25;;;;38421:102;:179;;;;38590:10;38575:25;;:11;:25;;;;38421:179;38401:199;;38012:639;;;:::o;80630:25::-;;;;:::o;38914:100::-;38968:13;39001:5;38994:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38914:100;:::o;45405:218::-;45481:7;45506:16;45514:7;45506;:16::i;:::-;45501:64;;45531:34;;;;;;;;;;;;;;45501:64;45585:15;:24;45601:7;45585:24;;;;;;;;;;;:30;;;;;;;;;;;;45578:37;;45405:218;;;:::o;44838:408::-;44927:13;44943:16;44951:7;44943;:16::i;:::-;44927:32;;44999:5;44976:28;;:19;:17;:19::i;:::-;:28;;;44972:175;;45024:44;45041:5;45048:19;:17;:19::i;:::-;45024:16;:44::i;:::-;45019:128;;45096:35;;;;;;;;;;;;;;45019:128;44972:175;45192:2;45159:15;:24;45175:7;45159:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45230:7;45226:2;45210:28;;45219:5;45210:28;;;;;;;;;;;;44916:330;44838:408;;:::o;80490:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34665:323::-;34726:7;34954:15;:13;:15::i;:::-;34939:12;;34923:13;;:28;:46;34916:53;;34665:323;:::o;80434:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;83558:231::-;83722:4;3641:1;2455:42;3595:43;;;:47;3591:699;;;3882:10;3874:18;;:4;:18;;;3870:85;;83744:37:::1;83763:4;83769:2;83773:7;83744:18;:37::i;:::-;3933:7:::0;;3870:85;2455:42;4015:40;;;4064:4;4071:10;4015:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2455:42;4111:40;;;4160:4;4167;4111:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4015:157;3969:310;;4252:10;4233:30;;;;;;;;;;;:::i;:::-;;;;;;;;3969:310;3591:699;83744:37:::1;83763:4;83769:2;83773:7;83744:18;:37::i;:::-;83558:231:::0;;;;;:::o;85044:98::-;18029:13;:11;:13::i;:::-;85102:8:::1;:6;:8::i;:::-;:32;;85126:8;:6;:8::i;:::-;85102:32;;;85113:10;:8;:10::i;:::-;85102:32;85044:98::o:0;84331:123::-;18029:13;:11;:13::i;:::-;84441:5:::1;84415:15;:23;84431:6;84415:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;84331:123:::0;;:::o;80265:33::-;;;;:::o;85375:245::-;18029:13;:11;:13::i;:::-;85457:1:::1;85433:21;:25;85425:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;85524:15;85542:21;85524:39;;85583:10;85575:28;;:37;85604:7;85575:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;85414:206;85375:245::o:0;84589:97::-;18029:13;:11;:13::i;:::-;84670:8:::1;84660:7;:18;;;;84589:97:::0;:::o;83797:239::-;83965:4;3641:1;2455:42;3595:43;;;:47;3591:699;;;3882:10;3874:18;;:4;:18;;;3870:85;;83987:41:::1;84010:4;84016:2;84020:7;83987:22;:41::i;:::-;3933:7:::0;;3870:85;2455:42;4015:40;;;4064:4;4071:10;4015:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2455:42;4111:40;;;4160:4;4167;4111:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4015:157;3969:310;;4252:10;4233:30;;;;;;;;;;;:::i;:::-;;;;;;;;3969:310;3591:699;83987:41:::1;84010:4;84016:2;84020:7;83987:22;:41::i;:::-;83797:239:::0;;;;;:::o;84948:88::-;18029:13;:11;:13::i;:::-;85024:4:::1;85012:9;:16;;;;84948:88:::0;:::o;85150:92::-;18029:13;:11;:13::i;:::-;85230:4:::1;85220:7;:14;;;;;;;;;;;;:::i;:::-;;85150:92:::0;:::o;82441:556::-;15531:19;:17;:19::i;:::-;82525:12:::1;82567:10;82550:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;82540:39;;;;;;82525:54;;82598:44;82617:6;;82598:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82625:10;;82637:4;82598:18;:44::i;:::-;82590:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;82751:5;82702:54;;:19;:33;82722:12;;82702:33;;;;;;;;;;;:45;82736:10;82702:45;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;82694:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;82837:10;;82832:1;82816:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;82808:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;82948:4;82900:19;:33;82920:12;;82900:33;;;;;;;;;;;:45;82934:10;82900:45;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;82965:24;82975:10;82987:1;82965:9;:24::i;:::-;82512:485;82441:556:::0;;:::o;75235:528::-;75379:23;75445:22;75470:8;;:15;;75445:40;;75500:34;75558:14;75537:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75500:73;;75593:9;75588:125;75609:14;75604:1;:19;75588:125;;75665:32;75685:8;;75694:1;75685:11;;;;;;;:::i;:::-;;;;;;;;75665:19;:32::i;:::-;75649:10;75660:1;75649:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;75625:3;;;;;75588:125;;;;75734:10;75727:17;;;;75235:528;;;;:::o;15926:86::-;15973:4;15997:7;;;;;;;;;;;15990:14;;15926:86;:::o;80378:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;40307:152::-;40379:7;40422:27;40441:7;40422:18;:27::i;:::-;40399:52;;40307:152;;;:::o;80348:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35849:233::-;35921:7;35962:1;35945:19;;:5;:19;;;35941:60;;35973:28;;;;;;;;;;;;;;35941:60;30008:13;36019:18;:25;36038:5;36019:25;;;;;;;;;;;;;;;;:55;36012:62;;35849:233;;;:::o;18791:103::-;18029:13;:11;:13::i;:::-;18856:30:::1;18883:1;18856:18;:30::i;:::-;18791:103::o:0;79111:900::-;79189:16;79243:19;79277:25;79317:22;79342:16;79352:5;79342:9;:16::i;:::-;79317:41;;79373:25;79415:14;79401:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79373:57;;79445:31;;:::i;:::-;79496:9;79508:15;:13;:15::i;:::-;79496:27;;79491:472;79540:14;79525:11;:29;79491:472;;79592:15;79605:1;79592:12;:15::i;:::-;79580:27;;79630:9;:16;;;79671:8;79626:73;79747:1;79721:28;;:9;:14;;;:28;;;79717:111;;79794:9;:14;;;79774:34;;79717:111;79871:5;79850:26;;:17;:26;;;79846:102;;79927:1;79901:8;79910:13;;;;;;79901:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;79846:102;79491:472;79556:3;;;;;79491:472;;;;79984:8;79977:15;;;;;;;79111:900;;;:::o;81898:535::-;15531:19;:17;:19::i;:::-;82034:5:::1;82003:36;;:15;:27;82019:10;82003:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;81995:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;82124:10;;82112:8;82096:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;82088:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;82184:12;82226:10;82209:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;82199:39;;;;;;82184:54;;82257:41;82276:6;;82257:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82284:7;;82293:4;82257:18;:41::i;:::-;82249:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;82377:4;82347:15;:27;82363:10;82347:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;82394:31;82404:10;82416:8;82394:9;:31::i;:::-;81984:449;81898:535:::0;;;:::o;18143:87::-;18189:7;18216:6;;;;;;;;;;;18209:13;;18143:87;:::o;84462:119::-;18029:13;:11;:13::i;:::-;84568:5:::1;84544:17;:21;84562:2;84544:21;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;84462:119:::0;;:::o;39090:104::-;39146:13;39179:7;39172:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39090:104;:::o;76151:2513::-;76294:16;76361:4;76352:5;:13;76348:45;;76374:19;;;;;;;;;;;;;;76348:45;76408:19;76442:17;76462:14;:12;:14::i;:::-;76442:34;;76562:15;:13;:15::i;:::-;76554:5;:23;76550:87;;;76606:15;:13;:15::i;:::-;76598:23;;76550:87;76713:9;76706:4;:16;76702:73;;;76750:9;76743:16;;76702:73;76789:25;76817:16;76827:5;76817:9;:16::i;:::-;76789:44;;77011:4;77003:5;:12;76999:278;;;77036:19;77065:5;77058:4;:12;77036:34;;77107:17;77093:11;:31;77089:111;;;77169:11;77149:31;;77089:111;77017:198;76999:278;;;77260:1;77240:21;;76999:278;77291:25;77333:17;77319:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77291:60;;77391:1;77370:17;:22;77366:78;;77420:8;77413:15;;;;;;;;77366:78;77588:31;77622:26;77642:5;77622:19;:26::i;:::-;77588:60;;77663:25;77908:9;:16;;;77903:92;;77965:9;:14;;;77945:34;;77903:92;78014:9;78026:5;78014:17;;78009:478;78038:4;78033:1;:9;;:45;;;;;78061:17;78046:11;:32;;78033:45;78009:478;;;78116:15;78129:1;78116:12;:15::i;:::-;78104:27;;78154:9;:16;;;78195:8;78150:73;78271:1;78245:28;;:9;:14;;;:28;;;78241:111;;78318:9;:14;;;78298:34;;78241:111;78395:5;78374:26;;:17;:26;;;78370:102;;78451:1;78425:8;78434:13;;;;;;78425:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;78370:102;78009:478;78080:3;;;;;78009:478;;;;78589:11;78579:8;78572:29;78637:8;78630:15;;;;;;;;76151:2513;;;;;;:::o;45963:234::-;46110:8;46058:18;:39;46077:19;:17;:19::i;:::-;46058:39;;;;;;;;;;;;;;;:49;46098:8;46058:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46170:8;46134:55;;46149:19;:17;:19::i;:::-;46134:55;;;46180:8;46134:55;;;;;;:::i;:::-;;;;;;;;45963:234;;:::o;80307:32::-;;;;;;;;;;;;;:::o;84831:109::-;18029:13;:11;:13::i;:::-;84921:11:::1;84908:10;:24;;;;84831:109:::0;:::o;80601:22::-;;;;:::o;84044:264::-;84231:4;3641:1;2455:42;3595:43;;;:47;3591:699;;;3882:10;3874:18;;:4;:18;;;3870:85;;84253:47:::1;84276:4;84282:2;84286:7;84295:4;84253:22;:47::i;:::-;3933:7:::0;;3870:85;2455:42;4015:40;;;4064:4;4071:10;4015:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2455:42;4111:40;;;4160:4;4167;4111:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4015:157;3969:310;;4252:10;4233:30;;;;;;;;;;;:::i;:::-;;;;;;;;3969:310;3591:699;84253:47:::1;84276:4;84282:2;84286:7;84295:4;84253:22;:47::i;:::-;84044:264:::0;;;;;;:::o;74648:428::-;74732:21;;:::i;:::-;74766:31;;:::i;:::-;74822:15;:13;:15::i;:::-;74812:7;:25;:54;;;;74852:14;:12;:14::i;:::-;74841:7;:25;;74812:54;74808:103;;;74890:9;74883:16;;;;;74808:103;74933:21;74946:7;74933:12;:21::i;:::-;74921:33;;74969:9;:16;;;74965:65;;;75009:9;75002:16;;;;;74965:65;75047:21;75060:7;75047:12;:21::i;:::-;75040:28;;;74648:428;;;;:::o;39300:318::-;39373:13;39404:16;39412:7;39404;:16::i;:::-;39399:59;;39429:29;;;;;;;;;;;;;;39399:59;39471:21;39495:10;:8;:10::i;:::-;39471:34;;39548:1;39529:7;39523:21;:26;:87;;;;;;;;;;;;;;;;;39576:7;39585:18;39595:7;39585:9;:18::i;:::-;39559:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39523:87;39516:94;;;39300:318;;;:::o;80227:31::-;;;;:::o;81469:421::-;15531:19;:17;:19::i;:::-;81569:5:::1;81544:30;;:17;:21;81562:2;81544:21;;;;;;;;;;;;;;;;;;;;;:30;;;81536:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;81667:10;81644:33;;:7;;;;;;;;;;;:15;;;81660:2;81644:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;81636:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;81754:10;;81749:1;81733:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;81725:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;81841:4;81817:17;:21;81835:2;81817:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;81858:24;81868:10;81880:1;81858:9;:24::i;:::-;81469:421:::0;:::o;80790:671::-;15531:19;:17;:19::i;:::-;80844:20:::1;80867:7;;;;;;;;;;;:21;;;80889:10;80867:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80844:56;;80911:11;80925:3;:10;80911:24;;80979:10;;80972:3;80956:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:33;;80948:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;81050:1;81044:3;:7;81036:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;81098:17;81135:9:::0;81130:197:::1;81154:3;81150:1;:7;81130:197;;;81212:5;81183:34;;:17;:25;81201:3;81205:1;81201:6;;;;;;;;:::i;:::-;;;;;;;;81183:25;;;;;;;;;;;;;;;;;;;;;:34;;::::0;81179:137:::1;;81238:11;;;;;:::i;:::-;;;;81296:4;81268:17;:25;81286:3;81290:1;81286:6;;;;;;;;:::i;:::-;;;;;;;;81268:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;81179:137;81159:3;;;;;:::i;:::-;;;;81130:197;;;;81359:1;81347:9;:13;81339:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;81419:32;81429:10;81441:9;81419;:32::i;:::-;80833:628;;;80790:671::o:0;84694:129::-;18029:13;:11;:13::i;:::-;84766:12:::1;;:14;;;;;;;;;:::i;:::-;;;;;;84804:11;84791:10;:24;;;;84694:129:::0;:::o;46354:164::-;46451:4;46475:18;:25;46494:5;46475:25;;;;;;;;;;;;;;;:35;46501:8;46475:35;;;;;;;;;;;;;;;;;;;;;;;;;46468:42;;46354:164;;;;:::o;85250:94::-;18029:13;:11;:13::i;:::-;85332:4:::1;85319:10;:17;;;;85250:94:::0;:::o;19049:201::-;18029:13;:11;:13::i;:::-;19158:1:::1;19138:22;;:8;:22;;::::0;19130:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19214:28;19233:8;19214:18;:28::i;:::-;19049:201:::0;:::o;83005:332::-;18029:13;:11;:13::i;:::-;83096:11:::1;83110:5;;:12;;83096:26;;83177:10;;83169:3;83158:8;:14;;;;:::i;:::-;83141:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;83133:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;83245:9;83240:90;83264:3;83260:1;:7;83240:90;;;83289:29;83299:5;;83305:1;83299:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;83309;83289:9;:29::i;:::-;83269:3;;;;;:::i;:::-;;;;83240:90;;;;83085:252;83005:332:::0;;;:::o;46776:282::-;46841:4;46897:7;46878:15;:13;:15::i;:::-;:26;;:66;;;;;46931:13;;46921:7;:23;46878:66;:153;;;;;47030:1;30784:8;46982:17;:26;47000:7;46982:26;;;;;;;;;;;;:44;:49;46878:153;46858:173;;46776:282;;;:::o;69084:105::-;69144:7;69171:10;69164:17;;69084:105;:::o;83453:93::-;83510:7;83537:1;83530:8;;83453:93;:::o;49044:2825::-;49186:27;49216;49235:7;49216:18;:27::i;:::-;49186:57;;49301:4;49260:45;;49276:19;49260:45;;;49256:86;;49314:28;;;;;;;;;;;;;;49256:86;49356:27;49385:23;49412:35;49439:7;49412:26;:35::i;:::-;49355:92;;;;49547:68;49572:15;49589:4;49595:19;:17;:19::i;:::-;49547:24;:68::i;:::-;49542:180;;49635:43;49652:4;49658:19;:17;:19::i;:::-;49635:16;:43::i;:::-;49630:92;;49687:35;;;;;;;;;;;;;;49630:92;49542:180;49753:1;49739:16;;:2;:16;;;49735:52;;49764:23;;;;;;;;;;;;;;49735:52;49800:43;49822:4;49828:2;49832:7;49841:1;49800:21;:43::i;:::-;49936:15;49933:160;;;50076:1;50055:19;50048:30;49933:160;50473:18;:24;50492:4;50473:24;;;;;;;;;;;;;;;;50471:26;;;;;;;;;;;;50542:18;:22;50561:2;50542:22;;;;;;;;;;;;;;;;50540:24;;;;;;;;;;;50864:146;50901:2;50950:45;50965:4;50971:2;50975:19;50950:14;:45::i;:::-;31064:8;50922:73;50864:18;:146::i;:::-;50835:17;:26;50853:7;50835:26;;;;;;;;;;;:175;;;;51181:1;31064:8;51130:19;:47;:52;51126:627;;51203:19;51235:1;51225:7;:11;51203:33;;51392:1;51358:17;:30;51376:11;51358:30;;;;;;;;;;;;:35;51354:384;;51496:13;;51481:11;:28;51477:242;;51676:19;51643:17;:30;51661:11;51643:30;;;;;;;;;;;:52;;;;51477:242;51354:384;51184:569;51126:627;51800:7;51796:2;51781:27;;51790:4;51781:27;;;;;;;;;;;;51819:42;51840:4;51846:2;51850:7;51859:1;51819:20;:42::i;:::-;49175:2694;;;49044:2825;;;:::o;18308:132::-;18383:12;:10;:12::i;:::-;18372:23;;:7;:5;:7::i;:::-;:23;;;18364:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18308:132::o;16522:118::-;15531:19;:17;:19::i;:::-;16592:4:::1;16582:7;;:14;;;;;;;;;;;;;;;;;;16612:20;16619:12;:10;:12::i;:::-;16612:20;;;;;;:::i;:::-;;;;;;;;16522:118::o:0;16781:120::-;15790:16;:14;:16::i;:::-;16850:5:::1;16840:7;;:15;;;;;;;;;;;;;;;;;;16871:22;16880:12;:10;:12::i;:::-;16871:22;;;;;;:::i;:::-;;;;;;;;16781:120::o:0;51965:193::-;52111:39;52128:4;52134:2;52138:7;52111:39;;;;;;;;;;;;:16;:39::i;:::-;51965:193;;;:::o;16085:108::-;16156:8;:6;:8::i;:::-;16155:9;16147:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;16085:108::o;5854:190::-;5979:4;6032;6003:25;6016:5;6023:4;6003:12;:25::i;:::-;:33;5996:40;;5854:190;;;;;:::o;62916:112::-;62993:27;63003:2;63007:8;62993:27;;;;;;;;;;;;:9;:27::i;:::-;62916:112;;:::o;41462:1275::-;41529:7;41549:12;41564:7;41549:22;;41632:4;41613:15;:13;:15::i;:::-;:23;41609:1061;;41666:13;;41659:4;:20;41655:1015;;;41704:14;41721:17;:23;41739:4;41721:23;;;;;;;;;;;;41704:40;;41838:1;30784:8;41810:6;:24;:29;41806:845;;42475:113;42492:1;42482:6;:11;42475:113;;42535:17;:25;42553:6;;;;;;;42535:25;;;;;;;;;;;;42526:34;;42475:113;;;42621:6;42614:13;;;;;;41806:845;41681:989;41655:1015;41609:1061;42698:31;;;;;;;;;;;;;;41462:1275;;;;:::o;19410:191::-;19484:16;19503:6;;;;;;;;;;;19484:25;;19529:8;19520:6;;:17;;;;;;;;;;;;;;;;;;19584:8;19553:40;;19574:8;19553:40;;;;;;;;;;;;19473:128;19410:191;:::o;40910:161::-;40978:21;;:::i;:::-;41019:44;41038:17;:24;41056:5;41038:24;;;;;;;;;;;;41019:18;:44::i;:::-;41012:51;;40910:161;;;:::o;34352:103::-;34407:7;34434:13;;34427:20;;34352:103;:::o;52756:407::-;52931:31;52944:4;52950:2;52954:7;52931:12;:31::i;:::-;52995:1;52977:2;:14;;;:19;52973:183;;53016:56;53047:4;53053:2;53057:7;53066:5;53016:30;:56::i;:::-;53011:145;;53100:40;;;;;;;;;;;;;;53011:145;52973:183;52756:407;;;;:::o;40648:166::-;40718:21;;:::i;:::-;40759:47;40778:27;40797:7;40778:18;:27::i;:::-;40759:18;:47::i;:::-;40752:54;;40648:166;;;:::o;83345:100::-;83397:13;83430:7;83423:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83345:100;:::o;69291:1745::-;69356:17;69790:4;69783;69777:11;69773:22;69882:1;69876:4;69869:15;69957:4;69954:1;69950:12;69943:19;;70039:1;70034:3;70027:14;70143:3;70382:5;70364:428;70390:1;70364:428;;;70430:1;70425:3;70421:11;70414:18;;70601:2;70595:4;70591:13;70587:2;70583:22;70578:3;70570:36;70695:2;70689:4;70685:13;70677:21;;70762:4;70364:428;70752:25;70364:428;70368:21;70831:3;70826;70822:13;70946:4;70941:3;70937:14;70930:21;;71011:6;71006:3;70999:19;69395:1634;;;69291:1745;;;:::o;47939:485::-;48041:27;48070:23;48111:38;48152:15;:24;48168:7;48152:24;;;;;;;;;;;48111:65;;48329:18;48306:41;;48386:19;48380:26;48361:45;;48291:126;47939:485;;;:::o;47167:659::-;47316:11;47481:16;47474:5;47470:28;47461:37;;47641:16;47630:9;47626:32;47613:45;;47791:15;47780:9;47777:30;47769:5;47758:9;47755:20;47752:56;47742:66;;47167:659;;;;;:::o;53825:159::-;;;;;:::o;68393:311::-;68528:7;68548:16;31188:3;68574:19;:41;;68548:68;;31188:3;68642:31;68653:4;68659:2;68663:9;68642:10;:31::i;:::-;68634:40;;:62;;68627:69;;;68393:311;;;;;:::o;43285:450::-;43365:14;43533:16;43526:5;43522:28;43513:37;;43710:5;43696:11;43671:23;43667:41;43664:52;43657:5;43654:63;43644:73;;43285:450;;;;:::o;54649:158::-;;;;;:::o;14039:98::-;14092:7;14119:10;14112:17;;14039:98;:::o;16270:108::-;16337:8;:6;:8::i;:::-;16329:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;16270:108::o;6721:296::-;6804:7;6824:20;6847:4;6824:27;;6867:9;6862:118;6886:5;:12;6882:1;:16;6862:118;;;6935:33;6945:12;6959:5;6965:1;6959:8;;;;;;;;:::i;:::-;;;;;;;;6935:9;:33::i;:::-;6920:48;;6900:3;;;;;:::i;:::-;;;;6862:118;;;;6997:12;6990:19;;;6721:296;;;;:::o;62143:689::-;62274:19;62280:2;62284:8;62274:5;:19::i;:::-;62353:1;62335:2;:14;;;:19;62331:483;;62375:11;62389:13;;62375:27;;62421:13;62443:8;62437:3;:14;62421:30;;62470:233;62501:62;62540:1;62544:2;62548:7;;;;;;62557:5;62501:30;:62::i;:::-;62496:167;;62599:40;;;;;;;;;;;;;;62496:167;62698:3;62690:5;:11;62470:233;;62785:3;62768:13;;:20;62764:34;;62790:8;;;62764:34;62356:458;;62331:483;62143:689;;;:::o;42836:366::-;42902:31;;:::i;:::-;42979:6;42946:9;:14;;:41;;;;;;;;;;;30667:3;43032:6;:33;;42998:9;:24;;:68;;;;;;;;;;;43124:1;30784:8;43096:6;:24;:29;;43077:9;:16;;:48;;;;;;;;;;;31188:3;43165:6;:28;;43136:9;:19;;:58;;;;;;;;;;;42836:366;;;:::o;55247:716::-;55410:4;55456:2;55431:45;;;55477:19;:17;:19::i;:::-;55498:4;55504:7;55513:5;55431:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55427:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55731:1;55714:6;:13;:18;55710:235;;55760:40;;;;;;;;;;;;;;55710:235;55903:6;55897:13;55888:6;55884:2;55880:15;55873:38;55427:529;55600:54;;;55590:64;;;:6;:64;;;;55583:71;;;55247:716;;;;;;:::o;68094:147::-;68231:6;68094:147;;;;;:::o;12928:149::-;12991:7;13022:1;13018;:5;:51;;13049:20;13064:1;13067;13049:14;:20::i;:::-;13018:51;;;13026:20;13041:1;13044;13026:14;:20::i;:::-;13018:51;13011:58;;12928:149;;;;:::o;56425:2966::-;56498:20;56521:13;;56498:36;;56561:1;56549:8;:13;56545:44;;56571:18;;;;;;;;;;;;;;56545:44;56602:61;56632:1;56636:2;56640:12;56654:8;56602:21;:61::i;:::-;57146:1;30146:2;57116:1;:26;;57115:32;57103:8;:45;57077:18;:22;57096:2;57077:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;57425:139;57462:2;57516:33;57539:1;57543:2;57547:1;57516:14;:33::i;:::-;57483:30;57504:8;57483:20;:30::i;:::-;:66;57425:18;:139::i;:::-;57391:17;:31;57409:12;57391:31;;;;;;;;;;;:173;;;;57581:16;57612:11;57641:8;57626:12;:23;57612:37;;58162:16;58158:2;58154:25;58142:37;;58534:12;58494:8;58453:1;58391:25;58332:1;58271;58244:335;58905:1;58891:12;58887:20;58845:346;58946:3;58937:7;58934:16;58845:346;;59164:7;59154:8;59151:1;59124:25;59121:1;59118;59113:59;58999:1;58990:7;58986:15;58975:26;;58845:346;;;58849:77;59236:1;59224:8;:13;59220:45;;59246:19;;;;;;;;;;;;;;59220:45;59298:3;59282:13;:19;;;;56851:2462;;59323:60;59352:1;59356:2;59360:12;59374:8;59323:20;:60::i;:::-;56487:2904;56425:2966;;:::o;13085:268::-;13153:13;13260:1;13254:4;13247:15;13289:1;13283:4;13276:15;13330:4;13324;13314:21;13305:30;;13085:268;;;;:::o;43837:324::-;43907:14;44140:1;44130:8;44127:15;44101:24;44097:46;44087:56;;43837:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:77::-;3380:7;3409:5;3398:16;;3343:77;;;:::o;3426:122::-;3499:24;3517:5;3499:24;:::i;:::-;3492:5;3489:35;3479:63;;3538:1;3535;3528:12;3479:63;3426:122;:::o;3554:139::-;3600:5;3638:6;3625:20;3616:29;;3654:33;3681:5;3654:33;:::i;:::-;3554:139;;;;:::o;3699:329::-;3758:6;3807:2;3795:9;3786:7;3782:23;3778:32;3775:119;;;3813:79;;:::i;:::-;3775:119;3933:1;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3904:117;3699:329;;;;:::o;4034:126::-;4071:7;4111:42;4104:5;4100:54;4089:65;;4034:126;;;:::o;4166:96::-;4203:7;4232:24;4250:5;4232:24;:::i;:::-;4221:35;;4166:96;;;:::o;4268:118::-;4355:24;4373:5;4355:24;:::i;:::-;4350:3;4343:37;4268:118;;:::o;4392:222::-;4485:4;4523:2;4512:9;4508:18;4500:26;;4536:71;4604:1;4593:9;4589:17;4580:6;4536:71;:::i;:::-;4392:222;;;;:::o;4620:122::-;4693:24;4711:5;4693:24;:::i;:::-;4686:5;4683:35;4673:63;;4732:1;4729;4722:12;4673:63;4620:122;:::o;4748:139::-;4794:5;4832:6;4819:20;4810:29;;4848:33;4875:5;4848:33;:::i;:::-;4748:139;;;;:::o;4893:474::-;4961:6;4969;5018:2;5006:9;4997:7;4993:23;4989:32;4986:119;;;5024:79;;:::i;:::-;4986:119;5144:1;5169:53;5214:7;5205:6;5194:9;5190:22;5169:53;:::i;:::-;5159:63;;5115:117;5271:2;5297:53;5342:7;5333:6;5322:9;5318:22;5297:53;:::i;:::-;5287:63;;5242:118;4893:474;;;;;:::o;5373:::-;5441:6;5449;5498:2;5486:9;5477:7;5473:23;5469:32;5466:119;;;5504:79;;:::i;:::-;5466:119;5624:1;5649:53;5694:7;5685:6;5674:9;5670:22;5649:53;:::i;:::-;5639:63;;5595:117;5751:2;5777:53;5822:7;5813:6;5802:9;5798:22;5777:53;:::i;:::-;5767:63;;5722:118;5373:474;;;;;:::o;5853:118::-;5940:24;5958:5;5940:24;:::i;:::-;5935:3;5928:37;5853:118;;:::o;5977:222::-;6070:4;6108:2;6097:9;6093:18;6085:26;;6121:71;6189:1;6178:9;6174:17;6165:6;6121:71;:::i;:::-;5977:222;;;;:::o;6205:329::-;6264:6;6313:2;6301:9;6292:7;6288:23;6284:32;6281:119;;;6319:79;;:::i;:::-;6281:119;6439:1;6464:53;6509:7;6500:6;6489:9;6485:22;6464:53;:::i;:::-;6454:63;;6410:117;6205:329;;;;:::o;6540:619::-;6617:6;6625;6633;6682:2;6670:9;6661:7;6657:23;6653:32;6650:119;;;6688:79;;:::i;:::-;6650:119;6808:1;6833:53;6878:7;6869:6;6858:9;6854:22;6833:53;:::i;:::-;6823:63;;6779:117;6935:2;6961:53;7006:7;6997:6;6986:9;6982:22;6961:53;:::i;:::-;6951:63;;6906:118;7063:2;7089:53;7134:7;7125:6;7114:9;7110:22;7089:53;:::i;:::-;7079:63;;7034:118;6540:619;;;;;:::o;7165:116::-;7235:21;7250:5;7235:21;:::i;:::-;7228:5;7225:32;7215:60;;7271:1;7268;7261:12;7215:60;7165:116;:::o;7287:133::-;7330:5;7368:6;7355:20;7346:29;;7384:30;7408:5;7384:30;:::i;:::-;7287:133;;;;:::o;7426:468::-;7491:6;7499;7548:2;7536:9;7527:7;7523:23;7519:32;7516:119;;;7554:79;;:::i;:::-;7516:119;7674:1;7699:53;7744:7;7735:6;7724:9;7720:22;7699:53;:::i;:::-;7689:63;;7645:117;7801:2;7827:50;7869:7;7860:6;7849:9;7845:22;7827:50;:::i;:::-;7817:60;;7772:115;7426:468;;;;;:::o;7900:122::-;7973:24;7991:5;7973:24;:::i;:::-;7966:5;7963:35;7953:63;;8012:1;8009;8002:12;7953:63;7900:122;:::o;8028:139::-;8074:5;8112:6;8099:20;8090:29;;8128:33;8155:5;8128:33;:::i;:::-;8028:139;;;;:::o;8173:329::-;8232:6;8281:2;8269:9;8260:7;8256:23;8252:32;8249:119;;;8287:79;;:::i;:::-;8249:119;8407:1;8432:53;8477:7;8468:6;8457:9;8453:22;8432:53;:::i;:::-;8422:63;;8378:117;8173:329;;;;:::o;8508:117::-;8617:1;8614;8607:12;8631:117;8740:1;8737;8730:12;8754:180;8802:77;8799:1;8792:88;8899:4;8896:1;8889:15;8923:4;8920:1;8913:15;8940:281;9023:27;9045:4;9023:27;:::i;:::-;9015:6;9011:40;9153:6;9141:10;9138:22;9117:18;9105:10;9102:34;9099:62;9096:88;;;9164:18;;:::i;:::-;9096:88;9204:10;9200:2;9193:22;8983:238;8940:281;;:::o;9227:129::-;9261:6;9288:20;;:::i;:::-;9278:30;;9317:33;9345:4;9337:6;9317:33;:::i;:::-;9227:129;;;:::o;9362:308::-;9424:4;9514:18;9506:6;9503:30;9500:56;;;9536:18;;:::i;:::-;9500:56;9574:29;9596:6;9574:29;:::i;:::-;9566:37;;9658:4;9652;9648:15;9640:23;;9362:308;;;:::o;9676:154::-;9760:6;9755:3;9750;9737:30;9822:1;9813:6;9808:3;9804:16;9797:27;9676:154;;;:::o;9836:412::-;9914:5;9939:66;9955:49;9997:6;9955:49;:::i;:::-;9939:66;:::i;:::-;9930:75;;10028:6;10021:5;10014:21;10066:4;10059:5;10055:16;10104:3;10095:6;10090:3;10086:16;10083:25;10080:112;;;10111:79;;:::i;:::-;10080:112;10201:41;10235:6;10230:3;10225;10201:41;:::i;:::-;9920:328;9836:412;;;;;:::o;10268:340::-;10324:5;10373:3;10366:4;10358:6;10354:17;10350:27;10340:122;;10381:79;;:::i;:::-;10340:122;10498:6;10485:20;10523:79;10598:3;10590:6;10583:4;10575:6;10571:17;10523:79;:::i;:::-;10514:88;;10330:278;10268:340;;;;:::o;10614:509::-;10683:6;10732:2;10720:9;10711:7;10707:23;10703:32;10700:119;;;10738:79;;:::i;:::-;10700:119;10886:1;10875:9;10871:17;10858:31;10916:18;10908:6;10905:30;10902:117;;;10938:79;;:::i;:::-;10902:117;11043:63;11098:7;11089:6;11078:9;11074:22;11043:63;:::i;:::-;11033:73;;10829:287;10614:509;;;;:::o;11129:117::-;11238:1;11235;11228:12;11252:117;11361:1;11358;11351:12;11392:568;11465:8;11475:6;11525:3;11518:4;11510:6;11506:17;11502:27;11492:122;;11533:79;;:::i;:::-;11492:122;11646:6;11633:20;11623:30;;11676:18;11668:6;11665:30;11662:117;;;11698:79;;:::i;:::-;11662:117;11812:4;11804:6;11800:17;11788:29;;11866:3;11858:4;11850:6;11846:17;11836:8;11832:32;11829:41;11826:128;;;11873:79;;:::i;:::-;11826:128;11392:568;;;;;:::o;11966:559::-;12052:6;12060;12109:2;12097:9;12088:7;12084:23;12080:32;12077:119;;;12115:79;;:::i;:::-;12077:119;12263:1;12252:9;12248:17;12235:31;12293:18;12285:6;12282:30;12279:117;;;12315:79;;:::i;:::-;12279:117;12428:80;12500:7;12491:6;12480:9;12476:22;12428:80;:::i;:::-;12410:98;;;;12206:312;11966:559;;;;;:::o;12548:568::-;12621:8;12631:6;12681:3;12674:4;12666:6;12662:17;12658:27;12648:122;;12689:79;;:::i;:::-;12648:122;12802:6;12789:20;12779:30;;12832:18;12824:6;12821:30;12818:117;;;12854:79;;:::i;:::-;12818:117;12968:4;12960:6;12956:17;12944:29;;13022:3;13014:4;13006:6;13002:17;12992:8;12988:32;12985:41;12982:128;;;13029:79;;:::i;:::-;12982:128;12548:568;;;;;:::o;13122:559::-;13208:6;13216;13265:2;13253:9;13244:7;13240:23;13236:32;13233:119;;;13271:79;;:::i;:::-;13233:119;13419:1;13408:9;13404:17;13391:31;13449:18;13441:6;13438:30;13435:117;;;13471:79;;:::i;:::-;13435:117;13584:80;13656:7;13647:6;13636:9;13632:22;13584:80;:::i;:::-;13566:98;;;;13362:312;13122:559;;;;;:::o;13687:146::-;13786:6;13820:5;13814:12;13804:22;;13687:146;;;:::o;13839:216::-;13970:11;14004:6;13999:3;13992:19;14044:4;14039:3;14035:14;14020:29;;13839:216;;;;:::o;14061:164::-;14160:4;14183:3;14175:11;;14213:4;14208:3;14204:14;14196:22;;14061:164;;;:::o;14231:108::-;14308:24;14326:5;14308:24;:::i;:::-;14303:3;14296:37;14231:108;;:::o;14345:101::-;14381:7;14421:18;14414:5;14410:30;14399:41;;14345:101;;;:::o;14452:105::-;14527:23;14544:5;14527:23;:::i;:::-;14522:3;14515:36;14452:105;;:::o;14563:99::-;14634:21;14649:5;14634:21;:::i;:::-;14629:3;14622:34;14563:99;;:::o;14668:91::-;14704:7;14744:8;14737:5;14733:20;14722:31;;14668:91;;;:::o;14765:105::-;14840:23;14857:5;14840:23;:::i;:::-;14835:3;14828:36;14765:105;;:::o;14948:866::-;15099:4;15094:3;15090:14;15186:4;15179:5;15175:16;15169:23;15205:63;15262:4;15257:3;15253:14;15239:12;15205:63;:::i;:::-;15114:164;15370:4;15363:5;15359:16;15353:23;15389:61;15444:4;15439:3;15435:14;15421:12;15389:61;:::i;:::-;15288:172;15544:4;15537:5;15533:16;15527:23;15563:57;15614:4;15609:3;15605:14;15591:12;15563:57;:::i;:::-;15470:160;15717:4;15710:5;15706:16;15700:23;15736:61;15791:4;15786:3;15782:14;15768:12;15736:61;:::i;:::-;15640:167;15068:746;14948:866;;:::o;15820:307::-;15953:10;15974:110;16080:3;16072:6;15974:110;:::i;:::-;16116:4;16111:3;16107:14;16093:28;;15820:307;;;;:::o;16133:145::-;16235:4;16267;16262:3;16258:14;16250:22;;16133:145;;;:::o;16360:988::-;16543:3;16572:86;16652:5;16572:86;:::i;:::-;16674:118;16785:6;16780:3;16674:118;:::i;:::-;16667:125;;16816:88;16898:5;16816:88;:::i;:::-;16927:7;16958:1;16943:380;16968:6;16965:1;16962:13;16943:380;;;17044:6;17038:13;17071:127;17194:3;17179:13;17071:127;:::i;:::-;17064:134;;17221:92;17306:6;17221:92;:::i;:::-;17211:102;;17003:320;16990:1;16987;16983:9;16978:14;;16943:380;;;16947:14;17339:3;17332:10;;16548:800;;;16360:988;;;;:::o;17354:501::-;17561:4;17599:2;17588:9;17584:18;17576:26;;17648:9;17642:4;17638:20;17634:1;17623:9;17619:17;17612:47;17676:172;17843:4;17834:6;17676:172;:::i;:::-;17668:180;;17354:501;;;;:::o;17861:114::-;17928:6;17962:5;17956:12;17946:22;;17861:114;;;:::o;17981:184::-;18080:11;18114:6;18109:3;18102:19;18154:4;18149:3;18145:14;18130:29;;17981:184;;;;:::o;18171:132::-;18238:4;18261:3;18253:11;;18291:4;18286:3;18282:14;18274:22;;18171:132;;;:::o;18309:108::-;18386:24;18404:5;18386:24;:::i;:::-;18381:3;18374:37;18309:108;;:::o;18423:179::-;18492:10;18513:46;18555:3;18547:6;18513:46;:::i;:::-;18591:4;18586:3;18582:14;18568:28;;18423:179;;;;:::o;18608:113::-;18678:4;18710;18705:3;18701:14;18693:22;;18608:113;;;:::o;18757:732::-;18876:3;18905:54;18953:5;18905:54;:::i;:::-;18975:86;19054:6;19049:3;18975:86;:::i;:::-;18968:93;;19085:56;19135:5;19085:56;:::i;:::-;19164:7;19195:1;19180:284;19205:6;19202:1;19199:13;19180:284;;;19281:6;19275:13;19308:63;19367:3;19352:13;19308:63;:::i;:::-;19301:70;;19394:60;19447:6;19394:60;:::i;:::-;19384:70;;19240:224;19227:1;19224;19220:9;19215:14;;19180:284;;;19184:14;19480:3;19473:10;;18881:608;;;18757:732;;;;:::o;19495:373::-;19638:4;19676:2;19665:9;19661:18;19653:26;;19725:9;19719:4;19715:20;19711:1;19700:9;19696:17;19689:47;19753:108;19856:4;19847:6;19753:108;:::i;:::-;19745:116;;19495:373;;;;:::o;19874:704::-;19969:6;19977;19985;20034:2;20022:9;20013:7;20009:23;20005:32;20002:119;;;20040:79;;:::i;:::-;20002:119;20160:1;20185:53;20230:7;20221:6;20210:9;20206:22;20185:53;:::i;:::-;20175:63;;20131:117;20315:2;20304:9;20300:18;20287:32;20346:18;20338:6;20335:30;20332:117;;;20368:79;;:::i;:::-;20332:117;20481:80;20553:7;20544:6;20533:9;20529:22;20481:80;:::i;:::-;20463:98;;;;20258:313;19874:704;;;;;:::o;20584:468::-;20649:6;20657;20706:2;20694:9;20685:7;20681:23;20677:32;20674:119;;;20712:79;;:::i;:::-;20674:119;20832:1;20857:53;20902:7;20893:6;20882:9;20878:22;20857:53;:::i;:::-;20847:63;;20803:117;20959:2;20985:50;21027:7;21018:6;21007:9;21003:22;20985:50;:::i;:::-;20975:60;;20930:115;20584:468;;;;;:::o;21058:619::-;21135:6;21143;21151;21200:2;21188:9;21179:7;21175:23;21171:32;21168:119;;;21206:79;;:::i;:::-;21168:119;21326:1;21351:53;21396:7;21387:6;21376:9;21372:22;21351:53;:::i;:::-;21341:63;;21297:117;21453:2;21479:53;21524:7;21515:6;21504:9;21500:22;21479:53;:::i;:::-;21469:63;;21424:118;21581:2;21607:53;21652:7;21643:6;21632:9;21628:22;21607:53;:::i;:::-;21597:63;;21552:118;21058:619;;;;;:::o;21683:60::-;21711:3;21732:5;21725:12;;21683:60;;;:::o;21749:142::-;21799:9;21832:53;21850:34;21859:24;21877:5;21859:24;:::i;:::-;21850:34;:::i;:::-;21832:53;:::i;:::-;21819:66;;21749:142;;;:::o;21897:126::-;21947:9;21980:37;22011:5;21980:37;:::i;:::-;21967:50;;21897:126;;;:::o;22029:152::-;22105:9;22138:37;22169:5;22138:37;:::i;:::-;22125:50;;22029:152;;;:::o;22187:183::-;22300:63;22357:5;22300:63;:::i;:::-;22295:3;22288:76;22187:183;;:::o;22376:274::-;22495:4;22533:2;22522:9;22518:18;22510:26;;22546:97;22640:1;22629:9;22625:17;22616:6;22546:97;:::i;:::-;22376:274;;;;:::o;22656:307::-;22717:4;22807:18;22799:6;22796:30;22793:56;;;22829:18;;:::i;:::-;22793:56;22867:29;22889:6;22867:29;:::i;:::-;22859:37;;22951:4;22945;22941:15;22933:23;;22656:307;;;:::o;22969:410::-;23046:5;23071:65;23087:48;23128:6;23087:48;:::i;:::-;23071:65;:::i;:::-;23062:74;;23159:6;23152:5;23145:21;23197:4;23190:5;23186:16;23235:3;23226:6;23221:3;23217:16;23214:25;23211:112;;;23242:79;;:::i;:::-;23211:112;23332:41;23366:6;23361:3;23356;23332:41;:::i;:::-;23052:327;22969:410;;;;;:::o;23398:338::-;23453:5;23502:3;23495:4;23487:6;23483:17;23479:27;23469:122;;23510:79;;:::i;:::-;23469:122;23627:6;23614:20;23652:78;23726:3;23718:6;23711:4;23703:6;23699:17;23652:78;:::i;:::-;23643:87;;23459:277;23398:338;;;;:::o;23742:943::-;23837:6;23845;23853;23861;23910:3;23898:9;23889:7;23885:23;23881:33;23878:120;;;23917:79;;:::i;:::-;23878:120;24037:1;24062:53;24107:7;24098:6;24087:9;24083:22;24062:53;:::i;:::-;24052:63;;24008:117;24164:2;24190:53;24235:7;24226:6;24215:9;24211:22;24190:53;:::i;:::-;24180:63;;24135:118;24292:2;24318:53;24363:7;24354:6;24343:9;24339:22;24318:53;:::i;:::-;24308:63;;24263:118;24448:2;24437:9;24433:18;24420:32;24479:18;24471:6;24468:30;24465:117;;;24501:79;;:::i;:::-;24465:117;24606:62;24660:7;24651:6;24640:9;24636:22;24606:62;:::i;:::-;24596:72;;24391:287;23742:943;;;;;;;:::o;24763:876::-;24924:4;24919:3;24915:14;25011:4;25004:5;25000:16;24994:23;25030:63;25087:4;25082:3;25078:14;25064:12;25030:63;:::i;:::-;24939:164;25195:4;25188:5;25184:16;25178:23;25214:61;25269:4;25264:3;25260:14;25246:12;25214:61;:::i;:::-;25113:172;25369:4;25362:5;25358:16;25352:23;25388:57;25439:4;25434:3;25430:14;25416:12;25388:57;:::i;:::-;25295:160;25542:4;25535:5;25531:16;25525:23;25561:61;25616:4;25611:3;25607:14;25593:12;25561:61;:::i;:::-;25465:167;24893:746;24763:876;;:::o;25645:351::-;25802:4;25840:3;25829:9;25825:19;25817:27;;25854:135;25986:1;25975:9;25971:17;25962:6;25854:135;:::i;:::-;25645:351;;;;:::o;26002:474::-;26070:6;26078;26127:2;26115:9;26106:7;26102:23;26098:32;26095:119;;;26133:79;;:::i;:::-;26095:119;26253:1;26278:53;26323:7;26314:6;26303:9;26299:22;26278:53;:::i;:::-;26268:63;;26224:117;26380:2;26406:53;26451:7;26442:6;26431:9;26427:22;26406:53;:::i;:::-;26396:63;;26351:118;26002:474;;;;;:::o;26499:568::-;26572:8;26582:6;26632:3;26625:4;26617:6;26613:17;26609:27;26599:122;;26640:79;;:::i;:::-;26599:122;26753:6;26740:20;26730:30;;26783:18;26775:6;26772:30;26769:117;;;26805:79;;:::i;:::-;26769:117;26919:4;26911:6;26907:17;26895:29;;26973:3;26965:4;26957:6;26953:17;26943:8;26939:32;26936:41;26933:128;;;26980:79;;:::i;:::-;26933:128;26499:568;;;;;:::o;27073:704::-;27168:6;27176;27184;27233:2;27221:9;27212:7;27208:23;27204:32;27201:119;;;27239:79;;:::i;:::-;27201:119;27387:1;27376:9;27372:17;27359:31;27417:18;27409:6;27406:30;27403:117;;;27439:79;;:::i;:::-;27403:117;27552:80;27624:7;27615:6;27604:9;27600:22;27552:80;:::i;:::-;27534:98;;;;27330:312;27681:2;27707:53;27752:7;27743:6;27732:9;27728:22;27707:53;:::i;:::-;27697:63;;27652:118;27073:704;;;;;:::o;27783:180::-;27831:77;27828:1;27821:88;27928:4;27925:1;27918:15;27952:4;27949:1;27942:15;27969:320;28013:6;28050:1;28044:4;28040:12;28030:22;;28097:1;28091:4;28087:12;28118:18;28108:81;;28174:4;28166:6;28162:17;28152:27;;28108:81;28236:2;28228:6;28225:14;28205:18;28202:38;28199:84;;28255:18;;:::i;:::-;28199:84;28020:269;27969:320;;;:::o;28295:332::-;28416:4;28454:2;28443:9;28439:18;28431:26;;28467:71;28535:1;28524:9;28520:17;28511:6;28467:71;:::i;:::-;28548:72;28616:2;28605:9;28601:18;28592:6;28548:72;:::i;:::-;28295:332;;;;;:::o;28633:137::-;28687:5;28718:6;28712:13;28703:22;;28734:30;28758:5;28734:30;:::i;:::-;28633:137;;;;:::o;28776:345::-;28843:6;28892:2;28880:9;28871:7;28867:23;28863:32;28860:119;;;28898:79;;:::i;:::-;28860:119;29018:1;29043:61;29096:7;29087:6;29076:9;29072:22;29043:61;:::i;:::-;29033:71;;28989:125;28776:345;;;;:::o;29127:236::-;29267:34;29263:1;29255:6;29251:14;29244:58;29336:19;29331:2;29323:6;29319:15;29312:44;29127:236;:::o;29369:366::-;29511:3;29532:67;29596:2;29591:3;29532:67;:::i;:::-;29525:74;;29608:93;29697:3;29608:93;:::i;:::-;29726:2;29721:3;29717:12;29710:19;;29369:366;;;:::o;29741:419::-;29907:4;29945:2;29934:9;29930:18;29922:26;;29994:9;29988:4;29984:20;29980:1;29969:9;29965:17;29958:47;30022:131;30148:4;30022:131;:::i;:::-;30014:139;;29741:419;;;:::o;30166:94::-;30199:8;30247:5;30243:2;30239:14;30218:35;;30166:94;;;:::o;30266:::-;30305:7;30334:20;30348:5;30334:20;:::i;:::-;30323:31;;30266:94;;;:::o;30366:100::-;30405:7;30434:26;30454:5;30434:26;:::i;:::-;30423:37;;30366:100;;;:::o;30472:157::-;30577:45;30597:24;30615:5;30597:24;:::i;:::-;30577:45;:::i;:::-;30572:3;30565:58;30472:157;;:::o;30635:256::-;30747:3;30762:75;30833:3;30824:6;30762:75;:::i;:::-;30862:2;30857:3;30853:12;30846:19;;30882:3;30875:10;;30635:256;;;;:::o;30897:221::-;31037:34;31033:1;31025:6;31021:14;31014:58;31106:4;31101:2;31093:6;31089:15;31082:29;30897:221;:::o;31124:366::-;31266:3;31287:67;31351:2;31346:3;31287:67;:::i;:::-;31280:74;;31363:93;31452:3;31363:93;:::i;:::-;31481:2;31476:3;31472:12;31465:19;;31124:366;;;:::o;31496:419::-;31662:4;31700:2;31689:9;31685:18;31677:26;;31749:9;31743:4;31739:20;31735:1;31724:9;31720:17;31713:47;31777:131;31903:4;31777:131;:::i;:::-;31769:139;;31496:419;;;:::o;31921:223::-;32061:34;32057:1;32049:6;32045:14;32038:58;32130:6;32125:2;32117:6;32113:15;32106:31;31921:223;:::o;32150:366::-;32292:3;32313:67;32377:2;32372:3;32313:67;:::i;:::-;32306:74;;32389:93;32478:3;32389:93;:::i;:::-;32507:2;32502:3;32498:12;32491:19;;32150:366;;;:::o;32522:419::-;32688:4;32726:2;32715:9;32711:18;32703:26;;32775:9;32769:4;32765:20;32761:1;32750:9;32746:17;32739:47;32803:131;32929:4;32803:131;:::i;:::-;32795:139;;32522:419;;;:::o;32947:180::-;32995:77;32992:1;32985:88;33092:4;33089:1;33082:15;33116:4;33113:1;33106:15;33133:305;33173:3;33192:20;33210:1;33192:20;:::i;:::-;33187:25;;33226:20;33244:1;33226:20;:::i;:::-;33221:25;;33380:1;33312:66;33308:74;33305:1;33302:81;33299:107;;;33386:18;;:::i;:::-;33299:107;33430:1;33427;33423:9;33416:16;;33133:305;;;;:::o;33444:222::-;33584:34;33580:1;33572:6;33568:14;33561:58;33653:5;33648:2;33640:6;33636:15;33629:30;33444:222;:::o;33672:366::-;33814:3;33835:67;33899:2;33894:3;33835:67;:::i;:::-;33828:74;;33911:93;34000:3;33911:93;:::i;:::-;34029:2;34024:3;34020:12;34013:19;;33672:366;;;:::o;34044:419::-;34210:4;34248:2;34237:9;34233:18;34225:26;;34297:9;34291:4;34287:20;34283:1;34272:9;34268:17;34261:47;34325:131;34451:4;34325:131;:::i;:::-;34317:139;;34044:419;;;:::o;34469:180::-;34517:77;34514:1;34507:88;34614:4;34611:1;34604:15;34638:4;34635:1;34628:15;34655:220;34795:34;34791:1;34783:6;34779:14;34772:58;34864:3;34859:2;34851:6;34847:15;34840:28;34655:220;:::o;34881:366::-;35023:3;35044:67;35108:2;35103:3;35044:67;:::i;:::-;35037:74;;35120:93;35209:3;35120:93;:::i;:::-;35238:2;35233:3;35229:12;35222:19;;34881:366;;;:::o;35253:419::-;35419:4;35457:2;35446:9;35442:18;35434:26;;35506:9;35500:4;35496:20;35492:1;35481:9;35477:17;35470:47;35534:131;35660:4;35534:131;:::i;:::-;35526:139;;35253:419;;;:::o;35678:182::-;35818:34;35814:1;35806:6;35802:14;35795:58;35678:182;:::o;35866:366::-;36008:3;36029:67;36093:2;36088:3;36029:67;:::i;:::-;36022:74;;36105:93;36194:3;36105:93;:::i;:::-;36223:2;36218:3;36214:12;36207:19;;35866:366;;;:::o;36238:419::-;36404:4;36442:2;36431:9;36427:18;36419:26;;36491:9;36485:4;36481:20;36477:1;36466:9;36462:17;36455:47;36519:131;36645:4;36519:131;:::i;:::-;36511:139;;36238:419;;;:::o;36663:181::-;36803:33;36799:1;36791:6;36787:14;36780:57;36663:181;:::o;36850:366::-;36992:3;37013:67;37077:2;37072:3;37013:67;:::i;:::-;37006:74;;37089:93;37178:3;37089:93;:::i;:::-;37207:2;37202:3;37198:12;37191:19;;36850:366;;;:::o;37222:419::-;37388:4;37426:2;37415:9;37411:18;37403:26;;37475:9;37469:4;37465:20;37461:1;37450:9;37446:17;37439:47;37503:131;37629:4;37503:131;:::i;:::-;37495:139;;37222:419;;;:::o;37647:148::-;37749:11;37786:3;37771:18;;37647:148;;;;:::o;37801:377::-;37907:3;37935:39;37968:5;37935:39;:::i;:::-;37990:89;38072:6;38067:3;37990:89;:::i;:::-;37983:96;;38088:52;38133:6;38128:3;38121:4;38114:5;38110:16;38088:52;:::i;:::-;38165:6;38160:3;38156:16;38149:23;;37911:267;37801:377;;;;:::o;38184:435::-;38364:3;38386:95;38477:3;38468:6;38386:95;:::i;:::-;38379:102;;38498:95;38589:3;38580:6;38498:95;:::i;:::-;38491:102;;38610:3;38603:10;;38184:435;;;;;:::o;38625:233::-;38765:34;38761:1;38753:6;38749:14;38742:58;38834:16;38829:2;38821:6;38817:15;38810:41;38625:233;:::o;38864:366::-;39006:3;39027:67;39091:2;39086:3;39027:67;:::i;:::-;39020:74;;39103:93;39192:3;39103:93;:::i;:::-;39221:2;39216:3;39212:12;39205:19;;38864:366;;;:::o;39236:419::-;39402:4;39440:2;39429:9;39425:18;39417:26;;39489:9;39483:4;39479:20;39475:1;39464:9;39460:17;39453:47;39517:131;39643:4;39517:131;:::i;:::-;39509:139;;39236:419;;;:::o;39661:143::-;39718:5;39749:6;39743:13;39734:22;;39765:33;39792:5;39765:33;:::i;:::-;39661:143;;;;:::o;39810:351::-;39880:6;39929:2;39917:9;39908:7;39904:23;39900:32;39897:119;;;39935:79;;:::i;:::-;39897:119;40055:1;40080:64;40136:7;40127:6;40116:9;40112:22;40080:64;:::i;:::-;40070:74;;40026:128;39810:351;;;;:::o;40167:182::-;40307:34;40303:1;40295:6;40291:14;40284:58;40167:182;:::o;40355:366::-;40497:3;40518:67;40582:2;40577:3;40518:67;:::i;:::-;40511:74;;40594:93;40683:3;40594:93;:::i;:::-;40712:2;40707:3;40703:12;40696:19;;40355:366;;;:::o;40727:419::-;40893:4;40931:2;40920:9;40916:18;40908:26;;40980:9;40974:4;40970:20;40966:1;40955:9;40951:17;40944:47;41008:131;41134:4;41008:131;:::i;:::-;41000:139;;40727:419;;;:::o;41152:222::-;41292:34;41288:1;41280:6;41276:14;41269:58;41361:5;41356:2;41348:6;41344:15;41337:30;41152:222;:::o;41380:366::-;41522:3;41543:67;41607:2;41602:3;41543:67;:::i;:::-;41536:74;;41619:93;41708:3;41619:93;:::i;:::-;41737:2;41732:3;41728:12;41721:19;;41380:366;;;:::o;41752:419::-;41918:4;41956:2;41945:9;41941:18;41933:26;;42005:9;41999:4;41995:20;41991:1;41980:9;41976:17;41969:47;42033:131;42159:4;42033:131;:::i;:::-;42025:139;;41752:419;;;:::o;42177:311::-;42254:4;42344:18;42336:6;42333:30;42330:56;;;42366:18;;:::i;:::-;42330:56;42416:4;42408:6;42404:17;42396:25;;42476:4;42470;42466:15;42458:23;;42177:311;;;:::o;42494:143::-;42551:5;42582:6;42576:13;42567:22;;42598:33;42625:5;42598:33;:::i;:::-;42494:143;;;;:::o;42660:732::-;42767:5;42792:81;42808:64;42865:6;42808:64;:::i;:::-;42792:81;:::i;:::-;42783:90;;42893:5;42922:6;42915:5;42908:21;42956:4;42949:5;42945:16;42938:23;;43009:4;43001:6;42997:17;42989:6;42985:30;43038:3;43030:6;43027:15;43024:122;;;43057:79;;:::i;:::-;43024:122;43172:6;43155:231;43189:6;43184:3;43181:15;43155:231;;;43264:3;43293:48;43337:3;43325:10;43293:48;:::i;:::-;43288:3;43281:61;43371:4;43366:3;43362:14;43355:21;;43231:155;43215:4;43210:3;43206:14;43199:21;;43155:231;;;43159:21;42773:619;;42660:732;;;;;:::o;43415:385::-;43497:5;43546:3;43539:4;43531:6;43527:17;43523:27;43513:122;;43554:79;;:::i;:::-;43513:122;43664:6;43658:13;43689:105;43790:3;43782:6;43775:4;43767:6;43763:17;43689:105;:::i;:::-;43680:114;;43503:297;43415:385;;;;:::o;43806:554::-;43901:6;43950:2;43938:9;43929:7;43925:23;43921:32;43918:119;;;43956:79;;:::i;:::-;43918:119;44097:1;44086:9;44082:17;44076:24;44127:18;44119:6;44116:30;44113:117;;;44149:79;;:::i;:::-;44113:117;44254:89;44335:7;44326:6;44315:9;44311:22;44254:89;:::i;:::-;44244:99;;44047:306;43806:554;;;;:::o;44366:181::-;44506:33;44502:1;44494:6;44490:14;44483:57;44366:181;:::o;44553:366::-;44695:3;44716:67;44780:2;44775:3;44716:67;:::i;:::-;44709:74;;44792:93;44881:3;44792:93;:::i;:::-;44910:2;44905:3;44901:12;44894:19;;44553:366;;;:::o;44925:419::-;45091:4;45129:2;45118:9;45114:18;45106:26;;45178:9;45172:4;45168:20;45164:1;45153:9;45149:17;45142:47;45206:131;45332:4;45206:131;:::i;:::-;45198:139;;44925:419;;;:::o;45350:179::-;45490:31;45486:1;45478:6;45474:14;45467:55;45350:179;:::o;45535:366::-;45677:3;45698:67;45762:2;45757:3;45698:67;:::i;:::-;45691:74;;45774:93;45863:3;45774:93;:::i;:::-;45892:2;45887:3;45883:12;45876:19;;45535:366;;;:::o;45907:419::-;46073:4;46111:2;46100:9;46096:18;46088:26;;46160:9;46154:4;46150:20;46146:1;46135:9;46131:17;46124:47;46188:131;46314:4;46188:131;:::i;:::-;46180:139;;45907:419;;;:::o;46332:233::-;46371:3;46394:24;46412:5;46394:24;:::i;:::-;46385:33;;46440:66;46433:5;46430:77;46427:103;;46510:18;;:::i;:::-;46427:103;46557:1;46550:5;46546:13;46539:20;;46332:233;;;:::o;46571:230::-;46711:34;46707:1;46699:6;46695:14;46688:58;46780:13;46775:2;46767:6;46763:15;46756:38;46571:230;:::o;46807:366::-;46949:3;46970:67;47034:2;47029:3;46970:67;:::i;:::-;46963:74;;47046:93;47135:3;47046:93;:::i;:::-;47164:2;47159:3;47155:12;47148:19;;46807:366;;;:::o;47179:419::-;47345:4;47383:2;47372:9;47368:18;47360:26;;47432:9;47426:4;47422:20;47418:1;47407:9;47403:17;47396:47;47460:131;47586:4;47460:131;:::i;:::-;47452:139;;47179:419;;;:::o;47604:225::-;47744:34;47740:1;47732:6;47728:14;47721:58;47813:8;47808:2;47800:6;47796:15;47789:33;47604:225;:::o;47835:366::-;47977:3;47998:67;48062:2;48057:3;47998:67;:::i;:::-;47991:74;;48074:93;48163:3;48074:93;:::i;:::-;48192:2;48187:3;48183:12;48176:19;;47835:366;;;:::o;48207:419::-;48373:4;48411:2;48400:9;48396:18;48388:26;;48460:9;48454:4;48450:20;48446:1;48435:9;48431:17;48424:47;48488:131;48614:4;48488:131;:::i;:::-;48480:139;;48207:419;;;:::o;48632:348::-;48672:7;48695:20;48713:1;48695:20;:::i;:::-;48690:25;;48729:20;48747:1;48729:20;:::i;:::-;48724:25;;48917:1;48849:66;48845:74;48842:1;48839:81;48834:1;48827:9;48820:17;48816:105;48813:131;;;48924:18;;:::i;:::-;48813:131;48972:1;48969;48965:9;48954:20;;48632:348;;;;:::o;48986:224::-;49126:34;49122:1;49114:6;49110:14;49103:58;49195:7;49190:2;49182:6;49178:15;49171:32;48986:224;:::o;49216:366::-;49358:3;49379:67;49443:2;49438:3;49379:67;:::i;:::-;49372:74;;49455:93;49544:3;49455:93;:::i;:::-;49573:2;49568:3;49564:12;49557:19;;49216:366;;;:::o;49588:419::-;49754:4;49792:2;49781:9;49777:18;49769:26;;49841:9;49835:4;49831:20;49827:1;49816:9;49812:17;49805:47;49869:131;49995:4;49869:131;:::i;:::-;49861:139;;49588:419;;;:::o;50013:182::-;50153:34;50149:1;50141:6;50137:14;50130:58;50013:182;:::o;50201:366::-;50343:3;50364:67;50428:2;50423:3;50364:67;:::i;:::-;50357:74;;50440:93;50529:3;50440:93;:::i;:::-;50558:2;50553:3;50549:12;50542:19;;50201:366;;;:::o;50573:419::-;50739:4;50777:2;50766:9;50762:18;50754:26;;50826:9;50820:4;50816:20;50812:1;50801:9;50797:17;50790:47;50854:131;50980:4;50854:131;:::i;:::-;50846:139;;50573:419;;;:::o;50998:166::-;51138:18;51134:1;51126:6;51122:14;51115:42;50998:166;:::o;51170:366::-;51312:3;51333:67;51397:2;51392:3;51333:67;:::i;:::-;51326:74;;51409:93;51498:3;51409:93;:::i;:::-;51527:2;51522:3;51518:12;51511:19;;51170:366;;;:::o;51542:419::-;51708:4;51746:2;51735:9;51731:18;51723:26;;51795:9;51789:4;51785:20;51781:1;51770:9;51766:17;51759:47;51823:131;51949:4;51823:131;:::i;:::-;51815:139;;51542:419;;;:::o;51967:170::-;52107:22;52103:1;52095:6;52091:14;52084:46;51967:170;:::o;52143:366::-;52285:3;52306:67;52370:2;52365:3;52306:67;:::i;:::-;52299:74;;52382:93;52471:3;52382:93;:::i;:::-;52500:2;52495:3;52491:12;52484:19;;52143:366;;;:::o;52515:419::-;52681:4;52719:2;52708:9;52704:18;52696:26;;52768:9;52762:4;52758:20;52754:1;52743:9;52739:17;52732:47;52796:131;52922:4;52796:131;:::i;:::-;52788:139;;52515:419;;;:::o;52940:98::-;52991:6;53025:5;53019:12;53009:22;;52940:98;;;:::o;53044:168::-;53127:11;53161:6;53156:3;53149:19;53201:4;53196:3;53192:14;53177:29;;53044:168;;;;:::o;53218:360::-;53304:3;53332:38;53364:5;53332:38;:::i;:::-;53386:70;53449:6;53444:3;53386:70;:::i;:::-;53379:77;;53465:52;53510:6;53505:3;53498:4;53491:5;53487:16;53465:52;:::i;:::-;53542:29;53564:6;53542:29;:::i;:::-;53537:3;53533:39;53526:46;;53308:270;53218:360;;;;:::o;53584:640::-;53779:4;53817:3;53806:9;53802:19;53794:27;;53831:71;53899:1;53888:9;53884:17;53875:6;53831:71;:::i;:::-;53912:72;53980:2;53969:9;53965:18;53956:6;53912:72;:::i;:::-;53994;54062:2;54051:9;54047:18;54038:6;53994:72;:::i;:::-;54113:9;54107:4;54103:20;54098:2;54087:9;54083:18;54076:48;54141:76;54212:4;54203:6;54141:76;:::i;:::-;54133:84;;53584:640;;;;;;;:::o;54230:141::-;54286:5;54317:6;54311:13;54302:22;;54333:32;54359:5;54333:32;:::i;:::-;54230:141;;;;:::o;54377:349::-;54446:6;54495:2;54483:9;54474:7;54470:23;54466:32;54463:119;;;54501:79;;:::i;:::-;54463:119;54621:1;54646:63;54701:7;54692:6;54681:9;54677:22;54646:63;:::i;:::-;54636:73;;54592:127;54377:349;;;;:::o

Swarm Source

ipfs://10d7d04e96a241b8b35d0cb173ef567d09f55c8b877ca341a745aa7e51fe878e
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.